summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorArmin Le Grand <Armin.Le.Grand@cib.de>2018-05-18 20:08:39 +0200
committerArmin Le Grand <Armin.Le.Grand@cib.de>2018-05-19 15:07:23 +0200
commitbc6dd64fe2d8347e20ef4d560024c5e861f07aca (patch)
treeb51e803cf315f651ea263bc7858ecc0f6b39c1cd /svx
parentff590683f9ac5956d95c519cb54b4ea5634dcb63 (diff)
tdf#117506: Add using correct StyleSheet on ::Clone
There was an error/missing implementation on Cloning SdrPage(s)/SdrObject(s) to a new target-SdrModel. See comments in the code-change and in the tdf-task for more info. Change-Id: Ibe673a4b14e1c44102f80f05ebbeae5b6a1bae8f Reviewed-on: https://gerrit.libreoffice.org/54555 Reviewed-by: Armin Le Grand <Armin.Le.Grand@cib.de> Tested-by: Armin Le Grand <Armin.Le.Grand@cib.de>
Diffstat (limited to 'svx')
-rw-r--r--svx/source/sdr/properties/attributeproperties.cxx57
1 files changed, 37 insertions, 20 deletions
diff --git a/svx/source/sdr/properties/attributeproperties.cxx b/svx/source/sdr/properties/attributeproperties.cxx
index 7367abfbcb3d..424f4b49291d 100644
--- a/svx/source/sdr/properties/attributeproperties.cxx
+++ b/svx/source/sdr/properties/attributeproperties.cxx
@@ -179,28 +179,45 @@ namespace sdr
{
SfxStyleSheet* pTargetStyleSheet(rProps.GetStyleSheet());
- if(pTargetStyleSheet && &rObj.getSdrModelFromSdrObject() != &GetSdrObject().getSdrModelFromSdrObject())
+ if(pTargetStyleSheet &&
+ &rObj.getSdrModelFromSdrObject() != &rProps.GetSdrObject().getSdrModelFromSdrObject())
{
- // TTTT It is a clone to another model, thus the TargetStyleSheet
- // is probably also from another SdrModel, so do *not* simply use it.
- //
- // The DefaultProperties::Clone already has cloned the ::SET items
- // to a new SfxItemSet in the new SfxItemPool. There are quite some
- // possibilities to continue:
- // - Do not use StyleSheet (will do this for now)
- // - Search for same StyleSheet in Target-SdrModel and use if found
- // (use e.g. Name)
- // - Clone used StyleSheet(s) to Target-SdrModel and use
- // - Set all Attributes from the StyleSheet as hard attributes at the
- // SfxItemSet
- // The original AW080 uses 'ImpModelChange' (see there) which Clones
- // and uses the used StyleSheets if there is a Target-SfxItemPool
- // and sets to hard attributes if not. This may be used later if needed,
- // but for now only a single UnitTest uses this Clone-scenario and works
- // well with not using the TargetStyleSheet. The logic Cloning
- // StyleSheets *should* - if needed - be on a higher level where it is
- // potentially better known what would be the correct thing to do.
+ // tdf#117506
+ // The error shows that it is definitely necessary to solve this problem.
+ // Interestingly I already had a note here for 'work needed'.
+ // Checked in libreoffice-6-0 what happened there. In principle, the whole
+ // ::Clone of SdrPage and SdrObject happened in the same SdrModel, only
+ // afterwards a ::SetModel was used at the cloned SdrPage which went through
+ // all layers. The StyleSheet-problem was solved in
+ // AttributeProperties::MoveToItemPool at the end. There, a StyleSheet with the
+ // same name was searched for in the target-SdrModel.
+ // Start by retetting the current TargetStyleSheet so that nothing goes wrong
+ // when we do not find a fitting TargetStyleSheet.
+ // Note: The test for SdrModelChange above was wrong (compared the already set
+ // new SdrObject), so this never triggered and pTargetStyleSheet was never set to
+ // nullptr before. This means that a StyleSheet from another SdrModel was used
+ // what of course is very dangerous. Interestingly did not crash since when that
+ // other SdrModel was destroyed the ::Notify mechanism still worked reliably
+ // and de-connected this Properties successfully from the alien-StyleSheet.
pTargetStyleSheet = nullptr;
+
+ // Check if we have a TargetStyleSheetPool at the target-SdrModel. This *should*
+ // be the case already (SdrModel::Merge and SdDrawDocument::InsertBookmarkAsPage)
+ // have already cloned the StyleSheets to the target-SdrModel.
+ // If none is found, ImpGetDefaultStyleSheet will be used to set a 'default'
+ // StyleSheet as StyleSheet (that's what happened in the task, thus the FillStyle
+ // changed to the 'default' Blue).
+ SfxStyleSheetBasePool* pTargetStyleSheetPool(rObj.getSdrModelFromSdrObject().GetStyleSheetPool());
+
+ if(nullptr != pTargetStyleSheetPool)
+ {
+ // If we have a TargetStyleSheetPool, search for the StyleSheet used
+ // in the original Properties in the source-SdrModel.
+ pTargetStyleSheet = dynamic_cast< SfxStyleSheet* >(
+ pTargetStyleSheetPool->Find(
+ rProps.GetStyleSheet()->GetName(),
+ SfxStyleFamily::All));
+ }
}
if(pTargetStyleSheet)