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 <sal/config.h>
21 :
22 : #include <cstdlib>
23 :
24 : #include "PagePropertyPanel.hxx"
25 : #include "PagePropertyPanel.hrc"
26 :
27 : #include "PropertyPanel.hrc"
28 :
29 : #include <svx/sidebar/PopupContainer.hxx>
30 : #include "PageOrientationControl.hxx"
31 : #include "PageMarginControl.hxx"
32 : #include "PageSizeControl.hxx"
33 : #include "PageColumnControl.hxx"
34 :
35 : #include <swtypes.hxx>
36 : #include <cmdid.h>
37 :
38 : #include <svl/intitem.hxx>
39 : #include <editeng/sizeitem.hxx>
40 : #include <editeng/paperinf.hxx>
41 : #include <svx/svxids.hrc>
42 : #include <svx/dlgutil.hxx>
43 : #include <svx/rulritem.hxx>
44 :
45 : #include <sfx2/sidebar/ControlFactory.hxx>
46 : #include <sfx2/dispatch.hxx>
47 : #include <sfx2/bindings.hxx>
48 : #include <sfx2/viewsh.hxx>
49 : #include <sfx2/objsh.hxx>
50 :
51 : #include <boost/bind.hpp>
52 :
53 : #include <com/sun/star/frame/XController.hpp>
54 : #include <com/sun/star/frame/XModel.hpp>
55 : #include <com/sun/star/document/XUndoManagerSupplier.hpp>
56 :
57 : const char UNO_ORIENTATION[] = ".uno:Orientation";
58 : const char UNO_MARGIN[] = ".uno:Margin";
59 : const char UNO_SIZE[] = ".uno:Size";
60 : const char UNO_COLUMN[] = ".uno:Column";
61 :
62 : namespace {
63 742 : const css::uno::Reference< css::document::XUndoManager > getUndoManager( const css::uno::Reference< css::frame::XFrame >& rxFrame )
64 : {
65 742 : const css::uno::Reference< css::frame::XController >& xController = rxFrame->getController();
66 742 : if ( xController.is() )
67 : {
68 742 : const css::uno::Reference< css::frame::XModel >& xModel = xController->getModel();
69 742 : if ( xModel.is() )
70 : {
71 742 : const css::uno::Reference< css::document::XUndoManagerSupplier > xSuppUndo( xModel, css::uno::UNO_QUERY_THROW );
72 742 : if ( xSuppUndo.is() )
73 : {
74 742 : const css::uno::Reference< css::document::XUndoManager > xUndoManager( xSuppUndo->getUndoManager(), css::uno::UNO_QUERY_THROW );
75 742 : return xUndoManager;
76 0 : }
77 0 : }
78 : }
79 :
80 0 : return css::uno::Reference< css::document::XUndoManager > ();
81 : }
82 : }
83 :
84 : namespace sw { namespace sidebar {
85 :
86 742 : PagePropertyPanel* PagePropertyPanel::Create (
87 : vcl::Window* pParent,
88 : const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame>& rxFrame,
89 : SfxBindings* pBindings)
90 : {
91 742 : if (pParent == NULL)
92 0 : throw ::com::sun::star::lang::IllegalArgumentException("no parent Window given to PagePropertyPanel::Create", NULL, 0);
93 742 : if ( ! rxFrame.is())
94 0 : throw ::com::sun::star::lang::IllegalArgumentException("no XFrame given to PagePropertyPanel::Create", NULL, 1);
95 742 : if (pBindings == NULL)
96 0 : throw ::com::sun::star::lang::IllegalArgumentException("no SfxBindings given to PagePropertyPanel::Create", NULL, 2);
97 :
98 : return new PagePropertyPanel(
99 : pParent,
100 : rxFrame,
101 742 : pBindings);
102 : }
103 :
104 742 : PagePropertyPanel::PagePropertyPanel(
105 : vcl::Window* pParent,
106 : const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame>& rxFrame,
107 : SfxBindings* pBindings)
108 : : PanelLayout(pParent, "PagePropertyPanel", "modules/swriter/ui/sidebarpage.ui", rxFrame)
109 : , mpBindings(pBindings)
110 :
111 : // image resources
112 : , maImgSize (NULL)
113 : , maImgSize_L (NULL)
114 : , mImgPortrait (SW_RES(IMG_PAGE_PORTRAIT))
115 : , mImgLandscape (SW_RES(IMG_PAGE_LANDSCAPE))
116 : , mImgNarrow (SW_RES(IMG_PAGE_NARROW))
117 : , mImgNormal (SW_RES(IMG_PAGE_NORMAL))
118 : , mImgWide (SW_RES(IMG_PAGE_WIDE))
119 : , mImgMirrored (SW_RES(IMG_PAGE_MIRRORED))
120 : , mImgMarginCustom (SW_RES(IMG_PAGE_MARGIN_CUSTOM))
121 : , mImgNarrow_L (SW_RES(IMG_PAGE_NARROW_L))
122 : , mImgNormal_L (SW_RES(IMG_PAGE_NORMAL_L))
123 : , mImgWide_L (SW_RES(IMG_PAGE_WIDE_L))
124 : , mImgMirrored_L (SW_RES(IMG_PAGE_MIRRORED_L))
125 : , mImgMarginCustom_L (SW_RES(IMG_PAGE_MARGIN_CUSTOM_L))
126 : , mImgA3 (SW_RES(IMG_PAGE_A3))
127 : , mImgA4 (SW_RES(IMG_PAGE_A4))
128 : , mImgA5 (SW_RES(IMG_PAGE_A5))
129 : , mImgB4 (SW_RES(IMG_PAGE_B4))
130 : , mImgB5 (SW_RES(IMG_PAGE_B5))
131 : , mImgC5 (SW_RES(IMG_PAGE_C5))
132 : , mImgLetter (SW_RES(IMG_PAGE_LETTER))
133 : , mImgLegal (SW_RES(IMG_PAGE_LEGAL))
134 : , mImgSizeNone (SW_RES(IMG_PAGE_SIZE_NONE))
135 : , mImgA3_L (SW_RES(IMG_PAGE_A3_L))
136 : , mImgA4_L (SW_RES(IMG_PAGE_A4_L))
137 : , mImgA5_L (SW_RES(IMG_PAGE_A5_L))
138 : , mImgB4_L (SW_RES(IMG_PAGE_B4_L))
139 : , mImgB5_L (SW_RES(IMG_PAGE_B5_L))
140 : , mImgC5_L (SW_RES(IMG_PAGE_C5_L))
141 : , mImgLetter_L (SW_RES(IMG_PAGE_LETTER_L))
142 : , mImgLegal_L (SW_RES(IMG_PAGE_LEGAL_L))
143 : , mImgSizeNone_L (SW_RES(IMG_PAGE_SIZE_NONE_L))
144 : , mImgColumn1 (SW_RES(IMG_PAGE_COLUMN_1))
145 : , mImgColumn2 (SW_RES(IMG_PAGE_COLUMN_2))
146 : , mImgColumn3 (SW_RES(IMG_PAGE_COLUMN_3))
147 : , mImgLeft (SW_RES(IMG_PAGE_COLUMN_LEFT))
148 : , mImgRight (SW_RES(IMG_PAGE_COLUMN_RIGHT))
149 : , mImgColumnNone (SW_RES(IMG_PAGE_COLUMN_NONE))
150 : , mImgColumn1_L (SW_RES(IMG_PAGE_COLUMN_1_L))
151 : , mImgColumn2_L (SW_RES(IMG_PAGE_COLUMN_2_L))
152 : , mImgColumn3_L (SW_RES(IMG_PAGE_COLUMN_3_L))
153 : , mImgLeft_L (SW_RES(IMG_PAGE_COLUMN_LEFT_L))
154 : , mImgRight_L (SW_RES(IMG_PAGE_COLUMN_RIGHT_L))
155 : , mImgColumnNone_L (SW_RES(IMG_PAGE_COLUMN_NONE_L))
156 :
157 742 : , mpPageItem( new SvxPageItem(SID_ATTR_PAGE) )
158 742 : , mpPageLRMarginItem( new SvxLongLRSpaceItem( 0, 0, SID_ATTR_PAGE_LRSPACE ) )
159 742 : , mpPageULMarginItem( new SvxLongULSpaceItem( 0, 0, SID_ATTR_PAGE_ULSPACE ) )
160 742 : , mpPageSizeItem( new SvxSizeItem(SID_ATTR_PAGE_SIZE) )
161 : , mePaper( PAPER_USER )
162 742 : , mpPageColumnTypeItem( new SfxInt16Item(SID_ATTR_PAGE_COLUMN) )
163 :
164 : , meFUnit()
165 : , meUnit()
166 :
167 : , m_aSwPagePgULControl(SID_ATTR_PAGE_ULSPACE, *pBindings, *this)
168 : , m_aSwPagePgLRControl(SID_ATTR_PAGE_LRSPACE, *pBindings, *this)
169 : , m_aSwPagePgSizeControl(SID_ATTR_PAGE_SIZE, *pBindings, *this)
170 : , m_aSwPagePgControl(SID_ATTR_PAGE, *pBindings, *this)
171 : , m_aSwPageColControl(SID_ATTR_PAGE_COLUMN, *pBindings, *this)
172 : , m_aSwPagePgMetricControl(SID_ATTR_METRIC, *pBindings, *this)
173 :
174 : , maOrientationPopup( this,
175 : ::boost::bind( &PagePropertyPanel::CreatePageOrientationControl, this, _1 ),
176 : OUString("Page orientation") )
177 : , maMarginPopup( this,
178 : ::boost::bind( &PagePropertyPanel::CreatePageMarginControl, this, _1 ),
179 : OUString("Page margins") )
180 : , maSizePopup( this,
181 : ::boost::bind( &PagePropertyPanel::CreatePageSizeControl, this, _1 ),
182 : OUString("Page size") )
183 : , maColumnPopup( this,
184 : ::boost::bind( &PagePropertyPanel::CreatePageColumnControl, this, _1 ),
185 : OUString("Page columns") )
186 :
187 : , mxUndoManager( getUndoManager( rxFrame ) )
188 :
189 4452 : , mbInvalidateSIDAttrPageOnSIDAttrPageSizeNotify( false )
190 : {
191 : // visible controls
192 742 : get(mpToolBoxOrientation, "selectorientation");
193 742 : get(mpToolBoxMargin, "selectmargin");
194 742 : get(mpToolBoxSize, "selectsize");
195 742 : get(mpToolBoxColumn, "selectcolumn");
196 :
197 742 : Initialize();
198 742 : mbInvalidateSIDAttrPageOnSIDAttrPageSizeNotify = true;
199 742 : }
200 :
201 2226 : PagePropertyPanel::~PagePropertyPanel()
202 : {
203 742 : delete[] maImgSize;
204 742 : delete[] maImgSize_L;
205 1484 : }
206 :
207 742 : void PagePropertyPanel::Initialize()
208 : {
209 : // popup for page orientation
210 742 : const sal_uInt16 nIdOrientation = mpToolBoxOrientation->GetItemId(UNO_ORIENTATION);
211 742 : Link aLink = LINK( this, PagePropertyPanel, ClickOrientationHdl );
212 742 : mpToolBoxOrientation->SetDropdownClickHdl( aLink );
213 742 : mpToolBoxOrientation->SetSelectHdl( aLink );
214 742 : mpToolBoxOrientation->SetItemImage( nIdOrientation, mImgPortrait);
215 742 : mpToolBoxOrientation->SetItemBits( nIdOrientation, mpToolBoxOrientation->GetItemBits( nIdOrientation ) | ToolBoxItemBits::DROPDOWNONLY );
216 :
217 : // popup for page margins
218 742 : const sal_uInt16 nIdMargin = mpToolBoxMargin->GetItemId(UNO_MARGIN);
219 742 : aLink = LINK( this, PagePropertyPanel, ClickMarginHdl );
220 742 : mpToolBoxMargin->SetDropdownClickHdl( aLink );
221 742 : mpToolBoxMargin->SetSelectHdl( aLink );
222 742 : mpToolBoxMargin->SetItemImage(nIdMargin, mImgNormal);
223 742 : mpToolBoxMargin->SetItemBits( nIdMargin, mpToolBoxMargin->GetItemBits( nIdMargin ) | ToolBoxItemBits::DROPDOWNONLY );
224 :
225 : // popup for page size
226 742 : const sal_uInt16 nIdSize = mpToolBoxSize->GetItemId(UNO_SIZE);
227 742 : aLink = LINK( this, PagePropertyPanel, ClickSizeHdl );
228 742 : mpToolBoxSize->SetDropdownClickHdl( aLink );
229 742 : mpToolBoxSize->SetSelectHdl( aLink );
230 742 : mpToolBoxSize->SetItemImage(nIdSize, mImgLetter);
231 742 : mpToolBoxSize->SetItemBits( nIdSize, mpToolBoxSize->GetItemBits( nIdSize ) | ToolBoxItemBits::DROPDOWNONLY );
232 742 : maImgSize = new Image[8];
233 742 : maImgSize[0] = mImgA3;
234 742 : maImgSize[1] = mImgA4;
235 742 : maImgSize[2] = mImgA5;
236 742 : maImgSize[3] = mImgB4;
237 742 : maImgSize[4] = mImgB5;
238 742 : maImgSize[5] = mImgC5;
239 742 : maImgSize[6] = mImgLetter;
240 742 : maImgSize[7] = mImgLegal;
241 742 : maImgSize_L = new Image[8];
242 742 : maImgSize_L[0] = mImgA3_L;
243 742 : maImgSize_L[1] = mImgA4_L;
244 742 : maImgSize_L[2] = mImgA5_L;
245 742 : maImgSize_L[3] = mImgB4_L;
246 742 : maImgSize_L[4] = mImgB5_L;
247 742 : maImgSize_L[5] = mImgC5_L;
248 742 : maImgSize_L[6] = mImgLetter_L;
249 742 : maImgSize_L[7] = mImgLegal_L;
250 :
251 : // popup for page column property
252 742 : const sal_uInt16 nIdColumn = mpToolBoxColumn->GetItemId(UNO_COLUMN);
253 742 : aLink = LINK( this, PagePropertyPanel, ClickColumnHdl );
254 742 : mpToolBoxColumn->SetDropdownClickHdl( aLink );
255 742 : mpToolBoxColumn->SetSelectHdl( aLink );
256 742 : mpToolBoxColumn->SetItemImage(nIdColumn, mImgColumn1);
257 742 : mpToolBoxColumn->SetItemBits( nIdColumn, mpToolBoxColumn->GetItemBits( nIdColumn ) | ToolBoxItemBits::DROPDOWNONLY );
258 :
259 742 : meFUnit = GetModuleFieldUnit();
260 742 : meUnit = m_aSwPagePgSizeControl.GetCoreMetric();
261 :
262 : // 'pull' for page style's attribute values
263 742 : mpBindings->Update( SID_ATTR_PAGE_LRSPACE );
264 742 : mpBindings->Update( SID_ATTR_PAGE_ULSPACE );
265 742 : mpBindings->Update( SID_ATTR_PAGE );
266 742 : mpBindings->Update( SID_ATTR_PAGE_SIZE );
267 742 : }
268 :
269 0 : ::svx::sidebar::PopupControl* PagePropertyPanel::CreatePageOrientationControl( ::svx::sidebar::PopupContainer* pParent )
270 : {
271 0 : return new PageOrientationControl( pParent, *this , mpPageItem->IsLandscape() );
272 : }
273 :
274 0 : IMPL_LINK( PagePropertyPanel, ClickOrientationHdl, ToolBox*, pToolBox )
275 : {
276 0 : maOrientationPopup.Show( *pToolBox );
277 :
278 0 : return 0L;
279 : }
280 :
281 0 : void PagePropertyPanel::ExecuteOrientationChange( const bool bLandscape )
282 : {
283 0 : StartUndo();
284 :
285 : {
286 : // set new page orientation
287 0 : mpPageItem->SetLandscape( bLandscape );
288 :
289 : // swap the width and height of the page size
290 0 : const long nRotatedWidth = mpPageSizeItem->GetSize().Height();
291 0 : const long nRotatedHeight = mpPageSizeItem->GetSize().Width();
292 0 : mpPageSizeItem->SetSize(Size(nRotatedWidth, nRotatedHeight));
293 :
294 : // apply changed attributes
295 0 : GetBindings()->GetDispatcher()->Execute( SID_ATTR_PAGE_SIZE, SfxCallMode::RECORD, mpPageSizeItem.get(), mpPageItem.get(), 0L );
296 : }
297 :
298 : // check, if margin values still fit to the changed page size.
299 : // if not, adjust margin values
300 : {
301 0 : const long nML = mpPageLRMarginItem->GetLeft();
302 0 : const long nMR = mpPageLRMarginItem->GetRight();
303 0 : const long nTmpPW = nML + nMR + MINBODY;
304 :
305 0 : const long nPW = mpPageSizeItem->GetSize().Width();
306 :
307 0 : if ( nTmpPW > nPW )
308 : {
309 0 : if ( nML <= nMR )
310 : {
311 0 : ExecuteMarginLRChange( mpPageLRMarginItem->GetLeft(), nMR - (nTmpPW - nPW ) );
312 : }
313 : else
314 : {
315 0 : ExecuteMarginLRChange( nML - (nTmpPW - nPW ), mpPageLRMarginItem->GetRight() );
316 : }
317 : }
318 :
319 0 : const long nMT = mpPageULMarginItem->GetUpper();
320 0 : const long nMB = mpPageULMarginItem->GetLower();
321 0 : const long nTmpPH = nMT + nMB + MINBODY;
322 :
323 0 : const long nPH = mpPageSizeItem->GetSize().Height();
324 :
325 0 : if ( nTmpPH > nPH )
326 : {
327 0 : if ( nMT <= nMB )
328 : {
329 0 : ExecuteMarginULChange( mpPageULMarginItem->GetUpper(), nMB - ( nTmpPH - nPH ) );
330 : }
331 : else
332 : {
333 0 : ExecuteMarginULChange( nMT - ( nTmpPH - nPH ), mpPageULMarginItem->GetLower() );
334 : }
335 : }
336 : }
337 :
338 0 : EndUndo();
339 0 : }
340 :
341 0 : void PagePropertyPanel::ClosePageOrientationPopup()
342 : {
343 0 : maOrientationPopup.Hide();
344 0 : }
345 :
346 0 : ::svx::sidebar::PopupControl* PagePropertyPanel::CreatePageMarginControl( ::svx::sidebar::PopupContainer* pParent )
347 : {
348 : return new PageMarginControl(
349 : pParent,
350 : *this,
351 0 : *mpPageLRMarginItem.get(),
352 0 : *mpPageULMarginItem.get(),
353 0 : mpPageItem->GetPageUsage() == SVX_PAGE_MIRROR,
354 0 : mpPageSizeItem->GetSize(),
355 0 : mpPageItem->IsLandscape(),
356 : meFUnit,
357 0 : meUnit );
358 : }
359 :
360 0 : void PagePropertyPanel::ExecuteMarginLRChange(
361 : const long nPageLeftMargin,
362 : const long nPageRightMargin )
363 : {
364 0 : mpPageLRMarginItem->SetLeft( nPageLeftMargin );
365 0 : mpPageLRMarginItem->SetRight( nPageRightMargin );
366 0 : GetBindings()->GetDispatcher()->Execute( SID_ATTR_PAGE_LRSPACE, SfxCallMode::RECORD, mpPageLRMarginItem.get(), 0L );
367 0 : }
368 :
369 0 : void PagePropertyPanel::ExecuteMarginULChange(
370 : const long nPageTopMargin,
371 : const long nPageBottomMargin )
372 : {
373 0 : mpPageULMarginItem->SetUpper( nPageTopMargin );
374 0 : mpPageULMarginItem->SetLower( nPageBottomMargin );
375 0 : GetBindings()->GetDispatcher()->Execute( SID_ATTR_PAGE_ULSPACE, SfxCallMode::RECORD, mpPageULMarginItem.get(), 0L );
376 0 : }
377 :
378 0 : void PagePropertyPanel::ExecutePageLayoutChange( const bool bMirrored )
379 : {
380 0 : mpPageItem->SetPageUsage( bMirrored ? SVX_PAGE_MIRROR : SVX_PAGE_ALL );
381 0 : GetBindings()->GetDispatcher()->Execute( SID_ATTR_PAGE, SfxCallMode::RECORD, mpPageItem.get(), 0L );
382 0 : }
383 :
384 0 : IMPL_LINK( PagePropertyPanel, ClickMarginHdl, ToolBox*, pToolBox )
385 : {
386 0 : maMarginPopup.Show( *pToolBox );
387 :
388 0 : return 0L;
389 : }
390 :
391 0 : void PagePropertyPanel::ClosePageMarginPopup()
392 : {
393 0 : maMarginPopup.Hide();
394 0 : }
395 :
396 0 : ::svx::sidebar::PopupControl* PagePropertyPanel::CreatePageSizeControl( ::svx::sidebar::PopupContainer* pParent )
397 : {
398 : return new PageSizeControl(
399 : pParent,
400 : *this,
401 : mePaper,
402 0 : mpPageItem->IsLandscape(),
403 0 : meFUnit );
404 : }
405 :
406 0 : void PagePropertyPanel::ExecuteSizeChange( const Paper ePaper )
407 : {
408 0 : Size aPageSize = SvxPaperInfo::GetPaperSize( ePaper, (MapUnit)(meUnit) );
409 0 : if ( mpPageItem->IsLandscape() )
410 : {
411 0 : Swap( aPageSize );
412 : }
413 0 : mpPageSizeItem->SetSize( aPageSize );
414 :
415 0 : mpBindings->GetDispatcher()->Execute(SID_ATTR_PAGE_SIZE, SfxCallMode::RECORD, mpPageSizeItem.get(), 0L );
416 0 : }
417 :
418 0 : IMPL_LINK( PagePropertyPanel, ClickSizeHdl, ToolBox*, pToolBox )
419 : {
420 0 : maSizePopup.Show( *pToolBox );
421 :
422 0 : return 0L;
423 : }
424 :
425 0 : void PagePropertyPanel::ClosePageSizePopup()
426 : {
427 0 : maSizePopup.Hide();
428 0 : }
429 :
430 0 : ::svx::sidebar::PopupControl* PagePropertyPanel::CreatePageColumnControl( ::svx::sidebar::PopupContainer* pParent )
431 : {
432 : return new PageColumnControl(
433 : pParent,
434 : *this,
435 0 : mpPageColumnTypeItem->GetValue(),
436 0 : mpPageItem->IsLandscape() );
437 : }
438 :
439 0 : void PagePropertyPanel::ExecuteColumnChange( const sal_uInt16 nColumnType )
440 : {
441 0 : mpPageColumnTypeItem->SetValue( nColumnType );
442 0 : mpBindings->GetDispatcher()->Execute(SID_ATTR_PAGE_COLUMN, SfxCallMode::RECORD, mpPageColumnTypeItem.get(), 0L );
443 0 : }
444 :
445 0 : IMPL_LINK( PagePropertyPanel, ClickColumnHdl, ToolBox*, pToolBox )
446 : {
447 0 : maColumnPopup.Show( *pToolBox );
448 :
449 0 : return 0L;
450 : }
451 :
452 0 : void PagePropertyPanel::ClosePageColumnPopup()
453 : {
454 0 : maColumnPopup.Hide();
455 0 : }
456 :
457 3317 : void PagePropertyPanel::NotifyItemUpdate(
458 : const sal_uInt16 nSId,
459 : const SfxItemState eState,
460 : const SfxPoolItem* pState,
461 : const bool bIsEnabled)
462 : {
463 : (void)bIsEnabled;
464 :
465 3317 : switch( nSId )
466 : {
467 : case SID_ATTR_PAGE_COLUMN:
468 : {
469 368 : if ( eState >= SfxItemState::DEFAULT &&
470 368 : pState && pState->ISA(SfxInt16Item) )
471 : {
472 184 : mpPageColumnTypeItem.reset( static_cast<SfxInt16Item*>(pState->Clone()) );
473 184 : ChangeColumnImage( mpPageColumnTypeItem->GetValue() );
474 : }
475 : }
476 184 : break;
477 : case SID_ATTR_PAGE_LRSPACE:
478 1484 : if ( eState >= SfxItemState::DEFAULT &&
479 1484 : pState && pState->ISA(SvxLongLRSpaceItem) )
480 : {
481 742 : mpPageLRMarginItem.reset( static_cast<SvxLongLRSpaceItem*>(pState->Clone()) );
482 742 : ChangeMarginImage();
483 : }
484 742 : break;
485 :
486 : case SID_ATTR_PAGE_ULSPACE:
487 1484 : if ( eState >= SfxItemState::DEFAULT &&
488 1484 : pState && pState->ISA(SvxLongULSpaceItem) )
489 : {
490 742 : mpPageULMarginItem.reset( static_cast<SvxLongULSpaceItem*>(pState->Clone()) );
491 742 : ChangeMarginImage();
492 : }
493 742 : break;
494 :
495 : case SID_ATTR_PAGE:
496 1484 : if ( eState >= SfxItemState::DEFAULT &&
497 1484 : pState && pState->ISA(SvxPageItem) )
498 : {
499 742 : const sal_uInt16 nIdOrientation = mpToolBoxOrientation->GetItemId(UNO_ORIENTATION);
500 742 : mpPageItem.reset( static_cast<SvxPageItem*>(pState->Clone()) );
501 742 : if ( mpPageItem->IsLandscape() )
502 : {
503 0 : mpToolBoxOrientation->SetItemImage(nIdOrientation, mImgLandscape);
504 : }
505 : else
506 : {
507 742 : mpToolBoxOrientation->SetItemImage(nIdOrientation, mImgPortrait);
508 : }
509 742 : ChangeMarginImage();
510 742 : ChangeSizeImage();
511 742 : ChangeColumnImage( mpPageColumnTypeItem->GetValue() );
512 : }
513 742 : break;
514 :
515 : case SID_ATTR_PAGE_SIZE:
516 742 : if ( mbInvalidateSIDAttrPageOnSIDAttrPageSizeNotify )
517 : {
518 0 : mpBindings->Invalidate( SID_ATTR_PAGE, true, false );
519 : }
520 1484 : if ( eState >= SfxItemState::DEFAULT &&
521 1484 : pState && pState->ISA(SvxSizeItem) )
522 : {
523 742 : mpPageSizeItem.reset( static_cast<SvxSizeItem*>(pState->Clone()) );
524 742 : ChangeSizeImage();
525 : }
526 742 : break;
527 : case SID_ATTR_METRIC:
528 165 : MetricState( eState, pState );
529 165 : break;
530 : }
531 3317 : }
532 :
533 165 : void PagePropertyPanel::MetricState( SfxItemState eState, const SfxPoolItem* pState )
534 : {
535 165 : meFUnit = FUNIT_NONE;
536 165 : if ( pState && eState >= SfxItemState::DEFAULT )
537 : {
538 165 : meFUnit = (FieldUnit)( (const SfxUInt16Item*)pState )->GetValue();
539 : }
540 : else
541 : {
542 0 : SfxViewFrame* pFrame = SfxViewFrame::Current();
543 0 : SfxObjectShell* pSh = NULL;
544 0 : if ( pFrame )
545 0 : pSh = pFrame->GetObjectShell();
546 0 : if ( pSh )
547 : {
548 0 : SfxModule* pModule = pSh->GetModule();
549 0 : if ( pModule )
550 : {
551 0 : const SfxPoolItem* pItem = pModule->GetItem( SID_ATTR_METRIC );
552 0 : if ( pItem )
553 0 : meFUnit = (FieldUnit)( (SfxUInt16Item*)pItem )->GetValue();
554 : }
555 : else
556 : {
557 : SAL_WARN("sw.ui", "<PagePropertyPanel::MetricState(..)>: no module found");
558 : }
559 : }
560 : }
561 165 : }
562 :
563 2226 : void PagePropertyPanel::ChangeMarginImage()
564 : {
565 6678 : if ( mpPageLRMarginItem.get() == 0 ||
566 4452 : mpPageULMarginItem.get() == 0 ||
567 2226 : mpPageItem.get() == 0 )
568 : {
569 2226 : return;
570 : }
571 :
572 2226 : const long cTolerance = 5;
573 2226 : const sal_uInt16 nIdMargin = mpToolBoxMargin->GetItemId(UNO_MARGIN);
574 :
575 4452 : if( std::abs(mpPageLRMarginItem->GetLeft() - SWPAGE_NARROW_VALUE) <= cTolerance &&
576 0 : std::abs(mpPageLRMarginItem->GetRight() - SWPAGE_NARROW_VALUE) <= cTolerance &&
577 0 : std::abs(mpPageULMarginItem->GetUpper() - SWPAGE_NARROW_VALUE) <= cTolerance &&
578 2226 : std::abs(mpPageULMarginItem->GetLower() - SWPAGE_NARROW_VALUE) <= cTolerance &&
579 0 : mpPageItem->GetPageUsage() != SVX_PAGE_MIRROR )
580 0 : mpToolBoxMargin->SetItemImage( nIdMargin, mpPageItem->IsLandscape() ? mImgNarrow_L : mImgNarrow );
581 :
582 6672 : else if( std::abs(mpPageLRMarginItem->GetLeft() - SWPAGE_NORMAL_VALUE) <= cTolerance &&
583 4440 : std::abs(mpPageLRMarginItem->GetRight() - SWPAGE_NORMAL_VALUE) <= cTolerance &&
584 3700 : std::abs(mpPageULMarginItem->GetUpper() - SWPAGE_NORMAL_VALUE) <= cTolerance &&
585 5186 : std::abs(mpPageULMarginItem->GetLower() - SWPAGE_NORMAL_VALUE) <= cTolerance &&
586 1480 : mpPageItem->GetPageUsage() != SVX_PAGE_MIRROR )
587 1480 : mpToolBoxMargin->SetItemImage( nIdMargin, mpPageItem->IsLandscape() ? mImgNormal_L : mImgNormal );
588 :
589 1492 : else if( std::abs(mpPageLRMarginItem->GetLeft() - SWPAGE_WIDE_VALUE2) <= cTolerance &&
590 0 : std::abs(mpPageLRMarginItem->GetRight() - SWPAGE_WIDE_VALUE2) <= cTolerance &&
591 0 : std::abs(mpPageULMarginItem->GetUpper() - SWPAGE_WIDE_VALUE1) <= cTolerance &&
592 746 : std::abs(mpPageULMarginItem->GetLower() - SWPAGE_WIDE_VALUE1) <= cTolerance &&
593 0 : mpPageItem->GetPageUsage() != SVX_PAGE_MIRROR )
594 0 : mpToolBoxMargin->SetItemImage( nIdMargin, mpPageItem->IsLandscape() ? mImgWide_L : mImgWide );
595 :
596 1492 : else if( std::abs(mpPageLRMarginItem->GetLeft() - SWPAGE_WIDE_VALUE3) <= cTolerance &&
597 0 : std::abs(mpPageLRMarginItem->GetRight() - SWPAGE_WIDE_VALUE1) <= cTolerance &&
598 0 : std::abs(mpPageULMarginItem->GetUpper() - SWPAGE_WIDE_VALUE1) <= cTolerance &&
599 746 : std::abs(mpPageULMarginItem->GetLower() - SWPAGE_WIDE_VALUE1) <= cTolerance &&
600 0 : mpPageItem->GetPageUsage() == SVX_PAGE_MIRROR )
601 0 : mpToolBoxMargin->SetItemImage( nIdMargin, mpPageItem->IsLandscape() ? mImgMirrored_L : mImgMirrored );
602 :
603 : else
604 746 : mpToolBoxMargin->SetItemImage( nIdMargin, mpPageItem->IsLandscape() ? mImgMarginCustom_L : mImgMarginCustom );
605 : }
606 :
607 1484 : void PagePropertyPanel::ChangeSizeImage()
608 : {
609 2968 : if ( mpPageSizeItem.get() == 0 ||
610 1484 : mpPageItem.get() == 0 )
611 : {
612 1484 : return;
613 : }
614 :
615 1484 : Size aTmpPaperSize = mpPageSizeItem->GetSize();
616 1484 : if ( mpPageItem->IsLandscape() )
617 : {
618 0 : Swap( aTmpPaperSize ); // Swap(..) defined in editeng/paperinf.hxx
619 : }
620 :
621 1484 : mePaper = SvxPaperInfo::GetSvxPaper( aTmpPaperSize, static_cast<MapUnit>(meUnit), true );
622 :
623 1484 : sal_uInt16 nImageIdx = 0;
624 1484 : switch ( mePaper )
625 : {
626 : case PAPER_A3:
627 0 : nImageIdx = 1;
628 0 : break;
629 : case PAPER_A4:
630 740 : nImageIdx = 2;
631 740 : break;
632 : case PAPER_A5:
633 0 : nImageIdx = 3;
634 0 : break;
635 : case PAPER_B4_ISO:
636 0 : nImageIdx = 4;
637 0 : break;
638 : case PAPER_B5_ISO:
639 0 : nImageIdx = 5;
640 0 : break;
641 : case PAPER_ENV_C5:
642 0 : nImageIdx = 6;
643 0 : break;
644 : case PAPER_LETTER:
645 2 : nImageIdx = 7;
646 2 : break;
647 : case PAPER_LEGAL:
648 0 : nImageIdx = 8;
649 0 : break;
650 : default:
651 742 : nImageIdx = 0;
652 742 : mePaper = PAPER_USER;
653 742 : break;
654 : }
655 :
656 1484 : const sal_uInt16 nIdSize = mpToolBoxSize->GetItemId(UNO_SIZE);
657 :
658 1484 : if ( nImageIdx == 0 )
659 : {
660 : mpToolBoxSize->SetItemImage( nIdSize,
661 742 : ( mpPageItem->IsLandscape() ? mImgSizeNone_L : mImgSizeNone ) );
662 : }
663 : else
664 : {
665 : mpToolBoxSize->SetItemImage( nIdSize,
666 742 : ( mpPageItem->IsLandscape() ? maImgSize_L[nImageIdx-1] : maImgSize[nImageIdx-1] ) );
667 : }
668 : }
669 :
670 926 : void PagePropertyPanel::ChangeColumnImage( const sal_uInt16 nColumnType )
671 : {
672 926 : if ( mpPageItem.get() == 0 )
673 : {
674 926 : return;
675 : }
676 :
677 926 : const sal_uInt16 nIdColumn = mpToolBoxColumn->GetItemId(UNO_COLUMN);
678 926 : if ( !mpPageItem->IsLandscape() )
679 : {
680 926 : switch( nColumnType )
681 : {
682 : case 1:
683 184 : mpToolBoxColumn->SetItemImage(nIdColumn, mImgColumn1);
684 184 : break;
685 : case 2:
686 0 : mpToolBoxColumn->SetItemImage(nIdColumn, mImgColumn2);
687 0 : break;
688 : case 3:
689 0 : mpToolBoxColumn->SetItemImage(nIdColumn, mImgColumn3);
690 0 : break;
691 : case 4:
692 0 : mpToolBoxColumn->SetItemImage(nIdColumn, mImgLeft);
693 0 : break;
694 : case 5:
695 0 : mpToolBoxColumn->SetItemImage(nIdColumn, mImgRight);
696 0 : break;
697 : default:
698 742 : mpToolBoxColumn->SetItemImage(nIdColumn, mImgColumnNone);
699 : }
700 : }
701 : else
702 : {
703 0 : switch( nColumnType )
704 : {
705 : case 1:
706 0 : mpToolBoxColumn->SetItemImage(nIdColumn, mImgColumn1_L);
707 0 : break;
708 : case 2:
709 0 : mpToolBoxColumn->SetItemImage(nIdColumn, mImgColumn2_L);
710 0 : break;
711 : case 3:
712 0 : mpToolBoxColumn->SetItemImage(nIdColumn, mImgColumn3_L);
713 0 : break;
714 : case 4:
715 0 : mpToolBoxColumn->SetItemImage(nIdColumn, mImgLeft_L);
716 0 : break;
717 : case 5:
718 0 : mpToolBoxColumn->SetItemImage(nIdColumn, mImgRight_L);
719 0 : break;
720 : default:
721 0 : mpToolBoxColumn->SetItemImage(nIdColumn, mImgColumnNone_L);
722 : }
723 : }
724 : }
725 :
726 0 : void PagePropertyPanel::StartUndo()
727 : {
728 0 : if ( mxUndoManager.is() )
729 : {
730 0 : mxUndoManager->enterUndoContext( OUString("") );
731 : }
732 0 : }
733 :
734 0 : void PagePropertyPanel::EndUndo()
735 : {
736 0 : if ( mxUndoManager.is() )
737 : {
738 0 : mxUndoManager->leaveUndoContext();
739 : }
740 0 : }
741 :
742 270 : } } // end of namespace ::sw::sidebar
743 :
744 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|