xref: /aoo42x/main/sw/source/ui/table/tabledlg.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_sw.hxx"
30 
31 #ifdef SW_DLLIMPLEMENTATION
32 #undef SW_DLLIMPLEMENTATION
33 #endif
34 
35 
36 #include <hintids.hxx>
37 #include <tools/list.hxx>
38 #include <vcl/msgbox.hxx>
39 #include <svl/stritem.hxx>
40 #include <svl/intitem.hxx>
41 #include <svx/htmlmode.hxx>
42 #include <editeng/keepitem.hxx>
43 #include <editeng/brkitem.hxx>
44 #include <editeng/ulspitem.hxx>
45 #include <editeng/frmdiritem.hxx>
46 #include <svl/ctloptions.hxx>
47 #include <swmodule.hxx>
48 #include <fmtornt.hxx>
49 #include <fmtpdsc.hxx>
50 #include <fmtlsplt.hxx>
51 
52 #include <svtools/htmlcfg.hxx>
53 #include <fmtrowsplt.hxx>
54 #include <svx/htmlmode.hxx>
55 
56 #include "access.hrc"
57 
58 #ifndef _DOCSH_HXX
59 #include <docsh.hxx>
60 #endif
61 #include <wrtsh.hxx>
62 #ifndef _VIEW_HXX
63 #include <view.hxx>
64 #endif
65 #include <viewopt.hxx>
66 #include <uitool.hxx>
67 #include <frmatr.hxx>
68 #include <tabledlg.hxx>
69 #ifndef _TABLEPG_HXX
70 #include <tablepg.hxx>
71 #endif
72 #include <tablemgr.hxx>
73 #include <pagedesc.hxx>
74 #include <uiitems.hxx>
75 #include <poolfmt.hxx>
76 #include <SwStyleNameMapper.hxx>
77 
78 #ifndef _CMDID_H
79 #include <cmdid.h>
80 #endif
81 #ifndef _TABLEDLG_HRC
82 #include <tabledlg.hrc>
83 #endif
84 #ifndef _TABLE_HRC
85 #include <table.hrc>
86 #endif
87 #include <svx/svxids.hrc>
88 #include <svx/dialogs.hrc>
89 #include <svx/flagsdef.hxx>
90 #include <svx/svxdlg.hxx>
91 
92 using namespace ::com::sun::star;
93 
94 
95 #ifdef DEBUG_TBLDLG
96 void DbgTblRep(SwTableRep* pRep)
97 {
98 	DBG_ERROR(String(pRep->GetColCount()))
99 	DBG_ERROR(String(pRep->GetAllColCount()))
100 	SwTwips nSum = 0;
101 	for(sal_uInt16 i = 0; i < pRep->GetAllColCount(); i++)
102 	{
103 		String sMsg(i);
104 		sMsg += pRep->GetColumns()[i].bVisible ? " v " : " h ";
105 		sMsg += pRep->GetColumns()[i].nWidth;
106 		nSum +=pRep->GetColumns()[i].nWidth;
107 		DBG_ERROR(sMsg)
108 	}
109 	String sMsg("Spaltensumme: ");
110 	sMsg += nSum;
111 	sMsg += " Tblbreite: ";
112 	sMsg += pRep->GetWidth();
113 	DBG_ERROR(sMsg)
114 	sMsg = "Gesamt/Links/Rechts: ";
115 	sMsg += pRep->GetSpace();
116 	sMsg += '/';
117 	sMsg += pRep->GetLeftSpace();
118 	sMsg += '/';
119 	sMsg += pRep->GetRightSpace();
120 	DBG_ERROR(sMsg)
121 	sMsg = "Align: ";
122 	sMsg += pRep->GetAlign();
123 	DBG_ERROR(sMsg)
124 
125 };
126 
127 #endif
128 
129 
130 SwFormatTablePage::SwFormatTablePage( Window* pParent, const SfxItemSet& rSet ) :
131 	SfxTabPage(pParent, SW_RES( TP_FORMAT_TABLE ), rSet ),
132     aOptionsFL(this,    SW_RES( FL_OPTIONS )),
133 	aNameFT(this,		SW_RES( FT_NAME )),
134 	aNameED(this,		SW_RES( ED_NAME )),
135 	aWidthFT(this,		SW_RES( FT_WIDTH )),
136 	aWidthMF(this,		SW_RES( ED_WIDTH )),
137 	aRelWidthCB(this, 	SW_RES( CB_REL_WIDTH )),
138 
139     aPosFL(this,       SW_RES( FL_POS )),
140     aFullBtn(this,      SW_RES( RB_FULL )),
141     aLeftBtn(this,      SW_RES( RB_LEFT )),
142     aFromLeftBtn(this,  SW_RES( RB_FROM_LEFT )),
143     aRightBtn(this,     SW_RES( RB_RIGHT )),
144     aCenterBtn(this,    SW_RES( RB_CENTER )),
145     aFreeBtn(this,      SW_RES( RB_FREE )),
146 
147     aDistFL(this,       SW_RES( FL_DIST )),
148     aLeftFT(this,       SW_RES( FT_LEFT_DIST )),
149 	aLeftMF(this,		SW_RES( ED_LEFT_DIST )),
150 	aRightFT(this,		SW_RES( FT_RIGHT_DIST )),
151 	aRightMF(this,		SW_RES( ED_RIGHT_DIST )),
152 	aTopFT (this,		SW_RES( FT_TOP_DIST )),
153 	aTopMF(this,		SW_RES( ED_TOP_DIST )),
154 	aBottomFT(this,		SW_RES( FT_BOTTOM_DIST )),
155 	aBottomMF(this,		SW_RES( ED_BOTTOM_DIST )),
156 
157     aPropertiesFL(this,     SW_RES( FL_PROPERTIES    )),
158     aTextDirectionFT(this,  SW_RES( FT_TEXTDIRECTION )),
159     aTextDirectionLB(this,  SW_RES( LB_TEXTDIRECTION )),
160 
161     pTblData(0),
162 	nSaveWidth(0),
163 	nMinTableWidth(MINLAY),
164 	bModified(sal_False),
165     bFull(0),
166     bHtmlMode(sal_False)
167 {
168 	FreeResource();
169 	SetExchangeSupport();
170 
171     const SfxPoolItem* pItem;
172     if(SFX_ITEM_SET == rSet.GetItemState(SID_HTML_MODE, sal_False, &pItem))
173         bHtmlMode = 0 != (((const SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON);
174 
175     sal_Bool bCTL = SW_MOD()->GetCTLOptions().IsCTLFontEnabled();
176     if( !bHtmlMode && bCTL )
177     {
178         aPropertiesFL.Show();
179         aTextDirectionFT.Show();
180         aTextDirectionLB.Show();
181     }
182 
183     Init();
184 }
185 
186 /*------------------------------------------------------------------------
187 ------------------------------------------------------------------------*/
188 void  SwFormatTablePage::Init()
189 {
190 	aLeftMF.MetricField::SetMin(-999999);
191 	aRightMF.MetricField::SetMin(-999999);
192 
193 	// handler
194 	Link aLk = LINK( this, SwFormatTablePage, AutoClickHdl );
195 	aFullBtn.SetClickHdl( aLk );
196 	aFreeBtn.SetClickHdl( aLk );
197 	aLeftBtn.SetClickHdl( aLk );
198 	aFromLeftBtn.SetClickHdl( aLk );
199 	aRightBtn.SetClickHdl( aLk );
200 	aCenterBtn.SetClickHdl( aLk );
201 
202     aLk = LINK( this, SwFormatTablePage, UpDownLoseFocusHdl );
203 	aTopMF.SetUpHdl( aLk );
204 	aBottomMF.SetUpHdl( aLk );
205 	aRightMF.SetUpHdl( aLk );
206 	aLeftMF.SetUpHdl( aLk );
207 	aWidthMF.SetUpHdl( aLk );
208 
209     aTopMF.SetDownHdl( aLk );
210 	aBottomMF.SetDownHdl( aLk );
211 	aRightMF.SetDownHdl( aLk );
212 	aLeftMF.SetDownHdl( aLk );
213 	aWidthMF.SetDownHdl( aLk );
214 
215 	aTopMF.SetLoseFocusHdl( aLk );
216 	aBottomMF.SetLoseFocusHdl( aLk );
217 	aRightMF.SetLoseFocusHdl( aLk );
218 	aLeftMF.SetLoseFocusHdl( aLk );
219 	aWidthMF.SetLoseFocusHdl( aLk );
220 
221 	aRelWidthCB.SetClickHdl(LINK( this, SwFormatTablePage, RelWidthClickHdl ));
222 }
223 
224 /*------------------------------------------------------------------------*/
225 
226 IMPL_LINK( SwFormatTablePage, RelWidthClickHdl, CheckBox *, pBtn )
227 {
228 	DBG_ASSERT(pTblData, "Tabellendaten nicht da?");
229 	sal_Bool bIsChecked = pBtn->IsChecked();
230     sal_Int64 nLeft  = aLeftMF.DenormalizePercent(aLeftMF.GetValue(FUNIT_TWIP ));
231     sal_Int64 nRight = aRightMF.DenormalizePercent(aRightMF.GetValue(FUNIT_TWIP ));
232 	aWidthMF.ShowPercent(bIsChecked);
233 	aLeftMF.ShowPercent(bIsChecked);
234 	aRightMF.ShowPercent(bIsChecked);
235 
236 	if (bIsChecked)
237 	{
238 		aWidthMF.SetRefValue(pTblData->GetSpace());
239 		aLeftMF.SetRefValue(pTblData->GetSpace());
240 		aRightMF.SetRefValue(pTblData->GetSpace());
241 		aLeftMF.MetricField::SetMin(0); // wird vom Percentfield ueberschrieben
242 		aRightMF.MetricField::SetMin(0);//                 -""-
243         aLeftMF.MetricField::SetMax(99); //
244         aRightMF.MetricField::SetMax(99);//
245         aLeftMF.SetPrcntValue(aLeftMF.NormalizePercent(nLeft ), FUNIT_TWIP );
246         aRightMF.SetPrcntValue(aRightMF.NormalizePercent(nRight ), FUNIT_TWIP );
247 	}
248 	else
249 		ModifyHdl(&aLeftMF);	// Werte wieder korrigieren
250 
251 	if(aFreeBtn.IsChecked())
252 	{
253 		sal_Bool bEnable = !pBtn->IsChecked();
254 		aRightMF.Enable(bEnable);
255 		aRightFT.Enable(bEnable);
256 	}
257 	bModified = sal_True;
258 
259 	return 0;
260 }
261 
262 /*------------------------------------------------------------------------
263 ------------------------------------------------------------------------*/
264 IMPL_LINK( SwFormatTablePage, AutoClickHdl, CheckBox *, pBox )
265 {
266 	sal_Bool bRestore = sal_True,
267 		 bLeftEnable = sal_False,
268 		 bRightEnable= sal_False,
269 		 bWidthEnable= sal_False,
270 		 bOthers = sal_True;
271 	if( (RadioButton *) pBox == &aFullBtn )
272 	{
273         aLeftMF.SetPrcntValue(0);
274         aRightMF.SetPrcntValue(0);
275         nSaveWidth = static_cast< SwTwips >(aWidthMF.DenormalizePercent(aWidthMF.GetValue(FUNIT_TWIP )));
276         aWidthMF.SetPrcntValue(aWidthMF.NormalizePercent(pTblData->GetSpace() ), FUNIT_TWIP );
277 		bFull = sal_True;
278 		bRestore = sal_False;
279 	}
280 	else if( (RadioButton *) pBox == &aLeftBtn )
281 	{
282 		bRightEnable = bWidthEnable = sal_True;
283         aLeftMF.SetPrcntValue(0);
284 	}
285 	else if( (RadioButton *) pBox == &aFromLeftBtn )
286 	{
287 		bLeftEnable = bWidthEnable = sal_True;
288         aRightMF.SetPrcntValue(0);
289 	}
290 	else if( (RadioButton *) pBox == &aRightBtn )
291 	{
292 		bLeftEnable = bWidthEnable = sal_True;
293         aRightMF.SetPrcntValue(0);
294 	}
295 	else if( ( RadioButton * ) pBox == &aCenterBtn )
296 	{
297 		bLeftEnable = bWidthEnable = sal_True;
298 	}
299 	else if( ( RadioButton * ) pBox == &aFreeBtn )
300 	{
301 		RightModifyHdl(&aRightMF);
302 		bLeftEnable = sal_True;
303 		bWidthEnable = sal_True;
304 		bOthers = sal_False;
305 	}
306 	aLeftMF.Enable(bLeftEnable);
307 	aLeftFT.Enable(bLeftEnable);
308 	aWidthMF.Enable(bWidthEnable);
309 	aWidthFT.Enable(bWidthEnable);
310 	if ( bOthers )
311 	{
312 		aRightMF.Enable(bRightEnable);
313 		aRightFT.Enable(bRightEnable);
314 		aRelWidthCB.Enable(bWidthEnable);
315 	}
316 
317 	if(bFull && bRestore)
318 	{
319 		// nachdem auf autom. geschaltet wurde, wurde die Breite gemerkt,
320 		// um sie beim Zurueckschalten restaurieren zu koennen
321 		bFull = sal_False;
322         aWidthMF.SetPrcntValue(aWidthMF.NormalizePercent(nSaveWidth ), FUNIT_TWIP );
323 	}
324 	ModifyHdl(&aWidthMF);
325 	bModified = sal_True;
326 	return 0;
327 }
328 
329 /*----------------------------------------------------------------------*/
330 IMPL_LINK( SwFormatTablePage, RightModifyHdl, MetricField *, EMPTYARG )
331 {
332 	if(aFreeBtn.IsChecked())
333 	{
334 		sal_Bool bEnable = aRightMF.GetValue() == 0;
335 //		aWidthMF.Enable(bEnable);
336 		aRelWidthCB.Enable(bEnable);
337 //		aWidthFT.Enable(bEnable);
338 		if ( !bEnable )
339 		{
340 			aRelWidthCB.Check(sal_False);
341 			RelWidthClickHdl(&aRelWidthCB);
342 		}
343 		bEnable = aRelWidthCB.IsChecked();
344 		aRightMF.Enable(!bEnable);
345 		aRightFT.Enable(!bEnable);
346 	}
347 	return 0;
348 }
349 
350 /*------------------------------------------------------------------------
351 ------------------------------------------------------------------------*/
352 IMPL_LINK_INLINE_START( SwFormatTablePage, UpDownLoseFocusHdl, MetricField *, pEdit )
353 {
354     if( &aRightMF == pEdit)
355         RightModifyHdl(pEdit);
356     ModifyHdl( pEdit );
357 	return 0;
358 }
359 IMPL_LINK_INLINE_END( SwFormatTablePage, UpDownLoseFocusHdl, MetricField *, pEdit )
360 
361 void  SwFormatTablePage::ModifyHdl( Edit* pEdit )
362 {
363 
364     SwTwips nCurWidth  = static_cast< SwTwips >(aWidthMF.DenormalizePercent(aWidthMF.GetValue( FUNIT_TWIP )));
365 	SwTwips nPrevWidth = nCurWidth;
366     SwTwips nRight = static_cast< SwTwips >(aRightMF.DenormalizePercent(aRightMF.GetValue( FUNIT_TWIP )));
367     SwTwips nLeft  = static_cast< SwTwips >(aLeftMF.DenormalizePercent(aLeftMF.GetValue( FUNIT_TWIP )));
368 	SwTwips nDiff;
369 
370 	if( pEdit == &aWidthMF )
371 	{
372 		if( nCurWidth < MINLAY )
373 			nCurWidth = MINLAY;
374 		nDiff = nRight + nLeft + nCurWidth - pTblData->GetSpace() ;
375 		//rechtsbuendig nur linken Rand veraendern
376 		if(aRightBtn.IsChecked())
377 			nLeft -= nDiff;
378 		//linksbuendig nur rechten Rand veraendern
379 		else if(aLeftBtn.IsChecked())
380 			nRight -= nDiff;
381 		//linker Rand und Breite erlaubt - erst rechts - dann links
382 		else if(aFromLeftBtn.IsChecked())
383 		{
384 			if( nRight >= nDiff )
385 				nRight -= nDiff;
386 			else
387 			{
388 				nDiff -= nRight;
389 				nRight = 0;
390 				if(nLeft >= nDiff)
391 					nLeft -= nDiff;
392 				else
393 				{
394 					nRight += nLeft - nDiff;
395 					nLeft = 0;
396 					nCurWidth = pTblData->GetSpace();
397 				}
398 
399 			}
400 		}
401 		//zentriert beide Seiten gleichmaessig veraendern
402 		else if(aCenterBtn.IsChecked())
403 		{
404 			if((nLeft != nRight))
405 			{
406 				nDiff += nLeft + nRight;
407 				nLeft = nDiff/2;
408 				nRight = nDiff/2;
409 			}
410 			else
411 			{
412 					nLeft -= nDiff/2;
413 					nRight -= nDiff/2;
414 			}
415 		}
416 		//freie Ausrichtung: beide Raender verkleinern
417 		else if(aFreeBtn.IsChecked())
418 		{
419 			nLeft -= nDiff/2;
420 			nRight -= nDiff/2;
421 		}
422 	}
423 	if( pEdit == &aRightMF	)
424 	{
425 
426 		if( nRight + nLeft > pTblData->GetSpace() - MINLAY )
427 			nRight = pTblData->GetSpace() -nLeft - MINLAY;
428 
429 		nCurWidth = pTblData->GetSpace() - nLeft - nRight;
430 	}
431 	if( pEdit == &aLeftMF )
432 	{
433 		if(!aFromLeftBtn.IsChecked())
434 		{
435 			sal_Bool bCenter = aCenterBtn.IsChecked();
436 			if( bCenter )
437 				nRight = nLeft;
438 			if(nRight + nLeft > pTblData->GetSpace() - MINLAY )
439 			{
440 				nLeft  = bCenter ? 	(pTblData->GetSpace() - MINLAY) /2 :
441 									(pTblData->GetSpace() - MINLAY) - nRight;
442 				nRight = bCenter ? 	(pTblData->GetSpace() - MINLAY) /2 : nRight;
443 			}
444 			nCurWidth = pTblData->GetSpace() - nLeft - nRight;
445 		}
446 		else
447 		{
448 			//hier wird bei Aenderung an der linken Seite zuerst der
449 			//rechte Rand veraendert, dann die Breite
450 			nDiff = nRight + nLeft + nCurWidth - pTblData->GetSpace() ;
451 
452 			nRight -= nDiff;
453 			nCurWidth = pTblData->GetSpace() - nLeft - nRight;
454 		}
455 	}
456 	if (nCurWidth != nPrevWidth )
457         aWidthMF.SetPrcntValue( aWidthMF.NormalizePercent( nCurWidth ), FUNIT_TWIP );
458     aRightMF.SetPrcntValue( aRightMF.NormalizePercent( nRight ), FUNIT_TWIP );
459     aLeftMF.SetPrcntValue( aLeftMF.NormalizePercent( nLeft ), FUNIT_TWIP );
460 	bModified = sal_True;
461 }
462 
463 /*------------------------------------------------------------------------
464 ------------------------------------------------------------------------*/
465 SfxTabPage*  SwFormatTablePage::Create( Window* pParent,
466 								   const SfxItemSet& rAttrSet)
467 {
468 	return new SwFormatTablePage( pParent, rAttrSet );
469 }
470 
471 /*------------------------------------------------------------------------
472 -------------------------------------------------------------------------*/
473 sal_Bool  SwFormatTablePage::FillItemSet( SfxItemSet& rCoreSet )
474 {
475 	// Testen, ob eins der Control noch den Focus hat
476 	if(aWidthMF.HasFocus())
477 		ModifyHdl(&aWidthMF);
478 	else if(aLeftMF.HasFocus())
479 		ModifyHdl(&aLeftMF);
480 	else if(aRightMF.HasFocus())
481 		ModifyHdl(&aRightMF);
482 	else if(aTopMF.HasFocus())
483 		ModifyHdl(&aTopMF);
484 	else if(aBottomMF.HasFocus())
485 		ModifyHdl(&aBottomMF);
486 
487 	if(bModified)
488 	{
489 		if( aBottomMF.GetText() != aBottomMF.GetSavedValue() ||
490 									aTopMF.GetText() != aTopMF.GetSavedValue() )
491 		{
492 			SvxULSpaceItem aULSpace(RES_UL_SPACE);
493 			aULSpace.SetUpper( (sal_uInt16) aTopMF.Denormalize(
494 										aTopMF.GetValue( FUNIT_TWIP )));
495 			aULSpace.SetLower( (sal_uInt16) aBottomMF.Denormalize(
496 										aBottomMF.GetValue( FUNIT_TWIP )));
497 			rCoreSet.Put(aULSpace);
498 		}
499 
500 	}
501 	if(aNameED.GetText() != aNameED.GetSavedValue())
502 	{
503 		rCoreSet.Put(SfxStringItem(	FN_PARAM_TABLE_NAME, aNameED.GetText()));
504 		bModified = sal_True;
505 	}
506 
507     sal_uInt16 nPos;
508     if( aTextDirectionLB.IsVisible() &&
509         ( nPos = aTextDirectionLB.GetSelectEntryPos() ) !=
510                                             aTextDirectionLB.GetSavedValue() )
511 	{
512         sal_uInt32 nDirection = (sal_uInt32)(sal_uIntPtr)aTextDirectionLB.GetEntryData( nPos );
513         rCoreSet.Put( SvxFrameDirectionItem( (SvxFrameDirection)nDirection, RES_FRAMEDIR));
514 		bModified = sal_True;
515 	}
516 
517     return bModified;
518 }
519 
520 /*------------------------------------------------------------------------
521 ------------------------------------------------------------------------*/
522 void  SwFormatTablePage::Reset( const SfxItemSet& )
523 {
524 	const SfxItemSet& rSet = GetItemSet();
525 	const SfxPoolItem*	pItem;
526 
527     if(bHtmlMode)
528 	{
529 		aNameED	.Disable();
530 		aTopFT	.Hide();
531 		aTopMF	.Hide();
532 		aBottomFT.Hide();
533 		aBottomMF.Hide();
534 		aFreeBtn.Enable(sal_False);
535 	}
536 	FieldUnit aMetric = ::GetDfltMetric(bHtmlMode);
537 	SetMetric( aWidthMF, aMetric );
538 	SetMetric( aRightMF, aMetric );
539 	SetMetric( aLeftMF, aMetric );
540 	SetMetric( aTopMF, aMetric );
541 	SetMetric( aBottomMF, aMetric );
542 
543 	//Name
544 	if(SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_TABLE_NAME, sal_False, &pItem ))
545 	{
546 		aNameED.SetText(((const SfxStringItem*)pItem)->GetValue());
547 		aNameED.SaveValue();
548 	}
549 
550 	if(SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_REP, sal_False, &pItem ))
551 	{
552 		pTblData = (SwTableRep*)((const SwPtrItem*) pItem)->GetValue();
553 		nMinTableWidth = pTblData->GetColCount() * MINLAY;
554 
555 		if(pTblData->GetWidthPercent())
556 		{
557 			aRelWidthCB.Check(sal_True);
558 			RelWidthClickHdl(&aRelWidthCB);
559             aWidthMF.SetPrcntValue(pTblData->GetWidthPercent(), FUNIT_CUSTOM);
560 
561 			aWidthMF.SaveValue();
562             nSaveWidth = static_cast< SwTwips >(aWidthMF.GetValue(FUNIT_CUSTOM));
563 		}
564 		else
565 		{
566             aWidthMF.SetPrcntValue(aWidthMF.NormalizePercent(
567 					pTblData->GetWidth()), FUNIT_TWIP);
568 			aWidthMF.SaveValue();
569 			nSaveWidth = pTblData->GetWidth();
570 			nMinTableWidth = Min( nSaveWidth, nMinTableWidth );
571 		}
572 
573 		aWidthMF.SetRefValue(pTblData->GetSpace());
574 		aWidthMF.SetLast(aWidthMF.NormalizePercent( pTblData->GetSpace() ));
575 		aLeftMF.SetLast(aLeftMF.NormalizePercent( pTblData->GetSpace() ));
576 		aRightMF.SetLast(aRightMF.NormalizePercent( pTblData->GetSpace() ));
577 
578         aLeftMF.SetPrcntValue(aLeftMF.NormalizePercent(
579 					pTblData->GetLeftSpace()), FUNIT_TWIP);
580         aRightMF.SetPrcntValue(aRightMF.NormalizePercent(
581 					pTblData->GetRightSpace()), FUNIT_TWIP);
582 		aLeftMF.SaveValue();
583 		aRightMF.SaveValue();
584 
585 		nOldAlign = pTblData->GetAlign();
586 
587 		sal_Bool bSetRight = sal_False, bRightEnable = sal_False,
588 			 bSetLeft  = sal_False, bLeftEnable  = sal_False;
589 		switch( nOldAlign )
590 		{
591             case text::HoriOrientation::NONE:
592 				aFreeBtn.Check();
593 				if(aRelWidthCB.IsChecked())
594 					bSetRight = sal_True;
595 			break;
596             case text::HoriOrientation::FULL:
597 			{
598 				bSetRight = bSetLeft = sal_True;
599 				aFullBtn.Check();
600 				aWidthMF.Enable(sal_False);
601 				aRelWidthCB.Enable(sal_False);
602 				aWidthFT.Enable(sal_False);
603 			}
604 			break;
605             case text::HoriOrientation::LEFT:
606 			{
607 				bSetLeft = sal_True;
608 				aLeftBtn.Check();
609 			}
610 			break;
611             case text::HoriOrientation::LEFT_AND_WIDTH :
612 			{
613 				bSetRight = sal_True;
614 				aFromLeftBtn.Check();
615 			}
616 			break;
617             case text::HoriOrientation::RIGHT:
618 			{
619 				bSetRight = sal_True;
620 				aRightBtn.Check();
621 			}
622 			break;
623             case text::HoriOrientation::CENTER:
624 			{
625 				bSetRight = sal_True;
626 				aCenterBtn.Check();
627 			}
628 			break;
629 		}
630 		if ( bSetRight )
631 		{
632 			aRightMF.Enable(bRightEnable);
633 			aRightFT.Enable(bRightEnable);
634 		}
635 		if ( bSetLeft )
636 		{
637 			aLeftMF.Enable(bLeftEnable);
638 			aLeftFT.Enable(bLeftEnable);
639 		}
640 
641 	}
642 
643 	//Raender
644 	if(SFX_ITEM_SET == rSet.GetItemState( RES_UL_SPACE, sal_False,&pItem ))
645 	{
646 		aTopMF.SetValue(aTopMF.Normalize(
647 						((const SvxULSpaceItem*)pItem)->GetUpper()), FUNIT_TWIP);
648 		aBottomMF.SetValue(aBottomMF.Normalize(
649 						((const SvxULSpaceItem*)pItem)->GetLower()), FUNIT_TWIP);
650 		aTopMF.SaveValue();
651 		aBottomMF.SaveValue();
652 	}
653 
654     //text direction
655     if( SFX_ITEM_SET == rSet.GetItemState( RES_FRAMEDIR, sal_True, &pItem ) )
656 	{
657         sal_uInt32 nVal  = ((SvxFrameDirectionItem*)pItem)->GetValue();
658         sal_uInt16 nPos = aTextDirectionLB.GetEntryPos( (void*) nVal );
659         aTextDirectionLB.SelectEntryPos( nPos );
660         aTextDirectionLB.SaveValue();
661 	}
662 
663     aWidthMF.SetMax( 2*aWidthMF.NormalizePercent( pTblData->GetSpace() ), FUNIT_TWIP );
664 	aRightMF.SetMax( aRightMF.NormalizePercent( pTblData->GetSpace() ), FUNIT_TWIP );
665 	aLeftMF.SetMax( aLeftMF.NormalizePercent( pTblData->GetSpace() ), FUNIT_TWIP );
666 	aWidthMF.SetMin( aWidthMF.NormalizePercent( nMinTableWidth ), FUNIT_TWIP );
667 
668 }
669 
670 /*------------------------------------------------------------------------
671 ------------------------------------------------------------------------*/
672 void  	SwFormatTablePage::ActivatePage( const SfxItemSet& rSet )
673 {
674 	DBG_ASSERT(pTblData, "Tabellendaten nicht da?");
675 	if(SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_REP ))
676 	{
677         SwTwips nCurWidth = text::HoriOrientation::FULL != pTblData->GetAlign() ?
678 										pTblData->GetWidth() :
679 											pTblData->GetSpace();
680 		if(pTblData->GetWidthPercent() == 0 &&
681 				nCurWidth != aWidthMF.DenormalizePercent(aWidthMF.GetValue(FUNIT_TWIP )))
682 		{
683             aWidthMF.SetPrcntValue(aWidthMF.NormalizePercent(
684 							nCurWidth), FUNIT_TWIP);
685 			aWidthMF.SaveValue();
686 			nSaveWidth = nCurWidth;
687             aLeftMF.SetPrcntValue(aLeftMF.NormalizePercent(
688 							pTblData->GetLeftSpace()), FUNIT_TWIP);
689 			aLeftMF.SaveValue();
690             aRightMF.SetPrcntValue(aRightMF.NormalizePercent(
691 							pTblData->GetRightSpace()), FUNIT_TWIP);
692 			aRightMF.SaveValue();
693 		}
694 	}
695 
696 }
697 /*------------------------------------------------------------------------
698 ------------------------------------------------------------------------*/
699 int  SwFormatTablePage::DeactivatePage( SfxItemSet* _pSet )
700 {
701 	// os: VCL sorgt nicht dafuer, dass das aktive Control im
702 	// dialog bei OK den focus verliert
703 	aNameED.GrabFocus();
704 	// Test des Tabellennamens auf Leerzeichen
705 	String sTblName = aNameED.GetText();
706 	if(sTblName.Search(' ') != STRING_NOTFOUND)
707 	{
708 		InfoBox(this, SW_RES(MSG_WRONG_TABLENAME)).Execute();
709 		aNameED.GrabFocus();
710 		return KEEP_PAGE;
711 	}
712     if(_pSet)
713 	{
714         FillItemSet(*_pSet);
715 		if(bModified)
716 		{
717             SwTwips lLeft  = static_cast< SwTwips >(aLeftMF.DenormalizePercent(aLeftMF.GetValue( FUNIT_TWIP )));
718             SwTwips lRight = static_cast< SwTwips >(aRightMF.DenormalizePercent(aRightMF.GetValue( FUNIT_TWIP )));
719 
720 
721 			if( aLeftMF.GetText() != aLeftMF.GetSavedValue() ||
722 									aRightMF.GetText() != aRightMF.GetSavedValue() )
723 			{
724 				pTblData->SetWidthChanged();
725 				pTblData->SetLeftSpace( lLeft);
726 				pTblData->SetRightSpace( lRight);
727 			}
728 
729 			SwTwips lWidth;
730 			if (aRelWidthCB.IsChecked() && aRelWidthCB.IsEnabled())
731 			{
732 				lWidth = pTblData->GetSpace() - lRight - lLeft;
733 				sal_uInt16 nPercentWidth = (sal_uInt16)aWidthMF.GetValue(FUNIT_CUSTOM);
734 				if(pTblData->GetWidthPercent() != nPercentWidth)
735 				{
736 					pTblData->SetWidthPercent(nPercentWidth);
737 					pTblData->SetWidthChanged();
738 				}
739 			}
740 			else
741 			{
742 				pTblData->SetWidthPercent(0);
743                 lWidth = static_cast< SwTwips >(aWidthMF.DenormalizePercent(aWidthMF.GetValue( FUNIT_TWIP )));
744 			}
745 			pTblData->SetWidth(lWidth);
746 
747 			SwTwips nColSum = 0;
748 			sal_uInt16 i;
749 
750 			for( i = 0; i < pTblData->GetColCount(); i++)
751 			{
752 				nColSum += pTblData->GetColumns()[i].nWidth;
753 			}
754 			if(nColSum != pTblData->GetWidth())
755 			{
756 				SwTwips nMinWidth = Min( (long)MINLAY,
757 									(long) (pTblData->GetWidth() /
758 											pTblData->GetColCount() - 1));
759 				SwTwips nDiff = nColSum - pTblData->GetWidth();
760 				while ( Abs(nDiff) > pTblData->GetColCount() + 1 )
761 				{
762 					SwTwips nSub = nDiff / pTblData->GetColCount();
763 					for( i = 0; i < pTblData->GetColCount(); i++)
764 					{
765 						if(pTblData->GetColumns()[i].nWidth - nMinWidth > nSub)
766 						{
767 							pTblData->GetColumns()[i].nWidth -= nSub;
768 							nDiff -= nSub;
769 						}
770 						else
771 						{
772 							nDiff -= pTblData->GetColumns()[i].nWidth - nMinWidth;
773 							pTblData->GetColumns()[i].nWidth = nMinWidth;
774 						}
775 
776 					}
777 				}
778 			}
779 
780             sal_Int16 nAlign = 0;
781 			if(aRightBtn.IsChecked())
782                 nAlign = text::HoriOrientation::RIGHT;
783 			else if(aLeftBtn.IsChecked())
784                 nAlign = text::HoriOrientation::LEFT;
785 			else if(aFromLeftBtn.IsChecked())
786                 nAlign = text::HoriOrientation::LEFT_AND_WIDTH;
787 			else if(aCenterBtn.IsChecked())
788                 nAlign = text::HoriOrientation::CENTER;
789 			else if(aFreeBtn.IsChecked())
790                 nAlign = text::HoriOrientation::NONE;
791 			else if(aFullBtn.IsChecked())
792 			{
793                 nAlign = text::HoriOrientation::FULL;
794 				lWidth = lAutoWidth;
795 			}
796 			if(nAlign != pTblData->GetAlign())
797 			{
798 				pTblData->SetWidthChanged();
799 				pTblData->SetAlign(nAlign);
800 			}
801 
802 
803     //      if(  text::HoriOrientation::CENTER && lWidth != (SwTwips)aWidthMF.GetSavedValue())
804 			if(pTblData->GetWidth() != lWidth )
805 			{
806 				pTblData->SetWidthChanged();
807 				pTblData->SetWidth(
808                     nAlign == text::HoriOrientation::FULL ? pTblData->GetSpace() : lWidth );
809 			}
810 			if(pTblData->HasWidthChanged())
811                 _pSet->Put(SwPtrItem(FN_TABLE_REP, pTblData));
812 		}
813 #ifdef DEBUG_TBLDLG
814 DbgTblRep(pTblData)
815 #endif
816 	}
817 	return sal_True;
818 }
819 /*------------------------------------------------------------------------
820 	Beschreibung: Seite Spaltenkonfiguration
821 ------------------------------------------------------------------------*/
822 SwTableColumnPage::SwTableColumnPage( Window* pParent,
823 			const SfxItemSet& rSet ) :
824 	SfxTabPage(pParent, SW_RES( TP_TABLE_COLUMN ), rSet ),
825 	aModifyTableCB(this,	SW_RES(CB_MOD_TBL)),
826 	aProportionalCB(this,	SW_RES(CB_PROP)),
827 	aSpaceFT(this,			SW_RES(FT_SPACE)),
828 	aSpaceED(this,			SW_RES(ED_SPACE)),
829 
830     aColFL(this,            SW_RES(COL_FL_LAYOUT)),
831     aUpBtn(this,            SW_RES(COL_BTN_UP)),
832     aFT1(this,              SW_RES(COL_FT_1)),
833 	aMF1(this,				SW_RES(COL_MF_1)),
834 	aFT2(this,				SW_RES(COL_FT_2)),
835 	aMF2(this,				SW_RES(COL_MF_2)),
836 	aFT3(this,				SW_RES(COL_FT_3)),
837 	aMF3(this,				SW_RES(COL_MF_3)),
838 	aFT4(this,				SW_RES(COL_FT_4)),
839 	aMF4(this,				SW_RES(COL_MF_4)),
840 	aFT5(this,				SW_RES(COL_FT_5)),
841 	aMF5(this,				SW_RES(COL_MF_5)),
842 	aFT6(this,				SW_RES(COL_FT_6)),
843 	aMF6(this,				SW_RES(COL_MF_6)),
844     aDownBtn(this,          SW_RES(COL_BTN_DOWN)),
845 
846     nTableWidth(0),
847     nMinWidth( MINLAY ),
848     nNoOfCols( 0 ),
849 	nNoOfVisibleCols( 0 ),
850 	bModified(sal_False),
851 	bModifyTbl(sal_False),
852     bPercentMode(sal_False)
853 {
854 	FreeResource();
855 	SetExchangeSupport();
856 
857 	aDownBtn.SetAccessibleRelationMemberOf(&aColFL);
858 	aUpBtn.SetAccessibleRelationMemberOf(&aColFL);
859 
860 	pFieldArr[0] = &aMF1;
861 	pFieldArr[1] = &aMF2;
862 	pFieldArr[2] = &aMF3;
863 	pFieldArr[3] = &aMF4;
864 	pFieldArr[4] = &aMF5;
865 	pFieldArr[5] = &aMF6;
866 
867 	pTextArr[0] = &aFT1;
868 	pTextArr[1] = &aFT2;
869 	pTextArr[2] = &aFT3;
870 	pTextArr[3] = &aFT4;
871 	pTextArr[4] = &aFT5;
872 	pTextArr[5] = &aFT6;
873 
874 	const SfxPoolItem* pItem;
875 	Init((SFX_ITEM_SET == rSet.GetItemState( SID_HTML_MODE, sal_False,&pItem )
876 		&& ((const SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON));
877 
878 };
879 /*------------------------------------------------------------------------
880 	Beschreibung: Seite Spaltenkonfiguration
881 ------------------------------------------------------------------------*/
882  SwTableColumnPage::~SwTableColumnPage()
883 {
884 };
885 
886 /*------------------------------------------------------------------------
887 ------------------------------------------------------------------------*/
888 SfxTabPage*   SwTableColumnPage::Create( Window* pParent,
889 								const SfxItemSet& rAttrSet)
890 {
891 	return new SwTableColumnPage( pParent, rAttrSet );
892 };
893 
894 /*------------------------------------------------------------------------
895 ------------------------------------------------------------------------*/
896 void  SwTableColumnPage::Reset( const SfxItemSet& )
897 {
898 	const SfxItemSet& rSet = GetItemSet();
899 
900 	const SfxPoolItem* pItem;
901 	if(SFX_ITEM_SET == rSet.GetItemState( FN_TABLE_REP, sal_False, &pItem ))
902 	{
903 		pTblData = (SwTableRep*)((const SwPtrItem*) pItem)->GetValue();
904 		nNoOfVisibleCols = pTblData->GetColCount();
905 		nNoOfCols = pTblData->GetAllColCount();
906         nTableWidth = pTblData->GetAlign() != text::HoriOrientation::FULL &&
907                             pTblData->GetAlign() != text::HoriOrientation::LEFT_AND_WIDTH?
908 						pTblData->GetWidth() : pTblData->GetSpace();
909 
910 		sal_uInt16 i;
911 		for( i = 0; i < nNoOfCols; i++ )
912 		{
913 			if( pTblData->GetColumns()[i].nWidth  < nMinWidth )
914 					nMinWidth = pTblData->GetColumns()[i].nWidth;
915 		}
916         sal_Int64 nMinTwips = pFieldArr[0]->NormalizePercent( nMinWidth );
917         sal_Int64 nMaxTwips = pFieldArr[0]->NormalizePercent( nTableWidth );
918 		for( i = 0; (i < MET_FIELDS) && (i < nNoOfVisibleCols); i++ )
919 		{
920             pFieldArr[i]->SetPrcntValue( pFieldArr[i]->NormalizePercent(
921 												GetVisibleWidth(i) ), FUNIT_TWIP );
922 			pFieldArr[i]->SetMin( nMinTwips , FUNIT_TWIP );
923 			pFieldArr[i]->SetMax( nMaxTwips , FUNIT_TWIP );
924 			pFieldArr[i]->Enable();
925 			pTextArr[i]->Enable();
926 		}
927 
928 		if( nNoOfVisibleCols > MET_FIELDS )
929 			aUpBtn.Enable();
930 		i = nNoOfVisibleCols;
931 		while( i < MET_FIELDS )
932 		{
933 			pFieldArr[i]->SetText( aEmptyStr );
934 			pTextArr[i]->Hide();
935 			i++;
936 		}
937 	}
938 	ActivatePage(rSet);
939 
940 };
941 
942 /*------------------------------------------------------------------------
943 ------------------------------------------------------------------------*/
944 void  SwTableColumnPage::Init(sal_Bool bWeb)
945 {
946 	FieldUnit aMetric = ::GetDfltMetric(bWeb);
947 	Link aLkUp = LINK( this, SwTableColumnPage, UpHdl );
948 	Link aLkDown = LINK( this, SwTableColumnPage, DownHdl );
949 	Link aLkLF = LINK( this, SwTableColumnPage, LoseFocusHdl );
950 	for( sal_uInt16 i = 0; i < MET_FIELDS; i++ )
951 	{
952 		aValueTbl[i] = i;
953 		SetMetric(*pFieldArr[i], aMetric);
954 		pFieldArr[i]->SetUpHdl( aLkUp );
955 		pFieldArr[i]->SetDownHdl( aLkDown );
956 		pFieldArr[i]->SetLoseFocusHdl( aLkLF );
957 
958 	}
959 	SetMetric(aSpaceED, aMetric);
960 
961 	Link aLk = LINK( this, SwTableColumnPage, AutoClickHdl );
962 	aUpBtn.SetClickHdl( aLk );
963 	aDownBtn.SetClickHdl( aLk );
964 
965 	aLk = LINK( this, SwTableColumnPage, ModeHdl );
966 	aModifyTableCB .SetClickHdl( aLk );
967 	aProportionalCB.SetClickHdl( aLk );
968 };
969 
970 /*------------------------------------------------------------------------
971 ------------------------------------------------------------------------*/
972 IMPL_LINK( SwTableColumnPage, AutoClickHdl, CheckBox *, pBox )
973 {
974 	//Anzeigefenster verschieben
975 	if(pBox == (CheckBox *)&aDownBtn)
976 	{
977 		if(aValueTbl[0] > 0)
978 		{
979 			for( sal_uInt16 i=0; i < MET_FIELDS; i++ )
980 				aValueTbl[i] -= 1;
981 		}
982 	}
983 	if(pBox == (CheckBox *)&aUpBtn)
984 	{
985 		if( aValueTbl[ MET_FIELDS -1 ] < nNoOfVisibleCols -1  )
986 		{
987 			for(sal_uInt16 i=0;i < MET_FIELDS;i++)
988 				aValueTbl[i] += 1;
989 		}
990 	}
991 	for( sal_uInt16 i = 0; (i < nNoOfVisibleCols ) && ( i < MET_FIELDS); i++ )
992 	{
993 		String sEntry('~');
994 		String sIndex = String::CreateFromInt32( aValueTbl[i] + 1 );
995 		sEntry += sIndex;
996 		pTextArr[i]->SetText( sEntry );
997 //IAccessibility2 Impplementaton 2009-----
998 		//added by menghu for SODC_5143,12/12/2006
999 		String sColumnWidth = SW_RESSTR( STR_ACCESS_COLUMN_WIDTH);
1000 		sColumnWidth.SearchAndReplace( DEFINE_CONST_UNICODE("%1"), sIndex );
1001 		pFieldArr[i]->SetAccessibleName( sColumnWidth );
1002 		//end of SODC_5143
1003 //-----IAccessibility2 Impplementaton 2009
1004 	}
1005 
1006 	aDownBtn.Enable(aValueTbl[0] > 0);
1007 	aUpBtn.Enable(aValueTbl[ MET_FIELDS -1 ] < nNoOfVisibleCols -1 );
1008 	UpdateCols(0);
1009 	return 0;
1010 };
1011 
1012 /*------------------------------------------------------------------------
1013 ------------------------------------------------------------------------*/
1014 IMPL_LINK_INLINE_START( SwTableColumnPage, UpHdl, PercentField *, pEdit )
1015 {
1016 	bModified = sal_True;
1017 	ModifyHdl( pEdit );
1018 	return 0;
1019 };
1020 IMPL_LINK_INLINE_END( SwTableColumnPage, UpHdl, PercentField *, pEdit )
1021 
1022 /*------------------------------------------------------------------------
1023 ------------------------------------------------------------------------*/
1024 IMPL_LINK_INLINE_START( SwTableColumnPage, DownHdl, PercentField *, pEdit )
1025 {
1026 	bModified = sal_True;
1027 	ModifyHdl( pEdit );
1028 	return 0;
1029 };
1030 IMPL_LINK_INLINE_END( SwTableColumnPage, DownHdl, PercentField *, pEdit )
1031 
1032 /*------------------------------------------------------------------------
1033 ------------------------------------------------------------------------*/
1034 IMPL_LINK_INLINE_START( SwTableColumnPage, LoseFocusHdl, PercentField *, pEdit )
1035 {
1036 	if(pEdit->IsModified())
1037 	{
1038 		bModified = sal_True;
1039 		ModifyHdl( pEdit );
1040 	}
1041 	return 0;
1042 };
1043 IMPL_LINK_INLINE_END( SwTableColumnPage, LoseFocusHdl, PercentField *, pEdit )
1044 
1045 /*------------------------------------------------------------------------
1046 ------------------------------------------------------------------------*/
1047 IMPL_LINK( SwTableColumnPage, ModeHdl, CheckBox*, pBox )
1048 {
1049 	sal_Bool bCheck = pBox->IsChecked();
1050 	if(pBox == &aProportionalCB)
1051 	{
1052 		if(bCheck)
1053 			aModifyTableCB.Check();
1054 		aModifyTableCB.Enable(!bCheck && bModifyTbl);
1055 	}
1056 	return 0;
1057 };
1058 
1059 /*------------------------------------------------------------------------
1060 ------------------------------------------------------------------------*/
1061 sal_Bool  SwTableColumnPage::FillItemSet( SfxItemSet& )
1062 {
1063 	for( sal_uInt16 i = 0; i < MET_FIELDS; i++ )
1064 	{
1065 		if(pFieldArr[i]->HasFocus())
1066 		{
1067 			LoseFocusHdl(pFieldArr[i]);
1068 			break;
1069 		}
1070 	}
1071 
1072 	if(bModified)
1073 	{
1074 		pTblData->SetColsChanged();
1075 	}
1076 	return bModified;
1077 };
1078 
1079 /*------------------------------------------------------------------------
1080 ------------------------------------------------------------------------*/
1081 void   SwTableColumnPage::ModifyHdl( PercentField* pEdit )
1082 {
1083 		sal_uInt16 nAktPos;
1084 		sal_uInt16 i;
1085 
1086 		for( i = 0; i < MET_FIELDS; i++)
1087 			if(pEdit == pFieldArr[i])
1088 				break;
1089 
1090         SetVisibleWidth(aValueTbl[i], static_cast< SwTwips >(pEdit->DenormalizePercent(pEdit->GetValue( FUNIT_TWIP ))) );
1091 		nAktPos = aValueTbl[i];
1092 
1093 		UpdateCols( nAktPos );
1094 };
1095 
1096 /*------------------------------------------------------------------------
1097 ------------------------------------------------------------------------*/
1098 void   SwTableColumnPage::UpdateCols( sal_uInt16 nAktPos )
1099 {
1100 	SwTwips nSum = 0;
1101 	sal_uInt16 i;
1102 
1103 	for( i = 0; i < nNoOfCols; i++ )
1104 	{
1105 		nSum += (pTblData->GetColumns())[i].nWidth;
1106 	}
1107 	SwTwips nDiff = nSum - nTableWidth;
1108 
1109     sal_Bool bModifyTable = aModifyTableCB.IsChecked();
1110 	sal_Bool bProp =    aProportionalCB.IsChecked();
1111 
1112     if(!bModifyTable && !bProp )
1113 	{
1114 //		the table width is constant, the difference is balanced with the other columns
1115 		sal_uInt16 nLoopCount = 0;
1116 		while( nDiff )
1117 		{
1118 			if( ++nAktPos == nNoOfVisibleCols)
1119 			{
1120 				nAktPos = 0;
1121 				++nLoopCount;
1122 				//#i101353# in small tables it might not be possible to balance column width
1123 				if( nLoopCount > 1 )
1124 					break;
1125 			}
1126 			if( nDiff < 0 )
1127 			{
1128 				SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff);
1129 				nDiff = 0;
1130 			}
1131 			else if( GetVisibleWidth(nAktPos) >= nDiff + nMinWidth )
1132 			{
1133 				SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff);
1134 				nDiff = 0;
1135 			}
1136 			if( nDiff > 0 && GetVisibleWidth(nAktPos) > nMinWidth )
1137 			{
1138 				if( nDiff >= (GetVisibleWidth(nAktPos) - nMinWidth) )
1139 				{
1140 					nDiff -= (GetVisibleWidth(nAktPos) - nMinWidth);
1141 					SetVisibleWidth(nAktPos, nMinWidth);
1142 				}
1143 				else
1144 				{
1145 					nDiff = 0;
1146 					SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) -nDiff);
1147 				}
1148 				DBG_ASSERT(nDiff >= 0, "nDiff < 0 kann hier nicht sein!");
1149 			}
1150 		}
1151 	}
1152     else if(bModifyTable && !bProp)
1153 	{
1154 //		Differenz wird ueber die Tabellenbreite ausgeglichen,
1155 //		andere Spalten bleiben unveraendert
1156 		DBG_ASSERT(nDiff <= pTblData->GetSpace() - nTableWidth, "Maximum falsch eingestellt" );
1157 		SwTwips nActSpace = pTblData->GetSpace() - nTableWidth;
1158 		if(nDiff > nActSpace)
1159 		{
1160 			nTableWidth = pTblData->GetSpace();
1161 			SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) - nDiff + nActSpace );
1162 		}
1163 		else
1164 		{
1165 			nTableWidth += nDiff;
1166 		}
1167 	}
1168     else if(bModifyTable & bProp)
1169 	{
1170 //		Alle Spalten werden proportional mitveraendert, die Tabellenbreite wird
1171 //  	entsprechend angepasst
1172 		DBG_ASSERT(nDiff * nNoOfVisibleCols <= pTblData->GetSpace() - nTableWidth, "Maximum falsch eingestellt" );
1173 		long nAdd = nDiff;
1174 		if(nDiff * nNoOfVisibleCols > pTblData->GetSpace() - nTableWidth)
1175 		{
1176 			nAdd = (pTblData->GetSpace() - nTableWidth) / nNoOfVisibleCols;
1177 			SetVisibleWidth(nAktPos, GetVisibleWidth(nAktPos) - nDiff + nAdd );
1178 			nDiff = nAdd;
1179 		}
1180 		if(nAdd)
1181             for(i = 0; i < nNoOfVisibleCols; i++ )
1182 			{
1183 				if(i == nAktPos)
1184 					continue;
1185 				SwTwips nVisWidth;
1186 				if((nVisWidth = GetVisibleWidth(i)) + nDiff < MINLAY)
1187 				{
1188 					nAdd += nVisWidth - MINLAY;
1189 					SetVisibleWidth(i, MINLAY);
1190 				}
1191 				else
1192 				{
1193 					SetVisibleWidth(i, nVisWidth + nDiff);
1194 					nAdd += nDiff;
1195 				}
1196 
1197 			}
1198 		nTableWidth += nAdd;
1199 
1200 	}
1201 	else
1202 	{
1203 //		Die Differenz wird gleichmaessig auf alle anderen Spalten aufgeteilt
1204 // 		die Tabellenbreite bleibt konstant
1205 /*
1206 		SwTwips nDiffn = nDiff/(nNoOfVisibleCols - 1);
1207 		if(nDiff < 0 && (nNoOfVisibleCols - 1) * nDiffn != nDiff)
1208 			nDiffn-- ;
1209 		sal_uInt16 nStart = nAktPos++;
1210 		if(nAktPos == nNoOfVisibleCols)
1211 			nStart = 0;
1212 		for(sal_uInt16 i = 0; i < nNoOfVisibleCols; i++ )
1213 		{
1214 			if((nVisWidth = GetVisibleWidth(i)) + nDiff < MINLAY)
1215 			{
1216 				nAdd += nVisWidth - MINLAY;
1217 				SetVisibleWidth(i, MINLAY);
1218 			}
1219 		}
1220 */
1221 
1222 	}
1223 
1224 #ifdef DEBUG_TBLDLG
1225 DbgTblRep(pTblData)
1226 #endif
1227 
1228 	if(!bPercentMode)
1229 		aSpaceED.SetValue(aSpaceED.Normalize( pTblData->GetSpace() - nTableWidth) , FUNIT_TWIP);
1230 
1231 	for( i = 0; ( i < nNoOfVisibleCols ) && ( i < MET_FIELDS ); i++)
1232 	{
1233         pFieldArr[i]->SetPrcntValue(pFieldArr[i]->NormalizePercent(
1234 						GetVisibleWidth(aValueTbl[i]) ), FUNIT_TWIP);
1235 		pFieldArr[i]->ClearModifyFlag();
1236 	}
1237 
1238 }
1239 
1240 /*------------------------------------------------------------------------
1241 ------------------------------------------------------------------------*/
1242 void    SwTableColumnPage::ActivatePage( const SfxItemSet& )
1243 {
1244 	bPercentMode = pTblData->GetWidthPercent() != 0;
1245 	for( sal_uInt16 i = 0; (i < MET_FIELDS) && (i < nNoOfVisibleCols); i++ )
1246 	{
1247 		pFieldArr[i]->SetRefValue(pTblData->GetWidth());
1248 		pFieldArr[i]->ShowPercent( bPercentMode );
1249 	}
1250 
1251 	sal_uInt16 nTblAlign = pTblData->GetAlign();
1252     if((text::HoriOrientation::FULL != nTblAlign && nTableWidth != pTblData->GetWidth()) ||
1253     (text::HoriOrientation::FULL == nTblAlign && nTableWidth != pTblData->GetSpace()))
1254 	{
1255         nTableWidth = text::HoriOrientation::FULL == nTblAlign ?
1256 									pTblData->GetSpace() :
1257 										pTblData->GetWidth();
1258 		UpdateCols(0);
1259 	}
1260 	bModifyTbl = sal_True;
1261 	if(pTblData->GetWidthPercent() ||
1262                 text::HoriOrientation::FULL == nTblAlign ||
1263 						pTblData->IsLineSelected()  )
1264 		bModifyTbl = sal_False;
1265 	if(bPercentMode)
1266 	{
1267 		aModifyTableCB	.Check(sal_False);
1268 		aProportionalCB .Check(sal_False);
1269 	}
1270 	else if( !bModifyTbl )
1271 	{
1272 		aProportionalCB.Check(sal_False);
1273 		aModifyTableCB.Check(sal_False);
1274 	}
1275 	aSpaceFT.Enable(!bPercentMode);
1276 	aSpaceED.Enable(!bPercentMode);
1277 	aModifyTableCB.Enable( !bPercentMode && bModifyTbl );
1278 	aProportionalCB.Enable(!bPercentMode && bModifyTbl );
1279 
1280 /*	if(pTblData->IsLineSelected() && pTblData->IsComplex())
1281 	{
1282 
1283 	}*/
1284 	aSpaceED.SetValue(aSpaceED.Normalize(
1285 				pTblData->GetSpace() - nTableWidth) , FUNIT_TWIP);
1286 
1287 }
1288 
1289 /*------------------------------------------------------------------------
1290 ------------------------------------------------------------------------*/
1291 int  SwTableColumnPage::DeactivatePage( SfxItemSet* _pSet )
1292 {
1293     if(_pSet)
1294 	{
1295         FillItemSet(*_pSet);
1296         if(text::HoriOrientation::FULL != pTblData->GetAlign() && pTblData->GetWidth() != nTableWidth)
1297 		{
1298 			pTblData->SetWidth(nTableWidth);
1299 			SwTwips nDiff = pTblData->GetSpace() - pTblData->GetWidth() -
1300 							pTblData->GetLeftSpace() - pTblData->GetRightSpace();
1301 			switch( pTblData->GetAlign()  )
1302 			{
1303                 case text::HoriOrientation::RIGHT:
1304 					pTblData->SetLeftSpace(pTblData->GetLeftSpace() + nDiff);
1305 				break;
1306                 case text::HoriOrientation::LEFT:
1307 					pTblData->SetRightSpace(pTblData->GetRightSpace() + nDiff);
1308 				break;
1309                 case text::HoriOrientation::NONE:
1310 				{
1311 					SwTwips nDiff2 = nDiff/2;
1312 					if( nDiff > 0 ||
1313 						(-nDiff2 < pTblData->GetRightSpace() && - nDiff2 < pTblData->GetLeftSpace()))
1314 					{
1315 						pTblData->SetRightSpace(pTblData->GetRightSpace() + nDiff2);
1316 						pTblData->SetLeftSpace(pTblData->GetLeftSpace() + nDiff2);
1317 					}
1318 					else
1319 					{
1320 						if(pTblData->GetRightSpace() > pTblData->GetLeftSpace())
1321 						{
1322 							pTblData->SetLeftSpace(0);
1323 							pTblData->SetRightSpace(pTblData->GetSpace() - pTblData->GetWidth());
1324 						}
1325 						else
1326 						{
1327 							pTblData->SetRightSpace(0);
1328 							pTblData->SetLeftSpace(pTblData->GetSpace() - pTblData->GetWidth());
1329 						}
1330 					}
1331 				}
1332 				break;
1333                 case text::HoriOrientation::CENTER:
1334 					pTblData->SetRightSpace(pTblData->GetRightSpace() + nDiff/2);
1335 					pTblData->SetLeftSpace(pTblData->GetLeftSpace() + nDiff/2);
1336 				break;
1337                 case text::HoriOrientation::LEFT_AND_WIDTH :
1338 					if(nDiff > pTblData->GetRightSpace())
1339 					{
1340 						pTblData->SetLeftSpace(pTblData->GetSpace() - pTblData->GetWidth());
1341 					}
1342 					pTblData->SetRightSpace(
1343 						pTblData->GetSpace() - pTblData->GetWidth() - pTblData->GetLeftSpace());
1344 				break;
1345 			}
1346 			pTblData->SetWidthChanged();
1347 		}
1348 #ifdef DEBUG_TBLDLG
1349 DbgTblRep(pTblData)
1350 #endif
1351         _pSet->Put(SwPtrItem( FN_TABLE_REP, pTblData ));
1352 	}
1353 	return sal_True;
1354 }
1355 
1356 /*------------------------------------------------------------------------
1357 ------------------------------------------------------------------------*/
1358 SwTwips  SwTableColumnPage::GetVisibleWidth(sal_uInt16 nPos)
1359 {
1360 	sal_uInt16 i=0;
1361 
1362 	while( nPos )
1363 	{
1364 		if(pTblData->GetColumns()[i].bVisible && nPos)
1365 			nPos--;
1366 		i++;
1367 	}
1368 	SwTwips nReturn = pTblData->GetColumns()[i].nWidth;
1369 	DBG_ASSERT(i < nNoOfCols, "Array index out of range");
1370 	while(!pTblData->GetColumns()[i].bVisible && (i + 1) < nNoOfCols)
1371 		nReturn += pTblData->GetColumns()[++i].nWidth;
1372 
1373 //	return (*ppTableColumns)[i].nWidth;
1374 	return nReturn;
1375 }
1376 
1377 /*------------------------------------------------------------------------
1378 ------------------------------------------------------------------------*/
1379 void SwTableColumnPage::SetVisibleWidth(sal_uInt16 nPos, SwTwips nNewWidth)
1380 {
1381 	sal_uInt16 i=0;
1382 	while( nPos )
1383 	{
1384 		if(pTblData->GetColumns()[i].bVisible && nPos)
1385 			nPos--;
1386 		i++;
1387 	}
1388 	DBG_ASSERT(i < nNoOfCols, "Array index out of range");
1389 	pTblData->GetColumns()[i].nWidth = nNewWidth;
1390 	while(!pTblData->GetColumns()[i].bVisible && (i + 1) < nNoOfCols)
1391 		pTblData->GetColumns()[++i].nWidth = 0;
1392 
1393 }
1394 
1395 /*------------------------------------------------------------------------
1396 ------------------------------------------------------------------------*/
1397 SwTableTabDlg::SwTableTabDlg(Window* pParent, SfxItemPool& ,
1398 					const SfxItemSet* pItemSet, SwWrtShell* pSh ) :
1399 		SfxTabDialog(pParent, SW_RES(DLG_FORMAT_TABLE), pItemSet,0),
1400         pShell(pSh),
1401         nHtmlMode(::GetHtmlMode(pSh->GetView().GetDocShell()))
1402 {
1403 	FreeResource();
1404     SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
1405     DBG_ASSERT(pFact, "Dialogdiet fail!");
1406 	AddTabPage(TP_FORMAT_TABLE, &SwFormatTablePage::Create, 0 );
1407 	AddTabPage(TP_TABLE_TEXTFLOW, &SwTextFlowPage::Create, 0 );
1408 	AddTabPage(TP_TABLE_COLUMN, &SwTableColumnPage::Create, 0 );
1409     AddTabPage(TP_BACKGROUND, pFact->GetTabPageCreatorFunc( RID_SVXPAGE_BACKGROUND ), 0 );
1410     AddTabPage(TP_BORDER, pFact->GetTabPageCreatorFunc( RID_SVXPAGE_BORDER ), 0 );
1411 }
1412 
1413 
1414 /*------------------------------------------------------------------------
1415 ------------------------------------------------------------------------*/
1416 void  SwTableTabDlg::PageCreated(sal_uInt16 nId, SfxTabPage& rPage)
1417 {
1418     SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool()));
1419 	if( TP_BACKGROUND == nId )
1420 	{
1421         sal_Int32 nFlagType = SVX_SHOW_TBLCTL;
1422         if(!( nHtmlMode & HTMLMODE_ON ) ||
1423 			nHtmlMode & HTMLMODE_SOME_STYLES)
1424             nFlagType |= SVX_SHOW_SELECTOR;
1425         aSet.Put (SfxUInt32Item(SID_FLAG_TYPE, nFlagType));
1426 		rPage.PageCreated(aSet);
1427 	}
1428 	else if(TP_BORDER == nId)
1429 	{
1430 		aSet.Put (SfxUInt16Item(SID_SWMODE_TYPE,SW_BORDER_MODE_TABLE));
1431 		rPage.PageCreated(aSet);
1432 	}
1433 	else if(TP_TABLE_TEXTFLOW == nId)
1434 	{
1435 		((SwTextFlowPage&)rPage).SetShell(pShell);
1436 		const sal_uInt16 eType = pShell->GetFrmType(0,sal_True);
1437 		if( !(FRMTYPE_BODY & eType) )
1438 			((SwTextFlowPage&)rPage).DisablePageBreak();
1439 	}
1440 }
1441 
1442 /*-----------------12.12.96 12.22-------------------
1443 --------------------------------------------------*/
1444 SwTextFlowPage::SwTextFlowPage( Window* pParent,
1445 								const SfxItemSet& rSet ) :
1446 	SfxTabPage(pParent, SW_RES( TP_TABLE_TEXTFLOW ), rSet ),
1447     aFlowFL         (this, SW_RES(FL_FLOW            )),
1448 	aPgBrkCB        (this, SW_RES(CB_PAGEBREAK      )),
1449 	aPgBrkRB        (this, SW_RES(RB_BREAKPAGE      )),
1450 	aColBrkRB       (this, SW_RES(RB_BREAKCOLUMN    )),
1451 	aPgBrkBeforeRB  (this, SW_RES(RB_PAGEBREAKBEFORE)),
1452 	aPgBrkAfterRB   (this, SW_RES(RB_PAGEBREAKAFTER )),
1453 	aPageCollCB     (this, SW_RES(CB_PAGECOLL       )),
1454 	aPageCollLB     (this, SW_RES(LB_PAGECOLL       )),
1455 	aPageNoFT       (this, SW_RES(FT_PAGENUM        )),
1456 	aPageNoNF       (this, SW_RES(NF_PAGENUM        )),
1457     aSplitCB        (this, SW_RES(CB_SPLIT          )),
1458     aSplitRowCB     (this, SW_RES(CB_SPLIT_ROW      )),
1459 	aKeepCB			(this, SW_RES(CB_KEEP			)),
1460     aHeadLineCB     (this, SW_RES(CB_HEADLINE       )),
1461     aRepeatHeaderFT         (this, SW_RES(FT_REPEAT_HEADER  )),
1462     aRepeatHeaderBeforeFT   (this),
1463     aRepeatHeaderNF         (this, SW_RES(NF_REPEAT_HEADER  )),
1464     aRepeatHeaderAfterFT    (this),
1465     aRepeatHeaderCombo      (this, SW_RES(WIN_REPEAT_HEADER), aRepeatHeaderNF, aRepeatHeaderBeforeFT, aRepeatHeaderAfterFT),
1466     aTextDirectionFT(this, SW_RES(FT_TEXTDIRECTION  )),
1467     aTextDirectionLB(this, SW_RES(LB_TEXTDIRECTION  )),
1468 
1469     aVertOrientFL   (this, SW_RES(FL_VERT_ORIENT    )),
1470     aVertOrientFT(this,  SW_RES(FT_VERTORIENT       )),
1471     aVertOrientLB(this,  SW_RES(LB_VERTORIENT       )),
1472 
1473     pShell(0),
1474 
1475 	bPageBreak(sal_True),
1476 	bHtmlMode(sal_False)
1477 {
1478 	FreeResource();
1479 
1480 	aPgBrkRB.SetAccessibleRelationMemberOf(&aPgBrkCB);
1481 	aColBrkRB.SetAccessibleRelationMemberOf(&aPgBrkCB);
1482 	aPgBrkBeforeRB.SetAccessibleRelationMemberOf(&aPgBrkCB);
1483 	aPgBrkAfterRB.SetAccessibleRelationMemberOf(&aPgBrkCB);
1484 	aPageCollLB.SetAccessibleRelationLabeledBy(&aPageCollCB);
1485 	aPageCollLB.SetAccessibleName(aPageCollCB.GetText());
1486 
1487 	aPgBrkCB.SetClickHdl(LINK(this, SwTextFlowPage, PageBreakHdl_Impl));
1488 	aPgBrkBeforeRB.SetClickHdl(
1489 		LINK( this, SwTextFlowPage, PageBreakPosHdl_Impl ) );
1490 	aPgBrkAfterRB.SetClickHdl(
1491 		LINK( this, SwTextFlowPage, PageBreakPosHdl_Impl ) );
1492 	aPageCollCB.SetClickHdl(
1493 		LINK( this, SwTextFlowPage, ApplyCollClickHdl_Impl ) );
1494 	aColBrkRB.SetClickHdl(
1495 		LINK( this, SwTextFlowPage, PageBreakTypeHdl_Impl ) );
1496 	aPgBrkRB.SetClickHdl(
1497 		LINK( this, SwTextFlowPage, PageBreakTypeHdl_Impl ) );
1498     aSplitCB.SetClickHdl(
1499         LINK( this, SwTextFlowPage, SplitHdl_Impl));
1500     aSplitRowCB.SetClickHdl(
1501         LINK( this, SwTextFlowPage, SplitRowHdl_Impl));
1502 	aHeadLineCB.SetClickHdl( LINK( this, SwTextFlowPage, HeadLineCBClickHdl ) );
1503 
1504 #ifndef SW_FILEFORMAT_40
1505 	const SfxPoolItem *pItem;
1506 	if(SFX_ITEM_SET == rSet.GetItemState( SID_HTML_MODE, sal_False,&pItem )
1507 		&& ((const SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON)
1508 #endif
1509 	{
1510 		aKeepCB.Hide();
1511 		aSplitCB.Hide();
1512         aSplitRowCB.Hide();
1513 	}
1514 
1515 	aRepeatHeaderCombo.Arrange( aRepeatHeaderFT );
1516 
1517 	HeadLineCBClickHdl();
1518 }
1519 
1520 /*-----------------12.12.96 12.22-------------------
1521 --------------------------------------------------*/
1522  SwTextFlowPage::~SwTextFlowPage()
1523 {
1524 }
1525 
1526 /*-----------------12.12.96 12.22-------------------
1527 --------------------------------------------------*/
1528 SfxTabPage*   SwTextFlowPage::Create( Window* pParent,
1529 								const SfxItemSet& rAttrSet)
1530 {
1531 	return new SwTextFlowPage(pParent, rAttrSet);
1532 }
1533 
1534 /*-----------------12.12.96 12.22-------------------
1535 --------------------------------------------------*/
1536 sal_Bool  SwTextFlowPage::FillItemSet( SfxItemSet& rSet )
1537 {
1538 	sal_Bool bModified = sal_False;
1539 
1540 	//Ueberschrift wiederholen
1541 	if(aHeadLineCB.IsChecked() != aHeadLineCB.GetSavedValue() ||
1542         String::CreateFromInt32( static_cast< sal_Int32 >(aRepeatHeaderNF.GetValue()) ) != aRepeatHeaderNF.GetSavedValue() )
1543 	{
1544 		bModified |= 0 != rSet.Put(
1545 			SfxUInt16Item(FN_PARAM_TABLE_HEADLINE, aHeadLineCB.IsChecked()? sal_uInt16(aRepeatHeaderNF.GetValue()) : 0 ));
1546 	}
1547 	if(aKeepCB.IsChecked() != aKeepCB.GetSavedValue())
1548         bModified |= 0 != rSet.Put( SvxFmtKeepItem( aKeepCB.IsChecked(), RES_KEEP));
1549 
1550 	if(aSplitCB.IsChecked() != aSplitCB.GetSavedValue())
1551         bModified |= 0 != rSet.Put( SwFmtLayoutSplit( aSplitCB.IsChecked()));
1552 
1553     if(aSplitRowCB.IsChecked() != aSplitRowCB.GetSavedValue())
1554         bModified |= 0 != rSet.Put( SwFmtRowSplit( aSplitRowCB.IsChecked()));
1555 
1556 
1557 	const SvxFmtBreakItem* pBreak = (const SvxFmtBreakItem*)GetOldItem( rSet, RES_BREAK );
1558 	const SwFmtPageDesc* pDesc = (const SwFmtPageDesc*) GetOldItem( rSet, RES_PAGEDESC );
1559 
1560 
1561 	sal_Bool bState = aPageCollCB.IsChecked();
1562 
1563 	//Wenn Seitenvorlage, dann kein Break
1564 	sal_Bool bPageItemPut = sal_False;
1565 	if ( bState != aPageCollCB.GetSavedValue() ||
1566 		 ( bState &&
1567 		   aPageCollLB.GetSelectEntryPos() != aPageCollLB.GetSavedValue() )
1568 		   || (aPageNoNF.IsEnabled() && aPageNoNF.IsValueModified()) )
1569 	{
1570 		String sPage;
1571 
1572 		if ( bState )
1573 		{
1574 			sPage = aPageCollLB.GetSelectEntry();
1575 		}
1576         sal_uInt16 nPgNum = static_cast< sal_uInt16 >(aPageNoNF.GetValue());
1577 		if ( !pDesc || !pDesc->GetPageDesc() ||
1578 			( pDesc->GetPageDesc() && ((pDesc->GetPageDesc()->GetName() != sPage) ||
1579 					aPageNoNF.GetSavedValue() != (String)nPgNum)))
1580 		{
1581 			SwFmtPageDesc aFmt( pShell->FindPageDescByName( sPage, sal_True ) );
1582 			aFmt.SetNumOffset(bState ? nPgNum : 0);
1583 			bModified |= 0 != rSet.Put( aFmt );
1584 			bPageItemPut = bState;
1585 		}
1586 	}
1587 	sal_Bool bIsChecked = aPgBrkCB.IsChecked();
1588 	if ( !bPageItemPut &&
1589 		(	bState != aPageCollCB.GetSavedValue() ||
1590 			bIsChecked != aPgBrkCB.GetSavedValue()				||
1591 			aPgBrkBeforeRB.IsChecked() != aPgBrkBeforeRB.GetSavedValue()	||
1592 			aPgBrkRB.IsChecked() != aPgBrkRB.GetSavedValue() ))
1593 	{
1594 		SvxFmtBreakItem aBreak(
1595 			(const SvxFmtBreakItem&)GetItemSet().Get( RES_BREAK ) );
1596 
1597 		if(bIsChecked)
1598 		{
1599 			sal_Bool bBefore = aPgBrkBeforeRB.IsChecked();
1600 
1601 			if ( aPgBrkRB.IsChecked() )
1602 			{
1603 				if ( bBefore )
1604 					aBreak.SetValue( SVX_BREAK_PAGE_BEFORE );
1605 				else
1606 					aBreak.SetValue( SVX_BREAK_PAGE_AFTER );
1607 			}
1608 			else
1609 			{
1610 				if ( bBefore )
1611 					aBreak.SetValue( SVX_BREAK_COLUMN_BEFORE );
1612 				else
1613 					aBreak.SetValue( SVX_BREAK_COLUMN_AFTER );
1614 			}
1615 		}
1616 		else
1617 		{
1618 				aBreak.SetValue( SVX_BREAK_NONE );
1619 		}
1620 
1621 		if ( !pBreak || !( *(const SvxFmtBreakItem*)pBreak == aBreak ) )
1622 		{
1623 			bModified |= 0 != rSet.Put( aBreak );
1624 		}
1625 	}
1626 
1627     if(aTextDirectionLB.GetSelectEntryPos() != aTextDirectionLB.GetSavedValue())
1628     {
1629           bModified |= 0 != rSet.Put(
1630                     SvxFrameDirectionItem(
1631                         (SvxFrameDirection)(sal_uLong)aTextDirectionLB.GetEntryData(aTextDirectionLB.GetSelectEntryPos())
1632                         , FN_TABLE_BOX_TEXTDIRECTION));
1633     }
1634 
1635     if(aVertOrientLB.GetSelectEntryPos() != aVertOrientLB.GetSavedValue())
1636     {
1637         sal_uInt16 nOrient = USHRT_MAX;
1638         switch(aVertOrientLB.GetSelectEntryPos())
1639         {
1640             case 0 : nOrient = text::VertOrientation::NONE; break;
1641             case 1 : nOrient = text::VertOrientation::CENTER; break;
1642             case 2 : nOrient = text::VertOrientation::BOTTOM; break;
1643         }
1644         if(nOrient != USHRT_MAX)
1645             bModified |= 0 != rSet.Put(SfxUInt16Item(FN_TABLE_SET_VERT_ALIGN, nOrient));
1646     }
1647 
1648 	return bModified;
1649 
1650 }
1651 
1652 /*-----------------12.12.96 12.22-------------------
1653 --------------------------------------------------*/
1654 void   SwTextFlowPage::Reset( const SfxItemSet& rSet )
1655 {
1656 	const SfxPoolItem* pItem;
1657 	SvxHtmlOptions* pHtmlOpt = SvxHtmlOptions::Get();
1658 	sal_Bool bFlowAllowed = !bHtmlMode || pHtmlOpt->IsPrintLayoutExtension();
1659 	if(bFlowAllowed)
1660 	{
1661 		// Einfuegen der vorhandenen Seitenvorlagen in die Listbox
1662 		const sal_uInt16 nCount = pShell->GetPageDescCnt();
1663 		sal_uInt16 i;
1664 
1665 		for( i = 0; i < nCount; ++i)
1666 		{
1667 			const SwPageDesc &rPageDesc = pShell->GetPageDesc(i);
1668 			aPageCollLB.InsertEntry(rPageDesc.GetName());
1669 		}
1670 
1671 		String aFmtName;
1672 		for(i = RES_POOLPAGE_BEGIN; i < RES_POOLPAGE_END; ++i)
1673 			if( LISTBOX_ENTRY_NOTFOUND == aPageCollLB.GetEntryPos(
1674 					aFmtName = SwStyleNameMapper::GetUIName( i, aFmtName ) ))
1675 				aPageCollLB.InsertEntry( aFmtName );
1676 
1677 		if(SFX_ITEM_SET == rSet.GetItemState( RES_KEEP, sal_False, &pItem ))
1678 		{
1679 			aKeepCB.Check( ((const SvxFmtKeepItem*)pItem)->GetValue() );
1680 			aKeepCB.SaveValue();
1681 		}
1682 		if(SFX_ITEM_SET == rSet.GetItemState( RES_LAYOUT_SPLIT, sal_False, &pItem ))
1683 		{
1684             aSplitCB.Check( ((const SwFmtLayoutSplit*)pItem)->GetValue() );
1685 		}
1686         else
1687             aSplitCB.Check();
1688 
1689 	    aSplitCB.SaveValue();
1690         SplitHdl_Impl(&aSplitCB);
1691 
1692         if(SFX_ITEM_SET == rSet.GetItemState( RES_ROW_SPLIT, sal_False, &pItem ))
1693         {
1694             aSplitRowCB.Check( ((const SwFmtRowSplit*)pItem)->GetValue() );
1695         }
1696         else
1697             aSplitRowCB.SetState(STATE_DONTKNOW);
1698         aSplitRowCB.SaveValue();
1699 
1700         if(bPageBreak)
1701 		{
1702 			if(SFX_ITEM_SET == rSet.GetItemState( RES_PAGEDESC, sal_False, &pItem ))
1703 			{
1704 				String sPageDesc;
1705 				const SwPageDesc* pDesc = ((const SwFmtPageDesc*)pItem)->GetPageDesc();
1706 				aPageNoNF.SetValue(((const SwFmtPageDesc*)pItem)->GetNumOffset());
1707 				if(pDesc)
1708 					sPageDesc = pDesc->GetName();
1709 				if ( sPageDesc.Len() &&
1710 						aPageCollLB.GetEntryPos( sPageDesc ) != LISTBOX_ENTRY_NOTFOUND )
1711 				{
1712 					aPageCollLB.SelectEntry( sPageDesc );
1713 					aPageCollCB.Check();
1714 
1715 					aPgBrkCB.Enable();
1716 					aPgBrkRB.Enable();
1717 					aColBrkRB.Enable();
1718 					aPgBrkBeforeRB.Enable();
1719 					aPgBrkAfterRB.Enable();
1720 					aPageCollCB.Enable();
1721 					aPgBrkCB.Check();
1722 
1723 					aPgBrkCB.Check( sal_True );
1724 					aColBrkRB.Check( sal_False );
1725 					aPgBrkBeforeRB.Check( sal_True );
1726 					aPgBrkAfterRB.Check( sal_False );
1727 				}
1728 				else
1729 				{
1730 					aPageCollLB.SetNoSelection();
1731 					aPageCollCB.Check(sal_False);
1732 				}
1733 			}
1734 
1735 			if(SFX_ITEM_SET == rSet.GetItemState( RES_BREAK, sal_False, &pItem ))
1736 			{
1737 				const SvxFmtBreakItem* pPageBreak = (const SvxFmtBreakItem*)pItem;
1738 				SvxBreak eBreak = (SvxBreak)pPageBreak->GetValue();
1739 
1740 				if ( eBreak != SVX_BREAK_NONE )
1741 				{
1742 					aPgBrkCB.Check();
1743 					aPageCollCB.Enable(sal_False);
1744 					aPageCollLB.Enable(sal_False);
1745 					aPageNoFT.Enable(sal_False);
1746 					aPageNoNF.Enable(sal_False);
1747 				}
1748 				switch ( eBreak )
1749 				{
1750 					case SVX_BREAK_PAGE_BEFORE:
1751 						aPgBrkRB.Check( sal_True );
1752 						aColBrkRB.Check( sal_False );
1753 						aPgBrkBeforeRB.Check( sal_True );
1754 						aPgBrkAfterRB.Check( sal_False );
1755 						break;
1756 					case SVX_BREAK_PAGE_AFTER:
1757 						aPgBrkRB.Check( sal_True );
1758 						aColBrkRB.Check( sal_False );
1759 						aPgBrkBeforeRB.Check( sal_False );
1760 						aPgBrkAfterRB.Check( sal_True );
1761 						break;
1762 					case SVX_BREAK_COLUMN_BEFORE:
1763 						aPgBrkRB.Check( sal_False );
1764 						aColBrkRB.Check( sal_True );
1765 						aPgBrkBeforeRB.Check( sal_True );
1766 						aPgBrkAfterRB.Check( sal_False );
1767 						break;
1768 					case SVX_BREAK_COLUMN_AFTER:
1769 						aPgBrkRB.Check( sal_False );
1770 						aColBrkRB.Check( sal_True );
1771 						aPgBrkBeforeRB.Check( sal_False );
1772 						aPgBrkAfterRB.Check( sal_True );
1773 						break;
1774                     default:; //prevent warning
1775 				}
1776 
1777 			}
1778 			if ( aPgBrkBeforeRB.IsChecked() )
1779 				PageBreakPosHdl_Impl( &aPgBrkBeforeRB );
1780 			else if ( aPgBrkAfterRB.IsChecked() )
1781 				PageBreakPosHdl_Impl( &aPgBrkAfterRB );
1782 			PageBreakHdl_Impl( &aPgBrkCB );
1783 		}
1784 	}
1785 	else
1786 	{
1787 		aPgBrkRB.Enable(sal_False);
1788 		aColBrkRB.Enable(sal_False);
1789 		aPgBrkBeforeRB.Enable(sal_False);
1790 		aPgBrkAfterRB.Enable(sal_False);
1791 		aKeepCB	.Enable(sal_False);
1792 		aSplitCB.Enable(sal_False);
1793 		aPgBrkCB.Enable(sal_False);
1794 		aPageCollCB.Enable(sal_False);
1795 		aPageCollLB.Enable(sal_False);
1796 	}
1797 
1798 	if(SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_TABLE_HEADLINE, sal_False, &pItem ))
1799 	{
1800 		sal_uInt16 nRep = ((const SfxUInt16Item*)pItem)->GetValue();
1801 		aHeadLineCB.Check( nRep > 0 );
1802 		aHeadLineCB.SaveValue();
1803 		aRepeatHeaderNF.SetValue( nRep );
1804 		aRepeatHeaderNF.SaveValue();
1805 	}
1806     if ( rSet.GetItemState(FN_TABLE_BOX_TEXTDIRECTION) > SFX_ITEM_AVAILABLE )
1807     {
1808         sal_uLong nDirection = ((const SvxFrameDirectionItem&)rSet.Get(FN_TABLE_BOX_TEXTDIRECTION)).GetValue();
1809         aTextDirectionLB.SelectEntryPos(aTextDirectionLB.GetEntryPos( (const void*)nDirection ));
1810     }
1811 
1812     if ( rSet.GetItemState(FN_TABLE_SET_VERT_ALIGN) > SFX_ITEM_AVAILABLE )
1813 	{
1814 		sal_uInt16 nVert = ((const SfxUInt16Item&)rSet.Get(FN_TABLE_SET_VERT_ALIGN)).GetValue();
1815         sal_uInt16 nPos = 0;
1816 		switch(nVert)
1817 		{
1818             case text::VertOrientation::NONE:     nPos = 0;   break;
1819             case text::VertOrientation::CENTER:   nPos = 1;   break;
1820             case text::VertOrientation::BOTTOM:   nPos = 2;   break;
1821 		}
1822         aVertOrientLB.SelectEntryPos(nPos);
1823 	}
1824 
1825 	aPageCollCB.SaveValue();
1826 	aPageCollLB.SaveValue();
1827 	aPgBrkCB.SaveValue();
1828 	aPgBrkRB.SaveValue();
1829 	aColBrkRB.SaveValue();
1830 	aPgBrkBeforeRB.SaveValue();
1831 	aPgBrkAfterRB.SaveValue();
1832 	aPageNoNF.SaveValue();
1833     aTextDirectionLB.SaveValue();
1834     aVertOrientLB.SaveValue();
1835 
1836 	HeadLineCBClickHdl();
1837 }
1838 /*-----------------16.04.98 14:48-------------------
1839 
1840 --------------------------------------------------*/
1841 
1842 void SwTextFlowPage::SetShell(SwWrtShell* pSh)
1843 {
1844 	pShell = pSh;
1845 	bHtmlMode = 0 != (::GetHtmlMode(pShell->GetView().GetDocShell()) & HTMLMODE_ON);
1846 	if(bHtmlMode)
1847 	{
1848 		aPageNoNF.Enable(sal_False);
1849 		aPageNoFT.Enable(sal_False);
1850 	}
1851 }
1852 
1853 /*-----------------12.12.96 16.18-------------------
1854 --------------------------------------------------*/
1855 IMPL_LINK( SwTextFlowPage, PageBreakHdl_Impl, CheckBox*, EMPTYARG )
1856 {
1857 	if( aPgBrkCB.IsChecked() )
1858 	{
1859 			aPgBrkRB.		Enable();
1860 			aColBrkRB.		Enable();
1861 			aPgBrkBeforeRB.	Enable();
1862 			aPgBrkAfterRB.	Enable();
1863 
1864 			if ( aPgBrkRB.IsChecked() && aPgBrkBeforeRB.IsChecked() )
1865 			{
1866 				aPageCollCB.Enable();
1867 
1868 				sal_Bool bEnable = aPageCollCB.IsChecked() &&
1869 											aPageCollLB.GetEntryCount();
1870 				aPageCollLB.Enable(bEnable);
1871 				if(!bHtmlMode)
1872 				{
1873 					aPageNoFT.Enable(bEnable);
1874 					aPageNoNF.Enable(bEnable);
1875 				}
1876 			}
1877 	}
1878 	else
1879 	{
1880 			aPageCollCB.Check( sal_False );
1881 			aPageCollCB.Enable(sal_False);
1882 			aPageCollLB.Enable(sal_False);
1883 			aPageNoFT.Enable(sal_False);
1884 			aPageNoNF.Enable(sal_False);
1885 			aPgBrkRB.		Enable(sal_False);
1886 			aColBrkRB.		Enable(sal_False);
1887 			aPgBrkBeforeRB.	Enable(sal_False);
1888 			aPgBrkAfterRB.	Enable(sal_False);
1889 	}
1890 	return 0;
1891 }
1892 
1893 /*-----------------12.12.96 16.18-------------------
1894 --------------------------------------------------*/
1895 IMPL_LINK( SwTextFlowPage, ApplyCollClickHdl_Impl, CheckBox*, EMPTYARG )
1896 {
1897 	sal_Bool bEnable = sal_False;
1898 	if ( aPageCollCB.IsChecked() &&
1899 		 aPageCollLB.GetEntryCount() )
1900 	{
1901 		bEnable = sal_True;
1902 		aPageCollLB.SelectEntryPos( 0 );
1903 	}
1904 	else
1905 	{
1906 		aPageCollLB.SetNoSelection();
1907 	}
1908 	aPageCollLB.Enable(bEnable);
1909 	if(!bHtmlMode)
1910 	{
1911 		aPageNoFT.Enable(bEnable);
1912 		aPageNoNF.Enable(bEnable);
1913 	}
1914 	return 0;
1915 }
1916 
1917 /*-----------------12.12.96 16.18-------------------
1918 --------------------------------------------------*/
1919 IMPL_LINK( SwTextFlowPage, PageBreakPosHdl_Impl, RadioButton*, pBtn )
1920 {
1921 	if ( aPgBrkCB.IsChecked() )
1922 	{
1923         if ( pBtn == &aPgBrkBeforeRB && aPgBrkRB.IsChecked() )
1924 		{
1925 			aPageCollCB.Enable();
1926 
1927 			sal_Bool bEnable = aPageCollCB.IsChecked()  &&
1928 										aPageCollLB.GetEntryCount();
1929 
1930 			aPageCollLB.Enable(bEnable);
1931 			if(!bHtmlMode)
1932 			{
1933 				aPageNoFT.Enable(bEnable);
1934 				aPageNoNF.Enable(bEnable);
1935 			}
1936 		}
1937 		else if ( pBtn == &aPgBrkAfterRB )
1938 		{
1939 			aPageCollCB	.Check( sal_False );
1940 			aPageCollCB	.Enable(sal_False);
1941 			aPageCollLB	.Enable(sal_False);
1942 			aPageNoFT 	.Enable(sal_False);
1943 			aPageNoNF	.Enable(sal_False);
1944 		}
1945 	}
1946 	return 0;
1947 }
1948 
1949 /*-----------------12.12.96 16.18-------------------
1950 --------------------------------------------------*/
1951 IMPL_LINK( SwTextFlowPage, PageBreakTypeHdl_Impl, RadioButton*, pBtn )
1952 {
1953 	if ( pBtn == &aColBrkRB || aPgBrkAfterRB.IsChecked() )
1954 	{
1955 		aPageCollCB	.Check(sal_False);
1956 		aPageCollCB	.Enable(sal_False);
1957 		aPageCollLB	.Enable(sal_False);
1958 		aPageNoFT	.Enable(sal_False);
1959 		aPageNoNF	.Enable(sal_False);
1960 	}
1961 	else if ( aPgBrkBeforeRB.IsChecked() )
1962 		PageBreakPosHdl_Impl( &aPgBrkBeforeRB );
1963 	return 0;
1964 }
1965 /*-----------------17.11.2003 11:30-----------------
1966  *
1967  * --------------------------------------------------*/
1968 IMPL_LINK( SwTextFlowPage, SplitHdl_Impl, CheckBox*, pBox )
1969 {
1970     aSplitRowCB.Enable(pBox->IsChecked());
1971     return 0;
1972 }
1973 /*-----------------17.11.2003 11:30-----------------
1974  *
1975  * --------------------------------------------------*/
1976 IMPL_LINK( SwTextFlowPage, SplitRowHdl_Impl, TriStateBox*, pBox )
1977 {
1978     pBox->EnableTriState(sal_False);
1979     return 0;
1980 }
1981 
1982 IMPL_LINK( SwTextFlowPage, HeadLineCBClickHdl, void*, EMPTYARG )
1983 {
1984 	aRepeatHeaderCombo.Enable(aHeadLineCB.IsChecked());
1985 
1986 	return 0;
1987 }
1988 
1989 /*-----------------30.05.97 07:37-------------------
1990 
1991 --------------------------------------------------*/
1992 void SwTextFlowPage::DisablePageBreak()
1993 {
1994 	bPageBreak = sal_False;
1995 	aPgBrkCB       .Disable();
1996 	aPgBrkRB       .Disable();
1997 	aColBrkRB      .Disable();
1998 	aPgBrkBeforeRB .Disable();
1999 	aPgBrkAfterRB  .Disable();
2000 	aPageCollCB    .Disable();
2001 	aPageCollLB    .Disable();
2002 	aPageNoFT      .Disable();
2003 	aPageNoNF      .Disable();
2004 }
2005 
2006 
2007 
2008