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