Author: hanya
Date: Tue Jan 16 16:17:17 2018
New Revision: 1821262

URL: http://svn.apache.org/viewvc?rev=1821262&view=rev
Log:
#i127662# send better window position to input method for suggestion window

Modified:
    openoffice/trunk/main/editeng/source/editeng/impedit2.cxx
    openoffice/trunk/main/svtools/source/edit/textview.cxx
    openoffice/trunk/main/sw/inc/crsrsh.hxx
    openoffice/trunk/main/sw/source/core/crsr/crsrsh.cxx
    openoffice/trunk/main/sw/source/ui/docvw/edtwin.cxx
    openoffice/trunk/main/vcl/source/control/edit.cxx
    openoffice/trunk/main/vcl/unx/gtk/window/gtkframe.cxx

Modified: openoffice/trunk/main/editeng/source/editeng/impedit2.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/editeng/source/editeng/impedit2.cxx?rev=1821262&r1=1821261&r2=1821262&view=diff
==============================================================================
--- openoffice/trunk/main/editeng/source/editeng/impedit2.cxx (original)
+++ openoffice/trunk/main/editeng/source/editeng/impedit2.cxx Tue Jan 16 
16:17:17 2018
@@ -622,7 +622,12 @@ void ImpEditEngine::Command( const Comma
                                nInputEnd = pLine->GetEnd();
                        Rectangle aR2 = PaMtoEditCursor( EditPaM( 
aPaM.GetNode(), nInputEnd ), GETCRSR_ENDOFLINE );
                        Rectangle aRect = 
pView->GetImpEditView()->GetWindowPos( aR1 );
-                       pView->GetWindow()->SetCursorRect( &aRect, 
aR2.Left()-aR1.Right() );
+                       long nWidth = aR2.Left()-aR1.Right();
+                       if ( nWidth == 0 ) {
+                               Rectangle aR3 = PaMtoEditCursor( 
mpIMEInfos->aPos );
+                               nWidth = -(aR1.Left() - aR3.Left());
+                       }
+                       pView->GetWindow()->SetCursorRect( &aRect, nWidth );
                }
                else
                {

Modified: openoffice/trunk/main/svtools/source/edit/textview.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/svtools/source/edit/textview.cxx?rev=1821262&r1=1821261&r2=1821262&view=diff
==============================================================================
--- openoffice/trunk/main/svtools/source/edit/textview.cxx (original)
+++ openoffice/trunk/main/svtools/source/edit/textview.cxx Tue Jan 16 16:17:17 
2018
@@ -1048,6 +1048,10 @@ void TextView::Command( const CommandEve
                        
                        long nWidth = aR2.Left()-aR1.Right();
                        aR1.Move( -GetStartDocPos().X(), -GetStartDocPos().Y() 
);
+            if ( nWidth == 0 ) {
+                Rectangle aR3 = mpImpl->mpTextEngine->PaMtoEditCursor( 
mpImpl->mpTextEngine->mpIMEInfos->aPos );
+                nWidth = -(aR1.Left() - aR3.Left());
+            }
                        GetWindow()->SetCursorRect( &aR1, nWidth );
                }
                else

Modified: openoffice/trunk/main/sw/inc/crsrsh.hxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/sw/inc/crsrsh.hxx?rev=1821262&r1=1821261&r2=1821262&view=diff
==============================================================================
--- openoffice/trunk/main/sw/inc/crsrsh.hxx (original)
+++ openoffice/trunk/main/sw/inc/crsrsh.hxx Tue Jan 16 16:17:17 2018
@@ -550,6 +550,11 @@ public:
      * liefert das SRectangle, auf dem der Cursor steht.
      */
     const SwRect &GetCharRect() const { return aCharRect; }
+    
+    // Obtains character rectangle at the position.
+    sal_Bool GetCharRectAt( SwRect& rOrig, const SwPosition& rPos,
+                                  SwCrsrMoveState *pCMS = 0 ) const;
+    
     /*
      * liefert zurueck, ob der Cursor sich ganz oder teilweise im
      * sichtbaren Bereich befindet.

Modified: openoffice/trunk/main/sw/source/core/crsr/crsrsh.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/core/crsr/crsrsh.cxx?rev=1821262&r1=1821261&r2=1821262&view=diff
==============================================================================
--- openoffice/trunk/main/sw/source/core/crsr/crsrsh.cxx (original)
+++ openoffice/trunk/main/sw/source/core/crsr/crsrsh.cxx Tue Jan 16 16:17:17 
2018
@@ -1233,6 +1233,14 @@ sal_Bool SwCrsrShell::GoPrevCrsr()
 }
 
 
+sal_Bool SwCrsrShell::GetCharRectAt( SwRect& rOrig, const SwPosition& rPos,
+                                     SwCrsrMoveState* pCMS ) const
+{
+    SwCntntFrm * pFrm = GetCurrFrm();
+    return pFrm ? pFrm->GetCharRect( rOrig, rPos, pCMS ) : sal_False;
+}
+
+
 void SwCrsrShell::Paint( const Rectangle &rRect)
 {
        SET_CURR_SHELL( this );

Modified: openoffice/trunk/main/sw/source/ui/docvw/edtwin.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/sw/source/ui/docvw/edtwin.cxx?rev=1821262&r1=1821261&r2=1821262&view=diff
==============================================================================
--- openoffice/trunk/main/sw/source/ui/docvw/edtwin.cxx (original)
+++ openoffice/trunk/main/sw/source/ui/docvw/edtwin.cxx Tue Jan 16 16:17:17 2018
@@ -5059,8 +5059,40 @@ void SwEditWin::Command( const CommandEv
     }
     break;
     case COMMAND_CURSORPOS:
-        // will be handled by the base class
-        break;
+    {
+        sal_Bool bIsDocReadOnly = rView.GetDocShell()->IsReadOnly() &&
+                              rSh.IsCrsrReadonly();
+        if ( !bIsDocReadOnly )
+        {
+            if( rSh.HasDrawView() && rSh.GetDrawView()->IsTextEdit() )
+            {
+                bCallBase = sal_False;
+                rSh.GetDrawView()->GetTextEditOutlinerView()->Command( rCEvt );
+            }
+            else
+            {
+                const SwExtTextInput* pExtInp = 
rSh.GetDoc()->GetExtTextInput();
+                if ( pExtInp )
+                {
+                    // The carret placed at the end of the preedit.
+                    if ( POS_COLLIDE_START == ComparePosition( 
*pExtInp->End(), *pExtInp->End(),
+                                        *rSh.GetCrsr()->End(), 
*rSh.GetCrsr()->End() ) )
+                    {
+                        SwRect aInputRect;
+                        if ( rSh.GetCharRectAt( aInputRect, *pExtInp->Start() 
) )
+                        {
+                            Rectangle aRect( aInputRect.SVRect() );
+                            SetCursorRect( &aRect, 1 );
+                            bCallBase = sal_False;
+                        }
+                    }
+                    if ( bCallBase )
+                        SetCursorRect();
+                }
+            }
+        }
+    }
+    break;
 
     case COMMAND_PASTESELECTION:
         if( !rView.GetDocShell()->IsReadOnly() )

Modified: openoffice/trunk/main/vcl/source/control/edit.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/vcl/source/control/edit.cxx?rev=1821262&r1=1821261&r2=1821262&view=diff
==============================================================================
--- openoffice/trunk/main/vcl/source/control/edit.cxx (original)
+++ openoffice/trunk/main/vcl/source/control/edit.cxx Tue Jan 16 16:17:17 2018
@@ -2313,8 +2313,11 @@ void Edit::Command( const CommandEvent&
                if ( mpIMEInfos )
                {
                        xub_StrLen nCursorPos = 
(sal_uInt16)GetSelection().Max();
-                       SetCursorRect( NULL, GetTextWidth(
-                               maText, nCursorPos, 
mpIMEInfos->nPos+mpIMEInfos->nLen-nCursorPos ) );
+                       long nWidth = GetTextWidth( maText, mpIMEInfos->nPos, 
mpIMEInfos->nLen );
+                       if ( nCursorPos == ( mpIMEInfos->nPos + 
mpIMEInfos->nLen ) ) {
+                               nWidth = -nWidth;
+                       }
+                       SetCursorRect( NULL, nWidth );
                }
                else
                {

Modified: openoffice/trunk/main/vcl/unx/gtk/window/gtkframe.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/vcl/unx/gtk/window/gtkframe.cxx?rev=1821262&r1=1821261&r2=1821262&view=diff
==============================================================================
--- openoffice/trunk/main/vcl/unx/gtk/window/gtkframe.cxx (original)
+++ openoffice/trunk/main/vcl/unx/gtk/window/gtkframe.cxx Tue Jan 16 16:17:17 
2018
@@ -3344,7 +3344,9 @@ void GtkSalFrame::IMHandler::updateIMSpo
     SalExtTextInputPosEvent aPosEvent;
     m_pFrame->CallCallback( SALEVENT_EXTTEXTINPUTPOS, (void*)&aPosEvent );
     GdkRectangle aArea;
-    aArea.x = aPosEvent.mnX;
+    // Positive aPosEvent.mnExtWidth means ahead of the carret, 
+    // negative value means behind of the carret.
+    aArea.x = aPosEvent.mnX + (aPosEvent.mnExtWidth < 0 ? aPosEvent.mnExtWidth 
: 0);
     aArea.y = aPosEvent.mnY;
     aArea.width = aPosEvent.mnWidth;
     aArea.height = aPosEvent.mnHeight;


Reply via email to