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