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