1
0
Fork 0
libreoffice/cui/source/inc/cfg.hxx
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

677 lines
23 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 .
*/
#pragma once
#include <vcl/timer.hxx>
#include <vcl/weld.hxx>
#include <vcl/weldutils.hxx>
#include <svtools/valueset.hxx>
#include <com/sun/star/container/XIndexContainer.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/ui/XUIConfigurationManager.hpp>
#include <com/sun/star/ui/XImageManager.hpp>
#include <com/sun/star/graphic/XGraphicProvider.hpp>
#include <com/sun/star/frame/XFrame.hpp>
#include <com/sun/star/lang/XSingleComponentFactory.hpp>
#include <sfx2/tabdlg.hxx>
#include <memory>
#include <string_view>
#include <vector>
#include "cfgutil.hxx"
#include "CommandCategoryListBox.hxx"
inline constexpr OUString notebookbarTabScope = u"notebookbarTabScope"_ustr;
inline constexpr OUString ITEM_DESCRIPTOR_COMMANDURL = u"CommandURL"_ustr;
inline constexpr OUString ITEM_DESCRIPTOR_CONTAINER = u"ItemDescriptorContainer"_ustr;
inline constexpr OUString ITEM_DESCRIPTOR_LABEL = u"Label"_ustr;
inline constexpr OUString ITEM_DESCRIPTOR_TYPE = u"Type"_ustr;
inline constexpr OUString ITEM_DESCRIPTOR_STYLE = u"Style"_ustr;
inline constexpr OUString ITEM_DESCRIPTOR_ISVISIBLE = u"IsVisible"_ustr;
inline constexpr OUString ITEM_DESCRIPTOR_RESOURCEURL = u"ResourceURL"_ustr;
inline constexpr OUString ITEM_DESCRIPTOR_UINAME = u"UIName"_ustr;
inline constexpr OUString ITEM_MENUBAR_URL = u"private:resource/menubar/menubar"_ustr;
inline constexpr OUString ITEM_TOOLBAR_URL = u"private:resource/toolbar/"_ustr;
inline constexpr OUString ITEM_EVENT_URL = u"private:resource/event/"_ustr;
inline constexpr OUString CUSTOM_TOOLBAR_STR = u"custom_toolbar_"_ustr;
inline constexpr OUString aMenuSeparatorStr = u" | "_ustr;
class SvxConfigEntry;
class SvxConfigPage;
typedef std::vector< SvxConfigEntry* > SvxEntries;
class SvxConfigDialog : public SfxTabDialogController
{
private:
css::uno::Reference< css::frame::XFrame > m_xFrame;
virtual void ActivatePage(const OUString& rPage) override;
public:
SvxConfigDialog(weld::Window*, const SfxItemSet*);
virtual void PageCreated(const OUString& rId, SfxTabPage &rPage) override;
void SetFrame(const css::uno::Reference< css::frame::XFrame >& xFrame);
};
class SaveInData
{
private:
bool bModified;
bool bDocConfig;
bool bReadOnly;
css::uno::Reference
< css::ui::XUIConfigurationManager > m_xCfgMgr;
css::uno::Reference
< css::ui::XUIConfigurationManager > m_xParentCfgMgr;
css::uno::Reference
< css::ui::XImageManager > m_xImgMgr;
css::uno::Reference
< css::ui::XImageManager > m_xParentImgMgr;
static css::uno::Reference
< css::ui::XImageManager >* xDefaultImgMgr;
protected:
void ApplyMenu(
css::uno::Reference< css::container::XIndexContainer > const & rMenuBar,
css::uno::Reference< css::lang::XSingleComponentFactory >& rFactory,
SvxConfigEntry *pMenuData );
void LoadSubMenus(
const css::uno::Reference< css::container::XIndexAccess >& xMenuSettings,
const OUString& rBaseTitle, SvxConfigEntry const * pParentData, bool bContextMenu );
public:
SaveInData(
css::uno::Reference < css::ui::XUIConfigurationManager > xCfgMgr,
css::uno::Reference < css::ui::XUIConfigurationManager > xParentCfgMgr,
const OUString& aModuleId,
bool docConfig );
virtual ~SaveInData() {}
bool PersistChanges(
const css::uno::Reference< css::uno::XInterface >& xManager );
void SetModified( bool bValue = true ) { bModified = bValue; }
bool IsModified( ) const { return bModified; }
bool IsReadOnly( ) const { return bReadOnly; }
bool IsDocConfig( ) const { return bDocConfig; }
const css::uno::Reference
< css::ui::XUIConfigurationManager >&
GetConfigManager() const { return m_xCfgMgr; };
const css::uno::Reference
< css::ui::XUIConfigurationManager >&
GetParentConfigManager() const { return m_xParentCfgMgr; };
const css::uno::Reference
< css::ui::XImageManager >&
GetImageManager() const { return m_xImgMgr; };
const css::uno::Reference
< css::ui::XImageManager >&
GetParentImageManager() const { return m_xParentImgMgr; };
css::uno::Reference
< css::container::XNameAccess > m_xCommandToLabelMap;
css::uno::Sequence
< css::beans::PropertyValue > m_aSeparatorSeq;
css::uno::Reference<css::graphic::XGraphic> GetImage(const OUString& rCommandURL);
virtual bool HasURL( const OUString& aURL ) = 0;
virtual bool HasSettings() = 0;
virtual SvxEntries* GetEntries() = 0;
virtual void SetEntries( std::unique_ptr<SvxEntries> ) = 0;
virtual void Reset() = 0;
virtual bool Apply() = 0;
};
class MenuSaveInData : public SaveInData
{
private:
OUString m_aMenuResourceURL;
OUString m_aDescriptorContainer;
css::uno::Reference
< css::container::XIndexAccess > m_xMenuSettings;
std::unique_ptr<SvxConfigEntry> pRootEntry;
static MenuSaveInData* pDefaultData; ///< static holder of the default menu data
static void SetDefaultData( MenuSaveInData* pData ) {pDefaultData = pData;}
static MenuSaveInData* GetDefaultData() { return pDefaultData; }
void Apply(
css::uno::Reference< css::container::XIndexContainer > const & rNewMenuBar,
css::uno::Reference< css::lang::XSingleComponentFactory >& rFactory );
public:
MenuSaveInData(
const css::uno::Reference< css::ui::XUIConfigurationManager >&,
const css::uno::Reference< css::ui::XUIConfigurationManager >&,
const OUString& aModuleId,
bool docConfig );
virtual ~MenuSaveInData() override;
/// methods inherited from SaveInData
SvxEntries* GetEntries() override;
void SetEntries( std::unique_ptr<SvxEntries> ) override;
bool HasURL( const OUString& ) override { return false; }
bool HasSettings() override { return m_xMenuSettings.is(); }
void Reset() override;
bool Apply() override;
};
class ContextMenuSaveInData : public SaveInData
{
private:
std::unique_ptr< SvxConfigEntry > m_pRootEntry;
css::uno::Reference< css::container::XNameAccess > m_xPersistentWindowState;
OUString GetUIName( const OUString& rResourceURL );
public:
ContextMenuSaveInData(
const css::uno::Reference< css::ui::XUIConfigurationManager >& xCfgMgr,
const css::uno::Reference< css::ui::XUIConfigurationManager >& xParentCfgMgr,
const OUString& aModuleId, bool bIsDocConfig );
virtual ~ContextMenuSaveInData() override;
SvxEntries* GetEntries() override;
void SetEntries( std::unique_ptr<SvxEntries> pNewEntries ) override;
bool HasSettings() override;
bool HasURL( const OUString& rURL ) override;
void Reset() override;
bool Apply() override;
void ResetContextMenu( const SvxConfigEntry* pEntry );
};
class SvxConfigEntry
{
private:
/// common properties
sal_uInt16 nId;
OUString aLabel;
OUString aCommand;
bool bPopUp;
bool bStrEdited;
bool bIsUserDefined;
bool bIsMain;
bool bIsParentData;
bool bIsModified;
/// toolbar specific properties
bool bIsVisible;
sal_Int32 nStyle;
css::uno::Reference<
css::graphic::XGraphic > xBackupGraphic;
std::unique_ptr<SvxEntries> mpEntries;
public:
SvxConfigEntry( OUString aDisplayName,
OUString aCommandURL,
bool bPopup,
bool bParentData );
SvxConfigEntry()
:
nId( 0 ),
bPopUp( false ),
bStrEdited( false ),
bIsUserDefined( false ),
bIsMain( false ),
bIsParentData( false ),
bIsModified( false ),
bIsVisible( true ),
nStyle( 0 )
{}
~SvxConfigEntry();
const OUString& GetCommand() const { return aCommand; }
const OUString& GetName() const { return aLabel; }
void SetName( const OUString& rStr ) { aLabel = rStr; bStrEdited = true; }
bool HasChangedName() const { return bStrEdited; }
bool IsPopup() const { return bPopUp; }
void SetUserDefined( bool bOn = true ) { bIsUserDefined = bOn; }
bool IsUserDefined() const { return bIsUserDefined; }
bool IsBinding() const { return !bPopUp; }
bool IsSeparator() const { return nId == 0; }
SvxEntries* GetEntries() const { return mpEntries.get(); }
void SetEntries( std::unique_ptr<SvxEntries> entries ) { mpEntries = std::move(entries); }
void SetMain() { bIsMain = true; }
bool IsMain() const { return bIsMain; }
void SetParentData( bool bValue = true ) { bIsParentData = bValue; }
bool IsParentData() const { return bIsParentData; }
void SetModified( bool bValue = true ) { bIsModified = bValue; }
bool IsModified() const { return bIsModified; }
bool IsMovable() const;
bool IsDeletable() const;
bool IsRenamable() const;
void SetVisible( bool b ) { bIsVisible = b; }
bool IsVisible() const { return bIsVisible; }
void SetBackupGraphic( css::uno::Reference< css::graphic::XGraphic > const & graphic )
{ xBackupGraphic = graphic; }
const css::uno::Reference< css::graphic::XGraphic >& GetBackupGraphic() const
{ return xBackupGraphic; }
sal_Int32 GetStyle() const { return nStyle; }
void SetStyle( sal_Int32 style ) { nStyle = style; }
};
class SvxMenuEntriesListBox
{
protected:
std::unique_ptr<weld::TreeView> m_xControl;
ScopedVclPtr<VirtualDevice> m_xDropDown;
SvxConfigPage* m_pPage;
public:
SvxMenuEntriesListBox(std::unique_ptr<weld::TreeView> xControl, SvxConfigPage* pPage);
virtual ~SvxMenuEntriesListBox();
VirtualDevice& get_dropdown_image() const { return *m_xDropDown; }
int get_selected_index() const { return m_xControl->get_selected_index(); }
OUString get_id(int nPos) const { return m_xControl->get_id(nPos); }
void remove(int nPos) { m_xControl->remove(nPos); }
int n_children() const { return m_xControl->n_children(); }
void set_text(int row, const OUString& rText, int col) { m_xControl->set_text(row, rText, col); }
void clear() { m_xControl->clear(); } //need frees ?
void set_toggle(int row, TriState eState) { m_xControl->set_toggle(row, eState); }
void scroll_to_row(int pos) { m_xControl->scroll_to_row(pos); }
void select(int pos) { m_xControl->select(pos); }
weld::TreeView& get_widget() { return *m_xControl; }
void insert(int pos, const OUString& rId)
{
m_xControl->insert(nullptr, pos, nullptr, &rId,
nullptr, nullptr, false, nullptr);
}
DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
DECL_LINK(QueryTooltip, const weld::TreeIter& rIter, OUString);
void CreateDropDown();
};
class SvxConfigPageFunctionDropTarget : public weld::ReorderingDropTarget
{
private:
SvxConfigPage& m_rPage;
virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override;
public:
SvxConfigPageFunctionDropTarget(SvxConfigPage&rPage, weld::TreeView& rTreeView);
};
class SvxConfigPage : public SfxTabPage
{
private:
Timer m_aUpdateDataTimer;
bool bInitialised;
SaveInData* pCurrentSaveInData;
DECL_LINK(SearchUpdateHdl, weld::Entry&, void);
protected:
/// the ResourceURL to select when opening the dialog
OUString m_aURLToSelect;
css::uno::Reference< css::frame::XFrame > m_xFrame;
OUString m_aModuleId;
// Left side of the dialog where command categories and the available
// commands in them are displayed as a searchable list
std::unique_ptr<CommandCategoryListBox> m_xCommandCategoryListBox;
std::unique_ptr<CuiConfigFunctionListBox> m_xFunctions;
std::unique_ptr<weld::Label> m_xCategoryLabel;
std::unique_ptr<weld::Label> m_xDescriptionFieldLb;
std::unique_ptr<weld::TextView> m_xDescriptionField;
std::unique_ptr<weld::Label> m_xLeftFunctionLabel;
std::unique_ptr<weld::Entry> m_xSearchEdit;
std::unique_ptr<weld::Label> m_xSearchLabel;
// Right side of the dialog where the contents of the selected
// menu or toolbar are displayed
std::unique_ptr<weld::Label> m_xCustomizeLabel;
std::unique_ptr<weld::ComboBox> m_xTopLevelListBox;
// Used to add and remove toolbars/menus
std::unique_ptr<weld::MenuButton> m_xGearBtn;
std::unique_ptr<SvxMenuEntriesListBox> m_xContentsListBox;
std::unique_ptr<SvxConfigPageFunctionDropTarget> m_xDropTargetHelper;
std::unique_ptr<weld::Button> m_xMoveUpButton;
std::unique_ptr<weld::Button> m_xMoveDownButton;
std::unique_ptr<weld::ComboBox> m_xSaveInListBox;
std::unique_ptr<weld::Widget> m_xCustomizeBox;
std::unique_ptr<weld::MenuButton> m_xInsertBtn;
std::unique_ptr<weld::MenuButton> m_xModifyBtn;
// Used to reset the selected toolbar/menu/context menu
std::unique_ptr<weld::Button> m_xResetBtn;
// Middle buttons
std::unique_ptr<weld::Widget> m_xCommandButtons;
std::unique_ptr<weld::Button> m_xAddCommandButton;
std::unique_ptr<weld::Button> m_xRemoveCommandButton;
OUString m_sAppName;
OUString m_sFileName;
SvxConfigPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet&);
DECL_LINK(MoveHdl, weld::Button&, void);
DECL_LINK(SelectFunctionHdl, weld::TreeView&, void);
DECL_LINK(FunctionDoubleClickHdl, weld::TreeView&, bool);
DECL_LINK(SelectSaveInLocation, weld::ComboBox&, void);
DECL_LINK(SelectElementHdl, weld::ComboBox&, void);
DECL_LINK(ImplUpdateDataHdl, Timer*, void);
DECL_LINK(FocusOut_Impl, weld::Widget&, void);
virtual SaveInData* CreateSaveInData(
const css::uno::Reference< css::ui::XUIConfigurationManager >&,
const css::uno::Reference< css::ui::XUIConfigurationManager >&,
const OUString& aModuleId,
bool docConfig ) = 0;
virtual void Init() = 0;
virtual void UpdateButtonStates() = 0;
virtual short QueryReset() = 0;
virtual void SelectElement() = 0;
int AppendEntry(SvxConfigEntry* pNewEntryData,
int nTarget);
void AddSubMenusToUI( std::u16string_view rBaseTitle,
SvxConfigEntry const * pParentData );
void InsertEntryIntoUI(SvxConfigEntry* pNewEntryData,
weld::TreeView& rTreeView, int nPos,
bool bMenu = false);
void InsertEntryIntoUI(SvxConfigEntry* pNewEntryData,
weld::TreeView& rTreeView, weld::TreeIter& rIter,
bool bMenu = false);
void InsertEntryIntoNotebookbarTabUI(std::u16string_view sClassId, const OUString& sUIItemId,
const OUString& sUIItemCommand,
weld::TreeView& rTreeView, const weld::TreeIter& rIter);
SvxEntries* FindParentForChild( SvxEntries* pParentEntries,
SvxConfigEntry* pChildData );
void ReloadTopLevelListBox( SvxConfigEntry const * pSelection = nullptr );
static bool IsCommandInMenuList(const SvxConfigEntry *pEntryData,
const SvxEntries *pEntries);
SvxConfigEntry *CreateCommandFromSelection(const OUString &aURL);
public:
virtual ~SvxConfigPage() override;
static bool CanConfig( std::u16string_view rModuleId );
SaveInData* GetSaveInData() { return pCurrentSaveInData; }
const OUString& GetAppName() const { return m_sAppName; }
const OUString& GetFileName() const { return m_sFileName; }
int AddFunction(int nTarget,
bool bAllowDuplicates);
virtual void MoveEntry( bool bMoveUp );
bool MoveEntryData(int SourceEntry, int nTargetEntry);
bool FillItemSet( SfxItemSet* ) override;
void Reset( const SfxItemSet* ) override;
virtual void DeleteSelectedContent() = 0;
virtual void DeleteSelectedTopLevel() = 0;
virtual void ListModified() {}
SvxConfigEntry* GetTopLevelSelection()
{
return weld::fromId<SvxConfigEntry*>(m_xTopLevelListBox->get_active_id());
}
/** identifies the module in the given frame. If the frame is <NULL/>, a default
frame will be determined beforehand.
If the given frame is <NULL/>, a default frame will be used: The method the active
frame of the desktop, then the current frame. If both are <NULL/>,
the SfxViewFrame::Current's XFrame is used. If this is <NULL/>, too, an empty string is returned.
If the given frame is not <NULL/>, or a default frame could be successfully determined, then
the ModuleManager is asked for the module ID of the component in the frame.
*/
static OUString
GetFrameWithDefaultAndIdentify( css::uno::Reference< css::frame::XFrame >& _inout_rxFrame );
OUString GetScriptURL() const;
OUString GetSelectedDisplayName() const;
};
class SvxMainMenuOrganizerDialog : public weld::GenericDialogController
{
std::unique_ptr<SvxEntries> mpEntries;
OUString m_sNewMenuEntryId;
std::unique_ptr<weld::Widget> m_xMenuBox;
std::unique_ptr<weld::Entry> m_xMenuNameEdit;
std::unique_ptr<weld::TreeView> m_xMenuListBox;
std::unique_ptr<weld::Button> m_xMoveUpButton;
std::unique_ptr<weld::Button> m_xMoveDownButton;
void UpdateButtonStates();
DECL_LINK(MoveHdl, weld::Button&, void);
DECL_LINK(ModifyHdl, weld::Entry&, void);
DECL_LINK(SelectHdl, weld::TreeView&, void);
public:
SvxMainMenuOrganizerDialog(
weld::Window*, SvxEntries*,
SvxConfigEntry const *, bool bCreateMenu);
virtual ~SvxMainMenuOrganizerDialog() override;
std::unique_ptr<SvxEntries> ReleaseEntries() { return std::move(mpEntries);}
SvxConfigEntry* GetSelectedEntry();
};
class ToolbarSaveInData : public SaveInData
{
private:
std::unique_ptr<SvxConfigEntry> pRootEntry;
OUString m_aDescriptorContainer;
css::uno::Reference
< css::container::XNameAccess > m_xPersistentWindowState;
void LoadToolbar(
const css::uno::Reference< css::container::XIndexAccess >& xToolBarSettings,
SvxConfigEntry const * pParentData );
void ApplyToolbar(
css::uno::Reference< css::container::XIndexContainer > const & rNewToolbarBar,
css::uno::Reference< css::lang::XSingleComponentFactory >& rFactory,
SvxConfigEntry const *pToolbar );
public:
ToolbarSaveInData(
const css::uno::Reference< css::ui::XUIConfigurationManager >&,
const css::uno::Reference< css::ui::XUIConfigurationManager >&,
const OUString& aModuleId,
bool docConfig );
virtual ~ToolbarSaveInData() override;
void CreateToolbar( SvxConfigEntry* pToolbar );
void RestoreToolbar( SvxConfigEntry* pToolbar );
void RemoveToolbar( SvxConfigEntry* pToolbar );
void ApplyToolbar( SvxConfigEntry* pToolbar );
OUString GetSystemUIName( const OUString& rResourceURL );
sal_Int32 GetSystemStyle( const OUString& rResourceURL );
void SetSystemStyle( const OUString& rResourceURL, sal_Int32 nStyle );
void SetSystemStyle(
const css::uno::Reference< css::frame::XFrame >& xFrame,
const OUString& rResourceURL, sal_Int32 nStyle );
SvxEntries* GetEntries() override;
void SetEntries( std::unique_ptr<SvxEntries> ) override;
bool HasSettings() override;
bool HasURL( const OUString& rURL ) override;
void Reset() override;
bool Apply() override;
};
class SvxNewToolbarDialog : public weld::GenericDialogController
{
private:
std::unique_ptr<weld::Entry> m_xEdtName;
public:
std::unique_ptr<weld::ComboBox> m_xSaveInListBox;
SvxNewToolbarDialog(weld::Window* pWindow, const OUString& rName);
virtual ~SvxNewToolbarDialog() override;
OUString GetName() const
{
return m_xEdtName->get_text();
}
};
class SvxIconSelectorDialog : public weld::GenericDialogController
{
private:
sal_Int32 m_nExpectedSize;
css::uno::Reference<
css::ui::XImageManager > m_xImageManager;
css::uno::Reference<
css::ui::XImageManager > m_xParentImageManager;
css::uno::Reference<
css::ui::XImageManager > m_xImportedImageManager;
css::uno::Reference<
css::graphic::XGraphicProvider > m_xGraphProvider;
std::vector<css::uno::Reference<css::graphic::XGraphic>> m_aGraphics;
std::unique_ptr<ValueSet> m_xTbSymbol;
std::unique_ptr<weld::CustomWeld> m_xTbSymbolWin;
std::unique_ptr<weld::Label> m_xFtNote;
std::unique_ptr<weld::Button> m_xBtnImport;
std::unique_ptr<weld::Button> m_xBtnDelete;
bool ReplaceGraphicItem( const OUString& aURL );
bool ImportGraphic( const OUString& aURL );
void ImportGraphics( const css::uno::Sequence< OUString >& aURLs );
public:
SvxIconSelectorDialog(
weld::Window *pWindow,
css::uno::Reference< css::ui::XImageManager > xImageManager,
css::uno::Reference< css::ui::XImageManager > xParentImageManager);
virtual ~SvxIconSelectorDialog() override;
css::uno::Reference< css::graphic::XGraphic >
GetSelectedIcon();
DECL_LINK(SelectHdl, ValueSet*, void);
DECL_LINK(ImportHdl, weld::Button&, void);
DECL_LINK(DeleteHdl, weld::Button&, void);
};
//added for issue83555
class SvxIconChangeDialog : public weld::MessageDialogController
{
private:
std::unique_ptr<weld::TextView> m_xLineEditDescription;
public:
SvxIconChangeDialog(weld::Window *pWindow, const OUString& rMessage);
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */