diff options
Diffstat (limited to 'vcl/inc/jsdialog/jsdialogbuilder.hxx')
-rw-r--r-- | vcl/inc/jsdialog/jsdialogbuilder.hxx | 894 |
1 files changed, 894 insertions, 0 deletions
diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx new file mode 100644 index 0000000000..6e611c4f96 --- /dev/null +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -0,0 +1,894 @@ +/* -*- 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 <utility> +#include <vcl/weld.hxx> +#include <vcl/jsdialog/executor.hxx> +#include <vcl/virdev.hxx> +#include <salvtables.hxx> +#include <vcl/toolkit/button.hxx> +#include <vcl/toolkit/fmtfield.hxx> + +#include <com/sun/star/lang/XInitialization.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/datatransfer/dnd/XDropTarget.hpp> +#include <comphelper/compbase.hxx> + +#include <deque> +#include <list> +#include <mutex> + +#define ACTION_TYPE "action_type" +#define PARENT_ID "parent_id" +#define WINDOW_ID "id" +#define CLOSE_ID "close_id" + +class ToolBox; +class ComboBox; +class VclMultiLineEdit; +class SvTabListBox; +class IconView; +class VclScrolledWindow; + +namespace vcl +{ +class ILibreOfficeKitNotifier; +} + +typedef std::map<OUString, weld::Widget*> WidgetMap; + +namespace jsdialog +{ +enum MessageType +{ + FullUpdate, + WidgetUpdate, + Close, + Action, + Popup, + PopupClose +}; +} + +/// Class with the message description for storing in the queue +class JSDialogMessageInfo +{ +public: + jsdialog::MessageType m_eType; + VclPtr<vcl::Window> m_pWindow; + std::unique_ptr<jsdialog::ActionDataMap> m_pData; + +private: + void copy(const JSDialogMessageInfo& rInfo) + { + this->m_eType = rInfo.m_eType; + this->m_pWindow = rInfo.m_pWindow; + if (rInfo.m_pData) + { + std::unique_ptr<jsdialog::ActionDataMap> pData( + new jsdialog::ActionDataMap(*rInfo.m_pData)); + this->m_pData = std::move(pData); + } + } + +public: + JSDialogMessageInfo(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow, + std::unique_ptr<jsdialog::ActionDataMap> pData) + : m_eType(eType) + , m_pWindow(std::move(pWindow)) + , m_pData(std::move(pData)) + { + } + + JSDialogMessageInfo(const JSDialogMessageInfo& rInfo) { copy(rInfo); } + + JSDialogMessageInfo& operator=(JSDialogMessageInfo aInfo) + { + if (this == &aInfo) + return *this; + + copy(aInfo); + return *this; + } +}; + +class JSDialogNotifyIdle final : public Idle +{ + // used to send message + VclPtr<vcl::Window> m_aNotifierWindow; + // used to generate JSON + VclPtr<vcl::Window> m_aContentWindow; + OUString m_sTypeOfJSON; + OString m_LastNotificationMessage; + bool m_bForce; + + std::deque<JSDialogMessageInfo> m_aMessageQueue; + std::mutex m_aQueueMutex; + +public: + JSDialogNotifyIdle(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, + const OUString& sTypeOfJSON); + + void Invoke() override; + + void clearQueue(); + void forceUpdate(); + void sendMessage(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow, + std::unique_ptr<jsdialog::ActionDataMap> pData = nullptr); + +private: + void send(tools::JsonWriter& aJsonWriter); + std::unique_ptr<tools::JsonWriter> generateFullUpdate() const; + std::unique_ptr<tools::JsonWriter> generateWidgetUpdate(VclPtr<vcl::Window> pWindow) const; + std::unique_ptr<tools::JsonWriter> generateCloseMessage() const; + std::unique_ptr<tools::JsonWriter> + generateActionMessage(VclPtr<vcl::Window> pWindow, + std::unique_ptr<jsdialog::ActionDataMap> pData) const; + std::unique_ptr<tools::JsonWriter> + generatePopupMessage(VclPtr<vcl::Window> pWindow, OUString sParentId, OUString sCloseId) const; + std::unique_ptr<tools::JsonWriter> generateClosePopupMessage(OUString sWindowId) const; +}; + +class JSDialogSender +{ + std::unique_ptr<JSDialogNotifyIdle> mpIdleNotify; + +protected: + bool m_bCanClose; // specifies if can send a close message + +public: + JSDialogSender() + : m_bCanClose(true) + { + } + JSDialogSender(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, + const OUString& sTypeOfJSON) + : m_bCanClose(true) + { + initializeSender(aNotifierWindow, aContentWindow, sTypeOfJSON); + } + + virtual ~JSDialogSender() COVERITY_NOEXCEPT_FALSE; + + virtual void sendFullUpdate(bool bForce = false); + void sendClose(); + void sendUpdate(VclPtr<vcl::Window> pWindow, bool bForce = false); + virtual void sendAction(VclPtr<vcl::Window> pWindow, + std::unique_ptr<jsdialog::ActionDataMap> pData); + virtual void sendPopup(VclPtr<vcl::Window> pWindow, OUString sParentId, OUString sCloseId); + virtual void sendClosePopup(vcl::LOKWindowId nWindowId); + void flush() { mpIdleNotify->Invoke(); } + +protected: + void initializeSender(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, + const OUString& sTypeOfJSON) + { + mpIdleNotify.reset(new JSDialogNotifyIdle(aNotifierWindow, aContentWindow, sTypeOfJSON)); + } +}; + +class JSDropTarget final + : public comphelper::WeakComponentImplHelper< + css::datatransfer::dnd::XDropTarget, css::lang::XInitialization, css::lang::XServiceInfo> +{ + std::vector<css::uno::Reference<css::datatransfer::dnd::XDropTargetListener>> m_aListeners; + +public: + JSDropTarget(); + + // XInitialization + virtual void SAL_CALL initialize(const css::uno::Sequence<css::uno::Any>& rArgs) override; + + // XDropTarget + virtual void SAL_CALL addDropTargetListener( + const css::uno::Reference<css::datatransfer::dnd::XDropTargetListener>&) override; + virtual void SAL_CALL removeDropTargetListener( + const css::uno::Reference<css::datatransfer::dnd::XDropTargetListener>&) override; + virtual sal_Bool SAL_CALL isActive() override; + virtual void SAL_CALL setActive(sal_Bool active) override; + virtual sal_Int8 SAL_CALL getDefaultActions() override; + virtual void SAL_CALL setDefaultActions(sal_Int8 actions) override; + + OUString SAL_CALL getImplementationName() override; + + sal_Bool SAL_CALL supportsService(OUString const& ServiceName) override; + + css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override; + + void fire_drop(const css::datatransfer::dnd::DropTargetDropEvent& dtde); + + void fire_dragEnter(const css::datatransfer::dnd::DropTargetDragEnterEvent& dtde); +}; + +class JSInstanceBuilder final : public SalInstanceBuilder, public JSDialogSender +{ + sal_uInt64 m_nWindowId; + /// used in case of tab pages where dialog is not a direct top level + VclPtr<vcl::Window> m_aParentDialog; + VclPtr<vcl::Window> m_aContentWindow; + std::list<OUString> m_aRememberedWidgets; + OUString m_sTypeOfJSON; + bool m_bHasTopLevelDialog; + bool m_bIsNotebookbar; + /// used to detect when we have to send Full Update in container handler + bool m_bSentInitialUpdate; + /// is true for tabpages, prevents from closing parent window on destroy + bool m_bIsNestedBuilder; + /// When LOKNotifier is set by jsdialogs code we need to release it + VclPtr<vcl::Window> m_aWindowToRelease; + + friend class JSMessageDialog; // static message boxes have to be registered outside + friend class JSDialog; + friend class JSAssistant; + + friend VCL_DLLPUBLIC bool jsdialog::ExecuteAction(const OUString& nWindowId, + const OUString& rWidget, StringMap& rData); + friend VCL_DLLPUBLIC void jsdialog::SendFullUpdate(const OUString& nWindowId, + const OUString& rWidget); + friend VCL_DLLPUBLIC void jsdialog::SendAction(const OUString& nWindowId, + const OUString& rWidget, + std::unique_ptr<jsdialog::ActionDataMap> pData); + + static std::map<OUString, WidgetMap>& GetLOKWeldWidgetsMap(); + static void InsertWindowToMap(const OUString& nWindowId); + void RememberWidget(OUString id, weld::Widget* pWidget); + static void RememberWidget(const OUString& nWindowId, const OUString& id, + weld::Widget* pWidget); + static weld::Widget* FindWeldWidgetsMap(const OUString& nWindowId, const OUString& rWidget); + + OUString getMapIdFromWindowId() const; + +public: + /// used for dialogs or popups + JSInstanceBuilder(weld::Widget* pParent, const OUString& rUIRoot, const OUString& rUIFile, + bool bPopup = false); + /// used for sidebar panels + JSInstanceBuilder(weld::Widget* pParent, const OUString& rUIRoot, const OUString& rUIFile, + sal_uInt64 nLOKWindowId); + /// used for notebookbar, optional nWindowId is used if getting parent id failed + JSInstanceBuilder(vcl::Window* pParent, const OUString& rUIRoot, const OUString& rUIFile, + const css::uno::Reference<css::frame::XFrame>& rFrame, + sal_uInt64 nWindowId = 0); + /// used for formulabar + JSInstanceBuilder(vcl::Window* pParent, const OUString& rUIRoot, const OUString& rUIFile, + sal_uInt64 nLOKWindowId); + + static std::unique_ptr<JSInstanceBuilder> + CreateDialogBuilder(weld::Widget* pParent, const OUString& rUIRoot, const OUString& rUIFile); + static std::unique_ptr<JSInstanceBuilder> + CreateNotebookbarBuilder(vcl::Window* pParent, const OUString& rUIRoot, const OUString& rUIFile, + const css::uno::Reference<css::frame::XFrame>& rFrame, + sal_uInt64 nWindowId = 0); + static std::unique_ptr<JSInstanceBuilder> CreateSidebarBuilder(weld::Widget* pParent, + const OUString& rUIRoot, + const OUString& rUIFile, + sal_uInt64 nLOKWindowId = 0); + static std::unique_ptr<JSInstanceBuilder> + CreatePopupBuilder(weld::Widget* pParent, const OUString& rUIRoot, const OUString& rUIFile); + static std::unique_ptr<JSInstanceBuilder> CreateFormulabarBuilder(vcl::Window* pParent, + const OUString& rUIRoot, + const OUString& rUIFile, + sal_uInt64 nLOKWindowId); + + virtual ~JSInstanceBuilder() override; + virtual std::unique_ptr<weld::MessageDialog> weld_message_dialog(const OUString& id) override; + virtual std::unique_ptr<weld::Dialog> weld_dialog(const OUString& id) override; + virtual std::unique_ptr<weld::Assistant> weld_assistant(const OUString& id) override; + virtual std::unique_ptr<weld::Container> weld_container(const OUString& id) override; + virtual std::unique_ptr<weld::Label> weld_label(const OUString& id) override; + virtual std::unique_ptr<weld::Button> weld_button(const OUString& id) override; + virtual std::unique_ptr<weld::LinkButton> weld_link_button(const OUString& id) override; + virtual std::unique_ptr<weld::ToggleButton> weld_toggle_button(const OUString& id) override; + virtual std::unique_ptr<weld::Entry> weld_entry(const OUString& id) override; + virtual std::unique_ptr<weld::ComboBox> weld_combo_box(const OUString& id) override; + virtual std::unique_ptr<weld::Notebook> weld_notebook(const OUString& id) override; + virtual std::unique_ptr<weld::SpinButton> weld_spin_button(const OUString& id) override; + virtual std::unique_ptr<weld::FormattedSpinButton> + weld_formatted_spin_button(const OUString& id) override; + virtual std::unique_ptr<weld::CheckButton> weld_check_button(const OUString& id) override; + virtual std::unique_ptr<weld::DrawingArea> + weld_drawing_area(const OUString& id, const a11yref& rA11yImpl = nullptr, + FactoryFunction pUITestFactoryFunction = nullptr, + void* pUserData = nullptr) override; + virtual std::unique_ptr<weld::Toolbar> weld_toolbar(const OUString& id) override; + virtual std::unique_ptr<weld::TextView> weld_text_view(const OUString& id) override; + virtual std::unique_ptr<weld::TreeView> weld_tree_view(const OUString& id) override; + virtual std::unique_ptr<weld::Expander> weld_expander(const OUString& id) override; + virtual std::unique_ptr<weld::IconView> weld_icon_view(const OUString& id) override; + virtual std::unique_ptr<weld::ScrolledWindow> + weld_scrolled_window(const OUString& id, bool bUserManagedScrolling = false) override; + virtual std::unique_ptr<weld::RadioButton> weld_radio_button(const OUString& id) override; + virtual std::unique_ptr<weld::Frame> weld_frame(const OUString& id) override; + virtual std::unique_ptr<weld::MenuButton> weld_menu_button(const OUString& id) override; + virtual std::unique_ptr<weld::Popover> weld_popover(const OUString& id) override; + virtual std::unique_ptr<weld::Box> weld_box(const OUString& id) override; + virtual std::unique_ptr<weld::Widget> weld_widget(const OUString& id) override; + virtual std::unique_ptr<weld::Image> weld_image(const OUString& id) override; + virtual std::unique_ptr<weld::Calendar> weld_calendar(const OUString& id) override; + + static weld::MessageDialog* + CreateMessageDialog(weld::Widget* pParent, VclMessageType eMessageType, + VclButtonsType eButtonType, const OUString& rPrimaryMessage, + const vcl::ILibreOfficeKitNotifier* pNotifier = nullptr); + + static void AddChildWidget(const OUString& nWindowId, const OUString& id, + weld::Widget* pWidget); + static void RemoveWindowWidget(const OUString& nWindowId); + + // we need to remember original popup window to close it properly (its handled by vcl) + static void RememberPopup(const OUString& nWindowId, VclPtr<vcl::Window> pWidget); + static void ForgetPopup(const OUString& nWindowId); + static vcl::Window* FindPopup(const OUString& nWindowId); + +private: + const OUString& GetTypeOfJSON() const; + VclPtr<vcl::Window>& GetContentWindow(); + VclPtr<vcl::Window>& GetNotifierWindow(); +}; + +class SAL_LOPLUGIN_ANNOTATE("crosscast") BaseJSWidget +{ +public: + virtual ~BaseJSWidget() = default; + + virtual void sendClose() = 0; + + virtual void sendUpdate(bool bForce = false) = 0; + + virtual void sendFullUpdate(bool bForce = false) = 0; + + virtual void sendAction(std::unique_ptr<jsdialog::ActionDataMap> pData) = 0; + + virtual void sendPopup(vcl::Window* pPopup, OUString sParentId, OUString sCloseId) = 0; + + virtual void sendClosePopup(vcl::LOKWindowId nWindowId) = 0; +}; + +template <class BaseInstanceClass, class VclClass> +class JSWidget : public BaseInstanceClass, public BaseJSWidget +{ +protected: + rtl::Reference<JSDropTarget> m_xDropTarget; + bool m_bIsFreezed; + + JSDialogSender* m_pSender; + +public: + JSWidget(JSDialogSender* pSender, VclClass* pObject, SalInstanceBuilder* pBuilder, + bool bTakeOwnership) + : BaseInstanceClass(pObject, pBuilder, bTakeOwnership) + , m_bIsFreezed(false) + , m_pSender(pSender) + { + } + + JSWidget(JSDialogSender* pSender, VclClass* pObject, SalInstanceBuilder* pBuilder, + bool bTakeOwnership, bool bUserManagedScrolling) + : BaseInstanceClass(pObject, pBuilder, bTakeOwnership, bUserManagedScrolling) + , m_bIsFreezed(false) + , m_pSender(pSender) + { + } + + JSWidget(JSDialogSender* pSender, VclClass* pObject, SalInstanceBuilder* pBuilder, + const a11yref& rAlly, FactoryFunction pUITestFactoryFunction, void* pUserData, + bool bTakeOwnership) + : BaseInstanceClass(pObject, pBuilder, rAlly, pUITestFactoryFunction, pUserData, + bTakeOwnership) + , m_bIsFreezed(false) + , m_pSender(pSender) + { + } + + virtual void show() override + { + bool bWasVisible = BaseInstanceClass::get_visible(); + BaseInstanceClass::show(); + if (!bWasVisible) + { + std::unique_ptr<jsdialog::ActionDataMap> pMap + = std::make_unique<jsdialog::ActionDataMap>(); + (*pMap)[ACTION_TYPE ""_ostr] = "show"; + sendAction(std::move(pMap)); + } + } + + virtual void hide() override + { + bool bWasVisible = BaseInstanceClass::get_visible(); + BaseInstanceClass::hide(); + if (bWasVisible) + { + std::unique_ptr<jsdialog::ActionDataMap> pMap + = std::make_unique<jsdialog::ActionDataMap>(); + (*pMap)[ACTION_TYPE ""_ostr] = "hide"; + sendAction(std::move(pMap)); + } + } + + using BaseInstanceClass::set_sensitive; + virtual void set_sensitive(bool sensitive) override + { + bool bIsSensitive = BaseInstanceClass::get_sensitive(); + BaseInstanceClass::set_sensitive(sensitive); + if (bIsSensitive != sensitive) + sendUpdate(); + } + + virtual css::uno::Reference<css::datatransfer::dnd::XDropTarget> get_drop_target() override + { + if (!m_xDropTarget) + m_xDropTarget.set(new JSDropTarget); + + return m_xDropTarget; + } + + virtual void freeze() override + { + BaseInstanceClass::freeze(); + m_bIsFreezed = true; + } + + virtual void thaw() override + { + BaseInstanceClass::thaw(); + m_bIsFreezed = false; + sendUpdate(); + } + + virtual void grab_focus() override + { + BaseInstanceClass::grab_focus(); + std::unique_ptr<jsdialog::ActionDataMap> pMap = std::make_unique<jsdialog::ActionDataMap>(); + (*pMap)[ACTION_TYPE ""_ostr] = "grab_focus"; + sendAction(std::move(pMap)); + } + + virtual void sendClose() override + { + if (m_pSender) + m_pSender->sendClose(); + } + + virtual void sendUpdate(bool bForce = false) override + { + if (!m_bIsFreezed && m_pSender) + m_pSender->sendUpdate(BaseInstanceClass::m_xWidget, bForce); + } + + virtual void sendFullUpdate(bool bForce = false) override + { + if ((!m_bIsFreezed || bForce) && m_pSender) + m_pSender->sendFullUpdate(bForce); + } + + virtual void sendAction(std::unique_ptr<jsdialog::ActionDataMap> pData) override + { + if (!m_bIsFreezed && m_pSender && pData) + m_pSender->sendAction(BaseInstanceClass::m_xWidget, std::move(pData)); + } + + virtual void sendPopup(vcl::Window* pPopup, OUString sParentId, OUString sCloseId) override + { + if (!m_bIsFreezed && m_pSender) + m_pSender->sendPopup(pPopup, sParentId, sCloseId); + } + + virtual void sendClosePopup(vcl::LOKWindowId nWindowId) override + { + if (!m_bIsFreezed && m_pSender) + m_pSender->sendClosePopup(nWindowId); + } + + virtual void set_buildable_name(const OUString& rName) override + { + SalInstanceWidget::set_buildable_name(rName); + assert(false); // we remember old name in GetLOKWeldWidgetsMap() + // TODO: implement renaming or avoid it for LOK + } +}; + +class JSDialog final : public JSWidget<SalInstanceDialog, ::Dialog> +{ +public: + JSDialog(JSDialogSender* pSender, ::Dialog* pDialog, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual void collapse(weld::Widget* pEdit, weld::Widget* pButton) override; + virtual void undo_collapse() override; + virtual void response(int response) override; + virtual weld::Button* weld_widget_for_response(int response) override; + virtual int run() override; + virtual bool runAsync(std::shared_ptr<weld::DialogController> aOwner, + const std::function<void(sal_Int32)>& rEndDialogFn) override; + virtual bool runAsync(std::shared_ptr<Dialog> const& rxSelf, + const std::function<void(sal_Int32)>& func) override; +}; + +class JSAssistant final : public JSWidget<SalInstanceAssistant, vcl::RoadmapWizard> +{ +public: + JSAssistant(JSDialogSender* pSender, vcl::RoadmapWizard* pDialog, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual void set_current_page(int nPage) override; + virtual void set_current_page(const OUString& rIdent) override; + virtual void response(int response) override; + virtual weld::Button* weld_widget_for_response(int response) override; + virtual int run() override; + virtual bool runAsync(std::shared_ptr<weld::DialogController> aOwner, + const std::function<void(sal_Int32)>& rEndDialogFn) override; + virtual bool runAsync(std::shared_ptr<Dialog> const& rxSelf, + const std::function<void(sal_Int32)>& func) override; +}; + +class JSContainer final : public JSWidget<SalInstanceContainer, vcl::Window> +{ +public: + JSContainer(JSDialogSender* pSender, vcl::Window* pContainer, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); +}; + +class JSScrolledWindow final : public JSWidget<SalInstanceScrolledWindow, ::VclScrolledWindow> +{ +public: + JSScrolledWindow(JSDialogSender* pSender, ::VclScrolledWindow* pWindow, + SalInstanceBuilder* pBuilder, bool bTakeOwnership, bool bUserManagedScrolling); + + virtual void vadjustment_configure(int value, int lower, int upper, int step_increment, + int page_increment, int page_size) override; + virtual void vadjustment_set_value(int value) override; + void vadjustment_set_value_no_notification(int value); + virtual void vadjustment_set_page_size(int size) override; + virtual void set_vpolicy(VclPolicyType eVPolicy) override; + + virtual void hadjustment_configure(int value, int lower, int upper, int step_increment, + int page_increment, int page_size) override; + virtual void hadjustment_set_value(int value) override; + void hadjustment_set_value_no_notification(int value); + virtual void hadjustment_set_page_size(int size) override; + virtual void set_hpolicy(VclPolicyType eVPolicy) override; +}; + +class JSLabel final : public JSWidget<SalInstanceLabel, Control> +{ +public: + JSLabel(JSDialogSender* pSender, Control* pLabel, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + virtual void set_label(const OUString& rText) override; +}; + +class JSButton final : public JSWidget<SalInstanceButton, ::Button> +{ +public: + JSButton(JSDialogSender* pSender, ::Button* pButton, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); +}; + +class JSLinkButton final : public JSWidget<SalInstanceLinkButton, ::FixedHyperlink> +{ +public: + JSLinkButton(JSDialogSender* pSender, ::FixedHyperlink* pButton, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); +}; + +class JSToggleButton final : public JSWidget<SalInstanceToggleButton, ::PushButton> +{ +public: + JSToggleButton(JSDialogSender* pSender, ::PushButton* pButton, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); +}; + +class JSEntry final : public JSWidget<SalInstanceEntry, ::Edit> +{ +public: + JSEntry(JSDialogSender* pSender, ::Edit* pEntry, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + virtual void set_text(const OUString& rText) override; + void set_text_without_notify(const OUString& rText); + virtual void replace_selection(const OUString& rText) override; +}; + +class JSListBox final : public JSWidget<SalInstanceComboBoxWithoutEdit, ::ListBox> +{ +public: + JSListBox(JSDialogSender* pSender, ::ListBox* pListBox, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + virtual void insert(int pos, const OUString& rStr, const OUString* pId, + const OUString* pIconName, VirtualDevice* pImageSurface) override; + virtual void remove(int pos) override; + virtual void set_active(int pos) override; +}; + +class JSComboBox final : public JSWidget<SalInstanceComboBoxWithEdit, ::ComboBox> +{ +public: + JSComboBox(JSDialogSender* pSender, ::ComboBox* pComboBox, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + virtual void insert(int pos, const OUString& rStr, const OUString* pId, + const OUString* pIconName, VirtualDevice* pImageSurface) override; + virtual void remove(int pos) override; + virtual void set_entry_text_without_notify(const OUString& rText); + virtual void set_entry_text(const OUString& rText) override; + virtual void set_active(int pos) override; + virtual void set_active_id(const OUString& rText) override; + virtual bool changed_by_direct_pick() const override; + + void render_entry(int pos, int dpix, int dpiy); +}; + +class JSNotebook final : public JSWidget<SalInstanceNotebook, ::TabControl> +{ +public: + JSNotebook(JSDialogSender* pSender, ::TabControl* pControl, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual void remove_page(const OUString& rIdent) override; + virtual void insert_page(const OUString& rIdent, const OUString& rLabel, int nPos) override; +}; + +class JSVerticalNotebook final : public JSWidget<SalInstanceVerticalNotebook, ::VerticalTabControl> +{ +public: + JSVerticalNotebook(JSDialogSender* pSender, ::VerticalTabControl* pControl, + SalInstanceBuilder* pBuilder, bool bTakeOwnership); + + virtual void remove_page(const OUString& rIdent) override; + virtual void insert_page(const OUString& rIdent, const OUString& rLabel, int nPos) override; +}; + +class JSSpinButton final : public JSWidget<SalInstanceSpinButton, ::FormattedField> +{ +public: + JSSpinButton(JSDialogSender* pSender, ::FormattedField* pSpin, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual void set_value(sal_Int64 value) override; +}; + +class JSFormattedSpinButton final + : public JSWidget<SalInstanceFormattedSpinButton, ::FormattedField> +{ +public: + JSFormattedSpinButton(JSDialogSender* pSender, ::FormattedField* pSpin, + SalInstanceBuilder* pBuilder, bool bTakeOwnership); + + virtual void set_text(const OUString& rText) override; + void set_text_without_notify(const OUString& rText); +}; + +class JSMessageDialog final : public JSWidget<SalInstanceMessageDialog, ::MessageDialog> +{ + std::unique_ptr<JSDialogSender> m_pOwnedSender; + std::unique_ptr<JSButton> m_pOK; + std::unique_ptr<JSButton> m_pCancel; + + // used for message dialogs created using static functions + OUString m_sWindowId; + + DECL_LINK(OKHdl, weld::Button&, void); + DECL_LINK(CancelHdl, weld::Button&, void); + + void RememberMessageDialog(); + +public: + JSMessageDialog(JSDialogSender* pSender, ::MessageDialog* pDialog, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + JSMessageDialog(::MessageDialog* pDialog, SalInstanceBuilder* pBuilder, bool bTakeOwnership); + virtual ~JSMessageDialog(); + + virtual void set_primary_text(const OUString& rText) override; + + virtual void set_secondary_text(const OUString& rText) override; + + virtual void response(int response) override; + + virtual int run() override; + // TODO: move to dialog class so we will not send json when built but on run + bool runAsync(std::shared_ptr<weld::DialogController> aOwner, + const std::function<void(sal_Int32)>& rEndDialogFn) override; + + bool runAsync(std::shared_ptr<Dialog> const& rxSelf, + const std::function<void(sal_Int32)>& rEndDialogFn) override; +}; + +class JSCheckButton final : public JSWidget<SalInstanceCheckButton, ::CheckBox> +{ +public: + JSCheckButton(JSDialogSender* pSender, ::CheckBox* pCheckBox, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual void set_active(bool active) override; +}; + +class JSDrawingArea final : public JSWidget<SalInstanceDrawingArea, VclDrawingArea> +{ +public: + JSDrawingArea(JSDialogSender* pSender, VclDrawingArea* pDrawingArea, + SalInstanceBuilder* pBuilder, const a11yref& rAlly, + FactoryFunction pUITestFactoryFunction, void* pUserData); + + virtual void queue_draw() override; + virtual void queue_draw_area(int x, int y, int width, int height) override; +}; + +class JSToolbar final : public JSWidget<SalInstanceToolbar, ::ToolBox> +{ + std::map<sal_uInt16, weld::Widget*> m_pPopovers; + +public: + JSToolbar(JSDialogSender* pSender, ::ToolBox* pToolbox, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual void set_menu_item_active(const OUString& rIdent, bool bActive) override; + virtual void set_item_sensitive(const OUString& rIdent, bool bSensitive) override; + virtual void set_item_icon_name(const OUString& rIdent, const OUString& rIconName) override; +}; + +class JSTextView final : public JSWidget<SalInstanceTextView, ::VclMultiLineEdit> +{ +public: + JSTextView(JSDialogSender* pSender, ::VclMultiLineEdit* pTextView, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + virtual void set_text(const OUString& rText) override; + void set_text_without_notify(const OUString& rText); + virtual void replace_selection(const OUString& rText) override; +}; + +class JSTreeView final : public JSWidget<SalInstanceTreeView, ::SvTabListBox> +{ +public: + JSTreeView(JSDialogSender* pSender, ::SvTabListBox* pTextView, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + using SalInstanceTreeView::set_toggle; + /// pos is used differently here, it defines how many steps of iterator we need to perform to take entry + virtual void set_toggle(int pos, TriState eState, int col = -1) override; + virtual void set_toggle(const weld::TreeIter& rIter, TriState bOn, int col = -1) override; + + using SalInstanceTreeView::select; + /// pos is used differently here, it defines how many steps of iterator we need to perform to take entry + virtual void select(int pos) override; + + virtual weld::TreeView* get_drag_source() const override; + + using SalInstanceTreeView::insert; + virtual void insert(const weld::TreeIter* pParent, int pos, const OUString* pStr, + const OUString* pId, const OUString* pIconName, + VirtualDevice* pImageSurface, bool bChildrenOnDemand, + weld::TreeIter* pRet) override; + + virtual void set_text(int row, const OUString& rText, int col = -1) override; + virtual void set_text(const weld::TreeIter& rIter, const OUString& rStr, int col = -1) override; + + virtual void expand_row(const weld::TreeIter& rIter) override; + virtual void collapse_row(const weld::TreeIter& rIter) override; + + virtual void set_cursor(const weld::TreeIter& rIter) override; + void set_cursor_without_notify(const weld::TreeIter& rIter); + virtual void set_cursor(int pos) override; + + using SalInstanceTreeView::remove; + virtual void remove(int pos) override; + virtual void remove(const weld::TreeIter& rIter) override; + + virtual void clear() override; + + void drag_start(); + void drag_end(); +}; + +class JSExpander final : public JSWidget<SalInstanceExpander, ::VclExpander> +{ +public: + JSExpander(JSDialogSender* pSender, ::VclExpander* pExpander, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual void set_expanded(bool bExpand) override; +}; + +class JSIconView final : public JSWidget<SalInstanceIconView, ::IconView> +{ +public: + JSIconView(JSDialogSender* pSender, ::IconView* pIconView, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual void insert(int pos, const OUString* pStr, const OUString* pId, + const OUString* pIconName, weld::TreeIter* pRet) override; + + virtual void insert(int pos, const OUString* pStr, const OUString* pId, + const VirtualDevice* pIcon, weld::TreeIter* pRet) override; + + virtual void insert_separator(int pos, const OUString* pId) override; + + virtual void clear() override; + virtual void select(int pos) override; + virtual void unselect(int pos) override; +}; + +class JSRadioButton final : public JSWidget<SalInstanceRadioButton, ::RadioButton> +{ +public: + JSRadioButton(JSDialogSender* pSender, ::RadioButton* pRadioButton, + SalInstanceBuilder* pBuilder, bool bTakeOwnership); + + virtual void set_active(bool active) override; +}; + +class JSFrame : public JSWidget<SalInstanceFrame, ::VclFrame> +{ +public: + JSFrame(JSDialogSender* pSender, ::VclFrame* pFrame, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); +}; + +class JSMenuButton : public JSWidget<SalInstanceMenuButton, ::MenuButton> +{ +public: + JSMenuButton(JSDialogSender* pSender, ::MenuButton* pMenuButton, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual void set_label(const OUString& rText) override; + virtual void set_image(VirtualDevice* pDevice) override; + virtual void set_image(const css::uno::Reference<css::graphic::XGraphic>& rImage) override; + virtual void set_active(bool active) override; +}; + +class JSPopover : public JSWidget<SalInstancePopover, DockingWindow> +{ + vcl::LOKWindowId mnWindowId; + +public: + JSPopover(JSDialogSender* pSender, DockingWindow* pPopover, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual void popup_at_rect(weld::Widget* pParent, const tools::Rectangle& rRect, + weld::Placement ePlace = weld::Placement::Under) override; + virtual void popdown() override; + + void set_window_id(vcl::LOKWindowId nWindowId) { mnWindowId = nWindowId; } +}; + +class JSBox : public JSWidget<SalInstanceBox, VclBox> +{ +public: + JSBox(JSDialogSender* pSender, VclBox* pBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership); + + void reorder_child(weld::Widget* pWidget, int nNewPosition) override; +}; + +class JSWidgetInstance : public JSWidget<SalInstanceWidget, vcl::Window> +{ +public: + JSWidgetInstance(JSDialogSender* pSender, vcl::Window* pObject, SalInstanceBuilder* pBuilder, + bool bTakeOwnership) + : JSWidget<SalInstanceWidget, vcl::Window>(pSender, pObject, pBuilder, bTakeOwnership) + { + } +}; + +class JSImage : public JSWidget<SalInstanceImage, FixedImage> +{ +public: + JSImage(JSDialogSender* pSender, FixedImage* pImage, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + virtual void set_image(VirtualDevice* pDevice) override; + virtual void set_image(const css::uno::Reference<css::graphic::XGraphic>& rImage) override; +}; + +class JSCalendar : public JSWidget<SalInstanceCalendar, ::Calendar> +{ +public: + JSCalendar(JSDialogSender* pSender, ::Calendar* pCalendar, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ |