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