1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
11 #include <vcl/weld.hxx>
12 #include <vcl/svapp.hxx>
13 #include <vcl/syswin.hxx>
14 #include <vcl/settings.hxx>
15 #include <vcl/virdev.hxx>
16 #include <vcl/ctrl.hxx>
17 #include <vcl/toolkit/edit.hxx>
18 #include <vcl/formatter.hxx>
19 #include <vcl/toolkit/spinfld.hxx>
20 #include <vcl/toolkit/fixed.hxx>
21 #include <vcl/toolkit/lstbox.hxx>
22 #include <vcl/toolkit/menubtn.hxx>
23 #include <vcl/toolkit/combobox.hxx>
24 #include <vcl/tabctrl.hxx>
25 #include <vcl/layout.hxx>
26 #include <vcl/toolkit/svtabbx.hxx>
27 #include <vcl/toolkit/svlbitm.hxx>
28 #include <o3tl/sorted_vector.hxx>
29 #include "iconview.hxx"
30 #include "listbox.hxx"
31 #include "messagedialog.hxx"
33 class SalInstanceBuilder
: public weld::Builder
36 std::unique_ptr
<VclBuilder
> m_xBuilder
;
37 VclPtr
<vcl::Window
> m_aOwnedToplevel
;
40 SalInstanceBuilder(vcl::Window
* pParent
, const OUString
& rUIRoot
, const OUString
& rUIFile
,
41 const css::uno::Reference
<css::frame::XFrame
>& rFrame
42 = css::uno::Reference
<css::frame::XFrame
>());
44 virtual std::unique_ptr
<weld::MessageDialog
> weld_message_dialog(const OString
& id
) override
;
46 virtual std::unique_ptr
<weld::Dialog
> weld_dialog(const OString
& id
) override
;
48 virtual std::unique_ptr
<weld::Assistant
> weld_assistant(const OString
& id
) override
;
50 virtual std::unique_ptr
<weld::Window
> create_screenshot_window() override
;
52 virtual std::unique_ptr
<weld::Widget
> weld_widget(const OString
& id
) override
;
54 virtual std::unique_ptr
<weld::Container
> weld_container(const OString
& id
) override
;
56 virtual std::unique_ptr
<weld::Box
> weld_box(const OString
& id
) override
;
58 virtual std::unique_ptr
<weld::Paned
> weld_paned(const OString
& id
) override
;
60 virtual std::unique_ptr
<weld::Frame
> weld_frame(const OString
& id
) override
;
62 virtual std::unique_ptr
<weld::ScrolledWindow
>
63 weld_scrolled_window(const OString
& id
, bool bUserManagedScrolling
= false) override
;
65 virtual std::unique_ptr
<weld::Notebook
> weld_notebook(const OString
& id
) override
;
67 virtual std::unique_ptr
<weld::Button
> weld_button(const OString
& id
) override
;
69 virtual std::unique_ptr
<weld::MenuButton
> weld_menu_button(const OString
& id
) override
;
71 virtual std::unique_ptr
<weld::MenuToggleButton
>
72 weld_menu_toggle_button(const OString
& id
) override
;
74 virtual std::unique_ptr
<weld::LinkButton
> weld_link_button(const OString
& id
) override
;
76 virtual std::unique_ptr
<weld::ToggleButton
> weld_toggle_button(const OString
& id
) override
;
78 virtual std::unique_ptr
<weld::RadioButton
> weld_radio_button(const OString
& id
) override
;
80 virtual std::unique_ptr
<weld::CheckButton
> weld_check_button(const OString
& id
) override
;
82 virtual std::unique_ptr
<weld::Scale
> weld_scale(const OString
& id
) override
;
84 virtual std::unique_ptr
<weld::ProgressBar
> weld_progress_bar(const OString
& id
) override
;
86 virtual std::unique_ptr
<weld::Spinner
> weld_spinner(const OString
& id
) override
;
88 virtual std::unique_ptr
<weld::Image
> weld_image(const OString
& id
) override
;
90 virtual std::unique_ptr
<weld::Calendar
> weld_calendar(const OString
& id
) override
;
92 virtual std::unique_ptr
<weld::Entry
> weld_entry(const OString
& id
) override
;
94 virtual std::unique_ptr
<weld::SpinButton
> weld_spin_button(const OString
& id
) override
;
96 virtual std::unique_ptr
<weld::MetricSpinButton
>
97 weld_metric_spin_button(const OString
& id
, FieldUnit eUnit
) override
;
99 virtual std::unique_ptr
<weld::FormattedSpinButton
>
100 weld_formatted_spin_button(const OString
& id
) override
;
102 virtual std::unique_ptr
<weld::ComboBox
> weld_combo_box(const OString
& id
) override
;
104 virtual std::unique_ptr
<weld::EntryTreeView
>
105 weld_entry_tree_view(const OString
& containerid
, const OString
& entryid
,
106 const OString
& treeviewid
) override
;
108 virtual std::unique_ptr
<weld::TreeView
> weld_tree_view(const OString
& id
) override
;
110 virtual std::unique_ptr
<weld::IconView
> weld_icon_view(const OString
& id
) override
;
112 virtual std::unique_ptr
<weld::Label
> weld_label(const OString
& id
) override
;
114 virtual std::unique_ptr
<weld::TextView
> weld_text_view(const OString
& id
) override
;
116 virtual std::unique_ptr
<weld::Expander
> weld_expander(const OString
& id
) override
;
118 virtual std::unique_ptr
<weld::DrawingArea
>
119 weld_drawing_area(const OString
& id
, const a11yref
& rA11yImpl
= nullptr,
120 FactoryFunction pUITestFactoryFunction
= nullptr,
121 void* pUserData
= nullptr) override
;
123 virtual std::unique_ptr
<weld::Menu
> weld_menu(const OString
& id
) override
;
125 virtual std::unique_ptr
<weld::Popover
> weld_popover(const OString
& id
) override
;
127 virtual std::unique_ptr
<weld::Toolbar
> weld_toolbar(const OString
& id
) override
;
129 virtual std::unique_ptr
<weld::SizeGroup
> create_size_group() override
;
131 OString
get_current_page_help_id() const;
133 virtual ~SalInstanceBuilder() override
;
136 class SAL_DLLPUBLIC_RTTI SalInstanceMenu final
: public weld::Menu
139 VclPtr
<PopupMenu
> m_xMenu
;
141 bool m_bTakeOwnership
;
142 sal_uInt16 m_nLastId
;
144 DECL_DLLPRIVATE_LINK(SelectMenuHdl
, ::Menu
*, bool);
147 SalInstanceMenu(PopupMenu
* pMenu
, bool bTakeOwnership
);
148 virtual OString
popup_at_rect(weld::Widget
* pParent
, const tools::Rectangle
& rRect
,
149 weld::Placement ePlace
= weld::Placement::Under
) override
;
150 virtual void set_sensitive(const OString
& rIdent
, bool bSensitive
) override
;
151 virtual bool get_sensitive(const OString
& rIdent
) const override
;
152 virtual void set_active(const OString
& rIdent
, bool bActive
) override
;
153 virtual bool get_active(const OString
& rIdent
) const override
;
154 virtual void set_label(const OString
& rIdent
, const OUString
& rLabel
) override
;
155 virtual OUString
get_label(const OString
& rIdent
) const override
;
156 virtual void set_visible(const OString
& rIdent
, bool bShow
) override
;
157 virtual void clear() override
;
158 virtual void insert(int pos
, const OUString
& rId
, const OUString
& rStr
,
159 const OUString
* pIconName
, VirtualDevice
* pImageSurface
,
160 const css::uno::Reference
<css::graphic::XGraphic
>& rImage
,
161 TriState eCheckRadioFalse
) override
;
162 virtual void insert_separator(int pos
, const OUString
& rId
) override
;
163 virtual void remove(const OString
& rId
) override
;
164 virtual OString
get_id(int pos
) const override
;
165 virtual int n_children() const override
;
166 PopupMenu
* getMenu() const;
167 virtual ~SalInstanceMenu() override
;
170 class SalFlashAttention
;
172 class SalInstanceWidget
: public virtual weld::Widget
175 VclPtr
<vcl::Window
> m_xWidget
;
176 std::unique_ptr
<SalFlashAttention
> m_xFlashAttention
;
177 SalInstanceBuilder
* m_pBuilder
;
180 DECL_LINK(EventListener
, VclWindowEvent
&, void);
181 DECL_LINK(KeyEventListener
, VclWindowEvent
&, bool);
182 DECL_LINK(MouseEventListener
, VclWindowEvent
&, void);
183 DECL_LINK(MnemonicActivateHdl
, vcl::Window
&, bool);
185 static void DoRecursivePaint(vcl::Window
* pWindow
, const Point
& rPos
, OutputDevice
& rOutput
);
187 const bool m_bTakeOwnership
;
188 bool m_bEventListener
;
189 bool m_bKeyEventListener
;
190 bool m_bMouseEventListener
;
195 void ensure_event_listener();
197 // we want the ability to mark key events as handled, so use this variant
198 // for those, we get all keystrokes in this case, so we will need to filter
200 void ensure_key_listener();
202 // we want the ability to know about mouse events that happen in our children
203 // so use this variant, we will need to filter them later
204 void ensure_mouse_listener();
206 bool IsFirstFreeze() const { return m_nFreezeCount
== 0; }
207 bool IsLastThaw() const { return m_nFreezeCount
== 1; }
209 virtual void HandleEventListener(VclWindowEvent
& rEvent
);
210 virtual bool HandleKeyEventListener(VclWindowEvent
& rEvent
);
211 virtual void HandleMouseEventListener(VclWindowEvent
& rEvent
);
214 SalInstanceWidget(vcl::Window
* pWidget
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
216 virtual void set_sensitive(bool sensitive
) override
;
218 virtual bool get_sensitive() const override
;
220 virtual bool get_visible() const override
;
222 virtual bool is_visible() const override
;
224 virtual void set_can_focus(bool bCanFocus
) override
;
226 virtual void grab_focus() override
;
228 virtual bool has_focus() const override
;
230 virtual bool is_active() const override
;
232 virtual bool has_child_focus() const override
;
234 virtual void show() override
;
236 virtual void hide() override
;
238 virtual void set_size_request(int nWidth
, int nHeight
) override
;
240 virtual Size
get_size_request() const override
;
242 virtual Size
get_preferred_size() const override
;
244 virtual float get_approximate_digit_width() const override
;
246 virtual int get_text_height() const override
;
248 virtual Size
get_pixel_size(const OUString
& rText
) const override
;
250 virtual vcl::Font
get_font() override
;
252 virtual OString
get_buildable_name() const override
;
254 virtual void set_buildable_name(const OString
& rId
) override
;
256 virtual void set_help_id(const OString
& rId
) override
;
258 virtual OString
get_help_id() const override
;
260 virtual void set_grid_left_attach(int nAttach
) override
;
262 virtual int get_grid_left_attach() const override
;
264 virtual void set_grid_width(int nCols
) override
;
266 virtual void set_grid_top_attach(int nAttach
) override
;
268 virtual int get_grid_top_attach() const override
;
270 virtual void set_hexpand(bool bExpand
) override
;
272 virtual bool get_hexpand() const override
;
274 virtual void set_vexpand(bool bExpand
) override
;
276 virtual bool get_vexpand() const override
;
278 virtual void set_margin_top(int nMargin
) override
;
280 virtual void set_margin_bottom(int nMargin
) override
;
282 virtual void set_margin_start(int nMargin
) override
;
284 virtual void set_margin_end(int nMargin
) override
;
286 virtual int get_margin_top() const override
;
288 virtual int get_margin_bottom() const override
;
290 virtual int get_margin_start() const override
;
292 virtual int get_margin_end() const override
;
294 virtual void set_accessible_name(const OUString
& rName
) override
;
296 virtual void set_accessible_description(const OUString
& rDescription
) override
;
298 virtual OUString
get_accessible_name() const override
;
300 virtual OUString
get_accessible_description() const override
;
302 virtual void set_accessible_relation_labeled_by(weld::Widget
* pLabel
) override
;
304 virtual void set_tooltip_text(const OUString
& rTip
) override
;
306 virtual OUString
get_tooltip_text() const override
;
308 virtual void connect_focus_in(const Link
<Widget
&, void>& rLink
) override
;
310 virtual void connect_mnemonic_activate(const Link
<Widget
&, bool>& rLink
) override
;
312 virtual void connect_focus_out(const Link
<Widget
&, void>& rLink
) override
;
314 virtual void connect_size_allocate(const Link
<const Size
&, void>& rLink
) override
;
316 virtual void connect_mouse_press(const Link
<const MouseEvent
&, bool>& rLink
) override
;
318 virtual void connect_mouse_move(const Link
<const MouseEvent
&, bool>& rLink
) override
;
320 virtual void connect_mouse_release(const Link
<const MouseEvent
&, bool>& rLink
) override
;
322 virtual void connect_key_press(const Link
<const KeyEvent
&, bool>& rLink
) override
;
324 virtual void connect_key_release(const Link
<const KeyEvent
&, bool>& rLink
) override
;
326 virtual bool get_extents_relative_to(const Widget
& rRelative
, int& x
, int& y
, int& width
,
327 int& height
) const override
;
329 virtual void grab_add() override
;
331 virtual bool has_grab() const override
;
333 virtual void grab_remove() override
;
335 virtual bool get_direction() const override
;
337 virtual void set_direction(bool bRTL
) override
;
339 virtual void freeze() override
;
341 virtual void thaw() override
;
343 virtual void set_busy_cursor(bool bBusy
) override
;
345 virtual std::unique_ptr
<weld::Container
> weld_parent() const override
;
347 virtual ~SalInstanceWidget() override
;
349 vcl::Window
* getWidget() const;
351 void disable_notify_events();
353 bool notify_events_disabled() const;
355 void enable_notify_events();
357 virtual void queue_resize() override
;
359 virtual void help_hierarchy_foreach(const std::function
<bool(const OString
&)>& func
) override
;
361 virtual OUString
strip_mnemonic(const OUString
& rLabel
) const override
;
363 virtual VclPtr
<VirtualDevice
> create_virtual_device() const override
;
365 virtual css::uno::Reference
<css::datatransfer::dnd::XDropTarget
> get_drop_target() override
;
366 virtual css::uno::Reference
<css::datatransfer::clipboard::XClipboard
>
367 get_clipboard() const override
;
369 virtual void connect_get_property_tree(const Link
<tools::JsonWriter
&, void>& rLink
) override
;
371 virtual void get_property_tree(tools::JsonWriter
& rJsonWriter
) override
;
373 virtual void call_attention_to() override
;
375 virtual void set_stack_background() override
;
377 virtual void set_title_background() override
;
379 virtual void set_toolbar_background() override
;
381 virtual void set_highlight_background() override
;
383 virtual void set_background(const Color
& rColor
) override
;
385 virtual void draw(OutputDevice
& rOutput
, const Point
& rPos
, const Size
& rSizePixel
) override
;
387 SystemWindow
* getSystemWindow();
390 class SalInstanceLabel
: public SalInstanceWidget
, public virtual weld::Label
393 // Control instead of FixedText so we can also use this for
394 // SelectableFixedText which is derived from Edit. We just typically need
395 // [G|S]etText which exists in their shared baseclass
396 VclPtr
<Control
> m_xLabel
;
399 SalInstanceLabel(Control
* pLabel
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
401 virtual void set_label(const OUString
& rText
) override
;
403 virtual OUString
get_label() const override
;
405 virtual void set_mnemonic_widget(Widget
* pTarget
) override
;
407 virtual void set_label_type(weld::LabelType eType
) override
;
409 virtual void set_font(const vcl::Font
& rFont
) override
;
411 virtual void set_font_color(const Color
& rColor
) override
;
414 class SalInstanceContainer
: public SalInstanceWidget
, public virtual weld::Container
417 VclPtr
<vcl::Window
> m_xContainer
;
420 SalInstanceContainer(vcl::Window
* pContainer
, SalInstanceBuilder
* pBuilder
,
421 bool bTakeOwnership
);
422 virtual void HandleEventListener(VclWindowEvent
& rEvent
) override
;
423 virtual void connect_container_focus_changed(const Link
<Container
&, void>& rLink
) override
;
424 virtual void child_grab_focus() override
;
425 virtual void move(weld::Widget
* pWidget
, weld::Container
* pNewParent
) override
;
426 virtual css::uno::Reference
<css::awt::XWindow
> CreateChildFrame() override
;
429 class SalInstanceWindow
: public SalInstanceContainer
, public virtual weld::Window
432 VclPtr
<vcl::Window
> m_xWindow
;
434 DECL_LINK(HelpHdl
, vcl::Window
&, bool);
436 void override_child_help(vcl::Window
* pParent
);
438 void clear_child_help(vcl::Window
* pParent
);
440 void recursively_unset_default_buttons();
442 void implResetDefault(const vcl::Window
* _pWindow
);
445 SalInstanceWindow(vcl::Window
* pWindow
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
447 virtual void set_title(const OUString
& rTitle
) override
;
449 virtual OUString
get_title() const override
;
453 virtual css::uno::Reference
<css::awt::XWindow
> GetXWindow() override
;
455 virtual void resize_to_request() override
;
457 virtual void set_modal(bool bModal
) override
;
459 virtual bool get_modal() const override
;
461 virtual void window_move(int x
, int y
) override
;
463 virtual Size
get_size() const override
;
465 virtual Point
get_position() const override
;
467 virtual tools::Rectangle
get_monitor_workarea() const override
;
469 virtual void set_centered_on_parent(bool /*bTrackGeometryRequests*/) override
;
471 virtual bool get_resizable() const override
;
473 virtual bool has_toplevel_focus() const override
;
475 virtual void present() override
;
477 virtual void change_default_widget(weld::Widget
* pOld
, weld::Widget
* pNew
) override
;
479 virtual bool is_default_widget(const weld::Widget
* pCandidate
) const override
;
481 virtual void set_window_state(const OString
& rStr
) override
;
483 virtual OString
get_window_state(WindowStateMask nMask
) const override
;
485 virtual SystemEnvData
get_system_data() const override
;
487 virtual weld::ScreenShotCollection
collect_screenshot_data() override
;
489 virtual VclPtr
<VirtualDevice
> screenshot() override
;
491 virtual ~SalInstanceWindow() override
;
494 class SalInstanceDialog
: public SalInstanceWindow
, public virtual weld::Dialog
497 VclPtr
<::Dialog
> m_xDialog
;
499 // for calc ref dialog that shrink to range selection widgets and resize back
500 VclPtr
<vcl::Window
> m_xRefEdit
;
501 std::vector
<VclPtr
<vcl::Window
>> m_aHiddenWidgets
; // vector of hidden Controls
502 tools::Long m_nOldEditWidthReq
; // Original width request of the input field
503 sal_Int32 m_nOldBorderWidth
; // border width for expanded dialog
505 DECL_LINK(PopupScreenShotMenuHdl
, const CommandEvent
&, bool);
508 SalInstanceDialog(::Dialog
* pDialog
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
510 virtual bool runAsync(std::shared_ptr
<weld::DialogController
> aOwner
,
511 const std::function
<void(sal_Int32
)>& rEndDialogFn
) override
;
513 virtual bool runAsync(std::shared_ptr
<Dialog
> const& rxSelf
,
514 const std::function
<void(sal_Int32
)>& rEndDialogFn
) override
;
516 virtual void collapse(weld::Widget
* pEdit
, weld::Widget
* pButton
) override
;
518 virtual void undo_collapse() override
;
521 SetInstallLOKNotifierHdl(const Link
<void*, vcl::ILibreOfficeKitNotifier
*>& rLink
) override
;
523 virtual int run() override
;
525 virtual void response(int nResponse
) override
;
527 virtual void add_button(const OUString
& rText
, int nResponse
,
528 const OString
& rHelpId
= OString()) override
;
530 virtual void set_modal(bool bModal
) override
;
532 virtual bool get_modal() const override
;
534 virtual weld::Button
* weld_widget_for_response(int nResponse
) override
;
536 virtual void set_default_response(int nResponse
) override
;
538 virtual weld::Container
* weld_content_area() override
;
541 class WeldTextFilter final
: public TextFilter
544 Link
<OUString
&, bool>& m_rInsertTextHdl
;
547 WeldTextFilter(Link
<OUString
&, bool>& rInsertTextHdl
);
549 virtual OUString
filter(const OUString
& rText
) override
;
552 class SalInstanceEntry
: public SalInstanceWidget
, public virtual weld::Entry
555 VclPtr
<::Edit
> m_xEntry
;
557 DECL_LINK(ChangeHdl
, Edit
&, void);
558 DECL_LINK(CursorListener
, VclWindowEvent
&, void);
559 DECL_LINK(ActivateHdl
, Edit
&, bool);
561 WeldTextFilter m_aTextFilter
;
564 SalInstanceEntry(::Edit
* pEntry
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
566 virtual void set_text(const OUString
& rText
) override
;
568 virtual OUString
get_text() const override
;
570 virtual void set_width_chars(int nChars
) override
;
572 virtual int get_width_chars() const override
;
574 virtual void set_max_length(int nChars
) override
;
576 virtual void select_region(int nStartPos
, int nEndPos
) override
;
578 bool get_selection_bounds(int& rStartPos
, int& rEndPos
) override
;
580 virtual void replace_selection(const OUString
& rText
) override
;
582 virtual void set_position(int nCursorPos
) override
;
584 virtual int get_position() const override
;
586 virtual void set_editable(bool bEditable
) override
;
588 virtual bool get_editable() const override
;
590 virtual void set_overwrite_mode(bool bOn
) override
;
592 virtual bool get_overwrite_mode() const override
;
594 virtual void set_message_type(weld::EntryMessageType eType
) override
;
596 virtual void set_font(const vcl::Font
& rFont
) override
;
598 virtual void set_font_color(const Color
& rColor
) override
;
600 virtual void connect_cursor_position(const Link
<Entry
&, void>& rLink
) override
;
602 virtual void set_placeholder_text(const OUString
& rText
) override
;
606 void fire_signal_changed();
608 virtual void cut_clipboard() override
;
610 virtual void copy_clipboard() override
;
612 virtual void paste_clipboard() override
;
614 virtual void set_alignment(TxtAlign eXAlign
) override
;
616 virtual ~SalInstanceEntry() override
;
619 class SalInstanceSpinButton
: public SalInstanceEntry
, public virtual weld::SpinButton
622 VclPtr
<FormattedField
> m_xButton
;
623 Formatter
& m_rFormatter
;
625 DECL_LINK(UpDownHdl
, SpinField
&, void);
626 DECL_LINK(LoseFocusHdl
, Control
&, void);
627 DECL_LINK(OutputHdl
, LinkParamNone
*, bool);
628 DECL_LINK(InputHdl
, sal_Int64
*, TriState
);
629 DECL_LINK(ActivateHdl
, Edit
&, bool);
631 double toField(sal_Int64 nValue
) const;
633 sal_Int64
fromField(double fValue
) const;
636 SalInstanceSpinButton(FormattedField
* pButton
, SalInstanceBuilder
* pBuilder
,
637 bool bTakeOwnership
);
639 virtual sal_Int64
get_value() const override
;
641 virtual void set_value(sal_Int64 value
) override
;
643 virtual void set_range(sal_Int64 min
, sal_Int64 max
) override
;
645 virtual void get_range(sal_Int64
& min
, sal_Int64
& max
) const override
;
647 virtual void set_increments(int step
, int /*page*/) override
;
649 virtual void get_increments(int& step
, int& page
) const override
;
651 virtual void set_digits(unsigned int digits
) override
;
653 // SpinButton may be comprised of multiple subwidgets, consider the lot as
654 // one thing for focus
655 virtual bool has_focus() const override
;
657 //off by default for direct SpinButtons, MetricSpinButton enables it
658 void SetUseThousandSep();
660 virtual unsigned int get_digits() const override
;
662 virtual ~SalInstanceSpinButton() override
;
665 //ComboBox and ListBox have similar apis, ComboBoxes in LibreOffice have an edit box and ListBoxes
666 //don't. This distinction isn't there in Gtk. Use a template to sort this problem out.
667 template <class vcl_type
>
668 class SalInstanceComboBox
: public SalInstanceWidget
, public virtual weld::ComboBox
671 // owner for ListBox/ComboBox UserData
672 std::vector
<std::shared_ptr
<OUString
>> m_aUserData
;
673 VclPtr
<vcl_type
> m_xComboBox
;
674 ScopedVclPtr
<MenuButton
> m_xMenuButton
;
675 OUString m_sMenuButtonRow
;
678 SalInstanceComboBox(vcl_type
* pComboBox
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
)
679 : SalInstanceWidget(pComboBox
, pBuilder
, bTakeOwnership
)
680 , m_xComboBox(pComboBox
)
684 virtual int get_active() const override
686 const sal_Int32 nRet
= m_xComboBox
->GetSelectedEntryPos();
687 if (nRet
== LISTBOX_ENTRY_NOTFOUND
)
692 const OUString
* getEntryData(int index
) const
694 return static_cast<const OUString
*>(m_xComboBox
->GetEntryData(index
));
697 // ComboBoxes are comprised of multiple subwidgets, consider the lot as
698 // one thing for focus
699 virtual bool has_focus() const override
701 return m_xWidget
->HasChildPathFocus()
702 || (m_xMenuButton
&& (m_xMenuButton
->HasFocus() || m_xMenuButton
->InPopupMode()));
705 virtual OUString
get_active_id() const override
707 sal_Int32 nPos
= m_xComboBox
->GetSelectedEntryPos();
708 const OUString
* pRet
;
709 if (nPos
!= LISTBOX_ENTRY_NOTFOUND
)
710 pRet
= getEntryData(m_xComboBox
->GetSelectedEntryPos());
718 virtual void set_active_id(const OUString
& rStr
) override
720 for (int i
= 0; i
< get_count(); ++i
)
722 const OUString
* pId
= getEntryData(i
);
726 m_xComboBox
->SelectEntryPos(i
);
730 virtual void set_active(int pos
) override
734 m_xComboBox
->SetNoSelection();
737 m_xComboBox
->SelectEntryPos(pos
);
740 virtual OUString
get_text(int pos
) const override
{ return m_xComboBox
->GetEntry(pos
); }
742 virtual OUString
get_id(int pos
) const override
744 const OUString
* pRet
= getEntryData(pos
);
750 virtual void set_id(int row
, const OUString
& rId
) override
752 m_aUserData
.emplace_back(std::make_unique
<OUString
>(rId
));
753 m_xComboBox
->SetEntryData(row
, m_aUserData
.back().get());
756 virtual void insert_vector(const std::vector
<weld::ComboBoxEntry
>& rItems
,
757 bool bKeepExisting
) override
762 for (const auto& rItem
: rItems
)
764 insert(-1, rItem
.sString
, rItem
.sId
.isEmpty() ? nullptr : &rItem
.sId
,
765 rItem
.sImage
.isEmpty() ? nullptr : &rItem
.sImage
, nullptr);
770 virtual int get_count() const override
{ return m_xComboBox
->GetEntryCount(); }
772 virtual int find_text(const OUString
& rStr
) const override
774 const sal_Int32 nRet
= m_xComboBox
->GetEntryPos(rStr
);
775 if (nRet
== LISTBOX_ENTRY_NOTFOUND
)
780 virtual int find_id(const OUString
& rStr
) const override
782 for (int i
= 0; i
< get_count(); ++i
)
784 const OUString
* pId
= getEntryData(i
);
793 virtual void clear() override
795 m_xComboBox
->Clear();
799 virtual void make_sorted() override
801 m_xComboBox
->SetStyle(m_xComboBox
->GetStyle() | WB_SORT
);
804 virtual bool get_popup_shown() const override
{ return m_xComboBox
->IsInDropDown(); }
806 virtual void connect_popup_toggled(const Link
<ComboBox
&, void>& rLink
) override
808 weld::ComboBox::connect_popup_toggled(rLink
);
809 ensure_event_listener();
812 void call_signal_custom_render(UserDrawEvent
* pEvent
)
814 vcl::RenderContext
* pRenderContext
= pEvent
->GetRenderContext();
815 auto nPos
= pEvent
->GetItemId();
816 const tools::Rectangle
& rRect
= pEvent
->GetRect();
817 const OUString sId
= get_id(nPos
);
818 signal_custom_render(*pRenderContext
, rRect
, pEvent
->IsSelected(), sId
);
819 m_xComboBox
->DrawEntry(*pEvent
); // draw separator
821 if (m_xMenuButton
&& m_xMenuButton
->IsVisible() && m_sMenuButtonRow
== sId
)
823 vcl::Window
* pEventWindow
= m_xComboBox
->GetMainWindow();
824 if (m_xMenuButton
->GetParent() != pEventWindow
)
825 m_xMenuButton
->SetParent(pEventWindow
);
826 int nButtonWidth
= get_menu_button_width();
827 m_xMenuButton
->SetSizePixel(Size(nButtonWidth
, rRect
.GetHeight()));
828 m_xMenuButton
->SetPosPixel(Point(rRect
.GetWidth() - nButtonWidth
, rRect
.Top()));
832 VclPtr
<VirtualDevice
> create_render_virtual_device() const override
834 auto xRet
= VclPtr
<VirtualDevice
>::Create();
835 xRet
->SetBackground(Application::GetSettings().GetStyleSettings().GetFieldColor());
839 virtual void set_item_menu(const OString
& rIdent
, weld::Menu
* pMenu
) override
841 SalInstanceMenu
* pInstanceMenu
= dynamic_cast<SalInstanceMenu
*>(pMenu
);
843 PopupMenu
* pPopup
= pInstanceMenu
? pInstanceMenu
->getMenu() : nullptr;
847 = VclPtr
<MenuButton
>::Create(m_xComboBox
, WB_FLATBUTTON
| WB_NOPOINTERFOCUS
);
849 m_xMenuButton
->SetPopupMenu(pPopup
);
850 m_xMenuButton
->Show(pPopup
!= nullptr);
851 m_sMenuButtonRow
= OUString::fromUtf8(rIdent
);
854 int get_menu_button_width() const override
856 OutputDevice
* pDefault
= Application::GetDefaultDevice();
857 return 20 * (pDefault
? pDefault
->GetDPIScaleFactor() : 1.0);
860 void CallHandleEventListener(VclWindowEvent
& rEvent
)
862 if (rEvent
.GetId() == VclEventId::DropdownPreOpen
863 || rEvent
.GetId() == VclEventId::DropdownClose
)
865 signal_popup_toggled();
868 SalInstanceWidget::HandleEventListener(rEvent
);
872 class SalInstanceComboBoxWithoutEdit
: public SalInstanceComboBox
<ListBox
>
875 DECL_LINK(SelectHdl
, ListBox
&, void);
878 SalInstanceComboBoxWithoutEdit(ListBox
* pListBox
, SalInstanceBuilder
* pBuilder
,
879 bool bTakeOwnership
);
881 virtual OUString
get_active_text() const override
;
883 virtual void remove(int pos
) override
;
885 virtual void insert(int pos
, const OUString
& rStr
, const OUString
* pId
,
886 const OUString
* pIconName
, VirtualDevice
* pImageSurface
) override
;
888 virtual void insert_separator(int pos
, const OUString
& /*rId*/) override
;
890 virtual bool has_entry() const override
;
892 virtual bool changed_by_direct_pick() const override
;
894 virtual void set_entry_message_type(weld::EntryMessageType
/*eType*/) override
;
896 virtual void set_entry_text(const OUString
& /*rText*/) override
;
898 virtual void select_entry_region(int /*nStartPos*/, int /*nEndPos*/) override
;
900 virtual bool get_entry_selection_bounds(int& /*rStartPos*/, int& /*rEndPos*/) override
;
902 virtual void set_entry_width_chars(int /*nChars*/) override
;
904 virtual void set_entry_max_length(int /*nChars*/) override
;
906 virtual void set_entry_completion(bool, bool bCaseSensitive
= false) override
;
908 virtual void set_entry_placeholder_text(const OUString
&) override
;
910 virtual void set_entry_editable(bool bEditable
) override
;
912 virtual void cut_entry_clipboard() override
;
914 virtual void copy_entry_clipboard() override
;
916 virtual void paste_entry_clipboard() override
;
918 virtual void set_font(const vcl::Font
& rFont
) override
;
920 virtual void set_entry_font(const vcl::Font
&) override
;
922 virtual vcl::Font
get_entry_font() override
;
924 virtual void set_custom_renderer(bool bOn
) override
;
926 virtual int get_max_mru_count() const override
;
928 virtual void set_max_mru_count(int) override
;
930 virtual OUString
get_mru_entries() const override
;
932 virtual void set_mru_entries(const OUString
&) override
;
934 virtual void HandleEventListener(VclWindowEvent
& rEvent
) override
;
936 virtual ~SalInstanceComboBoxWithoutEdit() override
;
939 class SalInstanceComboBoxWithEdit
: public SalInstanceComboBox
<ComboBox
>
942 DECL_LINK(ChangeHdl
, Edit
&, void);
943 DECL_LINK(EntryActivateHdl
, Edit
&, bool);
944 DECL_LINK(SelectHdl
, ::ComboBox
&, void);
945 DECL_LINK(UserDrawHdl
, UserDrawEvent
*, void);
946 WeldTextFilter m_aTextFilter
;
950 SalInstanceComboBoxWithEdit(::ComboBox
* pComboBox
, SalInstanceBuilder
* pBuilder
,
951 bool bTakeOwnership
);
953 virtual bool has_entry() const override
;
955 virtual bool changed_by_direct_pick() const override
;
957 virtual void set_entry_message_type(weld::EntryMessageType eType
) override
;
959 virtual OUString
get_active_text() const override
;
961 virtual void remove(int pos
) override
;
963 virtual void insert(int pos
, const OUString
& rStr
, const OUString
* pId
,
964 const OUString
* pIconName
, VirtualDevice
* pImageSurface
) override
;
966 virtual void insert_separator(int pos
, const OUString
& /*rId*/) override
;
968 virtual void set_entry_text(const OUString
& rText
) override
;
970 virtual void set_entry_width_chars(int nChars
) override
;
972 virtual void set_entry_max_length(int nChars
) override
;
974 virtual void set_entry_completion(bool bEnable
, bool bCaseSensitive
= false) override
;
976 virtual void set_entry_placeholder_text(const OUString
& rText
) override
;
978 virtual void set_entry_editable(bool bEditable
) override
;
980 virtual void cut_entry_clipboard() override
;
982 virtual void copy_entry_clipboard() override
;
984 virtual void paste_entry_clipboard() override
;
986 virtual void select_entry_region(int nStartPos
, int nEndPos
) override
;
988 virtual bool get_entry_selection_bounds(int& rStartPos
, int& rEndPos
) override
;
990 virtual void set_font(const vcl::Font
& rFont
) override
;
992 virtual void set_entry_font(const vcl::Font
& rFont
) override
;
994 virtual vcl::Font
get_entry_font() override
;
996 virtual void set_custom_renderer(bool bOn
) override
;
998 virtual int get_max_mru_count() const override
;
1000 virtual void set_max_mru_count(int nCount
) override
;
1002 virtual OUString
get_mru_entries() const override
;
1004 virtual void set_mru_entries(const OUString
& rEntries
) override
;
1006 virtual void HandleEventListener(VclWindowEvent
& rEvent
) override
;
1008 virtual void call_attention_to() override
;
1010 virtual ~SalInstanceComboBoxWithEdit() override
;
1013 class SalInstanceButton
: public SalInstanceWidget
, public virtual weld::Button
1016 VclPtr
<::Button
> m_xButton
;
1017 Link
<::Button
*, void> const m_aOldClickHdl
;
1019 DECL_LINK(ClickHdl
, ::Button
*, void);
1022 void set_label_wrap(bool bWrap
);
1025 SalInstanceButton(::Button
* pButton
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
1027 virtual void set_label(const OUString
& rText
) override
;
1029 virtual void set_image(VirtualDevice
* pDevice
) override
;
1031 virtual void set_image(const css::uno::Reference
<css::graphic::XGraphic
>& rImage
) override
;
1033 virtual void set_from_icon_name(const OUString
& rIconName
) override
;
1035 virtual OUString
get_label() const override
;
1037 virtual void set_font(const vcl::Font
& rFont
) override
;
1039 virtual void set_custom_button(VirtualDevice
* pDevice
) override
;
1041 virtual ~SalInstanceButton() override
;
1044 class SalInstanceNotebook
: public SalInstanceWidget
, public virtual weld::Notebook
1047 VclPtr
<TabControl
> m_xNotebook
;
1048 mutable std::vector
<std::shared_ptr
<SalInstanceContainer
>> m_aPages
;
1049 std::map
<OString
, std::pair
<VclPtr
<TabPage
>, VclPtr
<VclGrid
>>> m_aAddedPages
;
1051 DECL_LINK(DeactivatePageHdl
, TabControl
*, bool);
1052 DECL_LINK(ActivatePageHdl
, TabControl
*, void);
1055 SalInstanceNotebook(TabControl
* pNotebook
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
1057 virtual int get_current_page() const override
;
1059 virtual int get_page_index(const OString
& rIdent
) const override
;
1061 virtual OString
get_page_ident(int nPage
) const override
;
1063 virtual OString
get_current_page_ident() const override
;
1065 virtual weld::Container
* get_page(const OString
& rIdent
) const override
;
1067 virtual void set_current_page(int nPage
) override
;
1069 virtual void set_current_page(const OString
& rIdent
) override
;
1071 virtual void remove_page(const OString
& rIdent
) override
;
1073 virtual void insert_page(const OString
& rIdent
, const OUString
& rLabel
, int nPos
) override
;
1075 virtual int get_n_pages() const override
;
1077 virtual OUString
get_tab_label_text(const OString
& rIdent
) const override
;
1079 virtual void set_tab_label_text(const OString
& rIdent
, const OUString
& rText
) override
;
1081 virtual ~SalInstanceNotebook() override
;
1084 class SalInstanceMessageDialog
: public SalInstanceDialog
, public virtual weld::MessageDialog
1087 VclPtr
<::MessageDialog
> m_xMessageDialog
;
1090 SalInstanceMessageDialog(::MessageDialog
* pDialog
, SalInstanceBuilder
* pBuilder
,
1091 bool bTakeOwnership
);
1093 virtual void set_primary_text(const OUString
& rText
) override
;
1095 virtual OUString
get_primary_text() const override
;
1097 virtual void set_secondary_text(const OUString
& rText
) override
;
1099 virtual OUString
get_secondary_text() const override
;
1101 virtual weld::Container
* weld_message_area() override
;
1104 class SalInstanceCheckButton
: public SalInstanceButton
, public virtual weld::CheckButton
1107 VclPtr
<CheckBox
> m_xCheckButton
;
1109 DECL_LINK(ToggleHdl
, CheckBox
&, void);
1112 SalInstanceCheckButton(CheckBox
* pButton
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
1114 virtual void set_active(bool active
) override
;
1116 virtual bool get_active() const override
;
1118 virtual void set_inconsistent(bool inconsistent
) override
;
1120 virtual bool get_inconsistent() const override
;
1122 virtual void set_label(const OUString
& rText
) override
{ SalInstanceButton::set_label(rText
); }
1124 virtual OUString
get_label() const override
{ return SalInstanceButton::get_label(); }
1126 virtual void set_label_wrap(bool wrap
) override
{ SalInstanceButton::set_label_wrap(wrap
); }
1128 virtual ~SalInstanceCheckButton() override
;
1131 class SalInstanceDrawingArea
: public SalInstanceWidget
, public virtual weld::DrawingArea
1134 VclPtr
<VclDrawingArea
> m_xDrawingArea
;
1136 typedef std::pair
<vcl::RenderContext
&, const tools::Rectangle
&> target_and_area
;
1137 DECL_LINK(PaintHdl
, target_and_area
, void);
1138 DECL_LINK(ResizeHdl
, const Size
&, void);
1139 DECL_LINK(MousePressHdl
, const MouseEvent
&, bool);
1140 DECL_LINK(MouseMoveHdl
, const MouseEvent
&, bool);
1141 DECL_LINK(MouseReleaseHdl
, const MouseEvent
&, bool);
1142 DECL_LINK(KeyPressHdl
, const KeyEvent
&, bool);
1143 DECL_LINK(KeyReleaseHdl
, const KeyEvent
&, bool);
1144 DECL_LINK(StyleUpdatedHdl
, VclDrawingArea
&, void);
1145 DECL_LINK(CommandHdl
, const CommandEvent
&, bool);
1146 DECL_LINK(QueryTooltipHdl
, tools::Rectangle
&, OUString
);
1147 DECL_LINK(GetSurroundingHdl
, OUString
&, int);
1148 DECL_LINK(DeleteSurroundingHdl
, const Selection
&, bool);
1149 DECL_LINK(StartDragHdl
, VclDrawingArea
*, bool);
1151 // SalInstanceWidget has a generic listener for all these
1152 // events, ignore the ones we have specializations for
1153 // in VclDrawingArea
1154 virtual void HandleEventListener(VclWindowEvent
& rEvent
) override
;
1156 virtual void HandleMouseEventListener(VclWindowEvent
& rEvent
) override
;
1158 virtual bool HandleKeyEventListener(VclWindowEvent
& /*rEvent*/) override
;
1161 SalInstanceDrawingArea(VclDrawingArea
* pDrawingArea
, SalInstanceBuilder
* pBuilder
,
1162 const a11yref
& rAlly
, FactoryFunction pUITestFactoryFunction
,
1163 void* pUserData
, bool bTakeOwnership
);
1165 virtual void queue_draw() override
;
1167 virtual void queue_draw_area(int x
, int y
, int width
, int height
) override
;
1169 virtual void connect_size_allocate(const Link
<const Size
&, void>& rLink
) override
;
1171 virtual void connect_key_press(const Link
<const KeyEvent
&, bool>& rLink
) override
;
1173 virtual void connect_key_release(const Link
<const KeyEvent
&, bool>& rLink
) override
;
1175 virtual void set_cursor(PointerStyle ePointerStyle
) override
;
1177 virtual Point
get_pointer_position() const override
;
1179 virtual void set_input_context(const InputContext
& rInputContext
) override
;
1181 virtual void im_context_set_cursor_location(const tools::Rectangle
& rCursorRect
,
1182 int nExtTextInputWidth
) override
;
1184 virtual a11yref
get_accessible_parent() override
;
1186 virtual a11yrelationset
get_accessible_relation_set() override
;
1188 virtual Point
get_accessible_location_on_screen() override
;
1190 virtual void enable_drag_source(rtl::Reference
<TransferDataContainer
>& rHelper
,
1191 sal_uInt8 eDNDConstants
) override
;
1193 virtual ~SalInstanceDrawingArea() override
;
1195 virtual OutputDevice
& get_ref_device() override
;
1197 virtual void click(const Point
& rPos
) override
;
1200 class SalInstanceToolbar
: public SalInstanceWidget
, public virtual weld::Toolbar
1203 VclPtr
<ToolBox
> m_xToolBox
;
1204 std::map
<ToolBoxItemId
, VclPtr
<vcl::Window
>> m_aFloats
;
1205 std::map
<ToolBoxItemId
, VclPtr
<PopupMenu
>> m_aMenus
;
1207 OString m_sStartShowIdent
;
1209 DECL_LINK(ClickHdl
, ToolBox
*, void);
1210 DECL_LINK(DropdownClick
, ToolBox
*, void);
1211 DECL_LINK(MenuToggleListener
, VclWindowEvent
&, void);
1214 SalInstanceToolbar(ToolBox
* pToolBox
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
1216 virtual void set_item_sensitive(const OString
& rIdent
, bool bSensitive
) override
;
1218 virtual bool get_item_sensitive(const OString
& rIdent
) const override
;
1220 virtual void set_item_visible(const OString
& rIdent
, bool bVisible
) override
;
1222 virtual void set_item_help_id(const OString
& rIdent
, const OString
& rHelpId
) override
;
1224 virtual bool get_item_visible(const OString
& rIdent
) const override
;
1226 virtual void set_item_active(const OString
& rIdent
, bool bActive
) override
;
1228 virtual bool get_item_active(const OString
& rIdent
) const override
;
1230 void set_menu_item_active(const OString
& rIdent
, bool bActive
) override
;
1232 bool get_menu_item_active(const OString
& rIdent
) const override
;
1234 virtual void set_item_popover(const OString
& rIdent
, weld::Widget
* pPopover
) override
;
1236 virtual void set_item_menu(const OString
& rIdent
, weld::Menu
* pMenu
) override
;
1238 virtual void insert_item(int pos
, const OUString
& rId
) override
;
1240 virtual void insert_separator(int pos
, const OUString
& /*rId*/) override
;
1242 virtual int get_n_items() const override
;
1244 virtual OString
get_item_ident(int nIndex
) const override
;
1246 virtual void set_item_ident(int nIndex
, const OString
& rIdent
) override
;
1248 virtual void set_item_label(int nIndex
, const OUString
& rLabel
) override
;
1250 virtual OUString
get_item_label(const OString
& rIdent
) const override
;
1252 virtual void set_item_label(const OString
& rIdent
, const OUString
& rLabel
) override
;
1254 virtual void set_item_icon_name(const OString
& rIdent
, const OUString
& rIconName
) override
;
1256 virtual void set_item_image(const OString
& rIdent
,
1257 const css::uno::Reference
<css::graphic::XGraphic
>& rIcon
) override
;
1259 virtual void set_item_image(const OString
& rIdent
, VirtualDevice
* pDevice
) override
;
1261 virtual void set_item_image(int nIndex
,
1262 const css::uno::Reference
<css::graphic::XGraphic
>& rIcon
) override
;
1264 virtual void set_item_tooltip_text(int nIndex
, const OUString
& rTip
) override
;
1266 virtual void set_item_tooltip_text(const OString
& rIdent
, const OUString
& rTip
) override
;
1268 virtual OUString
get_item_tooltip_text(const OString
& rIdent
) const override
;
1270 virtual vcl::ImageType
get_icon_size() const override
;
1272 virtual void set_icon_size(vcl::ImageType eType
) override
;
1274 virtual sal_uInt16
get_modifier_state() const override
;
1276 virtual int get_drop_index(const Point
& rPoint
) const override
;
1278 virtual ~SalInstanceToolbar() override
;
1281 class SalInstanceTextView
: public SalInstanceWidget
, public virtual weld::TextView
1284 VclPtr
<VclMultiLineEdit
> m_xTextView
;
1285 Link
<ScrollBar
*, void> m_aOrigVScrollHdl
;
1287 DECL_LINK(ChangeHdl
, Edit
&, void);
1288 DECL_LINK(VscrollHdl
, ScrollBar
*, void);
1289 DECL_LINK(CursorListener
, VclWindowEvent
&, void);
1292 SalInstanceTextView(VclMultiLineEdit
* pTextView
, SalInstanceBuilder
* pBuilder
,
1293 bool bTakeOwnership
);
1295 virtual void set_text(const OUString
& rText
) override
;
1297 virtual void replace_selection(const OUString
& rText
) override
;
1299 virtual OUString
get_text() const override
;
1301 bool get_selection_bounds(int& rStartPos
, int& rEndPos
) override
;
1303 virtual void select_region(int nStartPos
, int nEndPos
) override
;
1305 virtual void set_editable(bool bEditable
) override
;
1306 virtual bool get_editable() const override
;
1307 virtual void set_max_length(int nChars
) override
;
1309 virtual void set_monospace(bool bMonospace
) override
;
1311 virtual void set_font(const vcl::Font
& rFont
) override
;
1313 virtual void set_font_color(const Color
& rColor
) override
;
1315 virtual void connect_cursor_position(const Link
<TextView
&, void>& rLink
) override
;
1317 virtual bool can_move_cursor_with_up() const override
;
1319 virtual bool can_move_cursor_with_down() const override
;
1321 virtual void cut_clipboard() override
;
1323 virtual void copy_clipboard() override
;
1325 virtual void paste_clipboard() override
;
1327 virtual void set_alignment(TxtAlign eXAlign
) override
;
1329 virtual int vadjustment_get_value() const override
;
1331 virtual void vadjustment_set_value(int value
) override
;
1333 virtual int vadjustment_get_upper() const override
;
1335 virtual int vadjustment_get_lower() const override
;
1337 virtual int vadjustment_get_page_size() const override
;
1339 virtual bool has_focus() const override
;
1341 virtual ~SalInstanceTextView() override
;
1344 struct SalInstanceTreeIter final
: public weld::TreeIter
1346 SalInstanceTreeIter(const SalInstanceTreeIter
* pOrig
)
1347 : iter(pOrig
? pOrig
->iter
: nullptr)
1350 SalInstanceTreeIter(SvTreeListEntry
* pIter
)
1354 virtual bool equal(const TreeIter
& rOther
) const override
1356 return iter
== static_cast<const SalInstanceTreeIter
&>(rOther
).iter
;
1358 SvTreeListEntry
* iter
;
1361 class SalInstanceTreeView
: public SalInstanceWidget
, public virtual weld::TreeView
1364 // owner for UserData
1365 std::vector
<std::unique_ptr
<OUString
>> m_aUserData
;
1366 VclPtr
<SvTabListBox
> m_xTreeView
;
1367 SvLBoxButtonData m_aCheckButtonData
;
1368 SvLBoxButtonData m_aRadioButtonData
;
1369 // currently expanding parent that logically, but not currently physically,
1370 // contain placeholders
1371 o3tl::sorted_vector
<SvTreeListEntry
*> m_aExpandingPlaceHolderParents
;
1372 // which columns should be custom rendered
1373 o3tl::sorted_vector
<int> m_aCustomRenders
;
1374 bool m_bTogglesAsRadio
;
1377 DECL_LINK(SelectHdl
, SvTreeListBox
*, void);
1378 DECL_LINK(DeSelectHdl
, SvTreeListBox
*, void);
1379 DECL_LINK(DoubleClickHdl
, SvTreeListBox
*, bool);
1380 DECL_LINK(ExpandingHdl
, SvTreeListBox
*, bool);
1381 DECL_LINK(EndDragHdl
, HeaderBar
*, void);
1382 DECL_LINK(HeaderBarClickedHdl
, HeaderBar
*, void);
1383 DECL_LINK(ToggleHdl
, SvLBoxButtonData
*, void);
1384 DECL_LINK(ModelChangedHdl
, SvTreeListBox
*, void);
1385 DECL_LINK(StartDragHdl
, SvTreeListBox
*, bool);
1386 DECL_STATIC_LINK(SalInstanceTreeView
, FinishDragHdl
, SvTreeListBox
*, void);
1387 DECL_LINK(EditingEntryHdl
, SvTreeListEntry
*, bool);
1388 typedef std::pair
<SvTreeListEntry
*, OUString
> IterString
;
1389 DECL_LINK(EditedEntryHdl
, IterString
, bool);
1390 DECL_LINK(VisibleRangeChangedHdl
, SvTreeListBox
*, void);
1391 DECL_LINK(CompareHdl
, const SvSortData
&, sal_Int32
);
1392 DECL_LINK(PopupMenuHdl
, const CommandEvent
&, bool);
1393 DECL_LINK(TooltipHdl
, const HelpEvent
&, bool);
1394 DECL_LINK(CustomRenderHdl
, svtree_render_args
, void);
1395 DECL_LINK(CustomMeasureHdl
, svtree_measure_args
, Size
);
1397 // Each row has a cell for the expander image, (and an optional cell for a
1398 // checkbutton if enable_toggle_buttons has been called) which precede
1400 int to_internal_model(int col
) const;
1402 int to_external_model(int col
) const;
1404 bool IsDummyEntry(SvTreeListEntry
* pEntry
) const;
1406 SvTreeListEntry
* GetPlaceHolderChild(SvTreeListEntry
* pEntry
) const;
1408 static void set_font_color(SvTreeListEntry
* pEntry
, const Color
& rColor
);
1410 void AddStringItem(SvTreeListEntry
* pEntry
, const OUString
& rStr
, int nCol
);
1412 void do_insert(const weld::TreeIter
* pParent
, int pos
, const OUString
* pStr
,
1413 const OUString
* pId
, const OUString
* pIconName
,
1414 const VirtualDevice
* pImageSurface
, bool bChildrenOnDemand
, weld::TreeIter
* pRet
,
1417 void update_checkbutton_column_width(SvTreeListEntry
* pEntry
);
1419 void InvalidateModelEntry(SvTreeListEntry
* pEntry
);
1421 void do_set_toggle(SvTreeListEntry
* pEntry
, TriState eState
, int col
);
1423 static TriState
do_get_toggle(SvTreeListEntry
* pEntry
, int col
);
1425 TriState
get_toggle(SvTreeListEntry
* pEntry
, int col
) const;
1427 void set_toggle(SvTreeListEntry
* pEntry
, TriState eState
, int col
);
1429 bool get_text_emphasis(SvTreeListEntry
* pEntry
, int col
) const;
1431 void set_header_item_width(const std::vector
<int>& rWidths
);
1434 SalInstanceTreeView(SvTabListBox
* pTreeView
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
1436 virtual void connect_query_tooltip(const Link
<const weld::TreeIter
&, OUString
>& rLink
) override
;
1438 virtual void columns_autosize() override
;
1440 virtual void freeze() override
;
1442 virtual void thaw() override
;
1444 virtual void set_column_fixed_widths(const std::vector
<int>& rWidths
) override
;
1446 virtual void set_column_editables(const std::vector
<bool>& rEditables
) override
;
1448 virtual void set_centered_column(int nCol
) override
;
1450 virtual int get_column_width(int nColumn
) const override
;
1452 virtual OUString
get_column_title(int nColumn
) const override
;
1454 virtual void set_column_title(int nColumn
, const OUString
& rTitle
) override
;
1456 virtual void set_column_custom_renderer(int nColumn
, bool bEnable
) override
;
1458 virtual void queue_draw() override
;
1460 virtual void show() override
;
1462 virtual void hide() override
;
1464 virtual void insert(const weld::TreeIter
* pParent
, int pos
, const OUString
* pStr
,
1465 const OUString
* pId
, const OUString
* pIconName
,
1466 VirtualDevice
* pImageSurface
, bool bChildrenOnDemand
,
1467 weld::TreeIter
* pRet
) override
;
1469 virtual void insert_separator(int pos
, const OUString
& /*rId*/) override
;
1472 bulk_insert_for_each(int nSourceCount
,
1473 const std::function
<void(weld::TreeIter
&, int nSourceIndex
)>& func
,
1474 const weld::TreeIter
* pParent
= nullptr,
1475 const std::vector
<int>* pFixedWidths
= nullptr) override
;
1477 virtual void set_font_color(int pos
, const Color
& rColor
) override
;
1479 virtual void set_font_color(const weld::TreeIter
& rIter
, const Color
& rColor
) override
;
1481 virtual void remove(int pos
) override
;
1483 virtual int find_text(const OUString
& rText
) const override
;
1485 virtual int find_id(const OUString
& rId
) const override
;
1487 virtual void swap(int pos1
, int pos2
) override
;
1489 virtual void clear() override
;
1491 virtual int n_children() const override
;
1493 virtual int iter_n_children(const weld::TreeIter
& rIter
) const override
;
1495 virtual void select(int pos
) override
;
1497 virtual int get_cursor_index() const override
;
1499 virtual void set_cursor(int pos
) override
;
1501 virtual void scroll_to_row(int pos
) override
;
1503 virtual bool is_selected(int pos
) const override
;
1505 virtual void unselect(int pos
) override
;
1507 virtual std::vector
<int> get_selected_rows() const override
;
1509 OUString
get_text(SvTreeListEntry
* pEntry
, int col
) const;
1511 virtual OUString
get_text(int pos
, int col
= -1) const override
;
1513 void set_text(SvTreeListEntry
* pEntry
, const OUString
& rText
, int col
);
1515 virtual void set_text(int pos
, const OUString
& rText
, int col
= -1) override
;
1517 void set_sensitive(SvTreeListEntry
* pEntry
, bool bSensitive
, int col
);
1519 using SalInstanceWidget::set_sensitive
;
1521 virtual void set_sensitive(int pos
, bool bSensitive
, int col
= -1) override
;
1523 virtual void set_sensitive(const weld::TreeIter
& rIter
, bool bSensitive
, int col
= -1) override
;
1525 virtual TriState
get_toggle(int pos
, int col
= -1) const override
;
1527 virtual TriState
get_toggle(const weld::TreeIter
& rIter
, int col
= -1) const override
;
1529 virtual void enable_toggle_buttons(weld::ColumnToggleType eType
) override
;
1531 virtual void set_toggle(int pos
, TriState eState
, int col
= -1) override
;
1533 virtual void set_toggle(const weld::TreeIter
& rIter
, TriState eState
, int col
= -1) override
;
1535 virtual void set_clicks_to_toggle(int nToggleBehavior
) override
;
1537 virtual void set_extra_row_indent(const weld::TreeIter
& rIter
, int nIndentLevel
) override
;
1539 void set_text_emphasis(SvTreeListEntry
* pEntry
, bool bOn
, int col
= -1);
1541 virtual void set_text_emphasis(const weld::TreeIter
& rIter
, bool bOn
, int col
) override
;
1543 virtual void set_text_emphasis(int pos
, bool bOn
, int col
) override
;
1545 virtual bool get_text_emphasis(const weld::TreeIter
& rIter
, int col
) const override
;
1547 virtual bool get_text_emphasis(int pos
, int col
) const override
;
1549 void set_text_align(SvTreeListEntry
* pEntry
, double fAlign
, int col
);
1551 virtual void set_text_align(const weld::TreeIter
& rIter
, double fAlign
, int col
) override
;
1553 virtual void set_text_align(int pos
, double fAlign
, int col
) override
;
1555 virtual void connect_editing(const Link
<const weld::TreeIter
&, bool>& rStartLink
,
1556 const Link
<const iter_string
&, bool>& rEndLink
) override
;
1558 virtual void start_editing(const weld::TreeIter
& rIter
) override
;
1560 virtual void end_editing() override
;
1562 void set_image(SvTreeListEntry
* pEntry
, const Image
& rImage
, int col
);
1564 virtual void set_image(int pos
, const OUString
& rImage
, int col
= -1) override
;
1566 virtual void set_image(int pos
, const css::uno::Reference
<css::graphic::XGraphic
>& rImage
,
1567 int col
= -1) override
;
1569 virtual void set_image(int pos
, VirtualDevice
& rImage
, int col
= -1) override
;
1571 virtual void set_image(const weld::TreeIter
& rIter
, const OUString
& rImage
,
1572 int col
= -1) override
;
1574 virtual void set_image(const weld::TreeIter
& rIter
,
1575 const css::uno::Reference
<css::graphic::XGraphic
>& rImage
,
1576 int col
= -1) override
;
1578 virtual void set_image(const weld::TreeIter
& rIter
, VirtualDevice
& rImage
,
1579 int col
= -1) override
;
1581 const OUString
* getEntryData(int index
) const;
1583 virtual OUString
get_id(int pos
) const override
;
1585 void set_id(SvTreeListEntry
* pEntry
, const OUString
& rId
);
1587 virtual void set_id(int pos
, const OUString
& rId
) override
;
1589 virtual int get_selected_index() const override
;
1591 virtual OUString
get_selected_text() const override
;
1593 virtual OUString
get_selected_id() const override
;
1595 virtual std::unique_ptr
<weld::TreeIter
> make_iterator(const weld::TreeIter
* pOrig
1596 = nullptr) const override
;
1598 virtual void copy_iterator(const weld::TreeIter
& rSource
, weld::TreeIter
& rDest
) const override
;
1600 virtual bool get_selected(weld::TreeIter
* pIter
) const override
;
1602 virtual bool get_cursor(weld::TreeIter
* pIter
) const override
;
1604 virtual void set_cursor(const weld::TreeIter
& rIter
) override
;
1606 virtual bool get_iter_first(weld::TreeIter
& rIter
) const override
;
1608 virtual bool get_iter_abs_pos(weld::TreeIter
& rIter
, int nPos
) const;
1610 virtual bool iter_next_sibling(weld::TreeIter
& rIter
) const override
;
1612 virtual bool iter_previous_sibling(weld::TreeIter
& rIter
) const override
;
1614 virtual bool iter_next(weld::TreeIter
& rIter
) const override
;
1616 virtual bool iter_previous(weld::TreeIter
& rIter
) const override
;
1618 virtual bool iter_children(weld::TreeIter
& rIter
) const override
;
1620 virtual bool iter_parent(weld::TreeIter
& rIter
) const override
;
1622 virtual void remove(const weld::TreeIter
& rIter
) override
;
1624 virtual void select(const weld::TreeIter
& rIter
) override
;
1626 virtual void scroll_to_row(const weld::TreeIter
& rIter
) override
;
1628 virtual void unselect(const weld::TreeIter
& rIter
) override
;
1630 virtual int get_iter_depth(const weld::TreeIter
& rIter
) const override
;
1632 virtual bool iter_has_child(const weld::TreeIter
& rIter
) const override
;
1634 virtual bool get_row_expanded(const weld::TreeIter
& rIter
) const override
;
1636 virtual bool get_children_on_demand(const weld::TreeIter
& rIter
) const override
;
1638 virtual void set_children_on_demand(const weld::TreeIter
& rIter
,
1639 bool bChildrenOnDemand
) override
;
1641 virtual void expand_row(const weld::TreeIter
& rIter
) override
;
1643 virtual void collapse_row(const weld::TreeIter
& rIter
) override
;
1645 virtual OUString
get_text(const weld::TreeIter
& rIter
, int col
= -1) const override
;
1647 virtual void set_text(const weld::TreeIter
& rIter
, const OUString
& rText
,
1648 int col
= -1) override
;
1650 virtual OUString
get_id(const weld::TreeIter
& rIter
) const override
;
1652 virtual void set_id(const weld::TreeIter
& rIter
, const OUString
& rId
) override
;
1654 virtual void enable_drag_source(rtl::Reference
<TransferDataContainer
>& rHelper
,
1655 sal_uInt8 eDNDConstants
) override
;
1657 virtual void set_selection_mode(SelectionMode eMode
) override
;
1659 virtual void all_foreach(const std::function
<bool(weld::TreeIter
&)>& func
) override
;
1661 virtual void selected_foreach(const std::function
<bool(weld::TreeIter
&)>& func
) override
;
1663 virtual void visible_foreach(const std::function
<bool(weld::TreeIter
&)>& func
) override
;
1665 virtual void connect_visible_range_changed(const Link
<weld::TreeView
&, void>& rLink
) override
;
1667 virtual void remove_selection() override
;
1669 virtual bool is_selected(const weld::TreeIter
& rIter
) const override
;
1671 virtual int get_iter_index_in_parent(const weld::TreeIter
& rIter
) const override
;
1673 virtual int iter_compare(const weld::TreeIter
& a
, const weld::TreeIter
& b
) const override
;
1675 virtual void move_subtree(weld::TreeIter
& rNode
, const weld::TreeIter
* pNewParent
,
1676 int nIndexInNewParent
) override
;
1678 virtual int count_selected_rows() const override
;
1680 virtual int get_height_rows(int nRows
) const override
;
1682 virtual void make_sorted() override
;
1684 virtual void set_sort_func(
1685 const std::function
<int(const weld::TreeIter
&, const weld::TreeIter
&)>& func
) override
;
1687 virtual void make_unsorted() override
;
1689 virtual void set_sort_order(bool bAscending
) override
;
1691 virtual bool get_sort_order() const override
;
1693 virtual void set_sort_indicator(TriState eState
, int col
) override
;
1695 virtual TriState
get_sort_indicator(int col
) const override
;
1697 virtual int get_sort_column() const override
;
1699 virtual void set_sort_column(int nColumn
) override
;
1701 SvTabListBox
& getTreeView();
1703 virtual bool get_dest_row_at_pos(const Point
& rPos
, weld::TreeIter
* pResult
,
1704 bool bDnDMode
) override
;
1706 virtual void unset_drag_dest_row() override
;
1708 virtual tools::Rectangle
get_row_area(const weld::TreeIter
& rIter
) const override
;
1710 virtual TreeView
* get_drag_source() const override
;
1712 virtual int vadjustment_get_value() const override
;
1714 virtual void vadjustment_set_value(int nValue
) override
;
1716 virtual void set_show_expanders(bool bShow
) override
;
1718 virtual bool changed_by_hover() const override
;
1720 virtual ~SalInstanceTreeView() override
;
1723 class SalInstanceExpander
: public SalInstanceWidget
, public virtual weld::Expander
1726 VclPtr
<VclExpander
> m_xExpander
;
1728 DECL_LINK(ExpandedHdl
, VclExpander
&, void);
1731 SalInstanceExpander(VclExpander
* pExpander
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
1733 virtual void set_label(const OUString
& rText
) override
;
1735 virtual OUString
get_label() const override
;
1737 virtual bool get_expanded() const override
;
1739 virtual void set_expanded(bool bExpand
) override
;
1741 virtual bool has_focus() const override
;
1743 virtual void grab_focus() override
;
1745 virtual ~SalInstanceExpander() override
;
1748 class SalInstanceIconView
: public SalInstanceWidget
, public virtual weld::IconView
1751 // owner for UserData
1752 std::vector
<std::unique_ptr
<OUString
>> m_aUserData
;
1753 VclPtr
<::IconView
> m_xIconView
;
1755 DECL_LINK(SelectHdl
, SvTreeListBox
*, void);
1756 DECL_LINK(DeSelectHdl
, SvTreeListBox
*, void);
1757 DECL_LINK(DoubleClickHdl
, SvTreeListBox
*, bool);
1758 DECL_LINK(CommandHdl
, const CommandEvent
&, bool);
1759 DECL_LINK(TooltipHdl
, const HelpEvent
&, bool);
1762 SalInstanceIconView(::IconView
* pIconView
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
1764 virtual int get_item_width() const override
;
1765 virtual void set_item_width(int width
) override
;
1767 virtual void freeze() override
;
1769 virtual void thaw() override
;
1771 virtual void insert(int pos
, const OUString
* pStr
, const OUString
* pId
,
1772 const OUString
* pIconName
, weld::TreeIter
* pRet
) override
;
1774 virtual void insert(int pos
, const OUString
* pStr
, const OUString
* pId
,
1775 const VirtualDevice
* pIcon
, weld::TreeIter
* pRet
) override
;
1777 virtual void connect_query_tooltip(const Link
<const weld::TreeIter
&, OUString
>& rLink
) override
;
1779 virtual OUString
get_selected_id() const override
;
1781 virtual OUString
get_selected_text() const override
;
1783 virtual int count_selected_items() const override
;
1785 virtual void select(int pos
) override
;
1787 virtual void unselect(int pos
) override
;
1789 virtual int n_children() const override
;
1791 virtual std::unique_ptr
<weld::TreeIter
> make_iterator(const weld::TreeIter
* pOrig
1792 = nullptr) const override
;
1794 virtual bool get_selected(weld::TreeIter
* pIter
) const override
;
1796 virtual bool get_cursor(weld::TreeIter
* pIter
) const override
;
1798 virtual void set_cursor(const weld::TreeIter
& rIter
) override
;
1800 virtual bool get_iter_first(weld::TreeIter
& rIter
) const override
;
1802 virtual void scroll_to_item(const weld::TreeIter
& rIter
) override
;
1804 virtual void selected_foreach(const std::function
<bool(weld::TreeIter
&)>& func
) override
;
1806 virtual OUString
get_id(const weld::TreeIter
& rIter
) const override
;
1808 virtual void clear() override
;
1810 virtual ~SalInstanceIconView() override
;
1813 class SalInstanceRadioButton
: public SalInstanceButton
, public virtual weld::RadioButton
1816 VclPtr
<::RadioButton
> m_xRadioButton
;
1818 DECL_LINK(ToggleHdl
, ::RadioButton
&, void);
1821 SalInstanceRadioButton(::RadioButton
* pButton
, SalInstanceBuilder
* pBuilder
,
1822 bool bTakeOwnership
);
1824 virtual void set_active(bool active
) override
;
1826 virtual bool get_active() const override
;
1828 virtual void set_image(VirtualDevice
* pDevice
) override
;
1830 virtual void set_image(const css::uno::Reference
<css::graphic::XGraphic
>& rImage
) override
;
1832 virtual void set_from_icon_name(const OUString
& rIconName
) override
;
1834 virtual void set_inconsistent(bool /*inconsistent*/) override
;
1836 virtual bool get_inconsistent() const override
;
1838 virtual void set_label(const OUString
& rText
) override
{ SalInstanceButton::set_label(rText
); }
1840 virtual OUString
get_label() const override
{ return SalInstanceButton::get_label(); }
1842 virtual void set_label_wrap(bool wrap
) override
{ SalInstanceButton::set_label_wrap(wrap
); }
1844 virtual ~SalInstanceRadioButton() override
;
1847 class SalInstanceFrame
: public SalInstanceContainer
, public virtual weld::Frame
1850 VclPtr
<VclFrame
> m_xFrame
;
1853 SalInstanceFrame(VclFrame
* pFrame
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
1855 virtual void set_label(const OUString
& rText
) override
;
1857 virtual OUString
get_label() const override
;
1859 virtual std::unique_ptr
<weld::Label
> weld_label_widget() const override
;
1862 class SalInstanceMenuButton
: public SalInstanceButton
, public virtual weld::MenuButton
1865 VclPtr
<::MenuButton
> m_xMenuButton
;
1866 sal_uInt16 m_nLastId
;
1868 DECL_LINK(MenuSelectHdl
, ::MenuButton
*, void);
1869 DECL_LINK(ActivateHdl
, ::MenuButton
*, void);
1872 SalInstanceMenuButton(::MenuButton
* pButton
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
1874 virtual void set_active(bool active
) override
;
1876 virtual bool get_active() const override
;
1878 virtual void set_inconsistent(bool /*inconsistent*/) override
;
1880 virtual bool get_inconsistent() const override
;
1882 virtual void insert_item(int pos
, const OUString
& rId
, const OUString
& rStr
,
1883 const OUString
* pIconName
, VirtualDevice
* pImageSurface
,
1884 TriState eCheckRadioFalse
) override
;
1886 virtual void insert_separator(int pos
, const OUString
& rId
) override
;
1888 virtual void set_item_sensitive(const OString
& rIdent
, bool bSensitive
) override
;
1890 virtual void remove_item(const OString
& rId
) override
;
1892 virtual void clear() override
;
1894 virtual void set_item_active(const OString
& rIdent
, bool bActive
) override
;
1896 virtual void set_item_label(const OString
& rIdent
, const OUString
& rText
) override
;
1898 virtual OUString
get_item_label(const OString
& rIdent
) const override
;
1900 virtual void set_item_visible(const OString
& rIdent
, bool bShow
) override
;
1902 virtual void set_popover(weld::Widget
* pPopover
) override
;
1904 virtual ~SalInstanceMenuButton() override
;
1907 class SalInstancePopover
: public SalInstanceContainer
, public virtual weld::Popover
1910 VclPtr
<DockingWindow
> m_xPopover
;
1912 DECL_LINK(PopupModeEndHdl
, FloatingWindow
*, void);
1917 SalInstancePopover(DockingWindow
* pPopover
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
1919 ~SalInstancePopover();
1921 virtual void popup_at_rect(weld::Widget
* pParent
, const tools::Rectangle
& rRect
,
1922 weld::Placement ePlace
= weld::Placement::Under
) override
;
1924 virtual void popdown() override
;
1926 virtual void resize_to_request() override
;
1929 class SalInstanceBox
: public SalInstanceContainer
, public virtual weld::Box
1932 VclPtr
<VclBox
> m_xBox
;
1935 SalInstanceBox(VclBox
* pContainer
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
1936 virtual void reorder_child(weld::Widget
* pWidget
, int nNewPosition
) override
;
1937 virtual void sort_native_button_order() override
;
1940 class SalInstanceImage
: public SalInstanceWidget
, public virtual weld::Image
1943 VclPtr
<FixedImage
> m_xImage
;
1946 SalInstanceImage(FixedImage
* pImage
, SalInstanceBuilder
* pBuilder
, bool bTakeOwnership
);
1948 virtual void set_from_icon_name(const OUString
& rIconName
) override
;
1950 virtual void set_image(VirtualDevice
* pDevice
) override
;
1952 virtual void set_image(const css::uno::Reference
<css::graphic::XGraphic
>& rImage
) override
;
1955 /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */