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