protected virtual void AddFreeformComment(IVwEnv vwenv, int hvoSeg, int lineChoiceIndex)
{
int[] wssAnalysis = m_lineChoices.AdjacentWssAtIndex(lineChoiceIndex);
if (wssAnalysis.Length == 0)
return;
vwenv.OpenDiv();
SetParaDirectionAndAlignment(vwenv, wssAnalysis[0]);
vwenv.OpenMappedPara();
string label;
int flid;
InterlinearExporter exporter = vwenv as InterlinearExporter;
int dummyFlid = m_lineChoices[lineChoiceIndex].Flid;
switch (dummyFlid)
{
case InterlinLineChoices.kflidFreeTrans:
label = ITextStrings.ksFree_;
flid = SegmentTags.kflidFreeTranslation;
if (exporter != null)
exporter.FreeAnnotationType = "gls";
break;
case InterlinLineChoices.kflidLitTrans:
label = ITextStrings.ksLit_;
flid = SegmentTags.kflidLiteralTranslation;
if (exporter != null)
exporter.FreeAnnotationType = "lit";
break;
case InterlinLineChoices.kflidNote:
label = ITextStrings.ksNote_;
flid = NoteTags.kflidContent;
if (exporter != null)
exporter.FreeAnnotationType = "note";
break;
default:
throw new Exception("Unexpected FF annotation type");
}
SetNoteLabelProps(vwenv);
// REVIEW: Should we set the label to a special color as well?
ITsString tssLabel = MakeUiElementString(label, m_cache.DefaultUserWs,
propsBldr => propsBldr.SetIntPropValues((int)FwTextPropType.ktptBold,
(int)FwTextPropVar.ktpvEnum, (int)FwTextToggleVal.kttvForceOn));
ITsStrBldr labelBldr = tssLabel.GetBldr();
AddLineIndexProperty(labelBldr, lineChoiceIndex);
tssLabel = labelBldr.GetString();
int labelWidth = 0;
int labelHeight; // unused
if (wssAnalysis.Length > 1)
vwenv.get_StringWidth(tssLabel, null, out labelWidth, out labelHeight);
if (IsWsRtl(wssAnalysis[0]) != m_fRtl)
{
ITsStrBldr bldr = tssLabel.GetBldr();
bldr.Replace(bldr.Length - 1, bldr.Length, null, null);
ITsString tssLabelNoSpace = bldr.GetString();
// (First) analysis language is upstream; insert label at end.
AddTssDirForWs(vwenv, wssAnalysis[0]);
AddFreeformComment(vwenv, hvoSeg, wssAnalysis[0], flid);
AddTssDirForWs(vwenv, wssAnalysis[0]);
if (wssAnalysis.Length != 1)
{
// Insert WS label for first line
AddTssDirForVernWs(vwenv);
vwenv.AddString(m_tssSpace);
AddTssDirForVernWs(vwenv);
SetNoteLabelProps(vwenv);
vwenv.AddString(WsListManager.WsLabel(m_cache, wssAnalysis[0]));
}
AddTssDirForVernWs(vwenv);
vwenv.AddString(m_tssSpace);
AddTssDirForVernWs(vwenv);
vwenv.AddString(tssLabelNoSpace);
AddTssDirForVernWs(vwenv);
}
else
{
AddTssDirForVernWs(vwenv);
vwenv.AddString(tssLabel);
AddTssDirForVernWs(vwenv);
if (wssAnalysis.Length == 1)
{
AddTssDirForWs(vwenv, wssAnalysis[0]);
AddFreeformComment(vwenv, hvoSeg, wssAnalysis[0], flid);
}
else
{
SetNoteLabelProps(vwenv);
vwenv.AddString(WsListManager.WsLabel(m_cache, wssAnalysis[0]));
AddTssDirForVernWs(vwenv);
vwenv.AddString(m_tssSpace);
// label width unfortunately does not include trailing space.
AddTssDirForVernWs(vwenv);
AddTssDirForWs(vwenv, wssAnalysis[0]);
AddFreeformComment(vwenv, hvoSeg, wssAnalysis[0], flid);
}
}
// Add any other lines, each in its appropriate direction.
for (int i = 1; i < wssAnalysis.Length; i++)
{
vwenv.CloseParagraph();
// Indent subsequent paragraphs by the width of the main label.
if (IsWsRtl(wssAnalysis[i]) != m_fRtl)
{
vwenv.set_IntProperty((int)FwTextPropType.ktptTrailingIndent,
(int)FwTextPropVar.ktpvMilliPoint, labelWidth);
}
else
{
vwenv.set_IntProperty((int) FwTextPropType.ktptLeadingIndent,
(int) FwTextPropVar.ktpvMilliPoint, labelWidth);
}
SetParaDirectionAndAlignment(vwenv, wssAnalysis[i]);
vwenv.OpenParagraph();
if (IsWsRtl(wssAnalysis[i]) != m_fRtl)
{
// upstream...reverse everything.
AddTssDirForWs(vwenv, wssAnalysis[i]);
AddFreeformComment(vwenv, hvoSeg, wssAnalysis[i], flid);
AddTssDirForWs(vwenv, wssAnalysis[i]);
AddTssDirForVernWs(vwenv);
vwenv.AddString(m_tssSpace);
AddTssDirForVernWs(vwenv);
AddTssDirForVernWs(vwenv);
SetNoteLabelProps(vwenv);
vwenv.AddString(WsListManager.WsLabel(m_cache, wssAnalysis[i]));
AddTssDirForVernWs(vwenv);
vwenv.AddString(m_tssSpace);
AddTssDirForVernWs(vwenv);
}
else
{
AddTssDirForVernWs(vwenv);
vwenv.AddString(m_tssSpace);
AddTssDirForVernWs(vwenv);
SetNoteLabelProps(vwenv);
vwenv.AddString(WsListManager.WsLabel(m_cache, wssAnalysis[i]));
AddTssDirForVernWs(vwenv);
vwenv.AddString(m_tssSpace);
AddTssDirForVernWs(vwenv);
AddTssDirForWs(vwenv, wssAnalysis[i]);
AddFreeformComment(vwenv, hvoSeg, wssAnalysis[i], flid);
}
}
vwenv.CloseParagraph();
vwenv.CloseDiv();
}