summaryrefslogtreecommitdiff
path: root/svx/source/editeng/impedit2.cxx
diff options
context:
space:
mode:
authorMalte Timmermann <mt@openoffice.org>2001-06-13 09:56:49 +0000
committerMalte Timmermann <mt@openoffice.org>2001-06-13 09:56:49 +0000
commit4f8b0a27c1369b61fc2304ffd2e2c9147369f2e9 (patch)
tree569e65d07a9718b55850241da5f457ccdeb2d00d /svx/source/editeng/impedit2.cxx
parent67edad23e5ce21395d4e27534b9f86913a87e761 (diff)
#86377# Overwrite in IME mode
Diffstat (limited to 'svx/source/editeng/impedit2.cxx')
-rw-r--r--svx/source/editeng/impedit2.cxx40
1 files changed, 37 insertions, 3 deletions
diff --git a/svx/source/editeng/impedit2.cxx b/svx/source/editeng/impedit2.cxx
index 0ac6c9340685..ab858a71af4e 100644
--- a/svx/source/editeng/impedit2.cxx
+++ b/svx/source/editeng/impedit2.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: impedit2.cxx,v $
*
- * $Revision: 1.33 $
+ * $Revision: 1.34 $
*
- * last change: $Author: mt $ $Date: 2001-05-14 15:19:42 $
+ * last change: $Author: mt $ $Date: 2001-06-13 10:55:27 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -520,7 +520,12 @@ void ImpEditEngine::Command( const CommandEvent& rCEvt, EditView* pView )
{
pView->DeleteSelected();
delete mpIMEInfos;
- mpIMEInfos = new ImplIMEInfos( pView->GetImpEditView()->GetEditSelection().Max() );
+ EditPaM aPaM = pView->GetImpEditView()->GetEditSelection().Max();
+ String aOldTextAfterStartPos = aPaM.GetNode()->Copy( aPaM.GetIndex() );
+ USHORT nMax = aOldTextAfterStartPos.Search( CH_FEATURE );
+ if ( nMax != STRING_NOTFOUND ) // don't overwrite features!
+ aOldTextAfterStartPos.Erase( nMax );
+ mpIMEInfos = new ImplIMEInfos( aPaM, aOldTextAfterStartPos );
mpIMEInfos->bWasCursorOverwrite = !pView->IsInsertMode();
}
else if ( rCEvt.GetCommand() == COMMAND_ENDEXTTEXTINPUT )
@@ -555,6 +560,35 @@ void ImpEditEngine::Command( const CommandEvent& rCEvt, EditView* pView )
aSel = DeleteSelected( aSel );
aSel = ImpInsertText( aSel, pData->GetText() );
+ if ( mpIMEInfos->bWasCursorOverwrite )
+ {
+ USHORT nOldIMETextLen = mpIMEInfos->nLen;
+ USHORT nNewIMETextLen = pData->GetText().Len();
+
+ if ( ( nOldIMETextLen > nNewIMETextLen ) &&
+ ( nNewIMETextLen < mpIMEInfos->aOldTextAfterStartPos.Len() ) )
+ {
+ // restore old characters
+ USHORT nRestore = nOldIMETextLen - nNewIMETextLen;
+ EditPaM aPaM( mpIMEInfos->aPos );
+ aPaM.GetIndex() += nNewIMETextLen;
+ ImpInsertText( aPaM, mpIMEInfos->aOldTextAfterStartPos.Copy( nNewIMETextLen, nRestore ) );
+ }
+ else if ( ( nOldIMETextLen < nNewIMETextLen ) &&
+ ( nOldIMETextLen < mpIMEInfos->aOldTextAfterStartPos.Len() ) )
+ {
+ // overwrite
+ USHORT nOverwrite = nNewIMETextLen - nOldIMETextLen;
+ if ( ( nOldIMETextLen + nOverwrite ) > mpIMEInfos->aOldTextAfterStartPos.Len() )
+ nOverwrite = mpIMEInfos->aOldTextAfterStartPos.Len() - nOldIMETextLen;
+ DBG_ASSERT( nOverwrite && (nOverwrite < 0xFF00), "IME Overwrite?!" );
+ EditPaM aPaM( mpIMEInfos->aPos );
+ aPaM.GetIndex() += nNewIMETextLen;
+ EditSelection aSel( aPaM );
+ aSel.Max().GetIndex() += nOverwrite;
+ DeleteSelected( aSel );
+ }
+ }
if ( pData->GetTextAttr() )
{
mpIMEInfos->CopyAttribs( pData->GetTextAttr(), pData->GetText().Len() );