[Libreoffice-commits] core.git: framework/inc framework/source svtools/uiconfig svtools/UIConfig_svt.mk

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Thu Apr 23 11:58:43 UTC 2020


 framework/inc/uielement/comboboxtoolbarcontroller.hxx    |    2 
 framework/source/uielement/comboboxtoolbarcontroller.cxx |  185 +++++++--------
 framework/source/uielement/edittoolbarcontroller.cxx     |    1 
 svtools/UIConfig_svt.mk                                  |    1 
 svtools/uiconfig/ui/combocontrol.ui                      |   29 ++
 5 files changed, 120 insertions(+), 98 deletions(-)

New commits:
commit 424ffd5ea25d03b3c8628a273a1cf9794f6e1f52
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Wed Apr 22 16:06:41 2020 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Thu Apr 23 13:57:57 2020 +0200

    weld ComboBoxControl
    
    Change-Id: Ifdb76cc61e6270f8a04fec2534dcd29d27e8281f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92724
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/framework/inc/uielement/comboboxtoolbarcontroller.hxx b/framework/inc/uielement/comboboxtoolbarcontroller.hxx
index e3fc3687d836..df14769caa07 100644
--- a/framework/inc/uielement/comboboxtoolbarcontroller.hxx
+++ b/framework/inc/uielement/comboboxtoolbarcontroller.hxx
@@ -51,7 +51,7 @@ class ComboboxToolbarController final : public ComplexToolbarController
         void Modify();
         void GetFocus();
         void LoseFocus();
-        bool PreNotify( NotifyEvent const & rNEvt );
+        void Activate();
 
     private:
         virtual void executeControlCommand( const css::frame::ControlCommand& rControlCommand ) override;
diff --git a/framework/source/uielement/comboboxtoolbarcontroller.cxx b/framework/source/uielement/comboboxtoolbarcontroller.cxx
index 11e775fd9911..352fe7bd0833 100644
--- a/framework/source/uielement/comboboxtoolbarcontroller.cxx
+++ b/framework/source/uielement/comboboxtoolbarcontroller.cxx
@@ -22,10 +22,10 @@
 #include <com/sun/star/beans/PropertyValue.hpp>
 #include <com/sun/star/util/Color.hpp>
 
+#include <svtools/InterimItemWindow.hxx>
 #include <svtools/toolboxcontroller.hxx>
 #include <vcl/svapp.hxx>
 #include <vcl/toolbox.hxx>
-#include <vcl/combobox.hxx>
 
 using namespace ::com::sun::star;
 using namespace css::uno;
@@ -41,27 +41,54 @@ namespace framework
 // Unfortunately the events are notified through virtual methods instead
 // of Listeners.
 
-class ComboBoxControl : public ComboBox
+class ComboBoxControl final : public InterimItemWindow
 {
-    public:
-        ComboBoxControl( vcl::Window* pParent, WinBits nStyle, ComboboxToolbarController* pComboboxToolbarController );
-        virtual ~ComboBoxControl() override;
-        virtual void dispose() override;
-
-        virtual void Select() override;
-        virtual void Modify() override;
-        virtual void GetFocus() override;
-        virtual void LoseFocus() override;
-        virtual bool PreNotify( NotifyEvent& rNEvt ) override;
-
-    private:
-        ComboboxToolbarController* m_pComboboxToolbarController;
+public:
+    ComboBoxControl(vcl::Window* pParent, ComboboxToolbarController* pComboboxToolbarController);
+    virtual ~ComboBoxControl() override;
+    virtual void dispose() override;
+
+    void set_active_or_entry_text(const OUString& rText);
+    OUString get_active_text() const { return m_xWidget->get_active_text(); }
+
+    void clear() { m_xWidget->clear(); }
+    void remove(int nIndex) { m_xWidget->remove(nIndex); }
+    void append_text(const OUString& rStr) { m_xWidget->append_text(rStr); }
+    void insert_text(int pos, const OUString& rStr) { m_xWidget->insert_text(pos, rStr); }
+    int get_count() const { return m_xWidget->get_count(); }
+    int find_text(const OUString& rStr) const { return m_xWidget->find_text(rStr); }
+
+    DECL_LINK(FocusInHdl, weld::Widget&, void);
+    DECL_LINK(FocusOutHdl, weld::Widget&, void);
+    DECL_LINK(ModifyHdl, weld::ComboBox&, void);
+    DECL_LINK(ActivateHdl, weld::ComboBox&, bool);
+
+private:
+    std::unique_ptr<weld::ComboBox> m_xWidget;
+    ComboboxToolbarController* m_pComboboxToolbarController;
 };
 
-ComboBoxControl::ComboBoxControl( vcl::Window* pParent, WinBits nStyle, ComboboxToolbarController* pComboboxToolbarController ) :
-    ComboBox( pParent, nStyle )
-    , m_pComboboxToolbarController( pComboboxToolbarController )
+ComboBoxControl::ComboBoxControl(vcl::Window* pParent, ComboboxToolbarController* pComboboxToolbarController)
+    : InterimItemWindow(pParent, "svt/ui/combocontrol.ui", "ComboControl")
+    , m_xWidget(m_xBuilder->weld_combo_box("combobox"))
+    , m_pComboboxToolbarController(pComboboxToolbarController)
 {
+    m_xWidget->connect_focus_in(LINK(this, ComboBoxControl, FocusInHdl));
+    m_xWidget->connect_focus_out(LINK(this, ComboBoxControl, FocusOutHdl));
+    m_xWidget->connect_changed(LINK(this, ComboBoxControl, ModifyHdl));
+    m_xWidget->connect_entry_activate(LINK(this, ComboBoxControl, ActivateHdl));
+
+    m_xWidget->set_entry_width_chars(1); // so a smaller that default width can be used by ComboboxToolbarController
+    SetSizePixel(get_preferred_size());
+}
+
+void ComboBoxControl::set_active_or_entry_text(const OUString& rText)
+{
+    const int nFound = m_xWidget->find_text(rText);
+    if (nFound != -1)
+        m_xWidget->set_active(nFound);
+    else
+        m_xWidget->set_entry_text(rText);
 }
 
 ComboBoxControl::~ComboBoxControl()
@@ -72,46 +99,38 @@ ComboBoxControl::~ComboBoxControl()
 void ComboBoxControl::dispose()
 {
     m_pComboboxToolbarController = nullptr;
-    ComboBox::dispose();
+    m_xWidget.reset();
+    InterimItemWindow::dispose();
 }
 
-void ComboBoxControl::Select()
+IMPL_LINK_NOARG(ComboBoxControl, ModifyHdl, weld::ComboBox&, void)
 {
-    ComboBox::Select();
-    if ( m_pComboboxToolbarController )
-        m_pComboboxToolbarController->Select();
-}
-
-void ComboBoxControl::Modify()
-{
-    ComboBox::Modify();
-    if ( m_pComboboxToolbarController )
-        m_pComboboxToolbarController->Modify();
+    if (m_pComboboxToolbarController)
+    {
+        if (m_xWidget->get_count() && m_xWidget->changed_by_direct_pick())
+            m_pComboboxToolbarController->Select();
+        else
+            m_pComboboxToolbarController->Modify();
+    }
 }
 
-void ComboBoxControl::GetFocus()
+IMPL_LINK_NOARG(ComboBoxControl, FocusInHdl, weld::Widget&, void)
 {
-    ComboBox::GetFocus();
-    if ( m_pComboboxToolbarController )
+    if (m_pComboboxToolbarController)
         m_pComboboxToolbarController->GetFocus();
 }
 
-void ComboBoxControl::LoseFocus()
+IMPL_LINK_NOARG(ComboBoxControl, FocusOutHdl, weld::Widget&, void)
 {
-    ComboBox::LoseFocus();
-    if ( m_pComboboxToolbarController )
+    if (m_pComboboxToolbarController)
         m_pComboboxToolbarController->LoseFocus();
 }
 
