From 4134777711854ed68a7c2ffbd42cc118efd62184 Mon Sep 17 00:00:00 2001 From: Szymon Kłos Date: Thu, 5 Mar 2020 12:18:38 +0100 Subject: jsdialog: Remember builder connected with LOK window id MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I9e38fe570b2296341c1694fe8128da30ba209494 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94184 Tested-by: Jenkins CollaboraOffice Reviewed-by: Szymon Kłos --- compilerplugins/clang/badstatics.cxx | 1 + include/vcl/jsdialog/jsdialogbuilder.hxx | 139 +++++ include/vcl/salvtables.hxx | 948 +++++++++++++++++++++++++++++++ vcl/inc/jsdialog/jsdialogbuilder.hxx | 133 ----- vcl/inc/salvtables.hxx | 948 ------------------------------- vcl/jsdialog/jsdialogbuilder.cxx | 31 +- vcl/source/app/salvtables.cxx | 2 +- vcl/source/window/builder.cxx | 2 +- 8 files changed, 1120 insertions(+), 1084 deletions(-) create mode 100644 include/vcl/jsdialog/jsdialogbuilder.hxx create mode 100644 include/vcl/salvtables.hxx delete mode 100644 vcl/inc/jsdialog/jsdialogbuilder.hxx delete mode 100644 vcl/inc/salvtables.hxx diff --git a/compilerplugins/clang/badstatics.cxx b/compilerplugins/clang/badstatics.cxx index 737330dd10c0..7c595f77207a 100644 --- a/compilerplugins/clang/badstatics.cxx +++ b/compilerplugins/clang/badstatics.cxx @@ -205,6 +205,7 @@ public: || (loplugin::DeclCheck(pVarDecl).Var("maThreadSpecific") .Class("ScDocument").GlobalNamespace()) // not owning || name == "s_aLOKWindowsMap" // LOK only, guarded by assert, and LOK never tries to perform a VCL cleanup + || name == "s_aLOKWeldBuildersMap" // LOK only, similar case as above || name == "gStaticManager" // vcl/source/graphic/Manager.cxx - stores non-owning pointers || name == "aThreadedInterpreterPool" // ScInterpreterContext(Pool), not owning || name == "aNonThreadedInterpreterPool" // ScInterpreterContext(Pool), not owning diff --git a/include/vcl/jsdialog/jsdialogbuilder.hxx b/include/vcl/jsdialog/jsdialogbuilder.hxx new file mode 100644 index 000000000000..b26b2ac2ff16 --- /dev/null +++ b/include/vcl/jsdialog/jsdialogbuilder.hxx @@ -0,0 +1,139 @@ +#ifndef INCLUDED_VCL_INC_JSDIALOG_JSDIALOG_HXX +#define INCLUDED_VCL_INC_JSDIALOG_JSDIALOG_HXX + +#include +#include +#include +#include +#include +#include +#include +#include + +class JSDialogSender +{ + VclPtr m_aOwnedToplevel; + +public: + JSDialogSender(VclPtr aOwnedToplevel) + : m_aOwnedToplevel(aOwnedToplevel) + { + } + + void notifyDialogState(); +}; + +class VCL_DLLPUBLIC JSInstanceBuilder : public SalInstanceBuilder +{ + vcl::LOKWindowId m_nWindowId; + +public: + JSInstanceBuilder(weld::Widget* pParent, const OUString& rUIRoot, const OUString& rUIFile); + virtual ~JSInstanceBuilder() override; + virtual std::unique_ptr weld_dialog(const OString& id, + bool bTakeOwnership = true) override; + virtual std::unique_ptr weld_label(const OString& id, + bool bTakeOwnership = false) override; + virtual std::unique_ptr weld_button(const OString& id, + bool bTakeOwnership = false) override; + virtual std::unique_ptr weld_entry(const OString& id, + bool bTakeOwnership = false) override; + virtual std::unique_ptr weld_combo_box(const OString& id, + bool bTakeOwnership = false) override; + virtual std::unique_ptr weld_notebook(const OString& id, + bool bTakeOwnership = false) override; + + static std::map& GetLOKWeldBuilderMap(); + static JSInstanceBuilder* FindLOKWeldBuilder(vcl::LOKWindowId nWindowId); +}; + +template +class VCL_DLLPUBLIC JSWidget : public BaseInstanceClass, public JSDialogSender +{ +public: + JSWidget(VclPtr aOwnedToplevel, VclClass* pObject, SalInstanceBuilder* pBuilder, + bool bTakeOwnership) + : BaseInstanceClass(pObject, pBuilder, bTakeOwnership) + , JSDialogSender(aOwnedToplevel) + { + } + + virtual void show() override + { + BaseInstanceClass::show(); + notifyDialogState(); + } + + virtual void hide() override + { + BaseInstanceClass::hide(); + notifyDialogState(); + } + + virtual void set_sensitive(bool sensitive) override + { + BaseInstanceClass::set_sensitive(sensitive); + notifyDialogState(); + } +}; + +class VCL_DLLPUBLIC JSLabel : public JSWidget +{ +public: + JSLabel(VclPtr aOwnedToplevel, FixedText* pLabel, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + virtual void set_label(const OUString& rText) override; +}; + +class VCL_DLLPUBLIC JSButton : public JSWidget +{ +public: + JSButton(VclPtr aOwnedToplevel, ::Button* pButton, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); +}; + +class VCL_DLLPUBLIC JSEntry : public JSWidget +{ +public: + JSEntry(VclPtr aOwnedToplevel, ::Edit* pEntry, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + virtual void set_text(const OUString& rText) override; +}; + +class VCL_DLLPUBLIC JSListBox : public JSWidget +{ +public: + JSListBox(VclPtr aOwnedToplevel, ::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; +}; + +class VCL_DLLPUBLIC JSComboBox : public JSWidget +{ +public: + JSComboBox(VclPtr aOwnedToplevel, ::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(const OUString& rText) override; +}; + +class VCL_DLLPUBLIC JSNotebook : public JSWidget +{ +public: + JSNotebook(VclPtr aOwnedToplevel, ::TabControl* pControl, + SalInstanceBuilder* pBuilder, bool bTakeOwnership); + + virtual void set_current_page(int nPage) override; + + virtual void set_current_page(const OString& rIdent) override; + + virtual void remove_page(const OString& rIdent) override; + + virtual void append_page(const OString& rIdent, const OUString& rLabel) override; +}; + +#endif diff --git a/include/vcl/salvtables.hxx b/include/vcl/salvtables.hxx new file mode 100644 index 000000000000..6222423551bc --- /dev/null +++ b/include/vcl/salvtables.hxx @@ -0,0 +1,948 @@ +#ifndef INCLUDED_VCL_INC_SALVTABLES_HXX +#define INCLUDED_VCL_INC_SALVTABLES_HXX + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class SalInstanceBuilder : public weld::Builder +{ +protected: + std::unique_ptr m_xBuilder; + VclPtr m_aOwnedToplevel; + +public: + SalInstanceBuilder(vcl::Window* pParent, const OUString& rUIRoot, const OUString& rUIFile); + + VclBuilder& get_builder() const; + + virtual std::unique_ptr + weld_message_dialog(const OString& id, bool bTakeOwnership = true) override; + + virtual std::unique_ptr + weld_about_dialog(const OString& id, bool bTakeOwnership = true) override; + + virtual std::unique_ptr weld_dialog(const OString& id, + bool bTakeOwnership = true) override; + + virtual std::unique_ptr weld_assistant(const OString& id, + bool bTakeOwnership = true) override; + + virtual std::unique_ptr create_screenshot_window() override; + + virtual std::unique_ptr weld_window(const OString& id, + bool bTakeOwnership = true) override; + + virtual std::unique_ptr weld_widget(const OString& id, + bool bTakeOwnership = true) override; + + virtual std::unique_ptr weld_container(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_box(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_frame(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr + weld_scrolled_window(const OString& id, bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_notebook(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_button(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr + weld_menu_button(const OString& id, bool bTakeOwnership = false) override; + + virtual std::unique_ptr + weld_link_button(const OString& id, bool bTakeOwnership = false) override; + + virtual std::unique_ptr + weld_toggle_button(const OString& id, bool bTakeOwnership = false) override; + + virtual std::unique_ptr + weld_radio_button(const OString& id, bool bTakeOwnership = false) override; + + virtual std::unique_ptr + weld_check_button(const OString& id, bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_scale(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr + weld_progress_bar(const OString& id, bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_spinner(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_image(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_calendar(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_entry(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr + weld_spin_button(const OString& id, bool bTakeOwnership = false) override; + + virtual std::unique_ptr + weld_metric_spin_button(const OString& id, FieldUnit eUnit, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr + weld_formatted_spin_button(const OString& id, bool bTakeOwnership = false) override; + + virtual std::unique_ptr + weld_time_spin_button(const OString& id, TimeFieldFormat eFormat, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_combo_box(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr + weld_entry_tree_view(const OString& containerid, const OString& entryid, + const OString& treeviewid, bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_tree_view(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_icon_view(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_label(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_text_view(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_expander(const OString& id, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr + weld_drawing_area(const OString& id, const a11yref& rA11yImpl, + FactoryFunction pUITestFactoryFunction, void* pUserData, + bool bTakeOwnership = false) override; + + virtual std::unique_ptr weld_menu(const OString& id, + bool bTakeOwnership = true) override; + + virtual std::unique_ptr weld_toolbar(const OString& id, + bool bTakeOwnership = true) override; + + virtual std::unique_ptr create_size_group() override; + + OString get_current_page_help_id() const; + + virtual ~SalInstanceBuilder() override; +}; + +class SalInstanceWidget : public virtual weld::Widget +{ +protected: + VclPtr m_xWidget; + SalInstanceBuilder* m_pBuilder; + +private: + DECL_LINK(EventListener, VclWindowEvent&, void); + DECL_LINK(KeyEventListener, VclWindowEvent&, bool); + DECL_LINK(MouseEventListener, VclSimpleEvent&, void); + DECL_LINK(MnemonicActivateHdl, vcl::Window&, bool); + + const bool m_bTakeOwnership; + bool m_bEventListener; + bool m_bKeyEventListener; + bool m_bMouseEventListener; + int m_nBlockNotify; + +protected: + void ensure_event_listener(); + + // we want the ability to mark key events as handled, so use this variant + // for those, we get all keystrokes in this case, so we will need to filter + // them later + void ensure_key_listener(); + + // we want the ability to know about mouse events that happen in our children + // so use this variant, we will need to filter them later + void ensure_mouse_listener(); + + virtual void HandleEventListener(VclWindowEvent& rEvent); + virtual bool HandleKeyEventListener(VclWindowEvent& rEvent); + virtual void HandleMouseEventListener(VclSimpleEvent& rEvent); + + void set_background(const Color& rColor); + +public: + SalInstanceWidget(vcl::Window* pWidget, SalInstanceBuilder* pBuilder, bool bTakeOwnership); + + virtual void set_sensitive(bool sensitive) override; + + virtual bool get_sensitive() const override; + + virtual bool get_visible() const override; + + virtual bool is_visible() const override; + + virtual void set_can_focus(bool bCanFocus) override; + + virtual void grab_focus() override; + + virtual bool has_focus() const override; + + virtual bool is_active() const override; + + virtual void set_has_default(bool has_default) override; + + virtual bool get_has_default() const override; + + virtual void show() override; + + virtual void hide() override; + + virtual void set_size_request(int nWidth, int nHeight) override; + + virtual Size get_size_request() const override; + + virtual Size get_preferred_size() const override; + + virtual float get_approximate_digit_width() const override; + + virtual int get_text_height() const override; + + virtual Size get_pixel_size(const OUString& rText) const override; + + virtual vcl::Font get_font() override; + + virtual OString get_buildable_name() const override; + + virtual void set_help_id(const OString& rId) override; + + virtual OString get_help_id() const override; + + virtual void set_grid_left_attach(int nAttach) override; + + virtual int get_grid_left_attach() const override; + + virtual void set_grid_width(int nCols) override; + + virtual void set_grid_top_attach(int nAttach) override; + + virtual int get_grid_top_attach() const override; + + virtual void set_hexpand(bool bExpand) override; + + virtual bool get_hexpand() const override; + + virtual void set_vexpand(bool bExpand) override; + + virtual bool get_vexpand() const override; + + virtual void set_secondary(bool bSecondary) override; + + virtual void set_margin_top(int nMargin) override; + + virtual void set_margin_bottom(int nMargin) override; + + virtual void set_margin_left(int nMargin) override; + + virtual void set_margin_right(int nMargin) override; + + virtual int get_margin_top() const override; + + virtual int get_margin_bottom() const override; + + virtual int get_margin_left() const override; + + virtual int get_margin_right() const override; + + virtual void set_accessible_name(const OUString& rName) override; + + virtual OUString get_accessible_name() const override; + + virtual OUString get_accessible_description() const override; + + virtual void set_accessible_relation_labeled_by(weld::Widget* pLabel) override; + + virtual void set_accessible_relation_label_for(weld::Widget* pLabeled) override; + + virtual void + add_extra_accessible_relation(const css::accessibility::AccessibleRelation& rRelation) override; + + virtual void clear_extra_accessible_relations() override; + + virtual void set_tooltip_text(const OUString& rTip) override; + + virtual OUString get_tooltip_text() const override; + + virtual void connect_focus_in(const Link& rLink) override; + + virtual void connect_mnemonic_activate(const Link& rLink) override; + + virtual void connect_focus_out(const Link& rLink) override; + + virtual void connect_size_allocate(const Link& rLink) override; + + virtual void connect_mouse_press(const Link& rLink) override; + + virtual void connect_mouse_move(const Link& rLink) override; + + virtual void connect_mouse_release(const Link& rLink) override; + + virtual void connect_key_press(const Link& rLink) override; + + virtual void connect_key_release(const Link& rLink) override; + + virtual bool get_extents_relative_to(Widget& rRelative, int& x, int& y, int& width, + int& height) override; + + virtual void grab_add() override; + + virtual bool has_grab() const override; + + virtual void grab_remove() override; + + virtual bool get_direction() const override; + + virtual void set_direction(bool bRTL) override; + + virtual void freeze() override; + + virtual void thaw() override; + + virtual std::unique_ptr weld_parent() const override; + + virtual ~SalInstanceWidget() override; + + vcl::Window* getWidget(); + + void disable_notify_events(); + + bool notify_events_disabled(); + + void enable_notify_events(); + + virtual void help_hierarchy_foreach(const std::function& func) override; + + virtual OUString strip_mnemonic(const OUString& rLabel) const override; + + virtual VclPtr create_virtual_device() const override; + + virtual css::uno::Reference get_drop_target() override; + + virtual void set_stack_background() override; + + virtual void set_highlight_background() override; + + SystemWindow* getSystemWindow(); +}; + +class SalInstanceLabel : public SalInstanceWidget, public virtual weld::Label +{ +private: + // Control instead of FixedText so we can also use this for + // SelectableFixedText which is derived from Edit. We just typically need + // [G|S]etText which exists in their shared baseclass + VclPtr m_xLabel; + +public: + SalInstanceLabel(Control* pLabel, SalInstanceBuilder* pBuilder, bool bTakeOwnership); + + virtual void set_label(const OUString& rText) override; + + virtual OUString get_label() const override; + + virtual void set_mnemonic_widget(Widget* pTarget) override; + + virtual void set_message_type(weld::EntryMessageType eType) override; + + virtual void set_font(const vcl::Font& rFont) override; +}; + +class SalInstanceContainer : public SalInstanceWidget, public virtual weld::Container +{ +protected: + VclPtr m_xContainer; + +private: + void implResetDefault(const vcl::Window* _pWindow); + +public: + SalInstanceContainer(vcl::Window* pContainer, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + virtual void move(weld::Widget* pWidget, weld::Container* pNewParent) override; + virtual void recursively_unset_default_buttons() override; + virtual css::uno::Reference CreateChildFrame() override; +}; + +class SalInstanceWindow : public SalInstanceContainer, public virtual weld::Window +{ +private: + VclPtr m_xWindow; + + DECL_LINK(HelpHdl, vcl::Window&, bool); + + void override_child_help(vcl::Window* pParent); + + void clear_child_help(vcl::Window* pParent); + +public: + SalInstanceWindow(vcl::Window* pWindow, SalInstanceBuilder* pBuilder, bool bTakeOwnership); + + virtual void set_title(const OUString& rTitle) override; + + virtual OUString get_title() const override; + + void help(); + + virtual void set_busy_cursor(bool bBusy) override; + + virtual css::uno::Reference GetXWindow() override; + + virtual void resize_to_request() override; + + virtual void set_modal(bool bModal) override; + + virtual bool get_modal() const override; + + virtual void window_move(int x, int y) override; + + virtual Size get_size() const override; + + virtual Point get_position() const override; + + virtual tools::Rectangle get_monitor_workarea() const override; + + virtual void set_centered_on_parent(bool /*bTrackGeometryRequests*/) override; + + virtual bool get_resizable() const override; + + virtual bool has_toplevel_focus() const override; + + virtual void present() override; + + virtual void set_window_state(const OString& rStr) override; + + virtual OString get_window_state(WindowStateMask nMask) const override; + + virtual SystemEnvData get_system_data() const override; + + virtual void connect_toplevel_focus_changed(const Link& rLink) override; + + virtual void HandleEventListener(VclWindowEvent& rEvent) override; + + virtual void draw(VirtualDevice& rOutput) override; + + virtual weld::ScreenShotCollection collect_screenshot_data() override; + + virtual ~SalInstanceWindow() override; +}; + +class SalInstanceDialog : public SalInstanceWindow, public virtual weld::Dialog +{ +private: + VclPtr<::Dialog> m_xDialog; + + // for calc ref dialog that shrink to range selection widgets and resize back + VclPtr m_xRefEdit; + std::vector> m_aHiddenWidgets; // vector of hidden Controls + long m_nOldEditWidthReq; // Original width request of the input field + sal_Int32 m_nOldBorderWidth; // border width for expanded dialog + + DECL_LINK(PopupScreenShotMenuHdl, const CommandEvent&, bool); + +public: + SalInstanceDialog(::Dialog* pDialog, SalInstanceBuilder* pBuilder, bool bTakeOwnership); + + virtual bool runAsync(std::shared_ptr aOwner, + const std::function& rEndDialogFn) override; + + virtual bool runAsync(std::shared_ptr const& rxSelf, + const std::function& rEndDialogFn) override; + + virtual void collapse(weld::Widget* pEdit, weld::Widget* pButton) override; + + virtual void undo_collapse() override; + + virtual void + SetInstallLOKNotifierHdl(const Link& rLink) override; + + virtual int run() override; + + virtual void response(int nResponse) override; + + virtual void add_button(const OUString& rText, int nResponse, const OString& rHelpId) override; + + virtual void set_modal(bool bModal) override; + + virtual bool get_modal() const override; + + virtual weld::Button* weld_widget_for_response(int nResponse) override; + + virtual void set_default_response(int nResponse) override; + + virtual Container* weld_content_area() override; +}; + +class WeldTextFilter : public TextFilter +{ +private: + Link& m_rInsertTextHdl; + +public: + WeldTextFilter(Link& rInsertTextHdl); + + virtual OUString filter(const OUString& rText) override; +}; + +class SalInstanceEntry : public SalInstanceWidget, public virtual weld::Entry +{ +private: + VclPtr m_xEntry; + + DECL_LINK(ChangeHdl, Edit&, void); + DECL_LINK(CursorListener, VclWindowEvent&, void); + DECL_LINK(ActivateHdl, Edit&, bool); + + WeldTextFilter m_aTextFilter; + +public: + SalInstanceEntry(Edit* pEntry, SalInstanceBuilder* pBuilder, bool bTakeOwnership); + + virtual void set_text(const OUString& rText) override; + + virtual OUString get_text() const override; + + virtual void set_width_chars(int nChars) override; + + virtual int get_width_chars() const override; + + virtual void set_max_length(int nChars) override; + + virtual void select_region(int nStartPos, int nEndPos) override; + + bool get_selection_bounds(int& rStartPos, int& rEndPos) override; + + virtual void replace_selection(const OUString& rText) override; + + virtual void set_position(int nCursorPos) override; + + virtual int get_position() const override; + + virtual void set_editable(bool bEditable) override; + + virtual bool get_editable() const override; + + virtual void set_message_type(weld::EntryMessageType eType) override; + + virtual void set_font(const vcl::Font& rFont) override; + + virtual void connect_cursor_position(const Link& rLink) override; + + Edit& getEntry(); + + void fire_signal_changed(); + + virtual void cut_clipboard() override; + + virtual void copy_clipboard() override; + + virtual void paste_clipboard() override; + + virtual ~SalInstanceEntry() override; +}; + +class SalInstanceSpinButton : public SalInstanceEntry, public virtual weld::SpinButton +{ +private: + VclPtr m_xButton; + + DECL_LINK(UpDownHdl, SpinField&, void); + DECL_LINK(LoseFocusHdl, Control&, void); + DECL_LINK(OutputHdl, Edit&, bool); + DECL_LINK(InputHdl, sal_Int64*, TriState); + DECL_LINK(ActivateHdl, Edit&, bool); + + double toField(int nValue) const; + + int fromField(double fValue) const; + +public: + SalInstanceSpinButton(FormattedField* pButton, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual int get_value() const override; + + virtual void set_value(int value) override; + + virtual void set_range(int min, int max) override; + + virtual void get_range(int& min, int& max) const override; + + virtual void set_increments(int step, int /*page*/) override; + + virtual void get_increments(int& step, int& page) const override; + + virtual void set_digits(unsigned int digits) override; + + //so with hh::mm::ss, incrementing mm will not reset ss + void DisableRemainderFactor(); + + //off by default for direct SpinButtons, MetricSpinButton enables it + void SetUseThousandSep(); + + virtual unsigned int get_digits() const override; + + virtual ~SalInstanceSpinButton() override; +}; + +//ComboBox and ListBox have similar apis, ComboBoxes in LibreOffice have an edit box and ListBoxes +//don't. This distinction isn't there in Gtk. Use a template to sort this problem out. +template +class SalInstanceComboBox : public SalInstanceContainer, public virtual weld::ComboBox +{ +protected: + // owner for ListBox/ComboBox UserData + std::vector> m_aUserData; + VclPtr m_xComboBox; + +public: + SalInstanceComboBox(vcl_type* pComboBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership) + : SalInstanceContainer(pComboBox, pBuilder, bTakeOwnership) + , m_xComboBox(pComboBox) + { + } + + virtual int get_active() const override + { + const sal_Int32 nRet = m_xComboBox->GetSelectedEntryPos(); + if (nRet == LISTBOX_ENTRY_NOTFOUND) + return -1; + return nRet; + } + + const OUString* getEntryData(int index) const + { + return static_cast(m_xComboBox->GetEntryData(index)); + } + + // ComboBoxes are comprised of multiple subwidgets, consider the lot as + // one thing for focus + virtual bool has_focus() const override { return m_xWidget->HasChildPathFocus(); } + + virtual OUString get_active_id() const override + { + sal_Int32 nPos = m_xComboBox->GetSelectedEntryPos(); + const OUString* pRet; + if (nPos != LISTBOX_ENTRY_NOTFOUND) + pRet = getEntryData(m_xComboBox->GetSelectedEntryPos()); + else + pRet = nullptr; + if (!pRet) + return OUString(); + return *pRet; + } + + virtual void set_active_id(const OUString& rStr) override + { + for (int i = 0; i < get_count(); ++i) + { + const OUString* pId = getEntryData(i); + if (!pId) + continue; + if (*pId == rStr) + m_xComboBox->SelectEntryPos(i); + } + } + + virtual void set_active(int pos) override + { + if (pos == -1) + { + m_xComboBox->SetNoSelection(); + return; + } + m_xComboBox->SelectEntryPos(pos); + } + + virtual OUString get_text(int pos) const override { return m_xComboBox->GetEntry(pos); } + + virtual OUString get_id(int pos) const override + { + const OUString* pRet = getEntryData(pos); + if (!pRet) + return OUString(); + return *pRet; + } + + virtual void set_id(int row, const OUString& rId) override + { + m_aUserData.emplace_back(std::make_unique(rId)); + m_xComboBox->SetEntryData(row, m_aUserData.back().get()); + } + + virtual void insert_vector(const std::vector& rItems, + bool bKeepExisting) override + { + freeze(); + if (!bKeepExisting) + clear(); + for (const auto& rItem : rItems) + { + insert(-1, rItem.sString, rItem.sId.isEmpty() ? nullptr : &rItem.sId, + rItem.sImage.isEmpty() ? nullptr : &rItem.sImage, nullptr); + } + thaw(); + } + + virtual int get_count() const override { return m_xComboBox->GetEntryCount(); } + + virtual int find_text(const OUString& rStr) const override + { + const sal_Int32 nRet = m_xComboBox->GetEntryPos(rStr); + if (nRet == LISTBOX_ENTRY_NOTFOUND) + return -1; + return nRet; + } + + virtual int find_id(const OUString& rStr) const override + { + for (int i = 0; i < get_count(); ++i) + { + const OUString* pId = getEntryData(i); + if (!pId) + continue; + if (*pId == rStr) + return i; + } + return -1; + } + + virtual void clear() override + { + m_xComboBox->Clear(); + m_aUserData.clear(); + } + + virtual void make_sorted() override + { + m_xComboBox->SetStyle(m_xComboBox->GetStyle() | WB_SORT); + } + + virtual bool get_popup_shown() const override { return m_xComboBox->IsInDropDown(); } + + virtual void connect_popup_toggled(const Link& rLink) override + { + weld::ComboBox::connect_popup_toggled(rLink); + ensure_event_listener(); + } + + virtual void HandleEventListener(VclWindowEvent& rEvent) override + { + if (rEvent.GetId() == VclEventId::DropdownPreOpen + || rEvent.GetId() == VclEventId::DropdownClose) + { + signal_popup_toggled(); + return; + } + SalInstanceContainer::HandleEventListener(rEvent); + } +}; + +class SalInstanceComboBoxWithoutEdit : public SalInstanceComboBox +{ +private: + DECL_LINK(SelectHdl, ListBox&, void); + +public: + SalInstanceComboBoxWithoutEdit(ListBox* pListBox, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual OUString get_active_text() const override; + + virtual void remove(int pos) override; + + virtual void insert(int pos, const OUString& rStr, const OUString* pId, + const OUString* pIconName, VirtualDevice* pImageSurface) override; + + virtual void insert_separator(int pos, const OUString& /*rId*/) override; + + virtual bool has_entry() const override; + + virtual void set_entry_message_type(weld::EntryMessageType /*eType*/) override; + + virtual void set_entry_text(const OUString& /*rText*/) override; + + virtual void select_entry_region(int /*nStartPos*/, int /*nEndPos*/) override; + + virtual bool get_entry_selection_bounds(int& /*rStartPos*/, int& /*rEndPos*/) override; + + virtual void set_entry_width_chars(int /*nChars*/) override; + + virtual void set_entry_max_length(int /*nChars*/) override; + + virtual void set_entry_completion(bool, bool) override; + + virtual ~SalInstanceComboBoxWithoutEdit() override; +}; + +class SalInstanceComboBoxWithEdit : public SalInstanceComboBox +{ +private: + DECL_LINK(ChangeHdl, Edit&, void); + DECL_LINK(EntryActivateHdl, Edit&, bool); + WeldTextFilter m_aTextFilter; + +public: + SalInstanceComboBoxWithEdit(::ComboBox* pComboBox, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual bool has_entry() const override; + + virtual void set_entry_message_type(weld::EntryMessageType eType) override; + + virtual OUString get_active_text() const override; + + virtual void remove(int pos) override; + + virtual void insert(int pos, const OUString& rStr, const OUString* pId, + const OUString* pIconName, VirtualDevice* pImageSurface) override; + + virtual void insert_separator(int pos, const OUString& /*rId*/) override; + + virtual void set_entry_text(const OUString& rText) override; + + virtual void set_entry_width_chars(int nChars) override; + + virtual void set_entry_max_length(int nChars) override; + + virtual void set_entry_completion(bool bEnable, bool bCaseSensitive) override; + + virtual void select_entry_region(int nStartPos, int nEndPos) override; + + virtual bool get_entry_selection_bounds(int& rStartPos, int& rEndPos) override; + + virtual ~SalInstanceComboBoxWithEdit() override; +}; + +class SalInstanceButton : public SalInstanceContainer, public virtual weld::Button +{ +private: + VclPtr<::Button> m_xButton; + Link<::Button*, void> const m_aOldClickHdl; + + DECL_LINK(ClickHdl, ::Button*, void); + +public: + SalInstanceButton(::Button* pButton, 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& rImage) override; + + virtual void set_from_icon_name(const OUString& rIconName) override; + + virtual void set_label_line_wrap(bool wrap) override; + + virtual OUString get_label() const override; + + virtual ~SalInstanceButton() override; +}; + +class SalInstanceNotebook : public SalInstanceContainer, public virtual weld::Notebook +{ +private: + VclPtr m_xNotebook; + mutable std::vector> m_aPages; + std::vector> m_aAddedPages; + std::vector> m_aAddedGrids; + + DECL_LINK(DeactivatePageHdl, TabControl*, bool); + DECL_LINK(ActivatePageHdl, TabControl*, void); + +public: + SalInstanceNotebook(TabControl* pNotebook, SalInstanceBuilder* pBuilder, bool bTakeOwnership); + + virtual int get_current_page() const override; + + virtual OString get_page_ident(int nPage) const override; + + virtual OString get_current_page_ident() const override; + + virtual weld::Container* get_page(const OString& rIdent) const override; + + virtual void set_current_page(int nPage) override; + + virtual void set_current_page(const OString& rIdent) override; + + virtual void remove_page(const OString& rIdent) override; + + virtual void append_page(const OString& rIdent, const OUString& rLabel) override; + + virtual int get_n_pages() const override; + + virtual OUString get_tab_label_text(const OString& rIdent) const override; + + virtual void set_tab_label_text(const OString& rIdent, const OUString& rText) override; + + virtual ~SalInstanceNotebook() override; +}; + +class SalInstanceMessageDialog : public SalInstanceDialog, public virtual weld::MessageDialog +{ +private: + VclPtr<::MessageDialog> m_xMessageDialog; + +public: + SalInstanceMessageDialog(::MessageDialog* pDialog, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual void set_primary_text(const OUString& rText) override; + + virtual OUString get_primary_text() const override; + + virtual void set_secondary_text(const OUString& rText) override; + + virtual OUString get_secondary_text() const override; + + virtual Container* weld_message_area() override; +}; + +class SalInstanceCheckButton : public SalInstanceButton, public virtual weld::CheckButton +{ +private: + VclPtr m_xCheckButton; + + DECL_LINK(ToggleHdl, CheckBox&, void); + +public: + SalInstanceCheckButton(CheckBox* pButton, SalInstanceBuilder* pBuilder, bool bTakeOwnership); + + virtual void set_active(bool active) override; + + virtual bool get_active() const override; + + virtual void set_inconsistent(bool inconsistent) override; + + virtual bool get_inconsistent() const override; + + virtual ~SalInstanceCheckButton() override; +}; + +#endif \ No newline at end of file diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx deleted file mode 100644 index 0104756b7b55..000000000000 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ /dev/null @@ -1,133 +0,0 @@ -#ifndef INCLUDED_VCL_INC_JSDIALOG_JSDIALOG_HXX -#define INCLUDED_VCL_INC_JSDIALOG_JSDIALOG_HXX - -#include -#include -#include -#include -#include -#include -#include -#include - -class JSDialogSender -{ - VclPtr m_aOwnedToplevel; - -public: - JSDialogSender(VclPtr aOwnedToplevel) - : m_aOwnedToplevel(aOwnedToplevel) - { - } - - void notifyDialogState(); -}; - -class VCL_DLLPUBLIC JSInstanceBuilder : public SalInstanceBuilder -{ -public: - JSInstanceBuilder(weld::Widget* pParent, const OUString& rUIRoot, const OUString& rUIFile); - virtual std::unique_ptr weld_dialog(const OString& id, - bool bTakeOwnership = true) override; - virtual std::unique_ptr weld_label(const OString& id, - bool bTakeOwnership = false) override; - virtual std::unique_ptr weld_button(const OString& id, - bool bTakeOwnership = false) override; - virtual std::unique_ptr weld_entry(const OString& id, - bool bTakeOwnership = false) override; - virtual std::unique_ptr weld_combo_box(const OString& id, - bool bTakeOwnership = false) override; - virtual std::unique_ptr weld_notebook(const OString& id, - bool bTakeOwnership = false) override; -}; - -template -class JSWidget : public BaseInstanceClass, public JSDialogSender -{ -public: - JSWidget(VclPtr aOwnedToplevel, VclClass* pObject, SalInstanceBuilder* pBuilder, - bool bTakeOwnership) - : BaseInstanceClass(pObject, pBuilder, bTakeOwnership) - , JSDialogSender(aOwnedToplevel) - { - } - - virtual void show() override - { - BaseInstanceClass::show(); - notifyDialogState(); - } - - virtual void hide() override - { - BaseInstanceClass::hide(); - notifyDialogState(); - } - - virtual void set_sensitive(bool sensitive) override - { - BaseInstanceClass::set_sensitive(sensitive); - notifyDialogState(); - } -}; - -class VCL_DLLPUBLIC JSLabel : public JSWidget -{ -public: - JSLabel(VclPtr aOwnedToplevel, FixedText* pLabel, SalInstanceBuilder* pBuilder, - bool bTakeOwnership); - virtual void set_label(const OUString& rText) override; -}; - -class VCL_DLLPUBLIC JSButton : public JSWidget -{ -public: - JSButton(VclPtr aOwnedToplevel, ::Button* pButton, SalInstanceBuilder* pBuilder, - bool bTakeOwnership); -}; - -class VCL_DLLPUBLIC JSEntry : public JSWidget -{ -public: - JSEntry(VclPtr aOwnedToplevel, ::Edit* pEntry, SalInstanceBuilder* pBuilder, - bool bTakeOwnership); - virtual void set_text(const OUString& rText) override; -}; - -class VCL_DLLPUBLIC JSListBox : public JSWidget -{ -public: - JSListBox(VclPtr aOwnedToplevel, ::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; -}; - -class VCL_DLLPUBLIC JSComboBox : public JSWidget -{ -public: - JSComboBox(VclPtr aOwnedToplevel, ::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(const OUString& rText) override; -}; - -class VCL_DLLPUBLIC JSNotebook : public JSWidget -{ -public: - JSNotebook(VclPtr aOwnedToplevel, ::TabControl* pControl, - SalInstanceBuilder* pBuilder, bool bTakeOwnership); - - virtual void set_current_page(int nPage) override; - - virtual void set_current_page(const OString& rIdent) override; - - virtual void remove_page(const OString& rIdent) override; - - virtual void append_page(const OString& rIdent, const OUString& rLabel) override; -}; - -#endif \ No newline at end of file diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx deleted file mode 100644 index 6222423551bc..000000000000 --- a/vcl/inc/salvtables.hxx +++ /dev/null @@ -1,948 +0,0 @@ -#ifndef INCLUDED_VCL_INC_SALVTABLES_HXX -#define INCLUDED_VCL_INC_SALVTABLES_HXX - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class SalInstanceBuilder : public weld::Builder -{ -protected: - std::unique_ptr m_xBuilder; - VclPtr m_aOwnedToplevel; - -public: - SalInstanceBuilder(vcl::Window* pParent, const OUString& rUIRoot, const OUString& rUIFile); - - VclBuilder& get_builder() const; - - virtual std::unique_ptr - weld_message_dialog(const OString& id, bool bTakeOwnership = true) override; - - virtual std::unique_ptr - weld_about_dialog(const OString& id, bool bTakeOwnership = true) override; - - virtual std::unique_ptr weld_dialog(const OString& id, - bool bTakeOwnership = true) override; - - virtual std::unique_ptr weld_assistant(const OString& id, - bool bTakeOwnership = true) override; - - virtual std::unique_ptr create_screenshot_window() override; - - virtual std::unique_ptr weld_window(const OString& id, - bool bTakeOwnership = true) override; - - virtual std::unique_ptr weld_widget(const OString& id, - bool bTakeOwnership = true) override; - - virtual std::unique_ptr weld_container(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_box(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_frame(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr - weld_scrolled_window(const OString& id, bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_notebook(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_button(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr - weld_menu_button(const OString& id, bool bTakeOwnership = false) override; - - virtual std::unique_ptr - weld_link_button(const OString& id, bool bTakeOwnership = false) override; - - virtual std::unique_ptr - weld_toggle_button(const OString& id, bool bTakeOwnership = false) override; - - virtual std::unique_ptr - weld_radio_button(const OString& id, bool bTakeOwnership = false) override; - - virtual std::unique_ptr - weld_check_button(const OString& id, bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_scale(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr - weld_progress_bar(const OString& id, bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_spinner(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_image(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_calendar(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_entry(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr - weld_spin_button(const OString& id, bool bTakeOwnership = false) override; - - virtual std::unique_ptr - weld_metric_spin_button(const OString& id, FieldUnit eUnit, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr - weld_formatted_spin_button(const OString& id, bool bTakeOwnership = false) override; - - virtual std::unique_ptr - weld_time_spin_button(const OString& id, TimeFieldFormat eFormat, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_combo_box(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr - weld_entry_tree_view(const OString& containerid, const OString& entryid, - const OString& treeviewid, bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_tree_view(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_icon_view(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_label(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_text_view(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_expander(const OString& id, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr - weld_drawing_area(const OString& id, const a11yref& rA11yImpl, - FactoryFunction pUITestFactoryFunction, void* pUserData, - bool bTakeOwnership = false) override; - - virtual std::unique_ptr weld_menu(const OString& id, - bool bTakeOwnership = true) override; - - virtual std::unique_ptr weld_toolbar(const OString& id, - bool bTakeOwnership = true) override; - - virtual std::unique_ptr create_size_group() override; - - OString get_current_page_help_id() const; - - virtual ~SalInstanceBuilder() override; -}; - -class SalInstanceWidget : public virtual weld::Widget -{ -protected: - VclPtr m_xWidget; - SalInstanceBuilder* m_pBuilder; - -private: - DECL_LINK(EventListener, VclWindowEvent&, void); - DECL_LINK(KeyEventListener, VclWindowEvent&, bool); - DECL_LINK(MouseEventListener, VclSimpleEvent&, void); - DECL_LINK(MnemonicActivateHdl, vcl::Window&, bool); - - const bool m_bTakeOwnership; - bool m_bEventListener; - bool m_bKeyEventListener; - bool m_bMouseEventListener; - int m_nBlockNotify; - -protected: - void ensure_event_listener(); - - // we want the ability to mark key events as handled, so use this variant - // for those, we get all keystrokes in this case, so we will need to filter - // them later - void ensure_key_listener(); - - // we want the ability to know about mouse events that happen in our children - // so use this variant, we will need to filter them later - void ensure_mouse_listener(); - - virtual void HandleEventListener(VclWindowEvent& rEvent); - virtual bool HandleKeyEventListener(VclWindowEvent& rEvent); - virtual void HandleMouseEventListener(VclSimpleEvent& rEvent); - - void set_background(const Color& rColor); - -public: - SalInstanceWidget(vcl::Window* pWidget, SalInstanceBuilder* pBuilder, bool bTakeOwnership); - - virtual void set_sensitive(bool sensitive) override; - - virtual bool get_sensitive() const override; - - virtual bool get_visible() const override; - - virtual bool is_visible() const override; - - virtual void set_can_focus(bool bCanFocus) override; - - virtual void grab_focus() override; - - virtual bool has_focus() const override; - - virtual bool is_active() const override; - - virtual void set_has_default(bool has_default) override; - - virtual bool get_has_default() const override; - - virtual void show() override; - - virtual void hide() override; - - virtual void set_size_request(int nWidth, int nHeight) override; - - virtual Size get_size_request() const override; - - virtual Size get_preferred_size() const override; - - virtual float get_approximate_digit_width() const override; - - virtual int get_text_height() const override; - - virtual Size get_pixel_size(const OUString& rText) const override; - - virtual vcl::Font get_font() override; - - virtual OString get_buildable_name() const override; - - virtual void set_help_id(const OString& rId) override; - - virtual OString get_help_id() const override; - - virtual void set_grid_left_attach(int nAttach) override; - - virtual int get_grid_left_attach() const override; - - virtual void set_grid_width(int nCols) override; - - virtual void set_grid_top_attach(int nAttach) override; - - virtual int get_grid_top_attach() const override; - - virtual void set_hexpand(bool bExpand) override; - - virtual bool get_hexpand() const override; - - virtual void set_vexpand(bool bExpand) override; - - virtual bool get_vexpand() const override; - - virtual void set_secondary(bool bSecondary) override; - - virtual void set_margin_top(int nMargin) override; - - virtual void set_margin_bottom(int nMargin) override; - - virtual void set_margin_left(int nMargin) override; - - virtual void set_margin_right(int nMargin) override; - - virtual int get_margin_top() const override; - - virtual int get_margin_bottom() const override; - - virtual int get_margin_left() const override; - - virtual int get_margin_right() const override; - - virtual void set_accessible_name(const OUString& rName) override; - - virtual OUString get_accessible_name() const override; - - virtual OUString get_accessible_description() const override; - - virtual void set_accessible_relation_labeled_by(weld::Widget* pLabel) override; - - virtual void set_accessible_relation_label_for(weld::Widget* pLabeled) override; - - virtual void - add_extra_accessible_relation(const css::accessibility::AccessibleRelation& rRelation) override; - - virtual void clear_extra_accessible_relations() override; - - virtual void set_tooltip_text(const OUString& rTip) override; - - virtual OUString get_tooltip_text() const override; - - virtual void connect_focus_in(const Link& rLink) override; - - virtual void connect_mnemonic_activate(const Link& rLink) override; - - virtual void connect_focus_out(const Link& rLink) override; - - virtual void connect_size_allocate(const Link& rLink) override; - - virtual void connect_mouse_press(const Link& rLink) override; - - virtual void connect_mouse_move(const Link& rLink) override; - - virtual void connect_mouse_release(const Link& rLink) override; - - virtual void connect_key_press(const Link& rLink) override; - - virtual void connect_key_release(const Link& rLink) override; - - virtual bool get_extents_relative_to(Widget& rRelative, int& x, int& y, int& width, - int& height) override; - - virtual void grab_add() override; - - virtual bool has_grab() const override; - - virtual void grab_remove() override; - - virtual bool get_direction() const override; - - virtual void set_direction(bool bRTL) override; - - virtual void freeze() override; - - virtual void thaw() override; - - virtual std::unique_ptr weld_parent() const override; - - virtual ~SalInstanceWidget() override; - - vcl::Window* getWidget(); - - void disable_notify_events(); - - bool notify_events_disabled(); - - void enable_notify_events(); - - virtual void help_hierarchy_foreach(const std::function& func) override; - - virtual OUString strip_mnemonic(const OUString& rLabel) const override; - - virtual VclPtr create_virtual_device() const override; - - virtual css::uno::Reference get_drop_target() override; - - virtual void set_stack_background() override; - - virtual void set_highlight_background() override; - - SystemWindow* getSystemWindow(); -}; - -class SalInstanceLabel : public SalInstanceWidget, public virtual weld::Label -{ -private: - // Control instead of FixedText so we can also use this for - // SelectableFixedText which is derived from Edit. We just typically need - // [G|S]etText which exists in their shared baseclass - VclPtr m_xLabel; - -public: - SalInstanceLabel(Control* pLabel, SalInstanceBuilder* pBuilder, bool bTakeOwnership); - - virtual void set_label(const OUString& rText) override; - - virtual OUString get_label() const override; - - virtual void set_mnemonic_widget(Widget* pTarget) override; - - virtual void set_message_type(weld::EntryMessageType eType) override; - - virtual void set_font(const vcl::Font& rFont) override; -}; - -class SalInstanceContainer : public SalInstanceWidget, public virtual weld::Container -{ -protected: - VclPtr m_xContainer; - -private: - void implResetDefault(const vcl::Window* _pWindow); - -public: - SalInstanceContainer(vcl::Window* pContainer, SalInstanceBuilder* pBuilder, - bool bTakeOwnership); - virtual void move(weld::Widget* pWidget, weld::Container* pNewParent) override; - virtual void recursively_unset_default_buttons() override; - virtual css::uno::Reference CreateChildFrame() override; -}; - -class SalInstanceWindow : public SalInstanceContainer, public virtual weld::Window -{ -private: - VclPtr m_xWindow; - - DECL_LINK(HelpHdl, vcl::Window&, bool); - - void override_child_help(vcl::Window* pParent); - - void clear_child_help(vcl::Window* pParent); - -public: - SalInstanceWindow(vcl::Window* pWindow, SalInstanceBuilder* pBuilder, bool bTakeOwnership); - - virtual void set_title(const OUString& rTitle) override; - - virtual OUString get_title() const override; - - void help(); - - virtual void set_busy_cursor(bool bBusy) override; - - virtual css::uno::Reference GetXWindow() override; - - virtual void resize_to_request() override; - - virtual void set_modal(bool bModal) override; - - virtual bool get_modal() const override; - - virtual void window_move(int x, int y) override; - - virtual Size get_size() const override; - - virtual Point get_position() const override; - - virtual tools::Rectangle get_monitor_workarea() const override; - - virtual void set_centered_on_parent(bool /*bTrackGeometryRequests*/) override; - - virtual bool get_resizable() const override; - - virtual bool has_toplevel_focus() const override; - - virtual void present() override; - - virtual void set_window_state(const OString& rStr) override; - - virtual OString get_window_state(WindowStateMask nMask) const override; - - virtual SystemEnvData get_system_data() const override; - - virtual void connect_toplevel_focus_changed(const Link& rLink) override; - - virtual void HandleEventListener(VclWindowEvent& rEvent) override; - - virtual void draw(VirtualDevice& rOutput) override; - - virtual weld::ScreenShotCollection collect_screenshot_data() override; - - virtual ~SalInstanceWindow() override; -}; - -class SalInstanceDialog : public SalInstanceWindow, public virtual weld::Dialog -{ -private: - VclPtr<::Dialog> m_xDialog; - - // for calc ref dialog that shrink to range selection widgets and resize back - VclPtr m_xRefEdit; - std::vector> m_aHiddenWidgets; // vector of hidden Controls - long m_nOldEditWidthReq; // Original width request of the input field - sal_Int32 m_nOldBorderWidth; // border width for expanded dialog - - DECL_LINK(PopupScreenShotMenuHdl, const CommandEvent&, bool); - -public: - SalInstanceDialog(::Dialog* pDialog, SalInstanceBuilder* pBuilder, bool bTakeOwnership); - - virtual bool runAsync(std::shared_ptr aOwner, - const std::function& rEndDialogFn) override; - - virtual bool runAsync(std::shared_ptr const& rxSelf, - const std::function& rEndDialogFn) override; - - virtual void collapse(weld::Widget* pEdit, weld::Widget* pButton) override; - - virtual void undo_collapse() override; - - virtual void - SetInstallLOKNotifierHdl(const Link& rLink) override; - - virtual int run() override; - - virtual void response(int nResponse) override; - - virtual void add_button(const OUString& rText, int nResponse, const OString& rHelpId) override; - - virtual void set_modal(bool bModal) override; - - virtual bool get_modal() const override; - - virtual weld::Button* weld_widget_for_response(int nResponse) override; - - virtual void set_default_response(int nResponse) override; - - virtual Container* weld_content_area() override; -}; - -class WeldTextFilter : public TextFilter -{ -private: - Link& m_rInsertTextHdl; - -public: - WeldTextFilter(Link& rInsertTextHdl); - - virtual OUString filter(const OUString& rText) override; -}; - -class SalInstanceEntry : public SalInstanceWidget, public virtual weld::Entry -{ -private: - VclPtr m_xEntry; - - DECL_LINK(ChangeHdl, Edit&, void); - DECL_LINK(CursorListener, VclWindowEvent&, void); - DECL_LINK(ActivateHdl, Edit&, bool); - - WeldTextFilter m_aTextFilter; - -public: - SalInstanceEntry(Edit* pEntry, SalInstanceBuilder* pBuilder, bool bTakeOwnership); - - virtual void set_text(const OUString& rText) override; - - virtual OUString get_text() const override; - - virtual void set_width_chars(int nChars) override; - - virtual int get_width_chars() const override; - - virtual void set_max_length(int nChars) override; - - virtual void select_region(int nStartPos, int nEndPos) override; - - bool get_selection_bounds(int& rStartPos, int& rEndPos) override; - - virtual void replace_selection(const OUString& rText) override; - - virtual void set_position(int nCursorPos) override; - - virtual int get_position() const override; - - virtual void set_editable(bool bEditable) override; - - virtual bool get_editable() const override; - - virtual void set_message_type(weld::EntryMessageType eType) override; - - virtual void set_font(const vcl::Font& rFont) override; - - virtual void connect_cursor_position(const Link& rLink) override; - - Edit& getEntry(); - - void fire_signal_changed(); - - virtual void cut_clipboard() override; - - virtual void copy_clipboard() override; - - virtual void paste_clipboard() override; - - virtual ~SalInstanceEntry() override; -}; - -class SalInstanceSpinButton : public SalInstanceEntry, public virtual weld::SpinButton -{ -private: - VclPtr m_xButton; - - DECL_LINK(UpDownHdl, SpinField&, void); - DECL_LINK(LoseFocusHdl, Control&, void); - DECL_LINK(OutputHdl, Edit&, bool); - DECL_LINK(InputHdl, sal_Int64*, TriState); - DECL_LINK(ActivateHdl, Edit&, bool); - - double toField(int nValue) const; - - int fromField(double fValue) const; - -public: - SalInstanceSpinButton(FormattedField* pButton, SalInstanceBuilder* pBuilder, - bool bTakeOwnership); - - virtual int get_value() const override; - - virtual void set_value(int value) override; - - virtual void set_range(int min, int max) override; - - virtual void get_range(int& min, int& max) const override; - - virtual void set_increments(int step, int /*page*/) override; - - virtual void get_increments(int& step, int& page) const override; - - virtual void set_digits(unsigned int digits) override; - - //so with hh::mm::ss, incrementing mm will not reset ss - void DisableRemainderFactor(); - - //off by default for direct SpinButtons, MetricSpinButton enables it - void SetUseThousandSep(); - - virtual unsigned int get_digits() const override; - - virtual ~SalInstanceSpinButton() override; -}; - -//ComboBox and ListBox have similar apis, ComboBoxes in LibreOffice have an edit box and ListBoxes -//don't. This distinction isn't there in Gtk. Use a template to sort this problem out. -template -class SalInstanceComboBox : public SalInstanceContainer, public virtual weld::ComboBox -{ -protected: - // owner for ListBox/ComboBox UserData - std::vector> m_aUserData; - VclPtr m_xComboBox; - -public: - SalInstanceComboBox(vcl_type* pComboBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership) - : SalInstanceContainer(pComboBox, pBuilder, bTakeOwnership) - , m_xComboBox(pComboBox) - { - } - - virtual int get_active() const override - { - const sal_Int32 nRet = m_xComboBox->GetSelectedEntryPos(); - if (nRet == LISTBOX_ENTRY_NOTFOUND) - return -1; - return nRet; - } - - const OUString* getEntryData(int index) const - { - return static_cast(m_xComboBox->GetEntryData(index)); - } - - // ComboBoxes are comprised of multiple subwidgets, consider the lot as - // one thing for focus - virtual bool has_focus() const override { return m_xWidget->HasChildPathFocus(); } - - virtual OUString get_active_id() const override - { - sal_Int32 nPos = m_xComboBox->GetSelectedEntryPos(); - const OUString* pRet; - if (nPos != LISTBOX_ENTRY_NOTFOUND) - pRet = getEntryData(m_xComboBox->GetSelectedEntryPos()); - else - pRet = nullptr; - if (!pRet) - return OUString(); - return *pRet; - } - - virtual void set_active_id(const OUString& rStr) override - { - for (int i = 0; i < get_count(); ++i) - { - const OUString* pId = getEntryData(i); - if (!pId) - continue; - if (*pId == rStr) - m_xComboBox->SelectEntryPos(i); - } - } - - virtual void set_active(int pos) override - { - if (pos == -1) - { - m_xComboBox->SetNoSelection(); - return; - } - m_xComboBox->SelectEntryPos(pos); - } - - virtual OUString get_text(int pos) const override { return m_xComboBox->GetEntry(pos); } - - virtual OUString get_id(int pos) const override - { - const OUString* pRet = getEntryData(pos); - if (!pRet) - return OUString(); - return *pRet; - } - - virtual void set_id(int row, const OUString& rId) override - { - m_aUserData.emplace_back(std::make_unique(rId)); - m_xComboBox->SetEntryData(row, m_aUserData.back().get()); - } - - virtual void insert_vector(const std::vector& rItems, - bool bKeepExisting) override - { - freeze(); - if (!bKeepExisting) - clear(); - for (const auto& rItem : rItems) - { - insert(-1, rItem.sString, rItem.sId.isEmpty() ? nullptr : &rItem.sId, - rItem.sImage.isEmpty() ? nullptr : &rItem.sImage, nullptr); - } - thaw(); - } - - virtual int get_count() const override { return m_xComboBox->GetEntryCount(); } - - virtual int find_text(const OUString& rStr) const override - { - const sal_Int32 nRet = m_xComboBox->GetEntryPos(rStr); - if (nRet == LISTBOX_ENTRY_NOTFOUND) - return -1; - return nRet; - } - - virtual int find_id(const OUString& rStr) const override - { - for (int i = 0; i < get_count(); ++i) - { - const OUString* pId = getEntryData(i); - if (!pId) - continue; - if (*pId == rStr) - return i; - } - return -1; - } - - virtual void clear() override - { - m_xComboBox->Clear(); - m_aUserData.clear(); - } - - virtual void make_sorted() override - { - m_xComboBox->SetStyle(m_xComboBox->GetStyle() | WB_SORT); - } - - virtual bool get_popup_shown() const override { return m_xComboBox->IsInDropDown(); } - - virtual void connect_popup_toggled(const Link& rLink) override - { - weld::ComboBox::connect_popup_toggled(rLink); - ensure_event_listener(); - } - - virtual void HandleEventListener(VclWindowEvent& rEvent) override - { - if (rEvent.GetId() == VclEventId::DropdownPreOpen - || rEvent.GetId() == VclEventId::DropdownClose) - { - signal_popup_toggled(); - return; - } - SalInstanceContainer::HandleEventListener(rEvent); - } -}; - -class SalInstanceComboBoxWithoutEdit : public SalInstanceComboBox -{ -private: - DECL_LINK(SelectHdl, ListBox&, void); - -public: - SalInstanceComboBoxWithoutEdit(ListBox* pListBox, SalInstanceBuilder* pBuilder, - bool bTakeOwnership); - - virtual OUString get_active_text() const override; - - virtual void remove(int pos) override; - - virtual void insert(int pos, const OUString& rStr, const OUString* pId, - const OUString* pIconName, VirtualDevice* pImageSurface) override; - - virtual void insert_separator(int pos, const OUString& /*rId*/) override; - - virtual bool has_entry() const override; - - virtual void set_entry_message_type(weld::EntryMessageType /*eType*/) override; - - virtual void set_entry_text(const OUString& /*rText*/) override; - - virtual void select_entry_region(int /*nStartPos*/, int /*nEndPos*/) override; - - virtual bool get_entry_selection_bounds(int& /*rStartPos*/, int& /*rEndPos*/) override; - - virtual void set_entry_width_chars(int /*nChars*/) override; - - virtual void set_entry_max_length(int /*nChars*/) override; - - virtual void set_entry_completion(bool, bool) override; - - virtual ~SalInstanceComboBoxWithoutEdit() override; -}; - -class SalInstanceComboBoxWithEdit : public SalInstanceComboBox -{ -private: - DECL_LINK(ChangeHdl, Edit&, void); - DECL_LINK(EntryActivateHdl, Edit&, bool); - WeldTextFilter m_aTextFilter; - -public: - SalInstanceComboBoxWithEdit(::ComboBox* pComboBox, SalInstanceBuilder* pBuilder, - bool bTakeOwnership); - - virtual bool has_entry() const override; - - virtual void set_entry_message_type(weld::EntryMessageType eType) override; - - virtual OUString get_active_text() const override; - - virtual void remove(int pos) override; - - virtual void insert(int pos, const OUString& rStr, const OUString* pId, - const OUString* pIconName, VirtualDevice* pImageSurface) override; - - virtual void insert_separator(int pos, const OUString& /*rId*/) override; - - virtual void set_entry_text(const OUString& rText) override; - - virtual void set_entry_width_chars(int nChars) override; - - virtual void set_entry_max_length(int nChars) override; - - virtual void set_entry_completion(bool bEnable, bool bCaseSensitive) override; - - virtual void select_entry_region(int nStartPos, int nEndPos) override; - - virtual bool get_entry_selection_bounds(int& rStartPos, int& rEndPos) override; - - virtual ~SalInstanceComboBoxWithEdit() override; -}; - -class SalInstanceButton : public SalInstanceContainer, public virtual weld::Button -{ -private: - VclPtr<::Button> m_xButton; - Link<::Button*, void> const m_aOldClickHdl; - - DECL_LINK(ClickHdl, ::Button*, void); - -public: - SalInstanceButton(::Button* pButton, 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& rImage) override; - - virtual void set_from_icon_name(const OUString& rIconName) override; - - virtual void set_label_line_wrap(bool wrap) override; - - virtual OUString get_label() const override; - - virtual ~SalInstanceButton() override; -}; - -class SalInstanceNotebook : public SalInstanceContainer, public virtual weld::Notebook -{ -private: - VclPtr m_xNotebook; - mutable std::vector> m_aPages; - std::vector> m_aAddedPages; - std::vector> m_aAddedGrids; - - DECL_LINK(DeactivatePageHdl, TabControl*, bool); - DECL_LINK(ActivatePageHdl, TabControl*, void); - -public: - SalInstanceNotebook(TabControl* pNotebook, SalInstanceBuilder* pBuilder, bool bTakeOwnership); - - virtual int get_current_page() const override; - - virtual OString get_page_ident(int nPage) const override; - - virtual OString get_current_page_ident() const override; - - virtual weld::Container* get_page(const OString& rIdent) const override; - - virtual void set_current_page(int nPage) override; - - virtual void set_current_page(const OString& rIdent) override; - - virtual void remove_page(const OString& rIdent) override; - - virtual void append_page(const OString& rIdent, const OUString& rLabel) override; - - virtual int get_n_pages() const override; - - virtual OUString get_tab_label_text(const OString& rIdent) const override; - - virtual void set_tab_label_text(const OString& rIdent, const OUString& rText) override; - - virtual ~SalInstanceNotebook() override; -}; - -class SalInstanceMessageDialog : public SalInstanceDialog, public virtual weld::MessageDialog -{ -private: - VclPtr<::MessageDialog> m_xMessageDialog; - -public: - SalInstanceMessageDialog(::MessageDialog* pDialog, SalInstanceBuilder* pBuilder, - bool bTakeOwnership); - - virtual void set_primary_text(const OUString& rText) override; - - virtual OUString get_primary_text() const override; - - virtual void set_secondary_text(const OUString& rText) override; - - virtual OUString get_secondary_text() const override; - - virtual Container* weld_message_area() override; -}; - -class SalInstanceCheckButton : public SalInstanceButton, public virtual weld::CheckButton -{ -private: - VclPtr m_xCheckButton; - - DECL_LINK(ToggleHdl, CheckBox&, void); - -public: - SalInstanceCheckButton(CheckBox* pButton, SalInstanceBuilder* pBuilder, bool bTakeOwnership); - - virtual void set_active(bool active) override; - - virtual bool get_active() const override; - - virtual void set_inconsistent(bool inconsistent) override; - - virtual bool get_inconsistent() const override; - - virtual ~SalInstanceCheckButton() override; -}; - -#endif \ No newline at end of file diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 64f78c295bed..901f92aac109 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -30,12 +30,41 @@ JSInstanceBuilder::JSInstanceBuilder(weld::Widget* pParent, const OUString& rUIR ? dynamic_cast(pParent)->getWidget() : nullptr, rUIRoot, rUIFile) + , m_nWindowId(0) { } +JSInstanceBuilder::~JSInstanceBuilder() +{ + if (m_nWindowId) + GetLOKWeldBuilderMap().erase(m_nWindowId); +} + +std::map& JSInstanceBuilder::GetLOKWeldBuilderMap() +{ + // Map to remember the LOKWindowId <-> Builder binding. + static std::map s_aLOKWeldBuildersMap; + + return s_aLOKWeldBuildersMap; +} + +JSInstanceBuilder* JSInstanceBuilder::FindLOKWeldBuilder(vcl::LOKWindowId nWindowId) +{ + const auto it = GetLOKWeldBuilderMap().find(nWindowId); + if (it != GetLOKWeldBuilderMap().end()) + return it->second; + + return nullptr; +} + std::unique_ptr JSInstanceBuilder::weld_dialog(const OString& id, bool bTakeOwnership) { ::Dialog* pDialog = m_xBuilder->get<::Dialog>(id); + m_nWindowId = pDialog->GetLOKWindowId(); + + GetLOKWeldBuilderMap().insert( + std::map::value_type(m_nWindowId, this)); + std::unique_ptr pRet(pDialog ? new SalInstanceDialog(pDialog, this, false) : nullptr); if (bTakeOwnership && pDialog) diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 77334c1cc90d..e4f576201514 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -71,7 +71,7 @@ #include #include #include -#include +#include SalFrame::SalFrame() : m_pWindow(nullptr) diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 184313b8c12c..eb87ea7403f2 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -65,7 +65,7 @@ #include #include #include -#include +#include #if defined(DISABLE_DYNLOADING) || defined(LINUX) #include -- cgit