[Libreoffice-commits] core.git: solenv/sanitizers sw/inc sw/source sw/uiconfig sw/UIConfig_swriter.mk

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Mon Feb 17 16:22:27 UTC 2020


 solenv/sanitizers/ui/modules/swriter.suppr |    1 
 sw/UIConfig_swriter.mk                     |    1 
 sw/inc/pch/precompiled_msword.hxx          |    3 
 sw/inc/pch/precompiled_sw.hxx              |    5 -
 sw/source/uibase/inc/inputwin.hxx          |   75 ++++++++++++++++++--
 sw/source/uibase/ribbar/inputwin.cxx       |  104 ++++++++++++++++-------------
 sw/uiconfig/swriter/ui/inputeditbox.ui     |   25 ++++++
 7 files changed, 155 insertions(+), 59 deletions(-)

New commits:
commit 2658b0e5ffdff795d910f373feb5c55ad01b7d09
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Sun Feb 16 20:09:04 2020 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Mon Feb 17 17:21:52 2020 +0100

    weld InputEdit Item Window
    
    Change-Id: I33e4fb378897289b7b54c80b9cb3d7e868381f96
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88822
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/solenv/sanitizers/ui/modules/swriter.suppr b/solenv/sanitizers/ui/modules/swriter.suppr
index 25757e0b7bf2..24fe10db80b1 100644
--- a/solenv/sanitizers/ui/modules/swriter.suppr
+++ b/solenv/sanitizers/ui/modules/swriter.suppr
@@ -94,6 +94,7 @@ sw/uiconfig/swriter/ui/indexentry.ui://GtkButton[@id='previous'] button-no-label
 sw/uiconfig/swriter/ui/indexentry.ui://GtkButton[@id='next'] button-no-label
 sw/uiconfig/swriter/ui/indexentry.ui://GtkButton[@id='first'] button-no-label
 sw/uiconfig/swriter/ui/indexentry.ui://GtkButton[@id='last'] button-no-label
+sw/uiconfig/swriter/ui/inputeditbox.ui://GtkEntry[@id='entry'] no-labelled-by
 sw/uiconfig/swriter/ui/insertbookmark.ui://GtkLabel[@id='lbForbiddenChars'] orphan-label
 sw/uiconfig/swriter/ui/insertbreak.ui://GtkSpinButton[@id='pagenumsb'] missing-label-for
 sw/uiconfig/swriter/ui/insertcaption.ui://GtkEntry[@id='caption_edit'] no-labelled-by
diff --git a/sw/UIConfig_swriter.mk b/sw/UIConfig_swriter.mk
index 1139afec7010..14d8eba7c615 100644
--- a/sw/UIConfig_swriter.mk
+++ b/sw/UIConfig_swriter.mk
@@ -166,6 +166,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/swriter,\
 	sw/uiconfig/swriter/ui/indentpage \
 	sw/uiconfig/swriter/ui/infonotfounddialog \
 	sw/uiconfig/swriter/ui/inforeadonlydialog \
+	sw/uiconfig/swriter/ui/inputeditbox \
 	sw/uiconfig/swriter/ui/insertautotextdialog \
 	sw/uiconfig/swriter/ui/insertbookmark \
 	sw/uiconfig/swriter/ui/insertbreak \
