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"?>
<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>
<Line1 column1="19754.000000" column2="0.000000" column3="2823.000000"/>
<Line2 column1="0.000000" column2="19046.000000" column3="-75.000000"/>
......
......@@ -233,35 +233,42 @@ namespace sdr
// remember if we had a SfxItemSet already
const bool bHadSfxItemSet(HasSfxItemSet());
// call parent - this will then guarantee
// SfxItemSet existence
// call parent - this will guarantee SfxItemSet existence
DefaultProperties::GetObjectItemSet();
if(!bHadSfxItemSet)
{
// SfxItemSet was created and ForceDefaultAttributes() is done.
// We now need to set a default SfxStyleSheet at the SdrObject. This
// is possible now since we always have the SdrModel in SdrObject,
// so use applyDefaultStyleSheetFromSdrModel() which will do the
// right thing in each derivation of BaseProperties.
// We also need to 'rescue' mpStyleSheet if it is already set,
// which means a SfxStyleSheet was already set/ocopied but not
// yet set at the SdrObject. See copy-constructor and how it remembers
// the SfxStyleSheet there. This time, do not reset the
// attributes already set - this is done above.
SfxStyleSheet* pImplicitelyAlreadySet(mpStyleSheet);
// Set missing defaults and do RemoveHardAttributes. This is
// important, it deletes again the attributes set in
// ForceDefaultAttributes() which are set in the default
// SfxStyleSheet.
const_cast< AttributeProperties* >(this)->applyDefaultStyleSheetFromSdrModel();
if(pImplicitelyAlreadySet)
// need to take care for SfxStyleSheet for newly
// created SfxItemSet
if(nullptr == mpStyleSheet)
{
// Set missing defaults without removal of hard attributes.
// This is more complicated historically than I first thought:
// Originally for GetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj
// SetStyleSheet(..., false) was used, while for GetDefaultStyleSheet
// SetStyleSheet(..., true) was used. Thus, for SdrGrafObj and SdrOle2Obj
// bDontRemoveHardAttr == false -> *do* delete hard attributes was used.
// This was probably not done by purpose, adding the method
// GetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj additionally to
// GetDefaultStyleSheet was an enhancement to allow for SdrGrafObj/SdrOle2Obj
// with full AttributeSet (adding e.g. FillAttributes). To stay as compatible
// as possible these SdrObjects got a new default-StyleSheet.
// There is no reason to delete the HardAttributes and it anyways has only
// AFAIK effects on a single Item - the SdrTextHorzAdjustItem. To get things
// unified I will stay with not deleting the HardAttributes and adapt the
// UnitTests in CppunitTest_sd_import_tests accordingly.
const_cast< AttributeProperties* >(this)->applyDefaultStyleSheetFromSdrModel();
}
else
{
// Late-Init of setting parent to SfxStyleSheet after
// it's creation.
const_cast< AttributeProperties* >(this)->SetStyleSheet(pImplicitelyAlreadySet, true);
// it's creation. Can only happen from copy-constructor
// (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
}
}
// set item
if(!HasSfxItemSet())
{
GetObjectItemSet();
}
// guarantee SfxItemSet existence
GetObjectItemSet();
if(pResultItem)
{
......@@ -357,11 +361,8 @@ namespace sdr
void AttributeProperties::SetStyleSheet(SfxStyleSheet* pNewStyleSheet, bool bDontRemoveHardAttr)
{
// guarantee SfxItemSet existence here
if(!HasSfxItemSet())
{
GetObjectItemSet();
}
// guarantee SfxItemSet existence
GetObjectItemSet();
ImpRemoveStyleSheet();
ImpAddStyleSheet(pNewStyleSheet, bDontRemoveHardAttr);
......@@ -381,11 +382,8 @@ namespace sdr
if(!GetStyleSheet() || dynamic_cast<const SfxStyleSheet *>(mpStyleSheet) == nullptr)
return;
// force SfxItemSet existence
if(!HasSfxItemSet())
{
GetObjectItemSet();
}
// guarantee SfxItemSet existence
GetObjectItemSet();
// prepare copied, new itemset, but WITHOUT parent
SfxItemSet* pDestItemSet = new SfxItemSet(*mpItemSet);
......
......@@ -39,7 +39,8 @@ namespace sdr
if(pStyleSheet)
{
SetStyleSheet(pStyleSheet, false);
// do not delete hard attributes when setting dsefault Style
SetStyleSheet(pStyleSheet, true);
}
else
{
......
......@@ -34,7 +34,8 @@ namespace sdr
if(pStyleSheet)
{
SetStyleSheet(pStyleSheet, false);
// do not delete hard attributes when setting dsefault Style
SetStyleSheet(pStyleSheet, true);
}
else
{
......
......@@ -43,7 +43,8 @@ namespace sdr
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
......
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