Kaydet (Commit) 6ebe8b90 authored tarafından Armin Le Grand's avatar Armin Le Grand

Corrected PresObj Styles

When SdrPresObj's get constructed, e.g. when loading/
opening an Impress, the Styles for the PresObj's
(PresentationObjects) need to be constructed carefully
the same way as in former versions. This is a combination
of creating the SdrObject, adding a Style and setting default
Attributes, combined with in.-between corrections. All these
combinations make these fragile, plus the im/export using
ODF XML format and UNO API. With last SOSaw080 changes
not all places were correctly converted (mainly due to
new timing when and how a SdrObject belongs to a SdrPage).
Corrected this now, checked im/export/echange with
libreoffice-6-0 versions.

Stuff is more complicated that initially thought, see comment
added at AttributeProperties::GetObjectItemSet() for more info.
Adaption of the two UnitTest-Files is explained there, too.

Change-Id: Ia90a37492f3a92030790fbd27b7c532883bce923
Reviewed-on: https://gerrit.libreoffice.org/55029Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarArmin Le Grand <Armin.Le.Grand@cib.de>
üst f15c4b0f
<?xml version="1.0"?> <?xml version="1.0"?>
<XShapes> <XShapes>
<XShape positionX="2823" positionY="-75" sizeX="19753" sizeY="19045" type="com.sun.star.drawing.GraphicObjectShape" name="Picture 5" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="BLOCK" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" shadow="false" shadowColor="808080" shadowTransparence="0" shadowXDistance="200" shadowYDistance="200" zOrder="0" layerID="0" layerName="layout" visible="true" printable="true" moveProtect="false" sizeProtect="false"> <XShape positionX="2823" positionY="-75" sizeX="19753" sizeY="19045" type="com.sun.star.drawing.GraphicObjectShape" name="Picture 5" fontHeight="18.000000" fontColor="ffffffff" textAutoGrowHeight="false" textAutoGrowWidth="false" textContourFrame="false" textFitToSize="NONE" textHorizontalAdjust="CENTER" textVerticalAdjust="TOP" textLeftDistance="250" textRightDistance="250" textUpperDistance="125" textLowerDistance="125" textMaximumFrameHeight="0" textMaximumFrameWidth="0" textMinimumFrameHeight="0" textMinimumFrameWidth="0" textAnimationAmount="0" textAnimationCount="0" textAnimationDelay="0" textAnimationDirection="LEFT" textAnimationKind="NONE" textAnimationStartInside="false" textAnimationStopInside="false" textWritingMode="LR_TB" shadow="false" shadowColor="808080" shadowTransparence="0" shadowXDistance="200" shadowYDistance="200" zOrder="0" layerID="0" layerName="layout" visible="true" printable="true" moveProtect="false" sizeProtect="false">
<Transformation> <Transformation>
<Line1 column1="19754.000000" column2="0.000000" column3="2823.000000"/> <Line1 column1="19754.000000" column2="0.000000" column3="2823.000000"/>
<Line2 column1="0.000000" column2="19046.000000" column3="-75.000000"/> <Line2 column1="0.000000" column2="19046.000000" column3="-75.000000"/>
......
...@@ -233,35 +233,42 @@ namespace sdr ...@@ -233,35 +233,42 @@ namespace sdr
// remember if we had a SfxItemSet already // remember if we had a SfxItemSet already
const bool bHadSfxItemSet(HasSfxItemSet()); const bool bHadSfxItemSet(HasSfxItemSet());
// call parent - this will then guarantee // call parent - this will guarantee SfxItemSet existence
// SfxItemSet existence
DefaultProperties::GetObjectItemSet(); DefaultProperties::GetObjectItemSet();
if(!bHadSfxItemSet) if(!bHadSfxItemSet)
{ {
// SfxItemSet was created and ForceDefaultAttributes() is done. // need to take care for SfxStyleSheet for newly
// We now need to set a default SfxStyleSheet at the SdrObject. This // created SfxItemSet
// is possible now since we always have the SdrModel in SdrObject, if(nullptr == mpStyleSheet)
// so use applyDefaultStyleSheetFromSdrModel() which will do the {
// right thing in each derivation of BaseProperties. // Set missing defaults without removal of hard attributes.
// We also need to 'rescue' mpStyleSheet if it is already set, // This is more complicated historically than I first thought:
// which means a SfxStyleSheet was already set/ocopied but not // Originally for GetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj
// yet set at the SdrObject. See copy-constructor and how it remembers // SetStyleSheet(..., false) was used, while for GetDefaultStyleSheet
// the SfxStyleSheet there. This time, do not reset the // SetStyleSheet(..., true) was used. Thus, for SdrGrafObj and SdrOle2Obj
// attributes already set - this is done above. // bDontRemoveHardAttr == false -> *do* delete hard attributes was used.
SfxStyleSheet* pImplicitelyAlreadySet(mpStyleSheet); // This was probably not done by purpose, adding the method
// GetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj additionally to
// Set missing defaults and do RemoveHardAttributes. This is // GetDefaultStyleSheet was an enhancement to allow for SdrGrafObj/SdrOle2Obj
// important, it deletes again the attributes set in // with full AttributeSet (adding e.g. FillAttributes). To stay as compatible
// ForceDefaultAttributes() which are set in the default // as possible these SdrObjects got a new default-StyleSheet.
// SfxStyleSheet. // There is no reason to delete the HardAttributes and it anyways has only
const_cast< AttributeProperties* >(this)->applyDefaultStyleSheetFromSdrModel(); // AFAIK effects on a single Item - the SdrTextHorzAdjustItem. To get things
// unified I will stay with not deleting the HardAttributes and adapt the
if(pImplicitelyAlreadySet) // UnitTests in CppunitTest_sd_import_tests accordingly.
const_cast< AttributeProperties* >(this)->applyDefaultStyleSheetFromSdrModel();
}
else
{ {
// Late-Init of setting parent to SfxStyleSheet after // Late-Init of setting parent to SfxStyleSheet after
// it's creation. // it's creation. Can only happen from copy-constructor
const_cast< AttributeProperties* >(this)->SetStyleSheet(pImplicitelyAlreadySet, true); // (where creation of SfxItemSet is avoided due to the
// problem with constructors and virtual functions in C++),
// thus DontRemoveHardAttr is not needed.
const_cast< AttributeProperties* >(this)->SetStyleSheet(
mpStyleSheet,
true);
} }
} }
...@@ -326,11 +333,8 @@ namespace sdr ...@@ -326,11 +333,8 @@ namespace sdr
} }
} }
// set item // guarantee SfxItemSet existence
if(!HasSfxItemSet()) GetObjectItemSet();
{
GetObjectItemSet();
}
if(pResultItem) if(pResultItem)
{ {
...@@ -357,11 +361,8 @@ namespace sdr ...@@ -357,11 +361,8 @@ namespace sdr
void AttributeProperties::SetStyleSheet(SfxStyleSheet* pNewStyleSheet, bool bDontRemoveHardAttr) void AttributeProperties::SetStyleSheet(SfxStyleSheet* pNewStyleSheet, bool bDontRemoveHardAttr)
{ {
// guarantee SfxItemSet existence here // guarantee SfxItemSet existence
if(!HasSfxItemSet()) GetObjectItemSet();
{
GetObjectItemSet();
}
ImpRemoveStyleSheet(); ImpRemoveStyleSheet();
ImpAddStyleSheet(pNewStyleSheet, bDontRemoveHardAttr); ImpAddStyleSheet(pNewStyleSheet, bDontRemoveHardAttr);
...@@ -381,11 +382,8 @@ namespace sdr ...@@ -381,11 +382,8 @@ namespace sdr
if(!GetStyleSheet() || dynamic_cast<const SfxStyleSheet *>(mpStyleSheet) == nullptr) if(!GetStyleSheet() || dynamic_cast<const SfxStyleSheet *>(mpStyleSheet) == nullptr)
return; return;
// force SfxItemSet existence // guarantee SfxItemSet existence
if(!HasSfxItemSet()) GetObjectItemSet();
{
GetObjectItemSet();
}
// prepare copied, new itemset, but WITHOUT parent // prepare copied, new itemset, but WITHOUT parent
SfxItemSet* pDestItemSet = new SfxItemSet(*mpItemSet); SfxItemSet* pDestItemSet = new SfxItemSet(*mpItemSet);
......
...@@ -39,7 +39,8 @@ namespace sdr ...@@ -39,7 +39,8 @@ namespace sdr
if(pStyleSheet) if(pStyleSheet)
{ {
SetStyleSheet(pStyleSheet, false); // do not delete hard attributes when setting dsefault Style
SetStyleSheet(pStyleSheet, true);
} }
else else
{ {
......
...@@ -34,7 +34,8 @@ namespace sdr ...@@ -34,7 +34,8 @@ namespace sdr
if(pStyleSheet) if(pStyleSheet)
{ {
SetStyleSheet(pStyleSheet, false); // do not delete hard attributes when setting dsefault Style
SetStyleSheet(pStyleSheet, true);
} }
else else
{ {
......
...@@ -43,7 +43,8 @@ namespace sdr ...@@ -43,7 +43,8 @@ namespace sdr
void BaseProperties::applyDefaultStyleSheetFromSdrModel() void BaseProperties::applyDefaultStyleSheetFromSdrModel()
{ {
SetStyleSheet(GetSdrObject().getSdrModelFromSdrObject().GetDefaultStyleSheet(), false); // do not delete hard attributes when setting dsefault Style
SetStyleSheet(GetSdrObject().getSdrModelFromSdrObject().GetDefaultStyleSheet(), true);
} }
const SdrObject& BaseProperties::GetSdrObject() const const SdrObject& BaseProperties::GetSdrObject() const
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment