Skip to content
5 changes: 4 additions & 1 deletion Src/LexText/Interlinear/ComplexConcControl.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

101 changes: 101 additions & 0 deletions Src/LexText/Interlinear/ComplexConcPatternVc.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ public override void Display(IVwEnv vwenv, int hvo, int frag)
{
OpenSingleLinePile(vwenv, GetMaxNumLines(vwenv), false);
vwenv.Props = m_bracketProps;
SetNotEditable(vwenv);
vwenv.AddProp(ComplexConcPatternSda.ktagChildren, this, kfragEmpty);
CloseSingleLinePile(vwenv, false);
}
Expand All @@ -100,12 +101,14 @@ public override void Display(IVwEnv vwenv, int hvo, int frag)
if (node is ComplexConcOrNode)
{
OpenSingleLinePile(vwenv, maxNumLines);
SetNotEditable(vwenv);
vwenv.AddProp(ktagInnerNonBoundary, this, kfragOR);
CloseSingleLinePile(vwenv, false);
}
else if (node is ComplexConcWordBdryNode)
{
OpenSingleLinePile(vwenv, maxNumLines);
SetNotEditable(vwenv);
vwenv.AddProp(ktagInnerNonBoundary, this, kfragHash);
CloseSingleLinePile(vwenv);
}
Expand All @@ -117,10 +120,12 @@ public override void Display(IVwEnv vwenv, int hvo, int frag)
{
OpenSingleLinePile(vwenv, maxNumLines, false);
// use normal parentheses for a single line group
SetNotEditable(vwenv);
vwenv.AddProp(ktagLeftBoundary, this, kfragLeftParen);

vwenv.AddObjVecItems(ComplexConcPatternSda.ktagChildren, this, kfragNode);

SetNotEditable(vwenv);
vwenv.AddProp(hasMinMax ? ktagInnerNonBoundary : ktagRightBoundary, this, kfragRightParen);
if (hasMinMax)
DisplayMinMax(numLines, vwenv);
Expand All @@ -130,23 +135,35 @@ public override void Display(IVwEnv vwenv, int hvo, int frag)
{
vwenv.Props = m_bracketProps;
vwenv.set_IntProperty((int) FwTextPropType.ktptMarginLeading, (int) FwTextPropVar.ktpvMilliPoint, PileMargin);
SetNotEditable(vwenv);
vwenv.OpenInnerPile();
AddExtraLines(maxNumLines - numLines, ktagLeftNonBoundary, vwenv);
SetNotEditable(vwenv);
vwenv.AddProp(ktagLeftNonBoundary, this, kfragLeftParenUpHook);
for (int i = 1; i < numLines - 1; i++)
{
SetNotEditable(vwenv);
vwenv.AddProp(ktagLeftNonBoundary, this, kfragLeftParenExt);
}
SetNotEditable(vwenv);
vwenv.AddProp(ktagLeftBoundary, this, kfragLeftParenLowHook);
vwenv.CloseInnerPile();

vwenv.AddObjVecItems(ComplexConcPatternSda.ktagChildren, this, kfragNode);

vwenv.Props = m_bracketProps;
vwenv.set_IntProperty((int) FwTextPropType.ktptMarginTrailing, (int) FwTextPropVar.ktpvMilliPoint, PileMargin);
SetNotEditable(vwenv);
vwenv.OpenInnerPile();
AddExtraLines(maxNumLines - numLines, hasMinMax ? ktagInnerNonBoundary : ktagRightNonBoundary, vwenv);
SetNotEditable(vwenv);
vwenv.AddProp(hasMinMax ? ktagInnerNonBoundary : ktagRightNonBoundary, this, kfragRightParenUpHook);
for (int i = 1; i < numLines - 1; i++)
{
SetNotEditable(vwenv);
vwenv.AddProp(hasMinMax ? ktagInnerNonBoundary : ktagRightNonBoundary, this, kfragRightParenExt);
}
SetNotEditable(vwenv);
vwenv.AddProp(hasMinMax ? ktagInnerNonBoundary : ktagRightBoundary, this, kfragRightParenLowHook);
vwenv.CloseInnerPile();
if (hasMinMax)
Expand All @@ -161,10 +178,12 @@ public override void Display(IVwEnv vwenv, int hvo, int frag)
{
OpenSingleLinePile(vwenv, maxNumLines, false);
// use normal brackets for a single line constraint
SetNotEditable(vwenv);
vwenv.AddProp(ktagLeftBoundary, this, kfragLeftBracket);

DisplayFeatures(vwenv, node);

SetNotEditable(vwenv);
vwenv.AddProp(hasMinMax ? ktagInnerNonBoundary : ktagRightBoundary, this, kfragRightBracket);
if (hasMinMax)
DisplayMinMax(numLines, vwenv);
Expand All @@ -175,11 +194,17 @@ public override void Display(IVwEnv vwenv, int hvo, int frag)
// left bracket pile
vwenv.Props = m_bracketProps;
vwenv.set_IntProperty((int) FwTextPropType.ktptMarginLeading, (int) FwTextPropVar.ktpvMilliPoint, PileMargin);
SetNotEditable(vwenv);
vwenv.OpenInnerPile();
AddExtraLines(maxNumLines - numLines, ktagLeftNonBoundary, vwenv);
SetNotEditable(vwenv);
vwenv.AddProp(ktagLeftNonBoundary, this, kfragLeftBracketUpHook);
for (int i = 1; i < numLines - 1; i++)
{
SetNotEditable(vwenv);
vwenv.AddProp(ktagLeftNonBoundary, this, kfragLeftBracketExt);
}
SetNotEditable(vwenv);
vwenv.AddProp(ktagLeftBoundary, this, kfragLeftBracketLowHook);
vwenv.CloseInnerPile();

Expand All @@ -193,11 +218,17 @@ public override void Display(IVwEnv vwenv, int hvo, int frag)
// right bracket pile
vwenv.Props = m_bracketProps;
vwenv.set_IntProperty((int) FwTextPropType.ktptMarginTrailing, (int) FwTextPropVar.ktpvMilliPoint, PileMargin);
SetNotEditable(vwenv);
vwenv.OpenInnerPile();
AddExtraLines(maxNumLines - numLines, hasMinMax ? ktagInnerNonBoundary : ktagRightNonBoundary, vwenv);
SetNotEditable(vwenv);
vwenv.AddProp(hasMinMax ? ktagInnerNonBoundary : ktagRightNonBoundary, this, kfragRightBracketUpHook);
for (int i = 1; i < numLines - 1; i++)
{
SetNotEditable(vwenv);
vwenv.AddProp(hasMinMax ? ktagInnerNonBoundary : ktagRightNonBoundary, this, kfragRightBracketExt);
}
SetNotEditable(vwenv);
vwenv.AddProp(hasMinMax ? ktagInnerNonBoundary : ktagRightBoundary, this, kfragRightBracketLowHook);
vwenv.CloseInnerPile();
if (hasMinMax)
Expand All @@ -208,6 +239,17 @@ public override void Display(IVwEnv vwenv, int hvo, int frag)
}
}

/// <summary>
/// Every fragment ComplexConcPatternVc renders -- feature lines, quantifiers, OR/word-
/// boundary literals, and the bracket/paren glyphs -- is a computed display, never free
/// text (see UpdateProp). Mark the current run explicitly non-editable so an edit attempt
/// is rejected at the selection layer instead of silently reaching UpdateProp.
/// </summary>
private static void SetNotEditable(IVwEnv vwenv)
{
vwenv.set_IntProperty((int) FwTextPropType.ktptEditable, (int) FwTextPropVar.ktpvEnum, (int) TptEditable.ktptNotEditable);
}

private void DisplayMinMax(int numLines, IVwEnv vwenv)
{
int superOffset = 0;
Expand All @@ -230,11 +272,13 @@ private void DisplayMinMax(int numLines, IVwEnv vwenv)
if (numLines == 1)
vwenv.set_IntProperty((int) FwTextPropType.ktptOffset, (int) FwTextPropVar.ktpvMilliPoint, superOffset);
vwenv.OpenParagraph();
SetNotEditable(vwenv);
vwenv.AddProp(ktagRightNonBoundary, this, kfragNodeMax);
vwenv.CloseParagraph();
AddExtraLines(numLines - 2, ktagRightNonBoundary, vwenv);
vwenv.set_IntProperty((int) FwTextPropType.ktptOffset, (int) FwTextPropVar.ktpvMilliPoint, 0);
vwenv.OpenParagraph();
SetNotEditable(vwenv);
vwenv.AddProp(ktagRightBoundary, this, kfragNodeMin);
vwenv.CloseParagraph();
vwenv.CloseInnerPile();
Expand Down Expand Up @@ -382,21 +426,38 @@ public override ITsString DisplayVariant(IVwEnv vwenv, int tag, int frag)

private void DisplayFeatures(IVwEnv vwenv, ComplexConcPatternNode node)
{
// Every line here (Type, Form, Entry, Category, Gloss, Infl Features) is a computed
// summary of the synthetic pattern node, not free text; see UpdateProp and
// SetNotEditable.
SetNotEditable(vwenv);
vwenv.AddProp(ktagType, this, kfragFeatureLine);
var morphNode = node as ComplexConcMorphNode;
if (morphNode != null)
{
if (morphNode.Form != null)
{
SetNotEditable(vwenv);
vwenv.AddProp(ktagForm, this, kfragFeatureLine);
}
if (morphNode.Entry != null)
{
SetNotEditable(vwenv);
vwenv.AddProp(ktagEntry, this, kfragFeatureLine);
}
if (morphNode.Category != null)
{
SetNotEditable(vwenv);
vwenv.AddProp(ktagCategory, this, kfragFeatureLine);
}
if (morphNode.Gloss != null)
{
SetNotEditable(vwenv);
vwenv.AddProp(ktagGloss, this, kfragFeatureLine);
}
if (morphNode.InflFeatures.Count > 0)
{
vwenv.OpenParagraph();
SetNotEditable(vwenv);
vwenv.AddProp(ktagInfl, this, kfragFeatureLine);
DisplayInflFeatures(vwenv, morphNode.InflFeatures);
vwenv.CloseParagraph();
Expand All @@ -408,14 +469,24 @@ private void DisplayFeatures(IVwEnv vwenv, ComplexConcPatternNode node)
if (wordNode != null)
{
if (wordNode.Form != null)
{
SetNotEditable(vwenv);
vwenv.AddProp(ktagForm, this, kfragFeatureLine);
}
if (wordNode.Category != null)
{
SetNotEditable(vwenv);
vwenv.AddProp(ktagCategory, this, kfragFeatureLine);
}
if (wordNode.Gloss != null)
{
SetNotEditable(vwenv);
vwenv.AddProp(ktagGloss, this, kfragFeatureLine);
}
if (wordNode.InflFeatures.Count > 0)
{
vwenv.OpenParagraph();
SetNotEditable(vwenv);
vwenv.AddProp(ktagInfl, this, kfragFeatureLine);
DisplayInflFeatures(vwenv, wordNode.InflFeatures);
vwenv.CloseParagraph();
Expand All @@ -427,7 +498,10 @@ private void DisplayFeatures(IVwEnv vwenv, ComplexConcPatternNode node)
if (tagNode != null)
{
if (tagNode.Tag != null)
{
SetNotEditable(vwenv);
vwenv.AddProp(ktagTag, this, kfragFeatureLine);
}
}
}
}
Expand All @@ -443,13 +517,15 @@ private void DisplayInflFeatureLines(IVwEnv vwenv, IDictionary<IFsFeatDefn, obje
{
if (openPara)
vwenv.OpenParagraph();
SetNotEditable(vwenv);
vwenv.AddProp(kvp.Key.Hvo, this, kfragFeatureLine);
DisplayInflFeatures(vwenv, (IDictionary<IFsFeatDefn, object>) kvp.Value);
if (openPara)
vwenv.CloseParagraph();
}
else
{
SetNotEditable(vwenv);
vwenv.AddProp(kvp.Key.Hvo, this, kfragFeatureLine);
}
}
Expand All @@ -462,21 +538,29 @@ private void DisplayInflFeatures(IVwEnv vwenv, IDictionary<IFsFeatDefn, object>
if (numLines == 1)
{
// use normal brackets for a single line constraint
SetNotEditable(vwenv);
vwenv.AddProp(ktagInnerNonBoundary, this, kfragLeftBracket);

DisplayInflFeatureLines(vwenv, inflFeatures, false);

SetNotEditable(vwenv);
vwenv.AddProp(ktagInnerNonBoundary, this, kfragRightBracket);
}
else
{
// left bracket pile
vwenv.Props = m_bracketProps;
vwenv.set_IntProperty((int) FwTextPropType.ktptMarginLeading, (int) FwTextPropVar.ktpvMilliPoint, PileMargin);
SetNotEditable(vwenv);
vwenv.OpenInnerPile();
SetNotEditable(vwenv);
vwenv.AddProp(ktagLeftNonBoundary, this, kfragLeftBracketUpHook);
for (int i = 1; i < numLines - 1; i++)
{
SetNotEditable(vwenv);
vwenv.AddProp(ktagLeftNonBoundary, this, kfragLeftBracketExt);
}
SetNotEditable(vwenv);
vwenv.AddProp(ktagLeftBoundary, this, kfragLeftBracketLowHook);
vwenv.CloseInnerPile();

Expand All @@ -489,15 +573,32 @@ private void DisplayInflFeatures(IVwEnv vwenv, IDictionary<IFsFeatDefn, object>
// right bracket pile
vwenv.Props = m_bracketProps;
vwenv.set_IntProperty((int) FwTextPropType.ktptMarginTrailing, (int) FwTextPropVar.ktpvMilliPoint, PileMargin);
SetNotEditable(vwenv);
vwenv.OpenInnerPile();
SetNotEditable(vwenv);
vwenv.AddProp(ktagInnerNonBoundary, this, kfragRightBracketUpHook);
for (int i = 1; i < numLines - 1; i++)
{
SetNotEditable(vwenv);
vwenv.AddProp(ktagInnerNonBoundary, this, kfragRightBracketExt);
}
SetNotEditable(vwenv);
vwenv.AddProp(ktagInnerNonBoundary, this, kfragRightBracketLowHook);
vwenv.CloseInnerPile();
}
}

/// <summary>
/// Every fragment this VC renders is a computed display (Display/DisplayVariant read
/// live node state), not a real bound field, so an edit that reaches this far has
/// nothing to apply. Absorb it and let the next layout redraw the correct value, the
/// same way RuleFormulaVcBase.UpdateProp does for the sibling rule-formula editor.
/// </summary>
public override ITsString UpdateProp(IVwSelection vwsel, int hvo, int tag, int frag, ITsString tssVal)
{
return tssVal;
}

public ITsString CreateFeatureLine(ITsString name, ITsString value, bool negated)
{
ITsIncStrBldr featLine = TsStringUtils.MakeIncStrBldr();
Expand Down
Loading
Loading