Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "column.hxx"
21 :
22 : #include "hintids.hxx"
23 : #include <svx/dialogs.hrc>
24 : #include <svx/dialmgr.hxx>
25 : #include <sfx2/htmlmode.hxx>
26 : #include <svx/xtable.hxx>
27 : #include <svx/drawitem.hxx>
28 : #include <editeng/borderline.hxx>
29 : #include <editeng/boxitem.hxx>
30 : #include <editeng/lrspitem.hxx>
31 : #include <editeng/sizeitem.hxx>
32 : #include <editeng/frmdiritem.hxx>
33 : #include <svl/ctloptions.hxx>
34 : #include <sfx2/dispatch.hxx>
35 : #include <vcl/msgbox.hxx>
36 : #include <vcl/settings.hxx>
37 :
38 : #include <swmodule.hxx>
39 : #include <sal/macros.h>
40 :
41 : #include <helpid.h>
42 : #include "globals.hrc"
43 : #include "swtypes.hxx"
44 : #include "wrtsh.hxx"
45 : #include "view.hxx"
46 : #include "docsh.hxx"
47 : #include "uitool.hxx"
48 : #include "cmdid.h"
49 : #include "viewopt.hxx"
50 : #include "format.hxx"
51 : #include "frmmgr.hxx"
52 : #include "frmdlg.hxx"
53 : #include "colmgr.hxx"
54 : #include "prcntfld.hxx"
55 : #include "paratr.hxx"
56 : #include "frmui.hrc"
57 : #include "poolfmt.hrc"
58 : #include <section.hxx>
59 : #include <docary.hxx>
60 : #include <pagedesc.hxx>
61 :
62 : #include "access.hrc"
63 :
64 : //to match associated data in ColumnPage.ui
65 : #define LISTBOX_SELECTION 0
66 : #define LISTBOX_SECTION 1
67 : #define LISTBOX_SECTIONS 2
68 : #define LISTBOX_PAGE 3
69 : #define LISTBOX_FRAME 4
70 :
71 : using namespace ::com::sun::star;
72 :
73 : #define FRAME_FORMAT_WIDTH 1000
74 :
75 : // static data
76 : static const sal_uInt16 nVisCols = 3;
77 :
78 0 : inline bool IsMarkInSameSection( SwWrtShell& rWrtSh, const SwSection* pSect )
79 : {
80 0 : rWrtSh.SwapPam();
81 0 : bool bRet = pSect == rWrtSh.GetCurrSection();
82 0 : rWrtSh.SwapPam();
83 0 : return bRet;
84 : }
85 :
86 0 : SwColumnDlg::SwColumnDlg(vcl::Window* pParent, SwWrtShell& rSh)
87 : : SfxModalDialog(pParent, "ColumnDialog", "modules/swriter/ui/columndialog.ui")
88 : , rWrtShell(rSh)
89 : , pPageSet(0)
90 : , pSectionSet(0)
91 : , pSelectionSet(0)
92 : , pFrameSet(0)
93 : , nOldSelection(0)
94 : , nSelectionWidth(0)
95 : , bPageChanged(false)
96 : , bSectionChanged(false)
97 : , bSelSectionChanged(false)
98 0 : , bFrameChanged(false)
99 : {
100 0 : SwRect aRect;
101 0 : rWrtShell.CalcBoundRect(aRect, FLY_AS_CHAR);
102 :
103 0 : nSelectionWidth = aRect.Width();
104 :
105 0 : SfxItemSet* pColPgSet = 0;
106 : static sal_uInt16 const aSectIds[] = { RES_COL, RES_COL,
107 : RES_FRM_SIZE, RES_FRM_SIZE,
108 : RES_COLUMNBALANCE, RES_FRAMEDIR,
109 : 0 };
110 :
111 0 : const SwSection* pCurrSection = rWrtShell.GetCurrSection();
112 0 : const sal_uInt16 nFullSectCnt = rWrtShell.GetFullSelectedSectionCount();
113 0 : if( pCurrSection && ( !rWrtShell.HasSelection() || 0 != nFullSectCnt ))
114 : {
115 0 : nSelectionWidth = rSh.GetSectionWidth(*pCurrSection->GetFmt());
116 0 : if ( !nSelectionWidth )
117 0 : nSelectionWidth = USHRT_MAX;
118 0 : pSectionSet = new SfxItemSet( rWrtShell.GetAttrPool(), aSectIds );
119 0 : pSectionSet->Put( pCurrSection->GetFmt()->GetAttrSet() );
120 0 : pColPgSet = pSectionSet;
121 : }
122 :
123 0 : if( rWrtShell.HasSelection() && rWrtShell.IsInsRegionAvailable() &&
124 0 : ( !pCurrSection || ( 1 != nFullSectCnt &&
125 0 : IsMarkInSameSection( rWrtShell, pCurrSection ) )))
126 : {
127 0 : pSelectionSet = new SfxItemSet( rWrtShell.GetAttrPool(), aSectIds );
128 0 : pColPgSet = pSelectionSet;
129 : }
130 :
131 0 : if( rWrtShell.GetFlyFrmFmt() )
132 : {
133 0 : const SwFrmFmt* pFmt = rSh.GetFlyFrmFmt() ;
134 0 : pFrameSet = new SfxItemSet(rWrtShell.GetAttrPool(), aSectIds );
135 0 : pFrameSet->Put(pFmt->GetFrmSize());
136 0 : pFrameSet->Put(pFmt->GetCol());
137 0 : pColPgSet = pFrameSet;
138 : }
139 :
140 0 : const SwPageDesc* pPageDesc = rWrtShell.GetSelectedPageDescs();
141 0 : if( pPageDesc )
142 : {
143 0 : pPageSet = new SfxItemSet( rWrtShell.GetAttrPool(),
144 : RES_COL, RES_COL,
145 : RES_FRM_SIZE, RES_FRM_SIZE,
146 : RES_LR_SPACE, RES_LR_SPACE,
147 0 : 0 );
148 :
149 0 : const SwFrmFmt &rFmt = pPageDesc->GetMaster();
150 0 : nPageWidth = rFmt.GetFrmSize().GetSize().Width();
151 :
152 0 : const SvxLRSpaceItem& rLRSpace = (const SvxLRSpaceItem&)rFmt.GetLRSpace();
153 0 : const SvxBoxItem& rBox = (const SvxBoxItem&) rFmt.GetBox();
154 0 : nPageWidth -= rLRSpace.GetLeft() + rLRSpace.GetRight() + rBox.GetDistance();
155 :
156 0 : pPageSet->Put(rFmt.GetCol());
157 0 : pPageSet->Put(rFmt.GetLRSpace());
158 0 : pColPgSet = pPageSet;
159 : }
160 :
161 : assert(pColPgSet);
162 :
163 : // create TabPage
164 0 : pTabPage = (SwColumnPage*) SwColumnPage::Create(get_content_area(), pColPgSet);
165 0 : pTabPage->get<vcl::Window>("applytoft")->Show();
166 0 : pTabPage->get(m_pApplyToLB, "applytolb");
167 0 : m_pApplyToLB->Show();
168 :
169 0 : if (pCurrSection && (!rWrtShell.HasSelection() || 0 != nFullSectCnt))
170 : {
171 : m_pApplyToLB->RemoveEntry( m_pApplyToLB->GetEntryPos(
172 : (void*)(sal_IntPtr)( 1 >= nFullSectCnt
173 : ? LISTBOX_SECTIONS
174 0 : : LISTBOX_SECTION )));
175 : }
176 : else
177 : {
178 0 : m_pApplyToLB->RemoveEntry(m_pApplyToLB->GetEntryPos( (void*)(sal_IntPtr)LISTBOX_SECTION ));
179 0 : m_pApplyToLB->RemoveEntry(m_pApplyToLB->GetEntryPos( (void*)(sal_IntPtr)LISTBOX_SECTIONS ));
180 : }
181 :
182 0 : if (!( rWrtShell.HasSelection() && rWrtShell.IsInsRegionAvailable() &&
183 0 : ( !pCurrSection || ( 1 != nFullSectCnt &&
184 0 : IsMarkInSameSection( rWrtShell, pCurrSection ) ))))
185 0 : m_pApplyToLB->RemoveEntry(m_pApplyToLB->GetEntryPos( (void*)(sal_IntPtr)LISTBOX_SELECTION ));
186 :
187 0 : if (!rWrtShell.GetFlyFrmFmt())
188 0 : m_pApplyToLB->RemoveEntry(m_pApplyToLB->GetEntryPos( (void*) LISTBOX_FRAME ));
189 :
190 0 : const sal_Int32 nPagePos = m_pApplyToLB->GetEntryPos( (void*) LISTBOX_PAGE );
191 0 : if (pPageSet && pPageDesc)
192 : {
193 0 : const OUString sPageStr = m_pApplyToLB->GetEntry(nPagePos) + pPageDesc->GetName();
194 0 : m_pApplyToLB->RemoveEntry(nPagePos);
195 0 : m_pApplyToLB->InsertEntry( sPageStr, nPagePos );
196 0 : m_pApplyToLB->SetEntryData( nPagePos, (void*) LISTBOX_PAGE);
197 : }
198 : else
199 0 : m_pApplyToLB->RemoveEntry( nPagePos );
200 :
201 0 : m_pApplyToLB->SelectEntryPos(0);
202 0 : ObjectHdl(0);
203 :
204 0 : m_pApplyToLB->SetSelectHdl(LINK(this, SwColumnDlg, ObjectHdl));
205 0 : OKButton *pOK = get<OKButton>("ok");
206 0 : pOK->SetClickHdl(LINK(this, SwColumnDlg, OkHdl));
207 : //#i80458# if no columns can be set then disable OK
208 0 : if( !m_pApplyToLB->GetEntryCount() )
209 0 : pOK->Enable( false );
210 : //#i97810# set focus to the TabPage
211 0 : pTabPage->ActivateColumnControl();
212 0 : pTabPage->Show();
213 0 : }
214 :
215 0 : SwColumnDlg::~SwColumnDlg()
216 : {
217 0 : delete pTabPage;
218 0 : delete pPageSet;
219 0 : delete pSectionSet;
220 0 : delete pSelectionSet;
221 0 : }
222 :
223 0 : IMPL_LINK(SwColumnDlg, ObjectHdl, ListBox*, pBox)
224 : {
225 0 : SfxItemSet* pSet = 0;
226 0 : switch(nOldSelection)
227 : {
228 : case LISTBOX_SELECTION :
229 0 : pSet = pSelectionSet;
230 0 : break;
231 : case LISTBOX_SECTION :
232 0 : pSet = pSectionSet;
233 0 : bSectionChanged = true;
234 0 : break;
235 : case LISTBOX_SECTIONS :
236 0 : pSet = pSectionSet;
237 0 : bSelSectionChanged = true;
238 0 : break;
239 : case LISTBOX_PAGE :
240 0 : pSet = pPageSet;
241 0 : bPageChanged = true;
242 0 : break;
243 : case LISTBOX_FRAME:
244 0 : pSet = pFrameSet;
245 0 : bFrameChanged = true;
246 0 : break;
247 : }
248 0 : if(pBox)
249 : {
250 0 : pTabPage->FillItemSet(pSet);
251 : }
252 0 : nOldSelection = (sal_IntPtr)m_pApplyToLB->GetEntryData(m_pApplyToLB->GetSelectEntryPos());
253 0 : long nWidth = nSelectionWidth;
254 0 : switch(nOldSelection)
255 : {
256 : case LISTBOX_SELECTION :
257 0 : pSet = pSelectionSet;
258 0 : if( pSelectionSet )
259 0 : pSet->Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth, nWidth));
260 0 : break;
261 : case LISTBOX_SECTION :
262 : case LISTBOX_SECTIONS :
263 0 : pSet = pSectionSet;
264 0 : pSet->Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth, nWidth));
265 0 : break;
266 : case LISTBOX_PAGE :
267 0 : nWidth = nPageWidth;
268 0 : pSet = pPageSet;
269 0 : pSet->Put(SwFmtFrmSize(ATT_VAR_SIZE, nWidth, nWidth));
270 0 : break;
271 : case LISTBOX_FRAME:
272 0 : pSet = pFrameSet;
273 0 : break;
274 : }
275 :
276 0 : bool bIsSection = pSet == pSectionSet || pSet == pSelectionSet;
277 0 : pTabPage->ShowBalance(bIsSection);
278 0 : pTabPage->SetInSection(bIsSection);
279 0 : pTabPage->SetFrmMode(true);
280 0 : pTabPage->SetPageWidth(nWidth);
281 0 : if( pSet )
282 0 : pTabPage->Reset(pSet);
283 0 : return 0;
284 : }
285 :
286 0 : IMPL_LINK_NOARG(SwColumnDlg, OkHdl)
287 : {
288 : // evaluate current selection
289 0 : SfxItemSet* pSet = 0;
290 0 : switch(nOldSelection)
291 : {
292 : case LISTBOX_SELECTION :
293 0 : pSet = pSelectionSet;
294 0 : break;
295 : case LISTBOX_SECTION :
296 0 : pSet = pSectionSet;
297 0 : bSectionChanged = true;
298 0 : break;
299 : case LISTBOX_SECTIONS :
300 0 : pSet = pSectionSet;
301 0 : bSelSectionChanged = true;
302 0 : break;
303 : case LISTBOX_PAGE :
304 0 : pSet = pPageSet;
305 0 : bPageChanged = true;
306 0 : break;
307 : case LISTBOX_FRAME:
308 0 : pSet = pFrameSet;
309 0 : bFrameChanged = true;
310 0 : break;
311 : }
312 0 : pTabPage->FillItemSet(pSet);
313 :
314 0 : if(pSelectionSet && SfxItemState::SET == pSelectionSet->GetItemState(RES_COL))
315 : {
316 : //insert region with columns
317 0 : const SwFmtCol& rColItem = (const SwFmtCol&)pSelectionSet->Get(RES_COL);
318 : //only if there actually are columns!
319 0 : if(rColItem.GetNumCols() > 1)
320 0 : rWrtShell.GetView().GetViewFrame()->GetDispatcher()->Execute(
321 0 : FN_INSERT_REGION, SfxCallMode::ASYNCHRON, *pSelectionSet );
322 : }
323 :
324 0 : if(pSectionSet && pSectionSet->Count() && bSectionChanged )
325 : {
326 0 : const SwSection* pCurrSection = rWrtShell.GetCurrSection();
327 0 : const SwSectionFmt* pFmt = pCurrSection->GetFmt();
328 0 : const sal_uInt16 nNewPos = rWrtShell.GetSectionFmtPos( *pFmt );
329 0 : SwSectionData aData(*pCurrSection);
330 0 : rWrtShell.UpdateSection( nNewPos, aData, pSectionSet );
331 : }
332 :
333 0 : if(pSectionSet && pSectionSet->Count() && bSelSectionChanged )
334 : {
335 0 : rWrtShell.SetSectionAttr( *pSectionSet );
336 : }
337 :
338 0 : if(pPageSet && SfxItemState::SET == pPageSet->GetItemState(RES_COL) && bPageChanged)
339 : {
340 : // deterine current PageDescriptor and fill the Set with it
341 0 : const sal_uInt16 nCurIdx = rWrtShell.GetCurPageDesc();
342 0 : SwPageDesc aPageDesc(rWrtShell.GetPageDesc(nCurIdx));
343 0 : SwFrmFmt &rFmt = aPageDesc.GetMaster();
344 0 : rFmt.SetFmtAttr(pPageSet->Get(RES_COL));
345 0 : rWrtShell.ChgPageDesc(nCurIdx, aPageDesc);
346 : }
347 0 : if(pFrameSet && SfxItemState::SET == pFrameSet->GetItemState(RES_COL) && bFrameChanged)
348 : {
349 0 : SfxItemSet aTmp(*pFrameSet->GetPool(), RES_COL, RES_COL);
350 0 : aTmp.Put(*pFrameSet);
351 0 : rWrtShell.StartAction();
352 0 : rWrtShell.Push();
353 0 : rWrtShell.SetFlyFrmAttr( aTmp );
354 : // undo the frame selction again
355 0 : if(rWrtShell.IsFrmSelected())
356 : {
357 0 : rWrtShell.UnSelectFrm();
358 0 : rWrtShell.LeaveSelFrmMode();
359 : }
360 0 : rWrtShell.Pop();
361 0 : rWrtShell.EndAction();
362 : }
363 0 : EndDialog(RET_OK);
364 0 : return 0;
365 : }
366 :
367 : #if OSL_DEBUG_LEVEL < 2
368 : inline
369 : #endif
370 0 : sal_uInt16 GetMaxWidth( SwColMgr* pColMgr, sal_uInt16 nCols )
371 : {
372 0 : sal_uInt16 nMax = pColMgr->GetActualSize();
373 0 : if( --nCols )
374 0 : nMax -= pColMgr->GetGutterWidth() * nCols;
375 0 : return nMax;
376 : }
377 :
378 : static sal_uInt16 aPageRg[] = {
379 : RES_COL, RES_COL,
380 : 0
381 : };
382 :
383 0 : void SwColumnPage::ResetColWidth()
384 : {
385 0 : if( nCols )
386 : {
387 0 : const sal_uInt16 nWidth = GetMaxWidth( pColMgr, nCols ) / nCols;
388 :
389 0 : for(sal_uInt16 i = 0; i < nCols; ++i)
390 0 : nColWidth[i] = (long) nWidth;
391 : }
392 :
393 0 : }
394 :
395 : // Now as TabPage
396 0 : SwColumnPage::SwColumnPage(vcl::Window *pParent, const SfxItemSet &rSet)
397 : : SfxTabPage(pParent, "ColumnPage", "modules/swriter/ui/columnpage.ui", &rSet)
398 : , pColMgr(0)
399 : , nFirstVis(0)
400 : , nMinWidth(MINLAY)
401 : , pModifiedField(0)
402 : , bFormat(false)
403 : , bFrm(false)
404 : , bHtmlMode(false)
405 0 : , bLockUpdate(false)
406 : {
407 0 : get(m_pCLNrEdt, "colsnf");
408 0 : get(m_pBalanceColsCB, "balance");
409 0 : get(m_pBtnBack, "back");
410 0 : get(m_pLbl1, "1");
411 0 : get(m_pLbl2, "2");
412 0 : get(m_pLbl3, "3");
413 0 : get(m_pBtnNext, "next");
414 0 : get(m_pAutoWidthBox, "autowidth");
415 0 : get(m_pLineTypeLbl, "linestyleft");
416 0 : get(m_pLineWidthLbl, "linewidthft");
417 0 : get(m_pLineWidthEdit, "linewidthmf");
418 0 : get(m_pLineColorLbl, "linecolorft");
419 0 : get(m_pLineHeightLbl, "lineheightft");
420 0 : get(m_pLineHeightEdit, "lineheightmf");
421 0 : get(m_pLinePosLbl, "lineposft");
422 0 : get(m_pLinePosDLB, "lineposlb");
423 0 : get(m_pTextDirectionFT, "textdirectionft");
424 0 : get(m_pTextDirectionLB, "textdirectionlb");
425 0 : get(m_pLineColorDLB, "colorlb");
426 0 : get(m_pLineTypeDLB, "linestylelb");
427 :
428 0 : get(m_pDefaultVS, "valueset");
429 0 : get(m_pPgeExampleWN, "pageexample");
430 0 : get(m_pFrmExampleWN, "frameexample");
431 :
432 0 : connectPercentField(aEd1, "width1mf");
433 0 : connectPercentField(aEd2, "width2mf");
434 0 : connectPercentField(aEd3, "width3mf");
435 0 : connectPercentField(aDistEd1, "spacing1mf");
436 0 : connectPercentField(aDistEd2, "spacing2mf");
437 :
438 0 : SetExchangeSupport();
439 :
440 0 : VclFrame *pSpacing = get<VclFrame>("spacing");
441 0 : m_pBtnNext->SetAccessibleRelationMemberOf(pSpacing->get_label_widget());
442 :
443 0 : m_pDefaultVS->SetColCount( 5 );
444 :
445 0 : for (int i = 0; i < 5; ++i)
446 : //Set accessible name one by one
447 : {
448 0 : OUString aItemText;
449 0 : switch( i )
450 : {
451 : case 0:
452 0 : aItemText = SW_RESSTR( STR_COLUMN_VALUESET_ITEM0 ) ;
453 0 : break;
454 : case 1:
455 0 : aItemText = SW_RESSTR( STR_COLUMN_VALUESET_ITEM1 ) ;
456 0 : break;
457 : case 2:
458 0 : aItemText = SW_RESSTR( STR_COLUMN_VALUESET_ITEM2 ) ;
459 0 : break;
460 : case 3:
461 0 : aItemText = SW_RESSTR( STR_COLUMN_VALUESET_ITEM3 );
462 0 : break;
463 : default:
464 0 : aItemText = SW_RESSTR( STR_COLUMN_VALUESET_ITEM4 );
465 0 : break;
466 : }
467 0 : m_pDefaultVS->InsertItem( i + 1, aItemText, i );
468 0 : }
469 :
470 0 : m_pDefaultVS->SetSelectHdl(LINK(this, SwColumnPage, SetDefaultsHdl));
471 :
472 0 : Link aCLNrLk = LINK(this, SwColumnPage, ColModify);
473 0 : m_pCLNrEdt->SetModifyHdl(aCLNrLk);
474 0 : Link aLk = LINK(this, SwColumnPage, GapModify);
475 0 : aDistEd1.SetModifyHdl(aLk);
476 0 : aDistEd2.SetModifyHdl(aLk);
477 :
478 0 : aLk = LINK(this, SwColumnPage, EdModify);
479 :
480 0 : aEd1.SetModifyHdl(aLk);
481 :
482 0 : aEd2.SetModifyHdl(aLk);
483 :
484 0 : aEd3.SetModifyHdl(aLk);
485 :
486 0 : m_pBtnBack->SetClickHdl(LINK(this, SwColumnPage, Up));
487 0 : m_pBtnNext->SetClickHdl(LINK(this, SwColumnPage, Down));
488 0 : m_pAutoWidthBox->SetClickHdl(LINK(this, SwColumnPage, AutoWidthHdl));
489 :
490 0 : aLk = LINK( this, SwColumnPage, UpdateColMgr );
491 0 : m_pLineTypeDLB->SetSelectHdl( aLk );
492 0 : m_pLineWidthEdit->SetModifyHdl( aLk );
493 0 : m_pLineColorDLB->SetSelectHdl( aLk );
494 0 : m_pLineHeightEdit->SetModifyHdl( aLk );
495 0 : m_pLinePosDLB->SetSelectHdl( aLk );
496 :
497 : // Separator line
498 0 : m_pLineTypeDLB->SetUnit( FUNIT_POINT );
499 0 : m_pLineTypeDLB->SetSourceUnit( FUNIT_TWIP );
500 :
501 : // Fill the line styles listbox
502 0 : m_pLineTypeDLB->SetNone( SVX_RESSTR( RID_SVXSTR_NONE ) );
503 : m_pLineTypeDLB->InsertEntry(
504 : ::editeng::SvxBorderLine::getWidthImpl(table::BorderLineStyle::SOLID),
505 0 : table::BorderLineStyle::SOLID );
506 : m_pLineTypeDLB->InsertEntry(
507 : ::editeng::SvxBorderLine::getWidthImpl(table::BorderLineStyle::DOTTED),
508 0 : table::BorderLineStyle::DOTTED );
509 : m_pLineTypeDLB->InsertEntry(
510 : ::editeng::SvxBorderLine::getWidthImpl(table::BorderLineStyle::DASHED),
511 0 : table::BorderLineStyle::DASHED );
512 :
513 : long nLineWidth = static_cast<long>(MetricField::ConvertDoubleValue(
514 0 : m_pLineWidthEdit->GetValue( ),
515 0 : m_pLineWidthEdit->GetDecimalDigits( ),
516 0 : m_pLineWidthEdit->GetUnit(), MAP_TWIP ));
517 0 : m_pLineTypeDLB->SetWidth( nLineWidth );
518 :
519 : // Fill the color listbox
520 0 : SfxObjectShell* pDocSh = SfxObjectShell::Current();
521 0 : const SfxPoolItem* pItem = NULL;
522 0 : XColorListRef pColorList;
523 0 : if ( pDocSh )
524 : {
525 0 : pItem = pDocSh->GetItem( SID_COLOR_TABLE );
526 0 : if ( pItem != NULL )
527 0 : pColorList = ( (SvxColorListItem*)pItem )->GetColorList();
528 : }
529 :
530 0 : if ( pColorList.is() )
531 : {
532 0 : m_pLineColorDLB->SetUpdateMode( false );
533 :
534 0 : for (long i = 0; i < pColorList->Count(); ++i )
535 : {
536 0 : XColorEntry* pEntry = pColorList->GetColor(i);
537 0 : m_pLineColorDLB->InsertEntry( pEntry->GetColor(), pEntry->GetName() );
538 : }
539 0 : m_pLineColorDLB->SetUpdateMode( true );
540 : }
541 0 : m_pLineColorDLB->SelectEntryPos( 0 );
542 0 : }
543 :
544 0 : SwColumnPage::~SwColumnPage()
545 : {
546 0 : delete pColMgr;
547 0 : }
548 :
549 0 : void SwColumnPage::SetPageWidth(long nPageWidth)
550 : {
551 0 : long nNewMaxWidth = static_cast< long >(aEd1.NormalizePercent(nPageWidth));
552 :
553 0 : aDistEd1.SetMax(nNewMaxWidth, FUNIT_TWIP);
554 0 : aDistEd2.SetMax(nNewMaxWidth, FUNIT_TWIP);
555 0 : aEd1.SetMax(nNewMaxWidth, FUNIT_TWIP);
556 0 : aEd2.SetMax(nNewMaxWidth, FUNIT_TWIP);
557 0 : aEd3.SetMax(nNewMaxWidth, FUNIT_TWIP);
558 0 : }
559 :
560 0 : void SwColumnPage::connectPercentField(PercentField &rWrap, const OString &rName)
561 : {
562 0 : MetricField *pFld = get<MetricField>(rName);
563 : assert(pFld);
564 0 : rWrap.set(pFld);
565 0 : m_aPercentFieldsMap[pFld] = &rWrap;
566 0 : }
567 :
568 0 : void SwColumnPage::Reset(const SfxItemSet *rSet)
569 : {
570 : const sal_uInt16 nHtmlMode =
571 0 : ::GetHtmlMode((const SwDocShell*)SfxObjectShell::Current());
572 0 : if(nHtmlMode & HTMLMODE_ON)
573 : {
574 0 : bHtmlMode = true;
575 0 : m_pAutoWidthBox->Enable(false);
576 : }
577 0 : FieldUnit aMetric = ::GetDfltMetric(bHtmlMode);
578 0 : aEd1.SetMetric(aMetric);
579 0 : aEd2.SetMetric(aMetric);
580 0 : aEd3.SetMetric(aMetric);
581 0 : aDistEd1.SetMetric(aMetric);
582 0 : aDistEd2.SetMetric(aMetric);
583 :
584 0 : delete pColMgr;
585 0 : pColMgr = new SwColMgr(*rSet);
586 0 : nCols = pColMgr->GetCount() ;
587 0 : m_pCLNrEdt->SetMax(std::max((sal_uInt16)m_pCLNrEdt->GetMax(), nCols));
588 0 : m_pCLNrEdt->SetLast(std::max(nCols,(sal_uInt16)m_pCLNrEdt->GetMax()));
589 :
590 0 : if(bFrm)
591 : {
592 0 : if(bFormat) // there is no size here
593 0 : pColMgr->SetActualWidth(FRAME_FORMAT_WIDTH);
594 : else
595 : {
596 0 : const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)rSet->Get(RES_FRM_SIZE);
597 0 : const SvxBoxItem& rBox = (const SvxBoxItem&) rSet->Get(RES_BOX);
598 0 : pColMgr->SetActualWidth((sal_uInt16)rSize.GetSize().Width() - rBox.GetDistance());
599 : }
600 : }
601 0 : if(m_pBalanceColsCB->IsVisible())
602 : {
603 : const SfxPoolItem* pItem;
604 0 : if( SfxItemState::SET == rSet->GetItemState( RES_COLUMNBALANCE, false, &pItem ))
605 0 : m_pBalanceColsCB->Check(!((const SwFmtNoBalancedColumns*)pItem)->GetValue());
606 : else
607 0 : m_pBalanceColsCB->Check( true );
608 : }
609 :
610 : //text direction
611 0 : if( SfxItemState::DEFAULT <= rSet->GetItemState( RES_FRAMEDIR ) )
612 : {
613 0 : const SvxFrameDirectionItem& rItem = (const SvxFrameDirectionItem&)rSet->Get(RES_FRAMEDIR);
614 0 : sal_uIntPtr nVal = rItem.GetValue();
615 0 : const sal_Int32 nPos = m_pTextDirectionLB->GetEntryPos( (void*) nVal );
616 0 : m_pTextDirectionLB->SelectEntryPos( nPos );
617 0 : m_pTextDirectionLB->SaveValue();
618 : }
619 :
620 0 : Init();
621 0 : ActivatePage( *rSet );
622 0 : }
623 :
624 : // create TabPage
625 0 : SfxTabPage* SwColumnPage::Create(vcl::Window *pParent, const SfxItemSet *rSet)
626 : {
627 0 : return new SwColumnPage(pParent, *rSet);
628 : }
629 : // stuff attributes into the Set when OK
630 0 : bool SwColumnPage::FillItemSet(SfxItemSet *rSet)
631 : {
632 0 : if(m_pCLNrEdt->HasChildPathFocus())
633 0 : m_pCLNrEdt->GetDownHdl().Call(m_pCLNrEdt);
634 : // set in ItemSet setzen
635 : // the current settings are already present
636 :
637 : const SfxPoolItem* pOldItem;
638 0 : const SwFmtCol& rCol = pColMgr->GetColumns();
639 0 : if(0 == (pOldItem = GetOldItem( *rSet, RES_COL )) ||
640 0 : rCol != *pOldItem )
641 0 : rSet->Put(rCol);
642 :
643 0 : if(m_pBalanceColsCB->IsVisible() )
644 : {
645 0 : rSet->Put(SwFmtNoBalancedColumns(!m_pBalanceColsCB->IsChecked() ));
646 : }
647 0 : if( m_pTextDirectionLB->IsVisible())
648 : {
649 0 : const sal_Int32 nPos = m_pTextDirectionLB->GetSelectEntryPos();
650 0 : if ( m_pTextDirectionLB->IsValueChangedFromSaved() )
651 : {
652 0 : sal_uInt32 nDirection = (sal_uInt32)(sal_IntPtr)m_pTextDirectionLB->GetEntryData( nPos );
653 0 : rSet->Put( SvxFrameDirectionItem( (SvxFrameDirection)nDirection, RES_FRAMEDIR));
654 : }
655 : }
656 0 : return true;
657 : }
658 :
659 : // update ColumnManager
660 0 : IMPL_LINK( SwColumnPage, UpdateColMgr, void *, /*pField*/ )
661 : {
662 0 : long nGutterWidth = pColMgr->GetGutterWidth();
663 0 : if(nCols > 1)
664 : {
665 : // Determine whether the most narrow column is too narrow
666 : // for the adjusted column gap
667 0 : long nMin = nColWidth[0];
668 :
669 0 : for( sal_uInt16 i = 1; i < nCols; ++i )
670 0 : nMin = std::min(nMin, nColWidth[i]);
671 :
672 0 : bool bAutoWidth = m_pAutoWidthBox->IsChecked();
673 0 : if(!bAutoWidth)
674 : {
675 0 : pColMgr->SetAutoWidth(false);
676 : // when the user didn't allocate the whole width,
677 : // add the missing amount to the last column.
678 0 : long nSum = 0;
679 0 : for(sal_uInt16 i = 0; i < nCols; ++i)
680 0 : nSum += nColWidth[i];
681 0 : nGutterWidth = 0;
682 0 : for(sal_uInt16 i = 0; i < nCols - 1; ++i)
683 0 : nGutterWidth += nColDist[i];
684 0 : nSum += nGutterWidth;
685 :
686 0 : long nMaxW = pColMgr->GetActualSize();
687 :
688 0 : if( nSum < nMaxW )
689 0 : nColWidth[nCols - 1] += nMaxW - nSum;
690 :
691 0 : pColMgr->SetColWidth( 0, static_cast< sal_uInt16 >(nColWidth[0] + nColDist[0]/2) );
692 0 : for( sal_uInt16 i = 1; i < nCols-1; ++i )
693 : {
694 0 : long nActDist = (nColDist[i] + nColDist[i - 1]) / 2;
695 0 : pColMgr->SetColWidth( i, static_cast< sal_uInt16 >(nColWidth[i] + nActDist ));
696 : }
697 0 : pColMgr->SetColWidth( nCols-1, static_cast< sal_uInt16 >(nColWidth[nCols-1] + nColDist[nCols -2]/2) );
698 :
699 : }
700 :
701 0 : bool bEnable = isLineNotNone();
702 0 : m_pLineHeightEdit->Enable( bEnable );
703 0 : m_pLineHeightLbl->Enable( bEnable );
704 0 : m_pLineWidthLbl->Enable( bEnable );
705 0 : m_pLineWidthEdit->Enable( bEnable );
706 0 : m_pLineColorDLB->Enable( bEnable );
707 0 : m_pLineColorLbl->Enable( bEnable );
708 :
709 : long nLineWidth = static_cast<long>(MetricField::ConvertDoubleValue(
710 0 : m_pLineWidthEdit->GetValue( ),
711 0 : m_pLineWidthEdit->GetDecimalDigits( ),
712 0 : m_pLineWidthEdit->GetUnit(), MAP_TWIP ));
713 0 : if( !bEnable )
714 0 : pColMgr->SetNoLine();
715 : else
716 : {
717 : pColMgr->SetLineWidthAndColor(
718 0 : ::editeng::SvxBorderStyle( m_pLineTypeDLB->GetSelectEntryStyle( ) ),
719 : nLineWidth,
720 0 : m_pLineColorDLB->GetSelectEntryColor() );
721 : pColMgr->SetAdjust( SwColLineAdj(
722 0 : m_pLinePosDLB->GetSelectEntryPos() + 1) );
723 0 : pColMgr->SetLineHeightPercent((short)m_pLineHeightEdit->GetValue());
724 0 : bEnable = pColMgr->GetLineHeightPercent() != 100;
725 : }
726 0 : m_pLinePosLbl->Enable( bEnable );
727 0 : m_pLinePosDLB->Enable( bEnable );
728 :
729 : //fdo#66815 if the values are going to be the same, don't update
730 : //them to avoid the listbox selection resetting
731 0 : if (nLineWidth != m_pLineTypeDLB->GetWidth())
732 0 : m_pLineTypeDLB->SetWidth(nLineWidth);
733 0 : Color aColor(m_pLineColorDLB->GetSelectEntryColor());
734 0 : if (aColor != m_pLineTypeDLB->GetColor())
735 0 : m_pLineTypeDLB->SetColor(aColor);
736 : }
737 : else
738 : {
739 0 : pColMgr->NoCols();
740 0 : nCols = 0;
741 : }
742 :
743 : //set maximum values
744 : m_pCLNrEdt->SetMax(std::max(1L,
745 0 : std::min(long(nMaxCols), long( pColMgr->GetActualSize() / (nGutterWidth + MINLAY)) )));
746 0 : m_pCLNrEdt->SetLast(m_pCLNrEdt->GetMax());
747 0 : m_pCLNrEdt->Reformat();
748 :
749 : //prompt example window
750 0 : if(!bLockUpdate)
751 : {
752 0 : if(bFrm)
753 : {
754 0 : m_pFrmExampleWN->SetColumns( pColMgr->GetColumns() );
755 0 : m_pFrmExampleWN->Invalidate();
756 : }
757 : else
758 0 : m_pPgeExampleWN->Invalidate();
759 : }
760 :
761 0 : return 0;
762 : }
763 :
764 0 : void SwColumnPage::Init()
765 : {
766 0 : m_pCLNrEdt->SetValue(nCols);
767 :
768 0 : bool bAutoWidth = pColMgr->IsAutoWidth() || bHtmlMode;
769 0 : m_pAutoWidthBox->Check( bAutoWidth );
770 :
771 0 : sal_Int32 nColumnWidthSum = 0;
772 : // set the widths
773 0 : for(sal_uInt16 i = 0; i < nCols; ++i)
774 : {
775 0 : nColWidth[i] = pColMgr->GetColWidth(i);
776 0 : nColumnWidthSum += nColWidth[i];
777 0 : if(i < nCols - 1)
778 0 : nColDist[i] = pColMgr->GetGutterWidth(i);
779 : }
780 :
781 0 : if( 1 < nCols )
782 : {
783 : // #97495# make sure that the automatic column width's are always equal
784 0 : if(bAutoWidth)
785 : {
786 0 : nColumnWidthSum /= nCols;
787 0 : for(sal_uInt16 i = 0; i < nCols; ++i)
788 0 : nColWidth[i] = nColumnWidthSum;
789 : }
790 0 : SwColLineAdj eAdj = pColMgr->GetAdjust();
791 0 : if( COLADJ_NONE == eAdj ) // the dialog doesn't know a NONE!
792 : {
793 0 : eAdj = COLADJ_TOP;
794 : //without Adjust no line type
795 0 : m_pLineTypeDLB->SelectEntryPos( 0 );
796 0 : m_pLineHeightEdit->SetValue( 100 );
797 : }
798 : else
799 : {
800 : // Need to multiply by 100 because of the 2 decimals
801 0 : m_pLineWidthEdit->SetValue( pColMgr->GetLineWidth() * 100, FUNIT_TWIP );
802 0 : m_pLineColorDLB->SelectEntry( pColMgr->GetLineColor() );
803 0 : m_pLineTypeDLB->SelectEntry( pColMgr->GetLineStyle() );
804 0 : m_pLineTypeDLB->SetWidth( pColMgr->GetLineWidth( ) );
805 0 : m_pLineHeightEdit->SetValue( pColMgr->GetLineHeightPercent() );
806 :
807 : }
808 0 : m_pLinePosDLB->SelectEntryPos( static_cast< sal_Int32 >(eAdj - 1) );
809 : }
810 : else
811 : {
812 0 : m_pLinePosDLB->SelectEntryPos( 0 );
813 0 : m_pLineTypeDLB->SelectEntryPos( 0 );
814 0 : m_pLineHeightEdit->SetValue( 100 );
815 : }
816 :
817 0 : UpdateCols();
818 0 : Update();
819 :
820 : // set maximum number of columns
821 : // values below 1 are not allowed
822 : m_pCLNrEdt->SetMax(std::max(1L,
823 0 : std::min(long(nMaxCols), long( pColMgr->GetActualSize() / nMinWidth) )));
824 0 : }
825 :
826 0 : bool SwColumnPage::isLineNotNone() const
827 : {
828 : // nothing is turned off
829 0 : const sal_Int32 nPos = m_pLineTypeDLB->GetSelectEntryPos();
830 0 : return nPos != LISTBOX_ENTRY_NOTFOUND && nPos != 0;
831 : }
832 :
833 : /*
834 : * The number of columns has changed -- here the controls for editing of the
835 : * columns are en- or disabled according to the column number. In case there are
836 : * more than nVisCols (=3) all Edit are being enabled and the buttons for
837 : * scrolling too. Otherwise Edits are being enabled according to the column
838 : * numbers; one column can not be edited.
839 : */
840 0 : void SwColumnPage::UpdateCols()
841 : {
842 0 : bool bEnableBtns= false;
843 0 : bool bEnable12 = false;
844 0 : bool bEnable3 = false;
845 0 : const bool bEdit = !m_pAutoWidthBox->IsChecked();
846 0 : if ( nCols > nVisCols )
847 : {
848 0 : bEnableBtns = true && !bHtmlMode;
849 0 : bEnable12 = bEnable3 = bEdit;
850 : }
851 0 : else if( bEdit )
852 : {
853 : // here are purposely hardly any breaks
854 0 : switch(nCols)
855 : {
856 0 : case 3: bEnable3 = true;
857 0 : case 2: bEnable12= true; break;
858 : default: /* do nothing */;
859 : }
860 : }
861 0 : aEd1.Enable( bEnable12 );
862 0 : bool bEnable = nCols > 1;
863 0 : aDistEd1.Enable(bEnable);
864 0 : m_pAutoWidthBox->Enable( bEnable && !bHtmlMode );
865 0 : aEd2.Enable( bEnable12 );
866 0 : aDistEd2.Enable(bEnable3);
867 0 : aEd3.Enable( bEnable3 );
868 0 : m_pLbl1->Enable(bEnable12 );
869 0 : m_pLbl2->Enable(bEnable12 );
870 0 : m_pLbl3->Enable(bEnable3 );
871 0 : m_pBtnBack->Enable( bEnableBtns );
872 0 : m_pBtnNext->Enable( bEnableBtns );
873 :
874 0 : m_pLineTypeDLB->Enable( bEnable );
875 0 : m_pLineTypeLbl->Enable( bEnable );
876 :
877 0 : if (bEnable)
878 : {
879 0 : bEnable = isLineNotNone();
880 : }
881 :
882 : //all these depend on > 1 column and line style != none
883 0 : m_pLineHeightEdit->Enable( bEnable );
884 0 : m_pLineHeightLbl->Enable( bEnable );
885 0 : m_pLineWidthLbl->Enable( bEnable );
886 0 : m_pLineWidthEdit->Enable( bEnable );
887 0 : m_pLineColorDLB->Enable( bEnable );
888 0 : m_pLineColorLbl->Enable( bEnable );
889 :
890 0 : if (bEnable)
891 0 : bEnable = pColMgr->GetLineHeightPercent() != 100;
892 :
893 : //and these additionally depend on line height != 100%
894 0 : m_pLinePosDLB->Enable( bEnable );
895 0 : m_pLinePosLbl->Enable( bEnable );
896 0 : }
897 :
898 0 : void SwColumnPage::SetLabels( sal_uInt16 nVis )
899 : {
900 : //insert ~ before the last character, e.g. 1 -> ~1, 10 -> 1~0
901 0 : const OUString sLbl( '~' );
902 :
903 0 : const OUString sLbl1(OUString::number( nVis + 1 ));
904 0 : m_pLbl1->SetText(sLbl1.replaceAt(sLbl1.getLength()-1, 0, sLbl));
905 :
906 0 : const OUString sLbl2(OUString::number( nVis + 2 ));
907 0 : m_pLbl2->SetText(sLbl2.replaceAt(sLbl2.getLength()-1, 0, sLbl));
908 :
909 0 : const OUString sLbl3(OUString::number( nVis + 3 ));
910 0 : m_pLbl3->SetText(sLbl3.replaceAt(sLbl3.getLength()-1, 0, sLbl));
911 :
912 0 : const OUString sColumnWidth = SW_RESSTR( STR_ACCESS_COLUMN_WIDTH ) ;
913 0 : aEd1.SetAccessibleName(sColumnWidth.replaceFirst("%1", sLbl1));
914 0 : aEd2.SetAccessibleName(sColumnWidth.replaceFirst("%1", sLbl2));
915 0 : aEd3.SetAccessibleName(sColumnWidth.replaceFirst("%1", sLbl3));
916 :
917 0 : const OUString sDist = SW_RESSTR( STR_ACCESS_PAGESETUP_SPACING ) ;
918 : aDistEd1.SetAccessibleName(
919 0 : sDist.replaceFirst("%1", sLbl1).replaceFirst("%2", sLbl2));
920 :
921 : aDistEd2.SetAccessibleName(
922 0 : sDist.replaceFirst("%1", sLbl2).replaceFirst("%2", sLbl3));
923 0 : }
924 :
925 : /*
926 : * Handler that is called at alteration of the column number. An alteration of
927 : * the column number overwrites potential user's width settings; all columns
928 : * are equally wide.
929 : */
930 0 : IMPL_LINK( SwColumnPage, ColModify, NumericField *, pNF )
931 : {
932 0 : nCols = (sal_uInt16)m_pCLNrEdt->GetValue();
933 : //#107890# the handler is also called from LoseFocus()
934 : //then no change has been made and thus no action should be taken
935 : // #i17816# changing the displayed types within the ValueSet
936 : //from two columns to two columns with different settings doesn't invalidate the
937 : // example windows in ::ColModify()
938 0 : if (!pNF || pColMgr->GetCount() != nCols)
939 : {
940 0 : if(pNF)
941 0 : m_pDefaultVS->SetNoSelection();
942 0 : long nDist = static_cast< long >(aDistEd1.DenormalizePercent(aDistEd1.GetValue(FUNIT_TWIP)));
943 0 : pColMgr->SetCount(nCols, (sal_uInt16)nDist);
944 0 : for(sal_uInt16 i = 0; i < nCols; i++)
945 0 : nColDist[i] = nDist;
946 0 : nFirstVis = 0;
947 0 : SetLabels( nFirstVis );
948 0 : UpdateCols();
949 0 : ResetColWidth();
950 0 : Update();
951 : }
952 :
953 0 : return 0;
954 : }
955 :
956 : /*
957 : * Modify handler for an alteration of the column width or the column gap.
958 : * These changes take effect time-displaced. With an alteration of the column
959 : * width the automatic calculation of the column width is overruled; only an
960 : * alteration of the column number leads back to that default.
961 : */
962 0 : IMPL_LINK( SwColumnPage, GapModify, MetricField*, pMetricFld )
963 : {
964 0 : if (nCols < 2)
965 0 : return 0;
966 0 : PercentField *pFld = m_aPercentFieldsMap[pMetricFld];
967 : assert(pFld);
968 0 : long nActValue = static_cast< long >(pFld->DenormalizePercent(pFld->GetValue(FUNIT_TWIP)));
969 0 : if(m_pAutoWidthBox->IsChecked())
970 : {
971 : const long nMaxGap = static_cast< long >
972 0 : ((pColMgr->GetActualSize() - nCols * MINLAY)/(nCols - 1));
973 0 : if(nActValue > nMaxGap)
974 : {
975 0 : nActValue = nMaxGap;
976 0 : aDistEd1.SetPrcntValue(aDistEd1.NormalizePercent(nMaxGap), FUNIT_TWIP);
977 : }
978 0 : pColMgr->SetGutterWidth((sal_uInt16)nActValue);
979 0 : for(sal_uInt16 i = 0; i < nCols; i++)
980 0 : nColDist[i] = nActValue;
981 :
982 0 : ResetColWidth();
983 0 : UpdateCols();
984 : }
985 : else
986 : {
987 0 : const sal_uInt16 nVis = nFirstVis + ((pFld == &aDistEd2) ? 1 : 0);
988 0 : long nDiff = nActValue - nColDist[nVis];
989 0 : if(nDiff)
990 : {
991 0 : long nLeft = nColWidth[nVis];
992 0 : long nRight = nColWidth[nVis + 1];
993 0 : if(nLeft + nRight + 2 * MINLAY < nDiff)
994 0 : nDiff = nLeft + nRight - 2 * MINLAY;
995 0 : if(nDiff < nRight - MINLAY)
996 : {
997 0 : nRight -= nDiff;
998 : }
999 : else
1000 : {
1001 0 : long nTemp = nDiff - nRight + MINLAY;
1002 0 : nRight = MINLAY;
1003 0 : if(nLeft > nTemp - MINLAY)
1004 : {
1005 0 : nLeft -= nTemp;
1006 0 : nTemp = 0;
1007 : }
1008 : else
1009 : {
1010 0 : nTemp -= nLeft + MINLAY;
1011 0 : nLeft = MINLAY;
1012 : }
1013 0 : nDiff = nTemp;
1014 : }
1015 0 : nColWidth[nVis] = nLeft;
1016 0 : nColWidth[nVis + 1] = nRight;
1017 0 : nColDist[nVis] += nDiff;
1018 :
1019 0 : pColMgr->SetColWidth( nVis, sal_uInt16(nLeft) );
1020 0 : pColMgr->SetColWidth( nVis + 1, sal_uInt16(nRight) );
1021 0 : pColMgr->SetGutterWidth( sal_uInt16(nColDist[nVis]), nVis );
1022 : }
1023 :
1024 : }
1025 0 : Update();
1026 0 : return 0;
1027 : }
1028 :
1029 0 : IMPL_LINK( SwColumnPage, EdModify, MetricField *, pMetricFld )
1030 : {
1031 0 : PercentField *pField = m_aPercentFieldsMap[pMetricFld];
1032 : assert(pField);
1033 0 : pModifiedField = pField;
1034 0 : Timeout();
1035 0 : return 0;
1036 : }
1037 :
1038 : // Handler behind the Checkbox for automatic width. When the box is checked
1039 : // no expicit values for the column width can be entered.
1040 0 : IMPL_LINK( SwColumnPage, AutoWidthHdl, CheckBox *, pBox )
1041 : {
1042 0 : long nDist = static_cast< long >(aDistEd1.DenormalizePercent(aDistEd1.GetValue(FUNIT_TWIP)));
1043 0 : pColMgr->SetCount(nCols, (sal_uInt16)nDist);
1044 0 : for(sal_uInt16 i = 0; i < nCols; i++)
1045 0 : nColDist[i] = nDist;
1046 0 : if(pBox->IsChecked())
1047 : {
1048 0 : pColMgr->SetGutterWidth(sal_uInt16(nDist));
1049 0 : ResetColWidth();
1050 : }
1051 0 : pColMgr->SetAutoWidth(pBox->IsChecked(), sal_uInt16(nDist));
1052 0 : UpdateCols();
1053 0 : Update();
1054 0 : return 0;
1055 : }
1056 :
1057 : // scroll up the contents of the edits
1058 0 : IMPL_LINK_NOARG(SwColumnPage, Up)
1059 : {
1060 0 : if( nFirstVis )
1061 : {
1062 0 : --nFirstVis;
1063 0 : SetLabels( nFirstVis );
1064 0 : Update();
1065 : }
1066 0 : return 0;
1067 : }
1068 :
1069 : // scroll down the contents of the edits.
1070 0 : IMPL_LINK_NOARG(SwColumnPage, Down)
1071 : {
1072 0 : if( nFirstVis + nVisCols < nCols )
1073 : {
1074 0 : ++nFirstVis;
1075 0 : SetLabels( nFirstVis );
1076 0 : Update();
1077 : }
1078 0 : return 0;
1079 : }
1080 :
1081 : // relict from ancient times - now directly without time handler; triggered by
1082 : // an alteration of the column width or the column gap.
1083 0 : void SwColumnPage::Timeout()
1084 : {
1085 0 : if(pModifiedField)
1086 : {
1087 : // find the changed column
1088 0 : sal_uInt16 nChanged = nFirstVis;
1089 0 : if(pModifiedField == &aEd2)
1090 0 : ++nChanged;
1091 0 : else if(pModifiedField == &aEd3)
1092 0 : nChanged += 2;
1093 :
1094 : long nNewWidth = static_cast< long >
1095 0 : (pModifiedField->DenormalizePercent(pModifiedField->GetValue(FUNIT_TWIP)));
1096 0 : long nDiff = nNewWidth - nColWidth[nChanged];
1097 :
1098 : // when it's the last column
1099 0 : if(nChanged == nCols - 1)
1100 : {
1101 0 : nColWidth[0] -= nDiff;
1102 0 : if(nColWidth[0] < (long)nMinWidth)
1103 : {
1104 0 : nNewWidth -= nMinWidth - nColWidth[0];
1105 0 : nColWidth[0] = nMinWidth;
1106 : }
1107 :
1108 : }
1109 0 : else if(nDiff)
1110 : {
1111 0 : nColWidth[nChanged + 1] -= nDiff;
1112 0 : if(nColWidth[nChanged + 1] < (long) nMinWidth)
1113 : {
1114 0 : nNewWidth -= nMinWidth - nColWidth[nChanged + 1];
1115 0 : nColWidth[nChanged + 1] = nMinWidth;
1116 : }
1117 : }
1118 0 : nColWidth[nChanged] = nNewWidth;
1119 0 : pModifiedField = 0;
1120 : }
1121 0 : Update();
1122 0 : }
1123 :
1124 : // Update the view
1125 0 : void SwColumnPage::Update()
1126 : {
1127 0 : m_pBalanceColsCB->Enable(nCols > 1);
1128 0 : if(nCols >= 2)
1129 : {
1130 0 : aEd1.SetPrcntValue(aEd1.NormalizePercent(nColWidth[nFirstVis]), FUNIT_TWIP);
1131 0 : aDistEd1.SetPrcntValue(aDistEd1.NormalizePercent(nColDist[nFirstVis]), FUNIT_TWIP);
1132 0 : aEd2.SetPrcntValue(aEd2.NormalizePercent(nColWidth[nFirstVis + 1]), FUNIT_TWIP);
1133 0 : if(nCols >= 3)
1134 : {
1135 0 : aDistEd2.SetPrcntValue(aDistEd2.NormalizePercent(nColDist[nFirstVis + 1]), FUNIT_TWIP);
1136 0 : aEd3.SetPrcntValue(aEd3.NormalizePercent(nColWidth[nFirstVis + 2]), FUNIT_TWIP);
1137 : }
1138 : else
1139 : {
1140 0 : aEd3.SetText(OUString());
1141 0 : aDistEd2.SetText(OUString());
1142 : }
1143 : }
1144 : else
1145 : {
1146 0 : aEd1.SetText(OUString());
1147 0 : aEd2.SetText(OUString());
1148 0 : aEd3.SetText(OUString());
1149 0 : aDistEd1.SetText(OUString());
1150 0 : aDistEd2.SetText(OUString());
1151 : }
1152 0 : UpdateColMgr(0);
1153 0 : }
1154 :
1155 : // Update Bsp
1156 0 : void SwColumnPage::ActivatePage(const SfxItemSet& rSet)
1157 : {
1158 0 : if(!bFrm)
1159 : {
1160 0 : if( SfxItemState::SET == rSet.GetItemState( SID_ATTR_PAGE_SIZE ))
1161 : {
1162 : const SvxSizeItem& rSize = (const SvxSizeItem&)rSet.Get(
1163 0 : SID_ATTR_PAGE_SIZE);
1164 : const SvxLRSpaceItem& rLRSpace = (const SvxLRSpaceItem&)rSet.Get(
1165 0 : RES_LR_SPACE );
1166 0 : const SvxBoxItem& rBox = (const SvxBoxItem&) rSet.Get(RES_BOX);
1167 0 : const sal_uInt16 nActWidth = static_cast< sal_uInt16 >(rSize.GetSize().Width()
1168 0 : - rLRSpace.GetLeft() - rLRSpace.GetRight() - rBox.GetDistance());
1169 :
1170 0 : if( pColMgr->GetActualSize() != nActWidth)
1171 : {
1172 0 : pColMgr->SetActualWidth(nActWidth);
1173 0 : ColModify( 0 );
1174 0 : UpdateColMgr( 0 );
1175 : }
1176 : }
1177 0 : m_pFrmExampleWN->Hide();
1178 0 : m_pPgeExampleWN->UpdateExample( rSet, pColMgr );
1179 0 : m_pPgeExampleWN->Show();
1180 :
1181 : }
1182 : else
1183 : {
1184 0 : m_pPgeExampleWN->Hide();
1185 0 : m_pFrmExampleWN->Show();
1186 :
1187 : // Size
1188 0 : const SwFmtFrmSize& rSize = (const SwFmtFrmSize&)rSet.Get(RES_FRM_SIZE);
1189 0 : const SvxBoxItem& rBox = (const SvxBoxItem&) rSet.Get(RES_BOX);
1190 :
1191 0 : long nDistance = rBox.GetDistance();
1192 0 : const sal_uInt16 nTotalWish = bFormat ? FRAME_FORMAT_WIDTH : sal_uInt16(rSize.GetWidth() - 2 * nDistance);
1193 :
1194 : // set maximum values of column width
1195 0 : SetPageWidth(nTotalWish);
1196 :
1197 0 : if(pColMgr->GetActualSize() != nTotalWish)
1198 : {
1199 0 : pColMgr->SetActualWidth(nTotalWish);
1200 0 : Init();
1201 : }
1202 : bool bPercent;
1203 : // only relative data in frame format
1204 0 : if ( bFormat || (rSize.GetWidthPercent() && rSize.GetWidthPercent() != 0xff) )
1205 : {
1206 : // set value for 100%
1207 0 : aEd1.SetRefValue(nTotalWish);
1208 0 : aEd2.SetRefValue(nTotalWish);
1209 0 : aEd3.SetRefValue(nTotalWish);
1210 0 : aDistEd1.SetRefValue(nTotalWish);
1211 0 : aDistEd2.SetRefValue(nTotalWish);
1212 :
1213 : // switch to %-view
1214 0 : bPercent = true;
1215 : }
1216 : else
1217 0 : bPercent = false;
1218 :
1219 0 : aEd1.ShowPercent(bPercent);
1220 0 : aEd2.ShowPercent(bPercent);
1221 0 : aEd3.ShowPercent(bPercent);
1222 0 : aDistEd1.ShowPercent(bPercent);
1223 0 : aDistEd2.ShowPercent(bPercent);
1224 0 : aDistEd1.SetMetricFieldMin(0);
1225 0 : aDistEd2.SetMetricFieldMin(0);
1226 : }
1227 0 : Update();
1228 0 : }
1229 :
1230 0 : int SwColumnPage::DeactivatePage(SfxItemSet *_pSet)
1231 : {
1232 0 : if(_pSet)
1233 0 : FillItemSet(_pSet);
1234 :
1235 0 : return sal_True;
1236 : }
1237 :
1238 0 : const sal_uInt16* SwColumnPage::GetRanges()
1239 : {
1240 0 : return aPageRg;
1241 : }
1242 :
1243 0 : IMPL_LINK( SwColumnPage, SetDefaultsHdl, ValueSet *, pVS )
1244 : {
1245 0 : const sal_uInt16 nItem = pVS->GetSelectItemId();
1246 0 : if( nItem < 4 )
1247 : {
1248 0 : m_pCLNrEdt->SetValue( nItem );
1249 0 : m_pAutoWidthBox->Check();
1250 0 : aDistEd1.SetPrcntValue(0);
1251 0 : ColModify(0);
1252 : }
1253 : else
1254 : {
1255 0 : bLockUpdate = true;
1256 0 : m_pCLNrEdt->SetValue( 2 );
1257 0 : m_pAutoWidthBox->Check(false);
1258 0 : aDistEd1.SetPrcntValue(0);
1259 0 : ColModify(0);
1260 : // now set the width ratio to 2 : 1 or 1 : 2 respectively
1261 0 : const long nSmall = static_cast< long >(pColMgr->GetActualSize() / 3);
1262 0 : if(nItem == 4)
1263 : {
1264 0 : aEd2.SetPrcntValue(aEd2.NormalizePercent(nSmall), FUNIT_TWIP);
1265 0 : pModifiedField = &aEd2;
1266 : }
1267 : else
1268 : {
1269 0 : aEd1.SetPrcntValue(aEd1.NormalizePercent(nSmall), FUNIT_TWIP);
1270 0 : pModifiedField = &aEd1;
1271 : }
1272 0 : bLockUpdate = false;
1273 0 : Timeout();
1274 :
1275 : }
1276 0 : return 0;
1277 : }
1278 :
1279 0 : void SwColumnPage::SetFrmMode(bool bMod)
1280 : {
1281 0 : bFrm = bMod;
1282 0 : }
1283 :
1284 0 : void SwColumnPage::SetInSection(bool bSet)
1285 : {
1286 0 : if(!SW_MOD()->GetCTLOptions().IsCTLFontEnabled())
1287 0 : return;
1288 :
1289 0 : m_pTextDirectionFT->Show(bSet);
1290 0 : m_pTextDirectionLB->Show(bSet);
1291 : }
1292 :
1293 0 : void ColumnValueSet::UserDraw( const UserDrawEvent& rUDEvt )
1294 : {
1295 0 : OutputDevice* pDev = rUDEvt.GetDevice();
1296 0 : const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
1297 :
1298 0 : Rectangle aRect = rUDEvt.GetRect();
1299 0 : const sal_uInt16 nItemId = rUDEvt.GetItemId();
1300 0 : long nRectWidth = aRect.GetWidth();
1301 0 : long nRectHeight = aRect.GetHeight();
1302 :
1303 0 : Point aBLPos = aRect.TopLeft();
1304 0 : Color aFillColor(pDev->GetFillColor());
1305 0 : Color aLineColor(pDev->GetLineColor());
1306 0 : pDev->SetFillColor(rStyleSettings.GetFieldColor());
1307 0 : pDev->SetLineColor(SwViewOption::GetFontColor());
1308 :
1309 0 : long nStep = std::abs(std::abs(nRectHeight * 95 /100) / 11);
1310 0 : long nTop = (nRectHeight - 11 * nStep ) / 2;
1311 0 : sal_uInt16 nCols = 0;
1312 : long nStarts[3];
1313 : long nEnds[3];
1314 0 : nStarts[0] = nRectWidth * 10 / 100;
1315 0 : switch( nItemId )
1316 : {
1317 : case 1:
1318 0 : nEnds[0] = nRectWidth * 9 / 10;
1319 0 : nCols = 1;
1320 0 : break;
1321 0 : case 2: nCols = 2;
1322 0 : nEnds[0] = nRectWidth * 45 / 100;
1323 0 : nStarts[1] = nEnds[0] + nStep;
1324 0 : nEnds[1] = nRectWidth * 9 / 10;
1325 0 : break;
1326 0 : case 3: nCols = 3;
1327 0 : nEnds[0] = nRectWidth * 30 / 100;
1328 0 : nStarts[1] = nEnds[0] + nStep;
1329 0 : nEnds[1] = nRectWidth * 63 / 100;
1330 0 : nStarts[2] = nEnds[1] + nStep;
1331 0 : nEnds[2] = nRectWidth * 9 / 10;
1332 0 : break;
1333 0 : case 4: nCols = 2;
1334 0 : nEnds[0] = nRectWidth * 63 / 100;
1335 0 : nStarts[1] = nEnds[0] + nStep;
1336 0 : nEnds[1] = nRectWidth * 9 / 10;
1337 0 : break;
1338 0 : case 5: nCols = 2;
1339 0 : nEnds[0] = nRectWidth * 30 / 100;
1340 0 : nStarts[1] = nEnds[0] + nStep;
1341 0 : nEnds[1] = nRectWidth * 9 / 10;
1342 0 : break;
1343 : }
1344 0 : for(sal_uInt16 j = 0; j < nCols; j++ )
1345 : {
1346 0 : Point aStart(aBLPos.X() + nStarts[j], 0);
1347 0 : Point aEnd(aBLPos.X() + nEnds[j], 0);
1348 0 : for( sal_uInt16 i = 0; i < 12; i ++)
1349 : {
1350 0 : aStart.Y() = aEnd.Y() = aBLPos.Y() + nTop + i * nStep;
1351 0 : pDev->DrawLine(aStart, aEnd);
1352 : }
1353 : }
1354 0 : pDev->SetFillColor(aFillColor);
1355 0 : pDev->SetLineColor(aLineColor);
1356 0 : }
1357 :
1358 0 : void ColumnValueSet::DataChanged( const DataChangedEvent& rDCEvt )
1359 : {
1360 0 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
1361 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
1362 : {
1363 0 : Format();
1364 : }
1365 0 : ValueSet::DataChanged( rDCEvt );
1366 0 : }
1367 :
1368 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeColumnValueSet(vcl::Window *pParent, VclBuilder::stringmap &)
1369 : {
1370 0 : return new ColumnValueSet(pParent);
1371 0 : }
1372 :
1373 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|