-bool ComboBoxControl::PreNotify( NotifyEvent& rNEvt )
+IMPL_LINK_NOARG(ComboBoxControl, ActivateHdl, weld::ComboBox&, bool)
 {
-    bool bRet = false;
-    if ( m_pComboboxToolbarController )
-        bRet = m_pComboboxToolbarController->PreNotify( rNEvt );
-    if ( !bRet )
-        bRet = ComboBox::PreNotify( rNEvt );
-
-    return bRet;
+    if (m_pComboboxToolbarController)
+        m_pComboboxToolbarController->Activate();
+    return true;
 }
 
 ComboboxToolbarController::ComboboxToolbarController(
@@ -124,15 +143,14 @@ ComboboxToolbarController::ComboboxToolbarController(
     ComplexToolbarController( rxContext, rFrame, pToolbar, nID, aCommand )
     ,   m_pComboBox( nullptr )
 {
-    m_pComboBox = VclPtr<ComboBoxControl>::Create( m_xToolbar, WB_DROPDOWN, this );
+    m_pComboBox = VclPtr<ComboBoxControl>::Create(m_xToolbar, this);
     if ( nWidth == 0 )
         nWidth = 100;
 
-    // default dropdown size
-    ::Size aLogicalSize( 8, 160 );
-    ::Size aPixelSize = m_pComboBox->LogicToPixel(aLogicalSize, MapMode(MapUnit::MapAppFont));
+    // ComboBoxControl ctor has set a suitable height already
+    auto nHeight = m_pComboBox->GetSizePixel().Height();
 
-    m_pComboBox->SetSizePixel( ::Size( nWidth, aPixelSize.Height() ));
+    m_pComboBox->SetSizePixel( ::Size( nWidth, nHeight ));
     m_xToolbar->SetItemWindow( m_nID, m_pComboBox );
 }
 
@@ -153,7 +171,7 @@ void SAL_CALL ComboboxToolbarController::dispose()
 Sequence<PropertyValue> ComboboxToolbarController::getExecuteArgs(sal_Int16 KeyModifier) const
 {
     Sequence<PropertyValue> aArgs( 2 );
-    OUString aSelectedText = m_pComboBox->GetText();
+    OUString aSelectedText = m_pComboBox->get_active_text();
 
     // Add key modifier to argument list
     aArgs[0].Name = "KeyModifier";
@@ -165,18 +183,15 @@ Sequence<PropertyValue> ComboboxToolbarController::getExecuteArgs(sal_Int16 KeyM
 
 void ComboboxToolbarController::Select()
 {
-    if ( m_pComboBox->GetEntryCount() > 0 )
-    {
-        vcl::Window::PointerState aState = m_pComboBox->GetPointerState();
+    vcl::Window::PointerState aState = m_pComboBox->GetPointerState();
 
-        sal_uInt16 nKeyModifier = sal_uInt16( aState.mnState & KEY_MODIFIERS_MASK );
-        execute( nKeyModifier );
-    }
+    sal_uInt16 nKeyModifier = sal_uInt16( aState.mnState & KEY_MODIFIERS_MASK );
+    execute( nKeyModifier );
 }
 
 void ComboboxToolbarController::Modify()
 {
-    notifyTextChanged( m_pComboBox->GetText() );
+    notifyTextChanged(m_pComboBox->get_active_text());
 }
 
 void ComboboxToolbarController::GetFocus()
@@ -189,33 +204,11 @@ void ComboboxToolbarController::LoseFocus()
     notifyFocusLost();
 }
 
-bool ComboboxToolbarController::PreNotify( NotifyEvent const & rNEvt )
+void ComboboxToolbarController::Activate()
 {
-    switch ( rNEvt.GetType() )
-    {
-        case MouseNotifyEvent::KEYINPUT :
-            {
-                const ::KeyEvent* pKeyEvent = rNEvt.GetKeyEvent();
-                const vcl::KeyCode& rKeyCode = pKeyEvent->GetKeyCode();
-                if(( rKeyCode.GetModifier() | rKeyCode.GetCode()) == KEY_RETURN )
-                {
-                    // Call execute only with non-empty text
-                    if ( !m_pComboBox->GetText().isEmpty() )
-                        execute( rKeyCode.GetModifier() );
-                    return true;
-                }
-            }
-            break;
-        case MouseNotifyEvent::GETFOCUS :
-            notifyFocusGet();
-            break;
-        case MouseNotifyEvent::LOSEFOCUS :
-            notifyFocusLost();
-            break;
-        default :
-            break;
-    }
-    return false;
+    // Call execute only with non-empty text
+    if (!m_pComboBox->get_active_text().isEmpty())
+        execute(0);
 }
 
 void ComboboxToolbarController::executeControlCommand( const css::frame::ControlCommand& rControlCommand )
@@ -228,7 +221,7 @@ void ComboboxToolbarController::executeControlCommand( const css::frame::Control
             {
                 OUString aText;
                 rControlCommand.Arguments[i].Value >>= aText;
-                m_pComboBox->SetText( aText );
+                m_pComboBox->set_active_or_entry_text(aText);
 
                 // send notification
                 notifyTextChanged( aText );
@@ -243,11 +236,11 @@ void ComboboxToolbarController::executeControlCommand( const css::frame::Control
             if ( rControlCommand.Arguments[i].Name == "List" )
             {
                 Sequence< OUString > aList;
-                m_pComboBox->Clear();
+                m_pComboBox->clear();
 
                 rControlCommand.Arguments[i].Value >>= aList;
-                for ( sal_Int32 j = 0; j < aList.getLength(); j++ )
-                    m_pComboBox->InsertEntry( aList[j] );
+                for (sal_Int32 j = 0; j < aList.getLength(); ++j)
+                    m_pComboBox->append_text(aList[j]);
 
                 // send notification
                 uno::Sequence< beans::NamedValue > aInfo { { "List", css::uno::makeAny(aList) } };
@@ -267,14 +260,14 @@ void ComboboxToolbarController::executeControlCommand( const css::frame::Control
             if ( rControlCommand.Arguments[i].Name == "Text" )
             {
                 if ( rControlCommand.Arguments[i].Value >>= aText )
-                    m_pComboBox->InsertEntry( aText, COMBOBOX_APPEND );
+                    m_pComboBox->append_text(aText);
                 break;
             }
         }
     }
     else if ( rControlCommand.Command == "InsertEntry" )
     {
-        sal_Int32      nPos( COMBOBOX_APPEND );
+        sal_Int32 nPos(-1);
         OUString   aText;
         for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ )
         {
@@ -284,7 +277,7 @@ void ComboboxToolbarController::executeControlCommand( const css::frame::Control
                 if ( rControlCommand.Arguments[i].Value >>= nTmpPos )
                 {
                     if (( nTmpPos >= 0 ) &&
-                        ( nTmpPos < m_pComboBox->GetEntryCount() ))
+                        ( nTmpPos < m_pComboBox->get_count() ))
                         nPos = nTmpPos;
                 }
             }
@@ -292,7 +285,7 @@ void ComboboxToolbarController::executeControlCommand( const css::frame::Control
                 rControlCommand.Arguments[i].Value >>= aText;
         }
 
-        m_pComboBox->InsertEntry( aText, nPos );
+        m_pComboBox->insert_text(nPos, aText);
     }
     else if ( rControlCommand.Command == "RemoveEntryPos" )
     {
@@ -303,8 +296,8 @@ void ComboboxToolbarController::executeControlCommand( const css::frame::Control
                 sal_Int32 nPos( -1 );
                 if ( rControlCommand.Arguments[i].Value >>= nPos )
                 {
-                    if ( 0 <= nPos && nPos <  m_pComboBox->GetEntryCount() )
-                        m_pComboBox->RemoveEntryAt(nPos);
+                    if (0 <= nPos && nPos < m_pComboBox->get_count())
+                        m_pComboBox->remove(nPos);
                 }
                 break;
             }
@@ -319,9 +312,9 @@ void ComboboxToolbarController::executeControlCommand( const css::frame::Control
                 OUString aText;
                 if ( rControlCommand.Arguments[i].Value >>= aText )
                 {
-                    auto nPos = m_pComboBox->GetEntryPos(aText);
-                    if (nPos != COMBOBOX_ENTRY_NOTFOUND)
-                        m_pComboBox->RemoveEntryAt(nPos);
+                    auto nPos = m_pComboBox->find_text(aText);
+                    if (nPos != -1)
+                        m_pComboBox->remove(nPos);
                 }
                 break;
             }
diff --git a/framework/source/uielement/edittoolbarcontroller.cxx b/framework/source/uielement/edittoolbarcontroller.cxx
index f396bae1c6a6..6bdcd18c3cc4 100644
--- a/framework/source/uielement/edittoolbarcontroller.cxx
+++ b/framework/source/uielement/edittoolbarcontroller.cxx
@@ -103,7 +103,6 @@ IMPL_LINK_NOARG(EditControl, FocusOutHdl, weld::Widget&, void)
         m_pEditToolbarController->LoseFocus();
 }
 
-
 IMPL_LINK_NOARG(EditControl, ActivateHdl, weld::Entry&, bool)
 {
     if (m_pEditToolbarController)
diff --git a/svtools/UIConfig_svt.mk b/svtools/UIConfig_svt.mk
index 88078d2bf6a0..9ffba6766b71 100644
--- a/svtools/UIConfig_svt.mk
+++ b/svtools/UIConfig_svt.mk
@@ -11,6 +11,7 @@ $(eval $(call gb_UIConfig_UIConfig,svt))
 
 $(eval $(call gb_UIConfig_add_uifiles,svt,\
 	svtools/uiconfig/ui/addresstemplatedialog \
+	svtools/uiconfig/ui/combocontrol \
 	svtools/uiconfig/ui/datewindow \
 	svtools/uiconfig/ui/editcontrol \
 	svtools/uiconfig/ui/emptypage \
diff --git a/svtools/uiconfig/ui/combocontrol.ui b/svtools/uiconfig/ui/combocontrol.ui
new file mode 100644
index 000000000000..0b16afbe2cdc
--- /dev/null
+++ b/svtools/uiconfig/ui/combocontrol.ui
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="svt">
+  <requires lib="gtk+" version="3.18"/>
+  <object class="GtkBox" id="ComboControl">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="orientation">vertical</property>
+    <child>
+      <object class="GtkComboBoxText" id="combobox">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="hexpand">True</property>
+        <property name="vexpand">True</property>
+        <property name="has_entry">True</property>
+        <child internal-child="entry">
+          <object class="GtkEntry">
+            <property name="can_focus">True</property>
+          </object>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+  </object>
+</interface>


More information about the Libreoffice-commits mailing list