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

251 lines
9.4 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
* 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/.
*/
#pragma once
#include <sal/config.h>
#include <vector>
#include <basctl/scriptdocument.hxx>
#include <svx/passwd.hxx>
#include <svl/lstner.hxx>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/frame/DispatchInformation.hpp>
#include <com/sun/star/script/browse/XBrowseNode.hpp>
#include <com/sun/star/task/InteractionHandler.hpp>
struct ScriptContainerInfo
{
css::script::browse::XBrowseNode* pBrowseNode;
ScriptContainerInfo(css::script::browse::XBrowseNode* pObj)
: pBrowseNode(pObj)
{
}
};
struct ScriptInfo
{
css::script::browse::XBrowseNode* pBrowseNode;
OUString sURL;
OUString sDescription;
ScriptInfo(css::script::browse::XBrowseNode* pObj, const OUString& rsUrl,
const OUString& rsDesc)
: pBrowseNode(pObj)
, sURL(rsUrl)
, sDescription(rsDesc)
{
}
};
typedef std::vector<std::unique_ptr<ScriptInfo>> ScriptInfoArr;
// inspired by class CuiConfigFunctionListBox
// cui/source/inc/cfgutil.hxx
class ScriptsListBox
{
friend class ScriptContainersListBox; // for access to aArr
ScriptInfoArr aArr;
std::unique_ptr<weld::TreeView> m_xTreeView;
std::unique_ptr<weld::TreeIter> m_xScratchIter;
DECL_LINK(QueryTooltip, const weld::TreeIter& rIter, OUString);
public:
ScriptsListBox(std::unique_ptr<weld::TreeView> xTreeView);
~ScriptsListBox();
void ClearAll();
static OUString GetDescriptionText(const OUString& rId);
OUString GetSelectedScriptName();
void connect_changed(const Link<weld::TreeView&, void>& rLink)
{
m_xTreeView->connect_changed(rLink);
}
void connect_popup_menu(const Link<const CommandEvent&, bool>& rLink)
{
m_xTreeView->connect_popup_menu(rLink);
}
void connect_row_activated(const Link<weld::TreeView&, bool>& rLink)
{
m_xTreeView->connect_row_activated(rLink);
}
void freeze() { m_xTreeView->freeze(); }
void thaw() { m_xTreeView->thaw(); }
void append(const OUString& rId, const OUString& rStr, const OUString& rImage,
const weld::TreeIter* pParent = nullptr)
{
m_xTreeView->insert(pParent, -1, &rStr, &rId, nullptr, nullptr, false,
m_xScratchIter.get());
m_xTreeView->set_image(*m_xScratchIter, rImage);
}
int n_children() const { return m_xTreeView->n_children(); }
std::unique_ptr<weld::TreeIter> make_iterator(const weld::TreeIter* pOrig = nullptr) const
{
return m_xTreeView->make_iterator(pOrig);
}
OUString get_id(const weld::TreeIter& rIter) const { return m_xTreeView->get_id(rIter); }
bool get_selected(weld::TreeIter* pIter) const { return m_xTreeView->get_selected(pIter); }
OUString get_selected_id() const
{
if (!m_xTreeView->get_selected(m_xScratchIter.get()))
return OUString();
return m_xTreeView->get_id(*m_xScratchIter);
}
void select(int pos) { m_xTreeView->select(pos); }
weld::TreeView& get_widget() { return *m_xTreeView; }
void Remove(const weld::TreeIter& rEntry);
};
enum class ScriptContainerType
{
LOCATION,
LANGUAGE,
LIBRARY,
MODULEORDIALOG
};
class MacroManagerDialog;
// locations, libraries, modules, and dialogs
class ScriptContainersListBox
{
friend class MacroManagerDialog;
ScriptsListBox* m_pScriptsListBox;
css::uno::Reference<css::uno::XComponentContext> m_xContext;
css::uno::Reference<css::frame::XFrame> m_xFrame;
std::unique_ptr<weld::TreeView> m_xTreeView;
void Remove(const weld::TreeIter* pEntryIter, bool bRemoveEntryIter);
void Fill(const weld::TreeIter* pEntryIter);
basctl::ScriptDocument GetScriptDocument(const weld::TreeIter* pIter = nullptr);
DECL_LINK(ExpandingHdl, const weld::TreeIter&, bool);
DECL_LINK(QueryTooltip, const weld::TreeIter& rIter, OUString);
// for weld::WaitObject which seems not to always behave as expected without the
// dialog window as a parent
MacroManagerDialog* m_pMacroManagerDialog;
public:
ScriptContainersListBox(std::unique_ptr<weld::TreeView> xTreeView,
MacroManagerDialog* pMacroManagerDialog);
~ScriptContainersListBox();
void connect_changed(const Link<weld::TreeView&, void>& rLink)
{
m_xTreeView->connect_changed(rLink);
}
weld::TreeView& get_widget() { return *m_xTreeView; }
void ClearAll();
void Init(const css::uno::Reference<css::uno::XComponentContext>& xContext,
const css::uno::Reference<css::frame::XFrame>& xFrame);
void SetScriptsListBox(ScriptsListBox* pBox) { m_pScriptsListBox = pBox; }
void ScriptContainerSelected();
void Insert(const css::uno::Reference<css::script::browse::XBrowseNode>& xInsertNode,
const weld::TreeIter* pParentEntry, const OUString& rsUiName,
const OUString& rsImage, bool bChildOnDemand = false, int nPos = -1,
weld::TreeIter* pRet = nullptr);
OUString GetContainerName(const weld::TreeIter& rIter,
const ScriptContainerType eScriptContainerType);
OUString GetSelectedEntryContainerName(ScriptContainerType eScriptContainerType);
};
enum class InputDialogMode;
class MacroManagerDialog : public weld::GenericDialogController, public SfxListener
{
OUString m_aScriptsListBoxLabelBaseStr;
// For forwarding to Assign dialog
css::uno::Reference<css::frame::XFrame> m_xDocumentFrame;
std::unique_ptr<weld::Label> m_xDialogDescription;
std::unique_ptr<ScriptContainersListBox> m_xScriptContainersListBox;
std::unique_ptr<ScriptsListBox> m_xScriptsListBox;
std::unique_ptr<weld::Label> m_xScriptContainersListBoxLabel;
std::unique_ptr<weld::Label> m_xScriptsListBoxLabel;
std::unique_ptr<weld::Button> m_xRunButton;
std::unique_ptr<weld::Button> m_xCloseButton;
std::unique_ptr<weld::TextView> m_xDescriptionText;
std::unique_ptr<weld::Frame> m_xDescriptionFrame;
std::unique_ptr<weld::Button> m_xNewLibraryButton;
std::unique_ptr<weld::Button> m_xNewModuleButton;
std::unique_ptr<weld::Button> m_xNewDialogButton;
std::unique_ptr<weld::Button> m_xLibraryModuleDialogEditButton;
std::unique_ptr<weld::Button> m_xLibraryModuleDialogRenameButton;
std::unique_ptr<weld::Button> m_xLibraryModuleDialogDeleteButton;
std::unique_ptr<weld::Button> m_xLibraryPasswordButton;
std::unique_ptr<weld::Button> m_xLibraryImportButton;
std::unique_ptr<weld::Button> m_xLibraryExportButton;
std::unique_ptr<weld::Button> m_xMacroEditButton;
std::unique_ptr<weld::Button> m_xMacroDeleteButton;
std::unique_ptr<weld::Button> m_xMacroCreateButton;
std::unique_ptr<weld::Button> m_xMacroRenameButton;
std::unique_ptr<weld::Button> m_xAssignButton;
DECL_LINK(ClickHdl, weld::Button&, void);
DECL_LINK(SelectHdl, weld::TreeView&, void);
DECL_LINK(FunctionDoubleClickHdl, weld::TreeView&, bool);
DECL_LINK(ContextMenuHdl, const CommandEvent&, bool);
DECL_LINK(CheckPasswordHdl, SvxPasswordDialog*, bool);
void BasicScriptsCreateLibrary(const basctl::ScriptDocument& rDocument);
void BasicScriptsCreateModule(const basctl::ScriptDocument& rDocument);
void BasicScriptsCreateDialog(const basctl::ScriptDocument& rDocument);
void BasicScriptsLibraryModuleDialogEdit(const basctl::ScriptDocument& rDocument);
void BasicScriptsLibraryModuleDialogRename(const basctl::ScriptDocument& rDocument);
void BasicScriptsLibraryModuleDialogDelete(const basctl::ScriptDocument& rDocument);
void BasicScriptsLibraryPassword(const basctl::ScriptDocument& rDocument);
void BasicScriptsMacroEdit(const basctl::ScriptDocument& rDocument);
bool IsLibraryReadOnlyOrFailedPasswordQuery(const basctl::ScriptDocument& rDocument,
weld::TreeIter* pIter);
void ScriptingFrameworkScriptsCreateEntry(InputDialogMode eInputDialogMode);
void ScriptingFrameworkScriptsRenameEntry(weld::TreeView& rTreeView,
const weld::TreeIter& rEntry);
void ScriptingFrameworkScriptsDeleteEntry(weld::TreeView& rTreeView,
const weld::TreeIter& rEntry);
static bool getBoolProperty(css::uno::Reference<css::beans::XPropertySet> const& xProps,
OUString const& propName);
OUString getListOfChildren(const css::uno::Reference<css::script::browse::XBrowseNode>& node,
int depth);
css::uno::Reference<css::script::browse::XBrowseNode>
getBrowseNode(const weld::TreeView& rTreeView, const weld::TreeIter& rTreeIter);
void UpdateUI();
void CheckButtons();
virtual void Notify(SfxBroadcaster&, const SfxHint& rHint) override;
public:
MacroManagerDialog(weld::Window* pParent,
const css::uno::Reference<css::frame::XFrame>& xFrame);
virtual ~MacroManagerDialog() override;
OUString GetScriptURL() const;
void SaveLastUsedMacro();
void LoadLastUsedMacro();
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */