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