summaryrefslogtreecommitdiff
path: root/cui/source/tabpages/borderconn.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'cui/source/tabpages/borderconn.cxx')
-rw-r--r--cui/source/tabpages/borderconn.cxx304
1 files changed, 304 insertions, 0 deletions
diff --git a/cui/source/tabpages/borderconn.cxx b/cui/source/tabpages/borderconn.cxx
new file mode 100644
index 000000000000..b46f24d5cbfd
--- /dev/null
+++ b/cui/source/tabpages/borderconn.cxx
@@ -0,0 +1,304 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_cui.hxx"
+
+#include "borderconn.hxx"
+#include <svx/frmsel.hxx>
+#include "editeng/bolnitem.hxx"
+#include <editeng/boxitem.hxx>
+#include <svx/algitem.hxx>
+#include <editeng/shaditem.hxx>
+
+namespace svx {
+
+/* ============================================================================
+SvxLineItem connection
+----------------------
+Connects an SvxLineItem (that contains the style of one line of a cell border)
+with one frame border from a svx::FrameSelector control. If this connection is
+used, no additional code is needed in the Reset() and FillItemSet() functions
+of the tab page.
+============================================================================ */
+
+// 1st: item wrappers ---------------------------------------------------------
+
+class LineItemWrapper : public sfx::SingleItemWrapper< SvxLineItem, const SvxBorderLine* >
+{
+public:
+ inline explicit LineItemWrapper( sal_uInt16 nSlot ) : SingleItemWrapperType( nSlot ) {}
+
+ virtual const SvxBorderLine* GetItemValue( const SvxLineItem& rItem ) const
+ { return rItem.GetLine(); }
+ virtual void SetItemValue( SvxLineItem& rItem, const SvxBorderLine* pLine ) const
+ { rItem.SetLine( pLine ); }
+};
+
+// 2nd: control wrappers ------------------------------------------------------
+
+class FrameSelectorWrapper : public sfx::SingleControlWrapper< FrameSelector, const SvxBorderLine* >
+{
+public:
+ inline explicit FrameSelectorWrapper( FrameSelector& rFrameSel, FrameBorderType eBorder ) :
+ SingleControlWrapperType( rFrameSel ), meBorder( eBorder ) {}
+
+ virtual bool IsControlDontKnow() const;
+ virtual void SetControlDontKnow( bool bSet );
+
+ virtual const SvxBorderLine* GetControlValue() const;
+ virtual void SetControlValue( const SvxBorderLine* pLine );
+
+private:
+ FrameBorderType meBorder; /// The line this wrapper works with.
+};
+
+bool FrameSelectorWrapper::IsControlDontKnow() const
+{
+ return GetControl().GetFrameBorderState( meBorder ) == FRAMESTATE_DONTCARE;
+}
+
+void FrameSelectorWrapper::SetControlDontKnow( bool bSet )
+{
+ if( bSet )
+ GetControl().SetBorderDontCare( meBorder );
+}
+
+const SvxBorderLine* FrameSelectorWrapper::GetControlValue() const
+{
+ return GetControl().GetFrameBorderStyle( meBorder );
+}
+
+void FrameSelectorWrapper::SetControlValue( const SvxBorderLine* pLine )
+{
+ GetControl().ShowBorder( meBorder, pLine );
+}
+
+// 3rd: connection ------------------------------------------------------------
+
+typedef sfx::ItemControlConnection< LineItemWrapper, FrameSelectorWrapper > FrameLineConnection;
+
+/* ============================================================================
+SvxMarginItem connection
+------------------------
+Connects an SvxMarginItem (that contains the inner margin of all cell borders)
+with the numerical edit controls of the SvxBorderTabPage. If this connection is
+used, no additional code is needed in the Reset() and FillItemSet() functions
+of the tab page.
+============================================================================ */
+
+// 1st: item wrappers ---------------------------------------------------------
+
+typedef sfx::IdentItemWrapper< SvxMarginItem > MarginItemWrapper;
+
+// 2nd: control wrappers ------------------------------------------------------
+
+class MarginControlsWrapper : public sfx::MultiControlWrapper< SvxMarginItem >
+{
+public:
+ explicit MarginControlsWrapper(
+ MetricField& rMfLeft, MetricField& rMfRight,
+ MetricField& rMfTop, MetricField& rMfBottom );
+
+ virtual SvxMarginItem GetControlValue() const;
+ virtual void SetControlValue( SvxMarginItem aItem );
+
+private:
+ sfx::Int16MetricFieldWrapper maLeftWrp;
+ sfx::Int16MetricFieldWrapper maRightWrp;
+ sfx::Int16MetricFieldWrapper maTopWrp;
+ sfx::Int16MetricFieldWrapper maBottomWrp;
+};
+
+MarginControlsWrapper::MarginControlsWrapper(
+ MetricField& rMfLeft, MetricField& rMfRight, MetricField& rMfTop, MetricField& rMfBottom ) :
+ maLeftWrp( rMfLeft, FUNIT_TWIP ),
+ maRightWrp( rMfRight, FUNIT_TWIP ),
+ maTopWrp( rMfTop, FUNIT_TWIP ),
+ maBottomWrp( rMfBottom, FUNIT_TWIP )
+{
+ RegisterControlWrapper( maLeftWrp );
+ RegisterControlWrapper( maRightWrp );
+ RegisterControlWrapper( maTopWrp );
+ RegisterControlWrapper( maBottomWrp );
+}
+
+SvxMarginItem MarginControlsWrapper::GetControlValue() const
+{
+ SvxMarginItem aItem( GetDefaultValue() );
+ if( !maLeftWrp.IsControlDontKnow() )
+ aItem.SetLeftMargin( maLeftWrp.GetControlValue() );
+ if( !maRightWrp.IsControlDontKnow() )
+ aItem.SetRightMargin( maRightWrp.GetControlValue() );
+ if( !maTopWrp.IsControlDontKnow() )
+ aItem.SetTopMargin( maTopWrp.GetControlValue() );
+ if( !maBottomWrp.IsControlDontKnow() )
+ aItem.SetBottomMargin( maBottomWrp.GetControlValue() );
+ return aItem;
+}
+
+void MarginControlsWrapper::SetControlValue( SvxMarginItem aItem )
+{
+ maLeftWrp.SetControlValue( aItem.GetLeftMargin() );
+ maRightWrp.SetControlValue( aItem.GetRightMargin() );
+ maTopWrp.SetControlValue( aItem.GetTopMargin() );
+ maBottomWrp.SetControlValue( aItem.GetBottomMargin() );
+}
+
+// 3rd: connection ------------------------------------------------------------
+
+class MarginConnection : public sfx::ItemControlConnection< MarginItemWrapper, MarginControlsWrapper >
+{
+public:
+ explicit MarginConnection( const SfxItemSet& rItemSet,
+ MetricField& rMfLeft, MetricField& rMfRight,
+ MetricField& rMfTop, MetricField& rMfBottom,
+ sfx::ItemConnFlags nFlags = sfx::ITEMCONN_DEFAULT );
+};
+
+MarginConnection::MarginConnection( const SfxItemSet& rItemSet,
+ MetricField& rMfLeft, MetricField& rMfRight, MetricField& rMfTop, MetricField& rMfBottom,
+ sfx::ItemConnFlags nFlags ) :
+ ItemControlConnectionType( SID_ATTR_ALIGN_MARGIN, new MarginControlsWrapper( rMfLeft, rMfRight, rMfTop, rMfBottom ), nFlags )
+{
+ mxCtrlWrp->SetDefaultValue( maItemWrp.GetDefaultItem( rItemSet ) );
+}
+
+/* ============================================================================
+SvxShadowItem connection
+------------------------
+Connects an SvxShadowItem (that contains shadow position, size, and color) with
+the controls of the SvxBorderTabPage. If this connection is used, no additional
+code is needed in the Reset() and FillItemSet() functions of the tab page.
+============================================================================ */
+
+// 1st: item wrappers ---------------------------------------------------------
+
+typedef sfx::IdentItemWrapper< SvxShadowItem > ShadowItemWrapper;
+
+// 2nd: control wrappers ------------------------------------------------------
+
+typedef sfx::ValueSetWrapper< SvxShadowLocation > ShadowPosWrapper;
+static const ShadowPosWrapper::MapEntryType s_pShadowPosMap[] =
+{
+ { 1, SVX_SHADOW_NONE },
+ { 2, SVX_SHADOW_BOTTOMRIGHT },
+ { 3, SVX_SHADOW_TOPRIGHT },
+ { 4, SVX_SHADOW_BOTTOMLEFT },
+ { 5, SVX_SHADOW_TOPLEFT },
+ { VALUESET_ITEM_NOTFOUND, SVX_SHADOW_NONE }
+};
+
+class ShadowControlsWrapper : public sfx::MultiControlWrapper< SvxShadowItem >
+{
+public:
+ explicit ShadowControlsWrapper( ValueSet& rVsPos, MetricField& rMfSize, ColorListBox& rLbColor );
+
+ virtual SvxShadowItem GetControlValue() const;
+ virtual void SetControlValue( SvxShadowItem aItem );
+
+private:
+ ShadowPosWrapper maPosWrp;
+ sfx::UShortMetricFieldWrapper maSizeWrp;
+ sfx::ColorListBoxWrapper maColorWrp;
+};
+
+ShadowControlsWrapper::ShadowControlsWrapper(
+ ValueSet& rVsPos, MetricField& rMfSize, ColorListBox& rLbColor ) :
+ maPosWrp( rVsPos, s_pShadowPosMap ),
+ maSizeWrp( rMfSize, FUNIT_TWIP ),
+ maColorWrp( rLbColor )
+{
+ RegisterControlWrapper( maPosWrp );
+ RegisterControlWrapper( maSizeWrp );
+ RegisterControlWrapper( maColorWrp );
+}
+
+SvxShadowItem ShadowControlsWrapper::GetControlValue() const
+{
+ SvxShadowItem aItem( GetDefaultValue() );
+ if( !maPosWrp.IsControlDontKnow() )
+ aItem.SetLocation( maPosWrp.GetControlValue() );
+ if( !maSizeWrp.IsControlDontKnow() )
+ aItem.SetWidth( maSizeWrp.GetControlValue() );
+ if( !maColorWrp.IsControlDontKnow() )
+ aItem.SetColor( maColorWrp.GetControlValue() );
+ return aItem;
+}
+
+void ShadowControlsWrapper::SetControlValue( SvxShadowItem aItem )
+{
+ maPosWrp.SetControlValue( aItem.GetLocation() );
+ maSizeWrp.SetControlValue( aItem.GetWidth() );
+ maColorWrp.SetControlValue( aItem.GetColor() );
+}
+
+// 3rd: connection ------------------------------------------------------------
+
+class ShadowConnection : public sfx::ItemControlConnection< ShadowItemWrapper, ShadowControlsWrapper >
+{
+public:
+ explicit ShadowConnection( const SfxItemSet& rItemSet,
+ ValueSet& rVsPos, MetricField& rMfSize, ColorListBox& rLbColor,
+ sfx::ItemConnFlags nFlags = sfx::ITEMCONN_DEFAULT );
+};
+
+ShadowConnection::ShadowConnection( const SfxItemSet& rItemSet,
+ ValueSet& rVsPos, MetricField& rMfSize, ColorListBox& rLbColor, sfx::ItemConnFlags nFlags ) :
+ ItemControlConnectionType( SID_ATTR_BORDER_SHADOW, new ShadowControlsWrapper( rVsPos, rMfSize, rLbColor ), nFlags )
+{
+ mxCtrlWrp->SetDefaultValue( maItemWrp.GetDefaultItem( rItemSet ) );
+}
+
+// ============================================================================
+// ============================================================================
+
+sfx::ItemConnectionBase* CreateFrameLineConnection( sal_uInt16 nSlot,
+ FrameSelector& rFrameSel, FrameBorderType eBorder, sfx::ItemConnFlags nFlags )
+{
+ return new FrameLineConnection( nSlot, new FrameSelectorWrapper( rFrameSel, eBorder ), nFlags );
+}
+
+sfx::ItemConnectionBase* CreateMarginConnection( const SfxItemSet& rItemSet,
+ MetricField& rMfLeft, MetricField& rMfRight,
+ MetricField& rMfTop, MetricField& rMfBottom,
+ sfx::ItemConnFlags nFlags )
+{
+ return new MarginConnection( rItemSet, rMfLeft, rMfRight, rMfTop, rMfBottom, nFlags );
+}
+
+sfx::ItemConnectionBase* CreateShadowConnection( const SfxItemSet& rItemSet,
+ ValueSet& rVsPos, MetricField& rMfSize, ColorListBox& rLbColor,
+ sfx::ItemConnFlags nFlags )
+{
+ return new ShadowConnection( rItemSet, rVsPos, rMfSize, rLbColor, nFlags );
+}
+
+// ============================================================================
+
+} // namespace svx
+