1
0
Fork 0
libreoffice/sd/source/ui/controller/displaymodecontroller.cxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

264 lines
8.8 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/.
*/
#include <svtools/popupwindowcontroller.hxx>
#include <svtools/toolbarmenu.hxx>
#include <svtools/valueset.hxx>
#include <vcl/toolbox.hxx>
#include <strings.hrc>
#include <bitmaps.hlst>
#include <sdresid.hxx>
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::beans;
namespace sd
{
// Component to select which display mode has to be used.
// Composed of a dropdown button in the toolbar and a
// popup menu to select the value
namespace {
class DisplayModeController : public svt::PopupWindowController
{
public:
explicit DisplayModeController( const css::uno::Reference< css::uno::XComponentContext >& rxContext );
virtual std::unique_ptr<WeldToolbarPopup> weldPopupWindow() override;
virtual VclPtr<vcl::Window> createVclPopupWindow( vcl::Window* pParent ) override;
// XInitialization
virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override;
// XServiceInfo
virtual OUString SAL_CALL getImplementationName() override;
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
void setToolboxItemImage(const OUString& rImage);
};
class DisplayModeToolbarMenu final : public WeldToolbarPopup
{
public:
DisplayModeToolbarMenu(DisplayModeController* pControl, weld::Widget* pParent);
virtual void GrabFocus() override
{
mxDisplayModeSet1->GrabFocus();
}
private:
rtl::Reference<DisplayModeController> mxControl;
std::unique_ptr<weld::Frame> mxFrame1;
std::unique_ptr<ValueSet> mxDisplayModeSet1;
std::unique_ptr<weld::CustomWeld> mxDisplayModeSetWin1;
std::unique_ptr<weld::Frame> mxFrame2;
std::unique_ptr<ValueSet> mxDisplayModeSet2;
std::unique_ptr<weld::CustomWeld> mxDisplayModeSetWin2;
DECL_LINK(SelectValueSetHdl, ValueSet*, void);
};
struct snew_slide_value_info
{
sal_uInt16 mnId;
OUString msBmpResId;
TranslateId mpStrResId;
const char* msUnoCommand;
};
}
const snew_slide_value_info editmodes[] =
{
{1,
BMP_DISPLAYMODE_SLIDE,
STR_NORMAL_MODE,
".uno:NormalMultiPaneGUI" },
{2,
BMP_DISPLAYMODE_OUTLINE,
STR_OUTLINE_MODE,
".uno:OutlineMode" },
{3,
BMP_DISPLAYMODE_NOTES,
STR_NOTES_MODE,
".uno:NotesMode" },
{4,
BMP_DISPLAYMODE_SLIDE_SORTER,
STR_SLIDE_SORTER_MODE,
".uno:DiaMode" },
{0, u""_ustr, {}, "" }
};
const snew_slide_value_info mastermodes[] =
{
{5,
BMP_DISPLAYMODE_SLIDE_MASTER,
STR_SLIDE_MASTER_MODE,
".uno:SlideMasterPage" },
{6,
BMP_DISPLAYMODE_NOTES_MASTER,
STR_NOTES_MASTER_MODE,
".uno:NotesMasterPage" },
{7,
BMP_DISPLAYMODE_HANDOUT_MASTER,
STR_HANDOUT_MASTER_MODE,
".uno:HandoutMode" },
{0, u""_ustr, {}, "" }
};
static void fillLayoutValueSet(ValueSet* pValue, const snew_slide_value_info* pInfo)
{
Size aLayoutItemSize;
for( ; pInfo->mnId; pInfo++ )
{
OUString aText(SdResId(pInfo->mpStrResId));
BitmapEx aBmp(pInfo->msBmpResId);
pValue->InsertItem(pInfo->mnId, Image(aBmp), aText);
aLayoutItemSize.setWidth( std::max( aLayoutItemSize.Width(), aBmp.GetSizePixel().Width() ) );
aLayoutItemSize.setHeight( std::max( aLayoutItemSize.Height(), aBmp.GetSizePixel().Height() ) );
}
aLayoutItemSize = pValue->CalcItemSizePixel( aLayoutItemSize );
Size aSize(pValue->CalcWindowSizePixel(aLayoutItemSize));
const sal_Int32 LAYOUT_BORDER_PIX = 7;
aSize.AdjustWidth((pValue->GetColCount() + 1) * LAYOUT_BORDER_PIX );
aSize.AdjustHeight((pValue->GetLineCount() +1) * LAYOUT_BORDER_PIX );
pValue->GetDrawingArea()->set_size_request(aSize.Width(), aSize.Height());
pValue->SetOutputSizePixel(aSize);
}
DisplayModeToolbarMenu::DisplayModeToolbarMenu(DisplayModeController* pControl, weld::Widget* pParent)
: WeldToolbarPopup(pControl->getFrameInterface(), pParent, u"modules/simpress/ui/displaywindow.ui"_ustr, u"DisplayWindow"_ustr)
, mxControl(pControl)
, mxFrame1(m_xBuilder->weld_frame(u"editframe"_ustr))
, mxDisplayModeSet1(new ValueSet(nullptr))
, mxDisplayModeSetWin1(new weld::CustomWeld(*m_xBuilder, u"valueset1"_ustr, *mxDisplayModeSet1))
, mxFrame2(m_xBuilder->weld_frame(u"masterframe"_ustr))
, mxDisplayModeSet2(new ValueSet(nullptr))
, mxDisplayModeSetWin2(new weld::CustomWeld(*m_xBuilder, u"valueset2"_ustr, *mxDisplayModeSet2))
{
mxDisplayModeSet1->SetStyle(WB_TABSTOP | WB_MENUSTYLEVALUESET | WB_FLATVALUESET | WB_NOBORDER | WB_NO_DIRECTSELECT);
mxDisplayModeSet1->SetStyle(WB_TABSTOP | WB_MENUSTYLEVALUESET | WB_FLATVALUESET | WB_NOBORDER | WB_NO_DIRECTSELECT);
mxDisplayModeSet1->SetSelectHdl( LINK( this, DisplayModeToolbarMenu, SelectValueSetHdl ) );
mxDisplayModeSet2->SetSelectHdl( LINK( this, DisplayModeToolbarMenu, SelectValueSetHdl ) );
sal_Int16 nColCount = 2;
mxDisplayModeSet1->SetColCount( nColCount );
fillLayoutValueSet( mxDisplayModeSet1.get(), &editmodes[0] );
mxDisplayModeSet2->SetColCount( nColCount );
fillLayoutValueSet( mxDisplayModeSet2.get(), &mastermodes[0] );
}
IMPL_LINK( DisplayModeToolbarMenu, SelectValueSetHdl, ValueSet*, pControl, void )
{
OUString sCommandURL;
OUString sImage;
if( pControl == mxDisplayModeSet1.get() ) {
sCommandURL = OUString::createFromAscii(editmodes[mxDisplayModeSet1->GetSelectedItemId() - 1 ].msUnoCommand);
sImage = editmodes[mxDisplayModeSet1->GetSelectedItemId() - 1 ].msBmpResId;
}
else if( pControl == mxDisplayModeSet2.get() ) {
sCommandURL = OUString::createFromAscii(mastermodes[mxDisplayModeSet2->GetSelectedItemId() - 5 ].msUnoCommand);
sImage = mastermodes[mxDisplayModeSet2->GetSelectedItemId() - 5 ].msBmpResId;
}
if (!sCommandURL.isEmpty())
mxControl->dispatchCommand( sCommandURL, Sequence< PropertyValue >() );
mxControl->setToolboxItemImage(sImage);
mxControl->EndPopupMode();
}
DisplayModeController::DisplayModeController( const css::uno::Reference< css::uno::XComponentContext >& rxContext )
: svt::PopupWindowController( rxContext, Reference< frame::XFrame >(), OUString() )
{
}
void SAL_CALL DisplayModeController::initialize( const css::uno::Sequence< css::uno::Any >& aArguments )
{
svt::PopupWindowController::initialize( aArguments );
ToolBox* pToolBox = nullptr;
ToolBoxItemId nId;
if ( getToolboxId( nId, &pToolBox ) )
pToolBox->SetItemBits( nId, pToolBox->GetItemBits( nId ) | ToolBoxItemBits::DROPDOWNONLY );
setToolboxItemImage(BMP_DISPLAYMODE_SLIDE);
}
std::unique_ptr<WeldToolbarPopup> DisplayModeController::weldPopupWindow()
{
return std::make_unique<sd::DisplayModeToolbarMenu>(this, m_pToolbar);
}
VclPtr<vcl::Window> DisplayModeController::createVclPopupWindow( vcl::Window* pParent )
{
mxInterimPopover = VclPtr<InterimToolbarPopup>::Create(getFrameInterface(), pParent,
std::make_unique<sd::DisplayModeToolbarMenu>(this, pParent->GetFrameWeld()));
mxInterimPopover->Show();
return mxInterimPopover;
}
void DisplayModeController::setToolboxItemImage(const OUString& rImage)
{
ToolBoxItemId nId;
ToolBox* pToolBox = nullptr;
if (!getToolboxId( nId, &pToolBox ))
return;
BitmapEx aBmp(rImage);
int targetSize = (pToolBox->GetToolboxButtonSize() == ToolBoxButtonSize::Large) ? 32 : 16;
double scale = 1.0f;
Size size = aBmp.GetSizePixel();
if (size.Width() > targetSize)
scale = static_cast<double>(targetSize) / static_cast<double>(size.Width());
if (size.Height() > targetSize)
scale = ::std::min( scale, static_cast<double>(targetSize) / static_cast<double>(size.Height()) );
aBmp.Scale( scale, scale );
pToolBox->SetItemImage( nId, Image( aBmp ) );
}
// XServiceInfo
OUString SAL_CALL DisplayModeController::getImplementationName()
{
return u"com.sun.star.comp.sd.DisplayModeController"_ustr;
}
Sequence< OUString > SAL_CALL DisplayModeController::getSupportedServiceNames( )
{
css::uno::Sequence<OUString> aRet { u"com.sun.star.frame.ToolbarController"_ustr };
return aRet;
}
}
extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
com_sun_star_comp_sd_DisplayModeController_get_implementation( css::uno::XComponentContext* context,
css::uno::Sequence<css::uno::Any> const &)
{
return cppu::acquire(new sd::DisplayModeController(context));
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */