diff --git a/flexlibs2/code/Grammar/GramCatOperations.py b/flexlibs2/code/Grammar/GramCatOperations.py index c53395c..edd2c76 100644 --- a/flexlibs2/code/Grammar/GramCatOperations.py +++ b/flexlibs2/code/Grammar/GramCatOperations.py @@ -519,11 +519,8 @@ def Duplicate(self, item_or_hvo, insert_after=True, deep=False): feature_system = self.project.lp.MsFeatureSystemOA factory = self.project.project.ServiceLocator.GetService(IFsFeatStrucTypeFactory) duplicate = factory.Create() - if insert_after: - source_index = feature_system.TypesOC.IndexOf(source) - feature_system.TypesOC.Insert(source_index + 1, duplicate) - else: - feature_system.TypesOC.Add(duplicate) + # TypesOC is unordered (OC); insert_after is a no-op, add at end + feature_system.TypesOC.Add(duplicate) # Copy simple MultiString properties (AFTER adding to parent) duplicate.Name.CopyAlternatives(source.Name) diff --git a/flexlibs2/code/Lexicon/allomorph.py b/flexlibs2/code/Lexicon/allomorph.py index 3663b3d..97654de 100644 --- a/flexlibs2/code/Lexicon/allomorph.py +++ b/flexlibs2/code/Lexicon/allomorph.py @@ -130,7 +130,7 @@ def form(self) -> str: form_multistring = self._obj.Form if form_multistring: # Get from default vernacular writing system - default_ws = self._obj.OwnerOfClass.project.DefaultVernWs + default_ws = self._obj.Cache.DefaultVernWs form_text = ITsString(form_multistring.get_String(default_ws)).Text return normalize_text(form_text) return "" @@ -160,7 +160,7 @@ def gloss(self) -> str: if hasattr(self._concrete, "Gloss") and self._concrete.Gloss: # Get from default analysis writing system - default_ws = self._obj.OwnerOfClass.project.DefaultAnalWs + default_ws = self._obj.Cache.DefaultAnalWs gloss_text = ITsString(self._concrete.Gloss.get_String(default_ws)).Text return normalize_text(gloss_text) return "" @@ -275,7 +275,7 @@ def stem_name(self): if hasattr(self._concrete, "StemName") and self._concrete.StemName: # Get from default analysis writing system - default_ws = self._obj.OwnerOfClass.project.DefaultAnalWs + default_ws = self._obj.Cache.DefaultAnalWs stem_name_text = ITsString(self._concrete.StemName.get_String(default_ws)).Text return normalize_text(stem_name_text) return "" diff --git a/flexlibs2/code/Notebook/DataNotebookOperations.py b/flexlibs2/code/Notebook/DataNotebookOperations.py index 1c4b37d..1d7772e 100644 --- a/flexlibs2/code/Notebook/DataNotebookOperations.py +++ b/flexlibs2/code/Notebook/DataNotebookOperations.py @@ -2538,11 +2538,8 @@ def Duplicate(self, record_or_hvo, insert_after=True, deep=True): else: # Parent is the top-level repository repos = self.project.project.ServiceLocator.GetService(IRnResearchNbkRepository) - if insert_after: - source_index = repos.RecordsOC.IndexOf(source) - repos.RecordsOC.Insert(source_index + 1, duplicate) - else: - repos.RecordsOC.Add(duplicate) + # RecordsOC is unordered (OC); insert_after is a no-op, add at end + repos.RecordsOC.Add(duplicate) # Copy simple MultiString properties duplicate.Title.CopyAlternatives(source.Title) diff --git a/flexlibs2/code/Notebook/NoteOperations.py b/flexlibs2/code/Notebook/NoteOperations.py index d2d011b..6314436 100644 --- a/flexlibs2/code/Notebook/NoteOperations.py +++ b/flexlibs2/code/Notebook/NoteOperations.py @@ -323,8 +323,8 @@ def Duplicate(self, item_or_hvo, insert_after=True, deep=True): source_index = parent.RepliesOS.IndexOf(source) parent.RepliesOS.Insert(source_index + 1, duplicate) elif hasattr(parent, "AnnotationsOC"): - source_index = parent.AnnotationsOC.IndexOf(source) - parent.AnnotationsOC.Insert(source_index + 1, duplicate) + # AnnotationsOC is unordered (OC); insert_after is a no-op, add at end + parent.AnnotationsOC.Add(duplicate) else: # Insert at end if hasattr(parent, "RepliesOS"): diff --git a/flexlibs2/code/TextsWords/DiscourseOperations.py b/flexlibs2/code/TextsWords/DiscourseOperations.py index ff422c4..4d9dd19 100644 --- a/flexlibs2/code/TextsWords/DiscourseOperations.py +++ b/flexlibs2/code/TextsWords/DiscourseOperations.py @@ -1096,15 +1096,9 @@ def Duplicate(self, item_or_hvo, insert_after=True, deep=True): duplicate = factory.Create() # ADD TO PARENT FIRST - if insert_after: - # Insert after source chart - if hasattr(parent, "ChartsOC"): - source_index = parent.ChartsOC.IndexOf(source) - parent.ChartsOC.Insert(source_index + 1, duplicate) - else: - # Insert at end - if hasattr(parent, "ChartsOC"): - parent.ChartsOC.Add(duplicate) + # ChartsOC is unordered (OC); insert_after is a no-op, add at end + if hasattr(parent, "ChartsOC"): + parent.ChartsOC.Add(duplicate) # Copy MultiString properties (AFTER adding to parent) if hasattr(source, "Name") and source.Name: diff --git a/flexlibs2/code/TextsWords/WfiAnalysisOperations.py b/flexlibs2/code/TextsWords/WfiAnalysisOperations.py index 8e5576e..0f89bd0 100644 --- a/flexlibs2/code/TextsWords/WfiAnalysisOperations.py +++ b/flexlibs2/code/TextsWords/WfiAnalysisOperations.py @@ -473,13 +473,8 @@ def Duplicate(self, item_or_hvo, insert_after=True, deep=False): duplicate = factory.Create() # Determine insertion position - if insert_after: - # Insert after source analysis - source_index = list(parent.AnalysesOC).index(source) - parent.AnalysesOC.Insert(source_index + 1, duplicate) - else: - # Insert at end - parent.AnalysesOC.Add(duplicate) + # AnalysesOC is unordered (OC); insert_after is a no-op, add at end + parent.AnalysesOC.Add(duplicate) # Copy Reference Atomic (RA) properties if hasattr(source, "CategoryRA") and source.CategoryRA: diff --git a/flexlibs2/code/TextsWords/WfiGlossOperations.py b/flexlibs2/code/TextsWords/WfiGlossOperations.py index 05687bc..b156c61 100644 --- a/flexlibs2/code/TextsWords/WfiGlossOperations.py +++ b/flexlibs2/code/TextsWords/WfiGlossOperations.py @@ -413,7 +413,8 @@ def Duplicate(self, item_or_hvo, insert_after=False): factory = self.project.project.ServiceLocator.GetService(IWfiGlossFactory) duplicate = factory.Create() - # MeaningsOC is unordered; always append via Add(). + # Determine insertion position + # MeaningsOC is unordered (OC); insert_after is a no-op, add at end parent.MeaningsOC.Add(duplicate) # Copy simple MultiString properties diff --git a/flexlibs2/code/lcm_casting.py b/flexlibs2/code/lcm_casting.py index bef5765..0809be5 100644 --- a/flexlibs2/code/lcm_casting.py +++ b/flexlibs2/code/lcm_casting.py @@ -472,10 +472,10 @@ def clone_properties(source_obj, dest_obj, project=None): source = cast_to_concrete(source_obj) dest = cast_to_concrete(dest_obj) - # If project not provided, try to get it from the destination object - if project is None and hasattr(dest, "OwnerOfClass"): + # If project not provided, resolve via Cache.LanguageProject (canonical accessor) + if project is None and hasattr(dest, "Cache"): try: - project = dest.OwnerOfClass.project + project = dest.Cache.LanguageProject except Exception: pass