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