/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * 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 . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::com::sun::star::uno; using namespace ::com::sun::star::frame; using namespace ::com::sun::star::beans; constexpr OUString TOOLBOX_NAME = u"colorbar"_ustr; #define RID_SVXSTR_UNDO_GRAFCROP RID_SVXSTR_GRAFCROP namespace { class ImplGrafControl final : public InterimItemWindow { private: OUString maCommand; Reference mxFrame; std::unique_ptr mxImage; std::unique_ptr mxField; DECL_LINK(ValueChangedHdl, weld::MetricSpinButton&, void); DECL_LINK(KeyInputHdl, const KeyEvent&, bool); void ImplModify(); public: ImplGrafControl( vcl::Window* pParent, const OUString& rCmd, const Reference< XFrame >& rFrame ); virtual ~ImplGrafControl() override; virtual void dispose() override; void Update( const SfxPoolItem* pItem ); void set_field_text(const OUString& rStr) { mxField->set_text(rStr); } void set_sensitive(bool bSensitive) { Enable(bSensitive); mxImage->set_sensitive(bSensitive); mxField->set_sensitive(bSensitive); } }; } IMPL_LINK_NOARG(ImplGrafControl, ValueChangedHdl, weld::MetricSpinButton&, void) { ImplModify(); } void ImplGrafControl::ImplModify() { const sal_Int64 nVal = mxField->get_value(FieldUnit::NONE); // Convert value to an any to be usable with dispatch API Any a; if ( maCommand == ".uno:GrafRed" || maCommand == ".uno:GrafGreen" || maCommand == ".uno:GrafBlue" || maCommand == ".uno:GrafLuminance" || maCommand == ".uno:GrafContrast" ) a <<= sal_Int16( nVal ); else if ( maCommand == ".uno:GrafGamma" || maCommand == ".uno:GrafTransparence" ) a <<= sal_Int32( nVal ); if ( !a.hasValue() ) return; INetURLObject aObj( maCommand ); Sequence< PropertyValue > aArgs{ comphelper::makePropertyValue(aObj.GetURLPath(), a) }; SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ), maCommand, aArgs ); } void ImplGrafControl::Update( const SfxPoolItem* pItem ) { if( pItem ) { tools::Long nValue; if ( maCommand == ".uno:GrafTransparence" ) nValue = static_cast( pItem )->GetValue(); else if ( maCommand == ".uno:GrafGamma" ) nValue = static_cast( pItem )->GetValue(); else nValue = static_cast( pItem )->GetValue(); mxField->set_value(nValue, FieldUnit::NONE); } else mxField->set_text(OUString()); } namespace { struct CommandToRID { const char* pCommand; OUString sResId; }; } static OUString ImplGetRID( std::u16string_view aCommand ) { static constexpr CommandToRID aImplCommandToResMap[] = { { ".uno:GrafRed", RID_SVXBMP_GRAF_RED }, { ".uno:GrafGreen", RID_SVXBMP_GRAF_GREEN }, { ".uno:GrafBlue", RID_SVXBMP_GRAF_BLUE }, { ".uno:GrafLuminance", RID_SVXBMP_GRAF_LUMINANCE }, { ".uno:GrafContrast", RID_SVXBMP_GRAF_CONTRAST }, { ".uno:GrafGamma", RID_SVXBMP_GRAF_GAMMA }, { ".uno:GrafTransparence", RID_SVXBMP_GRAF_TRANSPARENCE }, { nullptr, EMPTY_OUSTRING } }; OUString sRID; sal_Int32 i( 0 ); while ( aImplCommandToResMap[ i ].pCommand ) { if ( o3tl::equalsAscii( aCommand, aImplCommandToResMap[ i ].pCommand )) { sRID = aImplCommandToResMap[i].sResId; break; } ++i; } return sRID; } ImplGrafControl::ImplGrafControl( vcl::Window* pParent, const OUString& rCmd, const Reference< XFrame >& rFrame) : InterimItemWindow(pParent, u"svx/ui/grafctrlbox.ui"_ustr, u"GrafCtrlBox"_ustr) , maCommand(rCmd) , mxFrame(rFrame) , mxImage(m_xBuilder->weld_image(u"image"_ustr)) , mxField(m_xBuilder->weld_metric_spin_button(u"spinfield"_ustr, FieldUnit::NONE)) { InitControlBase(&mxField->get_widget()); OUString sResId(ImplGetRID(rCmd)); mxImage->set_from_icon_name(sResId); mxImage->set_toolbar_background(); SetBackground( Wallpaper() ); // transparent background mxField->set_help_id(rCmd); mxField->get_widget().connect_key_press(LINK(this, ImplGrafControl, KeyInputHdl)); mxField->connect_value_changed(LINK(this, ImplGrafControl, ValueChangedHdl)); if (maCommand == ".uno:GrafGamma") { mxField->set_digits(2); mxField->set_range(10, 1000, FieldUnit::NONE); mxField->set_increments(10, 100, FieldUnit::NONE); } else { const tools::Long nMinVal = maCommand == ".uno:GrafTransparence" ? 0 : -100; mxField->set_unit(FieldUnit::PERCENT); mxField->set_digits(0); mxField->set_range(nMinVal, 100, FieldUnit::PERCENT); mxField->set_increments(1, 10, FieldUnit::PERCENT); } SetSizePixel(m_xContainer->get_preferred_size()); } IMPL_LINK(ImplGrafControl, KeyInputHdl, const KeyEvent&, rKEvt, bool) { return ChildKeyInput(rKEvt); } ImplGrafControl::~ImplGrafControl() { disposeOnce(); } void ImplGrafControl::dispose() { mxImage.reset(); mxField.reset(); InterimItemWindow::dispose(); } namespace { class ImplGrafModeControl final : public InterimItemWindow { private: sal_uInt16 mnCurPos; Reference< XFrame > mxFrame; std::unique_ptr m_xWidget; DECL_LINK(SelectHdl, weld::ComboBox&, void); DECL_LINK(KeyInputHdl, const KeyEvent&, bool); DECL_LINK(FocusInHdl, weld::Widget&, void); static void ImplReleaseFocus(); public: ImplGrafModeControl( vcl::Window* pParent, const Reference< XFrame >& rFrame ); virtual void dispose() override; virtual ~ImplGrafModeControl() override; void set_sensitive(bool bSensitive) { Enable(bSensitive); m_xWidget->set_sensitive(true); } void set_active(int nActive) { m_xWidget->set_active(nActive); } void Update( const SfxPoolItem* pItem ); }; } ImplGrafModeControl::ImplGrafModeControl(vcl::Window* pParent, const Reference& rFrame) : InterimItemWindow(pParent, u"svx/ui/grafmodebox.ui"_ustr, u"GrafModeBox"_ustr) , mnCurPos(0) , mxFrame(rFrame) , m_xWidget(m_xBuilder->weld_combo_box(u"grafmode"_ustr)) { InitControlBase(m_xWidget.get()); m_xWidget->append_text( SvxResId( RID_SVXSTR_GRAFMODE_STANDARD ) ); m_xWidget->append_text( SvxResId( RID_SVXSTR_GRAFMODE_GREYS ) ); m_xWidget->append_text( SvxResId( RID_SVXSTR_GRAFMODE_MONO ) ); m_xWidget->append_text( SvxResId( RID_SVXSTR_GRAFMODE_WATERMARK ) ); m_xWidget->connect_changed(LINK(this, ImplGrafModeControl, SelectHdl)); m_xWidget->connect_key_press(LINK(this, ImplGrafModeControl, KeyInputHdl)); m_xWidget->connect_focus_in(LINK(this, ImplGrafModeControl, FocusInHdl)); SetSizePixel(m_xWidget->get_preferred_size()); } void ImplGrafModeControl::dispose() { m_xWidget.reset(); InterimItemWindow::dispose(); } ImplGrafModeControl::~ImplGrafModeControl() { disposeOnce(); } IMPL_LINK(ImplGrafModeControl, SelectHdl, weld::ComboBox&, rBox, void) { Sequence< PropertyValue > aArgs{ comphelper::makePropertyValue(u"GrafMode"_ustr, sal_Int16(rBox.get_active())) }; /* #i33380# DR 2004-09-03 Moved the following line above the Dispatch() call. This instance may be deleted in the meantime (i.e. when a dialog is opened while in Dispatch()), accessing members will crash in this case. */ ImplReleaseFocus(); SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ), u".uno:GrafMode"_ustr, aArgs ); } IMPL_LINK(ImplGrafModeControl, KeyInputHdl, const KeyEvent&, rKEvt, bool) { bool bHandled(false); if (rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE) { m_xWidget->set_active(mnCurPos); ImplReleaseFocus(); bHandled = true; } return bHandled || ChildKeyInput(rKEvt); } IMPL_LINK_NOARG(ImplGrafModeControl, FocusInHdl, weld::Widget&, void) { mnCurPos = m_xWidget->get_active(); } void ImplGrafModeControl::ImplReleaseFocus() { if (const SfxViewShell* pViewShell = SfxViewShell::Current()) { vcl::Window* pShellWnd = pViewShell->GetWindow(); if( pShellWnd ) pShellWnd->GrabFocus(); } } void ImplGrafModeControl::Update( const SfxPoolItem* pItem ) { if( pItem ) m_xWidget->set_active(static_cast(pItem)->GetValue()); else m_xWidget->set_active(-1); } SvxGrafToolBoxControl::SvxGrafToolBoxControl( sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx) : SfxToolBoxControl( nSlotId, nId, rTbx ) { rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWN | rTbx.GetItemBits( nId ) ); rTbx.Invalidate(); } SvxGrafToolBoxControl::~SvxGrafToolBoxControl() { } void SvxGrafToolBoxControl::StateChangedAtToolBoxControl( sal_uInt16, SfxItemState eState, const SfxPoolItem* pState ) { ImplGrafControl* pCtrl = static_cast( GetToolBox().GetItemWindow( GetId() ) ); DBG_ASSERT( pCtrl, "Control not found" ); if( eState == SfxItemState::DISABLED ) { pCtrl->set_sensitive(false); pCtrl->set_field_text( OUString() ); } else { pCtrl->set_sensitive(true); if( eState == SfxItemState::DEFAULT ) pCtrl->Update( pState ); else pCtrl->Update( nullptr ); } } VclPtr SvxGrafToolBoxControl::CreateItemWindow( vcl::Window *pParent ) { return VclPtr::Create( pParent, m_aCommandURL, m_xFrame ).get(); } SFX_IMPL_TOOLBOX_CONTROL( SvxGrafRedToolBoxControl, SfxInt16Item ); SvxGrafRedToolBoxControl::SvxGrafRedToolBoxControl( sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx ) : SvxGrafToolBoxControl( nSlotId, nId, rTbx ) { } SFX_IMPL_TOOLBOX_CONTROL( SvxGrafGreenToolBoxControl, SfxInt16Item ); SvxGrafGreenToolBoxControl::SvxGrafGreenToolBoxControl( sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx ) : SvxGrafToolBoxControl( nSlotId, nId, rTbx ) { } SFX_IMPL_TOOLBOX_CONTROL( SvxGrafBlueToolBoxControl, SfxInt16Item ); SvxGrafBlueToolBoxControl::SvxGrafBlueToolBoxControl( sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx ) : SvxGrafToolBoxControl( nSlotId, nId, rTbx ) { } SFX_IMPL_TOOLBOX_CONTROL( SvxGrafLuminanceToolBoxControl, SfxInt16Item ); SvxGrafLuminanceToolBoxControl::SvxGrafLuminanceToolBoxControl( sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx ) : SvxGrafToolBoxControl( nSlotId, nId, rTbx ) { } SFX_IMPL_TOOLBOX_CONTROL( SvxGrafContrastToolBoxControl, SfxInt16Item ); SvxGrafContrastToolBoxControl::SvxGrafContrastToolBoxControl( sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx ) : SvxGrafToolBoxControl( nSlotId, nId, rTbx ) { } SFX_IMPL_TOOLBOX_CONTROL( SvxGrafGammaToolBoxControl, SfxUInt32Item ); SvxGrafGammaToolBoxControl::SvxGrafGammaToolBoxControl( sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx ) : SvxGrafToolBoxControl( nSlotId, nId, rTbx ) { } SFX_IMPL_TOOLBOX_CONTROL( SvxGrafTransparenceToolBoxControl, SfxUInt16Item ); SvxGrafTransparenceToolBoxControl::SvxGrafTransparenceToolBoxControl( sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx ) : SvxGrafToolBoxControl( nSlotId, nId, rTbx ) { } SFX_IMPL_TOOLBOX_CONTROL( SvxGrafModeToolBoxControl, SfxUInt16Item ); SvxGrafModeToolBoxControl::SvxGrafModeToolBoxControl( sal_uInt16 nSlotId, ToolBoxItemId nId, ToolBox& rTbx ) : SfxToolBoxControl( nSlotId, nId, rTbx ) { } SvxGrafModeToolBoxControl::~SvxGrafModeToolBoxControl() { } void SvxGrafModeToolBoxControl::StateChangedAtToolBoxControl( sal_uInt16, SfxItemState eState, const SfxPoolItem* pState ) { ImplGrafModeControl* pCtrl = static_cast( GetToolBox().GetItemWindow( GetId() ) ); DBG_ASSERT( pCtrl, "Control not found" ); if( eState == SfxItemState::DISABLED ) { pCtrl->set_sensitive(false); pCtrl->set_active(-1); } else { pCtrl->set_sensitive(true); if( eState == SfxItemState::DEFAULT ) pCtrl->Update( pState ); else pCtrl->Update( nullptr ); } } VclPtr SvxGrafModeToolBoxControl::CreateItemWindow( vcl::Window *pParent ) { return VclPtr::Create( pParent, m_xFrame ).get(); } void SvxGrafAttrHelper::ExecuteGrafAttr( SfxRequest& rReq, SdrView& rView ) { SfxItemPool& rPool = rView.GetModel().GetItemPool(); SfxItemSetFixed aSet( rPool ); OUString aUndoStr; const bool bUndo = rView.IsUndoEnabled(); if( bUndo ) { aUndoStr = rView.GetMarkedObjectList().GetMarkDescription() + " "; } const SfxItemSet* pArgs = rReq.GetArgs(); const SfxPoolItem* pItem; sal_uInt16 nSlot = rReq.GetSlot(); if( !pArgs || SfxItemState::SET != pArgs->GetItemState( nSlot, false, &pItem )) pItem = nullptr; switch( nSlot ) { case SID_ATTR_GRAF_RED: { if( pItem ) { aSet.Put( SdrGrafRedItem( static_cast(pItem)->GetValue() )); if( bUndo ) aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFRED ); } } break; case SID_ATTR_GRAF_GREEN: { if( pItem ) { aSet.Put( SdrGrafGreenItem( static_cast(pItem)->GetValue() )); if( bUndo ) aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFGREEN ); } } break; case SID_ATTR_GRAF_BLUE: { if( pItem ) { aSet.Put( SdrGrafBlueItem( static_cast(pItem)->GetValue() )); if( bUndo ) aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFBLUE ); } } break; case SID_ATTR_GRAF_LUMINANCE: { if( pItem ) { aSet.Put( SdrGrafLuminanceItem( static_cast(pItem)->GetValue() )); if( bUndo ) aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFLUMINANCE ); } } break; case SID_ATTR_GRAF_CONTRAST: { if( pItem ) { aSet.Put( SdrGrafContrastItem( static_cast(pItem)->GetValue() )); if( bUndo ) aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFCONTRAST ); } } break; case SID_ATTR_GRAF_GAMMA: { if( pItem ) { aSet.Put( SdrGrafGamma100Item( static_cast(pItem)->GetValue() )); if( bUndo ) aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFGAMMA ); } } break; case SID_ATTR_GRAF_TRANSPARENCE: { if( pItem ) { aSet.Put( SdrGrafTransparenceItem( static_cast(pItem)->GetValue() )); if( bUndo ) aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFTRANSPARENCY ); } } break; case SID_ATTR_GRAF_MODE: { if( pItem ) { aSet.Put( SdrGrafModeItem( static_cast(static_cast(pItem)->GetValue()) )); if( bUndo ) aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFMODE ); } } break; case SID_ATTR_GRAF_CROP: { const SdrMarkList& rMarkList = rView.GetMarkedObjectList(); if( 0 < rMarkList.GetMarkCount() ) { SdrGrafObj* pObj = static_cast( rMarkList.GetMark( 0 )->GetMarkedSdrObj() ); if( ( pObj->GetGraphicType() != GraphicType::NONE ) && ( pObj->GetGraphicType() != GraphicType::Default ) ) { SfxItemSetFixed aGrfAttr( rPool ); const MapUnit eOldMetric = rPool.GetMetric( 0 ); aGrfAttr.Put(pObj->GetMergedItemSet()); rPool.SetDefaultMetric( MapUnit::MapTwip ); SfxItemSetFixed< SDRATTR_GRAFCROP, SDRATTR_GRAFCROP, SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE, SID_ATTR_GRAF_CROP, SID_ATTR_GRAF_FRMSIZE, SID_ATTR_GRAF_GRAPHIC, SID_ATTR_GRAF_GRAPHIC> aCropDlgAttr(rPool); aCropDlgAttr.Put( SvxBrushItem( pObj->GetGraphic(), GPOS_MM, SID_ATTR_GRAF_GRAPHIC ) ); aCropDlgAttr.Put( SvxSizeItem( SID_ATTR_PAGE_SIZE, o3tl::convert(Size(200000, 200000), o3tl::Length::mm100, o3tl::Length::twip))); aCropDlgAttr.Put( SvxSizeItem( SID_ATTR_GRAF_FRMSIZE, o3tl::convert(pObj->GetLogicRect().GetSize(), o3tl::Length::mm100, o3tl::Length::twip))); const SdrGrafCropItem& rCrop = aGrfAttr.Get( SDRATTR_GRAFCROP ); Size aLTSize = o3tl::convert(Size(rCrop.GetLeft(), rCrop.GetTop()), o3tl::Length::mm100, o3tl::Length::twip); Size aRBSize = o3tl::convert(Size(rCrop.GetRight(), rCrop.GetBottom()), o3tl::Length::mm100, o3tl::Length::twip); aCropDlgAttr.Put( SdrGrafCropItem( aLTSize.Width(), aLTSize.Height(), aRBSize.Width(), aRBSize.Height() ) ); SfxViewShell* pCurrentSh = SfxViewShell::Current(); vcl::Window* pParent(pCurrentSh ? pCurrentSh->GetWindow() : nullptr); SfxSingleTabDialogController aCropDialog(pParent ? pParent->GetFrameWeld() : nullptr, &aCropDlgAttr); const OUString aCropStr(SvxResId(RID_SVXSTR_GRAFCROP)); SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create(); ::CreateTabPage fnCreatePage = pFact->GetTabPageCreatorFunc( RID_SVXPAGE_GRFCROP ); std::unique_ptr xTabPage = (*fnCreatePage)(aCropDialog.get_content_area(), &aCropDialog, &aCropDlgAttr); sal_Int32 nPreferredDPI = rView.getSdrModelFromSdrView().getImagePreferredDPI(); xTabPage->getAdditionalProperties().emplace("PreferredDPI", css::uno::Any(nPreferredDPI)); xTabPage->SetPageTitle(aCropStr); aCropDialog.SetTabPage(std::move(xTabPage)); if (aCropDialog.run() == RET_OK) { const SfxItemSet* pOutAttr = aCropDialog.GetOutputItemSet(); if( pOutAttr ) { aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFCROP ); // set crop attributes if( SfxItemState::SET <= pOutAttr->GetItemState( SDRATTR_GRAFCROP ) ) { const SdrGrafCropItem& rNewCrop = pOutAttr->Get( SDRATTR_GRAFCROP ); aLTSize = o3tl::convert(Size(rNewCrop.GetLeft(), rNewCrop.GetTop()), o3tl::Length::twip, o3tl::Length::mm100); aRBSize = o3tl::convert(Size(rNewCrop.GetRight(), rNewCrop.GetBottom()), o3tl::Length::twip, o3tl::Length::mm100); aSet.Put( SdrGrafCropItem( aLTSize.Width(), aLTSize.Height(), aRBSize.Width(), aRBSize.Height() ) ); } // set new logic rect if( SfxItemState::SET <= pOutAttr->GetItemState( SID_ATTR_GRAF_FRMSIZE ) ) { Point aNewOrigin( pObj->GetLogicRect().TopLeft() ); const Size& rGrfSize = pOutAttr->Get( SID_ATTR_GRAF_FRMSIZE ).GetSize(); Size aNewGrfSize = o3tl::convert(rGrfSize, o3tl::Length::twip, o3tl::Length::mm100); Size aOldGrfSize( pObj->GetLogicRect().GetSize() ); tools::Rectangle aNewRect( aNewOrigin, aNewGrfSize ); Point aOffset( (aNewGrfSize.Width() - aOldGrfSize.Width()) >> 1, (aNewGrfSize.Height() - aOldGrfSize.Height()) >> 1 ); // #106181# rotate snap rect before setting it const GeoStat& aGeo = pObj->GetGeoStat(); if (aGeo.m_nRotationAngle || aGeo.m_nShearAngle) { tools::Polygon aPol(aNewRect); // also transform origin offset if (aGeo.m_nShearAngle) { ShearPoly(aPol, aNewRect.TopLeft(), aGeo.mfTanShearAngle); ShearPoint(aOffset, Point(0,0), aGeo.mfTanShearAngle); } if (aGeo.m_nRotationAngle) { RotatePoly(aPol, aNewRect.TopLeft(), aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle); RotatePoint(aOffset, Point(0,0), aGeo.mfSinRotationAngle,aGeo.mfCosRotationAngle); } // apply offset aPol.Move( -aOffset.X(), -aOffset.Y() ); aNewRect=aPol.GetBoundRect(); } else { aNewRect.Move( -aOffset.X(), -aOffset.Y() ); } if( !aSet.Count() ) rView.SetMarkedObjRect( aNewRect ); else { if( bUndo ) { rView.BegUndo( aUndoStr ); rView.AddUndo(rView.GetModel().GetSdrUndoFactory().CreateUndoGeoObject(*pObj)); } pObj->SetSnapRect( aNewRect ); rView.SetAttributes( aSet ); if( bUndo ) rView.EndUndo(); aSet.ClearItem(); } } } } rPool.SetDefaultMetric( eOldMetric ); } } } break; case SID_COLOR_SETTINGS: { svx::ToolboxAccess aToolboxAccess( TOOLBOX_NAME ); aToolboxAccess.toggleToolbox(); rReq.Done(); break; } default: break; } if( aSet.Count() ) { if( bUndo ) rView.BegUndo( aUndoStr ); rView.SetAttributes( aSet ); if( bUndo ) rView.EndUndo(); } } void SvxGrafAttrHelper::GetGrafAttrState( SfxItemSet& rSet, SdrView const & rView ) { SfxItemPool& rPool = rView.GetModel().GetItemPool(); SfxItemSet aAttrSet( rPool ); SfxWhichIter aIter( rSet ); sal_uInt16 nWhich = aIter.FirstWhich(); const SdrMarkList& rMarkList = rView.GetMarkedObjectList(); bool bEnableColors = true; bool bEnableTransparency = true; bool bEnableCrop = ( 1 == rMarkList.GetMarkCount() ); for( size_t i = 0, nCount = rMarkList.GetMarkCount(); i < nCount; ++i ) { SdrGrafObj* pGrafObj = dynamic_cast< SdrGrafObj* >( rMarkList.GetMark( i )->GetMarkedSdrObj() ); if( !pGrafObj || ( pGrafObj->GetGraphicType() == GraphicType::NONE ) || ( pGrafObj->GetGraphicType() == GraphicType::Default )) { bEnableColors = bEnableTransparency = bEnableCrop = false; break; } else if( bEnableTransparency && ( pGrafObj->HasGDIMetaFile() || pGrafObj->IsAnimated() ) ) { bEnableTransparency = false; } } rView.GetAttributes( aAttrSet ); while( nWhich ) { sal_uInt16 nSlotId = SfxItemPool::IsWhich( nWhich ) ? rPool.GetSlotId( nWhich ) : nWhich; switch( nSlotId ) { case SID_ATTR_GRAF_MODE: { if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFMODE ) ) { if( bEnableColors ) { rSet.Put( SfxUInt16Item( nSlotId, sal::static_int_cast< sal_uInt16 >( aAttrSet.Get(SDRATTR_GRAFMODE).GetValue() ) ) ); } else { rSet.DisableItem( SID_ATTR_GRAF_MODE ); } } } break; case SID_ATTR_GRAF_RED: { if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFRED ) ) { if( bEnableColors ) { rSet.Put( SfxInt16Item( nSlotId, aAttrSet.Get(SDRATTR_GRAFRED).GetValue() ) ); } else { rSet.DisableItem( SID_ATTR_GRAF_RED ); } } } break; case SID_ATTR_GRAF_GREEN: { if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFGREEN ) ) { if( bEnableColors ) { rSet.Put( SfxInt16Item( nSlotId, aAttrSet.Get(SDRATTR_GRAFGREEN).GetValue()) ); } else { rSet.DisableItem( SID_ATTR_GRAF_GREEN ); } } } break; case SID_ATTR_GRAF_BLUE: { if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFBLUE ) ) { if( bEnableColors ) { rSet.Put( SfxInt16Item( nSlotId, aAttrSet.Get(SDRATTR_GRAFBLUE).GetValue()) ); } else { rSet.DisableItem( SID_ATTR_GRAF_BLUE ); } } } break; case SID_ATTR_GRAF_LUMINANCE: { if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFLUMINANCE ) ) { if( bEnableColors ) { rSet.Put( SfxInt16Item( nSlotId, aAttrSet.Get(SDRATTR_GRAFLUMINANCE).GetValue()) ); } else { rSet.DisableItem( SID_ATTR_GRAF_LUMINANCE ); } } } break; case SID_ATTR_GRAF_CONTRAST: { if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFCONTRAST ) ) { if( bEnableColors ) { rSet.Put( SfxInt16Item( nSlotId, aAttrSet.Get(SDRATTR_GRAFCONTRAST).GetValue()) ); } else { rSet.DisableItem( SID_ATTR_GRAF_CONTRAST ); } } } break; case SID_ATTR_GRAF_GAMMA: { if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFGAMMA ) ) { if( bEnableColors ) { rSet.Put( SfxUInt32Item( nSlotId, aAttrSet.Get(SDRATTR_GRAFGAMMA).GetValue() ) ); } else { rSet.DisableItem( SID_ATTR_GRAF_GAMMA ); } } } break; case SID_ATTR_GRAF_TRANSPARENCE: { if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFTRANSPARENCE ) ) { if( bEnableTransparency ) { rSet.Put( SfxUInt16Item( nSlotId, aAttrSet.Get(SDRATTR_GRAFTRANSPARENCE).GetValue() ) ); } else { rSet.DisableItem( SID_ATTR_GRAF_TRANSPARENCE ); } } } break; case SID_ATTR_GRAF_CROP: { if( !bEnableCrop ) rSet.DisableItem( nSlotId ); } break; case SID_COLOR_SETTINGS : { svx::ToolboxAccess aToolboxAccess( TOOLBOX_NAME ); rSet.Put( SfxBoolItem( nWhich, aToolboxAccess.isToolboxVisible() ) ); break; } default: break; } nWhich = aIter.NextWhich(); } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */