1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_cui.hxx"
26
27 #include "borderconn.hxx"
28 #include <svx/frmsel.hxx>
29 #include "editeng/bolnitem.hxx"
30 #include <editeng/boxitem.hxx>
31 #include <svx/algitem.hxx>
32 #include <editeng/shaditem.hxx>
33
34 namespace svx {
35
36 /* ============================================================================
37 SvxLineItem connection
38 ----------------------
39 Connects an SvxLineItem (that contains the style of one line of a cell border)
40 with one frame border from a svx::FrameSelector control. If this connection is
41 used, no additional code is needed in the Reset() and FillItemSet() functions
42 of the tab page.
43 ============================================================================ */
44
45 // 1st: item wrappers ---------------------------------------------------------
46
47 class LineItemWrapper : public sfx::SingleItemWrapper< SvxLineItem, const SvxBorderLine* >
48 {
49 public:
LineItemWrapper(sal_uInt16 nSlot)50 inline explicit LineItemWrapper( sal_uInt16 nSlot ) : SingleItemWrapperType( nSlot ) {}
51
GetItemValue(const SvxLineItem & rItem) const52 virtual const SvxBorderLine* GetItemValue( const SvxLineItem& rItem ) const
53 { return rItem.GetLine(); }
SetItemValue(SvxLineItem & rItem,const SvxBorderLine * pLine) const54 virtual void SetItemValue( SvxLineItem& rItem, const SvxBorderLine* pLine ) const
55 { rItem.SetLine( pLine ); }
56 };
57
58 // 2nd: control wrappers ------------------------------------------------------
59
60 class FrameSelectorWrapper : public sfx::SingleControlWrapper< FrameSelector, const SvxBorderLine* >
61 {
62 public:
FrameSelectorWrapper(FrameSelector & rFrameSel,FrameBorderType eBorder)63 inline explicit FrameSelectorWrapper( FrameSelector& rFrameSel, FrameBorderType eBorder ) :
64 SingleControlWrapperType( rFrameSel ), meBorder( eBorder ) {}
65
66 virtual bool IsControlDontKnow() const;
67 virtual void SetControlDontKnow( bool bSet );
68
69 virtual const SvxBorderLine* GetControlValue() const;
70 virtual void SetControlValue( const SvxBorderLine* pLine );
71
72 private:
73 FrameBorderType meBorder; /// The line this wrapper works with.
74 };
75
IsControlDontKnow() const76 bool FrameSelectorWrapper::IsControlDontKnow() const
77 {
78 return GetControl().GetFrameBorderState( meBorder ) == FRAMESTATE_DONTCARE;
79 }
80
SetControlDontKnow(bool bSet)81 void FrameSelectorWrapper::SetControlDontKnow( bool bSet )
82 {
83 if( bSet )
84 GetControl().SetBorderDontCare( meBorder );
85 }
86
GetControlValue() const87 const SvxBorderLine* FrameSelectorWrapper::GetControlValue() const
88 {
89 return GetControl().GetFrameBorderStyle( meBorder );
90 }
91
SetControlValue(const SvxBorderLine * pLine)92 void FrameSelectorWrapper::SetControlValue( const SvxBorderLine* pLine )
93 {
94 GetControl().ShowBorder( meBorder, pLine );
95 }
96
97 // 3rd: connection ------------------------------------------------------------
98
99 typedef sfx::ItemControlConnection< LineItemWrapper, FrameSelectorWrapper > FrameLineConnection;
100
101 /* ============================================================================
102 SvxMarginItem connection
103 ------------------------
104 Connects an SvxMarginItem (that contains the inner margin of all cell borders)
105 with the numerical edit controls of the SvxBorderTabPage. If this connection is
106 used, no additional code is needed in the Reset() and FillItemSet() functions
107 of the tab page.
108 ============================================================================ */
109
110 // 1st: item wrappers ---------------------------------------------------------
111
112 typedef sfx::IdentItemWrapper< SvxMarginItem > MarginItemWrapper;
113
114 // 2nd: control wrappers ------------------------------------------------------
115
116 class MarginControlsWrapper : public sfx::MultiControlWrapper< SvxMarginItem >
117 {
118 public:
119 explicit MarginControlsWrapper(
120 MetricField& rMfLeft, MetricField& rMfRight,
121 MetricField& rMfTop, MetricField& rMfBottom );
122
123 virtual SvxMarginItem GetControlValue() const;
124 virtual void SetControlValue( SvxMarginItem aItem );
125
126 private:
127 sfx::Int16MetricFieldWrapper maLeftWrp;
128 sfx::Int16MetricFieldWrapper maRightWrp;
129 sfx::Int16MetricFieldWrapper maTopWrp;
130 sfx::Int16MetricFieldWrapper maBottomWrp;
131 };
132
MarginControlsWrapper(MetricField & rMfLeft,MetricField & rMfRight,MetricField & rMfTop,MetricField & rMfBottom)133 MarginControlsWrapper::MarginControlsWrapper(
134 MetricField& rMfLeft, MetricField& rMfRight, MetricField& rMfTop, MetricField& rMfBottom ) :
135 maLeftWrp( rMfLeft, FUNIT_TWIP ),
136 maRightWrp( rMfRight, FUNIT_TWIP ),
137 maTopWrp( rMfTop, FUNIT_TWIP ),
138 maBottomWrp( rMfBottom, FUNIT_TWIP )
139 {
140 RegisterControlWrapper( maLeftWrp );
141 RegisterControlWrapper( maRightWrp );
142 RegisterControlWrapper( maTopWrp );
143 RegisterControlWrapper( maBottomWrp );
144 }
145
GetControlValue() const146 SvxMarginItem MarginControlsWrapper::GetControlValue() const
147 {
148 SvxMarginItem aItem( GetDefaultValue() );
149 if( !maLeftWrp.IsControlDontKnow() )
150 aItem.SetLeftMargin( maLeftWrp.GetControlValue() );
151 if( !maRightWrp.IsControlDontKnow() )
152 aItem.SetRightMargin( maRightWrp.GetControlValue() );
153 if( !maTopWrp.IsControlDontKnow() )
154 aItem.SetTopMargin( maTopWrp.GetControlValue() );
155 if( !maBottomWrp.IsControlDontKnow() )
156 aItem.SetBottomMargin( maBottomWrp.GetControlValue() );
157 return aItem;
158 }
159
SetControlValue(SvxMarginItem aItem)160 void MarginControlsWrapper::SetControlValue( SvxMarginItem aItem )
161 {
162 maLeftWrp.SetControlValue( aItem.GetLeftMargin() );
163 maRightWrp.SetControlValue( aItem.GetRightMargin() );
164 maTopWrp.SetControlValue( aItem.GetTopMargin() );
165 maBottomWrp.SetControlValue( aItem.GetBottomMargin() );
166 }
167
168 // 3rd: connection ------------------------------------------------------------
169
170 class MarginConnection : public sfx::ItemControlConnection< MarginItemWrapper, MarginControlsWrapper >
171 {
172 public:
173 explicit MarginConnection( const SfxItemSet& rItemSet,
174 MetricField& rMfLeft, MetricField& rMfRight,
175 MetricField& rMfTop, MetricField& rMfBottom,
176 sfx::ItemConnFlags nFlags = sfx::ITEMCONN_DEFAULT );
177 };
178
MarginConnection(const SfxItemSet & rItemSet,MetricField & rMfLeft,MetricField & rMfRight,MetricField & rMfTop,MetricField & rMfBottom,sfx::ItemConnFlags nFlags)179 MarginConnection::MarginConnection( const SfxItemSet& rItemSet,
180 MetricField& rMfLeft, MetricField& rMfRight, MetricField& rMfTop, MetricField& rMfBottom,
181 sfx::ItemConnFlags nFlags ) :
182 ItemControlConnectionType( SID_ATTR_ALIGN_MARGIN, new MarginControlsWrapper( rMfLeft, rMfRight, rMfTop, rMfBottom ), nFlags )
183 {
184 mxCtrlWrp->SetDefaultValue( maItemWrp.GetDefaultItem( rItemSet ) );
185 }
186
187 /* ============================================================================
188 SvxShadowItem connection
189 ------------------------
190 Connects an SvxShadowItem (that contains shadow position, size, and color) with
191 the controls of the SvxBorderTabPage. If this connection is used, no additional
192 code is needed in the Reset() and FillItemSet() functions of the tab page.
193 ============================================================================ */
194
195 // 1st: item wrappers ---------------------------------------------------------
196
197 typedef sfx::IdentItemWrapper< SvxShadowItem > ShadowItemWrapper;
198
199 // 2nd: control wrappers ------------------------------------------------------
200
201 typedef sfx::ValueSetWrapper< SvxShadowLocation > ShadowPosWrapper;
202 static const ShadowPosWrapper::MapEntryType s_pShadowPosMap[] =
203 {
204 { 1, SVX_SHADOW_NONE },
205 { 2, SVX_SHADOW_BOTTOMRIGHT },
206 { 3, SVX_SHADOW_TOPRIGHT },
207 { 4, SVX_SHADOW_BOTTOMLEFT },
208 { 5, SVX_SHADOW_TOPLEFT },
209 { VALUESET_ITEM_NOTFOUND, SVX_SHADOW_NONE }
210 };
211
212 class ShadowControlsWrapper : public sfx::MultiControlWrapper< SvxShadowItem >
213 {
214 public:
215 explicit ShadowControlsWrapper( ValueSet& rVsPos, MetricField& rMfSize, ColorListBox& rLbColor );
216
217 virtual SvxShadowItem GetControlValue() const;
218 virtual void SetControlValue( SvxShadowItem aItem );
219
220 private:
221 ShadowPosWrapper maPosWrp;
222 sfx::UShortMetricFieldWrapper maSizeWrp;
223 sfx::ColorListBoxWrapper maColorWrp;
224 };
225
ShadowControlsWrapper(ValueSet & rVsPos,MetricField & rMfSize,ColorListBox & rLbColor)226 ShadowControlsWrapper::ShadowControlsWrapper(
227 ValueSet& rVsPos, MetricField& rMfSize, ColorListBox& rLbColor ) :
228 maPosWrp( rVsPos, s_pShadowPosMap ),
229 maSizeWrp( rMfSize, FUNIT_TWIP ),
230 maColorWrp( rLbColor )
231 {
232 RegisterControlWrapper( maPosWrp );
233 RegisterControlWrapper( maSizeWrp );
234 RegisterControlWrapper( maColorWrp );
235 }
236
GetControlValue() const237 SvxShadowItem ShadowControlsWrapper::GetControlValue() const
238 {
239 SvxShadowItem aItem( GetDefaultValue() );
240 if( !maPosWrp.IsControlDontKnow() )
241 aItem.SetLocation( maPosWrp.GetControlValue() );
242 if( !maSizeWrp.IsControlDontKnow() )
243 aItem.SetWidth( maSizeWrp.GetControlValue() );
244 if( !maColorWrp.IsControlDontKnow() )
245 aItem.SetColor( maColorWrp.GetControlValue() );
246 return aItem;
247 }
248
SetControlValue(SvxShadowItem aItem)249 void ShadowControlsWrapper::SetControlValue( SvxShadowItem aItem )
250 {
251 maPosWrp.SetControlValue( aItem.GetLocation() );
252 maSizeWrp.SetControlValue( aItem.GetWidth() );
253 maColorWrp.SetControlValue( aItem.GetColor() );
254 }
255
256 // 3rd: connection ------------------------------------------------------------
257
258 class ShadowConnection : public sfx::ItemControlConnection< ShadowItemWrapper, ShadowControlsWrapper >
259 {
260 public:
261 explicit ShadowConnection( const SfxItemSet& rItemSet,
262 ValueSet& rVsPos, MetricField& rMfSize, ColorListBox& rLbColor,
263 sfx::ItemConnFlags nFlags = sfx::ITEMCONN_DEFAULT );
264 };
265
ShadowConnection(const SfxItemSet & rItemSet,ValueSet & rVsPos,MetricField & rMfSize,ColorListBox & rLbColor,sfx::ItemConnFlags nFlags)266 ShadowConnection::ShadowConnection( const SfxItemSet& rItemSet,
267 ValueSet& rVsPos, MetricField& rMfSize, ColorListBox& rLbColor, sfx::ItemConnFlags nFlags ) :
268 ItemControlConnectionType( SID_ATTR_BORDER_SHADOW, new ShadowControlsWrapper( rVsPos, rMfSize, rLbColor ), nFlags )
269 {
270 mxCtrlWrp->SetDefaultValue( maItemWrp.GetDefaultItem( rItemSet ) );
271 }
272
273 // ============================================================================
274 // ============================================================================
275
CreateFrameLineConnection(sal_uInt16 nSlot,FrameSelector & rFrameSel,FrameBorderType eBorder,sfx::ItemConnFlags nFlags)276 sfx::ItemConnectionBase* CreateFrameLineConnection( sal_uInt16 nSlot,
277 FrameSelector& rFrameSel, FrameBorderType eBorder, sfx::ItemConnFlags nFlags )
278 {
279 return new FrameLineConnection( nSlot, new FrameSelectorWrapper( rFrameSel, eBorder ), nFlags );
280 }
281
CreateMarginConnection(const SfxItemSet & rItemSet,MetricField & rMfLeft,MetricField & rMfRight,MetricField & rMfTop,MetricField & rMfBottom,sfx::ItemConnFlags nFlags)282 sfx::ItemConnectionBase* CreateMarginConnection( const SfxItemSet& rItemSet,
283 MetricField& rMfLeft, MetricField& rMfRight,
284 MetricField& rMfTop, MetricField& rMfBottom,
285 sfx::ItemConnFlags nFlags )
286 {
287 return new MarginConnection( rItemSet, rMfLeft, rMfRight, rMfTop, rMfBottom, nFlags );
288 }
289
CreateShadowConnection(const SfxItemSet & rItemSet,ValueSet & rVsPos,MetricField & rMfSize,ColorListBox & rLbColor,sfx::ItemConnFlags nFlags)290 sfx::ItemConnectionBase* CreateShadowConnection( const SfxItemSet& rItemSet,
291 ValueSet& rVsPos, MetricField& rMfSize, ColorListBox& rLbColor,
292 sfx::ItemConnFlags nFlags )
293 {
294 return new ShadowConnection( rItemSet, rVsPos, rMfSize, rLbColor, nFlags );
295 }
296
297 // ============================================================================
298
299 } // namespace svx
300
301