dd27fedb88
Use existing mechanism, delete sending in getter code which caused unnecessary work. Change-Id: Ibc191c16b95fd58e7065e019f48f3837cfed5bbd Reviewed-on: https://gerrit.libreoffice.org/84914 Reviewed-by: Szymon Kłos <szymon.klos@collabora.com> Tested-by: Szymon Kłos <szymon.klos@collabora.com>
1039 lines
33 KiB
C++
1039 lines
33 KiB
C++
/* -*- 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 <string>
|
|
|
|
#include <i18nutil/unicode.hxx>
|
|
#include <vcl/toolbox.hxx>
|
|
#include <vcl/field.hxx>
|
|
#include <vcl/fixed.hxx>
|
|
#include <vcl/idle.hxx>
|
|
#include <vcl/svapp.hxx>
|
|
#include <svl/intitem.hxx>
|
|
#include <svl/eitem.hxx>
|
|
#include <svl/whiter.hxx>
|
|
#include <sfx2/app.hxx>
|
|
#include <sfx2/dispatch.hxx>
|
|
#include <sfx2/objsh.hxx>
|
|
#include <sfx2/viewsh.hxx>
|
|
#include <sfx2/request.hxx>
|
|
#include <sfx2/basedlgs.hxx>
|
|
#include <tools/urlobj.hxx>
|
|
|
|
#include <svx/dialogs.hrc>
|
|
#include <svx/svxids.hrc>
|
|
#include <svx/strings.hrc>
|
|
#include <editeng/brushitem.hxx>
|
|
#include <editeng/sizeitem.hxx>
|
|
#include <svx/sdgcpitm.hxx>
|
|
|
|
#include <svx/itemwin.hxx>
|
|
#include <svx/dialmgr.hxx>
|
|
#include <svx/svdview.hxx>
|
|
#include <svx/svdmodel.hxx>
|
|
#include <svx/svdograf.hxx>
|
|
#include <svx/svdundo.hxx>
|
|
#include <svx/svdtrans.hxx>
|
|
#include <svx/grafctrl.hxx>
|
|
#include <svx/tbxcolor.hxx>
|
|
#include <svx/sdgcoitm.hxx>
|
|
#include <svx/sdggaitm.hxx>
|
|
#include <svx/sdgluitm.hxx>
|
|
#include <svx/sdgmoitm.hxx>
|
|
#include <svx/sdgtritm.hxx>
|
|
#include <bitmaps.hlst>
|
|
|
|
#include <com/sun/star/frame/XDispatchProvider.hpp>
|
|
|
|
#include <comphelper/lok.hxx>
|
|
#include <LibreOfficeKit/LibreOfficeKitEnums.h>
|
|
|
|
using namespace ::com::sun::star::uno;
|
|
using namespace ::com::sun::star::frame;
|
|
using namespace ::com::sun::star::util;
|
|
using namespace ::com::sun::star::beans;
|
|
using namespace ::com::sun::star::lang;
|
|
|
|
#include <svx/svxdlg.hxx>
|
|
|
|
#define SYMBOL_TO_FIELD_OFFSET 4
|
|
#define TOOLBOX_NAME "colorbar"
|
|
#define RID_SVXSTR_UNDO_GRAFCROP RID_SVXSTR_GRAFCROP
|
|
|
|
namespace {
|
|
|
|
class ImplGrafMetricField : public MetricField
|
|
{
|
|
using Window::Update;
|
|
|
|
private:
|
|
Idle maIdle;
|
|
OUString const maCommand;
|
|
Reference< XFrame > mxFrame;
|
|
|
|
DECL_LINK(ImplModifyHdl, Timer *, void);
|
|
|
|
protected:
|
|
|
|
virtual void Modify() override;
|
|
|
|
public:
|
|
ImplGrafMetricField( vcl::Window* pParent, const OUString& aCmd, const Reference< XFrame >& rFrame );
|
|
|
|
void Update( const SfxPoolItem* pItem );
|
|
};
|
|
|
|
}
|
|
|
|
ImplGrafMetricField::ImplGrafMetricField( vcl::Window* pParent, const OUString& rCmd, const Reference< XFrame >& rFrame ) :
|
|
MetricField( pParent, WB_BORDER | WB_SPIN | WB_REPEAT | WB_3DLOOK ),
|
|
maCommand( rCmd ),
|
|
mxFrame( rFrame )
|
|
{
|
|
Size aSize(CalcMinimumSizeForText(unicode::formatPercent(-100, Application::GetSettings().GetUILanguageTag())));
|
|
SetSizePixel(aSize);
|
|
|
|
if ( maCommand == ".uno:GrafGamma" )
|
|
{
|
|
SetDecimalDigits( 2 );
|
|
|
|
SetMin( 10 );
|
|
SetFirst( 10 );
|
|
SetMax( 1000 );
|
|
SetLast( 1000 );
|
|
SetSpinSize( 10 );
|
|
}
|
|
else
|
|
{
|
|
const long nMinVal = maCommand == ".uno:GrafTransparence" ? 0 : -100;
|
|
|
|
SetUnit(FieldUnit::PERCENT);
|
|
SetDecimalDigits( 0 );
|
|
|
|
SetMin( nMinVal );
|
|
SetFirst( nMinVal );
|
|
SetMax( 100 );
|
|
SetLast( 100 );
|
|
SetSpinSize( 1 );
|
|
}
|
|
|
|
maIdle.SetInvokeHandler( LINK( this, ImplGrafMetricField, ImplModifyHdl ) );
|
|
}
|
|
|
|
void ImplGrafMetricField::Modify()
|
|
{
|
|
maIdle.Start();
|
|
}
|
|
|
|
IMPL_LINK_NOARG(ImplGrafMetricField, ImplModifyHdl, Timer *, void)
|
|
{
|
|
const sal_Int64 nVal = GetValue();
|
|
|
|
// 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() )
|
|
{
|
|
INetURLObject aObj( maCommand );
|
|
|
|
Sequence< PropertyValue > aArgs( 1 );
|
|
aArgs[0].Name = aObj.GetURLPath();
|
|
aArgs[0].Value = a;
|
|
|
|
SfxToolBoxControl::Dispatch(
|
|
Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
|
|
maCommand,
|
|
aArgs );
|
|
}
|
|
}
|
|
|
|
void ImplGrafMetricField::Update( const SfxPoolItem* pItem )
|
|
{
|
|
if( pItem )
|
|
{
|
|
long nValue;
|
|
|
|
if ( maCommand == ".uno:GrafTransparence" )
|
|
nValue = static_cast<const SfxUInt16Item*>( pItem )->GetValue();
|
|
else if ( maCommand == ".uno:GrafGamma" )
|
|
nValue = static_cast<const SfxUInt32Item*>( pItem )->GetValue();
|
|
else
|
|
nValue = static_cast<const SfxInt16Item*>( pItem )->GetValue();
|
|
|
|
SetValue( nValue );
|
|
}
|
|
else
|
|
SetText( OUString() );
|
|
}
|
|
|
|
namespace {
|
|
|
|
struct CommandToRID
|
|
{
|
|
const char* pCommand;
|
|
const char* sResId;
|
|
};
|
|
|
|
}
|
|
|
|
static OUString ImplGetRID( const OUString& aCommand )
|
|
{
|
|
static const 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, "" }
|
|
};
|
|
|
|
OUString sRID;
|
|
|
|
sal_Int32 i( 0 );
|
|
while ( aImplCommandToResMap[ i ].pCommand )
|
|
{
|
|
if ( aCommand.equalsAscii( aImplCommandToResMap[ i ].pCommand ))
|
|
{
|
|
sRID = OUString::createFromAscii(aImplCommandToResMap[i].sResId);
|
|
break;
|
|
}
|
|
++i;
|
|
}
|
|
|
|
return sRID;
|
|
}
|
|
|
|
namespace {
|
|
|
|
class ImplGrafControl : public Control
|
|
{
|
|
using Window::Update;
|
|
private:
|
|
VclPtr<FixedImage> maImage;
|
|
VclPtr<ImplGrafMetricField> maField;
|
|
|
|
protected:
|
|
|
|
virtual void GetFocus() override;
|
|
|
|
public:
|
|
|
|
ImplGrafControl( vcl::Window* pParent, const OUString& rCmd, const Reference< XFrame >& rFrame );
|
|
virtual ~ImplGrafControl() override;
|
|
virtual void dispose() override;
|
|
|
|
void Update( const SfxPoolItem* pItem ) { maField->Update( pItem ); }
|
|
void SetText( const OUString& rStr ) override { maField->SetText( rStr ); }
|
|
virtual void Resize() override;
|
|
};
|
|
|
|
}
|
|
|
|
ImplGrafControl::ImplGrafControl(
|
|
vcl::Window* pParent,
|
|
const OUString& rCmd,
|
|
const Reference< XFrame >& rFrame
|
|
) : Control( pParent, WB_TABSTOP )
|
|
, maImage( VclPtr<FixedImage>::Create(this) )
|
|
, maField( VclPtr<ImplGrafMetricField>::Create(this, rCmd, rFrame) )
|
|
{
|
|
OUString sResId(ImplGetRID(rCmd));
|
|
BitmapEx aBitmapEx(sResId);
|
|
|
|
Size aImgSize(aBitmapEx.GetSizePixel());
|
|
Size aFldSize(maField->GetSizePixel());
|
|
long nFldY, nImgY;
|
|
|
|
maImage->SetImage(Image(aBitmapEx));
|
|
maImage->SetSizePixel( aImgSize );
|
|
// we want to see the background of the toolbox, not of the FixedImage or Control
|
|
maImage->SetBackground( Wallpaper( COL_TRANSPARENT ) );
|
|
SetBackground( Wallpaper( COL_TRANSPARENT ) );
|
|
|
|
if( aImgSize.Height() > aFldSize.Height() )
|
|
{
|
|
nImgY = 0;
|
|
nFldY = ( aImgSize.Height() - aFldSize.Height() ) >> 1;
|
|
}
|
|
else
|
|
{
|
|
nFldY = 0;
|
|
nImgY = ( aFldSize.Height() - aImgSize.Height() ) >> 1;
|
|
}
|
|
|
|
long nOffset = SYMBOL_TO_FIELD_OFFSET / 2;
|
|
maImage->SetPosPixel( Point( nOffset, nImgY ) );
|
|
maField->SetPosPixel( Point( aImgSize.Width() + SYMBOL_TO_FIELD_OFFSET, nFldY ) );
|
|
SetSizePixel( Size( aImgSize.Width() + aFldSize.Width() + SYMBOL_TO_FIELD_OFFSET + nOffset,
|
|
std::max( aImgSize.Height(), aFldSize.Height() ) ) );
|
|
|
|
SetBackground( Wallpaper() ); // transparent background
|
|
|
|
maImage->Show();
|
|
|
|
maField->SetHelpId( OUStringToOString( rCmd, RTL_TEXTENCODING_UTF8 ) );
|
|
maField->Show();
|
|
}
|
|
|
|
ImplGrafControl::~ImplGrafControl()
|
|
{
|
|
disposeOnce();
|
|
}
|
|
|
|
void ImplGrafControl::dispose()
|
|
{
|
|
maImage.disposeAndClear();
|
|
maField.disposeAndClear();
|
|
Control::dispose();
|
|
}
|
|
|
|
void ImplGrafControl::GetFocus()
|
|
{
|
|
if (maField)
|
|
maField->GrabFocus();
|
|
}
|
|
|
|
void ImplGrafControl::Resize()
|
|
{
|
|
Size aFldSize(maField->GetSizePixel());
|
|
aFldSize.setWidth( GetSizePixel().Width() - SYMBOL_TO_FIELD_OFFSET - maImage->GetSizePixel().Width() );
|
|
maField->SetSizePixel(aFldSize);
|
|
|
|
Control::Resize();
|
|
}
|
|
|
|
namespace {
|
|
|
|
class ImplGrafModeControl : public ListBox
|
|
{
|
|
using Window::Update;
|
|
private:
|
|
sal_uInt16 mnCurPos;
|
|
Reference< XFrame > mxFrame;
|
|
|
|
virtual void Select() override;
|
|
virtual bool PreNotify( NotifyEvent& rNEvt ) override;
|
|
virtual bool EventNotify( NotifyEvent& rNEvt ) override;
|
|
static void ImplReleaseFocus();
|
|
|
|
public:
|
|
ImplGrafModeControl( vcl::Window* pParent, const Reference< XFrame >& rFrame );
|
|
|
|
void Update( const SfxPoolItem* pItem );
|
|
};
|
|
|
|
}
|
|
|
|
ImplGrafModeControl::ImplGrafModeControl( vcl::Window* pParent, const Reference< XFrame >& rFrame ) :
|
|
ListBox( pParent, WB_BORDER | WB_DROPDOWN | WB_AUTOHSCROLL ),
|
|
mnCurPos( 0 ),
|
|
mxFrame( rFrame )
|
|
{
|
|
SetSizePixel( Size( 100, 260 ) );
|
|
|
|
InsertEntry( SvxResId( RID_SVXSTR_GRAFMODE_STANDARD ) );
|
|
InsertEntry( SvxResId( RID_SVXSTR_GRAFMODE_GREYS ) );
|
|
InsertEntry( SvxResId( RID_SVXSTR_GRAFMODE_MONO ) );
|
|
InsertEntry( SvxResId( RID_SVXSTR_GRAFMODE_WATERMARK ) );
|
|
|
|
Show();
|
|
}
|
|
|
|
void ImplGrafModeControl::Select()
|
|
{
|
|
if ( !IsTravelSelect() )
|
|
{
|
|
Sequence< PropertyValue > aArgs( 1 );
|
|
aArgs[0].Name = "GrafMode";
|
|
aArgs[0].Value <<= sal_Int16( GetSelectedEntryPos() );
|
|
|
|
/* #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 ),
|
|
".uno:GrafMode",
|
|
aArgs );
|
|
}
|
|
}
|
|
|
|
bool ImplGrafModeControl::PreNotify( NotifyEvent& rNEvt )
|
|
{
|
|
MouseNotifyEvent nType = rNEvt.GetType();
|
|
|
|
if( MouseNotifyEvent::MOUSEBUTTONDOWN == nType || MouseNotifyEvent::GETFOCUS == nType )
|
|
mnCurPos = GetSelectedEntryPos();
|
|
|
|
return ListBox::PreNotify( rNEvt );
|
|
}
|
|
|
|
bool ImplGrafModeControl::EventNotify( NotifyEvent& rNEvt )
|
|
{
|
|
bool bHandled = ListBox::EventNotify( rNEvt );
|
|
|
|
if( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
|
|
{
|
|
const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
|
|
|
|
switch( pKEvt->GetKeyCode().GetCode() )
|
|
{
|
|
case KEY_RETURN:
|
|
{
|
|
Select();
|
|
bHandled = true;
|
|
}
|
|
break;
|
|
|
|
case KEY_ESCAPE:
|
|
{
|
|
SelectEntryPos( mnCurPos );
|
|
ImplReleaseFocus();
|
|
bHandled = true;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return bHandled;
|
|
}
|
|
|
|
void ImplGrafModeControl::ImplReleaseFocus()
|
|
{
|
|
if( SfxViewShell::Current() )
|
|
{
|
|
vcl::Window* pShellWnd = SfxViewShell::Current()->GetWindow();
|
|
|
|
if( pShellWnd )
|
|
pShellWnd->GrabFocus();
|
|
}
|
|
}
|
|
|
|
void ImplGrafModeControl::Update( const SfxPoolItem* pItem )
|
|
{
|
|
if( pItem )
|
|
SelectEntryPos( static_cast<const SfxUInt16Item*>(pItem)->GetValue() );
|
|
else
|
|
SetNoSelection();
|
|
}
|
|
|
|
SvxGrafToolBoxControl::SvxGrafToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx) :
|
|
SfxToolBoxControl( nSlotId, nId, rTbx )
|
|
{
|
|
rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWN | rTbx.GetItemBits( nId ) );
|
|
rTbx.Invalidate();
|
|
}
|
|
|
|
SvxGrafToolBoxControl::~SvxGrafToolBoxControl()
|
|
{
|
|
}
|
|
|
|
void SvxGrafToolBoxControl::StateChanged( sal_uInt16, SfxItemState eState, const SfxPoolItem* pState )
|
|
|
|
{
|
|
ImplGrafControl* pCtrl = static_cast<ImplGrafControl*>( GetToolBox().GetItemWindow( GetId() ) );
|
|
DBG_ASSERT( pCtrl, "Control not found" );
|
|
|
|
if( eState == SfxItemState::DISABLED )
|
|
{
|
|
pCtrl->Disable();
|
|
pCtrl->SetText( OUString() );
|
|
}
|
|
else
|
|
{
|
|
pCtrl->Enable();
|
|
|
|
if( eState == SfxItemState::DEFAULT )
|
|
pCtrl->Update( pState );
|
|
else
|
|
pCtrl->Update( nullptr );
|
|
}
|
|
}
|
|
|
|
VclPtr<vcl::Window> SvxGrafToolBoxControl::CreateItemWindow( vcl::Window *pParent )
|
|
{
|
|
return VclPtr<ImplGrafControl>::Create( pParent, m_aCommandURL, m_xFrame ).get();
|
|
}
|
|
|
|
SFX_IMPL_TOOLBOX_CONTROL( SvxGrafRedToolBoxControl, SfxInt16Item );
|
|
|
|
SvxGrafRedToolBoxControl::SvxGrafRedToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
|
|
SvxGrafToolBoxControl( nSlotId, nId, rTbx )
|
|
{
|
|
}
|
|
|
|
SFX_IMPL_TOOLBOX_CONTROL( SvxGrafGreenToolBoxControl, SfxInt16Item );
|
|
|
|
SvxGrafGreenToolBoxControl::SvxGrafGreenToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
|
|
SvxGrafToolBoxControl( nSlotId, nId, rTbx )
|
|
{
|
|
}
|
|
|
|
SFX_IMPL_TOOLBOX_CONTROL( SvxGrafBlueToolBoxControl, SfxInt16Item );
|
|
|
|
SvxGrafBlueToolBoxControl::SvxGrafBlueToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
|
|
SvxGrafToolBoxControl( nSlotId, nId, rTbx )
|
|
{
|
|
}
|
|
|
|
SFX_IMPL_TOOLBOX_CONTROL( SvxGrafLuminanceToolBoxControl, SfxInt16Item );
|
|
|
|
SvxGrafLuminanceToolBoxControl::SvxGrafLuminanceToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
|
|
SvxGrafToolBoxControl( nSlotId, nId, rTbx )
|
|
{
|
|
}
|
|
|
|
SFX_IMPL_TOOLBOX_CONTROL( SvxGrafContrastToolBoxControl, SfxInt16Item );
|
|
|
|
SvxGrafContrastToolBoxControl::SvxGrafContrastToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
|
|
SvxGrafToolBoxControl( nSlotId, nId, rTbx )
|
|
{
|
|
}
|
|
|
|
SFX_IMPL_TOOLBOX_CONTROL( SvxGrafGammaToolBoxControl, SfxUInt32Item );
|
|
|
|
SvxGrafGammaToolBoxControl::SvxGrafGammaToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
|
|
SvxGrafToolBoxControl( nSlotId, nId, rTbx )
|
|
{
|
|
}
|
|
|
|
SFX_IMPL_TOOLBOX_CONTROL( SvxGrafTransparenceToolBoxControl, SfxUInt16Item );
|
|
|
|
SvxGrafTransparenceToolBoxControl::SvxGrafTransparenceToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
|
|
SvxGrafToolBoxControl( nSlotId, nId, rTbx )
|
|
{
|
|
}
|
|
|
|
SFX_IMPL_TOOLBOX_CONTROL( SvxGrafModeToolBoxControl, SfxUInt16Item );
|
|
|
|
SvxGrafModeToolBoxControl::SvxGrafModeToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
|
|
SfxToolBoxControl( nSlotId, nId, rTbx )
|
|
{
|
|
}
|
|
|
|
SvxGrafModeToolBoxControl::~SvxGrafModeToolBoxControl()
|
|
{
|
|
}
|
|
|
|
void SvxGrafModeToolBoxControl::StateChanged( sal_uInt16, SfxItemState eState, const SfxPoolItem* pState )
|
|
|
|
{
|
|
ImplGrafModeControl* pCtrl = static_cast<ImplGrafModeControl*>( GetToolBox().GetItemWindow( GetId() ) );
|
|
DBG_ASSERT( pCtrl, "Control not found" );
|
|
|
|
if( eState == SfxItemState::DISABLED )
|
|
{
|
|
pCtrl->Disable();
|
|
pCtrl->SetText( OUString() );
|
|
}
|
|
else
|
|
{
|
|
pCtrl->Enable();
|
|
|
|
if( eState == SfxItemState::DEFAULT )
|
|
pCtrl->Update( pState );
|
|
else
|
|
pCtrl->Update( nullptr );
|
|
}
|
|
}
|
|
|
|
VclPtr<vcl::Window> SvxGrafModeToolBoxControl::CreateItemWindow( vcl::Window *pParent )
|
|
{
|
|
return VclPtr<ImplGrafModeControl>::Create( pParent, m_xFrame ).get();
|
|
}
|
|
|
|
void SvxGrafAttrHelper::ExecuteGrafAttr( SfxRequest& rReq, SdrView& rView )
|
|
{
|
|
SfxItemPool& rPool = rView.GetModel()->GetItemPool();
|
|
SfxItemSet aSet( rPool, svl::Items<SDRATTR_GRAF_FIRST, SDRATTR_GRAF_LAST>{} );
|
|
OUString aUndoStr;
|
|
const bool bUndo = rView.IsUndoEnabled();
|
|
|
|
if( bUndo )
|
|
{
|
|
aUndoStr = rView.GetDescriptionOfMarkedObjects() + " ";
|
|
}
|
|
|
|
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<const SfxInt16Item*>(pItem)->GetValue() ));
|
|
if( bUndo )
|
|
aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFRED );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case SID_ATTR_GRAF_GREEN:
|
|
{
|
|
if( pItem )
|
|
{
|
|
aSet.Put( SdrGrafGreenItem( static_cast<const SfxInt16Item*>(pItem)->GetValue() ));
|
|
if( bUndo )
|
|
aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFGREEN );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case SID_ATTR_GRAF_BLUE:
|
|
{
|
|
if( pItem )
|
|
{
|
|
aSet.Put( SdrGrafBlueItem( static_cast<const SfxInt16Item*>(pItem)->GetValue() ));
|
|
if( bUndo )
|
|
aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFBLUE );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case SID_ATTR_GRAF_LUMINANCE:
|
|
{
|
|
if( pItem )
|
|
{
|
|
aSet.Put( SdrGrafLuminanceItem( static_cast<const SfxInt16Item*>(pItem)->GetValue() ));
|
|
if( bUndo )
|
|
aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFLUMINANCE );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case SID_ATTR_GRAF_CONTRAST:
|
|
{
|
|
if( pItem )
|
|
{
|
|
aSet.Put( SdrGrafContrastItem( static_cast<const SfxInt16Item*>(pItem)->GetValue() ));
|
|
if( bUndo )
|
|
aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFCONTRAST );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case SID_ATTR_GRAF_GAMMA:
|
|
{
|
|
if( pItem )
|
|
{
|
|
aSet.Put( SdrGrafGamma100Item( static_cast<const SfxUInt32Item*>(pItem)->GetValue() ));
|
|
if( bUndo )
|
|
aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFGAMMA );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case SID_ATTR_GRAF_TRANSPARENCE:
|
|
{
|
|
if( pItem )
|
|
{
|
|
aSet.Put( SdrGrafTransparenceItem( static_cast<const SfxUInt16Item*>(pItem)->GetValue() ));
|
|
if( bUndo )
|
|
aUndoStr += SvxResId( RID_SVXSTR_UNDO_GRAFTRANSPARENCY );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case SID_ATTR_GRAF_MODE:
|
|
{
|
|
if( pItem )
|
|
{
|
|
aSet.Put( SdrGrafModeItem( static_cast<GraphicDrawMode>(static_cast<const SfxUInt16Item*>(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<SdrGrafObj*>( rMarkList.GetMark( 0 )->GetMarkedSdrObj() );
|
|
|
|
if( ( pObj->GetGraphicType() != GraphicType::NONE ) &&
|
|
( pObj->GetGraphicType() != GraphicType::Default ) )
|
|
{
|
|
SfxItemSet aGrfAttr( rPool, svl::Items<SDRATTR_GRAFCROP, SDRATTR_GRAFCROP>{} );
|
|
const MapUnit eOldMetric = rPool.GetMetric( 0 );
|
|
const MapMode aMap100( MapUnit::Map100thMM );
|
|
const MapMode aMapTwip( MapUnit::MapTwip );
|
|
|
|
aGrfAttr.Put(pObj->GetMergedItemSet());
|
|
rPool.SetDefaultMetric( MapUnit::MapTwip );
|
|
|
|
SfxItemSet aCropDlgAttr(
|
|
rPool,
|
|
svl::Items<
|
|
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.Put( SvxBrushItem( pObj->GetGraphic(), GPOS_MM, SID_ATTR_GRAF_GRAPHIC ) );
|
|
aCropDlgAttr.Put( SvxSizeItem( SID_ATTR_PAGE_SIZE,
|
|
OutputDevice::LogicToLogic(
|
|
Size( 200000, 200000 ), aMap100, aMapTwip ) ) );
|
|
aCropDlgAttr.Put( SvxSizeItem( SID_ATTR_GRAF_FRMSIZE, OutputDevice::LogicToLogic(
|
|
pObj->GetLogicRect().GetSize(), aMap100, aMapTwip ) ) );
|
|
|
|
const SdrGrafCropItem& rCrop = aGrfAttr.Get( SDRATTR_GRAFCROP );
|
|
Size aLTSize( OutputDevice::LogicToLogic(
|
|
Size( rCrop.GetLeft(), rCrop.GetTop() ), aMap100, aMapTwip ) );
|
|
Size aRBSize( OutputDevice::LogicToLogic(
|
|
Size( rCrop.GetRight(), rCrop.GetBottom() ), aMap100, aMapTwip ) );
|
|
|
|
aCropDlgAttr.Put( SdrGrafCropItem( aLTSize.Width(), aLTSize.Height(),
|
|
aRBSize.Width(), aRBSize.Height() ) );
|
|
|
|
vcl::Window* pParent(SfxViewShell::Current() ? SfxViewShell::Current()->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<SfxTabPage> xTabPage = (*fnCreatePage)(aCropDialog.get_content_area(), &aCropDialog, &aCropDlgAttr);
|
|
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 = OutputDevice::LogicToLogic( Size( rNewCrop.GetLeft(), rNewCrop.GetTop() ), aMapTwip, aMap100 );
|
|
aRBSize = OutputDevice::LogicToLogic( Size( rNewCrop.GetRight(), rNewCrop.GetBottom() ), aMapTwip, aMap100 );
|
|
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 = static_cast<const SvxSizeItem&>( pOutAttr->Get( SID_ATTR_GRAF_FRMSIZE ) ).GetSize();
|
|
Size aNewGrfSize( OutputDevice::LogicToLogic( rGrfSize, aMapTwip, aMap100 ) );
|
|
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.nRotationAngle!=0 || aGeo.nShearAngle!=0)
|
|
{
|
|
tools::Polygon aPol(aNewRect);
|
|
|
|
// also transform origin offset
|
|
if (aGeo.nShearAngle!=0)
|
|
{
|
|
ShearPoly(aPol,
|
|
aNewRect.TopLeft(),
|
|
aGeo.nTan);
|
|
ShearPoint(aOffset, Point(0,0), aGeo.nTan);
|
|
}
|
|
if (aGeo.nRotationAngle!=0)
|
|
{
|
|
RotatePoly(aPol,
|
|
aNewRect.TopLeft(),
|
|
aGeo.nSin,aGeo.nCos);
|
|
RotatePoint(aOffset, Point(0,0), aGeo.nSin,aGeo.nCos);
|
|
}
|
|
|
|
// 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: */
|