blob: 986da7fe9069ac9548843ab92d57a6c16902dd21 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include "precompiled_sw.hxx"
#include "PagePropertyPanel.hxx"
#include "PagePropertyPanel.hrc"
#include "PropertyPanel.hrc"
#include <svx/sidebar/PopupContainer.hxx>
#include "PageOrientationControl.hxx"
#include "PageMarginControl.hxx"
#include "PageSizeControl.hxx"
#include "PageColumnControl.hxx"
#include <swtypes.hxx>
#include <cmdid.h>
#include <errhdl.hxx>
#include <svl/intitem.hxx>
#include <editeng/sizeitem.hxx>
#include <editeng/paperinf.hxx>
#include <svx/svxids.hrc>
#include <svx/dlgutil.hxx>
#include <svx/rulritem.hxx>
#include <sfx2/sidebar/ControlFactory.hxx>
#include <sfx2/sidebar/Layouter.hxx>
#include <sfx2/sidebar/ResourceDefinitions.hrc>
#include <sfx2/dispatch.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/viewsh.hxx>
#include <sfx2/objsh.hxx>
#include <boost/bind.hpp>
#include <com/sun/star/frame/XController.hpp>
#include <com/sun/star/frame/XModel.hpp>
#include <com/sun/star/document/XUndoManagerSupplier.hpp>
using namespace ::sfx2::sidebar;
#define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString)))
#define SetFldVal(rField, lValue) (rField).SetValue((rField).Normalize(lValue), FUNIT_TWIP)
namespace {
const cssu::Reference< css::document::XUndoManager > getUndoManager( const cssu::Reference< css::frame::XFrame >& rxFrame )
{
const cssu::Reference< css::frame::XController >& xController = rxFrame->getController();
if ( xController.is() )
{
const cssu::Reference< css::frame::XModel >& xModel = xController->getModel();
if ( xModel.is() )
{
const cssu::Reference< css::document::XUndoManagerSupplier > xSuppUndo( xModel, cssu::UNO_QUERY_THROW );
if ( xSuppUndo.is() )
{
const cssu::Reference< css::document::XUndoManager > xUndoManager( xSuppUndo->getUndoManager(), cssu::UNO_QUERY_THROW );
return xUndoManager;
}
}
}
return cssu::Reference< css::document::XUndoManager > ();
}
}
namespace sw { namespace sidebar {
PagePropertyPanel* PagePropertyPanel::Create (
Window* pParent,
const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame>& rxFrame,
SfxBindings* pBindings)
{
if (pParent == NULL)
throw ::com::sun::star::lang::IllegalArgumentException(A2S("no parent Window given to PagePropertyPanel::Create"), NULL, 0);
if ( ! rxFrame.is())
throw ::com::sun::star::lang::IllegalArgumentException(A2S("no XFrame given to PagePropertyPanel::Create"), NULL, 1);
if (pBindings == NULL)
throw ::com::sun::star::lang::IllegalArgumentException(A2S("no SfxBindings given to PagePropertyPanel::Create"), NULL, 2);
return new PagePropertyPanel(
pParent,
rxFrame,
pBindings);
}
PagePropertyPanel::PagePropertyPanel(
Window* pParent,
const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame>& rxFrame,
SfxBindings* pBindings)
: Control(pParent, SW_RES(RID_PROPERTYPANEL_SWPAGE))
, mpBindings(pBindings)
// visible controls
, maFtOrientation( this, SW_RES(FT_ORIENTATION) )
, mpToolBoxOrientationBackground( ::sfx2::sidebar::ControlFactory::CreateToolBoxBackground(this) )
, mpToolBoxOrientation( ::sfx2::sidebar::ControlFactory::CreateToolBox( mpToolBoxOrientationBackground.get(), SW_RES(TB_ORIENTATION)) )
, maFtMargin( this, SW_RES(FT_MARGIN) )
, mpToolBoxMarginBackground( ::sfx2::sidebar::ControlFactory::CreateToolBoxBackground(this) )
, mpToolBoxMargin( ::sfx2::sidebar::ControlFactory::CreateToolBox( mpToolBoxMarginBackground.get(), SW_RES(TB_MARGIN)) )
, maFtSize( this, SW_RES(FT_SIZE) )
, mpToolBoxSizeBackground( ::sfx2::sidebar::ControlFactory::CreateToolBoxBackground(this) )
, mpToolBoxSize( ::sfx2::sidebar::ControlFactory::CreateToolBox( mpToolBoxSizeBackground.get(), SW_RES(TB_SIZE)) )
, maFtColumn( this, SW_RES(FT_COLUMN) )
, mpToolBoxColumnBackground( ::sfx2::sidebar::ControlFactory::CreateToolBoxBackground(this) )
, mpToolBoxColumn( ::sfx2::sidebar::ControlFactory::CreateToolBox( mpToolBoxColumnBackground.get(), SW_RES(TB_COLUMN)) )
// image resources
, maImgSize (NULL)
, maImgSize_L (NULL)
, mImgPortrait (SW_RES(IMG_PAGE_PORTRAIT))
, mImgLandscape (SW_RES(IMG_PAGE_LANDSCAPE))
, mImgNarrow (SW_RES(IMG_PAGE_NARROW))
, mImgNormal (SW_RES(IMG_PAGE_NORMAL))
, mImgWide (SW_RES(IMG_PAGE_WIDE))
, mImgMirrored (SW_RES(IMG_PAGE_MIRRORED))
, mImgMarginCustom (SW_RES(IMG_PAGE_MARGIN_CUSTOM))
, mImgNarrow_L (SW_RES(IMG_PAGE_NARROW_L))
, mImgNormal_L (SW_RES(IMG_PAGE_NORMAL_L))
, mImgWide_L (SW_RES(IMG_PAGE_WIDE_L))
, mImgMirrored_L (SW_RES(IMG_PAGE_MIRRORED_L))
, mImgMarginCustom_L (SW_RES(IMG_PAGE_MARGIN_CUSTOM_L))
, mImgA3 (SW_RES(IMG_PAGE_A3))
, mImgA4 (SW_RES(IMG_PAGE_A4))
, mImgA5 (SW_RES(IMG_PAGE_A5))
, mImgB4 (SW_RES(IMG_PAGE_B4))
, mImgB5 (SW_RES(IMG_PAGE_B5))
, mImgC5 (SW_RES(IMG_PAGE_C5))
, mImgLetter (SW_RES(IMG_PAGE_LETTER))
, mImgLegal (SW_RES(IMG_PAGE_LEGAL))
, mImgSizeNone (SW_RES(IMG_PAGE_SIZE_NONE))
, mImgA3_L (SW_RES(IMG_PAGE_A3_L))
, mImgA4_L (SW_RES(IMG_PAGE_A4_L))
, mImgA5_L (SW_RES(IMG_PAGE_A5_L))
, mImgB4_L (SW_RES(IMG_PAGE_B4_L))
, mImgB5_L (SW_RES(IMG_PAGE_B5_L))
, mImgC5_L (SW_RES(IMG_PAGE_C5_L))
, mImgLetter_L (SW_RES(IMG_PAGE_LETTER_L))
, mImgLegal_L (SW_RES(IMG_PAGE_LEGAL_L))
, mImgSizeNone_L (SW_RES(IMG_PAGE_SIZE_NONE_L))
, mImgColumn1 (SW_RES(IMG_PAGE_COLUMN_1))
, mImgColumn2 (SW_RES(IMG_PAGE_COLUMN_2))
, mImgColumn3 (SW_RES(IMG_PAGE_COLUMN_3))
, mImgLeft (SW_RES(IMG_PAGE_COLUMN_LEFT))
, mImgRight (SW_RES(IMG_PAGE_COLUMN_RIGHT))
, mImgColumnNone (SW_RES(IMG_PAGE_COLUMN_NONE))
, mImgColumn1_L (SW_RES(IMG_PAGE_COLUMN_1_L))
, mImgColumn2_L (SW_RES(IMG_PAGE_COLUMN_2_L))
, mImgColumn3_L (SW_RES(IMG_PAGE_COLUMN_3_L))
, mImgLeft_L (SW_RES(IMG_PAGE_COLUMN_LEFT_L))
, mImgRight_L (SW_RES(IMG_PAGE_COLUMN_RIGHT_L))
, mImgColumnNone_L (SW_RES(IMG_PAGE_COLUMN_NONE_L))
, mpPageItem( new SvxPageItem(SID_ATTR_PAGE) )
, mpPageLRMarginItem( new SvxLongLRSpaceItem( 0, 0, SID_ATTR_PAGE_LRSPACE ) )
, mpPageULMarginItem( new SvxLongULSpaceItem( 0, 0, SID_ATTR_PAGE_ULSPACE ) )
, mpPageSizeItem( new SvxSizeItem(SID_ATTR_PAGE_SIZE) )
, mePaper( PAPER_USER )
, mpPageColumnTypeItem( new SfxInt16Item(SID_ATTR_PAGE_COLUMN) )
, meFUnit()
, meUnit()
, m_aSwPagePgULControl(SID_ATTR_PAGE_ULSPACE, *pBindings, *this)
, m_aSwPagePgLRControl(SID_ATTR_PAGE_LRSPACE, *pBindings, *this)
, m_aSwPagePgSizeControl(SID_ATTR_PAGE_SIZE, *pBindings, *this)
, m_aSwPagePgControl(SID_ATTR_PAGE, *pBindings, *this)
, m_aSwPageColControl(SID_ATTR_PAGE_COLUMN, *pBindings, *this)
, m_aSwPagePgMetricControl(SID_ATTR_METRIC, *pBindings, *this)
, maOrientationPopup( this,
::boost::bind( &PagePropertyPanel::CreatePageOrientationControl, this, _1 ),
A2S("Page orientation") )
, maMarginPopup( this,
::boost::bind( &PagePropertyPanel::CreatePageMarginControl, this, _1 ),
A2S("Page margins") )
, maSizePopup( this,
::boost::bind( &PagePropertyPanel::CreatePageSizeControl, this, _1 ),
A2S("Page size") )
, maColumnPopup( this,
::boost::bind( &PagePropertyPanel::CreatePageColumnControl, this, _1 ),
A2S("Page columns") )
, mxUndoManager( getUndoManager( rxFrame ) )
, mbInvalidateSIDAttrPageOnSIDAttrPageSizeNotify( false ),
maLayouter(*this)
{
Initialize();
mbInvalidateSIDAttrPageOnSIDAttrPageSizeNotify = true;
FreeResource();
// Setup the grid layouter.
maLayouter.GetCell(0,0).SetControl(maFtOrientation).SetGridWidth(2);
maLayouter.GetCell(1,0).SetControl(*mpToolBoxOrientationBackground).SetFixedWidth();
maLayouter.GetCell(0,3).SetControl(maFtMargin).SetGridWidth(2);
maLayouter.GetCell(1,3).SetControl(*mpToolBoxMarginBackground).SetFixedWidth();
maLayouter.GetCell(2,0).SetControl(maFtSize).SetGridWidth(2);
maLayouter.GetCell(3,0).SetControl(*mpToolBoxSizeBackground).SetFixedWidth();
maLayouter.GetCell(2,3).SetControl(maFtColumn).SetGridWidth(2);
maLayouter.GetCell(3,3).SetControl(*mpToolBoxColumnBackground).SetFixedWidth();
maLayouter.GetColumn(0)
.SetWeight(0)
.SetLeftPadding(Layouter::MapWidth(*this,SECTIONPAGE_MARGIN_HORIZONTAL));
maLayouter.GetColumn(1)
.SetWeight(1)
.SetMinimumWidth(Layouter::MapWidth(*this,MBOX_WIDTH/2));
maLayouter.GetColumn(2)
.SetWeight(0)
.SetMinimumWidth(Layouter::MapWidth(*this, CONTROL_SPACING_HORIZONTAL));
maLayouter.GetColumn(3)
.SetWeight(0);
maLayouter.GetColumn(4)
.SetWeight(1)
.SetRightPadding(Layouter::MapWidth(*this,SECTIONPAGE_MARGIN_HORIZONTAL))
.SetMinimumWidth(Layouter::MapWidth(*this,MBOX_WIDTH/2));
// Make controls that display text handle short widths more
// graceful.
Layouter::PrepareForLayouting(maFtOrientation);
Layouter::PrepareForLayouting(maFtMargin);
Layouter::PrepareForLayouting(maFtSize);
Layouter::PrepareForLayouting(maFtColumn);
}
PagePropertyPanel::~PagePropertyPanel()
{
delete[] maImgSize;
delete[] maImgSize_L;
// destroy the toolbox windows.
mpToolBoxOrientation.reset();
mpToolBoxMargin.reset();
mpToolBoxSize.reset();
mpToolBoxColumn.reset();
// destroy the background windows of the toolboxes.
mpToolBoxOrientationBackground.reset();
mpToolBoxMarginBackground.reset();
mpToolBoxSizeBackground.reset();
mpToolBoxColumnBackground.reset();
}
void PagePropertyPanel::Initialize()
{
maFtOrientation.SetBackground(Wallpaper());
maFtMargin.SetBackground(Wallpaper());
maFtSize.SetBackground(Wallpaper());
maFtColumn.SetBackground(Wallpaper());
// popup for page orientation
Link aLink = LINK( this, PagePropertyPanel, ClickOrientationHdl );
mpToolBoxOrientation->SetDropdownClickHdl( aLink );
mpToolBoxOrientation->SetSelectHdl( aLink );
mpToolBoxOrientation->SetItemImage( TBI_ORIENTATION, mImgPortrait);
mpToolBoxOrientation->SetItemBits( TBI_ORIENTATION, mpToolBoxOrientation->GetItemBits( TBI_ORIENTATION ) | TIB_DROPDOWNONLY );
mpToolBoxOrientation->SetQuickHelpText(TBI_ORIENTATION,String(SW_RES(STR_QHELP_TB_ORIENTATION)));
mpToolBoxOrientation->SetOutputSizePixel( mpToolBoxOrientation->CalcWindowSizePixel() );
mpToolBoxOrientation->SetBackground( Wallpaper() );
mpToolBoxOrientation->SetPaintTransparent( sal_True );
// popup for page margins
aLink = LINK( this, PagePropertyPanel, ClickMarginHdl );
mpToolBoxMargin->SetDropdownClickHdl( aLink );
mpToolBoxMargin->SetSelectHdl( aLink );
mpToolBoxMargin->SetItemImage(TBI_MARGIN, mImgNormal);
mpToolBoxMargin->SetItemBits( TBI_MARGIN, mpToolBoxMargin->GetItemBits( TBI_MARGIN ) | TIB_DROPDOWNONLY );
mpToolBoxMargin->SetQuickHelpText(TBI_MARGIN,String(SW_RES(STR_QHELP_TB_MARGIN)));
mpToolBoxMargin->SetOutputSizePixel( mpToolBoxMargin->CalcWindowSizePixel() );
mpToolBoxMargin->SetBackground(Wallpaper());
mpToolBoxMargin->SetPaintTransparent( sal_True );
// popup for page size
aLink = LINK( this, PagePropertyPanel, ClickSizeHdl );
mpToolBoxSize->SetDropdownClickHdl( aLink );
mpToolBoxSize->SetSelectHdl( aLink );
mpToolBoxSize->SetItemImage(TBI_SIZE, mImgLetter);
mpToolBoxSize->SetItemBits( TBI_SIZE, mpToolBoxSize->GetItemBits( TBI_SIZE ) | TIB_DROPDOWNONLY );
mpToolBoxSize->SetQuickHelpText(TBI_SIZE,String(SW_RES(STR_QHELP_TB_SIZE)));
mpToolBoxSize->SetOutputSizePixel( mpToolBoxSize->CalcWindowSizePixel() );
mpToolBoxSize->SetBackground(Wallpaper());
mpToolBoxSize->SetPaintTransparent( sal_True );
maImgSize = new Image[8];
maImgSize[0] = mImgA3;
maImgSize[1] = mImgA4;
maImgSize[2] = mImgA5;
maImgSize[3] = mImgB4;
maImgSize[4] = mImgB5;
maImgSize[5] = mImgC5;
maImgSize[6] = mImgLetter;
maImgSize[7] = mImgLegal;
maImgSize_L = new Image[8];
maImgSize_L[0] = mImgA3_L;
maImgSize_L[1] = mImgA4_L;
maImgSize_L[2] = mImgA5_L;
maImgSize_L[3] = mImgB4_L;
maImgSize_L[4] = mImgB5_L;
maImgSize_L[5] = mImgC5_L;
maImgSize_L[6] = mImgLetter_L;
maImgSize_L[7] = mImgLegal_L;
// popup for page column property
aLink = LINK( this, PagePropertyPanel, ClickColumnHdl );
mpToolBoxColumn->SetDropdownClickHdl( aLink );
mpToolBoxColumn->SetSelectHdl( aLink );
mpToolBoxColumn->SetItemImage(TBI_COLUMN, mImgColumn1);
mpToolBoxColumn->SetItemBits( TBI_COLUMN, mpToolBoxColumn->GetItemBits( TBI_COLUMN ) | TIB_DROPDOWNONLY );
mpToolBoxColumn->SetQuickHelpText(TBI_COLUMN,String(SW_RES(STR_QHELP_TB_COLUMN)));
mpToolBoxColumn->SetOutputSizePixel( mpToolBoxColumn->CalcWindowSizePixel() );
mpToolBoxColumn->SetBackground(Wallpaper());
mpToolBoxColumn->SetPaintTransparent( sal_True );
meFUnit = GetModuleFieldUnit();
meUnit = m_aSwPagePgSizeControl.GetCoreMetric();
// 'pull' for page style's attribute values
mpBindings->Update( SID_ATTR_PAGE_LRSPACE );
mpBindings->Update( SID_ATTR_PAGE_ULSPACE );
mpBindings->Update( SID_ATTR_PAGE );
mpBindings->Update( SID_ATTR_PAGE_SIZE );
}
::svx::sidebar::PopupControl* PagePropertyPanel::CreatePageOrientationControl( ::svx::sidebar::PopupContainer* pParent )
{
return new PageOrientationControl( pParent, *this , mpPageItem->IsLandscape() );
}
IMPL_LINK( PagePropertyPanel, ClickOrientationHdl, ToolBox*, pToolBox )
{
maOrientationPopup.Show( *pToolBox );
return 0L;
}
void PagePropertyPanel::ExecuteOrientationChange( const sal_Bool bLandscape )
{
StartUndo();
{
// set new page orientation
mpPageItem->SetLandscape( bLandscape );
// swap the width and height of the page size
mpPageSizeItem->SetSize( Size( mpPageSizeItem->GetSize().Height(), mpPageSizeItem->GetSize().Width() ) );
// apply changed attributes
GetBindings()->GetDispatcher()->Execute( SID_ATTR_PAGE_SIZE, SFX_CALLMODE_RECORD, mpPageSizeItem.get(), mpPageItem.get(), 0L );
}
// check, if margin values still fit to the changed page size.
// if not, adjust margin values
{
const long nML = mpPageLRMarginItem->GetLeft();
const long nMR = mpPageLRMarginItem->GetRight();
const long nTmpPW = nML + nMR + MINBODY;
const long nPW = mpPageSizeItem->GetSize().Width();
if ( nTmpPW > nPW )
{
if ( nML <= nMR )
{
ExecuteMarginLRChange( mpPageLRMarginItem->GetLeft(), nMR - (nTmpPW - nPW ) );
}
else
{
ExecuteMarginLRChange( nML - (nTmpPW - nPW ), mpPageLRMarginItem->GetRight() );
}
}
const long nMT = mpPageULMarginItem->GetUpper();
const long nMB = mpPageULMarginItem->GetLower();
const long nTmpPH = nMT + nMB + MINBODY;
const long nPH = mpPageSizeItem->GetSize().Height();
if ( nTmpPH > nPH )
{
if ( nMT <= nMB )
{
ExecuteMarginULChange( mpPageULMarginItem->GetUpper(), nMB - ( nTmpPH - nPH ) );
}
else
{
ExecuteMarginULChange( nMT - ( nTmpPH - nPH ), mpPageULMarginItem->GetLower() );
}
}
}
EndUndo();
}
void PagePropertyPanel::ClosePageOrientationPopup()
{
maOrientationPopup.Hide();
}
::svx::sidebar::PopupControl* PagePropertyPanel::CreatePageMarginControl( ::svx::sidebar::PopupContainer* pParent )
{
return new PageMarginControl(
pParent,
*this,
*mpPageLRMarginItem.get(),
*mpPageULMarginItem.get(),
mpPageItem->GetPageUsage() == SVX_PAGE_MIRROR,
mpPageSizeItem->GetSize(),
mpPageItem->IsLandscape(),
meFUnit,
meUnit );
}
void PagePropertyPanel::ExecuteMarginLRChange(
const long nPageLeftMargin,
const long nPageRightMargin )
{
mpPageLRMarginItem->SetLeft( nPageLeftMargin );
mpPageLRMarginItem->SetRight( nPageRightMargin );
GetBindings()->GetDispatcher()->Execute( SID_ATTR_PAGE_LRSPACE, SFX_CALLMODE_RECORD, mpPageLRMarginItem.get(), 0L );
}
void PagePropertyPanel::ExecuteMarginULChange(
const long nPageTopMargin,
const long nPageBottomMargin )
{
mpPageULMarginItem->SetUpper( nPageTopMargin );
mpPageULMarginItem->SetLower( nPageBottomMargin );
GetBindings()->GetDispatcher()->Execute( SID_ATTR_PAGE_ULSPACE, SFX_CALLMODE_RECORD, mpPageULMarginItem.get(), 0L );
}
void PagePropertyPanel::ExecutePageLayoutChange( const bool bMirrored )
{
mpPageItem->SetPageUsage( bMirrored ? SVX_PAGE_MIRROR : SVX_PAGE_ALL );
GetBindings()->GetDispatcher()->Execute( SID_ATTR_PAGE, SFX_CALLMODE_RECORD, mpPageItem.get(), 0L );
}
IMPL_LINK( PagePropertyPanel, ClickMarginHdl, ToolBox*, pToolBox )
{
maMarginPopup.Show( *pToolBox );
return 0L;
}
void PagePropertyPanel::ClosePageMarginPopup()
{
maMarginPopup.Hide();
}
::svx::sidebar::PopupControl* PagePropertyPanel::CreatePageSizeControl( ::svx::sidebar::PopupContainer* pParent )
{
return new PageSizeControl(
pParent,
*this,
mePaper,
mpPageItem->IsLandscape(),
meFUnit );
}
void PagePropertyPanel::ExecuteSizeChange( const Paper ePaper )
{
Size aPageSize = SvxPaperInfo::GetPaperSize( ePaper, (MapUnit)(meUnit) );
if ( mpPageItem->IsLandscape() )
{
Swap( aPageSize );
}
mpPageSizeItem->SetSize( aPageSize );
mpBindings->GetDispatcher()->Execute(SID_ATTR_PAGE_SIZE, SFX_CALLMODE_RECORD, mpPageSizeItem.get(), 0L );
}
IMPL_LINK( PagePropertyPanel, ClickSizeHdl, ToolBox*, pToolBox )
{
maSizePopup.Show( *pToolBox );
return 0L;
}
void PagePropertyPanel::ClosePageSizePopup()
{
maSizePopup.Hide();
}
::svx::sidebar::PopupControl* PagePropertyPanel::CreatePageColumnControl( ::svx::sidebar::PopupContainer* pParent )
{
return new PageColumnControl(
pParent,
*this,
mpPageColumnTypeItem->GetValue(),
mpPageItem->IsLandscape() );
}
void PagePropertyPanel::ExecuteColumnChange( const sal_uInt16 nColumnType )
{
mpPageColumnTypeItem->SetValue( nColumnType );
mpBindings->GetDispatcher()->Execute(SID_ATTR_PAGE_COLUMN, SFX_CALLMODE_RECORD, mpPageColumnTypeItem.get(), 0L );
}
IMPL_LINK( PagePropertyPanel, ClickColumnHdl, ToolBox*, pToolBox )
{
maColumnPopup.Show( *pToolBox );
return 0L;
}
void PagePropertyPanel::ClosePageColumnPopup()
{
maColumnPopup.Hide();
}
void PagePropertyPanel::NotifyItemUpdate(
const sal_uInt16 nSId,
const SfxItemState eState,
const SfxPoolItem* pState,
const bool bIsEnabled)
{
(void)bIsEnabled;
switch( nSId )
{
case SID_ATTR_PAGE_COLUMN:
{
if ( eState >= SFX_ITEM_AVAILABLE &&
pState && pState->ISA(SfxInt16Item) )
{
mpPageColumnTypeItem.reset( static_cast<SfxInt16Item*>(pState->Clone()) );
ChangeColumnImage( mpPageColumnTypeItem->GetValue() );
}
}
break;
case SID_ATTR_PAGE_LRSPACE:
if ( eState >= SFX_ITEM_AVAILABLE &&
pState && pState->ISA(SvxLongLRSpaceItem) )
{
mpPageLRMarginItem.reset( static_cast<SvxLongLRSpaceItem*>(pState->Clone()) );
ChangeMarginImage();
}
break;
case SID_ATTR_PAGE_ULSPACE:
if ( eState >= SFX_ITEM_AVAILABLE &&
pState && pState->ISA(SvxLongULSpaceItem) )
{
mpPageULMarginItem.reset( static_cast<SvxLongULSpaceItem*>(pState->Clone()) );
ChangeMarginImage();
}
break;
case SID_ATTR_PAGE:
if ( eState >= SFX_ITEM_AVAILABLE &&
pState && pState->ISA(SvxPageItem) )
{
mpPageItem.reset( static_cast<SvxPageItem*>(pState->Clone()) );
if ( mpPageItem->IsLandscape() )
{
mpToolBoxOrientation->SetItemImage(TBI_ORIENTATION, mImgLandscape);
}
else
{
mpToolBoxOrientation->SetItemImage(TBI_ORIENTATION, mImgPortrait);
}
ChangeMarginImage();
ChangeSizeImage();
ChangeColumnImage( mpPageColumnTypeItem->GetValue() );
}
break;
case SID_ATTR_PAGE_SIZE:
if ( mbInvalidateSIDAttrPageOnSIDAttrPageSizeNotify )
{
mpBindings->Invalidate( SID_ATTR_PAGE, sal_True, sal_False );
}
if ( eState >= SFX_ITEM_AVAILABLE &&
pState && pState->ISA(SvxSizeItem) )
{
mpPageSizeItem.reset( static_cast<SvxSizeItem*>(pState->Clone()) );
ChangeSizeImage();
}
break;
case SID_ATTR_METRIC:
MetricState( eState, pState );
break;
}
}
void PagePropertyPanel::MetricState( SfxItemState eState, const SfxPoolItem* pState )
{
meFUnit = FUNIT_NONE;
if ( pState && eState >= SFX_ITEM_DEFAULT )
{
meFUnit = (FieldUnit)( (const SfxUInt16Item*)pState )->GetValue();
}
else
{
SfxViewFrame* pFrame = SfxViewFrame::Current();
SfxObjectShell* pSh = NULL;
if ( pFrame )
pSh = pFrame->GetObjectShell();
if ( pSh )
{
SfxModule* pModule = pSh->GetModule();
if ( pModule )
{
const SfxPoolItem* pItem = pModule->GetItem( SID_ATTR_METRIC );
if ( pItem )
meFUnit = (FieldUnit)( (SfxUInt16Item*)pItem )->GetValue();
}
else
{
DBG_ERRORFILE( "<PagePropertyPanel::MetricState(..)>: no module found" );
}
}
}
}
void PagePropertyPanel::ChangeMarginImage()
{
if ( mpPageLRMarginItem.get() == 0 ||
mpPageULMarginItem.get() == 0 ||
mpPageItem.get() == 0 )
{
return;
}
const long cTolerance = 5;
if( abs(mpPageLRMarginItem->GetLeft() - SWPAGE_NARROW_VALUE) <= cTolerance &&
abs(mpPageLRMarginItem->GetRight() - SWPAGE_NARROW_VALUE) <= cTolerance &&
abs(mpPageULMarginItem->GetUpper() - SWPAGE_NARROW_VALUE) <= cTolerance &&
abs(mpPageULMarginItem->GetLower() - SWPAGE_NARROW_VALUE) <= cTolerance &&
mpPageItem->GetPageUsage() != SVX_PAGE_MIRROR )
mpToolBoxMargin->SetItemImage( TBI_MARGIN, mpPageItem->IsLandscape() ? mImgNarrow_L : mImgNarrow );
else if( abs(mpPageLRMarginItem->GetLeft() - SWPAGE_NORMAL_VALUE) <= cTolerance &&
abs(mpPageLRMarginItem->GetRight() - SWPAGE_NORMAL_VALUE) <= cTolerance &&
abs(mpPageULMarginItem->GetUpper() - SWPAGE_NORMAL_VALUE) <= cTolerance &&
abs(mpPageULMarginItem->GetLower() - SWPAGE_NORMAL_VALUE) <= cTolerance &&
mpPageItem->GetPageUsage() != SVX_PAGE_MIRROR )
mpToolBoxMargin->SetItemImage(TBI_MARGIN, mpPageItem->IsLandscape() ? mImgNormal_L : mImgNormal );
else if( abs(mpPageLRMarginItem->GetLeft() - SWPAGE_WIDE_VALUE2) <= cTolerance &&
abs(mpPageLRMarginItem->GetRight() - SWPAGE_WIDE_VALUE2) <= cTolerance &&
abs(mpPageULMarginItem->GetUpper() - SWPAGE_WIDE_VALUE1) <= cTolerance &&
abs(mpPageULMarginItem->GetLower() - SWPAGE_WIDE_VALUE1) <= cTolerance &&
mpPageItem->GetPageUsage() != SVX_PAGE_MIRROR )
mpToolBoxMargin->SetItemImage(TBI_MARGIN, mpPageItem->IsLandscape() ? mImgWide_L : mImgWide );
else if( abs(mpPageLRMarginItem->GetLeft() - SWPAGE_WIDE_VALUE3) <= cTolerance &&
abs(mpPageLRMarginItem->GetRight() - SWPAGE_WIDE_VALUE1) <= cTolerance &&
abs(mpPageULMarginItem->GetUpper() - SWPAGE_WIDE_VALUE1) <= cTolerance &&
abs(mpPageULMarginItem->GetLower() - SWPAGE_WIDE_VALUE1) <= cTolerance &&
mpPageItem->GetPageUsage() == SVX_PAGE_MIRROR )
mpToolBoxMargin->SetItemImage(TBI_MARGIN, mpPageItem->IsLandscape() ? mImgMirrored_L : mImgMirrored );
else
mpToolBoxMargin->SetItemImage(TBI_MARGIN, mpPageItem->IsLandscape() ? mImgMarginCustom_L : mImgMarginCustom );
}
void PagePropertyPanel::ChangeSizeImage()
{
if ( mpPageSizeItem.get() == 0 ||
mpPageItem.get() == 0 )
{
return;
}
Size aTmpPaperSize = mpPageSizeItem->GetSize();
if ( mpPageItem->IsLandscape() )
{
Swap( aTmpPaperSize ); // Swap(..) defined in editeng/paperinf.hxx
}
mePaper = SvxPaperInfo::GetSvxPaper( aTmpPaperSize, static_cast<MapUnit>(meUnit), sal_True );
sal_uInt16 nImageIdx = 0;
switch ( mePaper )
{
case PAPER_A3:
nImageIdx = 1;
break;
case PAPER_A4:
nImageIdx = 2;
break;
case PAPER_A5:
nImageIdx = 3;
break;
case PAPER_B4_ISO:
nImageIdx = 4;
break;
case PAPER_B5_ISO:
nImageIdx = 5;
break;
case PAPER_ENV_C5:
nImageIdx = 6;
break;
case PAPER_LETTER:
nImageIdx = 7;
break;
case PAPER_LEGAL:
nImageIdx = 8;
break;
default:
nImageIdx = 0;
mePaper = PAPER_USER;
break;
}
if ( nImageIdx == 0 )
{
mpToolBoxSize->SetItemImage( TBI_SIZE,
( mpPageItem->IsLandscape() ? mImgSizeNone_L : mImgSizeNone ) );
}
else
{
mpToolBoxSize->SetItemImage( TBI_SIZE,
( mpPageItem->IsLandscape() ? maImgSize_L[nImageIdx-1] : maImgSize[nImageIdx-1] ) );
}
}
void PagePropertyPanel::ChangeColumnImage( const sal_uInt16 nColumnType )
{
if ( mpPageItem.get() == 0 )
{
return;
}
if ( !mpPageItem->IsLandscape() )
{
switch( nColumnType )
{
case 1:
mpToolBoxColumn->SetItemImage(TBI_COLUMN, mImgColumn1);
break;
case 2:
mpToolBoxColumn->SetItemImage(TBI_COLUMN, mImgColumn2);
break;
case 3:
mpToolBoxColumn->SetItemImage(TBI_COLUMN, mImgColumn3);
break;
case 4:
mpToolBoxColumn->SetItemImage(TBI_COLUMN, mImgLeft);
break;
case 5:
mpToolBoxColumn->SetItemImage(TBI_COLUMN, mImgRight);
break;
default:
mpToolBoxColumn->SetItemImage(TBI_COLUMN, mImgColumnNone);
}
}
else
{
switch( nColumnType )
{
case 1:
mpToolBoxColumn->SetItemImage(TBI_COLUMN, mImgColumn1_L);
break;
case 2:
mpToolBoxColumn->SetItemImage(TBI_COLUMN, mImgColumn2_L);
break;
case 3:
mpToolBoxColumn->SetItemImage(TBI_COLUMN, mImgColumn3_L);
break;
case 4:
mpToolBoxColumn->SetItemImage(TBI_COLUMN, mImgLeft_L);
break;
case 5:
mpToolBoxColumn->SetItemImage(TBI_COLUMN, mImgRight_L);
break;
default:
mpToolBoxColumn->SetItemImage(TBI_COLUMN, mImgColumnNone_L);
}
}
}
void PagePropertyPanel::StartUndo()
{
if ( mxUndoManager.is() )
{
mxUndoManager->enterUndoContext( A2S("") );
}
}
void PagePropertyPanel::EndUndo()
{
if ( mxUndoManager.is() )
{
mxUndoManager->leaveUndoContext();
}
}
void PagePropertyPanel::Resize (void)
{
maLayouter.Layout();
}
} } // end of namespace ::sw::sidebar