summaryrefslogtreecommitdiff
path: root/framework
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2020-04-22 16:06:41 +0100
committerCaolán McNamara <caolanm@redhat.com>2020-04-23 13:57:57 +0200
commit424ffd5ea25d03b3c8628a273a1cf9794f6e1f52 (patch)
tree6fb8dcc1d574fc453383cfd22ac5127de7c4a682 /framework
parent048ab42d3f5c7bc6116b483d9c8ac8975c7d68a4 (diff)
weld ComboBoxControl
Change-Id: Ifdb76cc61e6270f8a04fec2534dcd29d27e8281f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92724 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'framework')
-rw-r--r--framework/inc/uielement/comboboxtoolbarcontroller.hxx2
-rw-r--r--framework/source/uielement/comboboxtoolbarcontroller.cxx185
-rw-r--r--framework/source/uielement/edittoolbarcontroller.cxx1
3 files changed, 90 insertions, 98 deletions
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)