sc/UIConfig_scalc.mk | 1 sc/source/ui/app/inputwin.cxx | 204 +++++++++++++++++++++-------------------- sc/source/ui/inc/inputwin.hxx | 20 ++-- sc/uiconfig/scalc/ui/posbox.ui | 29 +++++ 4 files changed, 153 insertions(+), 101 deletions(-)
New commits: commit 6407eb952efae074850c4e8c52c630397914a145 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Mon Feb 17 10:49:59 2020 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Mon Feb 17 13:39:58 2020 +0100 weld ScPosWnd Item Window Change-Id: I63eb8511a91a631be760b8ae62465c2dc3a05efc Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88856 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/sc/UIConfig_scalc.mk b/sc/UIConfig_scalc.mk index 7268ec8013f7..3035aa28e2bb 100644 --- a/sc/UIConfig_scalc.mk +++ b/sc/UIConfig_scalc.mk @@ -186,6 +186,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/scalc,\ sc/uiconfig/scalc/ui/pivotfielddialog \ sc/uiconfig/scalc/ui/pivotfilterdialog \ sc/uiconfig/scalc/ui/pivottablelayoutdialog \ + sc/uiconfig/scalc/ui/posbox \ sc/uiconfig/scalc/ui/printareasdialog \ sc/uiconfig/scalc/ui/printeroptions \ sc/uiconfig/scalc/ui/protectsheetdlg \ diff --git a/sc/source/ui/app/inputwin.cxx b/sc/source/ui/app/inputwin.cxx index 8117330bf114..bf80fc89b07f 100644 --- a/sc/source/ui/app/inputwin.cxx +++ b/sc/source/ui/app/inputwin.cxx @@ -1979,21 +1979,32 @@ void ScTextWnd::TextGrabFocus() // Position window -ScPosWnd::ScPosWnd( vcl::Window* pParent ) : - ComboBox ( pParent, WinBits(WB_HIDE | WB_DROPDOWN) ), - nTipVisible ( nullptr ), - bFormulaMode( false ) -{ - set_id("pos_window"); - Size aSize( GetTextWidth( "GW99999:GW99999" ), - GetTextHeight() ); - aSize.AdjustWidth(25 ); // FIXME: ?? - aSize.setHeight( CalcWindowSizePixel(21) ); // Functions: 20 MRU + "others..." - SetSizePixel( aSize ); +ScPosWnd::ScPosWnd(vcl::Window* pParent) + : InterimItemWindow(pParent, "modules/scalc/ui/posbox.ui", "PosBox") + , m_xWidget(m_xBuilder->weld_combo_box("pos_window")) + , m_nAsyncGetFocusId(nullptr) + , nTipVisible(nullptr) + , bFormulaMode(false) +{ + m_xWidget->set_entry_width_chars(15); + SetSizePixel(m_xContainer->get_preferred_size()); FillRangeNames(); StartListening( *SfxGetpApp() ); // For Navigator rangename updates + + m_xWidget->connect_key_press(LINK(this, ScPosWnd, KeyInputHdl)); + m_xWidget->connect_entry_activate(LINK(this, ScPosWnd, ActivateHdl)); + m_xWidget->connect_changed(LINK(this, ScPosWnd, ModifyHdl)); + m_xWidget->connect_focus_in(LINK(this, ScPosWnd, FocusInHdl)); + m_xWidget->connect_focus_out(LINK(this, ScPosWnd, FocusOutHdl)); +} + +void ScPosWnd::GetFocus() +{ + if (m_xWidget) + m_xWidget->grab_focus(); + InterimItemWindow::GetFocus(); } ScPosWnd::~ScPosWnd() @@ -2007,7 +2018,14 @@ void ScPosWnd::dispose() HideTip(); - ComboBox::dispose(); + if (m_nAsyncGetFocusId) + { + Application::RemoveUserEvent(m_nAsyncGetFocusId); + m_nAsyncGetFocusId = nullptr; + } + m_xWidget.reset(); + + InterimItemWindow::dispose(); } void ScPosWnd::SetFormulaMode( bool bSet ) @@ -2030,7 +2048,7 @@ void ScPosWnd::SetPos( const OUString& rPosStr ) if ( aPosStr != rPosStr ) { aPosStr = rPosStr; - SetText(aPosStr); + m_xWidget->set_entry_text(aPosStr); } } @@ -2045,15 +2063,16 @@ OUString createLocalRangeName(const OUString& rName, const OUString& rTableName) void ScPosWnd::FillRangeNames() { - Clear(); + m_xWidget->clear(); + m_xWidget->freeze(); SfxObjectShell* pObjSh = SfxObjectShell::Current(); if ( auto pDocShell = dynamic_cast<ScDocShell*>( pObjSh) ) { ScDocument& rDoc = pDocShell->GetDocument(); - InsertEntry(ScResId( STR_MANAGE_NAMES )); - SetSeparatorPos(0); + m_xWidget->append_text(ScResId(STR_MANAGE_NAMES)); + m_xWidget->append_separator("separator"); ScRange aDummy; std::set<OUString> aSet; @@ -2080,15 +2099,17 @@ void ScPosWnd::FillRangeNames() for (const auto& rItem : aSet) { - InsertEntry(rItem); + m_xWidget->append_text(rItem); } } - SetText(aPosStr); + m_xWidget->thaw(); + m_xWidget->set_entry_text(aPosStr); } void ScPosWnd::FillFunctions() { - Clear(); + m_xWidget->clear(); + m_xWidget->freeze(); OUString aFirstName; const ScAppOptions& rOpt = SC_MOD()->GetAppOptions(); @@ -2106,7 +2127,7 @@ void ScPosWnd::FillFunctions() const ScFuncDesc* pDesc = pFuncList->GetFunction( j ); if ( pDesc->nFIndex == nId && pDesc->mxFuncName ) { - InsertEntry( *pDesc->mxFuncName ); + m_xWidget->append_text(*pDesc->mxFuncName); if (aFirstName.isEmpty()) aFirstName = *pDesc->mxFuncName; break; // Stop searching @@ -2118,9 +2139,10 @@ void ScPosWnd::FillFunctions() //! Re-add entry "Other..." for Function AutoPilot if it can work with text that // has been entered so far - // InsertEntry( ScResId(STR_FUNCTIONLIST_MORE) ); + // m_xWidget->append_text(ScResId(STR_FUNCTIONLIST_MORE)); - SetText(aFirstName); + m_xWidget->thaw(); + m_xWidget->set_entry_text(aFirstName); } void ScPosWnd::Notify( SfxBroadcaster&, const SfxHint& rHint ) @@ -2145,12 +2167,9 @@ void ScPosWnd::Notify( SfxBroadcaster&, const SfxHint& rHint ) void ScPosWnd::HideTip() { - if ( nTipVisible ) + if (nTipVisible) { - vcl::Window* pWin = GetSubEdit(); - if (!pWin) - pWin = this; - Help::HidePopover(pWin, nTipVisible); + Help::HidePopover(this, nTipVisible); nTipVisible = nullptr; } } @@ -2203,17 +2222,21 @@ static ScNameInputType lcl_GetInputType( const OUString& rText ) return eRet; } -void ScPosWnd::Modify() +IMPL_LINK_NOARG(ScPosWnd, ModifyHdl, weld::ComboBox&, void) { - ComboBox::Modify(); - HideTip(); - if ( !IsTravelSelect() && !bFormulaMode ) + if (m_xWidget->changed_by_direct_pick()) + { + DoEnter(); + return; + } + + if (!bFormulaMode) { // determine the action that would be taken for the current input - ScNameInputType eType = lcl_GetInputType( GetText() ); // uses current view + ScNameInputType eType = lcl_GetInputType(m_xWidget->get_active_text()); // uses current view const char* pStrId = nullptr; switch ( eType ) { @@ -2244,36 +2267,23 @@ void ScPosWnd::Modify() if (pStrId) { // show the help tip at the text cursor position - vcl::Window* pWin = GetSubEdit(); - if (!pWin) - pWin = this; Point aPos; - vcl::Cursor* pCur = pWin->GetCursor(); + vcl::Cursor* pCur = GetCursor(); if (pCur) - aPos = pWin->LogicToPixel( pCur->GetPos() ); - aPos = pWin->OutputToScreenPixel( aPos ); + aPos = LogicToPixel( pCur->GetPos() ); + aPos = OutputToScreenPixel( aPos ); tools::Rectangle aRect( aPos, aPos ); OUString aText = ScResId(pStrId); QuickHelpFlags const nAlign = QuickHelpFlags::Left|QuickHelpFlags::Bottom; - nTipVisible = Help::ShowPopover(pWin, aRect, aText, nAlign); + nTipVisible = Help::ShowPopover(this, aRect, aText, nAlign); } } } -void ScPosWnd::Select() -{ - ComboBox::Select(); // In VCL GetText() only return the selected entry afterwards - - HideTip(); - - if (!IsTravelSelect()) - DoEnter(); -} - void ScPosWnd::DoEnter() { - OUString aText = GetText(); + OUString aText = m_xWidget->get_active_text(); if ( !aText.isEmpty() ) { if ( bFormulaMode ) @@ -2364,66 +2374,70 @@ void ScPosWnd::DoEnter() } } else - SetText( aPosStr ); + m_xWidget->set_entry_text(aPosStr); ReleaseFocus_Impl(); } -bool ScPosWnd::EventNotify( NotifyEvent& rNEvt ) +IMPL_LINK_NOARG(ScPosWnd, ActivateHdl, weld::ComboBox&, bool) +{ + DoEnter(); + return true; +} + +IMPL_LINK(ScPosWnd, KeyInputHdl, const KeyEvent&, rKEvt, bool) { bool bHandled = true; - switch (rNEvt.GetType()) + switch (rKEvt.GetKeyCode().GetCode()) { - case MouseNotifyEvent::KEYINPUT: - { - const KeyEvent* pKEvt = rNEvt.GetKeyEvent(); - - switch ( pKEvt->GetKeyCode().GetCode() ) + case KEY_RETURN: + bHandled = ActivateHdl(*m_xWidget); + break; + case KEY_ESCAPE: + if (nTipVisible) { - case KEY_RETURN: - DoEnter(); - break; - - case KEY_ESCAPE: - if (nTipVisible) - { - // escape when the tip help is shown: only hide the tip - HideTip(); - } - else - { - if (!bFormulaMode) - SetText( aPosStr ); - ReleaseFocus_Impl(); - } - break; - - default: - bHandled = false; - break; + // escape when the tip help is shown: only hide the tip + HideTip(); } - } - break; - case MouseNotifyEvent::GETFOCUS: - { - // Select the whole text upon focus. - OUString aStr = GetText(); - SetSelection(Selection(0, aStr.getLength())); - } - break; - case MouseNotifyEvent::LOSEFOCUS: - HideTip(); - bHandled = false; - break; + else + { + if (!bFormulaMode) + m_xWidget->set_entry_text(aPosStr); + ReleaseFocus_Impl(); + } + break; default: bHandled = false; + break; } - if (!bHandled) - bHandled = ComboBox::EventNotify(rNEvt); + return bHandled || ChildKeyInput(rKEvt); +} + +IMPL_LINK_NOARG(ScPosWnd, OnAsyncGetFocus, void*, void) +{ + m_nAsyncGetFocusId = nullptr; + m_xWidget->select_entry_region(0, -1); +} - return bHandled; +IMPL_LINK_NOARG(ScPosWnd, FocusInHdl, weld::Widget&, void) +{ + if (m_nAsyncGetFocusId) + return; + // do it async to defeat entry in combobox having its own ideas about the focus + m_nAsyncGetFocusId = Application::PostUserEvent(LINK(this, ScPosWnd, OnAsyncGetFocus)); +} + +IMPL_LINK_NOARG(ScPosWnd, FocusOutHdl, weld::Widget&, void) +{ + if (m_nAsyncGetFocusId) + { + Application::RemoveUserEvent(m_nAsyncGetFocusId); + m_nAsyncGetFocusId = nullptr; + } + + HideTip(); } void ScPosWnd::ReleaseFocus_Impl() diff --git a/sc/source/ui/inc/inputwin.hxx b/sc/source/ui/inc/inputwin.hxx index a60d879cb091..a04e87e529a9 100644 --- a/sc/source/ui/inc/inputwin.hxx +++ b/sc/source/ui/inc/inputwin.hxx @@ -23,6 +23,7 @@ #include <vector> #include <memory> #include <vcl/toolbox.hxx> +#include <sfx2/InterimItemWindow.hxx> #include <sfx2/childwin.hxx> #include <svl/lstner.hxx> #include <vcl/button.hxx> @@ -149,9 +150,13 @@ private: bool mbInvalidate; }; -class ScPosWnd : public ComboBox, public SfxListener // Display position +class ScPosWnd final : public InterimItemWindow, public SfxListener // Display position { private: + std::unique_ptr<weld::ComboBox> m_xWidget; + + ImplSVEvent* m_nAsyncGetFocusId; + OUString aPosStr; void* nTipVisible; bool bFormulaMode; @@ -160,15 +165,18 @@ public: ScPosWnd( vcl::Window* pParent ); virtual ~ScPosWnd() override; virtual void dispose() override; + virtual void GetFocus() override; void SetPos( const OUString& rPosStr ); // Displayed Text void SetFormulaMode( bool bSet ); -protected: - virtual void Select() override; - virtual void Modify() override; - - virtual bool EventNotify( NotifyEvent& rNEvt ) override; +private: + DECL_LINK(OnAsyncGetFocus, void*, void); + DECL_LINK(KeyInputHdl, const KeyEvent&, bool); + DECL_LINK(ActivateHdl, weld::ComboBox&, bool); + DECL_LINK(ModifyHdl, weld::ComboBox&, void); + DECL_LINK(FocusInHdl, weld::Widget&, void); + DECL_LINK(FocusOutHdl, weld::Widget&, void); virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; diff --git a/sc/uiconfig/scalc/ui/posbox.ui b/sc/uiconfig/scalc/ui/posbox.ui new file mode 100644 index 000000000000..a474a251702c --- /dev/null +++ b/sc/uiconfig/scalc/ui/posbox.ui @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface domain="sc"> + <requires lib="gtk+" version="3.18"/> + <object class="GtkBox" id="PosBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkComboBoxText" id="pos_window"> + <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> _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits