xref: /trunk/main/sw/source/ui/frmdlg/column.cxx (revision 4d7c9de0)
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 
IsMarkInSameSection(SwWrtShell & rWrtSh,const SwSection * pSect)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 
SwColumnDlg(Window * pParent,SwWrtShell & rSh)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 
~SwColumnDlg()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  * --------------------------------------------------*/
IMPL_LINK(SwColumnDlg,ObjectHdl,ListBox *,pBox)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  * --------------------------------------------------*/
IMPL_LINK(SwColumnDlg,OkHdl,OKButton *,EMPTYARG)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
GetMaxWidth(SwColMgr * pColMgr,sal_uInt16 nCols)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 
DBG_NAME(columnhdl)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 
ResetColWidth()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 
SwColumnPage(Window * pParent,const SfxItemSet & rSet)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     for( i = 0; i < 5; i++)
521 		//Solution:Set accessible name one be one
522 		//aDefaultVS.InsertItem( i + 1, i );
523 		{
524 			String aItemText;
525 			switch( i )
526 			{
527 				case 0:
528 					aItemText =  SW_RESSTR( STR_COLUMN_VALUESET_ITEM0 ) ;
529 					break;
530 				case 1:
531 					aItemText =  SW_RESSTR( STR_COLUMN_VALUESET_ITEM1 ) ;
532 					break;
533 				case 2:
534 					aItemText =  SW_RESSTR( STR_COLUMN_VALUESET_ITEM2 ) ;
535 					break;
536 				case 3:
537 					aItemText =  SW_RESSTR( STR_COLUMN_VALUESET_ITEM3 );
538 					break;
539 				case 4:
540 					aItemText =  SW_RESSTR( STR_COLUMN_VALUESET_ITEM4 );
541 					break;
542 				default:
543 					break;
544 			}
545 			aDefaultVS.InsertItem( i + 1,  aItemText, i );
546 		}
547 
548 	aDefaultVS.SetSelectHdl(LINK(this, SwColumnPage, SetDefaultsHdl));
549 
550 	// Controls fuer Zusaetzebereich beim MoreButton anmelden
551     Link aCLNrLk = LINK(this, SwColumnPage, ColModify);
552     aCLNrEdt.SetLoseFocusHdl(aCLNrLk);
553     aCLNrEdt.SetUpHdl(aCLNrLk);
554     aCLNrEdt.SetDownHdl(aCLNrLk);
555     Link aLk = LINK(this, SwColumnPage, GapModify);
556 	aDistEd1.SetUpHdl(aLk);
557 	aDistEd1.SetDownHdl(aLk);
558 	aDistEd1.SetLoseFocusHdl(aLk);
559 	aDistEd2.SetUpHdl(aLk);
560 	aDistEd2.SetDownHdl(aLk);
561 	aDistEd2.SetLoseFocusHdl(aLk);
562 
563 	aLk = LINK(this, SwColumnPage, EdModify);
564 
565 	aEd1.SetUpHdl(aLk);
566 	aEd1.SetDownHdl(aLk);
567 	aEd1.SetLoseFocusHdl(aLk);
568 
569 	aEd2.SetUpHdl(aLk);
570 	aEd2.SetDownHdl(aLk);
571 	aEd2.SetLoseFocusHdl(aLk);
572 
573 	aEd3.SetUpHdl(aLk);
574 	aEd3.SetDownHdl(aLk);
575 	aEd3.SetLoseFocusHdl(aLk);
576 
577 	aBtnUp.SetClickHdl(LINK(this, SwColumnPage, Up));
578 	aBtnDown.SetClickHdl(LINK(this, SwColumnPage, Down));
579 	aAutoWidthBox.SetClickHdl(LINK(this, SwColumnPage, AutoWidthHdl));
580 
581 	aLk = LINK( this, SwColumnPage, UpdateColMgr );
582 	aLineTypeDLB.SetSelectHdl( aLk );
583 	aLineHeightEdit.SetModifyHdl( aLk );
584 	aLinePosDLB.SetSelectHdl( aLk );
585 
586 		// Trennlinie
587 	aLineTypeDLB.SetUnit( FUNIT_POINT );
588 	aLineTypeDLB.SetSourceUnit( FUNIT_TWIP );
589 	for( i = 0; i < nLineCount; ++i )
590 		aLineTypeDLB.InsertEntry( 100 * nLines[ i ] );
591 }
592 
593 
594 
~SwColumnPage()595 SwColumnPage::~SwColumnPage()
596 {
597 	delete pColMgr;
598 }
599 
600 /*--------------------------------------------------------------------
601 	Beschreibung:
602  --------------------------------------------------------------------*/
603 
604 
SetPageWidth(long nPageWidth)605 void SwColumnPage::SetPageWidth(long nPageWidth)
606 {
607     long nNewMaxWidth = static_cast< long >(aEd1.NormalizePercent(nPageWidth));
608 
609 	aDistEd1.SetMax(nNewMaxWidth, FUNIT_TWIP);
610 	aDistEd2.SetMax(nNewMaxWidth, FUNIT_TWIP);
611 	aEd1.SetMax(nNewMaxWidth, FUNIT_TWIP);
612 	aEd2.SetMax(nNewMaxWidth, FUNIT_TWIP);
613 	aEd3.SetMax(nNewMaxWidth, FUNIT_TWIP);
614 }
615 
616 /*--------------------------------------------------------------------
617 	Beschreibung:
618  --------------------------------------------------------------------*/
619 
620 
621 
Reset(const SfxItemSet & rSet)622 void SwColumnPage::Reset(const SfxItemSet &rSet)
623 {
624 	sal_uInt16 nHtmlMode = ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
625 	if(nHtmlMode & HTMLMODE_ON)
626 	{
627 		bHtmlMode = sal_True;
628 		aAutoWidthBox.Enable(sal_False);
629 	}
630 	FieldUnit aMetric = ::GetDfltMetric(bHtmlMode);
631 	SetMetric(aEd1, aMetric);
632 	SetMetric(aEd2, aMetric);
633 	SetMetric(aEd3, aMetric);
634 	SetMetric(aDistEd1, aMetric);
635 	SetMetric(aDistEd2, aMetric);
636 
637 	delete pColMgr;
638 	pColMgr = new SwColMgr(rSet);
639 	nCols 	= pColMgr->GetCount() ;
640 	aCLNrEdt.SetMax(Max((sal_uInt16)aCLNrEdt.GetMax(), (sal_uInt16)nCols));
641 	aCLNrEdt.SetLast(Max(nCols,(sal_uInt16)aCLNrEdt.GetMax()));
642 
643 	if(bFrm)
644 	{
645 		if(bFormat)                     // hier gibt es keine Size
646 			pColMgr->SetActualWidth(FRAME_FORMAT_WIDTH);
647 		else
648 		{
649 			const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE);
650 			const SvxBoxItem& rBox = (const SvxBoxItem&) rSet.Get(RES_BOX);
651 			pColMgr->SetActualWidth((sal_uInt16)rSize.GetSize().Width() - rBox.GetDistance());
652 		}
653 	}
654     if(aBalanceColsCB.IsVisible())
655 	{
656         const SfxPoolItem* pItem;
657         if( SFX_ITEM_SET == rSet.GetItemState( RES_COLUMNBALANCE, sal_False, &pItem ))
658 			aBalanceColsCB.Check(!((const SwFmtNoBalancedColumns*)pItem)->GetValue());
659 		else
660 			aBalanceColsCB.Check( sal_True );
661 	}
662 
663     //text direction
664     if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( RES_FRAMEDIR ) )
665 	{
666         const SvxFrameDirectionItem& rItem = (const SvxFrameDirectionItem&)rSet.Get(RES_FRAMEDIR);
667         sal_uInt32 nVal  = rItem.GetValue();
668         sal_uInt16 nPos = aTextDirectionLB.GetEntryPos( (void*) nVal );
669         aTextDirectionLB.SelectEntryPos( nPos );
670         aTextDirectionLB.SaveValue();
671 	}
672 
673     Init();
674 	ActivatePage( rSet );
675 }
676 
677 /*--------------------------------------------------------------------
678 	Beschreibung:	TabPage erzeugen
679  --------------------------------------------------------------------*/
680 
681 
682 
Create(Window * pParent,const SfxItemSet & rSet)683 SfxTabPage* SwColumnPage::Create(Window *pParent, const SfxItemSet &rSet)
684 {
685 	return new SwColumnPage(pParent, rSet);
686 }
687 
688 /*--------------------------------------------------------------------
689 	Beschreibung:	Attribute in den Set stopfen bei OK
690  --------------------------------------------------------------------*/
691 
692 
693 
FillItemSet(SfxItemSet & rSet)694 sal_Bool SwColumnPage::FillItemSet(SfxItemSet &rSet)
695 {
696     if(aCLNrEdt.HasChildPathFocus())
697         aCLNrEdt.GetDownHdl().Call(&aCLNrEdt);
698     // Im ItemSet setzen
699 	// Die aktuellen Einstellungen sind
700 	// schon vorhanden
701 	//
702 	const SfxPoolItem* pOldItem;
703 	const SwFmtCol& rCol = pColMgr->GetColumns();
704 	if(0 == (pOldItem = GetOldItem( rSet, RES_COL )) ||
705 				rCol != *pOldItem )
706 		rSet.Put(rCol);
707 
708 	if(aBalanceColsCB.IsVisible() )
709 	{
710 		rSet.Put(SwFmtNoBalancedColumns(!aBalanceColsCB.IsChecked() ));
711 	}
712     sal_uInt16 nPos;
713     if( aTextDirectionLB.IsVisible() &&
714         ( nPos = aTextDirectionLB.GetSelectEntryPos() ) !=
715                                             aTextDirectionLB.GetSavedValue() )
716 	{
717         sal_uInt32 nDirection = (sal_uInt32)(sal_IntPtr)aTextDirectionLB.GetEntryData( nPos );
718         rSet.Put( SvxFrameDirectionItem( (SvxFrameDirection)nDirection, RES_FRAMEDIR));
719 	}
720     return sal_True;
721 }
722 
723 /*--------------------------------------------------------------------
724 	Beschreibung:	ColumnManager updaten
725  --------------------------------------------------------------------*/
726 
727 
728 
729 IMPL_LINK( SwColumnPage, UpdateColMgr, void *, /*pField*/ )
730 {
731 	long nGutterWidth = pColMgr->GetGutterWidth();
732 	if(nCols > 1)
733 	{
734 			// Ermitteln, ob die schmalste Spalte zu schmal ist
735 			// fuer den eingestellten Spaltenabstand
736 		long nMin = nColWidth[0];
737 		sal_uInt16 i;
738 
739 		for( i = 1; i < nCols; ++i)
740 			nMin = Min(nMin, nColWidth[i]);
741 
742 		sal_Bool bAutoWidth = aAutoWidthBox.IsChecked();
743 		if(!bAutoWidth)
744 		{
745 			pColMgr->SetAutoWidth(sal_False);
746 				// falls der Benutzer nicht die Gesamtbreite vergeben hat,
747 				// den fehlenden Betrag auf die letzte Spalte addieren.
748 			long nSum = 0;
749 			for(i = 0; i < nCols; ++i)
750 				nSum += nColWidth[i];
751 			nGutterWidth = 0;
752 			for(i = 0; i < nCols - 1; ++i)
753 				nGutterWidth += nColDist[i];
754 			nSum += nGutterWidth;
755 
756 			long nMaxW = pColMgr->GetActualSize();
757 
758 			if( nSum < nMaxW  )
759 				nColWidth[nCols - 1] += nMaxW - nSum;
760 
761             pColMgr->SetColWidth( 0, static_cast< sal_uInt16 >(nColWidth[0] + (sal_uInt16)nColDist[0]/2) );
762 			for( i = 1; i < nCols-1; ++i )
763 			{
764 				long nActDist = (nColDist[i] + nColDist[i - 1]) / 2;
765 				pColMgr->SetColWidth( i, (sal_uInt16)nColWidth[i] + (sal_uInt16)nActDist );
766 			}
767             pColMgr->SetColWidth( nCols-1, static_cast< sal_uInt16 >(nColWidth[nCols-1] + nColDist[nCols -2]/2) );
768 
769 		}
770 
771 			// keins ist ausgeschaltet
772         const sal_uInt16 nPos = aLineTypeDLB.GetSelectEntryPos();
773         sal_Bool bEnable = 0 != nPos;
774 		aLineHeightEdit.Enable( bEnable );
775 		aLineHeightLbl.Enable( bEnable );
776 		if( !bEnable )
777 			pColMgr->SetNoLine();
778 		else if( LISTBOX_ENTRY_NOTFOUND != nPos )
779 		{
780 			pColMgr->SetLineWidthAndColor(nLines[nPos - 1], Color(COL_BLACK) );
781 			pColMgr->SetAdjust( SwColLineAdj(
782 									aLinePosDLB.GetSelectEntryPos() + 1) );
783 			pColMgr->SetLineHeightPercent((short)aLineHeightEdit.GetValue());
784 			bEnable = pColMgr->GetLineHeightPercent() != 100;
785 		}
786 		aLinePosLbl.Enable( bEnable );
787 		aLinePosDLB.Enable( bEnable );
788 	}
789 	else
790 	{
791 		pColMgr->NoCols();
792         nCols = 0;
793 	}
794 
795 	//Maximalwerte setzen
796 	aCLNrEdt.SetMax(Max(1L,
797 		Min(long(nMaxCols), long( pColMgr->GetActualSize() / (nGutterWidth + MINLAY)) )));
798 	aCLNrEdt.SetLast(aCLNrEdt.GetMax());
799 	aCLNrEdt.Reformat();
800 
801 	//Beispielfenster anregen
802 	if(!bLockUpdate)
803 	{
804 		if(bFrm)
805 		{
806 			aFrmExampleWN.SetColumns( pColMgr->GetColumns() );
807 			aFrmExampleWN.Invalidate();
808 		}
809 		else
810 			aPgeExampleWN.Invalidate();
811 	}
812 
813 	return 0;
814 }
815 
816 /*------------------------------------------------------------------------
817  Beschreibung:	Initialisierung
818 ------------------------------------------------------------------------*/
819 
820 
821 
Init()822 void SwColumnPage::Init()
823 {
824 	aCLNrEdt.SetValue(nCols);
825 
826     sal_Bool bAutoWidth = pColMgr->IsAutoWidth() || bHtmlMode;
827     aAutoWidthBox.Check( bAutoWidth );
828 
829     sal_Int32 nColumnWidthSum = 0;
830     // Setzen der Breiten
831     sal_uInt16 i;
832     for(i = 0; i < nCols; ++i)
833 	{
834 		nColWidth[i] = pColMgr->GetColWidth(i);
835         nColumnWidthSum += nColWidth[i];
836 		if(i < nCols - 1)
837 			nColDist[i] = pColMgr->GetGutterWidth(i);
838 	}
839 
840 	if( 1 < nCols )
841 	{
842         // #97495# make sure that the automatic column widht's are always equal
843         if(bAutoWidth)
844         {
845             nColumnWidthSum /= nCols;
846             for(i = 0; i < nCols; ++i)
847                 nColWidth[i] = nColumnWidthSum;
848         }
849         SwColLineAdj eAdj = pColMgr->GetAdjust();
850 		if( COLADJ_NONE == eAdj )		// der Dialog kennt kein NONE!
851 		{
852 			eAdj = COLADJ_TOP;
853 			//ohne Adjust auch kein Linientyp
854 			aLineTypeDLB.SelectEntryPos( 0 );
855 			aLineHeightEdit.SetValue( 100 );
856 		}
857 		else
858 		{
859 			aLineTypeDLB.SelectEntryPos( lcl_LineWidthToPos(( pColMgr->GetLineWidth() )) + 1);
860 			aLineHeightEdit.SetValue( pColMgr->GetLineHeightPercent() );
861 		}
862         aLinePosDLB.SelectEntryPos( static_cast< sal_uInt16 >(eAdj - 1) );
863 	}
864 	else
865 	{
866 		aLinePosDLB.SelectEntryPos( 0 );
867 		aLineTypeDLB.SelectEntryPos( 0 );
868 		aLineHeightEdit.SetValue( 100 );
869 	}
870 
871 	UpdateCols();
872 	Update();
873 
874 		// Maximale Spaltenzahl setzen
875 		// Werte kleiner als 1 sind nicht erlaubt
876 	aCLNrEdt.SetMax(Max(1L,
877 		Min(long(nMaxCols), long( pColMgr->GetActualSize() / nMinWidth) )));
878 }
879 
880 /*------------------------------------------------------------------------
881  Beschreibung:	Die Anzahl der Spalten hat sich veraendert -- hier werden
882 				die Controls fuer die Bearbeitung der Spalten entsprechend
883 				der Spaltenzahl en- oder disabled.
884 				Falls es mehr als nVisCols (= 3) Spalten gibt, werden
885 				alle Edit enabled und die Buttons fuer das Scrollen
886 				ebenfalls.
887 				Andernfalls werden die Edits jeweils fuer die entsprechenden
888 				Spaltenzahl enabled; eine Spalte kann nicht bearbeitet werden.
889 ------------------------------------------------------------------------*/
890 
891 
892 
UpdateCols()893 void SwColumnPage::UpdateCols()
894 {
895 	sal_Bool bEnableBtns= sal_False;
896 	sal_Bool bEnable12	= sal_False;
897 	sal_Bool bEnable3	= sal_False;
898 	const sal_Bool bEdit = !aAutoWidthBox.IsChecked();
899 	if ( nCols > nVisCols )
900 	{
901 		bEnableBtns = sal_True && !bHtmlMode;
902 		bEnable12 = bEnable3 = bEdit;
903 	}
904 	else if( bEdit )
905 	{
906 		// hier gibt es absichtlich kaum noch breaks
907 		switch(nCols)
908 		{
909 			case 3: bEnable3 = sal_True;
910 			case 2: bEnable12= sal_True; break;
911 			default: /* do nothing */;
912 		}
913 	}
914 	aEd1.Enable( bEnable12 );
915 	aDistEd1.Enable(nCols > 1);
916 	aEd2.Enable( bEnable12 );
917 	aDistEd2.Enable(bEnable3);
918 	aEd3.Enable( bEnable3  );
919     aLbl1.Enable(bEnable12 );
920     aLbl2.Enable(bEnable12 );
921     aLbl3.Enable(bEnable3  );
922 	aBtnUp.Enable( bEnableBtns );
923 	aBtnDown.Enable( bEnableBtns );
924 
925 	const sal_Bool bEnable = nCols > 1;
926 	if( !bEnable )
927 	{
928 		aLinePosDLB.Enable( sal_False );
929 		aLinePosLbl.Enable( sal_False );
930 	}
931 	aLineHeightEdit.Enable( bEnable );
932 	aLineHeightLbl.Enable( bEnable );
933 	aLineTypeDLB.Enable( bEnable );
934 	aLineTypeLbl.Enable( bEnable );
935 	aAutoWidthBox.Enable( bEnable && !bHtmlMode );
936 }
937 
SetLabels(sal_uInt16 nVis)938 void SwColumnPage::SetLabels( sal_uInt16 nVis )
939 {
940 	String sLbl( '~' );
941 
942 	String sLbl2( String::CreateFromInt32( nVis + 1 ));
943 	String tmp1(sLbl2);
944 	sLbl2.Insert(sLbl, sLbl2.Len() - 1);
945     aLbl1.SetText(sLbl2);
946 
947 	sLbl2 = String::CreateFromInt32( nVis + 2 );
948 	String tmp2(sLbl2);
949 	sLbl2.Insert(sLbl, sLbl2.Len() - 1);
950     aLbl2.SetText(sLbl2);
951 
952 	sLbl2 = String::CreateFromInt32( nVis + 3 );
953 	String tmp3(sLbl2);
954 	sLbl2.Insert(sLbl, sLbl2.Len() - 1);
955     aLbl3.SetText(sLbl2);
956 	String sColumnWidth = SW_RESSTR( STR_ACCESS_COLUMN_WIDTH ) ;
957 	sColumnWidth.SearchAndReplaceAscii("%1", tmp1);
958 	aEd1.SetAccessibleName(sColumnWidth);
959 
960 	sColumnWidth = SW_RESSTR( STR_ACCESS_COLUMN_WIDTH ) ;
961 	sColumnWidth.SearchAndReplaceAscii("%1", tmp2);
962 	aEd2.SetAccessibleName(sColumnWidth);
963 
964 	sColumnWidth = SW_RESSTR( STR_ACCESS_COLUMN_WIDTH ) ;
965 	sColumnWidth.SearchAndReplaceAscii("%1", tmp3);
966 	aEd3.SetAccessibleName(sColumnWidth);
967 
968 	String sDist = SW_RESSTR( STR_ACCESS_PAGESETUP_SPACING ) ;
969 	String sDist1 = sDist;
970 	sDist1.SearchAndReplaceAscii("%1", tmp1);
971 	sDist1.SearchAndReplaceAscii("%2", tmp2);
972 	aDistEd1.SetAccessibleName(sDist1);
973 
974 	String sDist2 = sDist;
975 	sDist2.SearchAndReplaceAscii("%1", tmp2);
976 	sDist2.SearchAndReplaceAscii("%2", tmp3);
977 	aDistEd2.SetAccessibleName(sDist2);
978 }
979 
980 /*------------------------------------------------------------------------
981  Beschreibung:	Handler, der bei einer Veraenderung der Spaltenzahl
982 				gerufen wird.
983 				Eine Aenderung der Spaltenzahl ueberschreibt eventuelle
984 				Breiteneinstellungen des Benutzers; alle Spalten sind
985 				gleich breit.
986 ------------------------------------------------------------------------*/
987 
IMPL_LINK(SwColumnPage,ColModify,NumericField *,pNF)988 IMPL_LINK( SwColumnPage, ColModify, NumericField *, pNF )
989 {
990     nCols = (sal_uInt16)aCLNrEdt.GetValue();
991     //#107890# the handler is also called from LoseFocus()
992     //then no change has been made and thus no action should be taken
993 	// #i17816# changing the displayed types within the ValueSet
994 	//from two columns to two columns with different settings doesn't invalidate the
995 	// example windows in ::ColModify()
996 // the pColMgr->GetCount()'s return is some how bugged,
997 // it will return 0 when actual count is 1, so fix it.
998     //if(!pNF ||(pColMgr->GetCount() != nCols))
999 	int nTemp = pColMgr->GetCount();
1000 	if(nTemp == 0) nTemp = 1;
1001     if( nTemp != nCols )
1002     {
1003         if(pNF)
1004             aDefaultVS.SetNoSelection();
1005         long nDist = static_cast< long >(aDistEd1.DenormalizePercent(aDistEd1.GetValue(FUNIT_TWIP)));
1006         pColMgr->SetCount(nCols, (sal_uInt16)nDist);
1007         for(sal_uInt16 i = 0; i < nCols; i++)
1008             nColDist[i] = nDist;
1009         nFirstVis = 0;
1010         SetLabels( nFirstVis );
1011         UpdateCols();
1012         ResetColWidth();
1013         Update();
1014     }
1015 
1016 	return 0;
1017 }
1018 
1019 /*------------------------------------------------------------------------
1020  Beschreibung:	Modify- Handler fuer eine Aenderung der Spaltenbreite
1021 				oder des Spaltenabstandes.
1022 				Diese Aenderungen wirken sich erst zeitversetzt aus.
1023 				Durch eine Aenderung der Spaltenbreite wird die automatische
1024 				Berechnung der Spaltenbreite ausser Kraft gesetzt; erst
1025 				eine Aenderung der Spaltenzahl kehrt wieder zu diesem
1026 				Default zurueck.
1027 ------------------------------------------------------------------------*/
1028 
1029 
1030 
IMPL_LINK(SwColumnPage,GapModify,PercentField *,pFld)1031 IMPL_LINK( SwColumnPage, GapModify, PercentField *, pFld )
1032 {
1033     long nActValue = static_cast< long >(pFld->DenormalizePercent(pFld->GetValue(FUNIT_TWIP)));
1034 	if(nCols < 2)
1035 		return 0;
1036 	if(aAutoWidthBox.IsChecked())
1037 	{
1038 		sal_uInt16 nMaxGap = pColMgr->GetActualSize() - nCols * MINLAY;
1039 		DBG_ASSERT(nCols, "Abstand kann nicht ohne Spalten eingestellt werden");
1040 		nMaxGap /= nCols - 1;
1041 		if(nActValue > nMaxGap)
1042 		{
1043 			nActValue = nMaxGap;
1044             aDistEd1.SetPrcntValue(aDistEd1.NormalizePercent(nMaxGap), FUNIT_TWIP);
1045 		}
1046 		pColMgr->SetGutterWidth((sal_uInt16)nActValue);
1047 		for(sal_uInt16 i = 0; i < nCols; i++)
1048 			nColDist[i] = nActValue;
1049 
1050 		ResetColWidth();
1051 		UpdateCols();
1052 	}
1053 	else
1054 
1055 	{
1056 		sal_uInt16 nOffset = 0;
1057 		if(pFld == &aDistEd2)
1058 		{
1059 			nOffset = 1;
1060 		}
1061 		long nDiff = nActValue - nColDist[nFirstVis + nOffset];
1062 		if(nDiff)
1063 		{
1064 			long nLeft = nColWidth[nFirstVis + nOffset];
1065 			long nRight = nColWidth[nFirstVis + nOffset + 1];
1066 			if(nLeft + nRight + 2 * MINLAY < nDiff)
1067 				nDiff = nLeft + nRight - 2 * MINLAY;
1068 			if(nDiff < nRight - MINLAY)
1069 			{
1070 				nRight -= nDiff;
1071 			}
1072 			else
1073 			{
1074 				long nTemp = nDiff - nRight + MINLAY;
1075 				nRight = MINLAY;
1076 				if(nLeft > nTemp - MINLAY)
1077 				{
1078 					nLeft -= nTemp;
1079 					nTemp = 0;
1080 				}
1081 				else
1082 				{
1083 					nTemp -= nLeft + MINLAY;
1084 					nLeft = MINLAY;
1085 				}
1086 				nDiff = nTemp;
1087 			}
1088 			nColWidth[nFirstVis + nOffset] = nLeft;
1089 			nColWidth[nFirstVis + nOffset + 1] = nRight;
1090 			nColDist[nFirstVis + nOffset] += nDiff;
1091 
1092 			pColMgr->SetColWidth( nFirstVis + nOffset, sal_uInt16(nLeft) );
1093 			pColMgr->SetColWidth( nFirstVis + nOffset + 1, sal_uInt16(nRight) );
1094 			pColMgr->SetGutterWidth( sal_uInt16(nColDist[nFirstVis + nOffset]), nFirstVis + nOffset );
1095 		}
1096 
1097 	}
1098 	Update();
1099 	return 0;
1100 }
1101 
1102 /*------------------------------------------------------------------------
1103  Beschreibung:
1104 ------------------------------------------------------------------------*/
1105 
1106 
1107 
IMPL_LINK(SwColumnPage,EdModify,PercentField *,pField)1108 IMPL_LINK( SwColumnPage, EdModify, PercentField *, pField )
1109 {
1110 	pModifiedField = pField;
1111 	Timeout(0);
1112 	return 0;
1113 }
1114 /*------------------------------------------------------------------------
1115  Beschreibung:	Handler hinter der Checkbox fuer automatische Breite.
1116 				Ist die Box gecheckt, koennen keine expliziten Werte
1117 				fuer die Spaltenbreite eingegeben werden.
1118 ------------------------------------------------------------------------*/
1119 
1120 
1121 
IMPL_LINK(SwColumnPage,AutoWidthHdl,CheckBox *,pBox)1122 IMPL_LINK( SwColumnPage, AutoWidthHdl, CheckBox *, pBox )
1123 {
1124     long nDist = static_cast< long >(aDistEd1.DenormalizePercent(aDistEd1.GetValue(FUNIT_TWIP)));
1125 	pColMgr->SetCount(nCols, (sal_uInt16)nDist);
1126 	for(sal_uInt16 i = 0; i < nCols; i++)
1127 		nColDist[i] = nDist;
1128 	if(pBox->IsChecked())
1129 	{
1130 		pColMgr->SetGutterWidth(sal_uInt16(nDist));
1131 		ResetColWidth();
1132 	}
1133 	pColMgr->SetAutoWidth(pBox->IsChecked(), sal_uInt16(nDist));
1134 	UpdateCols();
1135 	Update();
1136 	return 0;
1137 }
1138 
1139 /*------------------------------------------------------------------------
1140  Beschreibung:	Raufscrollen der Inhalte der Edits.
1141 ------------------------------------------------------------------------*/
1142 
IMPL_LINK(SwColumnPage,Up,Button *,EMPTYARG)1143 IMPL_LINK( SwColumnPage, Up, Button *, EMPTYARG )
1144 {
1145 	if( nFirstVis )
1146 	{
1147 		--nFirstVis;
1148 		SetLabels( nFirstVis );
1149 		Update();
1150 	}
1151 	return 0;
1152 }
1153 /*------------------------------------------------------------------------
1154  Beschreibung:	Runterscrollen der Inhalte der Edits.
1155 ------------------------------------------------------------------------*/
1156 
IMPL_LINK(SwColumnPage,Down,Button *,EMPTYARG)1157 IMPL_LINK( SwColumnPage, Down, Button *, EMPTYARG )
1158 {
1159 	if( nFirstVis + nVisCols < nCols )
1160 	{
1161 		++nFirstVis;
1162 		SetLabels( nFirstVis );
1163 		Update();
1164 	}
1165 	return 0;
1166 }
1167 /*------------------------------------------------------------------------
1168  Beschreibung:	Relikt aus alten Zeiten - jetzt direkt ohne time
1169  * 				Timer- Handler; angetriggert durch eine Aenderung der
1170 				Spaltenbreite oder des Spaltenabstandes.
1171 ------------------------------------------------------------------------*/
1172 
IMPL_LINK(SwColumnPage,Timeout,Timer *,EMPTYARG)1173 IMPL_LINK( SwColumnPage, Timeout, Timer *, EMPTYARG )
1174 {
1175 	DBG_PROFSTART(columnhdl) ;
1176 	if(pModifiedField)
1177 	{
1178 			// Finden der veraenderten Spalte
1179 		sal_uInt16 nChanged = nFirstVis;
1180 		if(pModifiedField == &aEd2)
1181 			++nChanged;
1182 		else if(pModifiedField == &aEd3)
1183 			nChanged += 2;
1184 		/*else if(pModifiedField == &aEd4)
1185 			nChanged += 3;*/
1186 
1187 		long nNewWidth = (sal_uInt16)
1188 			pModifiedField->DenormalizePercent(pModifiedField->GetValue(FUNIT_TWIP));
1189 		long nDiff = nNewWidth - nColWidth[nChanged];
1190 
1191 		// wenn es die letzte Spalte ist
1192 		if(nChanged == nCols - 1)
1193 		{
1194 			nColWidth[0] -= nDiff;
1195 			if(nColWidth[0] < (long)nMinWidth)
1196 			{
1197 				nNewWidth -= nMinWidth - nColWidth[0];
1198 				nColWidth[0] = nMinWidth;
1199 			}
1200 
1201 		}
1202 		else if(nDiff)
1203 		{
1204 			nColWidth[nChanged + 1] -= nDiff;
1205 			if(nColWidth[nChanged + 1] < (long) nMinWidth)
1206 			{
1207 				nNewWidth -= nMinWidth - nColWidth[nChanged + 1];
1208 				nColWidth[nChanged + 1] = nMinWidth;
1209 			}
1210 		}
1211 		nColWidth[nChanged] = nNewWidth;
1212 		pModifiedField = 0;
1213 	}
1214 	Update();
1215 	DBG_PROFSTOP(columnhdl) ;
1216 	return 0;
1217 }
1218 /*------------------------------------------------------------------------
1219  Beschreibung:	Aktualisierung der Anzeige
1220 ------------------------------------------------------------------------*/
1221 
1222 
1223 
Update()1224 void SwColumnPage::Update()
1225 {
1226 	aBalanceColsCB.Enable(nCols > 1);
1227 	if(nCols >= 2)
1228 	{
1229         aEd1.SetPrcntValue(aEd1.NormalizePercent(nColWidth[nFirstVis]), FUNIT_TWIP);
1230         aDistEd1.SetPrcntValue(aDistEd1.NormalizePercent(nColDist[nFirstVis]), FUNIT_TWIP);
1231         aEd2.SetPrcntValue(aEd2.NormalizePercent(nColWidth[nFirstVis + 1]), FUNIT_TWIP);
1232 		if(nCols >= 3)
1233 		{
1234             aDistEd2.SetPrcntValue(aDistEd2.NormalizePercent(nColDist[nFirstVis + 1]), FUNIT_TWIP);
1235             aEd3.SetPrcntValue(aEd3.NormalizePercent(nColWidth[nFirstVis + 2]), FUNIT_TWIP);
1236 		}
1237 		else
1238 		{
1239 			aEd3.SetText(aEmptyStr);
1240 			aDistEd2.SetText(aEmptyStr);
1241 		}
1242 	}
1243 	else
1244 	{
1245 		aEd1.SetText(aEmptyStr);
1246 		aEd2.SetText(aEmptyStr);
1247 		aEd3.SetText(aEmptyStr);
1248 		aDistEd1.SetText(aEmptyStr);
1249 		aDistEd2.SetText(aEmptyStr);
1250 	}
1251 	UpdateColMgr(0);
1252 }
1253 
1254 /*--------------------------------------------------------------------
1255 	Beschreibung:	Update Bsp
1256  --------------------------------------------------------------------*/
1257 
1258 
1259 
ActivatePage(const SfxItemSet & rSet)1260 void SwColumnPage::ActivatePage(const SfxItemSet& rSet)
1261 {
1262 	if(!bFrm)
1263 	{
1264 		if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_PAGE_SIZE ))
1265 		{
1266 			const SvxSizeItem& rSize = (const SvxSizeItem&)rSet.Get(
1267 												SID_ATTR_PAGE_SIZE);
1268 			const SvxLRSpaceItem& rLRSpace = (const SvxLRSpaceItem&)rSet.Get(
1269 																RES_LR_SPACE );
1270 			const SvxBoxItem& rBox = (const SvxBoxItem&) rSet.Get(RES_BOX);
1271             sal_uInt16 nActWidth = static_cast< sal_uInt16 >(rSize.GetSize().Width()
1272                             - rLRSpace.GetLeft() - rLRSpace.GetRight() - rBox.GetDistance());
1273 
1274 			if( pColMgr->GetActualSize() != nActWidth)
1275 			{
1276 				pColMgr->SetActualWidth(nActWidth);
1277 				ColModify( 0 );
1278 				UpdateColMgr( 0 );
1279 			}
1280 		}
1281 		aFrmExampleWN.Hide();
1282 		aPgeExampleWN.UpdateExample( rSet, pColMgr );
1283 		aPgeExampleWN.Show();
1284 
1285 	}
1286 	else
1287 	{
1288 		aPgeExampleWN.Hide();
1289 		aFrmExampleWN.Show();
1290 
1291 		// Size
1292         const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE);
1293         const SvxBoxItem& rBox = (const SvxBoxItem&) rSet.Get(RES_BOX);
1294 
1295         long nDistance = rBox.GetDistance();
1296 		const sal_uInt16 nTotalWish = bFormat ? FRAME_FORMAT_WIDTH : sal_uInt16(rSize.GetWidth() - 2 * nDistance);
1297 
1298 		// Maximalwerte der Spaltenbreiten setzen
1299 		SetPageWidth(nTotalWish);
1300 
1301 		if(pColMgr->GetActualSize() != nTotalWish)
1302 		{
1303 			pColMgr->SetActualWidth(nTotalWish);
1304 			Init();
1305 		}
1306 		sal_Bool bPercent;
1307 		// im Rahmenformat nur relative Angaben
1308 		if ( bFormat || (rSize.GetWidthPercent() && rSize.GetWidthPercent() != 0xff) )
1309 		{
1310 			// Wert fuer 100% setzen
1311 			aEd1.SetRefValue(nTotalWish);
1312 			aEd2.SetRefValue(nTotalWish);
1313 			aEd3.SetRefValue(nTotalWish);
1314 			aDistEd1.SetRefValue(nTotalWish);
1315 			aDistEd2.SetRefValue(nTotalWish);
1316 
1317 			// Auf %-Darstellung umschalten
1318 			bPercent = sal_True;
1319 		}
1320 		else
1321 			bPercent = sal_False;
1322 
1323 		aEd1.ShowPercent(bPercent);
1324 		aEd2.ShowPercent(bPercent);
1325 		aEd3.ShowPercent(bPercent);
1326 		aDistEd1.ShowPercent(bPercent);
1327 		aDistEd2.ShowPercent(bPercent);
1328 		aDistEd1.MetricField::SetMin(0);
1329 		aDistEd2.MetricField::SetMin(0);
1330 	}
1331 	Update();
1332 }
1333 
1334 /*--------------------------------------------------------------------
1335 	Beschreibung:
1336  --------------------------------------------------------------------*/
1337 
1338 
1339 
DeactivatePage(SfxItemSet * _pSet)1340 int SwColumnPage::DeactivatePage(SfxItemSet *_pSet)
1341 {
1342     if(_pSet)
1343         FillItemSet(*_pSet);
1344 
1345 	return sal_True;
1346 }
1347 
1348 
1349 
GetRanges()1350 sal_uInt16* SwColumnPage::GetRanges()
1351 {
1352 	return aPageRg;
1353 }
1354 
1355 /*--------------------------------------------------------------------
1356 	Beschreibung:
1357  --------------------------------------------------------------------*/
1358 
1359 
1360 
IMPL_LINK(SwColumnPage,SetDefaultsHdl,ValueSet *,pVS)1361 IMPL_LINK( SwColumnPage, SetDefaultsHdl, ValueSet *, pVS )
1362 {
1363 	sal_uInt16 nItem = pVS->GetSelectItemId();
1364 	if( nItem < 4 )
1365 	{
1366 		aCLNrEdt.SetValue( nItem );
1367 		aAutoWidthBox.Check();
1368         aDistEd1.SetPrcntValue(0);
1369 		ColModify(0);
1370 	}
1371 	else
1372 	{
1373 		bLockUpdate = sal_True;
1374 		aCLNrEdt.SetValue( 2 );
1375 		aAutoWidthBox.Check(sal_False);
1376         aDistEd1.SetPrcntValue(0);
1377 		ColModify(0);
1378 		// jetzt noch das Breitenverhaeltnisse auf 2 : 1 bzw. 1 : 2 stellen
1379 		sal_uInt16 nSmall = pColMgr->GetActualSize()  / 3;
1380 		if(nItem == 4)
1381 		{
1382             aEd2.SetPrcntValue(aEd2.NormalizePercent(long(nSmall)), FUNIT_TWIP);
1383 			pModifiedField = &aEd2;
1384 		}
1385 		else
1386 		{
1387             aEd1.SetPrcntValue(aEd1.NormalizePercent(long(nSmall)), FUNIT_TWIP);
1388 			pModifiedField = &aEd1;
1389 		}
1390 		bLockUpdate = sal_False;
1391 		Timeout(0);
1392 
1393 	}
1394 	return 0;
1395 }
1396 
1397 /*-----------------25.10.96 11.41-------------------
1398 
1399 --------------------------------------------------*/
1400 
1401 
SetFrmMode(sal_Bool bMod)1402 void SwColumnPage::SetFrmMode(sal_Bool bMod)
1403 {
1404 	bFrm = bMod;
1405 }
1406 /* -----------------------------2002/06/19 13:08------------------------------
1407 
1408  ---------------------------------------------------------------------------*/
SetInSection(sal_Bool bSet)1409 void SwColumnPage::SetInSection(sal_Bool bSet)
1410 {
1411     if(!SW_MOD()->GetCTLOptions().IsCTLFontEnabled())
1412         return;
1413 
1414     aVertFL.Show(bSet);
1415     aPropertiesFL.Show(bSet);
1416     aTextDirectionFT.Show(bSet);
1417     aTextDirectionLB.Show(bSet);
1418     if(bSet)
1419     {
1420         //resize line type FixedLine
1421         Point aLtPos = aFLLineType.GetPosPixel();
1422         Point aPropPos = aPropertiesFL.GetPosPixel();
1423         Size aSz = aFLLineType.GetSizePixel();
1424         aSz.Width() = aPropPos.X() - aLtPos.X() - LogicToPixel(Size(8, 8), MAP_APPFONT).Width();
1425         aFLLineType.SetSizePixel(aSz);
1426     }
1427     else
1428     {
1429         Size aSz = aFLLineType.GetSizePixel();
1430         aSz.Width() = LogicToPixel(Size(248, 248), MAP_APPFONT).Width();
1431         aFLLineType.SetSizePixel(aSz);
1432     }
1433 }
1434 
1435 /*-----------------07.03.97 08.33-------------------
1436 
1437 --------------------------------------------------*/
1438 
1439 
UserDraw(const UserDrawEvent & rUDEvt)1440 void ColumnValueSet::UserDraw( const UserDrawEvent& rUDEvt )
1441 {
1442 	OutputDevice*  pDev = rUDEvt.GetDevice();
1443     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
1444 
1445 	Rectangle aRect = rUDEvt.GetRect();
1446 	sal_uInt16	nItemId = rUDEvt.GetItemId();
1447 	long nRectWidth = aRect.GetWidth();
1448 	long nRectHeight = aRect.GetHeight();
1449 
1450 	Point aBLPos = aRect.TopLeft();
1451     Color aFillColor(pDev->GetFillColor());
1452     Color aLineColor(pDev->GetLineColor());
1453     pDev->SetFillColor(rStyleSettings.GetFieldColor());
1454     pDev->SetLineColor(SwViewOption::GetFontColor());
1455 
1456 	long nStep = Abs(Abs(nRectHeight * 95 /100) / 11);
1457 	long nTop = (nRectHeight - 11 * nStep ) / 2;
1458     sal_uInt16 nCols = 0;
1459 	long nStarts[3];
1460 	long nEnds[3];
1461 	nStarts[0] = nRectWidth * 10 / 100;
1462 	switch( nItemId )
1463 	{
1464 		case 1:
1465 			nEnds[0] = nRectWidth * 9 / 10;
1466 			nCols = 1;
1467 		break;
1468 		case 2: nCols = 2;
1469 			nEnds[0] = nRectWidth * 45 / 100;
1470 			nStarts[1] = nEnds[0] + nStep;
1471 			nEnds[1] = nRectWidth * 9 / 10;
1472 		break;
1473 		case 3: nCols = 3;
1474 			nEnds[0] 	= nRectWidth * 30 / 100;
1475 			nStarts[1] 	= nEnds[0] + nStep;
1476 			nEnds[1] 	= nRectWidth * 63 / 100;
1477 			nStarts[2] 	= nEnds[1] + nStep;
1478 			nEnds[2] 	= nRectWidth * 9 / 10;
1479 		break;
1480 		case 4: nCols = 2;
1481 			nEnds[0] = nRectWidth * 63 / 100;
1482 			nStarts[1] = nEnds[0] + nStep;
1483 			nEnds[1] = nRectWidth * 9 / 10;
1484 		break;
1485 		case 5: nCols = 2;
1486 			nEnds[0] = nRectWidth * 30 / 100;
1487 			nStarts[1] = nEnds[0] + nStep;
1488 			nEnds[1] = nRectWidth * 9 / 10;
1489 		break;
1490 	}
1491 	for(sal_uInt16 j = 0; j < nCols; j++ )
1492 	{
1493 		Point aStart(aBLPos.X() + nStarts[j], 0);
1494 		Point aEnd(aBLPos.X() + nEnds[j], 0);
1495 		for( sal_uInt16 i = 0; i < 12; i ++)
1496 		{
1497 			aStart.Y() = aEnd.Y() = aBLPos.Y() + nTop + i * nStep;
1498 			pDev->DrawLine(aStart, aEnd);
1499 		}
1500 	}
1501     pDev->SetFillColor(aFillColor);
1502     pDev->SetLineColor(aLineColor);
1503 }
1504 
1505 /*-----------------07.03.97 08.48-------------------
1506 
1507 --------------------------------------------------*/
1508 
~ColumnValueSet()1509 ColumnValueSet::~ColumnValueSet()
1510 {
1511 }
1512 /* -----------------------------02.04.2002 16:01------------------------------
1513 
1514  ---------------------------------------------------------------------------*/
DataChanged(const DataChangedEvent & rDCEvt)1515 void ColumnValueSet::DataChanged( const DataChangedEvent& rDCEvt )
1516 {
1517 	if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
1518          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
1519     {
1520         Format();
1521     }
1522     ValueSet::DataChanged( rDCEvt );
1523 }
1524 
1525