summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/svx/framelink.hxx86
-rw-r--r--svx/source/dialog/framelink.cxx212
2 files changed, 82 insertions, 216 deletions
diff --git a/include/svx/framelink.hxx b/include/svx/framelink.hxx
index 1af8abc6599b..b98ea5eab9aa 100644
--- a/include/svx/framelink.hxx
+++ b/include/svx/framelink.hxx
@@ -35,7 +35,7 @@ namespace svx::frame {
/** Specifies how the reference points for frame borders are used.
*/
-enum class RefMode
+enum class RefMode : sal_uInt8
{
/** Frame borders are drawn centered to the reference points. */
Centered,
@@ -100,45 +100,17 @@ enum class RefMode
class SAL_WARN_UNUSED SVXCORE_DLLPUBLIC Style
{
private:
- class implStyle
- {
- private:
- friend class Style;
-
- Color maColorPrim;
- Color maColorSecn;
- Color maColorGap;
- bool mbUseGapColor;
- RefMode meRefMode; /// Reference point handling for this frame border.
- double mfPrim; /// Width of primary (single, left, or top) line.
- double mfDist; /// Distance between primary and secondary line.
- double mfSecn; /// Width of secondary (right or bottom) line.
- double mfPatternScale; /// Scale used for line pattern spacing.
- SvxBorderLineStyle mnType;
- bool mbWordTableCell;
-
- public:
- /** Constructs an invisible frame style. */
- explicit implStyle() :
- maColorPrim(),
- maColorSecn(),
- maColorGap(),
- mbUseGapColor(false),
- meRefMode(RefMode::Centered),
- mfPrim(0.0),
- mfDist(0.0),
- mfSecn(0.0),
- mfPatternScale(1.0),
- mnType(SvxBorderLineStyle::SOLID),
- mbWordTableCell(false)
- {}
- };
-
- /// the impl class holding the data
- std::shared_ptr< implStyle > maImplStyle;
-
- /// call to set maImplStyle on demand
- void implEnsureImplStyle();
+ Color maColorPrim;
+ Color maColorSecn;
+ Color maColorGap;
+ double mfPrim; /// Width of primary (single, left, or top) line.
+ double mfDist; /// Distance between primary and secondary line.
+ double mfSecn; /// Width of secondary (right or bottom) line.
+ double mfPatternScale; /// Scale used for line pattern spacing.
+ RefMode meRefMode; /// Reference point handling for this frame border.
+ SvxBorderLineStyle mnType;
+ bool mbWordTableCell : 1;
+ bool mbUseGapColor : 1;
public:
/** Constructs an invisible frame style. */
@@ -150,23 +122,23 @@ public:
/** Constructs a frame style from the passed SvxBorderLine struct. */
explicit Style( const editeng::SvxBorderLine* pBorder, double fScale );
- RefMode GetRefMode() const { if(!maImplStyle) return RefMode::Centered; return maImplStyle->meRefMode; }
- Color GetColorPrim() const { if(!maImplStyle) return Color(); return maImplStyle->maColorPrim; }
- Color GetColorSecn() const { if(!maImplStyle) return Color(); return maImplStyle->maColorSecn; }
- Color GetColorGap() const { if(!maImplStyle) return Color(); return maImplStyle->maColorGap; }
- bool UseGapColor() const { if(!maImplStyle) return false; return maImplStyle->mbUseGapColor; }
- double Prim() const { if(!maImplStyle) return 0.0; return maImplStyle->mfPrim; }
- double Dist() const { if(!maImplStyle) return 0.0; return maImplStyle->mfDist; }
- double Secn() const { if(!maImplStyle) return 0.0; return maImplStyle->mfSecn; }
- double PatternScale() const { if(!maImplStyle) return 1.0; return maImplStyle->mfPatternScale;}
- SvxBorderLineStyle Type() const { if(!maImplStyle) return SvxBorderLineStyle::SOLID; return maImplStyle->mnType; }
+ RefMode GetRefMode() const { return meRefMode; }
+ Color GetColorPrim() const { return maColorPrim; }
+ Color GetColorSecn() const { return maColorSecn; }
+ Color GetColorGap() const { return maColorGap; }
+ bool UseGapColor() const { return mbUseGapColor; }
+ double Prim() const { return mfPrim; }
+ double Dist() const { return mfDist; }
+ double Secn() const { return mfSecn; }
+ double PatternScale() const { return mfPatternScale;}
+ SvxBorderLineStyle Type() const { return mnType; }
/// Check if this style is used - this depends on it having any width definition.
/// As can be seen in the definition comment above, Prim() *must* be non zero to have a width
- bool IsUsed() const { if(!maImplStyle) return false; return 0.0 != maImplStyle->mfPrim; }
+ bool IsUsed() const { return 0.0 != mfPrim; }
/** Returns the total width of this frame style. */
- double GetWidth() const { if(!maImplStyle) return 0.0; implStyle* pTarget = maImplStyle.get(); return pTarget->mfPrim + pTarget->mfDist + pTarget->mfSecn; }
+ double GetWidth() const { return mfPrim + mfDist + mfSecn; }
/** Sets the frame style to invisible state. */
void Clear();
@@ -178,18 +150,18 @@ public:
void Set( const editeng::SvxBorderLine* pBorder, double fScale, sal_uInt16 nMaxWidth = SAL_MAX_UINT16 );
/** Sets a new reference point handling mode, does not modify other settings. */
- void SetRefMode( RefMode eRefMode );
+ void SetRefMode( RefMode eRefMode ) { meRefMode = eRefMode; }
/** Sets a new color, does not modify other settings. */
- void SetColorPrim( const Color& rColor );
- void SetColorSecn( const Color& rColor );
+ void SetColorPrim( const Color& rColor ) { maColorPrim = rColor; }
+ void SetColorSecn( const Color& rColor ) { maColorSecn = rColor; }
/** Sets whether to use dotted style for single hair lines. */
- void SetType( SvxBorderLineStyle nType );
+ void SetType( SvxBorderLineStyle nType ) { mnType = nType; }
/** Mirrors this style (exchanges primary and secondary), if it is a double frame style. */
Style& MirrorSelf();
/** Enables the Word-compatible Style comparison code. */
- void SetWordTableCell(bool bWordTableCell);
+ void SetWordTableCell(bool bWordTableCell) { mbWordTableCell = bWordTableCell; }
bool operator==( const Style& rOther) const;
bool operator<( const Style& rOther) const;
diff --git a/svx/source/dialog/framelink.cxx b/svx/source/dialog/framelink.cxx
index 62d60094b1e2..6400eb33d8b0 100644
--- a/svx/source/dialog/framelink.cxx
+++ b/svx/source/dialog/framelink.cxx
@@ -31,53 +31,50 @@ using namespace editeng;
namespace svx::frame
{
-// Classes
-void Style::implEnsureImplStyle()
-{
- if(!maImplStyle)
- {
- maImplStyle = std::make_shared<implStyle>();
- }
-}
-
-Style::Style() :
- maImplStyle()
+Style::Style()
{
+ Clear();
}
-Style::Style( double nP, double nD, double nS, SvxBorderLineStyle nType, double fScale ) :
- maImplStyle(std::make_shared<implStyle>())
+Style::Style( double nP, double nD, double nS, SvxBorderLineStyle nType, double fScale )
{
- maImplStyle->mnType = nType;
- maImplStyle->mfPatternScale = fScale;
+ Clear();
+ mnType = nType;
+ mfPatternScale = fScale;
Set( nP, nD, nS );
}
-Style::Style( const Color& rColorPrim, const Color& rColorSecn, const Color& rColorGap, bool bUseGapColor, double nP, double nD, double nS, SvxBorderLineStyle nType, double fScale ) :
- maImplStyle(std::make_shared<implStyle>())
+Style::Style( const Color& rColorPrim, const Color& rColorSecn, const Color& rColorGap, bool bUseGapColor, double nP, double nD, double nS, SvxBorderLineStyle nType, double fScale )
{
- maImplStyle->mnType = nType;
- maImplStyle->mfPatternScale = fScale;
+ Clear();
+ mnType = nType;
+ mfPatternScale = fScale;
Set( rColorPrim, rColorSecn, rColorGap, bUseGapColor, nP, nD, nS );
}
-Style::Style( const editeng::SvxBorderLine* pBorder, double fScale ) :
- maImplStyle()
+Style::Style( const editeng::SvxBorderLine* pBorder, double fScale )
{
+ Clear();
if(nullptr != pBorder)
{
- maImplStyle = std::make_shared<implStyle>();
- maImplStyle->mfPatternScale = fScale;
+ mfPatternScale = fScale;
Set( pBorder, fScale );
}
}
void Style::Clear()
{
- if(maImplStyle)
- {
- maImplStyle.reset();
- }
+ maColorPrim = Color();
+ maColorSecn = Color();
+ maColorGap = Color();
+ mbUseGapColor = false;
+ meRefMode = RefMode::Centered;
+ mfPrim = 0.0;
+ mfDist = 0.0;
+ mfSecn = 0.0;
+ mfPatternScale = 1.0;
+ mnType = SvxBorderLineStyle::SOLID;
+ mbWordTableCell = false;
}
void Style::Set( double nP, double nD, double nS )
@@ -89,21 +86,17 @@ void Style::Set( double nP, double nD, double nS )
>0 0 >0 nP 0 0
>0 >0 >0 nP nD nS
*/
- implEnsureImplStyle();
- implStyle* pTarget = maImplStyle.get();
- pTarget->mfPrim = rtl::math::round(nP ? nP : nS, 2);
- pTarget->mfDist = rtl::math::round((nP && nS) ? nD : 0, 2);
- pTarget->mfSecn = rtl::math::round((nP && nD) ? nS : 0, 2);
+ mfPrim = rtl::math::round(nP ? nP : nS, 2);
+ mfDist = rtl::math::round((nP && nS) ? nD : 0, 2);
+ mfSecn = rtl::math::round((nP && nD) ? nS : 0, 2);
}
void Style::Set( const Color& rColorPrim, const Color& rColorSecn, const Color& rColorGap, bool bUseGapColor, double nP, double nD, double nS )
{
- implEnsureImplStyle();
- implStyle* pTarget = maImplStyle.get();
- pTarget->maColorPrim = rColorPrim;
- pTarget->maColorSecn = rColorSecn;
- pTarget->maColorGap = rColorGap;
- pTarget->mbUseGapColor = bUseGapColor;
+ maColorPrim = rColorPrim;
+ maColorSecn = rColorSecn;
+ maColorGap = rColorGap;
+ mbUseGapColor = bUseGapColor;
Set( nP, nD, nS );
}
@@ -115,19 +108,17 @@ void Style::Set( const SvxBorderLine* pBorder, double fScale, sal_uInt16 nMaxWid
return;
}
- implEnsureImplStyle();
- implStyle* pTarget = maImplStyle.get();
- pTarget->maColorPrim = pBorder->GetColorOut();
- pTarget->maColorSecn = pBorder->GetColorIn();
- pTarget->maColorGap = pBorder->GetColorGap();
- pTarget->mbUseGapColor = pBorder->HasGapColor();
+ maColorPrim = pBorder->GetColorOut();
+ maColorSecn = pBorder->GetColorIn();
+ maColorGap = pBorder->GetColorGap();
+ mbUseGapColor = pBorder->HasGapColor();
const sal_uInt16 nPrim(pBorder->GetOutWidth());
const sal_uInt16 nDist(pBorder->GetDistance());
const sal_uInt16 nSecn(pBorder->GetInWidth());
- pTarget->mnType = pBorder->GetBorderLineStyle();
- pTarget->mfPatternScale = fScale;
+ mnType = pBorder->GetBorderLineStyle();
+ mfPatternScale = fScale;
if( !nSecn ) // no or single frame border
{
@@ -141,148 +132,57 @@ void Style::Set( const SvxBorderLine* pBorder, double fScale, sal_uInt16 nMaxWid
if( nPixWidth > GetWidth() )
{
- pTarget->mfDist = nPixWidth - pTarget->mfPrim - pTarget->mfSecn;
+ mfDist = nPixWidth - mfPrim - mfSecn;
}
// Shrink the style if it is too thick for the control.
while( GetWidth() > nMaxWidth )
{
// First decrease space between lines.
- if (pTarget->mfDist)
+ if (mfDist)
{
- --(pTarget->mfDist);
+ --mfDist;
continue;
}
// Still too thick? Decrease the line widths.
- if (pTarget->mfPrim != 0.0 && rtl::math::approxEqual(pTarget->mfPrim, pTarget->mfSecn))
+ if (mfPrim != 0.0 && rtl::math::approxEqual(mfPrim, mfSecn))
{
// Both lines equal - decrease both to keep symmetry.
- --(pTarget->mfPrim);
- --(pTarget->mfSecn);
+ --mfPrim;
+ --mfSecn;
continue;
}
// Decrease each line for itself
- if (pTarget->mfPrim)
- {
- --(pTarget->mfPrim);
- }
-
- if ((GetWidth() > nMaxWidth) && pTarget->mfSecn != 0.0)
- {
- --(pTarget->mfSecn);
- }
- }
- }
-}
-
-void Style::SetRefMode( RefMode eRefMode )
-{
- if(!maImplStyle)
- {
- if(RefMode::Centered == eRefMode)
- {
- return;
- }
-
- implEnsureImplStyle();
- }
-
- maImplStyle->meRefMode = eRefMode;
-}
-
-void Style::SetColorPrim( const Color& rColor )
-{
- if(!maImplStyle)
- {
- if(Color() == rColor)
- {
- return;
- }
-
- implEnsureImplStyle();
- }
-
- maImplStyle->maColorPrim = rColor;
-}
+ if (mfPrim)
+ --mfPrim;
-void Style::SetColorSecn( const Color& rColor )
-{
- if(!maImplStyle)
- {
- if(Color() == rColor)
- {
- return;
+ if ((GetWidth() > nMaxWidth) && mfSecn != 0.0)
+ --mfSecn;
}
-
- implEnsureImplStyle();
}
-
- maImplStyle->maColorSecn = rColor;
-}
-
-void Style::SetType( SvxBorderLineStyle nType )
-{
- if(!maImplStyle)
- {
- if(SvxBorderLineStyle::SOLID == nType)
- {
- return;
- }
-
- implEnsureImplStyle();
- }
-
- maImplStyle->mnType = nType;
}
Style& Style::MirrorSelf()
{
- if(!maImplStyle)
+ if (mfSecn)
{
- return *this;
- }
-
- implStyle* pTarget = maImplStyle.get();
-
- if (pTarget->mfSecn)
- {
- std::swap( pTarget->mfPrim, pTarget->mfSecn );
+ std::swap( mfPrim, mfSecn );
// also need to swap colors
- std::swap( pTarget->maColorPrim, pTarget->maColorSecn );
+ std::swap( maColorPrim, maColorSecn );
}
- if( pTarget->meRefMode != RefMode::Centered )
+ if( meRefMode != RefMode::Centered )
{
- pTarget->meRefMode = (pTarget->meRefMode == RefMode::Begin) ? RefMode::End : RefMode::Begin;
+ meRefMode = (meRefMode == RefMode::Begin) ? RefMode::End : RefMode::Begin;
}
return *this;
}
-void Style::SetWordTableCell(bool bWordTableCell)
-{
- if (!maImplStyle)
- {
- implEnsureImplStyle();
- }
-
- maImplStyle->mbWordTableCell = bWordTableCell;
-}
-
bool Style::operator==( const Style& rOther) const
{
- if(!maImplStyle && !rOther.maImplStyle)
- {
- return true;
- }
-
- if(maImplStyle && rOther.maImplStyle && maImplStyle.get() == rOther.maImplStyle.get())
- {
- return true;
- }
-
return (Prim() == rOther.Prim()
&& Dist() == rOther.Dist()
&& Secn() == rOther.Secn()
@@ -391,13 +291,7 @@ double GetWordTableCellBorderWeight(const Style& rStyle)
bool Style::operator<( const Style& rOther) const
{
- if(!maImplStyle && !rOther.maImplStyle)
- {
- // are equal
- return false;
- }
-
- if (maImplStyle && maImplStyle->mbWordTableCell)
+ if (mbWordTableCell)
{
// The below code would first compare based on the border width, Word compares based on its
// calculated weight, do that in the compat case.