xref: /AOO41X/main/sw/source/ui/frmdlg/column.cxx (revision 5ff14ef2c455a7c2a39819566d74aed4bcc9528e)
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 #include "column.hxx"
32 
33 #include "hintids.hxx"
34 #include <svx/htmlmode.hxx>
35 #include <editeng/borderline.hxx>
36 #include <editeng/boxitem.hxx>
37 #include <editeng/lrspitem.hxx>
38 #include <editeng/sizeitem.hxx>
39 #include "editeng/frmdiritem.hxx"
40 #include <svl/ctloptions.hxx>
41 #include <sfx2/dispatch.hxx>
42 #include <vcl/msgbox.hxx>
43 #include <swmodule.hxx>
44 
45 #include <helpid.h>
46 #include "globals.hrc"
47 #include "swtypes.hxx"
48 #include "wrtsh.hxx"
49 #include "view.hxx"
50 #include "docsh.hxx"
51 #include "uitool.hxx"
52 #include "cmdid.h"
53 #include "viewopt.hxx"
54 #include "format.hxx"
55 #include "frmmgr.hxx"
56 #include "frmdlg.hxx"
57 #include "colmgr.hxx"
58 #include "prcntfld.hxx"
59 #include "paratr.hxx"
60 #include "frmui.hrc"
61 #include "poolfmt.hrc"
62 #include "column.hrc"
63 #include <section.hxx>
64 #include <docary.hxx>
65 #include <pagedesc.hxx>
66 
67 #include "access.hrc"
68 
69 #define FRAME_FORMAT_WIDTH 1000
70 
71 // sw/inc/fmtclds.hxx
72 SV_IMPL_PTRARR( SwColumns, SwColumnPtr )
73 
74 /*--------------------------------------------------------------------
75 	Beschreibung:  Statische Daten
76  --------------------------------------------------------------------*/
77 
78 static const sal_uInt16 __FAR_DATA nLines[] = {
79 	DEF_LINE_WIDTH_0,
80 	DEF_LINE_WIDTH_1,
81 	DEF_LINE_WIDTH_2,
82 	DEF_LINE_WIDTH_3,
83 	DEF_LINE_WIDTH_4
84 };
85 
86 static const sal_uInt16 nLineCount = sizeof(nLines) / sizeof(nLines[0]);
87 static const sal_uInt16 nVisCols = 3;
88 
89 inline sal_Bool IsMarkInSameSection( SwWrtShell& rWrtSh, const SwSection* pSect )
90 {
91 	rWrtSh.SwapPam();
92 	sal_Bool bRet = pSect == rWrtSh.GetCurrSection();
93 	rWrtSh.SwapPam();
94 	return bRet;
95 }
96 
97 /*--------------------------------------------------------------------
98 	Beschreibung:
99  --------------------------------------------------------------------*/
100 
101 SwColumnDlg::SwColumnDlg(Window* pParent, SwWrtShell& rSh) :
102 	SfxModalDialog(pParent, SW_RES(DLG_COLUMN)),
103 	aOK(this, 		SW_RES(PB_OK)),
104 	aCancel(this, 	SW_RES(PB_CANCEL)),
105 	aHelp(this, 	SW_RES(PB_HELP)),
106 	aApplyToFT(this, SW_RES(FT_APPLY_TO)),
107 	aApplyToLB(this, SW_RES(LB_APPLY_TO)),
108 	rWrtShell(rSh),
109 	pPageSet(0),
110 	pSectionSet(0),
111 	pSelectionSet(0),
112 	pFrameSet(0),
113 	nOldSelection(0),
114     nSelectionWidth(0),
115 	bPageChanged(sal_False),
116 	bSectionChanged(sal_False),
117 	bSelSectionChanged(sal_False),
118 	bFrameChanged(sal_False)
119 {
120 	FreeResource();
121 
122 	SwRect aRect;
123     rWrtShell.CalcBoundRect(aRect, FLY_AS_CHAR);
124 
125 	nSelectionWidth = aRect.Width();
126 
127 	SfxItemSet* pColPgSet = 0;
128 	static sal_uInt16 __READONLY_DATA aSectIds[] = { RES_COL, RES_COL,
129 												RES_FRM_SIZE, RES_FRM_SIZE,
130                                                 RES_COLUMNBALANCE, RES_FRAMEDIR,
131 												0 };
132 
133 	const SwSection* pCurrSection = rWrtShell.GetCurrSection();
134 	sal_uInt16 nFullSectCnt = rWrtShell.GetFullSelectedSectionCount();
135 	if( pCurrSection && ( !rWrtShell.HasSelection() || 0 != nFullSectCnt ))
136 	{
137 		nSelectionWidth = rSh.GetSectionWidth(*pCurrSection->GetFmt());
138 		if ( !nSelectionWidth )
139 			nSelectionWidth = USHRT_MAX;
140 		pSectionSet = new SfxItemSet( rWrtShell.GetAttrPool(), aSectIds );
141 		pSectionSet->Put( pCurrSection->GetFmt()->GetAttrSet() );
142 		pColPgSet = pSectionSet;
143 		aApplyToLB.RemoveEntry( aApplyToLB.GetEntryPos(
144 										(void*)( 1 >= nFullSectCnt
145 													? LISTBOX_SECTIONS
146 													: LISTBOX_SECTION )));
147 	}
148 	else
149 	{
150 		aApplyToLB.RemoveEntry(aApplyToLB.GetEntryPos( (void*) LISTBOX_SECTION ));
151 		aApplyToLB.RemoveEntry(aApplyToLB.GetEntryPos( (void*) LISTBOX_SECTIONS ));
152 	}
153 
154 	if( rWrtShell.HasSelection() && rWrtShell.IsInsRegionAvailable() &&
155 		( !pCurrSection || ( 1 != nFullSectCnt &&
156 			IsMarkInSameSection( rWrtShell, pCurrSection ) )))
157 	{
158 		pSelectionSet = new SfxItemSet( rWrtShell.GetAttrPool(), aSectIds );
159 		pColPgSet = pSelectionSet;
160 	}
161 	else
162 		aApplyToLB.RemoveEntry(aApplyToLB.GetEntryPos( (void*) LISTBOX_SELECTION ));
163 
164 	if( rWrtShell.GetFlyFrmFmt() )
165 	{
166 		const SwFrmFmt* pFmt = rSh.GetFlyFrmFmt() ;
167 		pFrameSet = new SfxItemSet(rWrtShell.GetAttrPool(), aSectIds );
168 		pFrameSet->Put(pFmt->GetFrmSize());
169 		pFrameSet->Put(pFmt->GetCol());
170 		pColPgSet = pFrameSet;
171 	}
172 	else
173 		aApplyToLB.RemoveEntry(aApplyToLB.GetEntryPos( (void*) LISTBOX_FRAME ));
174 
175 
176 	sal_uInt16 nPagePos = aApplyToLB.GetEntryPos( (void*) LISTBOX_PAGE );
177 	const SwPageDesc* pPageDesc = rWrtShell.GetSelectedPageDescs();
178 	if( pPageDesc )
179 	{
180 		pPageSet = new SfxItemSet( rWrtShell.GetAttrPool(),
181 									RES_COL, RES_COL,
182 									RES_FRM_SIZE, RES_FRM_SIZE,
183 									RES_LR_SPACE, RES_LR_SPACE,
184 									0 );
185 
186 		String sPageStr = aApplyToLB.GetEntry(nPagePos);
187 		aApplyToLB.RemoveEntry( nPagePos );
188 		sPageStr += pPageDesc->GetName();
189 		aApplyToLB.InsertEntry( sPageStr, nPagePos );
190 		aApplyToLB.SetEntryData( nPagePos, (void*) LISTBOX_PAGE);
191 
192 		const SwFrmFmt &rFmt = pPageDesc->GetMaster();
193 		nPageWidth = rFmt.GetFrmSize().GetSize().Width();
194 
195 		const SvxLRSpaceItem& rLRSpace = (const SvxLRSpaceItem&)rFmt.GetLRSpace();
196         const SvxBoxItem& rBox = (const SvxBoxItem&) rFmt.GetBox();
197         nPageWidth -= rLRSpace.GetLeft() + rLRSpace.GetRight() + rBox.GetDistance();
198 
199 		pPageSet->Put(rFmt.GetCol());
200 		pPageSet->Put(rFmt.GetLRSpace());
201 		pColPgSet = pPageSet;
202 	}
203 	else
204 		aApplyToLB.RemoveEntry( nPagePos );
205 
206 
207 	ASSERT( pColPgSet, "" );
208 	// TabPage erzeugen
209 	SwColumnPage* pPage = (SwColumnPage*) SwColumnPage::Create( this,
210 																*pColPgSet );
211 	pTabPage = pPage;
212 
213 	//Groesse anpassen
214 	Size aPageSize(pTabPage->GetSizePixel());
215 	Size aDlgSize(GetOutputSizePixel());
216 	aDlgSize.Height() = aPageSize.Height();
217 	SetOutputSizePixel(aDlgSize);
218 	pTabPage->Show();
219 
220 	aApplyToLB.SelectEntryPos(0);
221 	ObjectHdl(0);
222 
223 	aApplyToLB.SetSelectHdl(LINK(this, SwColumnDlg, ObjectHdl));
224 	aOK.SetClickHdl(LINK(this, SwColumnDlg, OkHdl));
225     //#i80458# if no columns can be set then disable OK
226     if( !aApplyToLB.GetEntryCount() )
227         aOK.Enable( sal_False );
228     //#i97810# set focus to the TabPage
229     pTabPage->ActivateColumnControl();
230 }
231 
232 /*--------------------------------------------------------------------
233 	Beschreibung:
234  --------------------------------------------------------------------*/
235 
236 SwColumnDlg::~SwColumnDlg()
237 {
238 	delete pTabPage;
239 	delete pPageSet;
240 	delete pSectionSet;
241 	delete pSelectionSet;
242 }
243 
244 /* -----------------26.05.99 11:40-------------------
245  *
246  * --------------------------------------------------*/
247 IMPL_LINK(SwColumnDlg, ObjectHdl, ListBox*, pBox)
248 {
249 	SfxItemSet* pSet = 0;
250 	switch(nOldSelection)
251 	{
252 		case LISTBOX_SELECTION  :
253 			pSet = pSelectionSet;
254 		break;
255 		case LISTBOX_SECTION	:
256 			pSet = pSectionSet;
257 			bSectionChanged = sal_True;
258 		break;
259 		case LISTBOX_SECTIONS	:
260 			pSet = pSectionSet;
261 			bSelSectionChanged = sal_True;
262 		break;
263 		case LISTBOX_PAGE		:
264 			pSet = pPageSet;
265 			bPageChanged = sal_True;
266 		break;
267 		case LISTBOX_FRAME:
268 			pSet = pFrameSet;
269 			bFrameChanged = sal_True;
270 		break;
271 	}
272 	if(pBox)
273 	{
274 		pTabPage->FillItemSet(*pSet);
275 	}
276 	nOldSelection = (long)aApplyToLB.GetEntryData(aApplyToLB.GetSelectEntryPos());
277 	long nWidth = nSelectionWidth;
278 	switch(nOldSelection)
279 	{
280 		case LISTBOX_SELECTION  :
281 			pSet = pSelectionSet;
282             if( pSelectionSet )
283 			    pSet->Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth, nWidth));
284 		break;
285 		case LISTBOX_SECTION	:
286 		case LISTBOX_SECTIONS	:
287 			pSet = pSectionSet;
288 			pSet->Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth, nWidth));
289 		break;
290 		case LISTBOX_PAGE		:
291 			nWidth = nPageWidth;
292 			pSet = pPageSet;
293 			pSet->Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth, nWidth));
294 		break;
295 		case LISTBOX_FRAME:
296 			pSet = pFrameSet;
297 		break;
298 	}
299 
300     sal_Bool bIsSection = pSet == pSectionSet || pSet == pSelectionSet;
301     pTabPage->ShowBalance(bIsSection);
302     pTabPage->SetInSection(bIsSection);
303     pTabPage->SetFrmMode(sal_True);
304 	pTabPage->SetPageWidth(nWidth);
305 	if( pSet )
306         pTabPage->Reset(*pSet);
307 	return 0;
308 }
309 /* -----------------26.05.99 12:32-------------------
310  *
311  * --------------------------------------------------*/
312 IMPL_LINK(SwColumnDlg, OkHdl, OKButton*, EMPTYARG)
313 {
314 	//aktuelle Selektion auswerten
315 	SfxItemSet* pSet = 0;
316 	switch(nOldSelection)
317 	{
318 		case LISTBOX_SELECTION  :
319 			pSet = pSelectionSet;
320 		break;
321 		case LISTBOX_SECTION	:
322 			pSet = pSectionSet;
323 			bSectionChanged = sal_True;
324 		break;
325 		case LISTBOX_SECTIONS	:
326 			pSet = pSectionSet;
327 			bSelSectionChanged = sal_True;
328 		break;
329 		case LISTBOX_PAGE		:
330 			pSet = pPageSet;
331 			bPageChanged = sal_True;
332 		break;
333 		case LISTBOX_FRAME:
334 			pSet = pFrameSet;
335 			bFrameChanged = sal_True;
336 		break;
337 	}
338 	pTabPage->FillItemSet(*pSet);
339 
340 	if(pSelectionSet && SFX_ITEM_SET == pSelectionSet->GetItemState(RES_COL))
341 	{
342 		//Bereich mit Spalten einfuegen
343 		const SwFmtCol& rColItem = (const SwFmtCol&)pSelectionSet->Get(RES_COL);
344 		//nur, wenn es auch Spalten gibt!
345 		if(rColItem.GetNumCols() > 1)
346 			rWrtShell.GetView().GetViewFrame()->GetDispatcher()->Execute(
347                 FN_INSERT_REGION, SFX_CALLMODE_ASYNCHRON, *pSelectionSet );
348 	}
349 
350 	if(pSectionSet && pSectionSet->Count() && bSectionChanged )
351 	{
352 		const SwSection* pCurrSection = rWrtShell.GetCurrSection();
353 		const SwSectionFmt* pFmt = pCurrSection->GetFmt();
354 		sal_uInt16 nNewPos = rWrtShell.GetSectionFmtPos( *pFmt );
355         SwSectionData aData(*pCurrSection);
356         rWrtShell.UpdateSection( nNewPos, aData, pSectionSet );
357 	}
358 
359 	if(pSectionSet && pSectionSet->Count() && bSelSectionChanged )
360 	{
361 		rWrtShell.SetSectionAttr( *pSectionSet );
362 	}
363 
364 	if(pPageSet && SFX_ITEM_SET == pPageSet->GetItemState(RES_COL) && bPageChanged)
365 	{
366 		// aktuellen PageDescriptor ermitteln und damit den Set fuellen
367 		const sal_uInt16 nCurIdx = rWrtShell.GetCurPageDesc();
368 		SwPageDesc aPageDesc(rWrtShell.GetPageDesc(nCurIdx));
369 		SwFrmFmt &rFmt = aPageDesc.GetMaster();
370         rFmt.SetFmtAttr(pPageSet->Get(RES_COL));
371 		rWrtShell.ChgPageDesc(nCurIdx, aPageDesc);
372 	}
373 	if(pFrameSet && SFX_ITEM_SET == pFrameSet->GetItemState(RES_COL) && bFrameChanged)
374 	{
375 		SfxItemSet aTmp(*pFrameSet->GetPool(), RES_COL, RES_COL);
376 		aTmp.Put(*pFrameSet);
377 		rWrtShell.StartAction();
378 		rWrtShell.Push();
379 		rWrtShell.SetFlyFrmAttr( aTmp );
380 		//die Rahmenselektion wieder aufheben
381 		if(rWrtShell.IsFrmSelected())
382 		{
383 			rWrtShell.UnSelectFrm();
384 			rWrtShell.LeaveSelFrmMode();
385 		}
386 		rWrtShell.Pop();
387 		rWrtShell.EndAction();
388 	}
389 	EndDialog(RET_OK);
390 	return 0;
391 }
392 
393 /*--------------------------------------------------------------------
394 	Beschreibung:
395  --------------------------------------------------------------------*/
396 
397 #if OSL_DEBUG_LEVEL < 2
398 inline
399 #endif
400 sal_uInt16 GetMaxWidth( SwColMgr* pColMgr, sal_uInt16 nCols )
401 {
402 	sal_uInt16 nMax = pColMgr->GetActualSize();
403 	if( --nCols )
404 		nMax -= pColMgr->GetGutterWidth() * nCols;
405 	return nMax;
406 }
407 
408 static sal_uInt16 __FAR_DATA aPageRg[] = {
409 	RES_COL, RES_COL,
410 	0
411 };
412 
413 
414 DBG_NAME(columnhdl)
415 
416 
417 
418 sal_uInt16 lcl_LineWidthToPos(sal_uLong nWidth)
419 {
420 	const sal_uInt16 nUShortWidth = (sal_uInt16)nWidth;
421 	for(sal_uInt16 i = 0; i < nLineCount; ++i)
422 		if(nUShortWidth == nLines[i])
423 			return i;
424 	return 0;
425 }
426 
427 
428 
429 void SwColumnPage::ResetColWidth()
430 {
431 	if( nCols )
432 	{
433 		sal_uInt16 nWidth = GetMaxWidth( pColMgr, nCols );
434         nWidth = nWidth / nCols;
435 
436 		for(sal_uInt16 i = 0; i < nCols; ++i)
437 			nColWidth[i] = (long) nWidth;
438 	}
439 
440 }
441 
442 /*--------------------------------------------------------------------
443 	Beschreibung:	Jetzt als TabPage
444  --------------------------------------------------------------------*/
445 
446 
447 
448 SwColumnPage::SwColumnPage(Window *pParent, const SfxItemSet &rSet)
449 
450 	: SfxTabPage(pParent, SW_RES(TP_COLUMN), rSet),
451 
452     aFLGroup(this,          SW_RES(FL_COLUMNS )),
453     aClNrLbl(this,          SW_RES(FT_NUMBER  )),
454     aCLNrEdt(this,          SW_RES(ED_NUMBER  )),
455     aDefaultVS(this,        SW_RES(VS_DEFAULTS)),
456     aBalanceColsCB(this,    SW_RES(CB_BALANCECOLS)),
457 
458     aFLLayout(this,         SW_RES(FL_LAYOUT)),
459     aBtnUp(this,            SW_RES(BTN_DOWN)),
460     aColumnFT(this,         SW_RES(FT_COLUMN)),
461     aWidthFT(this,          SW_RES(FT_WIDTH)),
462     aDistFT(this,           SW_RES(FT_DIST)),
463     aLbl1(this,             SW_RES(FT_1)),
464     aEd1(this,              SW_RES(ED_1)),
465     aDistEd1(this,          SW_RES(ED_DIST1)),
466     aLbl2(this,             SW_RES(FT_2)),
467     aEd2(this,              SW_RES(ED_2)),
468     aDistEd2(this,          SW_RES(ED_DIST2)),
469     aLbl3(this,             SW_RES(FT_3)),
470     aEd3(this,              SW_RES(ED_3)),
471     aBtnDown(this,          SW_RES(BTN_UP)),
472     aAutoWidthBox(this,     SW_RES(CB_AUTO_WIDTH)),
473 
474     aFLLineType(this,       SW_RES(FL_LINETYPE)),
475     aLineTypeLbl(this,      SW_RES(FT_STYLE)),
476     aLineTypeDLB(this,      SW_RES(LB_STYLE)),
477     aLineHeightLbl(this,    SW_RES(FT_HEIGHT)),
478     aLineHeightEdit(this,   SW_RES(ED_HEIGHT)),
479     aLinePosLbl(this,       SW_RES(FT_POSITION)),
480     aLinePosDLB(this,       SW_RES(LB_POSITION)),
481 
482     aVertFL(this,         SW_RES(FL_VERT)),
483     aPropertiesFL(  this,    SW_RES( FL_PROPERTIES    )),
484     aTextDirectionFT( this,  SW_RES( FT_TEXTDIRECTION )),
485     aTextDirectionLB( this,  SW_RES( LB_TEXTDIRECTION )),
486 
487     aPgeExampleWN(this,     SW_RES(WN_BSP)),
488     aFrmExampleWN(this,     SW_RES(WN_BSP)),
489 
490     pColMgr(0),
491 
492     nFirstVis(0),
493     nMinWidth(MINLAY),
494     pModifiedField(0),
495     bFormat(sal_False),
496 	bFrm(sal_False),
497 	bHtmlMode(sal_False),
498 	bLockUpdate(sal_False)
499 {
500     sal_uInt16 i;
501 
502 	FreeResource();
503 	SetExchangeSupport();
504 
505 	aBtnDown.SetAccessibleRelationMemberOf(&aFLLayout);
506 	aEd1.SetAccessibleRelationLabeledBy(&aWidthFT);
507 	aEd2.SetAccessibleRelationLabeledBy(&aWidthFT);
508 	aEd3.SetAccessibleRelationLabeledBy(&aWidthFT);
509 	aDistEd1.SetAccessibleRelationLabeledBy(&aDistFT);
510 	aDistEd2.SetAccessibleRelationLabeledBy(&aDistFT);
511 	aBtnUp.SetAccessibleRelationLabeledBy(&aColumnFT);
512 	aBtnDown.SetAccessibleRelationLabeledBy(&aColumnFT);
513 
514     aDefaultVS.SetHelpId(HID_COLUMN_VALUESET);
515     aDefaultVS.SetColCount( 5 );
516 	aDefaultVS.SetStyle(  aDefaultVS.GetStyle()
517 							| WB_ITEMBORDER
518 							| WB_DOUBLEBORDER );
519 
520 //IAccessibility2 Impplementaton 2009-----
521     for( i = 0; i < 5; i++)
522 		//Solution:Set accessible name one be one
523 		//aDefaultVS.InsertItem( i + 1, i );
524 		{
525 			String aItemText;
526 			switch( i )
527 			{
528 				case 0:
529 					aItemText =  SW_RESSTR( STR_COLUMN_VALUESET_ITEM0 ) ;
530 					break;
531 				case 1:
532 					aItemText =  SW_RESSTR( STR_COLUMN_VALUESET_ITEM1 ) ;
533 					break;
534 				case 2:
535 					aItemText =  SW_RESSTR( STR_COLUMN_VALUESET_ITEM2 ) ;
536 					break;
537 				case 3:
538 					aItemText =  SW_RESSTR( STR_COLUMN_VALUESET_ITEM3 );
539 					break;
540 				case 4:
541 					aItemText =  SW_RESSTR( STR_COLUMN_VALUESET_ITEM4 );
542 					break;
543 				default:
544 					break;
545 			}
546 			aDefaultVS.InsertItem( i + 1,  aItemText, i );
547 		}
548 //-----IAccessibility2 Impplementaton 2009
549 
550 	aDefaultVS.SetSelectHdl(LINK(this, SwColumnPage, SetDefaultsHdl));
551 
552 	// Controls fuer Zusaetzebereich beim MoreButton anmelden
553     Link aCLNrLk = LINK(this, SwColumnPage, ColModify);
554     aCLNrEdt.SetLoseFocusHdl(aCLNrLk);
555     aCLNrEdt.SetUpHdl(aCLNrLk);
556     aCLNrEdt.SetDownHdl(aCLNrLk);
557     Link aLk = LINK(this, SwColumnPage, GapModify);
558 	aDistEd1.SetUpHdl(aLk);
559 	aDistEd1.SetDownHdl(aLk);
560 	aDistEd1.SetLoseFocusHdl(aLk);
561 	aDistEd2.SetUpHdl(aLk);
562 	aDistEd2.SetDownHdl(aLk);
563 	aDistEd2.SetLoseFocusHdl(aLk);
564 
565 	aLk = LINK(this, SwColumnPage, EdModify);
566 
567 	aEd1.SetUpHdl(aLk);
568 	aEd1.SetDownHdl(aLk);
569 	aEd1.SetLoseFocusHdl(aLk);
570 
571 	aEd2.SetUpHdl(aLk);
572 	aEd2.SetDownHdl(aLk);
573 	aEd2.SetLoseFocusHdl(aLk);
574 
575 	aEd3.SetUpHdl(aLk);
576 	aEd3.SetDownHdl(aLk);
577 	aEd3.SetLoseFocusHdl(aLk);
578 
579 	aBtnUp.SetClickHdl(LINK(this, SwColumnPage, Up));
580 	aBtnDown.SetClickHdl(LINK(this, SwColumnPage, Down));
581 	aAutoWidthBox.SetClickHdl(LINK(this, SwColumnPage, AutoWidthHdl));
582 
583 	aLk = LINK( this, SwColumnPage, UpdateColMgr );
584 	aLineTypeDLB.SetSelectHdl( aLk );
585 	aLineHeightEdit.SetModifyHdl( aLk );
586 	aLinePosDLB.SetSelectHdl( aLk );
587 
588 		// Trennlinie
589 	aLineTypeDLB.SetUnit( FUNIT_POINT );
590 	aLineTypeDLB.SetSourceUnit( FUNIT_TWIP );
591 	for( i = 0; i < nLineCount; ++i )
592 		aLineTypeDLB.InsertEntry( 100 * nLines[ i ] );
593 }
594 
595 
596 
597 SwColumnPage::~SwColumnPage()
598 {
599 	delete pColMgr;
600 }
601 
602 /*--------------------------------------------------------------------
603 	Beschreibung:
604  --------------------------------------------------------------------*/
605 
606 
607 void SwColumnPage::SetPageWidth(long nPageWidth)
608 {
609     long nNewMaxWidth = static_cast< long >(aEd1.NormalizePercent(nPageWidth));
610 
611 	aDistEd1.SetMax(nNewMaxWidth, FUNIT_TWIP);
612 	aDistEd2.SetMax(nNewMaxWidth, FUNIT_TWIP);
613 	aEd1.SetMax(nNewMaxWidth, FUNIT_TWIP);
614 	aEd2.SetMax(nNewMaxWidth, FUNIT_TWIP);
615 	aEd3.SetMax(nNewMaxWidth, FUNIT_TWIP);
616 }
617 
618 /*--------------------------------------------------------------------
619 	Beschreibung:
620  --------------------------------------------------------------------*/
621 
622 
623 
624 void SwColumnPage::Reset(const SfxItemSet &rSet)
625 {
626 	sal_uInt16 nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
627 	if(nHtmlMode & HTMLMODE_ON)
628 	{
629 		bHtmlMode = sal_True;
630 		aAutoWidthBox.Enable(sal_False);
631 	}
632 	FieldUnit aMetric = ::GetDfltMetric(bHtmlMode);
633 	SetMetric(aEd1, aMetric);
634 	SetMetric(aEd2, aMetric);
635 	SetMetric(aEd3, aMetric);
636 	SetMetric(aDistEd1, aMetric);
637 	SetMetric(aDistEd2, aMetric);
638 
639 	delete pColMgr;
640 	pColMgr = new SwColMgr(rSet);
641 	nCols 	= pColMgr->GetCount() ;
642 	aCLNrEdt.SetMax(Max((sal_uInt16)aCLNrEdt.GetMax(), (sal_uInt16)nCols));
643 	aCLNrEdt.SetLast(Max(nCols,(sal_uInt16)aCLNrEdt.GetMax()));
644 
645 	if(bFrm)
646 	{
647 		if(bFormat)                     // hier gibt es keine Size
648 			pColMgr->SetActualWidth(FRAME_FORMAT_WIDTH);
649 		else
650 		{
651 			const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE);
652 			const SvxBoxItem& rBox = (const SvxBoxItem&) rSet.Get(RES_BOX);
653 			pColMgr->SetActualWidth((sal_uInt16)rSize.GetSize().Width() - rBox.GetDistance());
654 		}
655 	}
656     if(aBalanceColsCB.IsVisible())
657 	{
658         const SfxPoolItem* pItem;
659         if( SFX_ITEM_SET == rSet.GetItemState( RES_COLUMNBALANCE, sal_False, &pItem ))
660 			aBalanceColsCB.Check(!((const SwFmtNoBalancedColumns*)pItem)->GetValue());
661 		else
662 			aBalanceColsCB.Check( sal_True );
663 	}
664 
665     //text direction
666     if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( RES_FRAMEDIR ) )
667 	{
668         const SvxFrameDirectionItem& rItem = (const SvxFrameDirectionItem&)rSet.Get(RES_FRAMEDIR);
669         sal_uInt32 nVal  = rItem.GetValue();
670         sal_uInt16 nPos = aTextDirectionLB.GetEntryPos( (void*) nVal );
671         aTextDirectionLB.SelectEntryPos( nPos );
672         aTextDirectionLB.SaveValue();
673 	}
674 
675     Init();
676 	ActivatePage( rSet );
677 }
678 
679 /*--------------------------------------------------------------------
680 	Beschreibung:	TabPage erzeugen
681  --------------------------------------------------------------------*/
682 
683 
684 
685 SfxTabPage* SwColumnPage::Create(Window *pParent, const SfxItemSet &rSet)
686 {
687 	return new SwColumnPage(pParent, rSet);
688 }
689 
690 /*--------------------------------------------------------------------
691 	Beschreibung:	Attribute in den Set stopfen bei OK
692  --------------------------------------------------------------------*/
693 
694 
695 
696 sal_Bool SwColumnPage::FillItemSet(SfxItemSet &rSet)
697 {
698     if(aCLNrEdt.HasChildPathFocus())
699         aCLNrEdt.GetDownHdl().Call(&aCLNrEdt);
700     // Im ItemSet setzen
701 	// Die aktuellen Einstellungen sind
702 	// schon vorhanden
703 	//
704 	const SfxPoolItem* pOldItem;
705 	const SwFmtCol& rCol = pColMgr->GetColumns();
706 	if(0 == (pOldItem = GetOldItem( rSet, RES_COL )) ||
707 				rCol != *pOldItem )
708 		rSet.Put(rCol);
709 
710 	if(aBalanceColsCB.IsVisible() )
711 	{
712 		rSet.Put(SwFmtNoBalancedColumns(!aBalanceColsCB.IsChecked() ));
713 	}
714     sal_uInt16 nPos;
715     if( aTextDirectionLB.IsVisible() &&
716         ( nPos = aTextDirectionLB.GetSelectEntryPos() ) !=
717                                             aTextDirectionLB.GetSavedValue() )
718 	{
719         sal_uInt32 nDirection = (sal_uInt32)(sal_IntPtr)aTextDirectionLB.GetEntryData( nPos );
720         rSet.Put( SvxFrameDirectionItem( (SvxFrameDirection)nDirection, RES_FRAMEDIR));
721 	}
722     return sal_True;
723 }
724 
725 /*--------------------------------------------------------------------
726 	Beschreibung:	ColumnManager updaten
727  --------------------------------------------------------------------*/
728 
729 
730 
731 IMPL_LINK( SwColumnPage, UpdateColMgr, void *, /*pField*/ )
732 {
733 	long nGutterWidth = pColMgr->GetGutterWidth();
734 	if(nCols > 1)
735 	{
736 			// Ermitteln, ob die schmalste Spalte zu schmal ist
737 			// fuer den eingestellten Spaltenabstand
738 		long nMin = nColWidth[0];
739 		sal_uInt16 i;
740 
741 		for( i = 1; i < nCols; ++i)
742 			nMin = Min(nMin, nColWidth[i]);
743 
744 		sal_Bool bAutoWidth = aAutoWidthBox.IsChecked();
745 		if(!bAutoWidth)
746 		{
747 			pColMgr->SetAutoWidth(sal_False);
748 				// falls der Benutzer nicht die Gesamtbreite vergeben hat,
749 				// den fehlenden Betrag auf die letzte Spalte addieren.
750 			long nSum = 0;
751 			for(i = 0; i < nCols; ++i)
752 				nSum += nColWidth[i];
753 			nGutterWidth = 0;
754 			for(i = 0; i < nCols - 1; ++i)
755 				nGutterWidth += nColDist[i];
756 			nSum += nGutterWidth;
757 
758 			long nMaxW = pColMgr->GetActualSize();
759 
760 			if( nSum < nMaxW  )
761 				nColWidth[nCols - 1] += nMaxW - nSum;
762 
763             pColMgr->SetColWidth( 0, static_cast< sal_uInt16 >(nColWidth[0] + (sal_uInt16)nColDist[0]/2) );
764 			for( i = 1; i < nCols-1; ++i )
765 			{
766 				long nActDist = (nColDist[i] + nColDist[i - 1]) / 2;
767 				pColMgr->SetColWidth( i, (sal_uInt16)nColWidth[i] + (sal_uInt16)nActDist );
768 			}
769             pColMgr->SetColWidth( nCols-1, static_cast< sal_uInt16 >(nColWidth[nCols-1] + nColDist[nCols -2]/2) );
770 
771 		}
772 
773 			// keins ist ausgeschaltet
774         const sal_uInt16 nPos = aLineTypeDLB.GetSelectEntryPos();
775         sal_Bool bEnable = 0 != nPos;
776 		aLineHeightEdit.Enable( bEnable );
777 		aLineHeightLbl.Enable( bEnable );
778 		if( !bEnable )
779 			pColMgr->SetNoLine();
780 		else if( LISTBOX_ENTRY_NOTFOUND != nPos )
781 		{
782 			pColMgr->SetLineWidthAndColor(nLines[nPos - 1], Color(COL_BLACK) );
783 			pColMgr->SetAdjust( SwColLineAdj(
784 									aLinePosDLB.GetSelectEntryPos() + 1) );
785 			pColMgr->SetLineHeightPercent((short)aLineHeightEdit.GetValue());
786 			bEnable = pColMgr->GetLineHeightPercent() != 100;
787 		}
788 		aLinePosLbl.Enable( bEnable );
789 		aLinePosDLB.Enable( bEnable );
790 	}
791 	else
792 	{
793 		pColMgr->NoCols();
794         nCols = 0;
795 	}
796 
797 	//Maximalwerte setzen
798 	aCLNrEdt.SetMax(Max(1L,
799 		Min(long(nMaxCols), long( pColMgr->GetActualSize() / (nGutterWidth + MINLAY)) )));
800 	aCLNrEdt.SetLast(aCLNrEdt.GetMax());
801 	aCLNrEdt.Reformat();
802 
803 	//Beispielfenster anregen
804 	if(!bLockUpdate)
805 	{
806 		if(bFrm)
807 		{
808 			aFrmExampleWN.SetColumns( pColMgr->GetColumns() );
809 			aFrmExampleWN.Invalidate();
810 		}
811 		else
812 			aPgeExampleWN.Invalidate();
813 	}
814 
815 	return 0;
816 }
817 
818 /*------------------------------------------------------------------------
819  Beschreibung:	Initialisierung
820 ------------------------------------------------------------------------*/
821 
822 
823 
824 void SwColumnPage::Init()
825 {
826 	aCLNrEdt.SetValue(nCols);
827 
828     sal_Bool bAutoWidth = pColMgr->IsAutoWidth() || bHtmlMode;
829     aAutoWidthBox.Check( bAutoWidth );
830 
831     sal_Int32 nColumnWidthSum = 0;
832     // Setzen der Breiten
833     sal_uInt16 i;
834     for(i = 0; i < nCols; ++i)
835 	{
836 		nColWidth[i] = pColMgr->GetColWidth(i);
837         nColumnWidthSum += nColWidth[i];
838 		if(i < nCols - 1)
839 			nColDist[i] = pColMgr->GetGutterWidth(i);
840 	}
841 
842 	if( 1 < nCols )
843 	{
844         // #97495# make sure that the automatic column widht's are always equal
845         if(bAutoWidth)
846         {
847             nColumnWidthSum /= nCols;
848             for(i = 0; i < nCols; ++i)
849                 nColWidth[i] = nColumnWidthSum;
850         }
851         SwColLineAdj eAdj = pColMgr->GetAdjust();
852 		if( COLADJ_NONE == eAdj )		// der Dialog kennt kein NONE!
853 		{
854 			eAdj = COLADJ_TOP;
855 			//ohne Adjust auch kein Linientyp
856 			aLineTypeDLB.SelectEntryPos( 0 );
857 			aLineHeightEdit.SetValue( 100 );
858 		}
859 		else
860 		{
861 			aLineTypeDLB.SelectEntryPos( lcl_LineWidthToPos(( pColMgr->GetLineWidth() )) + 1);
862 			aLineHeightEdit.SetValue( pColMgr->GetLineHeightPercent() );
863 		}
864         aLinePosDLB.SelectEntryPos( static_cast< sal_uInt16 >(eAdj - 1) );
865 	}
866 	else
867 	{
868 		aLinePosDLB.SelectEntryPos( 0 );
869 		aLineTypeDLB.SelectEntryPos( 0 );
870 		aLineHeightEdit.SetValue( 100 );
871 	}
872 
873 	UpdateCols();
874 	Update();
875 
876 		// Maximale Spaltenzahl setzen
877 		// Werte kleiner als 1 sind nicht erlaubt
878 	aCLNrEdt.SetMax(Max(1L,
879 		Min(long(nMaxCols), long( pColMgr->GetActualSize() / nMinWidth) )));
880 }
881 
882 /*------------------------------------------------------------------------
883  Beschreibung:	Die Anzahl der Spalten hat sich veraendert -- hier werden
884 				die Controls fuer die Bearbeitung der Spalten entsprechend
885 				der Spaltenzahl en- oder disabled.
886 				Falls es mehr als nVisCols (= 3) Spalten gibt, werden
887 				alle Edit enabled und die Buttons fuer das Scrollen
888 				ebenfalls.
889 				Andernfalls werden die Edits jeweils fuer die entsprechenden
890 				Spaltenzahl enabled; eine Spalte kann nicht bearbeitet werden.
891 ------------------------------------------------------------------------*/
892 
893 
894 
895 void SwColumnPage::UpdateCols()
896 {
897 	sal_Bool bEnableBtns= sal_False;
898 	sal_Bool bEnable12	= sal_False;
899 	sal_Bool bEnable3	= sal_False;
900 	const sal_Bool bEdit = !aAutoWidthBox.IsChecked();
901 	if ( nCols > nVisCols )
902 	{
903 		bEnableBtns = sal_True && !bHtmlMode;
904 		bEnable12 = bEnable3 = bEdit;
905 	}
906 	else if( bEdit )
907 	{
908 		// hier gibt es absichtlich kaum noch breaks
909 		switch(nCols)
910 		{
911 			case 3: bEnable3 = sal_True;
912 			case 2: bEnable12= sal_True; break;
913 			default: /* do nothing */;
914 		}
915 	}
916 	aEd1.Enable( bEnable12 );
917 	aDistEd1.Enable(nCols > 1);
918 	aEd2.Enable( bEnable12 );
919 	aDistEd2.Enable(bEnable3);
920 	aEd3.Enable( bEnable3  );
921     aLbl1.Enable(bEnable12 );
922     aLbl2.Enable(bEnable12 );
923     aLbl3.Enable(bEnable3  );
924 	aBtnUp.Enable( bEnableBtns );
925 	aBtnDown.Enable( bEnableBtns );
926 
927 	const sal_Bool bEnable = nCols > 1;
928 	if( !bEnable )
929 	{
930 		aLinePosDLB.Enable( sal_False );
931 		aLinePosLbl.Enable( sal_False );
932 	}
933 	aLineHeightEdit.Enable( bEnable );
934 	aLineHeightLbl.Enable( bEnable );
935 	aLineTypeDLB.Enable( bEnable );
936 	aLineTypeLbl.Enable( bEnable );
937 	aAutoWidthBox.Enable( bEnable && !bHtmlMode );
938 }
939 
940 void SwColumnPage::SetLabels( sal_uInt16 nVis )
941 {
942 	String sLbl( '~' );
943 
944 	String sLbl2( String::CreateFromInt32( nVis + 1 ));
945 	String tmp1(sLbl2);
946 	sLbl2.Insert(sLbl, sLbl2.Len() - 1);
947     aLbl1.SetText(sLbl2);
948 
949 	sLbl2 = String::CreateFromInt32( nVis + 2 );
950 	String tmp2(sLbl2);
951 	sLbl2.Insert(sLbl, sLbl2.Len() - 1);
952     aLbl2.SetText(sLbl2);
953 
954 	sLbl2 = String::CreateFromInt32( nVis + 3 );
955 	String tmp3(sLbl2);
956 	sLbl2.Insert(sLbl, sLbl2.Len() - 1);
957     aLbl3.SetText(sLbl2);
958 	String sColumnWidth = SW_RESSTR( STR_ACCESS_COLUMN_WIDTH ) ;
959 	sColumnWidth.SearchAndReplaceAscii("%1", tmp1);
960 	aEd1.SetAccessibleName(sColumnWidth);
961 
962 	sColumnWidth = SW_RESSTR( STR_ACCESS_COLUMN_WIDTH ) ;
963 	sColumnWidth.SearchAndReplaceAscii("%1", tmp2);
964 	aEd2.SetAccessibleName(sColumnWidth);
965 
966 	sColumnWidth = SW_RESSTR( STR_ACCESS_COLUMN_WIDTH ) ;
967 	sColumnWidth.SearchAndReplaceAscii("%1", tmp3);
968 	aEd3.SetAccessibleName(sColumnWidth);
969 
970 	String sDist = SW_RESSTR( STR_ACCESS_PAGESETUP_SPACING ) ;
971 	String sDist1 = sDist;
972 	sDist1.SearchAndReplaceAscii("%1", tmp1);
973 	sDist1.SearchAndReplaceAscii("%2", tmp2);
974 	aDistEd1.SetAccessibleName(sDist1);
975 
976 	String sDist2 = sDist;
977 	sDist2.SearchAndReplaceAscii("%1", tmp2);
978 	sDist2.SearchAndReplaceAscii("%2", tmp3);
979 	aDistEd2.SetAccessibleName(sDist2);
980 }
981 
982 /*------------------------------------------------------------------------
983  Beschreibung:	Handler, der bei einer Veraenderung der Spaltenzahl
984 				gerufen wird.
985 				Eine Aenderung der Spaltenzahl ueberschreibt eventuelle
986 				Breiteneinstellungen des Benutzers; alle Spalten sind
987 				gleich breit.
988 ------------------------------------------------------------------------*/
989 
990 IMPL_LINK( SwColumnPage, ColModify, NumericField *, pNF )
991 {
992     nCols = (sal_uInt16)aCLNrEdt.GetValue();
993     //#107890# the handler is also called from LoseFocus()
994     //then no change has been made and thus no action should be taken
995 	// #i17816# changing the displayed types within the ValueSet
996 	//from two columns to two columns with different settings doesn't invalidate the
997 	// example windows in ::ColModify()
998 //IAccessibility2 Impplementaton 2009-----
999 // the pColMgr->GetCount()'s return is some how bugged,
1000 // it will return 0 when actual count is 1, so fix it.
1001     //if(!pNF ||(pColMgr->GetCount() != nCols))
1002 	int nTemp = pColMgr->GetCount();
1003 	if(nTemp == 0) nTemp = 1;
1004     if( nTemp != nCols )
1005 //-----IAccessibility2 Impplementaton 2009
1006     {
1007         if(pNF)
1008             aDefaultVS.SetNoSelection();
1009         long nDist = static_cast< long >(aDistEd1.DenormalizePercent(aDistEd1.GetValue(FUNIT_TWIP)));
1010         pColMgr->SetCount(nCols, (sal_uInt16)nDist);
1011         for(sal_uInt16 i = 0; i < nCols; i++)
1012             nColDist[i] = nDist;
1013         nFirstVis = 0;
1014         SetLabels( nFirstVis );
1015         UpdateCols();
1016         ResetColWidth();
1017         Update();
1018     }
1019 
1020 	return 0;
1021 }
1022 
1023 /*------------------------------------------------------------------------
1024  Beschreibung:	Modify- Handler fuer eine Aenderung der Spaltenbreite
1025 				oder des Spaltenabstandes.
1026 				Diese Aenderungen wirken sich erst zeitversetzt aus.
1027 				Durch eine Aenderung der Spaltenbreite wird die automatische
1028 				Berechnung der Spaltenbreite ausser Kraft gesetzt; erst
1029 				eine Aenderung der Spaltenzahl kehrt wieder zu diesem
1030 				Default zurueck.
1031 ------------------------------------------------------------------------*/
1032 
1033 
1034 
1035 IMPL_LINK( SwColumnPage, GapModify, PercentField *, pFld )
1036 {
1037     long nActValue = static_cast< long >(pFld->DenormalizePercent(pFld->GetValue(FUNIT_TWIP)));
1038 	if(nCols < 2)
1039 		return 0;
1040 	if(aAutoWidthBox.IsChecked())
1041 	{
1042 		sal_uInt16 nMaxGap = pColMgr->GetActualSize() - nCols * MINLAY;
1043 		DBG_ASSERT(nCols, "Abstand kann nicht ohne Spalten eingestellt werden");
1044 		nMaxGap /= nCols - 1;
1045 		if(nActValue > nMaxGap)
1046 		{
1047 			nActValue = nMaxGap;
1048             aDistEd1.SetPrcntValue(aDistEd1.NormalizePercent(nMaxGap), FUNIT_TWIP);
1049 		}
1050 		pColMgr->SetGutterWidth((sal_uInt16)nActValue);
1051 		for(sal_uInt16 i = 0; i < nCols; i++)
1052 			nColDist[i] = nActValue;
1053 
1054 		ResetColWidth();
1055 		UpdateCols();
1056 	}
1057 	else
1058 
1059 	{
1060 		sal_uInt16 nOffset = 0;
1061 		if(pFld == &aDistEd2)
1062 		{
1063 			nOffset = 1;
1064 		}
1065 		long nDiff = nActValue - nColDist[nFirstVis + nOffset];
1066 		if(nDiff)
1067 		{
1068 			long nLeft = nColWidth[nFirstVis + nOffset];
1069 			long nRight = nColWidth[nFirstVis + nOffset + 1];
1070 			if(nLeft + nRight + 2 * MINLAY < nDiff)
1071 				nDiff = nLeft + nRight - 2 * MINLAY;
1072 			if(nDiff < nRight - MINLAY)
1073 			{
1074 				nRight -= nDiff;
1075 			}
1076 			else
1077 			{
1078 				long nTemp = nDiff - nRight + MINLAY;
1079 				nRight = MINLAY;
1080 				if(nLeft > nTemp - MINLAY)
1081 				{
1082 					nLeft -= nTemp;
1083 					nTemp = 0;
1084 				}
1085 				else
1086 				{
1087 					nTemp -= nLeft + MINLAY;
1088 					nLeft = MINLAY;
1089 				}
1090 				nDiff = nTemp;
1091 			}
1092 			nColWidth[nFirstVis + nOffset] = nLeft;
1093 			nColWidth[nFirstVis + nOffset + 1] = nRight;
1094 			nColDist[nFirstVis + nOffset] += nDiff;
1095 
1096 			pColMgr->SetColWidth( nFirstVis + nOffset, sal_uInt16(nLeft) );
1097 			pColMgr->SetColWidth( nFirstVis + nOffset + 1, sal_uInt16(nRight) );
1098 			pColMgr->SetGutterWidth( sal_uInt16(nColDist[nFirstVis + nOffset]), nFirstVis + nOffset );
1099 		}
1100 
1101 	}
1102 	Update();
1103 	return 0;
1104 }
1105 
1106 /*------------------------------------------------------------------------
1107  Beschreibung:
1108 ------------------------------------------------------------------------*/
1109 
1110 
1111 
1112 IMPL_LINK( SwColumnPage, EdModify, PercentField *, pField )
1113 {
1114 	pModifiedField = pField;
1115 	Timeout(0);
1116 	return 0;
1117 }
1118 /*------------------------------------------------------------------------
1119  Beschreibung:	Handler hinter der Checkbox fuer automatische Breite.
1120 				Ist die Box gecheckt, koennen keine expliziten Werte
1121 				fuer die Spaltenbreite eingegeben werden.
1122 ------------------------------------------------------------------------*/
1123 
1124 
1125 
1126 IMPL_LINK( SwColumnPage, AutoWidthHdl, CheckBox *, pBox )
1127 {
1128     long nDist = static_cast< long >(aDistEd1.DenormalizePercent(aDistEd1.GetValue(FUNIT_TWIP)));
1129 	pColMgr->SetCount(nCols, (sal_uInt16)nDist);
1130 	for(sal_uInt16 i = 0; i < nCols; i++)
1131 		nColDist[i] = nDist;
1132 	if(pBox->IsChecked())
1133 	{
1134 		pColMgr->SetGutterWidth(sal_uInt16(nDist));
1135 		ResetColWidth();
1136 	}
1137 	pColMgr->SetAutoWidth(pBox->IsChecked(), sal_uInt16(nDist));
1138 	UpdateCols();
1139 	Update();
1140 	return 0;
1141 }
1142 
1143 /*------------------------------------------------------------------------
1144  Beschreibung:	Raufscrollen der Inhalte der Edits.
1145 ------------------------------------------------------------------------*/
1146 
1147 IMPL_LINK( SwColumnPage, Up, Button *, EMPTYARG )
1148 {
1149 	if( nFirstVis )
1150 	{
1151 		--nFirstVis;
1152 		SetLabels( nFirstVis );
1153 		Update();
1154 	}
1155 	return 0;
1156 }
1157 /*------------------------------------------------------------------------
1158  Beschreibung:	Runterscrollen der Inhalte der Edits.
1159 ------------------------------------------------------------------------*/
1160 
1161 IMPL_LINK( SwColumnPage, Down, Button *, EMPTYARG )
1162 {
1163 	if( nFirstVis + nVisCols < nCols )
1164 	{
1165 		++nFirstVis;
1166 		SetLabels( nFirstVis );
1167 		Update();
1168 	}
1169 	return 0;
1170 }
1171 /*------------------------------------------------------------------------
1172  Beschreibung:	Relikt aus alten Zeiten - jetzt direkt ohne time
1173  * 				Timer- Handler; angetriggert durch eine Aenderung der
1174 				Spaltenbreite oder des Spaltenabstandes.
1175 ------------------------------------------------------------------------*/
1176 
1177 IMPL_LINK( SwColumnPage, Timeout, Timer *, EMPTYARG )
1178 {
1179 	DBG_PROFSTART(columnhdl) ;
1180 	if(pModifiedField)
1181 	{
1182 			// Finden der veraenderten Spalte
1183 		sal_uInt16 nChanged = nFirstVis;
1184 		if(pModifiedField == &aEd2)
1185 			++nChanged;
1186 		else if(pModifiedField == &aEd3)
1187 			nChanged += 2;
1188 		/*else if(pModifiedField == &aEd4)
1189 			nChanged += 3;*/
1190 
1191 		long nNewWidth = (sal_uInt16)
1192 			pModifiedField->DenormalizePercent(pModifiedField->GetValue(FUNIT_TWIP));
1193 		long nDiff = nNewWidth - nColWidth[nChanged];
1194 
1195 		// wenn es die letzte Spalte ist
1196 		if(nChanged == nCols - 1)
1197 		{
1198 			nColWidth[0] -= nDiff;
1199 			if(nColWidth[0] < (long)nMinWidth)
1200 			{
1201 				nNewWidth -= nMinWidth - nColWidth[0];
1202 				nColWidth[0] = nMinWidth;
1203 			}
1204 
1205 		}
1206 		else if(nDiff)
1207 		{
1208 			nColWidth[nChanged + 1] -= nDiff;
1209 			if(nColWidth[nChanged + 1] < (long) nMinWidth)
1210 			{
1211 				nNewWidth -= nMinWidth - nColWidth[nChanged + 1];
1212 				nColWidth[nChanged + 1] = nMinWidth;
1213 			}
1214 		}
1215 		nColWidth[nChanged] = nNewWidth;
1216 		pModifiedField = 0;
1217 	}
1218 	Update();
1219 	DBG_PROFSTOP(columnhdl) ;
1220 	return 0;
1221 }
1222 /*------------------------------------------------------------------------
1223  Beschreibung:	Aktualisierung der Anzeige
1224 ------------------------------------------------------------------------*/
1225 
1226 
1227 
1228 void SwColumnPage::Update()
1229 {
1230 	aBalanceColsCB.Enable(nCols > 1);
1231 	if(nCols >= 2)
1232 	{
1233         aEd1.SetPrcntValue(aEd1.NormalizePercent(nColWidth[nFirstVis]), FUNIT_TWIP);
1234         aDistEd1.SetPrcntValue(aDistEd1.NormalizePercent(nColDist[nFirstVis]), FUNIT_TWIP);
1235         aEd2.SetPrcntValue(aEd2.NormalizePercent(nColWidth[nFirstVis + 1]), FUNIT_TWIP);
1236 		if(nCols >= 3)
1237 		{
1238             aDistEd2.SetPrcntValue(aDistEd2.NormalizePercent(nColDist[nFirstVis + 1]), FUNIT_TWIP);
1239             aEd3.SetPrcntValue(aEd3.NormalizePercent(nColWidth[nFirstVis + 2]), FUNIT_TWIP);
1240 		}
1241 		else
1242 		{
1243 			aEd3.SetText(aEmptyStr);
1244 			aDistEd2.SetText(aEmptyStr);
1245 		}
1246 	}
1247 	else
1248 	{
1249 		aEd1.SetText(aEmptyStr);
1250 		aEd2.SetText(aEmptyStr);
1251 		aEd3.SetText(aEmptyStr);
1252 		aDistEd1.SetText(aEmptyStr);
1253 		aDistEd2.SetText(aEmptyStr);
1254 	}
1255 	UpdateColMgr(0);
1256 }
1257 
1258 /*--------------------------------------------------------------------
1259 	Beschreibung:	Update Bsp
1260  --------------------------------------------------------------------*/
1261 
1262 
1263 
1264 void SwColumnPage::ActivatePage(const SfxItemSet& rSet)
1265 {
1266 	if(!bFrm)
1267 	{
1268 		if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_PAGE_SIZE ))
1269 		{
1270 			const SvxSizeItem& rSize = (const SvxSizeItem&)rSet.Get(
1271 												SID_ATTR_PAGE_SIZE);
1272 			const SvxLRSpaceItem& rLRSpace = (const SvxLRSpaceItem&)rSet.Get(
1273 																RES_LR_SPACE );
1274 			const SvxBoxItem& rBox = (const SvxBoxItem&) rSet.Get(RES_BOX);
1275             sal_uInt16 nActWidth = static_cast< sal_uInt16 >(rSize.GetSize().Width()
1276                             - rLRSpace.GetLeft() - rLRSpace.GetRight() - rBox.GetDistance());
1277 
1278 			if( pColMgr->GetActualSize() != nActWidth)
1279 			{
1280 				pColMgr->SetActualWidth(nActWidth);
1281 				ColModify( 0 );
1282 				UpdateColMgr( 0 );
1283 			}
1284 		}
1285 		aFrmExampleWN.Hide();
1286 		aPgeExampleWN.UpdateExample( rSet, pColMgr );
1287 		aPgeExampleWN.Show();
1288 
1289 	}
1290 	else
1291 	{
1292 		aPgeExampleWN.Hide();
1293 		aFrmExampleWN.Show();
1294 
1295 		// Size
1296         const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE);
1297         const SvxBoxItem& rBox = (const SvxBoxItem&) rSet.Get(RES_BOX);
1298 
1299         long nDistance = rBox.GetDistance();
1300 		const sal_uInt16 nTotalWish = bFormat ? FRAME_FORMAT_WIDTH : sal_uInt16(rSize.GetWidth() - 2 * nDistance);
1301 
1302 		// Maximalwerte der Spaltenbreiten setzen
1303 		SetPageWidth(nTotalWish);
1304 
1305 		if(pColMgr->GetActualSize() != nTotalWish)
1306 		{
1307 			pColMgr->SetActualWidth(nTotalWish);
1308 			Init();
1309 		}
1310 		sal_Bool bPercent;
1311 		// im Rahmenformat nur relative Angaben
1312 		if ( bFormat || (rSize.GetWidthPercent() && rSize.GetWidthPercent() != 0xff) )
1313 		{
1314 			// Wert fuer 100% setzen
1315 			aEd1.SetRefValue(nTotalWish);
1316 			aEd2.SetRefValue(nTotalWish);
1317 			aEd3.SetRefValue(nTotalWish);
1318 			aDistEd1.SetRefValue(nTotalWish);
1319 			aDistEd2.SetRefValue(nTotalWish);
1320 
1321 			// Auf %-Darstellung umschalten
1322 			bPercent = sal_True;
1323 		}
1324 		else
1325 			bPercent = sal_False;
1326 
1327 		aEd1.ShowPercent(bPercent);
1328 		aEd2.ShowPercent(bPercent);
1329 		aEd3.ShowPercent(bPercent);
1330 		aDistEd1.ShowPercent(bPercent);
1331 		aDistEd2.ShowPercent(bPercent);
1332 		aDistEd1.MetricField::SetMin(0);
1333 		aDistEd2.MetricField::SetMin(0);
1334 	}
1335 	Update();
1336 }
1337 
1338 /*--------------------------------------------------------------------
1339 	Beschreibung:
1340  --------------------------------------------------------------------*/
1341 
1342 
1343 
1344 int SwColumnPage::DeactivatePage(SfxItemSet *_pSet)
1345 {
1346     if(_pSet)
1347         FillItemSet(*_pSet);
1348 
1349 	return sal_True;
1350 }
1351 
1352 
1353 
1354 sal_uInt16* SwColumnPage::GetRanges()
1355 {
1356 	return aPageRg;
1357 }
1358 
1359 /*--------------------------------------------------------------------
1360 	Beschreibung:
1361  --------------------------------------------------------------------*/
1362 
1363 
1364 
1365 IMPL_LINK( SwColumnPage, SetDefaultsHdl, ValueSet *, pVS )
1366 {
1367 	sal_uInt16 nItem = pVS->GetSelectItemId();
1368 	if( nItem < 4 )
1369 	{
1370 		aCLNrEdt.SetValue( nItem );
1371 		aAutoWidthBox.Check();
1372         aDistEd1.SetPrcntValue(0);
1373 		ColModify(0);
1374 	}
1375 	else
1376 	{
1377 		bLockUpdate = sal_True;
1378 		aCLNrEdt.SetValue( 2 );
1379 		aAutoWidthBox.Check(sal_False);
1380         aDistEd1.SetPrcntValue(0);
1381 		ColModify(0);
1382 		// jetzt noch das Breitenverhaeltnisse auf 2 : 1 bzw. 1 : 2 stellen
1383 		sal_uInt16 nSmall = pColMgr->GetActualSize()  / 3;
1384 		if(nItem == 4)
1385 		{
1386             aEd2.SetPrcntValue(aEd2.NormalizePercent(long(nSmall)), FUNIT_TWIP);
1387 			pModifiedField = &aEd2;
1388 		}
1389 		else
1390 		{
1391             aEd1.SetPrcntValue(aEd1.NormalizePercent(long(nSmall)), FUNIT_TWIP);
1392 			pModifiedField = &aEd1;
1393 		}
1394 		bLockUpdate = sal_False;
1395 		Timeout(0);
1396 
1397 	}
1398 	return 0;
1399 }
1400 
1401 /*-----------------25.10.96 11.41-------------------
1402 
1403 --------------------------------------------------*/
1404 
1405 
1406 void SwColumnPage::SetFrmMode(sal_Bool bMod)
1407 {
1408 	bFrm = bMod;
1409 }
1410 /* -----------------------------2002/06/19 13:08------------------------------
1411 
1412  ---------------------------------------------------------------------------*/
1413 void SwColumnPage::SetInSection(sal_Bool bSet)
1414 {
1415     if(!SW_MOD()->GetCTLOptions().IsCTLFontEnabled())
1416         return;
1417 
1418     aVertFL.Show(bSet);
1419     aPropertiesFL.Show(bSet);
1420     aTextDirectionFT.Show(bSet);
1421     aTextDirectionLB.Show(bSet);
1422     if(bSet)
1423     {
1424         //resize line type FixedLine
1425         Point aLtPos = aFLLineType.GetPosPixel();
1426         Point aPropPos = aPropertiesFL.GetPosPixel();
1427         Size aSz = aFLLineType.GetSizePixel();
1428         aSz.Width() = aPropPos.X() - aLtPos.X() - LogicToPixel(Size(8, 8), MAP_APPFONT).Width();
1429         aFLLineType.SetSizePixel(aSz);
1430     }
1431     else
1432     {
1433         Size aSz = aFLLineType.GetSizePixel();
1434         aSz.Width() = LogicToPixel(Size(248, 248), MAP_APPFONT).Width();
1435         aFLLineType.SetSizePixel(aSz);
1436     }
1437 }
1438 
1439 /*-----------------07.03.97 08.33-------------------
1440 
1441 --------------------------------------------------*/
1442 
1443 
1444 void ColumnValueSet::UserDraw( const UserDrawEvent& rUDEvt )
1445 {
1446 	OutputDevice*  pDev = rUDEvt.GetDevice();
1447     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
1448 
1449 	Rectangle aRect = rUDEvt.GetRect();
1450 	sal_uInt16	nItemId = rUDEvt.GetItemId();
1451 	long nRectWidth = aRect.GetWidth();
1452 	long nRectHeight = aRect.GetHeight();
1453 
1454 	Point aBLPos = aRect.TopLeft();
1455     Color aFillColor(pDev->GetFillColor());
1456     Color aLineColor(pDev->GetLineColor());
1457     pDev->SetFillColor(rStyleSettings.GetFieldColor());
1458     pDev->SetLineColor(SwViewOption::GetFontColor());
1459 
1460 	long nStep = Abs(Abs(nRectHeight * 95 /100) / 11);
1461 	long nTop = (nRectHeight - 11 * nStep ) / 2;
1462     sal_uInt16 nCols = 0;
1463 	long nStarts[3];
1464 	long nEnds[3];
1465 	nStarts[0] = nRectWidth * 10 / 100;
1466 	switch( nItemId )
1467 	{
1468 		case 1:
1469 			nEnds[0] = nRectWidth * 9 / 10;
1470 			nCols = 1;
1471 		break;
1472 		case 2: nCols = 2;
1473 			nEnds[0] = nRectWidth * 45 / 100;
1474 			nStarts[1] = nEnds[0] + nStep;
1475 			nEnds[1] = nRectWidth * 9 / 10;
1476 		break;
1477 		case 3: nCols = 3;
1478 			nEnds[0] 	= nRectWidth * 30 / 100;
1479 			nStarts[1] 	= nEnds[0] + nStep;
1480 			nEnds[1] 	= nRectWidth * 63 / 100;
1481 			nStarts[2] 	= nEnds[1] + nStep;
1482 			nEnds[2] 	= nRectWidth * 9 / 10;
1483 		break;
1484 		case 4: nCols = 2;
1485 			nEnds[0] = nRectWidth * 63 / 100;
1486 			nStarts[1] = nEnds[0] + nStep;
1487 			nEnds[1] = nRectWidth * 9 / 10;
1488 		break;
1489 		case 5: nCols = 2;
1490 			nEnds[0] = nRectWidth * 30 / 100;
1491 			nStarts[1] = nEnds[0] + nStep;
1492 			nEnds[1] = nRectWidth * 9 / 10;
1493 		break;
1494 	}
1495 	for(sal_uInt16 j = 0; j < nCols; j++ )
1496 	{
1497 		Point aStart(aBLPos.X() + nStarts[j], 0);
1498 		Point aEnd(aBLPos.X() + nEnds[j], 0);
1499 		for( sal_uInt16 i = 0; i < 12; i ++)
1500 		{
1501 			aStart.Y() = aEnd.Y() = aBLPos.Y() + nTop + i * nStep;
1502 			pDev->DrawLine(aStart, aEnd);
1503 		}
1504 	}
1505     pDev->SetFillColor(aFillColor);
1506     pDev->SetLineColor(aLineColor);
1507 }
1508 
1509 /*-----------------07.03.97 08.48-------------------
1510 
1511 --------------------------------------------------*/
1512 
1513 ColumnValueSet::~ColumnValueSet()
1514 {
1515 }
1516 /* -----------------------------02.04.2002 16:01------------------------------
1517 
1518  ---------------------------------------------------------------------------*/
1519 void ColumnValueSet::DataChanged( const DataChangedEvent& rDCEvt )
1520 {
1521 	if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
1522          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
1523     {
1524         Format();
1525     }
1526     ValueSet::DataChanged( rDCEvt );
1527 }
1528 
1529