[Libreoffice-commits] core.git: Branch 'libreoffice-5-0' - sc/source vcl/unx

Justin Luth justin_luth at sil.org
Tue Jun 30 07:37:37 PDT 2015


 sc/source/ui/Accessibility/AccessibleEditObject.cxx |   12 ++++++++++--
 vcl/unx/gtk/window/gtksalframe.cxx                  |   12 ++++++++++--
 2 files changed, 20 insertions(+), 4 deletions(-)

New commits:
commit 227e7f903fee64d63b48bd31707887ba28a019bc
Author: Justin Luth <justin_luth at sil.org>
Date:   Tue Jun 30 15:55:46 2015 +0300

    tdf#91641 adjust cursor when deleting preceding characters
    
    IMDeleteSurrounding is used by input methods to take multiple
    keystrokes and convert them into a special character.  Then the
    composing keystrokes are removed.
    Before this fix, the cursor placement was not adjusted,
    so the special character was inserted in the wrong position
    and if 3+ keystrokes were involved, the wrong characters were deleted.
    
    Also fixes "editLine should have focus on accessibleText init."
    The first time an accessibleEdit is created, it didnt recognize any
    focused text when editing in the "Input Line".
    
    Change-Id: I5be9b75f74d4df82fbd57da3817a626b5fcbeba1
    Reviewed-on: https://gerrit.libreoffice.org/15961
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>
    Reviewed-on: https://gerrit.libreoffice.org/16619

diff --git a/sc/source/ui/Accessibility/AccessibleEditObject.cxx b/sc/source/ui/Accessibility/AccessibleEditObject.cxx
index e975bd5..c688165 100644
--- a/sc/source/ui/Accessibility/AccessibleEditObject.cxx
+++ b/sc/source/ui/Accessibility/AccessibleEditObject.cxx
@@ -372,13 +372,21 @@ void ScAccessibleEditObject::CreateTextHelper()
         ::std::unique_ptr< SvxEditSource > pEditSource (new ScAccessibilityEditSource(std::move(pAccessibleTextData)));
         mpTextHelper = new ::accessibility::AccessibleTextHelper(std::move(pEditSource));
         mpTextHelper->SetEventSource(this);
-        mpTextHelper->SetFocus(mbHasFocus);
+
+        const ScInputHandler* pInputHdl = SC_MOD()->GetInputHdl();
+        if ( pInputHdl && pInputHdl->IsEditMode() )
+        {
+            mpTextHelper->SetFocus(true);
+        }
+        else
+        {
+            mpTextHelper->SetFocus(mbHasFocus);
+        }
 
         // #i54814# activate cell in edit mode
         if( meObjectType == CellInEditMode )
         {
             // do not activate cell object, if top edit line is active
-            const ScInputHandler* pInputHdl = SC_MOD()->GetInputHdl();
             if( pInputHdl && !pInputHdl->IsTopMode() )
             {
                 SdrHint aHint( HINT_BEGEDIT );
diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx
index 017b7f1..7d25640 100644
--- a/vcl/unx/gtk/window/gtksalframe.cxx
+++ b/vcl/unx/gtk/window/gtksalframe.cxx
@@ -4630,7 +4630,7 @@ gboolean GtkSalFrame::IMHandler::signalIMRetrieveSurrounding( GtkIMContext* pCon
     uno::Reference<accessibility::XAccessibleEditableText> xText = lcl_GetxText(pFocusWin);
     if (xText.is())
     {
-        sal_uInt32 nPosition = xText->getCaretPosition();
+        sal_Int32 nPosition = xText->getCaretPosition();
         OUString sAllText = xText->getText();
         OString sUTF = OUStringToOString(sAllText, RTL_TEXTENCODING_UTF8);
         OUString sCursorText(sAllText.copy(0, nPosition));
@@ -4652,7 +4652,7 @@ gboolean GtkSalFrame::IMHandler::signalIMDeleteSurrounding( GtkIMContext*, gint
     uno::Reference<accessibility::XAccessibleEditableText> xText = lcl_GetxText(pFocusWin);
     if (xText.is())
     {
-        sal_uInt32 nPosition = xText->getCaretPosition();
+        sal_Int32 nPosition = xText->getCaretPosition();
         // #i111768# range checking
         sal_Int32 nDeletePos = nPosition + offset;
         sal_Int32 nDeleteEnd = nDeletePos + nchars;
@@ -4664,6 +4664,14 @@ gboolean GtkSalFrame::IMHandler::signalIMDeleteSurrounding( GtkIMContext*, gint
             nDeleteEnd = xText->getCharacterCount();
 
         xText->deleteText(nDeletePos, nDeleteEnd);
+        //tdf91641 adjust cursor if deleted chars shift it forward (normal case)
+        if (nDeletePos < nPosition)
+        {
+            if (nDeleteEnd <= nPosition)
+                xText->setCaretPosition( nPosition-(nDeleteEnd-nDeletePos) );
+            else
+                xText->setCaretPosition( nDeletePos );
+        }
         return true;
     }
 


More information about the Libreoffice-commits mailing list