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 ---------------------------------------------------------------
28 #include <sfx2/app.hxx>
29 #include <sfx2/objsh.hxx>
30 #include <sfx2/module.hxx>
31 #include <svx/dialogs.hrc>
32 #include <svx/dialmgr.hxx>
33 #define _SVX_BORDER_CXX
34
35 #include <cuires.hrc>
36 #include "border.hrc"
37 #include "helpid.hrc"
38
39 #define LINESTYLE_HTML_MAX 5
40
41 #include <svx/xtable.hxx> // XColorList
42 #include <svx/drawitem.hxx>
43 #include <editeng/boxitem.hxx>
44 #include <editeng/shaditem.hxx>
45 #include "border.hxx"
46 #include <svx/dlgutil.hxx>
47 #include <dialmgr.hxx>
48 #include "svx/htmlmode.hxx"
49 #include <vcl/msgbox.hxx>
50 #include "svx/flagsdef.hxx" //CHINA001
51 #include <sfx2/request.hxx>
52 #include <svl/intitem.hxx> //CHINA001
53 #include <sfx2/itemconnect.hxx>
54 #include "borderconn.hxx"
55
56 // -----------------------------------------------------------------------
57
58 /*
59 * [Beschreibung:]
60 * TabPage zum Einstellen der Rahmen-Attribute.
61 * Benoetigt
62 * ein SvxShadowItem: Schatten
63 * ein SvxBoxItem: Linien links,rechts,oben,unten ),
64 * ein SvxBoxInfo: Linien vertikal,horizontal, Abstaende, Flags )
65 *
66 * Linien koennen drei Zustaende haben.
67 * 1. Show ( -> gueltige Werte )
68 * 2. Hide ( -> NULL-Pointer )
69 * 3. DontCare ( -> gesonderte Valid-Flags im InfoItem )
70 */
71
72 // static ----------------------------------------------------------------
73
74 static sal_uInt16 pRanges[] =
75 {
76 SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_SHADOW,
77 SID_ATTR_ALIGN_MARGIN, SID_ATTR_ALIGN_MARGIN,
78 SID_ATTR_BORDER_CONNECT, SID_ATTR_BORDER_CONNECT,
79 SID_SW_COLLAPSING_BORDERS, SID_SW_COLLAPSING_BORDERS,
80 SID_ATTR_BORDER_DIAG_TLBR, SID_ATTR_BORDER_DIAG_BLTR,
81 0
82 };
83
84 sal_Bool SvxBorderTabPage::bSync = sal_True;
85
86
87 //------------------------------------------------------------------------
88
89 #define LINE_WIDTH0 (DEF_LINE_WIDTH_0 *100)
90 #define LINE_WIDTH1 (DEF_LINE_WIDTH_1 *100)
91 #define LINE_WIDTH2 (DEF_LINE_WIDTH_2 *100)
92 #define LINE_WIDTH3 (DEF_LINE_WIDTH_3 *100)
93 #define LINE_WIDTH4 (DEF_LINE_WIDTH_4 *100)
94 #define LINE_WIDTH5 (DEF_LINE_WIDTH_5 *100)
95
96 #define DLINE0_OUT (DEF_DOUBLE_LINE0_OUT *100)
97 #define DLINE0_IN (DEF_DOUBLE_LINE0_IN *100)
98 #define DLINE0_DIST (DEF_DOUBLE_LINE0_DIST *100)
99
100 #define DLINE1_OUT (DEF_DOUBLE_LINE1_OUT *100)
101 #define DLINE1_IN (DEF_DOUBLE_LINE1_IN *100)
102 #define DLINE1_DIST (DEF_DOUBLE_LINE1_DIST *100)
103
104 #define DLINE2_OUT (DEF_DOUBLE_LINE2_OUT *100)
105 #define DLINE2_IN (DEF_DOUBLE_LINE2_IN *100)
106 #define DLINE2_DIST (DEF_DOUBLE_LINE2_DIST *100)
107
108 #define DLINE3_OUT (DEF_DOUBLE_LINE3_OUT *100)
109 #define DLINE3_IN (DEF_DOUBLE_LINE3_IN *100)
110 #define DLINE3_DIST (DEF_DOUBLE_LINE3_DIST *100)
111
112 #define DLINE4_OUT (DEF_DOUBLE_LINE4_OUT *100)
113 #define DLINE4_IN (DEF_DOUBLE_LINE4_IN *100)
114 #define DLINE4_DIST (DEF_DOUBLE_LINE4_DIST *100)
115
116 #define DLINE5_OUT (DEF_DOUBLE_LINE5_OUT *100)
117 #define DLINE5_IN (DEF_DOUBLE_LINE5_IN *100)
118 #define DLINE5_DIST (DEF_DOUBLE_LINE5_DIST *100)
119
120 #define DLINE6_OUT (DEF_DOUBLE_LINE6_OUT *100)
121 #define DLINE6_IN (DEF_DOUBLE_LINE6_IN *100)
122 #define DLINE6_DIST (DEF_DOUBLE_LINE6_DIST *100)
123
124 #define DLINE7_OUT (DEF_DOUBLE_LINE7_OUT *100)
125 #define DLINE7_IN (DEF_DOUBLE_LINE7_IN *100)
126 #define DLINE7_DIST (DEF_DOUBLE_LINE7_DIST *100)
127
128 #define DLINE8_OUT (DEF_DOUBLE_LINE8_OUT *100)
129 #define DLINE8_IN (DEF_DOUBLE_LINE8_IN *100)
130 #define DLINE8_DIST (DEF_DOUBLE_LINE8_DIST *100)
131
132 #define DLINE9_OUT (DEF_DOUBLE_LINE9_OUT *100)
133 #define DLINE9_IN (DEF_DOUBLE_LINE9_IN *100)
134 #define DLINE9_DIST (DEF_DOUBLE_LINE9_DIST *100)
135
136 #define DLINE10_OUT (DEF_DOUBLE_LINE10_OUT *100)
137 #define DLINE10_IN (DEF_DOUBLE_LINE10_IN *100)
138 #define DLINE10_DIST (DEF_DOUBLE_LINE10_DIST*100)
139
140 #define RGBCOL(eColorName) (TpBorderRGBColor(eColorName))
141
142 // LOKALE FUNKTION
143 // Konvertiert in echte RGB-Farben, damit in den Listboxen
144 // endlich mal richtig selektiert werden kann.
145
TpBorderRGBColor(ColorData aColorData)146 Color TpBorderRGBColor( ColorData aColorData )
147 {
148 Color aRGBColor( aColorData );
149
150 return( aRGBColor );
151 }
152
153 // -----------------------------------------------------------------------
lcl_SetDecimalDigitsTo1(MetricField & rField)154 void lcl_SetDecimalDigitsTo1(MetricField& rField)
155 {
156 sal_Int64 nMin = rField.Denormalize( rField.GetMin( FUNIT_TWIP ) );
157 rField.SetDecimalDigits(1);
158 rField.SetMin( rField.Normalize( nMin ), FUNIT_TWIP );
159 }
160 // -----------------------------------------------------------------------
161
SvxBorderTabPage(Window * pParent,const SfxItemSet & rCoreAttrs)162 SvxBorderTabPage::SvxBorderTabPage( Window* pParent,
163 const SfxItemSet& rCoreAttrs )
164
165 : SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_BORDER ), rCoreAttrs ),
166
167 aFlBorder ( this, CUI_RES( FL_BORDER ) ),
168 aDefaultFT ( this, CUI_RES( FT_DEFAULT ) ),
169 aWndPresets ( this, CUI_RES( WIN_PRESETS ) ),
170 aUserDefFT ( this, CUI_RES( FT_USERDEF ) ),
171 aFrameSel ( this, CUI_RES( WIN_FRAMESEL ) ),
172
173 aFlSep1 ( this, CUI_RES( FL_SEPARATOR1 ) ),
174 aFlLine ( this, CUI_RES( FL_LINE ) ),
175 aStyleFT ( this, CUI_RES( FT_STYLE ) ),
176 aLbLineStyle ( this, CUI_RES( LB_LINESTYLE ) ),
177 aColorFT ( this, CUI_RES( FT_COLOR ) ),
178 aLbLineColor ( this, CUI_RES( LB_LINECOLOR ) ),
179
180 aFlSep2 ( this, CUI_RES( FL_SEPARATOR2 ) ),
181 aDistanceFL ( this, CUI_RES( FL_DISTANCE ) ),
182 aLeftFT ( this, CUI_RES( FT_LEFT ) ),
183 aLeftMF ( this, CUI_RES( MF_LEFT ) ),
184 aRightFT ( this, CUI_RES( FT_RIGHT ) ),
185 aRightMF ( this, CUI_RES( MF_RIGHT ) ),
186 aTopFT ( this, CUI_RES( FT_TOP ) ),
187 aTopMF ( this, CUI_RES( MF_TOP ) ),
188 aBottomFT ( this, CUI_RES( FT_BOTTOM ) ),
189 aBottomMF ( this, CUI_RES( MF_BOTTOM ) ),
190 aSynchronizeCB ( this, CUI_RES( CB_SYNC ) ),
191
192 aFlShadow ( this, CUI_RES( FL_SHADOW ) ),
193 aFtShadowPos ( this, CUI_RES( FT_SHADOWPOS ) ),
194 aWndShadows ( this, CUI_RES( WIN_SHADOWS ) ),
195 aFtShadowSize ( this, CUI_RES( FT_SHADOWSIZE ) ),
196 aEdShadowSize ( this, CUI_RES( ED_SHADOWSIZE ) ),
197 aFtShadowColor ( this, CUI_RES( FT_SHADOWCOLOR ) ),
198 aLbShadowColor ( this, CUI_RES( LB_SHADOWCOLOR ) ),
199 aPropertiesFL ( this, CUI_RES( FL_PROPERTIES ) ),
200 aMergeWithNextCB( this, CUI_RES( CB_MERGEWITHNEXT ) ),
201 aMergeAdjacentBordersCB( this, CUI_RES( CB_MERGEADJACENTBORDERS ) ),
202 aShadowImgLstH( CUI_RES(ILH_SDW_BITMAPS)),
203 aShadowImgLst( CUI_RES(IL_SDW_BITMAPS)),
204 aBorderImgLstH( CUI_RES(ILH_PRE_BITMAPS)),
205 aBorderImgLst( CUI_RES(IL_PRE_BITMAPS)),
206 nMinValue(0),
207 nSWMode(0),
208 mbHorEnabled( false ),
209 mbVerEnabled( false ),
210 mbTLBREnabled( false ),
211 mbBLTREnabled( false ),
212 mbUseMarginItem( false )
213
214 {
215 // diese Page braucht ExchangeSupport
216 SetExchangeSupport();
217
218 /* Use SvxMarginItem instead of margins from SvxBoxItem, if present.
219 -> Remember this state in mbUseMarginItem, because other special handling
220 is needed across various functions... */
221 mbUseMarginItem = rCoreAttrs.GetItemState(GetWhich(SID_ATTR_ALIGN_MARGIN),sal_True) != SFX_ITEM_UNKNOWN;
222
223 // Metrik einstellen
224 FieldUnit eFUnit = GetModuleFieldUnit( rCoreAttrs );
225
226 if( mbUseMarginItem )
227 {
228 // copied from SvxAlignmentTabPage
229 switch ( eFUnit )
230 {
231 // #103396# the default value (1pt) can't be accurately represented in
232 // inches or pica with two decimals, so point is used instead.
233 case FUNIT_PICA:
234 case FUNIT_INCH:
235 case FUNIT_FOOT:
236 case FUNIT_MILE:
237 eFUnit = FUNIT_POINT;
238 break;
239
240 case FUNIT_CM:
241 case FUNIT_M:
242 case FUNIT_KM:
243 eFUnit = FUNIT_MM;
244 break;
245 default: ;//prevent warning
246 }
247 }
248 else
249 {
250 switch ( eFUnit )
251 {
252 case FUNIT_M:
253 case FUNIT_KM:
254 eFUnit = FUNIT_MM;
255 break;
256 default: ; //prevent warning
257 }
258 }
259
260 SetFieldUnit( aEdShadowSize, eFUnit );
261
262 sal_uInt16 nWhich = GetWhich( SID_ATTR_BORDER_INNER, sal_False );
263 sal_Bool bIsDontCare = sal_True;
264
265 if ( rCoreAttrs.GetItemState( nWhich, sal_True ) >= SFX_ITEM_AVAILABLE )
266 {
267 // Absatz oder Tabelle
268 const SvxBoxInfoItem* pBoxInfo =
269 (const SvxBoxInfoItem*)&( rCoreAttrs.Get( nWhich ) );
270
271 mbHorEnabled = pBoxInfo->IsHorEnabled();
272 mbVerEnabled = pBoxInfo->IsVerEnabled();
273 mbTLBREnabled = sfx::ItemWrapperHelper::IsKnownItem( rCoreAttrs, SID_ATTR_BORDER_DIAG_TLBR );
274 mbBLTREnabled = sfx::ItemWrapperHelper::IsKnownItem( rCoreAttrs, SID_ATTR_BORDER_DIAG_BLTR );
275
276 if(pBoxInfo->IsDist())
277 {
278 SetFieldUnit(aLeftMF, eFUnit);
279 SetFieldUnit(aRightMF, eFUnit);
280 SetFieldUnit(aTopMF, eFUnit);
281 SetFieldUnit(aBottomMF, eFUnit);
282 aSynchronizeCB.Check(bSync);
283 aSynchronizeCB.SetClickHdl(LINK(this, SvxBorderTabPage, SyncHdl_Impl));
284 aLeftMF.SetModifyHdl(LINK(this, SvxBorderTabPage, ModifyDistanceHdl_Impl));
285 aRightMF.SetModifyHdl(LINK(this, SvxBorderTabPage, ModifyDistanceHdl_Impl));
286 aTopMF.SetModifyHdl(LINK(this, SvxBorderTabPage, ModifyDistanceHdl_Impl));
287 aBottomMF.SetModifyHdl(LINK(this, SvxBorderTabPage, ModifyDistanceHdl_Impl));
288 }
289 else
290 {
291 aFlSep2.Hide();
292 aDistanceFL.Hide();
293 aLeftFT.Hide();
294 aLeftMF.Hide();
295 aRightFT.Hide();
296 aRightMF.Hide();
297 aTopFT.Hide();
298 aTopMF.Hide();
299 aBottomFT.Hide();
300 aBottomMF.Hide();
301 aSynchronizeCB.Hide();
302 }
303 bIsDontCare = !pBoxInfo->IsValid( VALID_DISABLE );
304 }
305 if(!mbUseMarginItem && eFUnit == FUNIT_MM && SFX_MAPUNIT_TWIP == rCoreAttrs.GetPool()->GetMetric( GetWhich( SID_ATTR_BORDER_INNER ) ))
306 {
307 //#i91548# changing the number of decimal digits changes the minimum values, too
308 lcl_SetDecimalDigitsTo1(aLeftMF);
309 lcl_SetDecimalDigitsTo1(aRightMF);
310 lcl_SetDecimalDigitsTo1(aTopMF);
311 lcl_SetDecimalDigitsTo1(aBottomMF);
312 lcl_SetDecimalDigitsTo1(aEdShadowSize);
313 }
314
315 svx::FrameSelFlags nFlags = svx::FRAMESEL_OUTER;
316 if( mbHorEnabled )
317 nFlags |= svx::FRAMESEL_INNER_HOR;
318 if( mbVerEnabled )
319 nFlags |= svx::FRAMESEL_INNER_VER;
320 if( mbTLBREnabled )
321 nFlags |= svx::FRAMESEL_DIAG_TLBR;
322 if( mbBLTREnabled )
323 nFlags |= svx::FRAMESEL_DIAG_BLTR;
324 if( bIsDontCare )
325 nFlags |= svx::FRAMESEL_DONTCARE;
326 aFrameSel.Initialize( nFlags );
327
328 aFrameSel.SetSelectHdl(LINK(this, SvxBorderTabPage, LinesChanged_Impl));
329 aLbLineStyle.SetSelectHdl( LINK( this, SvxBorderTabPage, SelStyleHdl_Impl ) );
330 aLbLineColor.SetSelectHdl( LINK( this, SvxBorderTabPage, SelColHdl_Impl ) );
331 aLbShadowColor.SetSelectHdl( LINK( this, SvxBorderTabPage, SelColHdl_Impl ) );
332 aWndPresets.SetSelectHdl( LINK( this, SvxBorderTabPage, SelPreHdl_Impl ) );
333 aWndShadows.SetSelectHdl( LINK( this, SvxBorderTabPage, SelSdwHdl_Impl ) );
334
335 FillValueSets();
336 FillLineListBox_Impl();
337
338 // ColorBox aus der XColorList fuellen.
339 SfxObjectShell* pDocSh = SfxObjectShell::Current();
340 const SfxPoolItem* pItem = NULL;
341 XColorListSharedPtr aColorTable;
342
343 DBG_ASSERT( pDocSh, "DocShell not found!" );
344
345 if ( pDocSh )
346 {
347 pItem = pDocSh->GetItem( SID_COLOR_TABLE );
348 if ( pItem != NULL )
349 aColorTable = static_cast< const SvxColorTableItem* >(pItem)->GetColorTable();
350 }
351
352 DBG_ASSERT( aColorTable.get(), "ColorTable not found!" );
353
354 if ( aColorTable.get() )
355 {
356 // fuellen der Linienfarben-Box
357 aLbLineColor.SetUpdateMode( sal_False );
358
359 for ( long i = 0; i < aColorTable->Count(); ++i )
360 {
361 XColorEntry* pEntry = aColorTable->GetColor(i);
362 aLbLineColor.InsertEntry( pEntry->GetColor(), pEntry->GetName() );
363 }
364 aLbLineColor.SetUpdateMode( sal_True );
365 // dann nur noch in die Schattenfarben-Box kopieren
366 aLbShadowColor.CopyEntries( aLbLineColor );
367 }
368 FreeResource();
369
370 // connections
371
372 bool bSupportsShadow = !SfxItemPool::IsSlot( GetWhich( SID_ATTR_BORDER_SHADOW ) );
373 if( bSupportsShadow )
374 AddItemConnection( svx::CreateShadowConnection( rCoreAttrs, aWndShadows, aEdShadowSize, aLbShadowColor ) );
375 else
376 HideShadowControls();
377
378 if( mbUseMarginItem )
379 AddItemConnection( svx::CreateMarginConnection( rCoreAttrs, aLeftMF, aRightMF, aTopMF, aBottomMF ) );
380 if( aFrameSel.IsBorderEnabled( svx::FRAMEBORDER_TLBR ) )
381 AddItemConnection( svx::CreateFrameLineConnection( SID_ATTR_BORDER_DIAG_TLBR, aFrameSel, svx::FRAMEBORDER_TLBR ) );
382 if( aFrameSel.IsBorderEnabled( svx::FRAMEBORDER_BLTR ) )
383 AddItemConnection( svx::CreateFrameLineConnection( SID_ATTR_BORDER_DIAG_BLTR, aFrameSel, svx::FRAMEBORDER_BLTR ) );
384 // --> OD 2005-03-01 #i43593# - item connection doesn't work for Writer,
385 // because the Writer item sets contain these items
386 // checkbox "Merge with next paragraph" only visible for Writer dialog format.paragraph
387 AddItemConnection( new sfx::CheckBoxConnection( SID_ATTR_BORDER_CONNECT, aMergeWithNextCB, sfx::ITEMCONN_DEFAULT ) );
388 aMergeWithNextCB.Hide();
389 // checkbox "Merge adjacent line styles" only visible for Writer dialog format.table
390 AddItemConnection( new sfx::CheckBoxConnection( SID_SW_COLLAPSING_BORDERS, aMergeAdjacentBordersCB, sfx::ITEMCONN_DEFAULT ) );
391 aMergeAdjacentBordersCB.Hide();
392 // <--
393 }
394
395 // -----------------------------------------------------------------------
396
~SvxBorderTabPage()397 SvxBorderTabPage::~SvxBorderTabPage()
398 {
399 }
400
401 // -----------------------------------------------------------------------
402
GetRanges()403 sal_uInt16* SvxBorderTabPage::GetRanges()
404 {
405 return pRanges;
406 }
407
408 // -----------------------------------------------------------------------
409
Create(Window * pParent,const SfxItemSet & rAttrSet)410 SfxTabPage* SvxBorderTabPage::Create( Window* pParent,
411 const SfxItemSet& rAttrSet )
412 {
413 return ( new SvxBorderTabPage( pParent, rAttrSet ) );
414 }
415
416 // -----------------------------------------------------------------------
417
ResetFrameLine_Impl(svx::FrameBorderType eBorder,const SvxBorderLine * pCoreLine,bool bValid)418 void SvxBorderTabPage::ResetFrameLine_Impl( svx::FrameBorderType eBorder, const SvxBorderLine* pCoreLine, bool bValid )
419 {
420 if( aFrameSel.IsBorderEnabled( eBorder ) )
421 {
422 if( bValid )
423 aFrameSel.ShowBorder( eBorder, pCoreLine );
424 else
425 aFrameSel.SetBorderDontCare( eBorder );
426 }
427 }
428
429 // -----------------------------------------------------------------------
430
Reset(const SfxItemSet & rSet)431 void SvxBorderTabPage::Reset( const SfxItemSet& rSet )
432 {
433 SfxTabPage::Reset( rSet );
434
435 const SvxBoxItem* pBoxItem;
436 const SvxBoxInfoItem* pBoxInfoItem;
437 sal_uInt16 nWhichBox = GetWhich(SID_ATTR_BORDER_OUTER);
438 SfxMapUnit eCoreUnit;
439 const Color aColBlack = RGBCOL(COL_BLACK);
440
441 pBoxItem = (const SvxBoxItem*)GetItem( rSet, SID_ATTR_BORDER_OUTER );
442
443
444 pBoxInfoItem = (const SvxBoxInfoItem*)GetItem( rSet, SID_ATTR_BORDER_INNER, sal_False );
445
446 eCoreUnit = rSet.GetPool()->GetMetric( nWhichBox );
447
448 if ( pBoxItem && pBoxInfoItem ) // -> Don't Care
449 {
450 ResetFrameLine_Impl( svx::FRAMEBORDER_LEFT, pBoxItem->GetLeft(), pBoxInfoItem->IsValid( VALID_LEFT ) );
451 ResetFrameLine_Impl( svx::FRAMEBORDER_RIGHT, pBoxItem->GetRight(), pBoxInfoItem->IsValid( VALID_RIGHT ) );
452 ResetFrameLine_Impl( svx::FRAMEBORDER_TOP, pBoxItem->GetTop(), pBoxInfoItem->IsValid( VALID_TOP ) );
453 ResetFrameLine_Impl( svx::FRAMEBORDER_BOTTOM, pBoxItem->GetBottom(), pBoxInfoItem->IsValid( VALID_BOTTOM ) );
454 ResetFrameLine_Impl( svx::FRAMEBORDER_VER, pBoxInfoItem->GetVert(), pBoxInfoItem->IsValid( VALID_VERT ) );
455 ResetFrameLine_Impl( svx::FRAMEBORDER_HOR, pBoxInfoItem->GetHori(), pBoxInfoItem->IsValid( VALID_HORI ) );
456
457 //-------------------
458 // Abstand nach innen
459 //-------------------
460 if( !mbUseMarginItem )
461 {
462 if ( aLeftMF.IsVisible() )
463 {
464 SetMetricValue( aLeftMF, pBoxInfoItem->GetDefDist(), eCoreUnit );
465 SetMetricValue( aRightMF, pBoxInfoItem->GetDefDist(), eCoreUnit );
466 SetMetricValue( aTopMF, pBoxInfoItem->GetDefDist(), eCoreUnit );
467 SetMetricValue( aBottomMF, pBoxInfoItem->GetDefDist(), eCoreUnit );
468
469 nMinValue = static_cast<long>(aLeftMF.GetValue());
470
471 if ( pBoxInfoItem->IsMinDist() )
472 {
473 aLeftMF.SetFirst( nMinValue );
474 aRightMF.SetFirst( nMinValue );
475 aTopMF.SetFirst( nMinValue );
476 aBottomMF.SetFirst( nMinValue );
477 }
478
479 if ( pBoxInfoItem->IsDist() )
480 {
481 if( rSet.GetItemState( nWhichBox, sal_True ) >= SFX_ITEM_DEFAULT )
482 {
483 sal_Bool bIsAnyBorderVisible = aFrameSel.IsAnyBorderVisible();
484 if( !bIsAnyBorderVisible || !pBoxInfoItem->IsMinDist() )
485 {
486 aLeftMF.SetMin( 0 );
487 aLeftMF.SetFirst( 0 );
488 aRightMF.SetMin( 0 );
489 aRightMF.SetFirst( 0 );
490 aTopMF.SetMin( 0 );
491 aTopMF.SetFirst( 0 );
492 aBottomMF.SetMin( 0 );
493 aBottomMF.SetFirst( 0 );
494 }
495 long nLeftDist = pBoxItem->GetDistance( BOX_LINE_LEFT);
496 SetMetricValue( aLeftMF, nLeftDist, eCoreUnit );
497 long nRightDist = pBoxItem->GetDistance( BOX_LINE_RIGHT);
498 SetMetricValue( aRightMF, nRightDist, eCoreUnit );
499 long nTopDist = pBoxItem->GetDistance( BOX_LINE_TOP);
500 SetMetricValue( aTopMF, nTopDist, eCoreUnit );
501 long nBottomDist = pBoxItem->GetDistance( BOX_LINE_BOTTOM);
502 SetMetricValue( aBottomMF, nBottomDist, eCoreUnit );
503
504 // ist der Abstand auf nicht-default gesetzt,
505 // dann soll der Wert auch nicht
506 // mehr autom. veraendert werden
507
508 // if the distance is set with no active border line
509 // or it is null with an active border line
510 // no automatic changes should be made
511 const long nDefDist = bIsAnyBorderVisible ? pBoxInfoItem->GetDefDist() : 0;
512 sal_Bool bDiffDist = (nDefDist != nLeftDist ||
513 nDefDist != nRightDist ||
514 nDefDist != nTopDist ||
515 nDefDist != nBottomDist);
516 if((pBoxItem->GetDistance() ||
517 bIsAnyBorderVisible) && bDiffDist )
518 {
519 aLeftMF.SetModifyFlag();
520 aRightMF.SetModifyFlag();
521 aTopMF.SetModifyFlag();
522 aBottomMF.SetModifyFlag();
523 }
524 }
525 else
526 {
527 // #106224# different margins -> do not fill the edits
528 aLeftMF.SetText( String() );
529 aRightMF.SetText( String() );
530 aTopMF.SetText( String() );
531 aBottomMF.SetText( String() );
532 }
533 }
534 aLeftMF.SaveValue();
535 aRightMF.SaveValue();
536 aTopMF.SaveValue();
537 aBottomMF.SaveValue();
538 }
539 }
540 }
541 else
542 {
543 // ResetFrameLine-Aufrufe einsparen:
544 aFrameSel.HideAllBorders();
545 }
546
547 //-------------------------------------------------------------
548 // Linie/Linienfarbe in Controllern darstellen, wenn eindeutig:
549 //-------------------------------------------------------------
550 {
551 // Do all visible lines show the same line widths?
552 sal_uInt16 nPrim, nDist, nSecn;
553 bool bWidthEq = aFrameSel.GetVisibleWidth( nPrim, nDist, nSecn );
554 if( bWidthEq )
555 aLbLineStyle.SelectEntry( nPrim * 100, nSecn * 100, nDist * 100 );
556 else
557 aLbLineStyle.SelectEntryPos( 1 );
558
559 // Do all visible lines show the same line color?
560 Color aColor;
561 bool bColorEq = aFrameSel.GetVisibleColor( aColor );
562 if( !bColorEq )
563 aColor.SetColor( COL_BLACK );
564
565 sal_uInt16 nSelPos = aLbLineColor.GetEntryPos( aColor );
566 if( nSelPos == LISTBOX_ENTRY_NOTFOUND )
567 nSelPos = aLbLineColor.InsertEntry( aColor, SVX_RESSTR( RID_SVXSTR_COLOR_USER ) );
568
569 aLbLineColor.SelectEntryPos( nSelPos );
570 aLbLineStyle.SetColor( aColor );
571
572 // Select all visible lines, if they are all equal.
573 if( bWidthEq && bColorEq )
574 aFrameSel.SelectAllVisibleBorders();
575
576 // set the current style and color (caches style in control even if nothing is selected)
577 SelStyleHdl_Impl( &aLbLineStyle );
578 SelColHdl_Impl( &aLbLineColor );
579 }
580
581 sal_Bool bEnable = aWndShadows.GetSelectItemId() > 1 ;
582 aFtShadowSize.Enable(bEnable);
583 aEdShadowSize.Enable(bEnable);
584 aFtShadowColor.Enable(bEnable);
585 aLbShadowColor.Enable(bEnable);
586
587 aWndPresets.SetNoSelection();
588
589 // - keine Line - sollte nicht selektiert sein
590
591 if ( aLbLineStyle.GetSelectEntryPos() == 0 )
592 {
593 aLbLineStyle.SelectEntryPos( 1 );
594 SelStyleHdl_Impl( &aLbLineStyle );
595 }
596
597 const SfxPoolItem* pItem;
598 SfxObjectShell* pShell;
599 if(SFX_ITEM_SET == rSet.GetItemState(SID_HTML_MODE, sal_False, &pItem) ||
600 ( 0 != (pShell = SfxObjectShell::Current()) &&
601 0 != (pItem = pShell->GetItem(SID_HTML_MODE))))
602 {
603 sal_uInt16 nHtmlMode = ((SfxUInt16Item*)pItem)->GetValue();
604 if(nHtmlMode & HTMLMODE_ON)
605 {
606 //Im Html-Mode gibt es keinen Schatten und nur komplette Umrandungen
607 aFtShadowPos .Disable();
608 aWndShadows .Disable();
609 aFtShadowSize .Disable();
610 aEdShadowSize .Disable();
611 aFtShadowColor.Disable();
612 aLbShadowColor.Disable();
613 aFlShadow .Disable();
614
615 sal_uInt16 nLBCount = aLbLineStyle.GetEntryCount();
616 // ist es ein Absatzdialog, dann alle Linien fuer
617 // Sw-Export, sonst ist die Page nicht da
618 if(!(mbHorEnabled || mbVerEnabled)
619 && 0 == (nHtmlMode & HTMLMODE_FULL_ABS_POS) &&
620 SFX_ITEM_AVAILABLE > rSet.GetItemState(GetWhich( SID_ATTR_PARA_LINESPACE )))
621 {
622 for( sal_uInt16 i = nLBCount - 1; i > LINESTYLE_HTML_MAX; --i)
623 aLbLineStyle.RemoveEntry(i);
624 }
625
626 if( !(nSWMode & SW_BORDER_MODE_TABLE) )
627 {
628 aUserDefFT.Disable();
629 aFrameSel.Disable();
630 aWndPresets.RemoveItem(3);
631 aWndPresets.RemoveItem(4);
632 aWndPresets.RemoveItem(5);
633 }
634 }
635 }
636
637 LinesChanged_Impl( 0 );
638 }
639
640 // -----------------------------------------------------------------------
641
DeactivatePage(SfxItemSet * _pSet)642 int SvxBorderTabPage::DeactivatePage( SfxItemSet* _pSet )
643 {
644 if ( _pSet )
645 FillItemSet( *_pSet );
646
647 return LEAVE_PAGE;
648 }
649
650 // -----------------------------------------------------------------------
651
652 #define IS_DONT_CARE(a) ((a).GetState() == svx::FRAMESTATE_DONTCARE )
653
FillItemSet(SfxItemSet & rCoreAttrs)654 sal_Bool SvxBorderTabPage::FillItemSet( SfxItemSet& rCoreAttrs )
655 {
656 bool bAttrsChanged = SfxTabPage::FillItemSet( rCoreAttrs );
657
658 sal_Bool bPut = sal_True;
659 sal_uInt16 nBoxWhich = GetWhich( SID_ATTR_BORDER_OUTER );
660 sal_uInt16 nBoxInfoWhich = rCoreAttrs.GetPool()->GetWhich( SID_ATTR_BORDER_INNER, sal_False );
661 const SfxItemSet& rOldSet = GetItemSet();
662 SvxBoxItem aBoxItem ( nBoxWhich );
663 SvxBoxInfoItem aBoxInfoItem ( nBoxInfoWhich );
664 SvxBoxItem* pOldBoxItem = (SvxBoxItem*)GetOldItem( rCoreAttrs, SID_ATTR_BORDER_OUTER );
665
666 SfxMapUnit eCoreUnit = rOldSet.GetPool()->GetMetric( nBoxWhich );
667 const SfxPoolItem* pOld = 0;
668
669 //------------------
670 // Umrandung aussen:
671 //------------------
672 typedef ::std::pair<svx::FrameBorderType,sal_uInt16> TBorderPair;
673 TBorderPair eTypes1[] = {
674 TBorderPair(svx::FRAMEBORDER_TOP,BOX_LINE_TOP),
675 TBorderPair(svx::FRAMEBORDER_BOTTOM,BOX_LINE_BOTTOM),
676 TBorderPair(svx::FRAMEBORDER_LEFT,BOX_LINE_LEFT),
677 TBorderPair(svx::FRAMEBORDER_RIGHT,BOX_LINE_RIGHT),
678 };
679
680 for (sal_uInt32 i=0; i < sizeof(eTypes1)/sizeof(TBorderPair); ++i)
681 aBoxItem.SetLine( aFrameSel.GetFrameBorderStyle( eTypes1[i].first ), eTypes1[i].second );
682
683 //--------------------------------
684 // Umrandung hor/ver und TableFlag
685 //--------------------------------
686 TBorderPair eTypes2[] = {
687 TBorderPair(svx::FRAMEBORDER_HOR,BOXINFO_LINE_HORI),
688 TBorderPair(svx::FRAMEBORDER_VER,BOXINFO_LINE_VERT)
689 };
690 for (sal_uInt32 j=0; j < sizeof(eTypes2)/sizeof(TBorderPair); ++j)
691 aBoxInfoItem.SetLine( aFrameSel.GetFrameBorderStyle( eTypes2[j].first ), eTypes2[j].second );
692
693 aBoxInfoItem.EnableHor( mbHorEnabled );
694 aBoxInfoItem.EnableVer( mbVerEnabled );
695
696 //-------------------
697 // Abstand nach Innen
698 //-------------------
699 if( aLeftMF.IsVisible() )
700 {
701 // #i40405# enable distance controls for next dialog call
702 aBoxInfoItem.SetDist( sal_True );
703
704 if( !mbUseMarginItem )
705 {
706 // #106224# all edits empty: do nothing
707 if( aLeftMF.GetText().Len() || aRightMF.GetText().Len() ||
708 aTopMF.GetText().Len() || aBottomMF.GetText().Len() )
709 {
710 if ( ((mbHorEnabled || mbVerEnabled || (nSWMode & SW_BORDER_MODE_TABLE)) &&
711 (aLeftMF.IsModified()||aRightMF.IsModified()||
712 aTopMF.IsModified()||aBottomMF.IsModified()) )||
713 aFrameSel.GetFrameBorderState( svx::FRAMEBORDER_TOP ) != svx::FRAMESTATE_HIDE
714 || aFrameSel.GetFrameBorderState( svx::FRAMEBORDER_BOTTOM ) != svx::FRAMESTATE_HIDE
715 || aFrameSel.GetFrameBorderState( svx::FRAMEBORDER_LEFT ) != svx::FRAMESTATE_HIDE
716 || aFrameSel.GetFrameBorderState( svx::FRAMEBORDER_RIGHT ) != svx::FRAMESTATE_HIDE )
717 {
718 SvxBoxInfoItem* pOldBoxInfoItem = (SvxBoxInfoItem*)GetOldItem(
719 rCoreAttrs, SID_ATTR_BORDER_INNER );
720 if (
721 !pOldBoxItem ||
722 aLeftMF .GetText() != aLeftMF .GetSavedValue() ||
723 aRightMF .GetText() != aRightMF .GetSavedValue() ||
724 aTopMF .GetText() != aTopMF .GetSavedValue() ||
725 aBottomMF.GetText() != aBottomMF.GetSavedValue() ||
726 nMinValue == aLeftMF .GetValue() ||
727 nMinValue == aRightMF .GetValue() ||
728 nMinValue == aTopMF .GetValue() ||
729 nMinValue == aBottomMF.GetValue() ||
730 (pOldBoxInfoItem && !pOldBoxInfoItem->IsValid(VALID_DISTANCE))
731 )
732 {
733 aBoxItem.SetDistance( (sal_uInt16)GetCoreValue( aLeftMF, eCoreUnit ), BOX_LINE_LEFT );
734 aBoxItem.SetDistance( (sal_uInt16)GetCoreValue( aRightMF, eCoreUnit ), BOX_LINE_RIGHT );
735 aBoxItem.SetDistance( (sal_uInt16)GetCoreValue( aTopMF, eCoreUnit ), BOX_LINE_TOP );
736 aBoxItem.SetDistance( (sal_uInt16)GetCoreValue( aBottomMF, eCoreUnit ), BOX_LINE_BOTTOM);
737 }
738 else
739 {
740 aBoxItem.SetDistance(pOldBoxItem->GetDistance(BOX_LINE_LEFT ), BOX_LINE_LEFT);
741 aBoxItem.SetDistance(pOldBoxItem->GetDistance(BOX_LINE_RIGHT), BOX_LINE_RIGHT);
742 aBoxItem.SetDistance(pOldBoxItem->GetDistance(BOX_LINE_TOP ), BOX_LINE_TOP);
743 aBoxItem.SetDistance(pOldBoxItem->GetDistance(BOX_LINE_BOTTOM), BOX_LINE_BOTTOM);
744 }
745 aBoxInfoItem.SetValid( VALID_DISTANCE, sal_True );
746 }
747 else
748 aBoxInfoItem.SetValid( VALID_DISTANCE, sal_False );
749 }
750 }
751 }
752
753 //------------------------------------------
754 // Don't Care Status im Info-Item vermerken:
755 //------------------------------------------
756 aBoxInfoItem.SetValid( VALID_TOP, aFrameSel.GetFrameBorderState( svx::FRAMEBORDER_TOP ) != svx::FRAMESTATE_DONTCARE );
757 aBoxInfoItem.SetValid( VALID_BOTTOM, aFrameSel.GetFrameBorderState( svx::FRAMEBORDER_BOTTOM ) != svx::FRAMESTATE_DONTCARE );
758 aBoxInfoItem.SetValid( VALID_LEFT, aFrameSel.GetFrameBorderState( svx::FRAMEBORDER_LEFT ) != svx::FRAMESTATE_DONTCARE );
759 aBoxInfoItem.SetValid( VALID_RIGHT, aFrameSel.GetFrameBorderState( svx::FRAMEBORDER_RIGHT ) != svx::FRAMESTATE_DONTCARE );
760 aBoxInfoItem.SetValid( VALID_HORI, aFrameSel.GetFrameBorderState( svx::FRAMEBORDER_HOR ) != svx::FRAMESTATE_DONTCARE );
761 aBoxInfoItem.SetValid( VALID_VERT, aFrameSel.GetFrameBorderState( svx::FRAMEBORDER_VER ) != svx::FRAMESTATE_DONTCARE );
762
763 //
764 // Put oder Clear der Umrandung?
765 //
766 bPut = sal_True;
767
768 if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nBoxWhich, sal_False ))
769 {
770 bPut = aBoxItem != (const SvxBoxItem&)(rOldSet.Get(nBoxWhich)) ? sal_True : sal_False;
771 }
772 if( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nBoxInfoWhich, sal_False ) )
773 {
774 const SvxBoxInfoItem& rOldBoxInfo = (const SvxBoxInfoItem&)
775 rOldSet.Get(nBoxInfoWhich);
776
777 aBoxInfoItem.SetMinDist( rOldBoxInfo.IsMinDist() );
778 aBoxInfoItem.SetDefDist( rOldBoxInfo.GetDefDist() );
779 bPut |= (aBoxInfoItem != rOldBoxInfo );
780 }
781
782 if ( bPut )
783 {
784 if ( !pOldBoxItem || !( *pOldBoxItem == aBoxItem ) )
785 {
786 rCoreAttrs.Put( aBoxItem );
787 bAttrsChanged |= sal_True;
788 }
789 pOld = GetOldItem( rCoreAttrs, SID_ATTR_BORDER_INNER, sal_False );
790
791 if ( !pOld || !( *(const SvxBoxInfoItem*)pOld == aBoxInfoItem ) )
792 {
793 rCoreAttrs.Put( aBoxInfoItem );
794 bAttrsChanged |= sal_True;
795 }
796 }
797 else
798 {
799 rCoreAttrs.ClearItem( nBoxWhich );
800 rCoreAttrs.ClearItem( nBoxInfoWhich );
801 }
802
803 return bAttrsChanged;
804 }
805
806 // -----------------------------------------------------------------------
807
HideShadowControls()808 void SvxBorderTabPage::HideShadowControls()
809 {
810 aFtShadowPos.Hide();
811 aWndShadows.Hide();
812 aFtShadowSize.Hide();
813 aEdShadowSize.Hide();
814 aFtShadowColor.Hide();
815 aLbShadowColor.Hide();
816 aFlShadow.Hide();
817 }
818
819 // -----------------------------------------------------------------------
820
IMPL_LINK(SvxBorderTabPage,SelPreHdl_Impl,void *,EMPTYARG)821 IMPL_LINK( SvxBorderTabPage, SelPreHdl_Impl, void *, EMPTYARG )
822 {
823 const svx::FrameBorderState SHOW = svx::FRAMESTATE_SHOW;
824 const svx::FrameBorderState HIDE = svx::FRAMESTATE_HIDE;
825 const svx::FrameBorderState DONT = svx::FRAMESTATE_DONTCARE;
826
827 static const svx::FrameBorderState ppeStates[][ svx::FRAMEBORDERTYPE_COUNT ] =
828 { /* Left Right Top Bot Hor Ver TLBR BLTR */
829 /* ---------------------+--------------------------------------------------- */
830 /* IID_PRE_CELL_NONE */ { HIDE, HIDE, HIDE, HIDE, HIDE, HIDE, HIDE, HIDE },
831 /* IID_PRE_CELL_ALL */ { SHOW, SHOW, SHOW, SHOW, HIDE, HIDE, HIDE, HIDE },
832 /* IID_PRE_CELL_LR */ { SHOW, SHOW, HIDE, HIDE, HIDE, HIDE, HIDE, HIDE },
833 /* IID_PRE_CELL_TB */ { HIDE, HIDE, SHOW, SHOW, HIDE, HIDE, HIDE, HIDE },
834 /* IID_PRE_CELL_L */ { SHOW, HIDE, HIDE, HIDE, HIDE, HIDE, HIDE, HIDE },
835 /* IID_PRE_CELL_DIAG */ { HIDE, HIDE, HIDE, HIDE, HIDE, HIDE, SHOW, SHOW },
836 /* IID_PRE_HOR_NONE */ { HIDE, HIDE, HIDE, HIDE, HIDE, HIDE, HIDE, HIDE },
837 /* IID_PRE_HOR_OUTER */ { SHOW, SHOW, SHOW, SHOW, HIDE, HIDE, HIDE, HIDE },
838 /* IID_PRE_HOR_HOR */ { HIDE, HIDE, SHOW, SHOW, SHOW, HIDE, HIDE, HIDE },
839 /* IID_PRE_HOR_ALL */ { SHOW, SHOW, SHOW, SHOW, SHOW, HIDE, HIDE, HIDE },
840 /* IID_PRE_HOR_OUTER2 */ { SHOW, SHOW, SHOW, SHOW, DONT, HIDE, HIDE, HIDE },
841 /* IID_PRE_VER_NONE */ { HIDE, HIDE, HIDE, HIDE, HIDE, HIDE, HIDE, HIDE },
842 /* IID_PRE_VER_OUTER */ { SHOW, SHOW, SHOW, SHOW, HIDE, HIDE, HIDE, HIDE },
843 /* IID_PRE_VER_VER */ { SHOW, SHOW, HIDE, HIDE, HIDE, SHOW, HIDE, HIDE },
844 /* IID_PRE_VER_ALL */ { SHOW, SHOW, SHOW, SHOW, HIDE, SHOW, HIDE, HIDE },
845 /* IID_PRE_VER_OUTER2 */ { SHOW, SHOW, SHOW, SHOW, HIDE, DONT, HIDE, HIDE },
846 /* IID_PRE_TABLE_NONE */ { HIDE, HIDE, HIDE, HIDE, HIDE, HIDE, HIDE, HIDE },
847 /* IID_PRE_TABLE_OUTER */ { SHOW, SHOW, SHOW, SHOW, HIDE, HIDE, HIDE, HIDE },
848 /* IID_PRE_TABLE_OUTERH */ { SHOW, SHOW, SHOW, SHOW, SHOW, HIDE, HIDE, HIDE },
849 /* IID_PRE_TABLE_ALL */ { SHOW, SHOW, SHOW, SHOW, SHOW, SHOW, HIDE, HIDE },
850 /* IID_PRE_TABLE_OUTER2 */ { SHOW, SHOW, SHOW, SHOW, DONT, DONT, HIDE, HIDE }
851 };
852
853 // first hide and deselect all frame borders
854 aFrameSel.HideAllBorders();
855 aFrameSel.DeselectAllBorders();
856
857 // Using image ID to find correct line in table above.
858 sal_uInt16 nLine = GetPresetImageId( aWndPresets.GetSelectItemId() ) - 1;
859
860 // Apply all styles from the table
861 for( int nBorder = 0; nBorder < svx::FRAMEBORDERTYPE_COUNT; ++nBorder )
862 {
863 svx::FrameBorderType eBorder = svx::GetFrameBorderTypeFromIndex( nBorder );
864 switch( ppeStates[ nLine ][ nBorder ] )
865 {
866 case SHOW: aFrameSel.SelectBorder( eBorder ); break;
867 case HIDE: /* nothing to do */ break;
868 case DONT: aFrameSel.SetBorderDontCare( eBorder ); break;
869 }
870 }
871
872 // Show all lines that have been selected above
873 if( aFrameSel.IsAnyBorderSelected() )
874 {
875 // any visible style, but "no-line" in line list box? -> use hair-line
876 if( (aLbLineStyle.GetSelectEntryPos() == 0) || (aLbLineStyle.GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND) )
877 aLbLineStyle.SelectEntryPos( 1 );
878
879 // set current style to all previously selected lines
880 SelStyleHdl_Impl( &aLbLineStyle );
881 SelColHdl_Impl( &aLbLineColor );
882 }
883
884 // Presets ValueSet does not show a selection (used as push buttons).
885 aWndPresets.SetNoSelection();
886
887 LinesChanged_Impl( 0 );
888 return 0;
889 }
890
891 // -----------------------------------------------------------------------
892
IMPL_LINK(SvxBorderTabPage,SelSdwHdl_Impl,void *,EMPTYARG)893 IMPL_LINK( SvxBorderTabPage, SelSdwHdl_Impl, void *, EMPTYARG )
894 {
895 sal_Bool bEnable = aWndShadows.GetSelectItemId() > 1;
896 aFtShadowSize.Enable(bEnable);
897 aEdShadowSize.Enable(bEnable);
898 aFtShadowColor.Enable(bEnable);
899 aLbShadowColor.Enable(bEnable);
900 return 0;
901 }
902
903 // -----------------------------------------------------------------------
904
IMPL_LINK(SvxBorderTabPage,SelColHdl_Impl,ListBox *,pLb)905 IMPL_LINK( SvxBorderTabPage, SelColHdl_Impl, ListBox *, pLb )
906 {
907 ColorListBox* pColLb = (ColorListBox*)pLb;
908
909 if ( pLb == &aLbLineColor )
910 {
911 aFrameSel.SetColorToSelection( pColLb->GetSelectEntryColor() );
912 aLbLineStyle.SetColor( pColLb->GetSelectEntryColor() );
913 }
914
915 return 0;
916 }
917
918 // -----------------------------------------------------------------------
919
IMPL_LINK(SvxBorderTabPage,SelStyleHdl_Impl,ListBox *,pLb)920 IMPL_LINK( SvxBorderTabPage, SelStyleHdl_Impl, ListBox *, pLb )
921 {
922 if ( pLb == &aLbLineStyle )
923 aFrameSel.SetStyleToSelection(
924 static_cast< sal_uInt16 >( aLbLineStyle.GetSelectEntryLine1() / 100 ),
925 static_cast< sal_uInt16 >( aLbLineStyle.GetSelectEntryDistance() / 100 ),
926 static_cast< sal_uInt16 >( aLbLineStyle.GetSelectEntryLine2() / 100 ) );
927
928 return 0;
929 }
930
931 // ============================================================================
932 // ValueSet handling
933 // ============================================================================
934
935 // number of preset images to show
936 const sal_uInt16 SVX_BORDER_PRESET_COUNT = 5;
937
938 // number of shadow images to show
939 const sal_uInt16 SVX_BORDER_SHADOW_COUNT = 5;
940
941 // ----------------------------------------------------------------------------
942
GetPresetImageId(sal_uInt16 nValueSetIdx) const943 sal_uInt16 SvxBorderTabPage::GetPresetImageId( sal_uInt16 nValueSetIdx ) const
944 {
945 // table with all sets of predefined border styles
946 static const sal_uInt16 ppnImgIds[][ SVX_BORDER_PRESET_COUNT ] =
947 {
948 // simple cell without diagonal frame borders
949 { IID_PRE_CELL_NONE, IID_PRE_CELL_ALL, IID_PRE_CELL_LR, IID_PRE_CELL_TB, IID_PRE_CELL_L },
950 // simple cell with diagonal frame borders
951 { IID_PRE_CELL_NONE, IID_PRE_CELL_ALL, IID_PRE_CELL_LR, IID_PRE_CELL_TB, IID_PRE_CELL_DIAG },
952 // with horizontal inner frame border
953 { IID_PRE_HOR_NONE, IID_PRE_HOR_OUTER, IID_PRE_HOR_HOR, IID_PRE_HOR_ALL, IID_PRE_HOR_OUTER2 },
954 // with vertical inner frame border
955 { IID_PRE_VER_NONE, IID_PRE_VER_OUTER, IID_PRE_VER_VER, IID_PRE_VER_ALL, IID_PRE_VER_OUTER2 },
956 // with horizontal and vertical inner frame borders
957 { IID_PRE_TABLE_NONE, IID_PRE_TABLE_OUTER, IID_PRE_TABLE_OUTERH, IID_PRE_TABLE_ALL, IID_PRE_TABLE_OUTER2 }
958 };
959
960 // find correct set of presets
961 int nLine = 0;
962 if( !mbHorEnabled && !mbVerEnabled )
963 nLine = (mbTLBREnabled || mbBLTREnabled) ? 1 : 0;
964 else if( mbHorEnabled && !mbVerEnabled )
965 nLine = 2;
966 else if( !mbHorEnabled && mbVerEnabled )
967 nLine = 3;
968 else
969 nLine = 4;
970
971 DBG_ASSERT( (1 <= nValueSetIdx) && (nValueSetIdx <= SVX_BORDER_PRESET_COUNT),
972 "SvxBorderTabPage::GetPresetImageId - wrong index" );
973 return ppnImgIds[ nLine ][ nValueSetIdx - 1 ];
974 }
975
GetPresetStringId(sal_uInt16 nValueSetIdx) const976 sal_uInt16 SvxBorderTabPage::GetPresetStringId( sal_uInt16 nValueSetIdx ) const
977 {
978 // string resource IDs for each image (in order of the IID_PRE_* image IDs)
979 static const sal_uInt16 pnStrIds[] =
980 {
981 RID_SVXSTR_TABLE_PRESET_NONE,
982 RID_SVXSTR_PARA_PRESET_ALL,
983 RID_SVXSTR_PARA_PRESET_LEFTRIGHT,
984 RID_SVXSTR_PARA_PRESET_TOPBOTTOM,
985 RID_SVXSTR_PARA_PRESET_ONLYLEFT,
986 RID_SVXSTR_PARA_PRESET_DIAGONAL,
987
988 RID_SVXSTR_TABLE_PRESET_NONE,
989 RID_SVXSTR_TABLE_PRESET_ONLYOUTER,
990 RID_SVXSTR_HOR_PRESET_ONLYHOR,
991 RID_SVXSTR_TABLE_PRESET_OUTERALL,
992 RID_SVXSTR_TABLE_PRESET_OUTERINNER,
993
994 RID_SVXSTR_TABLE_PRESET_NONE,
995 RID_SVXSTR_TABLE_PRESET_ONLYOUTER,
996 RID_SVXSTR_VER_PRESET_ONLYVER,
997 RID_SVXSTR_TABLE_PRESET_OUTERALL,
998 RID_SVXSTR_TABLE_PRESET_OUTERINNER,
999
1000 RID_SVXSTR_TABLE_PRESET_NONE,
1001 RID_SVXSTR_TABLE_PRESET_ONLYOUTER,
1002 RID_SVXSTR_TABLE_PRESET_OUTERHORI,
1003 RID_SVXSTR_TABLE_PRESET_OUTERALL,
1004 RID_SVXSTR_TABLE_PRESET_OUTERINNER
1005 };
1006 return pnStrIds[ GetPresetImageId( nValueSetIdx ) - 1 ];
1007 }
1008
1009 // ----------------------------------------------------------------------------
1010
FillPresetVS()1011 void SvxBorderTabPage::FillPresetVS()
1012 {
1013 // find correct image list
1014 bool bHC = aWndPresets.GetSettings().GetStyleSettings().GetHighContrastMode();
1015 ImageList& rImgList = bHC ? aBorderImgLstH : aBorderImgLst;
1016 Size aImgSize( rImgList.GetImage( IID_PRE_CELL_NONE ).GetSizePixel() );
1017
1018 // basic initialization of the ValueSet
1019 aWndPresets.SetColCount( SVX_BORDER_PRESET_COUNT );
1020 aWndPresets.SetStyle( aWndPresets.GetStyle() | WB_ITEMBORDER | WB_DOUBLEBORDER );
1021 aWndPresets.SetSizePixel( aWndPresets.CalcWindowSizePixel( aImgSize ) );
1022
1023 // insert images and help texts
1024 for( sal_uInt16 nVSIdx = 1; nVSIdx <= SVX_BORDER_PRESET_COUNT; ++nVSIdx )
1025 {
1026 aWndPresets.InsertItem( nVSIdx );
1027 aWndPresets.SetItemImage( nVSIdx, rImgList.GetImage( GetPresetImageId( nVSIdx ) ) );
1028 aWndPresets.SetItemText( nVSIdx, CUI_RESSTR( GetPresetStringId( nVSIdx ) ) );
1029 }
1030
1031 // show the control
1032 aWndPresets.SetNoSelection();
1033 aWndPresets.Show();
1034 }
1035
1036 // ----------------------------------------------------------------------------
1037
FillShadowVS()1038 void SvxBorderTabPage::FillShadowVS()
1039 {
1040 // find correct image list
1041 bool bHC = aWndPresets.GetSettings().GetStyleSettings().GetHighContrastMode();
1042 ImageList& rImgList = bHC ? aShadowImgLstH : aShadowImgLst;
1043 Size aImgSize( rImgList.GetImage( IID_SHADOWNONE ).GetSizePixel() );
1044
1045 // basic initialization of the ValueSet
1046 aWndShadows.SetColCount( SVX_BORDER_SHADOW_COUNT );
1047 aWndShadows.SetStyle( aWndShadows.GetStyle() | WB_ITEMBORDER | WB_DOUBLEBORDER );
1048 aWndShadows.SetSizePixel( aWndShadows.CalcWindowSizePixel( aImgSize ) );
1049
1050 // image resource IDs
1051 static const sal_uInt16 pnImgIds[ SVX_BORDER_SHADOW_COUNT ] =
1052 { IID_SHADOWNONE, IID_SHADOW_BOT_RIGHT, IID_SHADOW_TOP_RIGHT, IID_SHADOW_BOT_LEFT, IID_SHADOW_TOP_LEFT };
1053 // string resource IDs for each image
1054 static const sal_uInt16 pnStrIds[ SVX_BORDER_SHADOW_COUNT ] =
1055 { RID_SVXSTR_SHADOW_STYLE_NONE, RID_SVXSTR_SHADOW_STYLE_BOTTOMRIGHT, RID_SVXSTR_SHADOW_STYLE_TOPRIGHT, RID_SVXSTR_SHADOW_STYLE_BOTTOMLEFT, RID_SVXSTR_SHADOW_STYLE_TOPLEFT };
1056
1057 // insert images and help texts
1058 for( sal_uInt16 nVSIdx = 1; nVSIdx <= SVX_BORDER_SHADOW_COUNT; ++nVSIdx )
1059 {
1060 aWndShadows.InsertItem( nVSIdx );
1061 aWndShadows.SetItemImage( nVSIdx, rImgList.GetImage( pnImgIds[ nVSIdx - 1 ] ) );
1062 aWndShadows.SetItemText( nVSIdx, CUI_RESSTR( pnStrIds[ nVSIdx - 1 ] ) );
1063 }
1064
1065 // show the control
1066 aWndShadows.SelectItem( 1 );
1067 aWndShadows.Show();
1068 }
1069
1070 // ----------------------------------------------------------------------------
1071
FillValueSets()1072 void SvxBorderTabPage::FillValueSets()
1073 {
1074 FillPresetVS();
1075 FillShadowVS();
1076 }
1077
1078 // ============================================================================
1079
FillLineListBox_Impl()1080 void SvxBorderTabPage::FillLineListBox_Impl()
1081 {
1082 aLbLineStyle.SetUnit( FUNIT_POINT );
1083 aLbLineStyle.SetSourceUnit( FUNIT_TWIP );
1084
1085 // Writer 2.0 Defaults:
1086 aLbLineStyle.InsertEntry( SVX_RESSTR( RID_SVXSTR_NONE ) );
1087
1088 aLbLineStyle.InsertEntry( LINE_WIDTH0 );
1089 aLbLineStyle.InsertEntry( LINE_WIDTH5 );
1090 aLbLineStyle.InsertEntry( LINE_WIDTH1 );
1091 aLbLineStyle.InsertEntry( LINE_WIDTH2 );
1092 aLbLineStyle.InsertEntry( LINE_WIDTH3 );
1093 aLbLineStyle.InsertEntry( LINE_WIDTH4 );
1094
1095 // OS: wenn hier neue Linienstaerken zugfuegt werden, dann
1096 // LINESTYLE_HTML_MAX anpassen
1097
1098 aLbLineStyle.InsertEntry( DLINE0_OUT, DLINE0_IN, DLINE0_DIST );
1099 aLbLineStyle.InsertEntry( DLINE7_OUT, DLINE7_IN, DLINE7_DIST );
1100 aLbLineStyle.InsertEntry( DLINE1_OUT, DLINE1_IN, DLINE1_DIST );
1101 aLbLineStyle.InsertEntry( DLINE2_OUT, DLINE2_IN, DLINE2_DIST );
1102 aLbLineStyle.InsertEntry( DLINE8_OUT, DLINE8_IN, DLINE8_DIST );
1103 aLbLineStyle.InsertEntry( DLINE9_OUT, DLINE9_IN, DLINE9_DIST );
1104 aLbLineStyle.InsertEntry( DLINE10_OUT,DLINE10_IN,DLINE10_DIST);
1105 aLbLineStyle.InsertEntry( DLINE3_OUT, DLINE3_IN, DLINE3_DIST );
1106 aLbLineStyle.InsertEntry( DLINE4_OUT, DLINE4_IN, DLINE4_DIST );
1107 aLbLineStyle.InsertEntry( DLINE5_OUT, DLINE5_IN, DLINE5_DIST );
1108 aLbLineStyle.InsertEntry( DLINE6_OUT, DLINE6_IN, DLINE6_DIST );
1109 }
1110
1111 // -----------------------------------------------------------------------
IMPL_LINK(SvxBorderTabPage,LinesChanged_Impl,void *,EMPTYARG)1112 IMPL_LINK( SvxBorderTabPage, LinesChanged_Impl, void*, EMPTYARG )
1113 {
1114 if(!mbUseMarginItem && aLeftMF.IsVisible())
1115 {
1116 sal_Bool bLineSet = aFrameSel.IsAnyBorderVisible();
1117 sal_Bool bMinAllowed = 0 != (nSWMode & (SW_BORDER_MODE_FRAME|SW_BORDER_MODE_TABLE));
1118 sal_Bool bSpaceModified = aLeftMF .IsModified()||
1119 aRightMF .IsModified()||
1120 aTopMF .IsModified()||
1121 aBottomMF.IsModified();
1122
1123 if(bLineSet)
1124 {
1125 if(!bMinAllowed)
1126 {
1127 aLeftMF .SetFirst(nMinValue);
1128 aRightMF .SetFirst(nMinValue);
1129 aTopMF .SetFirst(nMinValue);
1130 aBottomMF.SetFirst(nMinValue);
1131 }
1132 if(!bSpaceModified)
1133 {
1134 aLeftMF .SetValue(nMinValue);
1135 aRightMF .SetValue(nMinValue);
1136 aTopMF .SetValue(nMinValue);
1137 aBottomMF.SetValue(nMinValue);
1138 }
1139 }
1140 else
1141 {
1142 aLeftMF .SetMin(0);
1143 aRightMF .SetMin(0);
1144 aTopMF .SetMin(0);
1145 aBottomMF.SetMin(0);
1146 aLeftMF .SetFirst(0);
1147 aRightMF .SetFirst(0);
1148 aTopMF .SetFirst(0);
1149 aBottomMF.SetFirst(0);
1150 if(!bSpaceModified)
1151 {
1152 aLeftMF .SetValue(0);
1153 aRightMF .SetValue(0);
1154 aTopMF .SetValue(0);
1155 aBottomMF.SetValue(0);
1156 }
1157 }
1158 //fuer Tabellen ist alles erlaubt
1159 sal_uInt16 nValid = VALID_TOP|VALID_BOTTOM|VALID_LEFT|VALID_RIGHT;
1160
1161 //fuer Rahmen und Absatz wird das Edit disabled, wenn keine Border gesetzt ist
1162 if(nSWMode & (SW_BORDER_MODE_FRAME|SW_BORDER_MODE_PARA))
1163 {
1164 if(bLineSet)
1165 {
1166 nValid = (aFrameSel.GetFrameBorderState( svx::FRAMEBORDER_TOP) == svx::FRAMESTATE_SHOW) ? VALID_TOP : 0;
1167 nValid |= (aFrameSel.GetFrameBorderState( svx::FRAMEBORDER_BOTTOM) == svx::FRAMESTATE_SHOW) ? VALID_BOTTOM : 0;
1168 nValid |= (aFrameSel.GetFrameBorderState( svx::FRAMEBORDER_LEFT) == svx::FRAMESTATE_SHOW) ? VALID_LEFT : 0;
1169 nValid |= (aFrameSel.GetFrameBorderState( svx::FRAMEBORDER_RIGHT ) == svx::FRAMESTATE_SHOW) ? VALID_RIGHT : 0;
1170 }
1171 else
1172 nValid = 0;
1173 }
1174 aLeftFT.Enable(0 != (nValid&VALID_LEFT));
1175 aRightFT.Enable(0 != (nValid&VALID_RIGHT));
1176 aTopFT.Enable(0 != (nValid&VALID_TOP));
1177 aBottomFT.Enable(0 != (nValid&VALID_BOTTOM));
1178 aLeftMF.Enable(0 != (nValid&VALID_LEFT));
1179 aRightMF.Enable(0 != (nValid&VALID_RIGHT));
1180 aTopMF.Enable(0 != (nValid&VALID_TOP));
1181 aBottomMF.Enable(0 != (nValid&VALID_BOTTOM));
1182 aSynchronizeCB.Enable( aRightMF.IsEnabled() || aTopMF.IsEnabled() ||
1183 aBottomMF.IsEnabled() || aLeftMF.IsEnabled() );
1184 }
1185 return 0;
1186 }
1187
1188 // -----------------------------------------------------------------------
1189
IMPL_LINK(SvxBorderTabPage,ModifyDistanceHdl_Impl,MetricField *,pField)1190 IMPL_LINK( SvxBorderTabPage, ModifyDistanceHdl_Impl, MetricField*, pField)
1191 {
1192 if ( bSync )
1193 {
1194 sal_Int64 nVal = pField->GetValue();
1195 if(pField != &aLeftMF)
1196 aLeftMF.SetValue(nVal);
1197 if(pField != &aRightMF)
1198 aRightMF.SetValue(nVal);
1199 if(pField != &aTopMF)
1200 aTopMF.SetValue(nVal);
1201 if(pField != &aBottomMF)
1202 aBottomMF.SetValue(nVal);
1203 }
1204 return 0;
1205 }
1206
IMPL_LINK(SvxBorderTabPage,SyncHdl_Impl,CheckBox *,pBox)1207 IMPL_LINK( SvxBorderTabPage, SyncHdl_Impl, CheckBox*, pBox)
1208 {
1209 bSync = pBox->IsChecked();
1210 return 0;
1211 }
1212
1213 /* -----------------------------03.06.2002 10:15------------------------------
1214
1215 ---------------------------------------------------------------------------*/
DataChanged(const DataChangedEvent & rDCEvt)1216 void SvxBorderTabPage::DataChanged( const DataChangedEvent& rDCEvt )
1217 {
1218 if( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
1219 FillValueSets();
1220
1221 SfxTabPage::DataChanged( rDCEvt );
1222 }
1223
PageCreated(SfxAllItemSet aSet)1224 void SvxBorderTabPage::PageCreated (SfxAllItemSet aSet) //add CHINA001
1225 {
1226 SFX_ITEMSET_ARG (&aSet,pSWModeItem,SfxUInt16Item,SID_SWMODE_TYPE,sal_False);
1227 SFX_ITEMSET_ARG (&aSet,pFlagItem,SfxUInt32Item,SID_FLAG_TYPE,sal_False);
1228 if (pSWModeItem)
1229 {
1230 nSWMode = pSWModeItem->GetValue();
1231 // --> OD 2005-03-01 #i43593#
1232 // show checkbox <aMergeWithNextCB> for format.paragraph
1233 if ( nSWMode == SW_BORDER_MODE_PARA )
1234 {
1235 aMergeWithNextCB.Show();
1236 aPropertiesFL.Show();
1237 }
1238 // show checkbox <aMergeAdjacentBordersCB> for format.paragraph
1239 else if ( nSWMode == SW_BORDER_MODE_TABLE )
1240 {
1241 aMergeAdjacentBordersCB.Show();
1242 aPropertiesFL.Show();
1243 }
1244 // <--
1245 }
1246 if (pFlagItem)
1247 if ( ( pFlagItem->GetValue() & SVX_HIDESHADOWCTL ) == SVX_HIDESHADOWCTL )
1248 HideShadowControls();
1249 }
1250
1251 // ============================================================================
1252
1253