diff --git a/sw/inc/pch/precompiled_msword.hxx b/sw/inc/pch/precompiled_msword.hxx
index 0eff00865266..92377e666028 100644
--- a/sw/inc/pch/precompiled_msword.hxx
+++ b/sw/inc/pch/precompiled_msword.hxx
@@ -13,7 +13,7 @@
  manual changes will be rewritten by the next run of update_pch.sh (which presumably
  also fixes all possible problems, so it's usually better to use it).
 
- Generated on 2020-02-14 09:24:02 using:
+ Generated on 2020-02-17 14:43:22 using:
  ./bin/update_pch sw msword --cutoff=4 --exclude:system --include:module --include:local
 
  If after updating build fails, use the following command to locate conflicting headers:
@@ -544,6 +544,7 @@
 #include <ndarr.hxx>
 #include <ndgrf.hxx>
 #include <ndhints.hxx>
+#include <ndindex.hxx>
 #include <ndole.hxx>
 #include <ndtxt.hxx>
 #include <ndtyp.hxx>
diff --git a/sw/inc/pch/precompiled_sw.hxx b/sw/inc/pch/precompiled_sw.hxx
index 78e52e5f430e..83ced7f22e1c 100644
--- a/sw/inc/pch/precompiled_sw.hxx
+++ b/sw/inc/pch/precompiled_sw.hxx
@@ -13,7 +13,7 @@
  manual changes will be rewritten by the next run of update_pch.sh (which presumably
  also fixes all possible problems, so it's usually better to use it).
 
- Generated on 2020-02-16 16:30:24 using:
+ Generated on 2020-02-17 14:43:31 using:
  ./bin/update_pch sw sw --cutoff=7 --exclude:system --exclude:module --include:local
 
  If after updating build fails, use the following command to locate conflicting headers:
@@ -68,9 +68,6 @@
 #include <rtl/math.hxx>
 #include <rtl/ref.hxx>
 #include <rtl/strbuf.hxx>
-#include <rtl/string.h>
-#include <rtl/stringconcat.hxx>
-#include <rtl/stringutils.hxx>
 #include <rtl/tencinfo.h>
 #include <rtl/textenc.h>
 #include <rtl/unload.h>
diff --git a/sw/source/uibase/inc/inputwin.hxx b/sw/source/uibase/inc/inputwin.hxx
index a8a0123a6e5d..00735215eb74 100644
--- a/sw/source/uibase/inc/inputwin.hxx
+++ b/sw/source/uibase/inc/inputwin.hxx
@@ -20,7 +20,6 @@
 #define INCLUDED_SW_SOURCE_UIBASE_INC_INPUTWIN_HXX
 
 #include <sfx2/InterimItemWindow.hxx>
-#include <vcl/edit.hxx>
 #include <vcl/menu.hxx>
 #include <vcl/toolbox.hxx>
 
@@ -31,19 +30,75 @@ class SwWrtShell;
 class SwView;
 class SfxDispatcher;
 
-class InputEdit : public Edit
+class InputEdit final : public InterimItemWindow
 {
+private:
+    std::unique_ptr<weld::Entry> m_xWidget;
+
+    DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
+    DECL_LINK(ActivateHdl, weld::Entry&, bool);
 public:
-                    InputEdit(vcl::Window* pParent, WinBits nStyle) :
-                        Edit(pParent , nStyle){}
+    InputEdit(vcl::Window* pParent)
+        : InterimItemWindow(pParent, "modules/swriter/ui/inputeditbox.ui", "InputEditBox")
+        , m_xWidget(m_xBuilder->weld_entry("entry"))
+    {
+        m_xWidget->connect_key_press(LINK(this, InputEdit, KeyInputHdl));
+        m_xWidget->connect_activate(LINK(this, InputEdit, ActivateHdl));
+        SetSizePixel(m_xWidget->get_preferred_size());
+    }
+
+    void UpdateRange(const OUString& rSel, const OUString& rTableName);
+
+    virtual void dispose() override
+    {
+        m_xWidget.reset();
+        InterimItemWindow::dispose();
+    }
 
-    void            UpdateRange(const OUString& aSel,
-                                const OUString& aTableName );
+    virtual void GetFocus() override
+    {
+        if (m_xWidget)
+            m_xWidget->grab_focus();
+        InterimItemWindow::GetFocus();
+    }
 
-protected:
-    virtual void    KeyInput( const KeyEvent&  ) override;
+    void set_text(const OUString& rText)
+    {
+        m_xWidget->set_text(rText);
+    }
+
+    OUString get_text() const
+    {
+        return m_xWidget->get_text();
+    }
+
+    void set_accessible_name(const OUString& rName)
+    {
+        m_xWidget->set_accessible_name(rName);
+    }
+
+    void replace_selection(const OUString& rText)
+    {
+        m_xWidget->replace_selection(rText);
+    }
+
+    void select_region(int nStartPos, int nEndPos)
+    {
+        m_xWidget->select_region(nStartPos, nEndPos);
+    }
+
+    void connect_changed(const Link<weld::Entry&, void>& rLink)
+    {
+        m_xWidget->connect_changed(rLink);
+    }
+
+    virtual ~InputEdit() override
+    {
+        disposeOnce();
+    }
 };
 
+
 class PosEdit final : public InterimItemWindow
 {
 private:
@@ -93,7 +148,7 @@ class SwInputWindow final : public ToolBox
 friend class InputEdit;
 
     VclPtr<PosEdit> mxPos;
-    VclPtr<InputEdit> aEdit;
+    VclPtr<InputEdit> mxEdit;
     std::unique_ptr<SwFieldMgr> pMgr;
     SwWrtShell*     pWrtShell;
     SwView*         pView;
@@ -109,7 +164,7 @@ friend class InputEdit;
     void CleanupUglyHackWithUndo();
 
     void DelBoxContent();
-    DECL_LINK( ModifyHdl, Edit&, void );
+    DECL_LINK(ModifyHdl, weld::Entry&, void);
 
     using Window::IsActive;
 
diff --git a/sw/source/uibase/ribbar/inputwin.cxx b/sw/source/uibase/ribbar/inputwin.cxx
index b7e35a5c1310..841dc4a829bb 100644
--- a/sw/source/uibase/ribbar/inputwin.cxx
+++ b/sw/source/uibase/ribbar/inputwin.cxx
@@ -66,7 +66,7 @@ IMPL_LINK(PosEdit, KeyInputHdl, const KeyEvent&, rKEvt, bool)
 SwInputWindow::SwInputWindow(vcl::Window* pParent, SfxDispatcher const * pDispatcher)
     : ToolBox(pParent, WB_3DLOOK|WB_BORDER)
     , mxPos(VclPtr<PosEdit>::Create(this))
-    , aEdit(VclPtr<InputEdit>::Create(this, WB_3DLOOK|WB_TABSTOP|WB_BORDER|WB_NOHIDESELECTION))
+    , mxEdit(VclPtr<InputEdit>::Create(this))
     , pWrtShell(nullptr)
     , pView(nullptr)
     , m_bDoesUndo(true)
@@ -76,8 +76,6 @@ SwInputWindow::SwInputWindow(vcl::Window* pParent, SfxDispatcher const * pDispat
     bFirst = true;
     bIsTable = bDelSel = false;
 
-    aEdit->SetSizePixel(aEdit->CalcMinimumSize());
-
     InsertItem(FN_FORMULA_CALC, Image(StockImage::Yes, RID_BMP_FORMULA_CALC),
                SwResId(STR_FORMULA_CALC));
     InsertItem(FN_FORMULA_CANCEL, Image(StockImage::Yes, RID_BMP_FORMULA_CANCEL),
@@ -101,16 +99,16 @@ SwInputWindow::SwInputWindow(vcl::Window* pParent, SfxDispatcher const * pDispat
     SetAccessibleName(SwResId(STR_ACCESS_FORMULA_TOOLBAR));
     InsertSeparator ( 1 );
     InsertSeparator ();
-    InsertWindow(ED_FORMULA, aEdit.get());
+    InsertWindow(ED_FORMULA, mxEdit.get());
     SetItemText(ED_FORMULA, SwResId(STR_ACCESS_FORMULA_TEXT));
-    aEdit->SetAccessibleName(SwResId(STR_ACCESS_FORMULA_TEXT));
+    mxEdit->set_accessible_name(SwResId(STR_ACCESS_FORMULA_TEXT));
     SetHelpId(ED_FORMULA, HID_EDIT_FORMULA);
 
     SetItemBits( FN_FORMULA_CALC, GetItemBits( FN_FORMULA_CALC ) | ToolBoxItemBits::DROPDOWNONLY );
     SetDropdownClickHdl( LINK( this, SwInputWindow, DropdownClickHdl ));
 
     Size    aSizeTbx = CalcWindowSizePixel();
-    Size    aEditSize = aEdit->GetSizePixel();
+    Size    aEditSize = mxEdit->GetSizePixel();
     tools::Rectangle aItemRect( GetItemRect(FN_FORMULA_CALC) );
     long nMaxHeight = std::max(aEditSize.Height(), aItemRect.GetHeight());
     if( nMaxHeight+2 > aSizeTbx.Height() )
@@ -124,11 +122,11 @@ SwInputWindow::SwInputWindow(vcl::Window* pParent, SfxDispatcher const * pDispat
     aPosSize.setHeight( nMaxHeight );
     aEditSize.setHeight( nMaxHeight );
     Point aPosPos  = mxPos->GetPosPixel();
-    Point aEditPos = aEdit->GetPosPixel();
+    Point aEditPos = mxEdit->GetPosPixel();
     aPosPos.setY( (aSize.Height() - nMaxHeight)/2 + 1 );
     aEditPos.setY( (aSize.Height() - nMaxHeight)/2 + 1 );
     mxPos->SetPosSizePixel( aPosPos, aPosSize );
-    aEdit->SetPosSizePixel( aEditPos, aEditSize );
+    mxEdit->SetPosSizePixel( aEditPos, aEditSize );
 }
 
 SwInputWindow::~SwInputWindow()
@@ -151,7 +149,7 @@ void SwInputWindow::dispose()
     CleanupUglyHackWithUndo();
 
     mxPos.disposeAndClear();
-    aEdit.disposeAndClear();
+    mxEdit.disposeAndClear();
     ToolBox::dispose();
 }
 
@@ -177,19 +175,18 @@ void SwInputWindow::Resize()
     ToolBox::Resize();
 
     long    nWidth      = GetSizePixel().Width();
-    long    nLeft       = aEdit->GetPosPixel().X();
-    Size    aEditSize   = aEdit->GetSizePixel();
+    long    nLeft       = mxEdit->GetPosPixel().X();
+    Size    aEditSize   = mxEdit->GetSizePixel();
 
     aEditSize.setWidth( std::max( static_cast<long>(nWidth - nLeft - 5), long(0) ) );
-    aEdit->SetSizePixel( aEditSize );
-    aEdit->Invalidate();
+    mxEdit->SetSizePixel( aEditSize );
 }
 
 void SwInputWindow::ShowWin()
 {
     bIsTable = false;
     // stop rulers
-    if(pView)
+    if (pView)
     {
         pView->GetHRuler().SetActive( false );
         pView->GetVRuler().SetActive( false );
@@ -268,22 +265,27 @@ void SwInputWindow::ShowWin()
 
         bFirst = false;
 
-        aEdit->SetModifyHdl( LINK( this, SwInputWindow, ModifyHdl ));
+        mxEdit->connect_changed( LINK( this, SwInputWindow, ModifyHdl ));
 
-        aEdit->SetText( sEdit );
-        aEdit->SetSelection( Selection( sEdit.getLength(), sEdit.getLength() ) );
+        mxEdit->set_text( sEdit );
         sOldFormula = sEdit;
 
-        aEdit->Invalidate();
-        aEdit->Update();
-        aEdit->GrabFocus();
         // For input cut the UserInterface
 
         pView->GetEditWin().LockKeyInput(true);
         pView->GetViewFrame()->GetDispatcher()->Lock(true);
         pWrtShell->Push();
     }
+
     ToolBox::Show();
+
+    // grab focus after ToolBox is shown so focus isn't potentially lost elsewhere
+    if (pView)
+    {
+        int nPos = mxEdit->get_text().getLength();
+        mxEdit->select_region(nPos, nPos);
+        mxEdit->GrabFocus();
+    }
 }
 
 IMPL_LINK( SwInputWindow, MenuHdl, Menu *, pMenu, bool )
@@ -292,7 +294,7 @@ IMPL_LINK( SwInputWindow, MenuHdl, Menu *, pMenu, bool )
     if (!aCommand.isEmpty())
     {
         aCommand += " ";
-        aEdit->ReplaceSelected(OStringToOUString(aCommand, RTL_TEXTENCODING_ASCII_US));
+        mxEdit->replace_selection(OStringToOUString(aCommand, RTL_TEXTENCODING_ASCII_US));
     }
     return false;
 }
@@ -337,7 +339,7 @@ void  SwInputWindow::ApplyFormula()
     pWrtShell->Pop(SwCursorShell::PopMode::DeleteCurrent);
 
     // Form should always begin with "=", so remove it here again
-    OUString sEdit(comphelper::string::strip(aEdit->GetText(), ' '));
+    OUString sEdit(comphelper::string::strip(mxEdit->get_text(), ' '));
     if( !sEdit.isEmpty() && '=' == sEdit[0] )
         sEdit = sEdit.copy( 1 );
     SfxStringItem aParam(FN_EDIT_FORMULA, sEdit);
@@ -383,9 +385,9 @@ IMPL_LINK( SwInputWindow, SelTableCellsNotify, SwWrtShell&, rCaller, void )
         if( pTableFormat && aCurrentTableName != pTableFormat->GetName() )
             sTableNm = pTableFormat->GetName();
 
-        aEdit->UpdateRange( sBoxNms, sTableNm );
+        mxEdit->UpdateRange( sBoxNms, sTableNm );
 
-        OUString sNew = OUStringChar(CH_LRE) + aEdit->GetText()
+        OUString sNew = OUStringChar(CH_LRE) + mxEdit->get_text()
             + OUStringChar(CH_PDF);
 
         if( sNew != sOldFormula )
@@ -408,7 +410,7 @@ IMPL_LINK( SwInputWindow, SelTableCellsNotify, SwWrtShell&, rCaller, void )
         }
     }
     else
-        aEdit->GrabFocus();
+        mxEdit->GrabFocus();
 }
 
 void SwInputWindow::SetFormula( const OUString& rFormula )
