diff options
author | Szymon Kłos <szymon.klos@collabora.com> | 2020-02-25 12:36:29 +0100 |
---|---|---|
committer | Szymon Kłos <eszkadev@gmail.com> | 2020-05-14 14:38:06 +0200 |
commit | 74d307351ec2af5758c7f416623af072c8fba527 (patch) | |
tree | 91ebcdea6a02dce9fcc086ad8a8c672385044589 | |
parent | 11075a2ae05cdad28fdd7f11631ebd498e380d4e (diff) |
Move SalInstanceComboBox to header file
Change-Id: Iafa449cc1ebba93cc69da194857ea33b8f8510b4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93482
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
-rw-r--r-- | vcl/inc/salvtables.hxx | 231 | ||||
-rw-r--r-- | vcl/source/app/salvtables.cxx | 341 |
2 files changed, 312 insertions, 260 deletions
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx index 418a4d0eddae..88a827fb1f45 100644 --- a/vcl/inc/salvtables.hxx +++ b/vcl/inc/salvtables.hxx @@ -9,6 +9,8 @@ #include <vcl/ctrl.hxx> #include <vcl/edit.hxx> #include <vcl/spinfld.hxx> +#include <vcl/fixed.hxx> +#include <vcl/lstbox.hxx> class SalInstanceBuilder : public weld::Builder { @@ -605,4 +607,233 @@ public: virtual ~SalInstanceSpinButton() override; }; +//ComboBox and ListBox have similar apis, ComboBoxes in LibreOffice have an edit box and ListBoxes +//don't. This distinction isn't there in Gtk. Use a template to sort this problem out. +template <class vcl_type> +class SalInstanceComboBox : public SalInstanceContainer, public virtual weld::ComboBox +{ +protected: + // owner for ListBox/ComboBox UserData + std::vector<std::unique_ptr<OUString>> m_aUserData; + VclPtr<vcl_type> m_xComboBox; + +public: + SalInstanceComboBox(vcl_type* pComboBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership) + : SalInstanceContainer(pComboBox, pBuilder, bTakeOwnership) + , m_xComboBox(pComboBox) + { + } + + virtual int get_active() const override + { + const sal_Int32 nRet = m_xComboBox->GetSelectedEntryPos(); + if (nRet == LISTBOX_ENTRY_NOTFOUND) + return -1; + return nRet; + } + + const OUString* getEntryData(int index) const + { + return static_cast<const OUString*>(m_xComboBox->GetEntryData(index)); + } + + // ComboBoxes are comprised of multiple subwidgets, consider the lot as + // one thing for focus + virtual bool has_focus() const override { return m_xWidget->HasChildPathFocus(); } + + virtual OUString get_active_id() const override + { + sal_Int32 nPos = m_xComboBox->GetSelectedEntryPos(); + const OUString* pRet; + if (nPos != LISTBOX_ENTRY_NOTFOUND) + pRet = getEntryData(m_xComboBox->GetSelectedEntryPos()); + else + pRet = nullptr; + if (!pRet) + return OUString(); + return *pRet; + } + + virtual void set_active_id(const OUString& rStr) override + { + for (int i = 0; i < get_count(); ++i) + { + const OUString* pId = getEntryData(i); + if (!pId) + continue; + if (*pId == rStr) + m_xComboBox->SelectEntryPos(i); + } + } + + virtual void set_active(int pos) override + { + if (pos == -1) + { + m_xComboBox->SetNoSelection(); + return; + } + m_xComboBox->SelectEntryPos(pos); + } + + virtual OUString get_text(int pos) const override { return m_xComboBox->GetEntry(pos); } + + virtual OUString get_id(int pos) const override + { + const OUString* pRet = getEntryData(pos); + if (!pRet) + return OUString(); + return *pRet; + } + + virtual void set_id(int row, const OUString& rId) override + { + m_aUserData.emplace_back(std::make_unique<OUString>(rId)); + m_xComboBox->SetEntryData(row, m_aUserData.back().get()); + } + + virtual void insert_vector(const std::vector<weld::ComboBoxEntry>& rItems, + bool bKeepExisting) override + { + freeze(); + if (!bKeepExisting) + clear(); + for (const auto& rItem : rItems) + { + insert(-1, rItem.sString, rItem.sId.isEmpty() ? nullptr : &rItem.sId, + rItem.sImage.isEmpty() ? nullptr : &rItem.sImage, nullptr); + } + thaw(); + } + + virtual int get_count() const override { return m_xComboBox->GetEntryCount(); } + + virtual int find_text(const OUString& rStr) const override + { + const sal_Int32 nRet = m_xComboBox->GetEntryPos(rStr); + if (nRet == LISTBOX_ENTRY_NOTFOUND) + return -1; + return nRet; + } + + virtual int find_id(const OUString& rStr) const override + { + for (int i = 0; i < get_count(); ++i) + { + const OUString* pId = getEntryData(i); + if (!pId) + continue; + if (*pId == rStr) + return i; + } + return -1; + } + + virtual void clear() override + { + m_xComboBox->Clear(); + m_aUserData.clear(); + } + + virtual void make_sorted() override + { + m_xComboBox->SetStyle(m_xComboBox->GetStyle() | WB_SORT); + } + + virtual bool get_popup_shown() const override { return m_xComboBox->IsInDropDown(); } + + virtual void connect_popup_toggled(const Link<ComboBox&, void>& rLink) override + { + weld::ComboBox::connect_popup_toggled(rLink); + ensure_event_listener(); + } + + virtual void HandleEventListener(VclWindowEvent& rEvent) override + { + if (rEvent.GetId() == VclEventId::DropdownPreOpen + || rEvent.GetId() == VclEventId::DropdownClose) + { + signal_popup_toggled(); + return; + } + SalInstanceContainer::HandleEventListener(rEvent); + } +}; + +class SalInstanceComboBoxWithoutEdit : public SalInstanceComboBox<ListBox> +{ +private: + DECL_LINK(SelectHdl, ListBox&, void); + +public: + SalInstanceComboBoxWithoutEdit(ListBox* pListBox, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual OUString get_active_text() const override; + + virtual void remove(int pos) override; + + virtual void insert(int pos, const OUString& rStr, const OUString* pId, + const OUString* pIconName, VirtualDevice* pImageSurface) override; + + virtual void insert_separator(int pos, const OUString& /*rId*/) override; + + virtual bool has_entry() const override; + + virtual void set_entry_message_type(weld::EntryMessageType /*eType*/) override; + + virtual void set_entry_text(const OUString& /*rText*/) override; + + virtual void select_entry_region(int /*nStartPos*/, int /*nEndPos*/) override; + + virtual bool get_entry_selection_bounds(int& /*rStartPos*/, int& /*rEndPos*/) override; + + virtual void set_entry_width_chars(int /*nChars*/) override; + + virtual void set_entry_max_length(int /*nChars*/) override; + + virtual void set_entry_completion(bool, bool) override; + + virtual ~SalInstanceComboBoxWithoutEdit() override; +}; + +class SalInstanceComboBoxWithEdit : public SalInstanceComboBox<ComboBox> +{ +private: + DECL_LINK(ChangeHdl, Edit&, void); + DECL_LINK(EntryActivateHdl, Edit&, bool); + WeldTextFilter m_aTextFilter; + +public: + SalInstanceComboBoxWithEdit(::ComboBox* pComboBox, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual bool has_entry() const override; + + virtual void set_entry_message_type(weld::EntryMessageType eType) override; + + virtual OUString get_active_text() const override; + + virtual void remove(int pos) override; + + virtual void insert(int pos, const OUString& rStr, const OUString* pId, + const OUString* pIconName, VirtualDevice* pImageSurface) override; + + virtual void insert_separator(int pos, const OUString& /*rId*/) override; + + virtual void set_entry_text(const OUString& rText) override; + + virtual void set_entry_width_chars(int nChars) override; + + virtual void set_entry_max_length(int nChars) override; + + virtual void set_entry_completion(bool bEnable, bool bCaseSensitive) override; + + virtual void select_entry_region(int nStartPos, int nEndPos) override; + + virtual bool get_entry_selection_bounds(int& rStartPos, int& rEndPos) override; + + virtual ~SalInstanceComboBoxWithEdit() override; +}; + #endif
\ No newline at end of file diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index f104cc505712..8ff2268c17b7 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -5486,275 +5486,97 @@ IMPL_LINK(SalInstanceDrawingArea, QueryTooltipHdl, tools::Rectangle&, rHelpArea, return m_aQueryTooltipHdl.Call(rHelpArea); } -//ComboBox and ListBox have similar apis, ComboBoxes in LibreOffice have an edit box and ListBoxes -//don't. This distinction isn't there in Gtk. Use a template to sort this problem out. -template <class vcl_type> -class SalInstanceComboBox : public SalInstanceContainer, public virtual weld::ComboBox +SalInstanceComboBoxWithoutEdit::SalInstanceComboBoxWithoutEdit(ListBox* pListBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership) + : SalInstanceComboBox<ListBox>(pListBox, pBuilder, bTakeOwnership) { -protected: - // owner for ListBox/ComboBox UserData - std::vector<std::unique_ptr<OUString>> m_aUserData; - VclPtr<vcl_type> m_xComboBox; - -public: - SalInstanceComboBox(vcl_type* pComboBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership) - : SalInstanceContainer(pComboBox, pBuilder, bTakeOwnership) - , m_xComboBox(pComboBox) - { - } - - virtual int get_active() const override - { - const sal_Int32 nRet = m_xComboBox->GetSelectedEntryPos(); - if (nRet == LISTBOX_ENTRY_NOTFOUND) - return -1; - return nRet; - } - - const OUString* getEntryData(int index) const - { - return static_cast<const OUString*>(m_xComboBox->GetEntryData(index)); - } - - // ComboBoxes are comprised of multiple subwidgets, consider the lot as - // one thing for focus - virtual bool has_focus() const override - { - return m_xWidget->HasChildPathFocus(); - } - - virtual OUString get_active_id() const override - { - sal_Int32 nPos = m_xComboBox->GetSelectedEntryPos(); - const OUString* pRet; - if (nPos != LISTBOX_ENTRY_NOTFOUND) - pRet = getEntryData(m_xComboBox->GetSelectedEntryPos()); - else - pRet = nullptr; - if (!pRet) - return OUString(); - return *pRet; - } - - virtual void set_active_id(const OUString& rStr) override - { - for (int i = 0; i < get_count(); ++i) - { - const OUString* pId = getEntryData(i); - if (!pId) - continue; - if (*pId == rStr) - m_xComboBox->SelectEntryPos(i); - } - } - - virtual void set_active(int pos) override - { - if (pos == -1) - { - m_xComboBox->SetNoSelection(); - return; - } - m_xComboBox->SelectEntryPos(pos); - } - - virtual OUString get_text(int pos) const override - { - return m_xComboBox->GetEntry(pos); - } - - virtual OUString get_id(int pos) const override - { - const OUString* pRet = getEntryData(pos); - if (!pRet) - return OUString(); - return *pRet; - } - - virtual void set_id(int row, const OUString& rId) override - { - m_aUserData.emplace_back(std::make_unique<OUString>(rId)); - m_xComboBox->SetEntryData(row, m_aUserData.back().get()); - } - - virtual void insert_vector(const std::vector<weld::ComboBoxEntry>& rItems, bool bKeepExisting) override - { - freeze(); - if (!bKeepExisting) - clear(); - for (const auto& rItem : rItems) - { - insert(-1, rItem.sString, rItem.sId.isEmpty() ? nullptr : &rItem.sId, - rItem.sImage.isEmpty() ? nullptr : &rItem.sImage, nullptr); - } - thaw(); - } - - virtual int get_count() const override - { - return m_xComboBox->GetEntryCount(); - } - - virtual int find_text(const OUString& rStr) const override - { - const sal_Int32 nRet = m_xComboBox->GetEntryPos(rStr); - if (nRet == LISTBOX_ENTRY_NOTFOUND) - return -1; - return nRet; - } - - virtual int find_id(const OUString& rStr) const override - { - for (int i = 0; i < get_count(); ++i) - { - const OUString* pId = getEntryData(i); - if (!pId) - continue; - if (*pId == rStr) - return i; - } - return -1; - } - - virtual void clear() override - { - m_xComboBox->Clear(); - m_aUserData.clear(); - } - - virtual void make_sorted() override - { - m_xComboBox->SetStyle(m_xComboBox->GetStyle() | WB_SORT); - } - - virtual bool get_popup_shown() const override - { - return m_xComboBox->IsInDropDown(); - } - - virtual void connect_popup_toggled(const Link<ComboBox&, void>& rLink) override - { - weld::ComboBox::connect_popup_toggled(rLink); - ensure_event_listener(); - } - - virtual void HandleEventListener(VclWindowEvent& rEvent) override - { - if (rEvent.GetId() == VclEventId::DropdownPreOpen || - rEvent.GetId() == VclEventId::DropdownClose) - { - signal_popup_toggled(); - return; - } - SalInstanceContainer::HandleEventListener(rEvent); - } -}; + m_xComboBox->SetSelectHdl(LINK(this, SalInstanceComboBoxWithoutEdit, SelectHdl)); +} -class SalInstanceComboBoxWithoutEdit : public SalInstanceComboBox<ListBox> +OUString SalInstanceComboBoxWithoutEdit::get_active_text() const { -private: - DECL_LINK(SelectHdl, ListBox&, void); - -public: - SalInstanceComboBoxWithoutEdit(ListBox* pListBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership) - : SalInstanceComboBox<ListBox>(pListBox, pBuilder, bTakeOwnership) - { - m_xComboBox->SetSelectHdl(LINK(this, SalInstanceComboBoxWithoutEdit, SelectHdl)); - } + return m_xComboBox->GetSelectedEntry(); +} - virtual OUString get_active_text() const override - { - return m_xComboBox->GetSelectedEntry(); - } +void SalInstanceComboBoxWithoutEdit::remove(int pos) +{ + m_xComboBox->RemoveEntry(pos); +} - virtual void remove(int pos) override +void SalInstanceComboBoxWithoutEdit::insert(int pos, const OUString& rStr, const OUString* pId, const OUString* pIconName, VirtualDevice* pImageSurface) +{ + auto nInsertPos = pos == -1 ? COMBOBOX_APPEND : pos; + sal_Int32 nInsertedAt; + if (!pIconName && !pImageSurface) + nInsertedAt = m_xComboBox->InsertEntry(rStr, nInsertPos); + else if (pIconName) + nInsertedAt = m_xComboBox->InsertEntry(rStr, createImage(*pIconName), nInsertPos); + else + nInsertedAt = m_xComboBox->InsertEntry(rStr, createImage(*pImageSurface), nInsertPos); + if (pId) { - m_xComboBox->RemoveEntry(pos); - } - - virtual void insert(int pos, const OUString& rStr, const OUString* pId, const OUString* pIconName, VirtualDevice* pImageSurface) override - { - auto nInsertPos = pos == -1 ? COMBOBOX_APPEND : pos; - sal_Int32 nInsertedAt; - if (!pIconName && !pImageSurface) - nInsertedAt = m_xComboBox->InsertEntry(rStr, nInsertPos); - else if (pIconName) - nInsertedAt = m_xComboBox->InsertEntry(rStr, createImage(*pIconName), nInsertPos); - else - nInsertedAt = m_xComboBox->InsertEntry(rStr, createImage(*pImageSurface), nInsertPos); - if (pId) - { - m_aUserData.emplace_back(std::make_unique<OUString>(*pId)); - m_xComboBox->SetEntryData(nInsertedAt, m_aUserData.back().get()); - } + m_aUserData.emplace_back(std::make_unique<OUString>(*pId)); + m_xComboBox->SetEntryData(nInsertedAt, m_aUserData.back().get()); } +} - virtual void insert_separator(int pos, const OUString& /*rId*/) override - { - auto nInsertPos = pos == -1 ? m_xComboBox->GetEntryCount() : pos; - m_xComboBox->AddSeparator(nInsertPos - 1); - } +void SalInstanceComboBoxWithoutEdit::insert_separator(int pos, const OUString& /*rId*/) +{ + auto nInsertPos = pos == -1 ? m_xComboBox->GetEntryCount() : pos; + m_xComboBox->AddSeparator(nInsertPos - 1); +} - virtual bool has_entry() const override - { - return false; - } +bool SalInstanceComboBoxWithoutEdit::has_entry() const +{ + return false; +} - virtual void set_entry_message_type(weld::EntryMessageType /*eType*/) override - { - assert(false); - } +void SalInstanceComboBoxWithoutEdit::set_entry_message_type(weld::EntryMessageType /*eType*/) +{ + assert(false); +} - virtual void set_entry_text(const OUString& /*rText*/) override - { - assert(false); - } +void SalInstanceComboBoxWithoutEdit::set_entry_text(const OUString& /*rText*/) +{ + assert(false); +} - virtual void select_entry_region(int /*nStartPos*/, int /*nEndPos*/) override - { - assert(false); - } +void SalInstanceComboBoxWithoutEdit::select_entry_region(int /*nStartPos*/, int /*nEndPos*/) +{ + assert(false); +} - virtual bool get_entry_selection_bounds(int& /*rStartPos*/, int& /*rEndPos*/) override - { - assert(false); - return false; - } +bool SalInstanceComboBoxWithoutEdit::get_entry_selection_bounds(int& /*rStartPos*/, int& /*rEndPos*/) +{ + assert(false); + return false; +} - virtual void set_entry_width_chars(int /*nChars*/) override - { - assert(false); - } +void SalInstanceComboBoxWithoutEdit::set_entry_width_chars(int /*nChars*/) +{ + assert(false); +} - virtual void set_entry_max_length(int /*nChars*/) override - { - assert(false); - } +void SalInstanceComboBoxWithoutEdit::set_entry_max_length(int /*nChars*/) +{ + assert(false); +} - virtual void set_entry_completion(bool, bool) override - { - assert(false); - } +void SalInstanceComboBoxWithoutEdit::set_entry_completion(bool, bool) +{ + assert(false); +} - virtual ~SalInstanceComboBoxWithoutEdit() override - { - m_xComboBox->SetSelectHdl(Link<ListBox&, void>()); - } -}; +SalInstanceComboBoxWithoutEdit::~SalInstanceComboBoxWithoutEdit() +{ + m_xComboBox->SetSelectHdl(Link<ListBox&, void>()); +} IMPL_LINK_NOARG(SalInstanceComboBoxWithoutEdit, SelectHdl, ListBox&, void) { return signal_changed(); } -class SalInstanceComboBoxWithEdit : public SalInstanceComboBox<ComboBox> -{ -private: - DECL_LINK(ChangeHdl, Edit&, void); - DECL_LINK(EntryActivateHdl, Edit&, bool); - WeldTextFilter m_aTextFilter; -public: - SalInstanceComboBoxWithEdit(::ComboBox* pComboBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership) + SalInstanceComboBoxWithEdit::SalInstanceComboBoxWithEdit(::ComboBox* pComboBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership) : SalInstanceComboBox<::ComboBox>(pComboBox, pBuilder, bTakeOwnership) , m_aTextFilter(m_aEntryInsertTextHdl) { @@ -5763,12 +5585,12 @@ public: m_xComboBox->SetTextFilter(&m_aTextFilter); } - virtual bool has_entry() const override + bool SalInstanceComboBoxWithEdit::has_entry() const { return true; } - virtual void set_entry_message_type(weld::EntryMessageType eType) override + void SalInstanceComboBoxWithEdit::set_entry_message_type(weld::EntryMessageType eType) { if (eType == weld::EntryMessageType::Error) m_xComboBox->SetControlForeground(Color(0xf0, 0, 0)); @@ -5778,17 +5600,17 @@ public: m_xComboBox->SetControlForeground(); } - virtual OUString get_active_text() const override + OUString SalInstanceComboBoxWithEdit::get_active_text() const { return m_xComboBox->GetText(); } - virtual void remove(int pos) override + void SalInstanceComboBoxWithEdit::remove(int pos) { m_xComboBox->RemoveEntryAt(pos); } - virtual void insert(int pos, const OUString& rStr, const OUString* pId, const OUString* pIconName, VirtualDevice* pImageSurface) override + void SalInstanceComboBoxWithEdit::insert(int pos, const OUString& rStr, const OUString* pId, const OUString* pIconName, VirtualDevice* pImageSurface) { auto nInsertPos = pos == -1 ? COMBOBOX_APPEND : pos; sal_Int32 nInsertedAt; @@ -5805,38 +5627,38 @@ public: } } - virtual void insert_separator(int pos, const OUString& /*rId*/) override + void SalInstanceComboBoxWithEdit::insert_separator(int pos, const OUString& /*rId*/) { auto nInsertPos = pos == -1 ? m_xComboBox->GetEntryCount() : pos; m_xComboBox->AddSeparator(nInsertPos - 1); } - virtual void set_entry_text(const OUString& rText) override + void SalInstanceComboBoxWithEdit::set_entry_text(const OUString& rText) { m_xComboBox->SetText(rText); } - virtual void set_entry_width_chars(int nChars) override + void SalInstanceComboBoxWithEdit::set_entry_width_chars(int nChars) { m_xComboBox->SetWidthInChars(nChars); } - virtual void set_entry_max_length(int nChars) override + void SalInstanceComboBoxWithEdit::set_entry_max_length(int nChars) { m_xComboBox->SetMaxTextLen(nChars); } - virtual void set_entry_completion(bool bEnable, bool bCaseSensitive) override + void SalInstanceComboBoxWithEdit::set_entry_completion(bool bEnable, bool bCaseSensitive) { m_xComboBox->EnableAutocomplete(bEnable, bCaseSensitive); } - virtual void select_entry_region(int nStartPos, int nEndPos) override + void SalInstanceComboBoxWithEdit::select_entry_region(int nStartPos, int nEndPos) { m_xComboBox->SetSelection(Selection(nStartPos, nEndPos < 0 ? SELECTION_MAX : nEndPos)); } - virtual bool get_entry_selection_bounds(int& rStartPos, int& rEndPos) override + bool SalInstanceComboBoxWithEdit::get_entry_selection_bounds(int& rStartPos, int& rEndPos) { const Selection& rSelection = m_xComboBox->GetSelection(); rStartPos = rSelection.Min(); @@ -5844,13 +5666,12 @@ public: return rSelection.Len(); } - virtual ~SalInstanceComboBoxWithEdit() override + SalInstanceComboBoxWithEdit::~SalInstanceComboBoxWithEdit() { m_xComboBox->SetTextFilter(nullptr); m_xComboBox->SetEntryActivateHdl(Link<Edit&, bool>()); m_xComboBox->SetModifyHdl(Link<Edit&, void>()); } -}; IMPL_LINK_NOARG(SalInstanceComboBoxWithEdit, ChangeHdl, Edit&, void) { |