diff options
author | Armin Le Grand <Armin.Le.Grand@cib.de> | 2018-05-18 20:08:39 +0200 |
---|---|---|
committer | Armin Le Grand <Armin.Le.Grand@cib.de> | 2018-05-19 15:07:23 +0200 |
commit | bc6dd64fe2d8347e20ef4d560024c5e861f07aca (patch) | |
tree | b51e803cf315f651ea263bc7858ecc0f6b39c1cd /svx | |
parent | ff590683f9ac5956d95c519cb54b4ea5634dcb63 (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.cxx | 57 |
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) |