@@ -421,19 +423,18 @@ void SwInputWindow::SetFormula( const OUString& rFormula )
         else
             sEdit += rFormula;
     }
-    aEdit->SetText( sEdit );
-    aEdit->SetSelection( Selection( sEdit.getLength(), sEdit.getLength() ) );
-    aEdit->Invalidate();
+    mxEdit->set_text( sEdit );
+    mxEdit->select_region(sEdit.getLength(), sEdit.getLength());
     bDelSel = true;
 }
 
-IMPL_LINK_NOARG(SwInputWindow, ModifyHdl, Edit&, void)
+IMPL_LINK_NOARG(SwInputWindow, ModifyHdl, weld::Entry&, void)
 {
     if (bIsTable && m_bResetUndo)
     {
         pWrtShell->StartAllAction();
         DelBoxContent();
-        OUString sNew = OUStringChar(CH_LRE) + aEdit->GetText()
+        OUString sNew = OUStringChar(CH_LRE) + mxEdit->get_text()
             + OUStringChar(CH_PDF);
         pWrtShell->SwEditShell::Insert2( sNew );
         pWrtShell->EndAllAction();
@@ -457,15 +458,26 @@ void SwInputWindow::DelBoxContent()
     }
 }
 
-void InputEdit::KeyInput(const KeyEvent& rEvent)
+IMPL_LINK(InputEdit, KeyInputHdl, const KeyEvent&, rEvent, bool)
 {
+    bool bHandled = false;
     const vcl::KeyCode aCode = rEvent.GetKeyCode();
-    if(aCode == KEY_RETURN || aCode == KEY_F2 )
-        static_cast<SwInputWindow*>(GetParent())->ApplyFormula();
+    if (aCode == KEY_RETURN || aCode == KEY_F2)
+    {
+        bHandled = ActivateHdl(*m_xWidget);
+    }
     else if(aCode == KEY_ESCAPE )
+    {
         static_cast<SwInputWindow*>(GetParent())->CancelFormula();
-    else
-        Edit::KeyInput(rEvent);
+        bHandled = true;
+    }
+    return bHandled || ChildKeyInput(rEvent);
+}
+
+IMPL_LINK_NOARG(InputEdit, ActivateHdl, weld::Entry&, bool)
+{
+    static_cast<SwInputWindow*>(GetParent())->ApplyFormula();
+    return true;
 }
 
 void InputEdit::UpdateRange(const OUString& rBoxes,
@@ -482,25 +494,29 @@ void InputEdit::UpdateRange(const OUString& rBoxes,
     if(!rName.isEmpty())
         aPrefix += ".";
     OUString aBoxes = aPrefix + rBoxes;
-    Selection aSelection(GetSelection());
+
+    int nSelStartPos, nSelEndPos;
+    m_xWidget->get_selection_bounds(nSelStartPos, nSelEndPos);
+
+    Selection aSelection(nSelStartPos, nSelEndPos);
     sal_uInt16 nSel = static_cast<sal_uInt16>(aSelection.Len());
     // OS: The following expression ensures that in the overwrite mode,
     // the selected closing parenthesis will be not deleted.
     if( nSel && ( nSel > 1 ||
-                  GetText()[ static_cast<sal_uInt16>(aSelection.Min()) ] != cClose ))
-        Cut();
+                  m_xWidget->get_text()[ static_cast<sal_uInt16>(aSelection.Min()) ] != cClose ))
+        m_xWidget->cut_clipboard();
     else
         aSelection.Max() = aSelection.Min();
-    OUString aActText(GetText());
+    OUString aActText(m_xWidget->get_text());
     const sal_uInt16 nLen = aActText.getLength();
     if( !nLen )
     {
         OUString aStr = OUStringChar(cOpen) + aBoxes + OUStringChar(cClose);
-        SetText(aStr);
+        m_xWidget->set_text(aStr);
         sal_Int32 nPos = aStr.indexOf( cClose );
         OSL_ENSURE(nPos != -1, "delimiter not found");
         ++nPos;
-        SetSelection( Selection( nPos, nPos ));
+        m_xWidget->select_region(nPos, nPos);
     }
     else
     {
@@ -549,10 +565,10 @@ void InputEdit::UpdateRange(const OUString& rBoxes,
             aActText = aActText.replaceAt( nPos, 0, aTmp );
             nPos = nPos + aTmp.getLength();
         }
-        if( GetText() != aActText )
+        if( m_xWidget->get_text() != aActText )
         {
-            SetText( aActText );
-            SetSelection( Selection( nPos, nPos ) );
+            m_xWidget->set_text(aActText);
+            m_xWidget->select_region(nPos, nPos);
         }
     }
     GrabFocus();
diff --git a/sw/uiconfig/swriter/ui/inputeditbox.ui b/sw/uiconfig/swriter/ui/inputeditbox.ui
new file mode 100644
index 000000000000..11a8cac5507d
--- /dev/null
+++ b/sw/uiconfig/swriter/ui/inputeditbox.ui
@@ -0,0 +1,25 @@
+<?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="InputEditBox">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="hexpand">True</property>
+    <property name="spacing">6</property>
+    <child>
+      <object class="GtkEntry" id="entry">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="hexpand">True</property>
+        <property name="vexpand">True</property>
+        <property name="width_chars">0</property>
+      </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