1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ 2 /* 3 * This file is part of the LibreOffice project. 4 * 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/. 8 */ 9 #pragma once 10 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" 32 33 class SalInstanceBuilder : public weld::Builder 34 { 35 protected: 36 std::unique_ptr<VclBuilder> m_xBuilder; 37 VclPtr<vcl::Window> m_aOwnedToplevel; 38 39 public: 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>()); 43 44 virtual std::unique_ptr<weld::MessageDialog> weld_message_dialog(const OString& id) override; 45 46 virtual std::unique_ptr<weld::Dialog> weld_dialog(const OString& id) override; 47 48 virtual std::unique_ptr<weld::Assistant> weld_assistant(const OString& id) override; 49 50 virtual std::unique_ptr<weld::Window> create_screenshot_window() override; 51 52 virtual std::unique_ptr<weld::Widget> weld_widget(const OString& id) override; 53 54 virtual std::unique_ptr<weld::Container> weld_container(const OString& id) override; 55 56 virtual std::unique_ptr<weld::Box> weld_box(const OString& id) override; 57 58 virtual std::unique_ptr<weld::Paned> weld_paned(const OString& id) override; 59 60 virtual std::unique_ptr<weld::Frame> weld_frame(const OString& id) override; 61 62 virtual std::unique_ptr<weld::ScrolledWindow> 63 weld_scrolled_window(const OString& id, bool bUserManagedScrolling = false) override; 64 65 virtual std::unique_ptr<weld::Notebook> weld_notebook(const OString& id) override; 66 67 virtual std::unique_ptr<weld::Button> weld_button(const OString& id) override; 68 69 virtual std::unique_ptr<weld::MenuButton> weld_menu_button(const OString& id) override; 70 71 virtual std::unique_ptr<weld::MenuToggleButton> 72 weld_menu_toggle_button(const OString& id) override; 73 74 virtual std::unique_ptr<weld::LinkButton> weld_link_button(const OString& id) override; 75 76 virtual std::unique_ptr<weld::ToggleButton> weld_toggle_button(const OString& id) override; 77 78 virtual std::unique_ptr<weld::RadioButton> weld_radio_button(const OString& id) override; 79 80 virtual std::unique_ptr<weld::CheckButton> weld_check_button(const OString& id) override; 81 82 virtual std::unique_ptr<weld::Scale> weld_scale(const OString& id) override; 83 84 virtual std::unique_ptr<weld::ProgressBar> weld_progress_bar(const OString& id) override; 85 86 virtual std::unique_ptr<weld::Spinner> weld_spinner(const OString& id) override; 87 88 virtual std::unique_ptr<weld::Image> weld_image(const OString& id) override; 89 90 virtual std::unique_ptr<weld::Calendar> weld_calendar(const OString& id) override; 91 92 virtual std::unique_ptr<weld::Entry> weld_entry(const OString& id) override; 93 94 virtual std::unique_ptr<weld::SpinButton> weld_spin_button(const OString& id) override; 95 96 virtual std::unique_ptr<weld::MetricSpinButton> 97 weld_metric_spin_button(const OString& id, FieldUnit eUnit) override; 98 99 virtual std::unique_ptr<weld::FormattedSpinButton> 100 weld_formatted_spin_button(const OString& id) override; 101 102 virtual std::unique_ptr<weld::ComboBox> weld_combo_box(const OString& id) override; 103 104 virtual std::unique_ptr<weld::EntryTreeView> 105 weld_entry_tree_view(const OString& containerid, const OString& entryid, 106 const OString& treeviewid) override; 107 108 virtual std::unique_ptr<weld::TreeView> weld_tree_view(const OString& id) override; 109 110 virtual std::unique_ptr<weld::IconView> weld_icon_view(const OString& id) override; 111 112 virtual std::unique_ptr<weld::Label> weld_label(const OString& id) override; 113 114 virtual std::unique_ptr<weld::TextView> weld_text_view(const OString& id) override; 115 116 virtual std::unique_ptr<weld::Expander> weld_expander(const OString& id) override; 117 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; 122 123 virtual std::unique_ptr<weld::Menu> weld_menu(const OString& id) override; 124 125 virtual std::unique_ptr<weld::Popover> weld_popover(const OString& id) override; 126 127 virtual std::unique_ptr<weld::Toolbar> weld_toolbar(const OString& id) override; 128 129 virtual std::unique_ptr<weld::SizeGroup> create_size_group() override; 130 131 OString get_current_page_help_id() const; 132 133 virtual ~SalInstanceBuilder() override; 134 }; 135 136 class SAL_DLLPUBLIC_RTTI SalInstanceMenu : public weld::Menu 137 { 138 private: 139 VclPtr<PopupMenu> m_xMenu; 140 141 bool m_bTakeOwnership; 142 sal_uInt16 m_nLastId; 143 144 DECL_LINK(SelectMenuHdl, ::Menu*, bool); 145 146 public: 147 SalInstanceMenu(PopupMenu* pMenu, bool bTakeOwnership); 148 virtual OString popup_at_rect(weld::Widget* pParent, const tools::Rectangle& rRect) override; 149 virtual void set_sensitive(const OString& rIdent, bool bSensitive) override; 150 virtual bool get_sensitive(const OString& rIdent) const override; 151 virtual void set_active(const OString& rIdent, bool bActive) override; 152 virtual bool get_active(const OString& rIdent) const override; 153 virtual void set_label(const OString& rIdent, const OUString& rLabel) override; 154 virtual OUString get_label(const OString& rIdent) const override; 155 virtual void set_visible(const OString& rIdent, bool bShow) override; 156 virtual void clear() override; 157 virtual void insert(int pos, const OUString& rId, const OUString& rStr, 158 const OUString* pIconName, VirtualDevice* pImageSurface, 159 const css::uno::Reference<css::graphic::XGraphic>& rImage, 160 TriState eCheckRadioFalse) override; 161 virtual void insert_separator(int pos, const OUString& rId) override; 162 virtual void remove(const OString& rId) override; 163 virtual OString get_id(int pos) const override; 164 virtual int n_children() const override; 165 PopupMenu* getMenu() const; 166 virtual ~SalInstanceMenu() override; 167 }; 168 169 class SalInstanceWidget : public virtual weld::Widget 170 { 171 protected: 172 VclPtr<vcl::Window> m_xWidget; 173 SalInstanceBuilder* m_pBuilder; 174 175 private: 176 DECL_LINK(EventListener, VclWindowEvent&, void); 177 DECL_LINK(KeyEventListener, VclWindowEvent&, bool); 178 DECL_LINK(MouseEventListener, VclWindowEvent&, void); 179 DECL_LINK(MnemonicActivateHdl, vcl::Window&, bool); 180 181 static void DoRecursivePaint(vcl::Window* pWindow, const Point& rPos, OutputDevice& rOutput); 182 183 const bool m_bTakeOwnership; 184 bool m_bEventListener; 185 bool m_bKeyEventListener; 186 bool m_bMouseEventListener; 187 int m_nBlockNotify; 188 int m_nFreezeCount; 189 190 protected: 191 void ensure_event_listener(); 192 193 // we want the ability to mark key events as handled, so use this variant 194 // for those, we get all keystrokes in this case, so we will need to filter 195 // them later 196 void ensure_key_listener(); 197 198 // we want the ability to know about mouse events that happen in our children 199 // so use this variant, we will need to filter them later 200 void ensure_mouse_listener(); 201 IsFirstFreeze() const202 bool IsFirstFreeze() const { return m_nFreezeCount == 0; } IsLastThaw() const203 bool IsLastThaw() const { return m_nFreezeCount == 1; } 204 205 virtual void HandleEventListener(VclWindowEvent& rEvent); 206 virtual bool HandleKeyEventListener(VclWindowEvent& rEvent); 207 virtual void HandleMouseEventListener(VclWindowEvent& rEvent); 208 209 public: 210 SalInstanceWidget(vcl::Window* pWidget, SalInstanceBuilder* pBuilder, bool bTakeOwnership); 211 212 virtual void set_sensitive(bool sensitive) override; 213 214 virtual bool get_sensitive() const override; 215 216 virtual bool get_visible() const override; 217 218 virtual bool is_visible() const override; 219 220 virtual void set_can_focus(bool bCanFocus) override; 221 222 virtual void grab_focus() override; 223 224 virtual bool has_focus() const override; 225 226 virtual bool is_active() const override; 227 228 virtual bool has_child_focus() const override; 229 230 virtual void set_has_default(bool has_default) override; 231 232 virtual bool get_has_default() const override; 233 234 virtual void show() override; 235 236 virtual void hide() override; 237 238 virtual void set_size_request(int nWidth, int nHeight) override; 239 240 virtual Size get_size_request() const override; 241 242 virtual Size get_preferred_size() const override; 243 244 virtual float get_approximate_digit_width() const override; 245 246 virtual int get_text_height() const override; 247 248 virtual Size get_pixel_size(const OUString& rText) const override; 249 250 virtual vcl::Font get_font() override; 251 252 virtual OString get_buildable_name() const override; 253 254 virtual void set_buildable_name(const OString& rId) override; 255 256 virtual void set_help_id(const OString& rId) override; 257 258 virtual OString get_help_id() const override; 259 260 virtual void set_grid_left_attach(int nAttach) override; 261 262 virtual int get_grid_left_attach() const override; 263 264 virtual void set_grid_width(int nCols) override; 265 266 virtual void set_grid_top_attach(int nAttach) override; 267 268 virtual int get_grid_top_attach() const override; 269 270 virtual void set_hexpand(bool bExpand) override; 271 272 virtual bool get_hexpand() const override; 273 274 virtual void set_vexpand(bool bExpand) override; 275 276 virtual bool get_vexpand() const override; 277 278 virtual void set_margin_top(int nMargin) override; 279 280 virtual void set_margin_bottom(int nMargin) override; 281 282 virtual void set_margin_start(int nMargin) override; 283 284 virtual void set_margin_end(int nMargin) override; 285 286 virtual int get_margin_top() const override; 287 288 virtual int get_margin_bottom() const override; 289 290 virtual int get_margin_start() const override; 291 292 virtual int get_margin_end() const override; 293 294 virtual void set_accessible_name(const OUString& rName) override; 295 296 virtual void set_accessible_description(const OUString& rDescription) override; 297 298 virtual OUString get_accessible_name() const override; 299 300 virtual OUString get_accessible_description() const override; 301 302 virtual void set_accessible_relation_labeled_by(weld::Widget* pLabel) override; 303 304 virtual void set_accessible_relation_label_for(weld::Widget* pLabeled) override; 305 306 virtual void set_tooltip_text(const OUString& rTip) override; 307 308 virtual OUString get_tooltip_text() const override; 309 310 virtual void connect_focus_in(const Link<Widget&, void>& rLink) override; 311 312 virtual void connect_mnemonic_activate(const Link<Widget&, bool>& rLink) override; 313 314 virtual void connect_focus_out(const Link<Widget&, void>& rLink) override; 315 316 virtual void connect_size_allocate(const Link<const Size&, void>& rLink) override; 317 318 virtual void connect_mouse_press(const Link<const MouseEvent&, bool>& rLink) override; 319 320 virtual void connect_mouse_move(const Link<const MouseEvent&, bool>& rLink) override; 321 322 virtual void connect_mouse_release(const Link<const MouseEvent&, bool>& rLink) override; 323 324 virtual void connect_key_press(const Link<const KeyEvent&, bool>& rLink) override; 325 326 virtual void connect_key_release(const Link<const KeyEvent&, bool>& rLink) override; 327 328 virtual bool get_extents_relative_to(const Widget& rRelative, int& x, int& y, int& width, 329 int& height) const override; 330 331 virtual void grab_add() override; 332 333 virtual bool has_grab() const override; 334 335 virtual void grab_remove() override; 336 337 virtual bool get_direction() const override; 338 339 virtual void set_direction(bool bRTL) override; 340 341 virtual void freeze() override; 342 343 virtual void thaw() override; 344 345 virtual void set_busy_cursor(bool bBusy) override; 346 347 virtual std::unique_ptr<weld::Container> weld_parent() const override; 348 349 virtual ~SalInstanceWidget() override; 350 351 vcl::Window* getWidget() const; 352 353 void disable_notify_events(); 354 355 bool notify_events_disabled(); 356 357 void enable_notify_events(); 358 359 virtual void queue_resize() override; 360 361 virtual void help_hierarchy_foreach(const std::function<bool(const OString&)>& func) override; 362 363 virtual OUString strip_mnemonic(const OUString& rLabel) const override; 364 365 virtual VclPtr<VirtualDevice> create_virtual_device() const override; 366 367 virtual css::uno::Reference<css::datatransfer::dnd::XDropTarget> get_drop_target() override; 368 virtual css::uno::Reference<css::datatransfer::clipboard::XClipboard> 369 get_clipboard() const override; 370 371 virtual void connect_get_property_tree(const Link<tools::JsonWriter&, void>& rLink) override; 372 373 virtual void get_property_tree(tools::JsonWriter& rJsonWriter) override; 374 375 virtual void set_stack_background() override; 376 377 virtual void set_title_background() override; 378 379 virtual void set_toolbar_background() override; 380 381 virtual void set_highlight_background() override; 382 383 virtual void set_background(const Color& rColor) override; 384 385 virtual void draw(OutputDevice& rOutput, const Point& rPos, const Size& rSizePixel) override; 386 387 SystemWindow* getSystemWindow(); 388 }; 389 390 class SalInstanceLabel : public SalInstanceWidget, public virtual weld::Label 391 { 392 private: 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; 397 398 public: 399 SalInstanceLabel(Control* pLabel, SalInstanceBuilder* pBuilder, bool bTakeOwnership); 400 401 virtual void set_label(const OUString& rText) override; 402 403 virtual OUString get_label() const override; 404 405 virtual void set_mnemonic_widget(Widget* pTarget) override; 406 407 virtual void set_label_type(weld::LabelType eType) override; 408 409 virtual void set_font(const vcl::Font& rFont) override; 410 411 virtual void set_font_color(const Color& rColor) override; 412 }; 413 414 class SalInstanceContainer : public SalInstanceWidget, public virtual weld::Container 415 { 416 protected: 417 VclPtr<vcl::Window> m_xContainer; 418 419 private: 420 void implResetDefault(const vcl::Window* _pWindow); 421 422 public: 423 SalInstanceContainer(vcl::Window* pContainer, SalInstanceBuilder* pBuilder, 424 bool bTakeOwnership); 425 virtual void HandleEventListener(VclWindowEvent& rEvent) override; 426 virtual void connect_container_focus_changed(const Link<Container&, void>& rLink) override; 427 virtual void child_grab_focus() override; 428 virtual void move(weld::Widget* pWidget, weld::Container* pNewParent) override; 429 virtual void recursively_unset_default_buttons() override; 430 virtual css::uno::Reference<css::awt::XWindow> CreateChildFrame() override; 431 }; 432 433 class SalInstanceWindow : public SalInstanceContainer, public virtual weld::Window 434 { 435 private: 436 VclPtr<vcl::Window> m_xWindow; 437 438 DECL_LINK(HelpHdl, vcl::Window&, bool); 439 440 void override_child_help(vcl::Window* pParent); 441 442 void clear_child_help(vcl::Window* pParent); 443 444 public: 445 SalInstanceWindow(vcl::Window* pWindow, SalInstanceBuilder* pBuilder, bool bTakeOwnership); 446 447 virtual void set_title(const OUString& rTitle) override; 448 449 virtual OUString get_title() const override; 450 451 void help(); 452 453 virtual css::uno::Reference<css::awt::XWindow> GetXWindow() override; 454 455 virtual void resize_to_request() override; 456 457 virtual void set_modal(bool bModal) override; 458 459 virtual bool get_modal() const override; 460 461 virtual void window_move(int x, int y) override; 462 463 virtual Size get_size() const override; 464 465 virtual Point get_position() const override; 466 467 virtual tools::Rectangle get_monitor_workarea() const override; 468 469 virtual void set_centered_on_parent(bool /*bTrackGeometryRequests*/) override; 470 471 virtual bool get_resizable() const override; 472 473 virtual bool has_toplevel_focus() const override; 474 475 virtual void present() override; 476 477 virtual void set_window_state(const OString& rStr) override; 478 479 virtual OString get_window_state(WindowStateMask nMask) const override; 480 481 virtual SystemEnvData get_system_data() const override; 482 483 virtual weld::ScreenShotCollection collect_screenshot_data() override; 484 485 virtual VclPtr<VirtualDevice> screenshot() override; 486 487 virtual ~SalInstanceWindow() override; 488 }; 489 490 class SalInstanceDialog : public SalInstanceWindow, public virtual weld::Dialog 491 { 492 private: 493 VclPtr<::Dialog> m_xDialog; 494 495 // for calc ref dialog that shrink to range selection widgets and resize back 496 VclPtr<vcl::Window> m_xRefEdit; 497 std::vector<VclPtr<vcl::Window>> m_aHiddenWidgets; // vector of hidden Controls 498 tools::Long m_nOldEditWidthReq; // Original width request of the input field 499 sal_Int32 m_nOldBorderWidth; // border width for expanded dialog 500 501 DECL_LINK(PopupScreenShotMenuHdl, const CommandEvent&, bool); 502 503 public: 504 SalInstanceDialog(::Dialog* pDialog, SalInstanceBuilder* pBuilder, bool bTakeOwnership); 505 506 virtual bool runAsync(std::shared_ptr<weld::DialogController> aOwner, 507 const std::function<void(sal_Int32)>& rEndDialogFn) override; 508 509 virtual bool runAsync(std::shared_ptr<Dialog> const& rxSelf, 510 const std::function<void(sal_Int32)>& rEndDialogFn) override; 511 512 virtual void collapse(weld::Widget* pEdit, weld::Widget* pButton) override; 513 514 virtual void undo_collapse() override; 515 516 virtual void 517 SetInstallLOKNotifierHdl(const Link<void*, vcl::ILibreOfficeKitNotifier*>& rLink) override; 518 519 virtual int run() override; 520 521 virtual void response(int nResponse) override; 522 523 virtual void add_button(const OUString& rText, int nResponse, 524 const OString& rHelpId = OString()) override; 525 526 virtual void set_modal(bool bModal) override; 527 528 virtual bool get_modal() const override; 529 530 virtual weld::Button* weld_widget_for_response(int nResponse) override; 531 532 virtual void set_default_response(int nResponse) override; 533 534 virtual weld::Container* weld_content_area() override; 535 }; 536 537 class WeldTextFilter final : public TextFilter 538 { 539 private: 540 Link<OUString&, bool>& m_rInsertTextHdl; 541 542 public: 543 WeldTextFilter(Link<OUString&, bool>& rInsertTextHdl); 544 545 virtual OUString filter(const OUString& rText) override; 546 }; 547 548 class SalInstanceEntry : public SalInstanceWidget, public virtual weld::Entry 549 { 550 private: 551 VclPtr<::Edit> m_xEntry; 552 553 DECL_LINK(ChangeHdl, Edit&, void); 554 DECL_LINK(CursorListener, VclWindowEvent&, void); 555 DECL_LINK(ActivateHdl, Edit&, bool); 556 557 WeldTextFilter m_aTextFilter; 558 559 public: 560 SalInstanceEntry(::Edit* pEntry, SalInstanceBuilder* pBuilder, bool bTakeOwnership); 561 562 virtual void set_text(const OUString& rText) override; 563 564 virtual OUString get_text() const override; 565 566 virtual void set_width_chars(int nChars) override; 567 568 virtual int get_width_chars() const override; 569 570 virtual void set_max_length(int nChars) override; 571 572 virtual void select_region(int nStartPos, int nEndPos) override; 573 574 bool get_selection_bounds(int& rStartPos, int& rEndPos) override; 575 576 virtual void replace_selection(const OUString& rText) override; 577 578 virtual void set_position(int nCursorPos) override; 579 580 virtual int get_position() const override; 581 582 virtual void set_editable(bool bEditable) override; 583 584 virtual bool get_editable() const override; 585 586 virtual void set_overwrite_mode(bool bOn) override; 587 588 virtual bool get_overwrite_mode() const override; 589 590 virtual void set_message_type(weld::EntryMessageType eType) override; 591 592 virtual void set_font(const vcl::Font& rFont) override; 593 594 virtual void set_font_color(const Color& rColor) override; 595 596 virtual void connect_cursor_position(const Link<Entry&, void>& rLink) override; 597 598 virtual void set_placeholder_text(const OUString& rText) override; 599 600 Edit& getEntry(); 601 602 void fire_signal_changed(); 603 604 virtual void cut_clipboard() override; 605 606 virtual void copy_clipboard() override; 607 608 virtual void paste_clipboard() override; 609 610 virtual void set_alignment(TxtAlign eXAlign) override; 611 612 virtual ~SalInstanceEntry() override; 613 }; 614 615 class SalInstanceSpinButton : public SalInstanceEntry, public virtual weld::SpinButton 616 { 617 private: 618 VclPtr<FormattedField> m_xButton; 619 Formatter& m_rFormatter; 620 621 DECL_LINK(UpDownHdl, SpinField&, void); 622 DECL_LINK(LoseFocusHdl, Control&, void); 623 DECL_LINK(OutputHdl, LinkParamNone*, bool); 624 DECL_LINK(InputHdl, sal_Int64*, TriState); 625 DECL_LINK(ActivateHdl, Edit&, bool); 626 627 double toField(int nValue) const; 628 629 int fromField(double fValue) const; 630 631 public: 632 SalInstanceSpinButton(FormattedField* pButton, SalInstanceBuilder* pBuilder, 633 bool bTakeOwnership); 634 635 virtual int get_value() const override; 636 637 virtual void set_value(int value) override; 638 639 virtual void set_range(int min, int max) override; 640 641 virtual void get_range(int& min, int& max) const override; 642 643 virtual void set_increments(int step, int /*page*/) override; 644 645 virtual void get_increments(int& step, int& page) const override; 646 647 virtual void set_digits(unsigned int digits) override; 648 649 // SpinButton may be comprised of multiple subwidgets, consider the lot as 650 // one thing for focus 651 virtual bool has_focus() const override; 652 653 //off by default for direct SpinButtons, MetricSpinButton enables it 654 void SetUseThousandSep(); 655 656 virtual unsigned int get_digits() const override; 657 658 virtual ~SalInstanceSpinButton() override; 659 }; 660 661 //ComboBox and ListBox have similar apis, ComboBoxes in LibreOffice have an edit box and ListBoxes 662 //don't. This distinction isn't there in Gtk. Use a template to sort this problem out. 663 template <class vcl_type> 664 class SalInstanceComboBox : public SalInstanceWidget, public virtual weld::ComboBox 665 { 666 protected: 667 // owner for ListBox/ComboBox UserData 668 std::vector<std::shared_ptr<OUString>> m_aUserData; 669 VclPtr<vcl_type> m_xComboBox; 670 ScopedVclPtr<MenuButton> m_xMenuButton; 671 OUString m_sMenuButtonRow; 672 673 public: SalInstanceComboBox(vcl_type * pComboBox,SalInstanceBuilder * pBuilder,bool bTakeOwnership)674 SalInstanceComboBox(vcl_type* pComboBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership) 675 : SalInstanceWidget(pComboBox, pBuilder, bTakeOwnership) 676 , m_xComboBox(pComboBox) 677 { 678 } 679 get_active() const680 virtual int get_active() const override 681 { 682 const sal_Int32 nRet = m_xComboBox->GetSelectedEntryPos(); 683 if (nRet == LISTBOX_ENTRY_NOTFOUND) 684 return -1; 685 return nRet; 686 } 687 getEntryData(int index) const688 const OUString* getEntryData(int index) const 689 { 690 return static_cast<const OUString*>(m_xComboBox->GetEntryData(index)); 691 } 692 693 // ComboBoxes are comprised of multiple subwidgets, consider the lot as 694 // one thing for focus has_focus() const695 virtual bool has_focus() const override 696 { 697 return m_xWidget->HasChildPathFocus() 698 || (m_xMenuButton && (m_xMenuButton->HasFocus() || m_xMenuButton->InPopupMode())); 699 } 700 get_active_id() const701 virtual OUString get_active_id() const override 702 { 703 sal_Int32 nPos = m_xComboBox->GetSelectedEntryPos(); 704 const OUString* pRet; 705 if (nPos != LISTBOX_ENTRY_NOTFOUND) 706 pRet = getEntryData(m_xComboBox->GetSelectedEntryPos()); 707 else 708 pRet = nullptr; 709 if (!pRet) 710 return OUString(); 711 return *pRet; 712 } 713 set_active_id(const OUString & rStr)714 virtual void set_active_id(const OUString& rStr) override 715 { 716 for (int i = 0; i < get_count(); ++i) 717 { 718 const OUString* pId = getEntryData(i); 719 if (!pId) 720 continue; 721 if (*pId == rStr) 722 m_xComboBox->SelectEntryPos(i); 723 } 724 } 725 set_active(int pos)726 virtual void set_active(int pos) override 727 { 728 if (pos == -1) 729 { 730 m_xComboBox->SetNoSelection(); 731 return; 732 } 733 m_xComboBox->SelectEntryPos(pos); 734 } 735 get_text(int pos) const736 virtual OUString get_text(int pos) const override { return m_xComboBox->GetEntry(pos); } 737 get_id(int pos) const738 virtual OUString get_id(int pos) const override 739 { 740 const OUString* pRet = getEntryData(pos); 741 if (!pRet) 742 return OUString(); 743 return *pRet; 744 } 745 set_id(int row,const OUString & rId)746 virtual void set_id(int row, const OUString& rId) override 747 { 748 m_aUserData.emplace_back(std::make_unique<OUString>(rId)); 749 m_xComboBox->SetEntryData(row, m_aUserData.back().get()); 750 } 751 insert_vector(const std::vector<weld::ComboBoxEntry> & rItems,bool bKeepExisting)752 virtual void insert_vector(const std::vector<weld::ComboBoxEntry>& rItems, 753 bool bKeepExisting) override 754 { 755 freeze(); 756 if (!bKeepExisting) 757 clear(); 758 for (const auto& rItem : rItems) 759 { 760 insert(-1, rItem.sString, rItem.sId.isEmpty() ? nullptr : &rItem.sId, 761 rItem.sImage.isEmpty() ? nullptr : &rItem.sImage, nullptr); 762 } 763 thaw(); 764 } 765 get_count() const766 virtual int get_count() const override { return m_xComboBox->GetEntryCount(); } 767 find_text(const OUString & rStr) const768 virtual int find_text(const OUString& rStr) const override 769 { 770 const sal_Int32 nRet = m_xComboBox->GetEntryPos(rStr); 771 if (nRet == LISTBOX_ENTRY_NOTFOUND) 772 return -1; 773 return nRet; 774 } 775 find_id(const OUString & rStr) const776 virtual int find_id(const OUString& rStr) const override 777 { 778 for (int i = 0; i < get_count(); ++i) 779 { 780 const OUString* pId = getEntryData(i); 781 if (!pId) 782 continue; 783 if (*pId == rStr) 784 return i; 785 } 786 return -1; 787 } 788 clear()789 virtual void clear() override 790 { 791 m_xComboBox->Clear(); 792 m_aUserData.clear(); 793 } 794 make_sorted()795 virtual void make_sorted() override 796 { 797 m_xComboBox->SetStyle(m_xComboBox->GetStyle() | WB_SORT); 798 } 799 get_popup_shown() const800 virtual bool get_popup_shown() const override { return m_xComboBox->IsInDropDown(); } 801 connect_popup_toggled(const Link<ComboBox &,void> & rLink)802 virtual void connect_popup_toggled(const Link<ComboBox&, void>& rLink) override 803 { 804 weld::ComboBox::connect_popup_toggled(rLink); 805 ensure_event_listener(); 806 } 807 call_signal_custom_render(UserDrawEvent * pEvent)808 void call_signal_custom_render(UserDrawEvent* pEvent) 809 { 810 vcl::RenderContext* pRenderContext = pEvent->GetRenderContext(); 811 auto nPos = pEvent->GetItemId(); 812 const tools::Rectangle& rRect = pEvent->GetRect(); 813 const OUString sId = get_id(nPos); 814 signal_custom_render(*pRenderContext, rRect, pEvent->IsSelected(), sId); 815 m_xComboBox->DrawEntry(*pEvent); // draw separator 816 817 if (m_xMenuButton && m_xMenuButton->IsVisible() && m_sMenuButtonRow == sId) 818 { 819 vcl::Window* pEventWindow = m_xComboBox->GetMainWindow(); 820 if (m_xMenuButton->GetParent() != pEventWindow) 821 m_xMenuButton->SetParent(pEventWindow); 822 int nButtonWidth = get_menu_button_width(); 823 m_xMenuButton->SetSizePixel(Size(nButtonWidth, rRect.GetHeight())); 824 m_xMenuButton->SetPosPixel(Point(rRect.GetWidth() - nButtonWidth, rRect.getY())); 825 } 826 } 827 create_render_virtual_device() const828 VclPtr<VirtualDevice> create_render_virtual_device() const override 829 { 830 auto xRet = VclPtr<VirtualDevice>::Create(); 831 xRet->SetBackground(Application::GetSettings().GetStyleSettings().GetFieldColor()); 832 return xRet; 833 } 834 set_item_menu(const OString & rIdent,weld::Menu * pMenu)835 virtual void set_item_menu(const OString& rIdent, weld::Menu* pMenu) override 836 { 837 SalInstanceMenu* pInstanceMenu = dynamic_cast<SalInstanceMenu*>(pMenu); 838 839 PopupMenu* pPopup = pInstanceMenu ? pInstanceMenu->getMenu() : nullptr; 840 841 if (!m_xMenuButton) 842 m_xMenuButton 843 = VclPtr<MenuButton>::Create(m_xComboBox, WB_FLATBUTTON | WB_NOPOINTERFOCUS); 844 845 m_xMenuButton->SetPopupMenu(pPopup); 846 m_xMenuButton->Show(pPopup != nullptr); 847 m_sMenuButtonRow = OUString::fromUtf8(rIdent); 848 } 849 get_menu_button_width() const850 int get_menu_button_width() const override 851 { 852 OutputDevice* pDefault = Application::GetDefaultDevice(); 853 return 20 * (pDefault ? pDefault->GetDPIScaleFactor() : 1.0); 854 } 855 CallHandleEventListener(VclWindowEvent & rEvent)856 void CallHandleEventListener(VclWindowEvent& rEvent) 857 { 858 if (rEvent.GetId() == VclEventId::DropdownPreOpen 859 || rEvent.GetId() == VclEventId::DropdownClose) 860 { 861 signal_popup_toggled(); 862 return; 863 } 864 SalInstanceWidget::HandleEventListener(rEvent); 865 } 866 }; 867 868 class SalInstanceComboBoxWithoutEdit : public SalInstanceComboBox<ListBox> 869 { 870 private: 871 DECL_LINK(SelectHdl, ListBox&, void); 872 873 public: 874 SalInstanceComboBoxWithoutEdit(ListBox* pListBox, SalInstanceBuilder* pBuilder, 875 bool bTakeOwnership); 876 877 virtual OUString get_active_text() const override; 878 879 virtual void remove(int pos) override; 880 881 virtual void insert(int pos, const OUString& rStr, const OUString* pId, 882 const OUString* pIconName, VirtualDevice* pImageSurface) override; 883 884 virtual void insert_separator(int pos, const OUString& /*rId*/) override; 885 886 virtual bool has_entry() const override; 887 888 virtual bool changed_by_direct_pick() const override; 889 890 virtual void set_entry_message_type(weld::EntryMessageType /*eType*/) override; 891 892 virtual void set_entry_text(const OUString& /*rText*/) override; 893 894 virtual void select_entry_region(int /*nStartPos*/, int /*nEndPos*/) override; 895 896 virtual bool get_entry_selection_bounds(int& /*rStartPos*/, int& /*rEndPos*/) override; 897 898 virtual void set_entry_width_chars(int /*nChars*/) override; 899 900 virtual void set_entry_max_length(int /*nChars*/) override; 901 902 virtual void set_entry_completion(bool, bool bCaseSensitive = false) override; 903 904 virtual void set_entry_placeholder_text(const OUString&) override; 905 906 virtual void set_entry_editable(bool bEditable) override; 907 908 virtual void cut_entry_clipboard() override; 909 910 virtual void copy_entry_clipboard() override; 911 912 virtual void paste_entry_clipboard() override; 913 914 virtual void set_font(const vcl::Font& rFont) override; 915 916 virtual void set_entry_font(const vcl::Font&) override; 917 918 virtual vcl::Font get_entry_font() override; 919 920 virtual void set_custom_renderer(bool bOn) override; 921 922 virtual int get_max_mru_count() const override; 923 924 virtual void set_max_mru_count(int) override; 925 926 virtual OUString get_mru_entries() const override; 927 928 virtual void set_mru_entries(const OUString&) override; 929 930 virtual void HandleEventListener(VclWindowEvent& rEvent) override; 931 932 virtual ~SalInstanceComboBoxWithoutEdit() override; 933 }; 934 935 class SalInstanceComboBoxWithEdit : public SalInstanceComboBox<ComboBox> 936 { 937 private: 938 DECL_LINK(ChangeHdl, Edit&, void); 939 DECL_LINK(EntryActivateHdl, Edit&, bool); 940 DECL_LINK(SelectHdl, ::ComboBox&, void); 941 DECL_LINK(UserDrawHdl, UserDrawEvent*, void); 942 WeldTextFilter m_aTextFilter; 943 bool m_bInSelect; 944 945 public: 946 SalInstanceComboBoxWithEdit(::ComboBox* pComboBox, SalInstanceBuilder* pBuilder, 947 bool bTakeOwnership); 948 949 virtual bool has_entry() const override; 950 951 virtual bool changed_by_direct_pick() const override; 952 953 virtual void set_entry_message_type(weld::EntryMessageType eType) override; 954 955 virtual OUString get_active_text() const override; 956 957 virtual void remove(int pos) override; 958 959 virtual void insert(int pos, const OUString& rStr, const OUString* pId, 960 const OUString* pIconName, VirtualDevice* pImageSurface) override; 961 962 virtual void insert_separator(int pos, const OUString& /*rId*/) override; 963 964 virtual void set_entry_text(const OUString& rText) override; 965 966 virtual void set_entry_width_chars(int nChars) override; 967 968 virtual void set_entry_max_length(int nChars) override; 969 970 virtual void set_entry_completion(bool bEnable, bool bCaseSensitive = false) override; 971 972 virtual void set_entry_placeholder_text(const OUString& rText) override; 973 974 virtual void set_entry_editable(bool bEditable) override; 975 976 virtual void cut_entry_clipboard() override; 977 978 virtual void copy_entry_clipboard() override; 979 980 virtual void paste_entry_clipboard() override; 981 982 virtual void select_entry_region(int nStartPos, int nEndPos) override; 983 984 virtual bool get_entry_selection_bounds(int& rStartPos, int& rEndPos) override; 985 986 virtual void set_font(const vcl::Font& rFont) override; 987 988 virtual void set_entry_font(const vcl::Font& rFont) override; 989 990 virtual vcl::Font get_entry_font() override; 991 992 virtual void set_custom_renderer(bool bOn) override; 993 994 virtual int get_max_mru_count() const override; 995 996 virtual void set_max_mru_count(int nCount) override; 997 998 virtual OUString get_mru_entries() const override; 999 1000 virtual void set_mru_entries(const OUString& rEntries) override; 1001 1002 virtual void HandleEventListener(VclWindowEvent& rEvent) override; 1003 1004 virtual ~SalInstanceComboBoxWithEdit() override; 1005 }; 1006 1007 class SalInstanceButton : public SalInstanceWidget, public virtual weld::Button 1008 { 1009 private: 1010 VclPtr<::Button> m_xButton; 1011 Link<::Button*, void> const m_aOldClickHdl; 1012 1013 DECL_LINK(ClickHdl, ::Button*, void); 1014 1015 protected: 1016 void set_label_wrap(bool bWrap); 1017 1018 public: 1019 SalInstanceButton(::Button* pButton, SalInstanceBuilder* pBuilder, bool bTakeOwnership); 1020 1021 virtual void set_label(const OUString& rText) override; 1022 1023 virtual void set_image(VirtualDevice* pDevice) override; 1024 1025 virtual void set_image(const css::uno::Reference<css::graphic::XGraphic>& rImage) override; 1026 1027 virtual void set_from_icon_name(const OUString& rIconName) override; 1028 1029 virtual OUString get_label() const override; 1030 1031 virtual void set_font(const vcl::Font& rFont) override; 1032 1033 virtual void set_custom_button(VirtualDevice* pDevice) override; 1034 1035 virtual ~SalInstanceButton() override; 1036 }; 1037 1038 class SalInstanceNotebook : public SalInstanceWidget, public virtual weld::Notebook 1039 { 1040 private: 1041 VclPtr<TabControl> m_xNotebook; 1042 mutable std::vector<std::shared_ptr<SalInstanceContainer>> m_aPages; 1043 std::map<OString, std::pair<VclPtr<TabPage>, VclPtr<VclGrid>>> m_aAddedPages; 1044 1045 DECL_LINK(DeactivatePageHdl, TabControl*, bool); 1046 DECL_LINK(ActivatePageHdl, TabControl*, void); 1047 1048 public: 1049 SalInstanceNotebook(TabControl* pNotebook, SalInstanceBuilder* pBuilder, bool bTakeOwnership); 1050 1051 virtual int get_current_page() const override; 1052 1053 virtual int get_page_index(const OString& rIdent) const override; 1054 1055 virtual OString get_page_ident(int nPage) const override; 1056 1057 virtual OString get_current_page_ident() const override; 1058 1059 virtual weld::Container* get_page(const OString& rIdent) const override; 1060 1061 virtual void set_current_page(int nPage) override; 1062 1063 virtual void set_current_page(const OString& rIdent) override; 1064 1065 virtual void remove_page(const OString& rIdent) override; 1066 1067 virtual void insert_page(const OString& rIdent, const OUString& rLabel, int nPos) override; 1068 1069 virtual int get_n_pages() const override; 1070 1071 virtual OUString get_tab_label_text(const OString& rIdent) const override; 1072 1073 virtual void set_tab_label_text(const OString& rIdent, const OUString& rText) override; 1074 1075 virtual ~SalInstanceNotebook() override; 1076 }; 1077 1078 class SalInstanceMessageDialog : public SalInstanceDialog, public virtual weld::MessageDialog 1079 { 1080 protected: 1081 VclPtr<::MessageDialog> m_xMessageDialog; 1082 1083 public: 1084 SalInstanceMessageDialog(::MessageDialog* pDialog, SalInstanceBuilder* pBuilder, 1085 bool bTakeOwnership); 1086 1087 virtual void set_primary_text(const OUString& rText) override; 1088 1089 virtual OUString get_primary_text() const override; 1090 1091 virtual void set_secondary_text(const OUString& rText) override; 1092 1093 virtual OUString get_secondary_text() const override; 1094 1095 virtual weld::Container* weld_message_area() override; 1096 }; 1097 1098 class SalInstanceCheckButton : public SalInstanceButton, public virtual weld::CheckButton 1099 { 1100 private: 1101 VclPtr<CheckBox> m_xCheckButton; 1102 1103 DECL_LINK(ToggleHdl, CheckBox&, void); 1104 1105 public: 1106 SalInstanceCheckButton(CheckBox* pButton, SalInstanceBuilder* pBuilder, bool bTakeOwnership); 1107 1108 virtual void set_active(bool active) override; 1109 1110 virtual bool get_active() const override; 1111 1112 virtual void set_inconsistent(bool inconsistent) override; 1113 1114 virtual bool get_inconsistent() const override; 1115 set_label(const OUString & rText)1116 virtual void set_label(const OUString& rText) override { SalInstanceButton::set_label(rText); } 1117 get_label() const1118 virtual OUString get_label() const override { return SalInstanceButton::get_label(); } 1119 set_label_wrap(bool wrap)1120 virtual void set_label_wrap(bool wrap) override { SalInstanceButton::set_label_wrap(wrap); } 1121 1122 virtual ~SalInstanceCheckButton() override; 1123 }; 1124 1125 class SalInstanceDrawingArea : public SalInstanceWidget, public virtual weld::DrawingArea 1126 { 1127 private: 1128 VclPtr<VclDrawingArea> m_xDrawingArea; 1129 1130 typedef std::pair<vcl::RenderContext&, const tools::Rectangle&> target_and_area; 1131 DECL_LINK(PaintHdl, target_and_area, void); 1132 DECL_LINK(ResizeHdl, const Size&, void); 1133 DECL_LINK(MousePressHdl, const MouseEvent&, bool); 1134 DECL_LINK(MouseMoveHdl, const MouseEvent&, bool); 1135 DECL_LINK(MouseReleaseHdl, const MouseEvent&, bool); 1136 DECL_LINK(KeyPressHdl, const KeyEvent&, bool); 1137 DECL_LINK(KeyReleaseHdl, const KeyEvent&, bool); 1138 DECL_LINK(StyleUpdatedHdl, VclDrawingArea&, void); 1139 DECL_LINK(CommandHdl, const CommandEvent&, bool); 1140 DECL_LINK(QueryTooltipHdl, tools::Rectangle&, OUString); 1141 DECL_LINK(GetSurroundingHdl, OUString&, int); 1142 DECL_LINK(DeleteSurroundingHdl, const Selection&, bool); 1143 DECL_LINK(StartDragHdl, VclDrawingArea*, bool); 1144 1145 // SalInstanceWidget has a generic listener for all these 1146 // events, ignore the ones we have specializations for 1147 // in VclDrawingArea 1148 virtual void HandleEventListener(VclWindowEvent& rEvent) override; 1149 1150 virtual void HandleMouseEventListener(VclWindowEvent& rEvent) override; 1151 1152 virtual bool HandleKeyEventListener(VclWindowEvent& /*rEvent*/) override; 1153 1154 public: 1155 SalInstanceDrawingArea(VclDrawingArea* pDrawingArea, SalInstanceBuilder* pBuilder, 1156 const a11yref& rAlly, FactoryFunction pUITestFactoryFunction, 1157 void* pUserData, bool bTakeOwnership); 1158 1159 virtual void queue_draw() override; 1160 1161 virtual void queue_draw_area(int x, int y, int width, int height) override; 1162 1163 virtual void connect_size_allocate(const Link<const Size&, void>& rLink) override; 1164 1165 virtual void connect_key_press(const Link<const KeyEvent&, bool>& rLink) override; 1166 1167 virtual void connect_key_release(const Link<const KeyEvent&, bool>& rLink) override; 1168 1169 virtual void set_cursor(PointerStyle ePointerStyle) override; 1170 1171 virtual Point get_pointer_position() const override; 1172 1173 virtual void set_input_context(const InputContext& rInputContext) override; 1174 1175 virtual void im_context_set_cursor_location(const tools::Rectangle& rCursorRect, 1176 int nExtTextInputWidth) override; 1177 1178 virtual a11yref get_accessible_parent() override; 1179 1180 virtual a11yrelationset get_accessible_relation_set() override; 1181 1182 virtual Point get_accessible_location_on_screen() override; 1183 1184 virtual void enable_drag_source(rtl::Reference<TransferDataContainer>& rHelper, 1185 sal_uInt8 eDNDConstants) override; 1186 1187 virtual ~SalInstanceDrawingArea() override; 1188 1189 virtual OutputDevice& get_ref_device() override; 1190 1191 virtual void click(const Point& rPos) override; 1192 }; 1193 1194 class SalInstanceToolbar : public SalInstanceWidget, public virtual weld::Toolbar 1195 { 1196 private: 1197 VclPtr<ToolBox> m_xToolBox; 1198 std::map<ToolBoxItemId, VclPtr<vcl::Window>> m_aFloats; 1199 std::map<ToolBoxItemId, VclPtr<PopupMenu>> m_aMenus; 1200 1201 OString m_sStartShowIdent; 1202 1203 DECL_LINK(ClickHdl, ToolBox*, void); 1204 DECL_LINK(DropdownClick, ToolBox*, void); 1205 DECL_LINK(MenuToggleListener, VclWindowEvent&, void); 1206 1207 public: 1208 SalInstanceToolbar(ToolBox* pToolBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership); 1209 1210 virtual void set_item_sensitive(const OString& rIdent, bool bSensitive) override; 1211 1212 virtual bool get_item_sensitive(const OString& rIdent) const override; 1213 1214 virtual void set_item_visible(const OString& rIdent, bool bVisible) override; 1215 1216 virtual void set_item_help_id(const OString& rIdent, const OString& rHelpId) override; 1217 1218 virtual bool get_item_visible(const OString& rIdent) const override; 1219 1220 virtual void set_item_active(const OString& rIdent, bool bActive) override; 1221 1222 virtual bool get_item_active(const OString& rIdent) const override; 1223 1224 void set_menu_item_active(const OString& rIdent, bool bActive) override; 1225 1226 bool get_menu_item_active(const OString& rIdent) const override; 1227 1228 virtual void set_item_popover(const OString& rIdent, weld::Widget* pPopover) override; 1229 1230 virtual void set_item_menu(const OString& rIdent, weld::Menu* pMenu) override; 1231 1232 virtual void insert_item(int pos, const OUString& rId) override; 1233 1234 virtual void insert_separator(int pos, const OUString& /*rId*/) override; 1235 1236 virtual int get_n_items() const override; 1237 1238 virtual OString get_item_ident(int nIndex) const override; 1239 1240 virtual void set_item_ident(int nIndex, const OString& rIdent) override; 1241 1242 virtual void set_item_label(int nIndex, const OUString& rLabel) override; 1243 1244 virtual OUString get_item_label(const OString& rIdent) const override; 1245 1246 virtual void set_item_label(const OString& rIdent, const OUString& rLabel) override; 1247 1248 virtual void set_item_icon_name(const OString& rIdent, const OUString& rIconName) override; 1249 1250 virtual void set_item_image(const OString& rIdent, 1251 const css::uno::Reference<css::graphic::XGraphic>& rIcon) override; 1252 1253 virtual void set_item_image(const OString& rIdent, VirtualDevice* pDevice) override; 1254 1255 virtual void set_item_image(int nIndex, 1256 const css::uno::Reference<css::graphic::XGraphic>& rIcon) override; 1257 1258 virtual void set_item_tooltip_text(int nIndex, const OUString& rTip) override; 1259 1260 virtual void set_item_tooltip_text(const OString& rIdent, const OUString& rTip) override; 1261 1262 virtual OUString get_item_tooltip_text(const OString& rIdent) const override; 1263 1264 virtual vcl::ImageType get_icon_size() const override; 1265 1266 virtual void set_icon_size(vcl::ImageType eType) override; 1267 1268 virtual sal_uInt16 get_modifier_state() const override; 1269 1270 int get_drop_index(const Point& rPoint) const override; 1271 1272 virtual ~SalInstanceToolbar() override; 1273 }; 1274 1275 class SalInstanceTextView : public SalInstanceWidget, public virtual weld::TextView 1276 { 1277 private: 1278 VclPtr<VclMultiLineEdit> m_xTextView; 1279 Link<ScrollBar*, void> m_aOrigVScrollHdl; 1280 1281 DECL_LINK(ChangeHdl, Edit&, void); 1282 DECL_LINK(VscrollHdl, ScrollBar*, void); 1283 DECL_LINK(CursorListener, VclWindowEvent&, void); 1284 1285 public: 1286 SalInstanceTextView(VclMultiLineEdit* pTextView, SalInstanceBuilder* pBuilder, 1287 bool bTakeOwnership); 1288 1289 virtual void set_text(const OUString& rText) override; 1290 1291 virtual void replace_selection(const OUString& rText) override; 1292 1293 virtual OUString get_text() const override; 1294 1295 bool get_selection_bounds(int& rStartPos, int& rEndPos) override; 1296 1297 virtual void select_region(int nStartPos, int nEndPos) override; 1298 1299 virtual void set_editable(bool bEditable) override; 1300 virtual bool get_editable() const override; 1301 virtual void set_max_length(int nChars) override; 1302 1303 virtual void set_monospace(bool bMonospace) override; 1304 1305 virtual void set_font(const vcl::Font& rFont) override; 1306 1307 virtual void set_font_color(const Color& rColor) override; 1308 1309 virtual void connect_cursor_position(const Link<TextView&, void>& rLink) override; 1310 1311 virtual bool can_move_cursor_with_up() const override; 1312 1313 virtual bool can_move_cursor_with_down() const override; 1314 1315 virtual void cut_clipboard() override; 1316 1317 virtual void copy_clipboard() override; 1318 1319 virtual void paste_clipboard() override; 1320 1321 virtual void set_alignment(TxtAlign eXAlign) override; 1322 1323 virtual int vadjustment_get_value() const override; 1324 1325 virtual void vadjustment_set_value(int value) override; 1326 1327 virtual int vadjustment_get_upper() const override; 1328 1329 virtual int vadjustment_get_lower() const override; 1330 1331 virtual int vadjustment_get_page_size() const override; 1332 1333 virtual bool has_focus() const override; 1334 1335 virtual ~SalInstanceTextView() override; 1336 }; 1337 1338 struct SalInstanceTreeIter : public weld::TreeIter 1339 { SalInstanceTreeIterSalInstanceTreeIter1340 SalInstanceTreeIter(const SalInstanceTreeIter* pOrig) 1341 : iter(pOrig ? pOrig->iter : nullptr) 1342 { 1343 } SalInstanceTreeIterSalInstanceTreeIter1344 SalInstanceTreeIter(SvTreeListEntry* pIter) 1345 : iter(pIter) 1346 { 1347 } equalSalInstanceTreeIter1348 virtual bool equal(const TreeIter& rOther) const override 1349 { 1350 return iter == static_cast<const SalInstanceTreeIter&>(rOther).iter; 1351 } 1352 SvTreeListEntry* iter; 1353 }; 1354 1355 class SalInstanceTreeView : public SalInstanceWidget, public virtual weld::TreeView 1356 { 1357 protected: 1358 // owner for UserData 1359 std::vector<std::unique_ptr<OUString>> m_aUserData; 1360 VclPtr<SvTabListBox> m_xTreeView; 1361 SvLBoxButtonData m_aCheckButtonData; 1362 SvLBoxButtonData m_aRadioButtonData; 1363 // currently expanding parent that logically, but not currently physically, 1364 // contain placeholders 1365 o3tl::sorted_vector<SvTreeListEntry*> m_aExpandingPlaceHolderParents; 1366 // which columns should be custom rendered 1367 o3tl::sorted_vector<int> m_aCustomRenders; 1368 bool m_bTogglesAsRadio; 1369 int m_nSortColumn; 1370 1371 DECL_LINK(SelectHdl, SvTreeListBox*, void); 1372 DECL_LINK(DeSelectHdl, SvTreeListBox*, void); 1373 DECL_LINK(DoubleClickHdl, SvTreeListBox*, bool); 1374 DECL_LINK(ExpandingHdl, SvTreeListBox*, bool); 1375 DECL_LINK(EndDragHdl, HeaderBar*, void); 1376 DECL_LINK(HeaderBarClickedHdl, HeaderBar*, void); 1377 DECL_LINK(ToggleHdl, SvLBoxButtonData*, void); 1378 DECL_LINK(ModelChangedHdl, SvTreeListBox*, void); 1379 DECL_LINK(StartDragHdl, SvTreeListBox*, bool); 1380 DECL_STATIC_LINK(SalInstanceTreeView, FinishDragHdl, SvTreeListBox*, void); 1381 DECL_LINK(EditingEntryHdl, SvTreeListEntry*, bool); 1382 typedef std::pair<SvTreeListEntry*, OUString> IterString; 1383 DECL_LINK(EditedEntryHdl, IterString, bool); 1384 DECL_LINK(VisibleRangeChangedHdl, SvTreeListBox*, void); 1385 DECL_LINK(CompareHdl, const SvSortData&, sal_Int32); 1386 DECL_LINK(PopupMenuHdl, const CommandEvent&, bool); 1387 DECL_LINK(TooltipHdl, const HelpEvent&, bool); 1388 DECL_LINK(CustomRenderHdl, svtree_render_args, void); 1389 DECL_LINK(CustomMeasureHdl, svtree_measure_args, Size); 1390 1391 // Each row has a cell for the expander image, (and an optional cell for a 1392 // checkbutton if enable_toggle_buttons has been called) which precede 1393 // index 0 1394 int to_internal_model(int col) const; 1395 1396 int to_external_model(int col) const; 1397 1398 bool IsDummyEntry(SvTreeListEntry* pEntry) const; 1399 1400 SvTreeListEntry* GetPlaceHolderChild(SvTreeListEntry* pEntry) const; 1401 1402 static void set_font_color(SvTreeListEntry* pEntry, const Color& rColor); 1403 1404 void AddStringItem(SvTreeListEntry* pEntry, const OUString& rStr, int nCol); 1405 1406 void do_insert(const weld::TreeIter* pParent, int pos, const OUString* pStr, 1407 const OUString* pId, const OUString* pIconName, 1408 const VirtualDevice* pImageSurface, bool bChildrenOnDemand, weld::TreeIter* pRet, 1409 bool bIsSeparator); 1410 1411 void update_checkbutton_column_width(SvTreeListEntry* pEntry); 1412 1413 void InvalidateModelEntry(SvTreeListEntry* pEntry); 1414 1415 void do_set_toggle(SvTreeListEntry* pEntry, TriState eState, int col); 1416 1417 static TriState do_get_toggle(SvTreeListEntry* pEntry, int col); 1418 1419 TriState get_toggle(SvTreeListEntry* pEntry, int col) const; 1420 1421 void set_toggle(SvTreeListEntry* pEntry, TriState eState, int col); 1422 1423 bool get_text_emphasis(SvTreeListEntry* pEntry, int col) const; 1424 1425 void set_header_item_width(const std::vector<int>& rWidths); 1426 1427 public: 1428 SalInstanceTreeView(SvTabListBox* pTreeView, SalInstanceBuilder* pBuilder, bool bTakeOwnership); 1429 1430 virtual void connect_query_tooltip(const Link<const weld::TreeIter&, OUString>& rLink) override; 1431 1432 virtual void columns_autosize() override; 1433 1434 virtual void freeze() override; 1435 1436 virtual void thaw() override; 1437 1438 virtual void set_column_fixed_widths(const std::vector<int>& rWidths) override; 1439 1440 virtual void set_column_editables(const std::vector<bool>& rEditables) override; 1441 1442 virtual void set_centered_column(int nCol) override; 1443 1444 virtual int get_column_width(int nColumn) const override; 1445 1446 virtual OUString get_column_title(int nColumn) const override; 1447 1448 virtual void set_column_title(int nColumn, const OUString& rTitle) override; 1449 1450 virtual void set_column_custom_renderer(int nColumn, bool bEnable) override; 1451 1452 virtual void queue_draw() override; 1453 1454 virtual void show() override; 1455 1456 virtual void hide() override; 1457 1458 virtual void insert(const weld::TreeIter* pParent, int pos, const OUString* pStr, 1459 const OUString* pId, const OUString* pIconName, 1460 VirtualDevice* pImageSurface, bool bChildrenOnDemand, 1461 weld::TreeIter* pRet) override; 1462 1463 virtual void insert_separator(int pos, const OUString& /*rId*/) override; 1464 1465 virtual void 1466 bulk_insert_for_each(int nSourceCount, 1467 const std::function<void(weld::TreeIter&, int nSourceIndex)>& func, 1468 const weld::TreeIter* pParent = nullptr, 1469 const std::vector<int>* pFixedWidths = nullptr) override; 1470 1471 virtual void set_font_color(int pos, const Color& rColor) override; 1472 1473 virtual void set_font_color(const weld::TreeIter& rIter, const Color& rColor) override; 1474 1475 virtual void remove(int pos) override; 1476 1477 virtual int find_text(const OUString& rText) const override; 1478 1479 virtual int find_id(const OUString& rId) const override; 1480 1481 virtual void swap(int pos1, int pos2) override; 1482 1483 virtual void clear() override; 1484 1485 virtual int n_children() const override; 1486 1487 virtual int iter_n_children(const weld::TreeIter& rIter) const override; 1488 1489 virtual void select(int pos) override; 1490 1491 virtual int get_cursor_index() const override; 1492 1493 virtual void set_cursor(int pos) override; 1494 1495 virtual void scroll_to_row(int pos) override; 1496 1497 virtual bool is_selected(int pos) const override; 1498 1499 virtual void unselect(int pos) override; 1500 1501 virtual std::vector<int> get_selected_rows() const override; 1502 1503 OUString get_text(SvTreeListEntry* pEntry, int col) const; 1504 1505 virtual OUString get_text(int pos, int col = -1) const override; 1506 1507 void set_text(SvTreeListEntry* pEntry, const OUString& rText, int col); 1508 1509 virtual void set_text(int pos, const OUString& rText, int col = -1) override; 1510 1511 void set_sensitive(SvTreeListEntry* pEntry, bool bSensitive, int col); 1512 1513 using SalInstanceWidget::set_sensitive; 1514 1515 virtual void set_sensitive(int pos, bool bSensitive, int col = -1) override; 1516 1517 virtual void set_sensitive(const weld::TreeIter& rIter, bool bSensitive, int col = -1) override; 1518 1519 virtual TriState get_toggle(int pos, int col = -1) const override; 1520 1521 virtual TriState get_toggle(const weld::TreeIter& rIter, int col = -1) const override; 1522 1523 virtual void enable_toggle_buttons(weld::ColumnToggleType eType) override; 1524 1525 virtual void set_toggle(int pos, TriState eState, int col = -1) override; 1526 1527 virtual void set_toggle(const weld::TreeIter& rIter, TriState eState, int col = -1) override; 1528 1529 virtual void set_clicks_to_toggle(int nToggleBehavior) override; 1530 1531 virtual void set_extra_row_indent(const weld::TreeIter& rIter, int nIndentLevel) override; 1532 1533 void set_text_emphasis(SvTreeListEntry* pEntry, bool bOn, int col = -1); 1534 1535 virtual void set_text_emphasis(const weld::TreeIter& rIter, bool bOn, int col) override; 1536 1537 virtual void set_text_emphasis(int pos, bool bOn, int col) override; 1538 1539 virtual bool get_text_emphasis(const weld::TreeIter& rIter, int col) const override; 1540 1541 virtual bool get_text_emphasis(int pos, int col) const override; 1542 1543 void set_text_align(SvTreeListEntry* pEntry, double fAlign, int col); 1544 1545 virtual void set_text_align(const weld::TreeIter& rIter, double fAlign, int col) override; 1546 1547 virtual void set_text_align(int pos, double fAlign, int col) override; 1548 1549 virtual void connect_editing(const Link<const weld::TreeIter&, bool>& rStartLink, 1550 const Link<const iter_string&, bool>& rEndLink) override; 1551 1552 virtual void start_editing(const weld::TreeIter& rIter) override; 1553 1554 virtual void end_editing() override; 1555 1556 void set_image(SvTreeListEntry* pEntry, const Image& rImage, int col); 1557 1558 virtual void set_image(int pos, const OUString& rImage, int col = -1) override; 1559 1560 virtual void set_image(int pos, const css::uno::Reference<css::graphic::XGraphic>& rImage, 1561 int col = -1) override; 1562 1563 virtual void set_image(int pos, VirtualDevice& rImage, int col = -1) override; 1564 1565 virtual void set_image(const weld::TreeIter& rIter, const OUString& rImage, 1566 int col = -1) override; 1567 1568 virtual void set_image(const weld::TreeIter& rIter, 1569 const css::uno::Reference<css::graphic::XGraphic>& rImage, 1570 int col = -1) override; 1571 1572 virtual void set_image(const weld::TreeIter& rIter, VirtualDevice& rImage, 1573 int col = -1) override; 1574 1575 const OUString* getEntryData(int index) const; 1576 1577 virtual OUString get_id(int pos) const override; 1578 1579 void set_id(SvTreeListEntry* pEntry, const OUString& rId); 1580 1581 virtual void set_id(int pos, const OUString& rId) override; 1582 1583 virtual int get_selected_index() const override; 1584 1585 virtual OUString get_selected_text() const override; 1586 1587 virtual OUString get_selected_id() const override; 1588 1589 virtual std::unique_ptr<weld::TreeIter> make_iterator(const weld::TreeIter* pOrig 1590 = nullptr) const override; 1591 1592 virtual void copy_iterator(const weld::TreeIter& rSource, weld::TreeIter& rDest) const override; 1593 1594 virtual bool get_selected(weld::TreeIter* pIter) const override; 1595 1596 virtual bool get_cursor(weld::TreeIter* pIter) const override; 1597 1598 virtual void set_cursor(const weld::TreeIter& rIter) override; 1599 1600 virtual bool get_iter_first(weld::TreeIter& rIter) const override; 1601 1602 virtual bool get_iter_abs_pos(weld::TreeIter& rIter, int nPos) const; 1603 1604 virtual bool iter_next_sibling(weld::TreeIter& rIter) const override; 1605 1606 virtual bool iter_previous_sibling(weld::TreeIter& rIter) const override; 1607 1608 virtual bool iter_next(weld::TreeIter& rIter) const override; 1609 1610 virtual bool iter_previous(weld::TreeIter& rIter) const override; 1611 1612 virtual bool iter_children(weld::TreeIter& rIter) const override; 1613 1614 virtual bool iter_parent(weld::TreeIter& rIter) const override; 1615 1616 virtual void remove(const weld::TreeIter& rIter) override; 1617 1618 virtual void select(const weld::TreeIter& rIter) override; 1619 1620 virtual void scroll_to_row(const weld::TreeIter& rIter) override; 1621 1622 virtual void unselect(const weld::TreeIter& rIter) override; 1623 1624 virtual int get_iter_depth(const weld::TreeIter& rIter) const override; 1625 1626 virtual bool iter_has_child(const weld::TreeIter& rIter) const override; 1627 1628 virtual bool get_row_expanded(const weld::TreeIter& rIter) const override; 1629 1630 virtual bool get_children_on_demand(const weld::TreeIter& rIter) const override; 1631 1632 virtual void set_children_on_demand(const weld::TreeIter& rIter, 1633 bool bChildrenOnDemand) override; 1634 1635 virtual void expand_row(const weld::TreeIter& rIter) override; 1636 1637 virtual void collapse_row(const weld::TreeIter& rIter) override; 1638 1639 virtual OUString get_text(const weld::TreeIter& rIter, int col = -1) const override; 1640 1641 virtual void set_text(const weld::TreeIter& rIter, const OUString& rText, 1642 int col = -1) override; 1643 1644 virtual OUString get_id(const weld::TreeIter& rIter) const override; 1645 1646 virtual void set_id(const weld::TreeIter& rIter, const OUString& rId) override; 1647 1648 virtual void enable_drag_source(rtl::Reference<TransferDataContainer>& rHelper, 1649 sal_uInt8 eDNDConstants) override; 1650 1651 virtual void set_selection_mode(SelectionMode eMode) override; 1652 1653 virtual void all_foreach(const std::function<bool(weld::TreeIter&)>& func) override; 1654 1655 virtual void selected_foreach(const std::function<bool(weld::TreeIter&)>& func) override; 1656 1657 virtual void visible_foreach(const std::function<bool(weld::TreeIter&)>& func) override; 1658 1659 virtual void connect_visible_range_changed(const Link<weld::TreeView&, void>& rLink) override; 1660 1661 virtual void remove_selection() override; 1662 1663 virtual bool is_selected(const weld::TreeIter& rIter) const override; 1664 1665 virtual int get_iter_index_in_parent(const weld::TreeIter& rIter) const override; 1666 1667 virtual int iter_compare(const weld::TreeIter& a, const weld::TreeIter& b) const override; 1668 1669 virtual void move_subtree(weld::TreeIter& rNode, const weld::TreeIter* pNewParent, 1670 int nIndexInNewParent) override; 1671 1672 virtual int count_selected_rows() const override; 1673 1674 virtual int get_height_rows(int nRows) const override; 1675 1676 virtual void make_sorted() override; 1677 1678 virtual void set_sort_func( 1679 const std::function<int(const weld::TreeIter&, const weld::TreeIter&)>& func) override; 1680 1681 virtual void make_unsorted() override; 1682 1683 virtual void set_sort_order(bool bAscending) override; 1684 1685 virtual bool get_sort_order() const override; 1686 1687 virtual void set_sort_indicator(TriState eState, int col) override; 1688 1689 virtual TriState get_sort_indicator(int col) const override; 1690 1691 virtual int get_sort_column() const override; 1692 1693 virtual void set_sort_column(int nColumn) override; 1694 1695 SvTabListBox& getTreeView(); 1696 1697 virtual bool get_dest_row_at_pos(const Point& rPos, weld::TreeIter* pResult, 1698 bool bDnDMode) override; 1699 1700 virtual void unset_drag_dest_row() override; 1701 1702 virtual tools::Rectangle get_row_area(const weld::TreeIter& rIter) const override; 1703 1704 virtual TreeView* get_drag_source() const override; 1705 1706 virtual int vadjustment_get_value() const override; 1707 1708 virtual void vadjustment_set_value(int nValue) override; 1709 1710 void set_show_expanders(bool bShow) override; 1711 1712 virtual ~SalInstanceTreeView() override; 1713 }; 1714 1715 class SalInstanceExpander : public SalInstanceWidget, public virtual weld::Expander 1716 { 1717 private: 1718 VclPtr<VclExpander> m_xExpander; 1719 1720 DECL_LINK(ExpandedHdl, VclExpander&, void); 1721 1722 public: 1723 SalInstanceExpander(VclExpander* pExpander, SalInstanceBuilder* pBuilder, bool bTakeOwnership); 1724 1725 virtual void set_label(const OUString& rText) override; 1726 1727 virtual OUString get_label() const override; 1728 1729 virtual bool get_expanded() const override; 1730 1731 virtual void set_expanded(bool bExpand) override; 1732 1733 virtual bool has_focus() const override; 1734 1735 virtual void grab_focus() override; 1736 1737 virtual ~SalInstanceExpander() override; 1738 }; 1739 1740 class SalInstanceIconView : public SalInstanceWidget, public virtual weld::IconView 1741 { 1742 private: 1743 // owner for UserData 1744 std::vector<std::unique_ptr<OUString>> m_aUserData; 1745 VclPtr<::IconView> m_xIconView; 1746 1747 DECL_LINK(SelectHdl, SvTreeListBox*, void); 1748 DECL_LINK(DeSelectHdl, SvTreeListBox*, void); 1749 DECL_LINK(DoubleClickHdl, SvTreeListBox*, bool); 1750 DECL_LINK(CommandHdl, const CommandEvent&, bool); 1751 1752 public: 1753 SalInstanceIconView(::IconView* pIconView, SalInstanceBuilder* pBuilder, bool bTakeOwnership); 1754 1755 virtual void freeze() override; 1756 1757 virtual void thaw() override; 1758 1759 virtual void insert(int pos, const OUString* pStr, const OUString* pId, 1760 const OUString* pIconName, weld::TreeIter* pRet) override; 1761 1762 virtual void insert(int pos, const OUString* pStr, const OUString* pId, 1763 const VirtualDevice* pIcon, weld::TreeIter* pRet) override; 1764 1765 virtual OUString get_selected_id() const override; 1766 1767 virtual OUString get_selected_text() const override; 1768 1769 virtual int count_selected_items() const override; 1770 1771 virtual void select(int pos) override; 1772 1773 virtual void unselect(int pos) override; 1774 1775 virtual int n_children() const override; 1776 1777 virtual std::unique_ptr<weld::TreeIter> make_iterator(const weld::TreeIter* pOrig 1778 = nullptr) const override; 1779 1780 virtual bool get_selected(weld::TreeIter* pIter) const override; 1781 1782 virtual bool get_cursor(weld::TreeIter* pIter) const override; 1783 1784 virtual void set_cursor(const weld::TreeIter& rIter) override; 1785 1786 virtual bool get_iter_first(weld::TreeIter& rIter) const override; 1787 1788 virtual void scroll_to_item(const weld::TreeIter& rIter) override; 1789 1790 virtual void selected_foreach(const std::function<bool(weld::TreeIter&)>& func) override; 1791 1792 virtual OUString get_id(const weld::TreeIter& rIter) const override; 1793 1794 virtual void clear() override; 1795 1796 virtual ~SalInstanceIconView() override; 1797 }; 1798 1799 class SalInstanceRadioButton : public SalInstanceButton, public virtual weld::RadioButton 1800 { 1801 private: 1802 VclPtr<::RadioButton> m_xRadioButton; 1803 1804 DECL_LINK(ToggleHdl, ::RadioButton&, void); 1805 1806 public: 1807 SalInstanceRadioButton(::RadioButton* pButton, SalInstanceBuilder* pBuilder, 1808 bool bTakeOwnership); 1809 1810 virtual void set_active(bool active) override; 1811 1812 virtual bool get_active() const override; 1813 1814 virtual void set_image(VirtualDevice* pDevice) override; 1815 1816 virtual void set_image(const css::uno::Reference<css::graphic::XGraphic>& rImage) override; 1817 1818 virtual void set_from_icon_name(const OUString& rIconName) override; 1819 1820 virtual void set_inconsistent(bool /*inconsistent*/) override; 1821 1822 virtual bool get_inconsistent() const override; 1823 set_label(const OUString & rText)1824 virtual void set_label(const OUString& rText) override { SalInstanceButton::set_label(rText); } 1825 get_label() const1826 virtual OUString get_label() const override { return SalInstanceButton::get_label(); } 1827 set_label_wrap(bool wrap)1828 virtual void set_label_wrap(bool wrap) override { SalInstanceButton::set_label_wrap(wrap); } 1829 1830 virtual ~SalInstanceRadioButton() override; 1831 }; 1832 1833 /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ 1834