Skip to content

Commit bcaf7c8

Browse files
authored
Fix LT-22189: FW9.2 does much worse with data entry than 9.1 (#411)
* Fix LT-22189: Revert pull 182 * Fix LT-22189: FW9.2 does much worse with data entry than 9.1
1 parent 4a08a38 commit bcaf7c8

7 files changed

Lines changed: 228 additions & 151 deletions

File tree

Src/Common/Controls/DetailControls/DataTree.cs

Lines changed: 141 additions & 94 deletions
Large diffs are not rendered by default.

Src/Common/Controls/DetailControls/DetailControlsTests/SliceTests.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,11 @@ public void CreateIndentedNodes_basic()
123123

124124
var path = GeneratePath();
125125

126+
var reuseMap = new ObjSeqHashMap();
126127
// Data taken from a running Sena 3
127128
var node = CreateXmlElementFromOuterXmlOf("<slice field=\"Form\" label=\"Form\" editor=\"multistring\" ws=\"all vernacular\" weight=\"light\" menu=\"mnuDataTree-LexemeForm\" contextMenu=\"mnuDataTree-LexemeFormContext\" spell=\"no\"><properties><bold value=\"on\" /><fontsize value=\"120%\" /></properties></slice>");
128129

129-
m_Slice.CreateIndentedNodes(caller, obj, indent, ref insPos, path, node);
130+
m_Slice.CreateIndentedNodes(caller, obj, indent, ref insPos, path, reuseMap, node);
130131
}
131132

132133
/// <remarks>
@@ -177,6 +178,7 @@ public void Collapse()
177178
public void CreateGhostStringSlice_ParentSliceNotNull()
178179
{
179180
var path = GeneratePath();
181+
var reuseMap = new ObjSeqHashMap();
180182
var obj = Cache.ServiceLocator.GetInstance<IMoStemAllomorphFactory>().Create();
181183
m_DataTree = new DataTree();
182184
m_Slice = GenerateSlice(Cache, m_DataTree);
@@ -188,7 +190,7 @@ public void CreateGhostStringSlice_ParentSliceNotNull()
188190
int indent = 0;
189191
int insertPosition = 0;
190192
int flidEmptyProp = 5002031; // runtime flid of ghost field
191-
m_DataTree.MakeGhostSlice(path, node, obj, m_Slice, flidEmptyProp, null, indent, ref insertPosition);
193+
m_DataTree.MakeGhostSlice(path, node, reuseMap, obj, m_Slice, flidEmptyProp, null, indent, ref insertPosition);
192194
var ghostSlice = m_DataTree.Slices[0];
193195
Assert.NotNull(ghostSlice);
194196
Assert.AreEqual(ghostSlice.PropTable, m_Slice.PropTable);

Src/Common/Controls/DetailControls/Slice.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,7 +1079,7 @@ internal static int ExtraIndent(XmlNode indentNode)
10791079

10801080
/// <summary></summary>
10811081
public virtual void GenerateChildren(XmlNode node, XmlNode caller, ICmObject obj, int indent,
1082-
ref int insPos, ArrayList path, bool fUsePersistentExpansion)
1082+
ref int insPos, ArrayList path, ObjSeqHashMap reuseMap, bool fUsePersistentExpansion)
10831083
{
10841084
CheckDisposed();
10851085

@@ -1101,14 +1101,14 @@ public virtual void GenerateChildren(XmlNode node, XmlNode caller, ICmObject obj
11011101
if (indentNode != null)
11021102
{
11031103
// Similarly pretest for children of caller, to see whether anything is produced.
1104-
ContainingDataTree.ApplyLayout(obj, this, indentNode, indent + ExtraIndent(indentNode), insPos, path,
1104+
ContainingDataTree.ApplyLayout(obj, this, indentNode, indent + ExtraIndent(indentNode), insPos, path, reuseMap,
11051105
true, out ntr);
11061106
//fUseChildrenOfNode = false;
11071107
}
11081108
else
11091109
{
11101110
int insPosT = insPos; // don't modify the real one in this test call.
1111-
ntr = ContainingDataTree.ProcessPartChildren(node, path, obj, this, indent + ExtraIndent(node), ref insPosT,
1111+
ntr = ContainingDataTree.ProcessPartChildren(node, path, reuseMap, obj, this, indent + ExtraIndent(node), ref insPosT,
11121112
true, null, false, node);
11131113
//fUseChildrenOfNode = true;
11141114
}
@@ -1144,7 +1144,7 @@ public virtual void GenerateChildren(XmlNode node, XmlNode caller, ICmObject obj
11441144
{
11451145
// Record the expansion state and generate the children.
11461146
Expansion = DataTree.TreeItemState.ktisExpanded;
1147-
CreateIndentedNodes(caller, obj, indent, ref insPos, path, node);
1147+
CreateIndentedNodes(caller, obj, indent, ref insPos, path, reuseMap, node);
11481148
}
11491149
else
11501150
{
@@ -1156,7 +1156,7 @@ public virtual void GenerateChildren(XmlNode node, XmlNode caller, ICmObject obj
11561156

11571157
/// <summary></summary>
11581158
public virtual void CreateIndentedNodes(XmlNode caller, ICmObject obj, int indent, ref int insPos,
1159-
ArrayList path, XmlNode node)
1159+
ArrayList path, ObjSeqHashMap reuseMap, XmlNode node)
11601160
{
11611161
CheckDisposed();
11621162

@@ -1170,10 +1170,10 @@ public virtual void CreateIndentedNodes(XmlNode caller, ICmObject obj, int inden
11701170
{
11711171
DataTree.NodeTestResult ntr;
11721172
insPos = ContainingDataTree.ApplyLayout(obj, this, indentNode, indent + ExtraIndent(indentNode),
1173-
insPos, path, false, out ntr);
1173+
insPos, path, reuseMap, false, out ntr);
11741174
}
11751175
else
1176-
ContainingDataTree.ProcessPartChildren(node, path, obj, this, indent + ExtraIndent(node), ref insPos,
1176+
ContainingDataTree.ProcessPartChildren(node, path, reuseMap, obj, this, indent + ExtraIndent(node), ref insPos,
11771177
false, parameter, false, caller);
11781178
}
11791179

@@ -1592,7 +1592,7 @@ public virtual void Expand(int iSlice)
15921592
if (Key.Length > 1)
15931593
caller = Key[Key.Length - 2] as XmlNode;
15941594
int insPos = iSlice + 1;
1595-
CreateIndentedNodes(caller, m_obj, Indent, ref insPos, new ArrayList(Key), m_configurationNode);
1595+
CreateIndentedNodes(caller, m_obj, Indent, ref insPos, new ArrayList(Key), new ObjSeqHashMap(), m_configurationNode);
15961596

15971597
Expansion = DataTree.TreeItemState.ktisExpanded;
15981598
if (m_propertyTable != null)

Src/Common/Controls/DetailControls/SliceFactory.cs

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ private static int GetWs(LcmCache cache, PropertyTable propertyTable, XmlNode no
7777

7878
/// <summary></summary>
7979
public static Slice Create(LcmCache cache, string editor, int flid, XmlNode node, ICmObject obj,
80-
IPersistenceProvider persistenceProvider, Mediator mediator, PropertyTable propertyTable, XmlNode caller)
80+
IPersistenceProvider persistenceProvider, Mediator mediator, PropertyTable propertyTable, XmlNode caller, ObjSeqHashMap reuseMap)
8181
{
82-
Slice slice = null;
82+
Slice slice;
8383
switch(editor)
8484
{
8585
case "multistring": // first, these are the most common slices.
@@ -109,17 +109,38 @@ public static Slice Create(LcmCache cache, string editor, int flid, XmlNode node
109109
}
110110
case "defaultvectorreference": // second most common.
111111
{
112-
slice = new ReferenceVectorSlice(cache, obj, flid);
112+
var rvSlice = reuseMap.GetSliceToReuse("ReferenceVectorSlice") as ReferenceVectorSlice;
113+
if (rvSlice == null)
114+
slice = new ReferenceVectorSlice(cache, obj, flid);
115+
else
116+
{
117+
slice = rvSlice;
118+
rvSlice.Reuse(obj, flid);
119+
}
113120
break;
114121
}
115122
case "possvectorreference":
116123
{
117-
slice = new PossibilityReferenceVectorSlice(cache, obj, flid);
124+
var prvSlice = reuseMap.GetSliceToReuse("PossibilityReferenceVectorSlice") as PossibilityReferenceVectorSlice;
125+
if (prvSlice == null)
126+
slice = new PossibilityReferenceVectorSlice(cache, obj, flid);
127+
else
128+
{
129+
slice = prvSlice;
130+
prvSlice.Reuse(obj, flid);
131+
}
118132
break;
119133
}
120134
case "semdomvectorreference":
121135
{
122-
slice = new SemanticDomainReferenceVectorSlice(cache, obj, flid);
136+
var prvSlice = reuseMap.GetSliceToReuse("SemanticDomainReferenceVectorSlice") as SemanticDomainReferenceVectorSlice;
137+
if (prvSlice == null)
138+
slice = new SemanticDomainReferenceVectorSlice(cache, obj, flid);
139+
else
140+
{
141+
slice = prvSlice;
142+
prvSlice.Reuse(obj, flid);
143+
}
123144
break;
124145
}
125146
case "string":
@@ -325,20 +346,27 @@ public static Slice Create(LcmCache cache, string editor, int flid, XmlNode node
325346
break;
326347
case "defaultvectorreferencedisabled": // second most common.
327348
{
328-
slice = new ReferenceVectorDisabledSlice(cache, obj, flid);
349+
ReferenceVectorDisabledSlice rvSlice = reuseMap.GetSliceToReuse("ReferenceVectorDisabledSlice") as ReferenceVectorDisabledSlice;
350+
if (rvSlice == null)
351+
slice = new ReferenceVectorDisabledSlice(cache, obj, flid);
352+
else
353+
{
354+
slice = rvSlice;
355+
rvSlice.Reuse(obj, flid);
356+
}
329357
break;
330358
}
331359
default:
332360
{
333361
//Since the editor has not been implemented yet,
334362
//is there a bitmap file that we can show for this editor?
335363
//Such bitmaps belong in the distFiles xde directory
336-
var fwCodeDir = FwDirectoryFinder.CodeDirectory;
337-
var editorBitmapRelativePath = "xde/" + editor + ".bmp";
364+
string fwCodeDir = FwDirectoryFinder.CodeDirectory;
365+
string editorBitmapRelativePath = "xde/" + editor + ".bmp";
338366
if(File.Exists(Path.Combine(fwCodeDir, editorBitmapRelativePath)))
339367
slice = new ImageSlice(fwCodeDir, editorBitmapRelativePath);
340368
else
341-
slice = new MessageSlice(string.Format(DetailControlsStrings.ksBadEditorType, editor));
369+
slice = new MessageSlice(String.Format(DetailControlsStrings.ksBadEditorType, editor));
342370
break;
343371
}
344372
}

Src/FdoUi/FdoUiCore.cs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -396,41 +396,41 @@ private static CmObjectUi MakeUi(LcmCache cache, int hvo, int clsid)
396396
/// <returns></returns>
397397
public static CmObjectUi CreateNewUiObject(Mediator mediator, PropertyTable propertyTable, int classId, int hvoOwner, int flid, int insertionPosition)
398398
{
399-
var cache = propertyTable.GetValue<LcmCache>("cache");
400-
switch (classId)
401-
{
402-
default:
403-
return DefaultCreateNewUiObject(mediator, classId, hvoOwner, flid, insertionPosition, cache);
404-
case CmPossibilityTags.kClassId:
405-
return CmPossibilityUi.CreateNewUiObject(propertyTable, classId, hvoOwner, flid, insertionPosition);
406-
case PartOfSpeechTags.kClassId:
407-
return PartOfSpeechUi.CreateNewUiObject(mediator, propertyTable, classId, hvoOwner, flid, insertionPosition);
408-
case FsFeatDefnTags.kClassId:
409-
return FsFeatDefnUi.CreateNewUiObject(mediator, propertyTable, classId, hvoOwner, flid, insertionPosition);
410-
case LexSenseTags.kClassId:
411-
return LexSenseUi.CreateNewUiObject(propertyTable, classId, hvoOwner, flid, insertionPosition);
412-
case LexPronunciationTags.kClassId:
413-
return LexPronunciationUi.CreateNewUiObject(propertyTable, classId, hvoOwner, flid, insertionPosition);
414-
}
415-
}
416-
417-
internal static CmObjectUi DefaultCreateNewUiObject(Mediator mediator, int classId, int hvoOwner, int flid, int insertionPosition, LcmCache cache)
418-
{
419-
CmObjectUi newUiObj = null;
420399
try
421400
{
422401
// Don't postpone PropChanged (cf. LT-22095).
423402
mediator?.SendMessage("PostponePropChanged", false);
424-
UndoableUnitOfWorkHelper.Do(FdoUiStrings.ksUndoInsert, FdoUiStrings.ksRedoInsert, cache.ServiceLocator.GetInstance<IActionHandler>(), () =>
403+
var cache = propertyTable.GetValue<LcmCache>("cache");
404+
switch (classId)
425405
{
426-
int newHvo = cache.DomainDataByFlid.MakeNewObject(classId, hvoOwner, flid, insertionPosition);
427-
newUiObj = MakeUi(cache, newHvo, classId);
428-
});
406+
default:
407+
return DefaultCreateNewUiObject(mediator, classId, hvoOwner, flid, insertionPosition, cache);
408+
case CmPossibilityTags.kClassId:
409+
return CmPossibilityUi.CreateNewUiObject(propertyTable, classId, hvoOwner, flid, insertionPosition);
410+
case PartOfSpeechTags.kClassId:
411+
return PartOfSpeechUi.CreateNewUiObject(mediator, propertyTable, classId, hvoOwner, flid, insertionPosition);
412+
case FsFeatDefnTags.kClassId:
413+
return FsFeatDefnUi.CreateNewUiObject(mediator, propertyTable, classId, hvoOwner, flid, insertionPosition);
414+
case LexSenseTags.kClassId:
415+
return LexSenseUi.CreateNewUiObject(propertyTable, classId, hvoOwner, flid, insertionPosition);
416+
case LexPronunciationTags.kClassId:
417+
return LexPronunciationUi.CreateNewUiObject(propertyTable, classId, hvoOwner, flid, insertionPosition);
418+
}
429419
}
430420
finally
431421
{
432422
mediator?.SendMessage("PostponePropChanged", true);
433423
}
424+
}
425+
426+
internal static CmObjectUi DefaultCreateNewUiObject(Mediator mediator, int classId, int hvoOwner, int flid, int insertionPosition, LcmCache cache)
427+
{
428+
CmObjectUi newUiObj = null;
429+
UndoableUnitOfWorkHelper.Do(FdoUiStrings.ksUndoInsert, FdoUiStrings.ksRedoInsert, cache.ServiceLocator.GetInstance<IActionHandler>(), () =>
430+
{
431+
int newHvo = cache.DomainDataByFlid.MakeNewObject(classId, hvoOwner, flid, insertionPosition);
432+
newUiObj = MakeUi(cache, newHvo, classId);
433+
});
434434
return newUiObj;
435435
}
436436

Src/LexText/Lexicon/LexReferenceMultiSlice.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ void SetRefs()
129129
}
130130

131131
public override void GenerateChildren(XmlNode node, XmlNode caller, ICmObject obj, int indent,
132-
ref int insPos, ArrayList path, bool fUsePersistentExpansion)
132+
ref int insPos, ArrayList path, ObjSeqHashMap reuseMap, bool fUsePersistentExpansion)
133133
{
134134
CheckDisposed();
135135
// If node has children, figure what to do with them...
@@ -150,14 +150,14 @@ public override void GenerateChildren(XmlNode node, XmlNode caller, ICmObject ob
150150

151151
for (int i = 0; i < m_refs.Count; i++)
152152
{
153-
GenerateChildNode(i, node, caller, indent, ref insPos, path);
153+
GenerateChildNode(i, node, caller, indent, ref insPos, path, reuseMap);
154154
}
155155

156156
Expansion = DataTree.TreeItemState.ktisExpanded;
157157
}
158158

159159
private void GenerateChildNode(int iChild, XmlNode node, XmlNode caller, int indent,
160-
ref int insPos, ArrayList path)
160+
ref int insPos, ArrayList path, ObjSeqHashMap reuseMap)
161161
{
162162
var lr = m_refs[iChild];
163163
var lrt = lr.Owner as ILexRefType;
@@ -301,7 +301,7 @@ private void GenerateChildNode(int iChild, XmlNode node, XmlNode caller, int ind
301301
" menu=\"" + sMenu + "\"><deParams displayProperty=\"HeadWord\"/></slice>";
302302
node.InnerXml = sXml;
303303
int firstNewSliceIndex = insPos;
304-
CreateIndentedNodes(caller, lr, indent, ref insPos, path, node);
304+
CreateIndentedNodes(caller, lr, indent, ref insPos, path, reuseMap, node);
305305
for (int islice = firstNewSliceIndex; islice < insPos; islice++)
306306
{
307307
Slice child = ContainingDataTree.Slices[islice] as Slice;
@@ -769,7 +769,7 @@ protected void ExpandNewNode()
769769
caller = Key[Key.Length - 2] as XmlNode;
770770
int insPos = this.IndexInContainer + m_refs.Count;
771771
GenerateChildNode(m_refs.Count-1, m_configurationNode, caller, Indent,
772-
ref insPos, new ArrayList(Key));
772+
ref insPos, new ArrayList(Key), new ObjSeqHashMap());
773773
Expansion = DataTree.TreeItemState.ktisExpanded;
774774
}
775775
finally
@@ -795,7 +795,7 @@ public override void Expand(int iSlice)
795795
if (Key.Length > 1)
796796
caller = Key[Key.Length - 2] as XmlNode;
797797
int insPos = iSlice + 1;
798-
GenerateChildren(m_configurationNode, caller, m_obj, Indent, ref insPos, new ArrayList(Key), false);
798+
GenerateChildren(m_configurationNode, caller, m_obj, Indent, ref insPos, new ArrayList(Key), new ObjSeqHashMap(), false);
799799
Expansion = DataTree.TreeItemState.ktisExpanded;
800800
}
801801
finally

Src/LexText/Lexicon/RoledParticipantsSlice.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) 2015 SIL International
1+
// Copyright (c) 2015 SIL International
22
// This software is licensed under the LGPL, version 2.1 or later
33
// (http://www.gnu.org/licenses/lgpl-2.1.html)
44

@@ -104,20 +104,20 @@ protected override void InitLauncher()
104104
}
105105

106106
public override void GenerateChildren(XmlNode node, XmlNode caller, ICmObject obj, int indent, ref int insPos,
107-
ArrayList path, bool fUsePersistentExpansion)
107+
ArrayList path, ObjSeqHashMap reuseMap, bool fUsePersistentExpansion)
108108
{
109109
CheckDisposed();
110110

111111
foreach (IRnRoledPartic roledPartic in Record.ParticipantsOC)
112112
{
113113
if (roledPartic.RoleRA != null)
114-
GenerateChildNode(roledPartic, node, caller, indent, ref insPos, path);
114+
GenerateChildNode(roledPartic, node, caller, indent, ref insPos, path, reuseMap);
115115
}
116116
Expansion = Record.ParticipantsOC.Count == 0 ? DataTree.TreeItemState.ktisCollapsedEmpty : DataTree.TreeItemState.ktisExpanded;
117117
}
118118

119119
private void GenerateChildNode(IRnRoledPartic roledPartic, XmlNode node, XmlNode caller, int indent,
120-
ref int insPos, ArrayList path)
120+
ref int insPos, ArrayList path, ObjSeqHashMap reuseMap)
121121
{
122122
var sliceElem = new XElement("slice",
123123
new XAttribute("label", roledPartic.RoleRA.Name.BestAnalysisAlternative.Text),
@@ -130,7 +130,7 @@ private void GenerateChildNode(IRnRoledPartic roledPartic, XmlNode node, XmlNode
130130
sliceElem.Add(XElement.Parse(childNode.OuterXml));
131131
}
132132
node.InnerXml = sliceElem.ToString();
133-
CreateIndentedNodes(caller, roledPartic, indent, ref insPos, path, node);
133+
CreateIndentedNodes(caller, roledPartic, indent, ref insPos, path, reuseMap, node);
134134
node.InnerXml = "";
135135
}
136136

@@ -355,7 +355,7 @@ private void ExpandNewNode(IRnRoledPartic roledPartic)
355355
if (Key.Length > 1)
356356
caller = Key[Key.Length - 2] as XmlNode;
357357
int insPos = IndexInContainer + Record.ParticipantsOC.Count - 1;
358-
GenerateChildNode(roledPartic, m_configurationNode, caller, Indent, ref insPos, new ArrayList(Key));
358+
GenerateChildNode(roledPartic, m_configurationNode, caller, Indent, ref insPos, new ArrayList(Key), new ObjSeqHashMap());
359359
Expansion = DataTree.TreeItemState.ktisExpanded;
360360
}
361361
finally
@@ -379,7 +379,7 @@ public override void Expand(int iSlice)
379379
if (Key.Length > 1)
380380
caller = Key[Key.Length - 2] as XmlNode;
381381
int insPos = iSlice + 1;
382-
GenerateChildren(m_configurationNode, caller, m_obj, Indent, ref insPos, new ArrayList(Key), false);
382+
GenerateChildren(m_configurationNode, caller, m_obj, Indent, ref insPos, new ArrayList(Key), new ObjSeqHashMap(), false);
383383
Expansion = DataTree.TreeItemState.ktisExpanded;
384384
}
385385
finally

0 commit comments

Comments
 (0)