[Libreoffice-commits] .: Branch 'feature/calc-multiline-input' - sc/source

Kohei Yoshida kohei at kemper.freedesktop.org
Mon Jul 11 10:37:05 PDT 2011


 sc/source/ui/app/inputwin.cxx |  478 ++++++++++++++++++++++++------------------
 sc/source/ui/inc/inputwin.hxx |   17 +
 2 files changed, 296 insertions(+), 199 deletions(-)

New commits:
commit bd6aae93e28483cbe3df290cdf06e3f179df207b
Author: Anurag Jain <anuragjainfzd at gmail.com>
Date:   Mon Jul 11 13:36:44 2011 -0400

    More progress.

diff --git a/sc/source/ui/app/inputwin.cxx b/sc/source/ui/app/inputwin.cxx
index 2d7a748..943eb82 100644
--- a/sc/source/ui/app/inputwin.cxx
+++ b/sc/source/ui/app/inputwin.cxx
@@ -51,6 +51,7 @@
 #include <vcl/cursor.hxx>
 #include <vcl/help.hxx>
 #include <svl/stritem.hxx>
+#include <stdio.h>
 
 #include "inputwin.hxx"
 #include "scmod.hxx"
@@ -81,6 +82,7 @@
 #define TEXT_MULTI_STARTPOS	5
 #define THESIZE				1000000	//!!! langt... :-)
 #define TBX_WINDOW_HEIGHT 	22 // in Pixeln - fuer alle Systeme gleich?
+#define LEFT_OFFSET         5
 
 enum ScNameInputType
 {
@@ -176,7 +178,7 @@ ScInputWindow::ScInputWindow( Window* pParent, SfxBindings* pBind ) :
     }
     DBG_ASSERT( pViewSh, "no view shell for input window" );
 
-    // Positionsfenster, 3 Buttons, Eingabefenster
+    // Position window, 3 buttons, input window
     InsertWindow    ( 1, &aWndPos, 0,								      0 );
     InsertSeparator ( 												   	  1 );
     InsertItem      ( SID_INPUT_FUNCTION, IMAGE( SID_INPUT_FUNCTION ), 0, 2 );
@@ -187,9 +189,12 @@ ScInputWindow::ScInputWindow( Window* pParent, SfxBindings* pBind ) :
 
     aWndPos	   .SetQuickHelpText( ScResId( SCSTR_QHELP_POSWND ) );
     aWndPos    .SetHelpId		( HID_INSWIN_POS );
-    aTextWindow.SetQuickHelpText( ScResId( SCSTR_QHELP_INPUTWND ) );
-    aTextWindow.SetHelpId		( HID_INSWIN_INPUT );
 
+    if ( !lcl_isExperimentalMode() )
+    {
+        aTextWindow.SetQuickHelpText( ScResId( SCSTR_QHELP_INPUTWND ) );
+        aTextWindow.SetHelpId		( HID_INSWIN_INPUT );
+    }
     //	kein SetHelpText, die Hilfetexte kommen aus der Hilfe
 
     SetItemText ( SID_INPUT_FUNCTION, ScResId( SCSTR_QHELP_BTNCALC ) );
@@ -477,7 +482,7 @@ void ScInputWindow::Select()
             aTextWindow.StartEditEngine();
             if ( pScMod->IsEditMode() )			// nicht, wenn z.B. geschuetzt
             {
-                aTextWindow.GrabFocus();
+                aTextWindow.StartEditEngine();
                 aTextWindow.SetTextString( '=' );
 
                 EditView* pView = aTextWindow.GetEditView();
@@ -498,19 +503,23 @@ void ScInputWindow::Resize()
 {
     ToolBox::Resize();
 
-    long nWidth = GetSizePixel().Width();
-    long nLeft  = aTextWindow.GetPosPixel().X();
-    Size aSize  = aTextWindow.GetSizePixel();
-
-    aSize.Width() = Max( ((long)(nWidth - nLeft - 5)), (long)0 );
     if ( lcl_isExperimentalMode() )
     {
-        aSize.Height()= TBX_WINDOW_HEIGHT;
-        aTextWindow.SetSizePixel( aSize );
+        //aSize.Height()= TBX_WINDOW_HEIGHT;
+        //aTextWindow.SetSizePixel( aSize );
         aTextWindow.Resize();
     }
-    aTextWindow.SetSizePixel( aSize );
-    aTextWindow.Invalidate();
+    else
+    {
+        long nWidth = GetSizePixel().Width();
+        long nLeft  = aTextWindow.GetPosPixel().X();
+        Size aSize  = aTextWindow.GetSizePixel();
+
+        aSize.Width() = Max( ((long)(nWidth - nLeft - 5)), (long)0 );
+
+        aTextWindow.SetSizePixel( aSize );
+        aTextWindow.Invalidate();
+    }
 }
 
 void ScInputWindow::SetFuncString( const String& rString, sal_Bool bDoEdit )
@@ -518,8 +527,10 @@ void ScInputWindow::SetFuncString( const String& rString, sal_Bool bDoEdit )
     //!	new method at ScModule to query if function autopilot is open
     SfxViewFrame* pViewFrm = SfxViewFrame::Current();
     EnableButtons( pViewFrm && !pViewFrm->GetChildWindow( SID_OPENDLG_FUNCTION ) );
-    aTextWindow.StartEditEngine();
-
+    if ( !lcl_isExperimentalMode() )
+        aTextWindow.StartEditEngine();
+    else
+        aTextWindow.StartEditEngine();
     ScModule* pScMod = SC_MOD();
     if ( pScMod->IsEditMode() )
     {
@@ -729,12 +740,17 @@ void ScInputWindow::DataChanged( const DataChangedEvent& rDCEvt )
 
 ScInputBarGroup::ScInputBarGroup(Window* pParent)
     :   ScTextWndBase        ( pParent, WinBits(WB_HIDE) ),
-        aTextWindow      ( this ),
-        bIsMultiLine    ( false )
+        aMultiTextWnd        ( this ),
+        aButton              ( this),
+        bIsMultiLine         ( false )
 {
-      aTextWindow.Show();
-      aTextWindow.SetQuickHelpText( ScResId( SCSTR_QHELP_INPUTWND ) );
-      aTextWindow.SetHelpId		( HID_INSWIN_INPUT );
+      aMultiTextWnd.Show();
+      aMultiTextWnd.SetQuickHelpText( ScResId( SCSTR_QHELP_INPUTWND ) );
+      aMultiTextWnd.SetHelpId		( HID_INSWIN_INPUT );
+
+      aButton.SetClickHdl	( LINK( this, ScInputBarGroup, ClickHdl ) );
+      aButton.Show();
+      aButton.Enable();
 }
 
 ScInputBarGroup::~ScInputBarGroup()
@@ -745,80 +761,131 @@ ScInputBarGroup::~ScInputBarGroup()
 void
 ScInputBarGroup::InsertAccessibleTextData( ScAccessibleEditLineTextData& rTextData )
 {
-    aTextWindow.InsertAccessibleTextData( rTextData );
+    aMultiTextWnd.InsertAccessibleTextData( rTextData );
 }
 
 void
 ScInputBarGroup::RemoveAccessibleTextData( ScAccessibleEditLineTextData& rTextData )
 {
-    aTextWindow.RemoveAccessibleTextData( rTextData );
+    aMultiTextWnd.RemoveAccessibleTextData( rTextData );
 }
 
 const String&
 ScInputBarGroup::GetTextString() const
 {
-    return aTextWindow.GetTextString();
+    return aMultiTextWnd.GetTextString();
 }
 
 void ScInputBarGroup::SetTextString( const String& rString )
 {
-    aTextWindow.SetTextString(rString);
+    aMultiTextWnd.SetTextString(rString);
 }
 
 void ScInputBarGroup::Resize()
 {
-    long nWidth = GetSizePixel().Width();
-    long nLeft  = aTextWindow.GetPosPixel().X();
-    Size aSize  = aTextWindow.GetSizePixel();
+    long nWidth = GetParent()->GetSizePixel().Width();
+    long nLeft  = GetPosPixel().X();
+    Size aSize  = GetSizePixel();
+    aSize.Width() = Max( ((long)(nWidth - nLeft - 2*LEFT_OFFSET)), (long)0 );
+    if(bIsMultiLine)
+    {
+        aSize.Height()=3*TBX_WINDOW_HEIGHT;
+    }
+    else
+    {
+        aSize.Height()=TBX_WINDOW_HEIGHT;
+    }
+    SetSizePixel(aSize);
+    Invalidate();
 
-    aSize.Width() = Max( ((long)(nWidth - nLeft - 40)), (long)0 );
-    aSize.Height()=22;
-    aTextWindow.SetSizePixel( aSize );
-    aTextWindow.Invalidate();
+    aButton.SetPosSizePixel(Point(aSize.Width()-3*LEFT_OFFSET,0),Size(0.5*TBX_WINDOW_HEIGHT,TBX_WINDOW_HEIGHT));
+
+    aMultiTextWnd.Resize();
 }
 
+
 void ScInputBarGroup::GainFocus()
 {
-    aTextWindow.GrabFocus();
+    aMultiTextWnd.GrabFocus();
 }
 
 
 void ScInputBarGroup::StopEditEngine( sal_Bool bAll )
 {
-    aTextWindow.StopEditEngine( bAll );
+    aMultiTextWnd.StopEditEngine( bAll );
 }
 
 void ScInputBarGroup::StartEditEngine()
 {
-    aTextWindow.StartEditEngine();
+    aMultiTextWnd.StartEditEngine();
 }
 
+
 void ScInputBarGroup::MakeDialogEditView()
 {
-    aTextWindow.MakeDialogEditView();
+    aMultiTextWnd.MakeDialogEditView();
 }
 
 
 EditView* ScInputBarGroup::GetEditView()
 {
-    return aTextWindow.GetEditView();
+    return aMultiTextWnd.GetEditView();
 }
 
 sal_Bool ScInputBarGroup::IsInputActive()
 {
-    return aTextWindow.IsInputActive();
+    return aMultiTextWnd.IsInputActive();
 }
 
 void ScInputBarGroup::SetFormulaMode(sal_Bool bSet)
 {
-    aTextWindow.SetFormulaMode(bSet);
+    aMultiTextWnd.SetFormulaMode(bSet);
+}
+
+IMPL_LINK( ScInputBarGroup, ClickHdl, PushButton*, pBtn )
+{
+    if(!bIsMultiLine)
+    {
+        bIsMultiLine=true;
+    }
+    else
+    {
+        bIsMultiLine=false;
+    }
+    aMultiTextWnd.SetMultiLineStatus(bIsMultiLine);
+    Resize();
+    return 0;
 }
 
-ScMultiTextWnd::ScMultiTextWnd( Window* pParen ) : ScTextWnd( pParen )
+//========================================================================
+//                      ScMultiTextWnd
+//========================================================================
+
+ScMultiTextWnd::ScMultiTextWnd( Window* pParen ) : ScTextWnd( pParen ),
+                                                   bIsMultiLine(false)
 {
     nTextStartPos = TEXT_MULTI_STARTPOS;
 }
 
+bool ScMultiTextWnd::GetMultiLineStatus()
+{
+    return bIsMultiLine;
+}
+
+void ScMultiTextWnd::SetMultiLineStatus(bool bMode)
+{
+    bIsMultiLine=bMode;
+}
+
+int ScMultiTextWnd::GetLineCount()
+{
+   if(pEditView)
+   {
+       return pEditEngine->GetLineCount(0);
+   }
+   return 1;
+}
+
 void ScMultiTextWnd::Paint( const Rectangle& rRec )
 {
     // We always use edit engine to draw text at all times.
@@ -833,21 +900,193 @@ void ScMultiTextWnd::Paint( const Rectangle& rRec )
 
 void ScMultiTextWnd::Resize()
 {
+    long nWidth = GetParent()->GetSizePixel().Width();
+    long nLeft  = GetPosPixel().X();
+    Size cSize  = GetSizePixel();
+    cSize.Width() = Max( ((long)(nWidth - nLeft - 3*LEFT_OFFSET)), (long)0 );
+
+    if(bIsMultiLine)
+    {
+        cSize.Height()=3*TBX_WINDOW_HEIGHT;
+    }
+    else
+    {
+        cSize.Height()=TBX_WINDOW_HEIGHT;
+    }
+    SetSizePixel(cSize);
+
     if (pEditView)
     {
         Size aSize = GetOutputSizePixel();
-
         Size bSize = LogicToPixel(Size(0,pEditEngine->GetLineHeight(0,0)));
         int nDiff=(aSize.Height()-bSize.Height())/2;
-        Point aPos(nTextStartPos,nDiff*aSize.Height()/aSize.Height());
+        Point aPos(TEXT_STARTPOS,nDiff*aSize.Height()/aSize.Height());
         Point aPos2(aSize.Width()-5,(aSize.Height()-nDiff)*aSize.Height()/aSize.Height());
         pEditView->SetOutputArea(
             PixelToLogic(Rectangle(aPos, aPos2)));
     }
 }
 
+
+
+void ScMultiTextWnd::StartEditEngine()
+{
+    //	Bei "eigener Modalitaet" (Doc-modale Dialoge) nicht aktivieren
+
+    SfxObjectShell* pObjSh = SfxObjectShell::Current();
+    if ( pObjSh && pObjSh->IsInModalMode() )
+        return;
+
+    if ( !pEditView || !pEditEngine )
+    {
+        InitEditEngine(pObjSh);
+    }
+
+    SC_MOD()->SetInputMode( SC_INPUT_TOP );
+
+    SfxViewFrame* pViewFrm = SfxViewFrame::Current();
+    if (pViewFrm)
+        pViewFrm->GetBindings().Invalidate( SID_ATTR_INSERT );
+}
+
+void lcl_ExtendEditFontAttribs( SfxItemSet& rSet )
+{
+    const SfxPoolItem& rFontItem = rSet.Get( EE_CHAR_FONTINFO );
+    rSet.Put( rFontItem, EE_CHAR_FONTINFO_CJK );
+    rSet.Put( rFontItem, EE_CHAR_FONTINFO_CTL );
+    const SfxPoolItem& rHeightItem = rSet.Get( EE_CHAR_FONTHEIGHT );
+    rSet.Put( rHeightItem, EE_CHAR_FONTHEIGHT_CJK );
+    rSet.Put( rHeightItem, EE_CHAR_FONTHEIGHT_CTL );
+    const SfxPoolItem& rWeightItem = rSet.Get( EE_CHAR_WEIGHT );
+    rSet.Put( rWeightItem, EE_CHAR_WEIGHT_CJK );
+    rSet.Put( rWeightItem, EE_CHAR_WEIGHT_CTL );
+    const SfxPoolItem& rItalicItem = rSet.Get( EE_CHAR_ITALIC );
+    rSet.Put( rItalicItem, EE_CHAR_ITALIC_CJK );
+    rSet.Put( rItalicItem, EE_CHAR_ITALIC_CTL );
+    const SfxPoolItem& rLangItem = rSet.Get( EE_CHAR_LANGUAGE );
+    rSet.Put( rLangItem, EE_CHAR_LANGUAGE_CJK );
+    rSet.Put( rLangItem, EE_CHAR_LANGUAGE_CTL );
+}
+
+void lcl_ModifyRTLDefaults( SfxItemSet& rSet )
+{
+    rSet.Put( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) );
+
+    //	always using rtl writing direction would break formulas
+    //rSet.Put( SvxFrameDirectionItem( FRMDIR_HORI_RIGHT_TOP, EE_PARA_WRITINGDIR ) );
+
+    //	PaperSize width is limited to USHRT_MAX in RTL mode (because of EditEngine's
+    //	sal_uInt16 values in EditLine), so the text may be wrapped and line spacing must be
+    //	increased to not see the beginning of the next line.
+    SvxLineSpacingItem aItem( SVX_LINESPACE_TWO_LINES, EE_PARA_SBL );
+    aItem.SetPropLineSpace( 200 );
+    rSet.Put( aItem );
+}
+
+void lcl_ModifyRTLVisArea( EditView* pEditView )
+{
+    Rectangle aVisArea = pEditView->GetVisArea();
+    Size aPaper = pEditView->GetEditEngine()->GetPaperSize();
+    long nDiff = aPaper.Width() - aVisArea.Right();
+    aVisArea.Left()  += nDiff;
+    aVisArea.Right() += nDiff;
+    pEditView->SetVisArea(aVisArea);
+}
+
+
+void ScMultiTextWnd::InitEditEngine(SfxObjectShell* pObjSh)
+{
+    ScFieldEditEngine* pNew;
+    ScTabViewShell* pViewSh = ScTabViewShell::GetActiveViewShell();
+    if ( pViewSh )
+    {
+        const ScDocument* pDoc = pViewSh->GetViewData()->GetDocument();
+        pNew = new ScFieldEditEngine( pDoc->GetEnginePool(), pDoc->GetEditPool() );
+    }
+    else
+        pNew = new ScFieldEditEngine( EditEngine::CreatePool(),	NULL, sal_True );
+    pNew->SetExecuteURL( false );
+    pEditEngine = pNew;
+
+    Size barSize=GetOutputSizePixel();
+
+    long barHeight=barSize.Height();
+    long textHeight=LogicToPixel( Size( 0, GetTextHeight() ) ).Height();
+    long nDiff =  barHeight - textHeight;
+
+    barSize.Height()=nDiff+barHeight;
+    barSize.Width() -= 2*nTextStartPos-4;
+    pEditEngine->SetUpdateMode( false );
+    pEditEngine->SetPaperSize( PixelToLogic(Size(barSize.Width(),10000)) );
+    pEditEngine->SetWordDelimiters(
+                    ScEditUtil::ModifyDelimiters( pEditEngine->GetWordDelimiters() ) );
+
+    UpdateAutoCorrFlag();
+
+    {
+        SfxItemSet* pSet = new SfxItemSet( pEditEngine->GetEmptyItemSet() );
+        pEditEngine->SetFontInfoInItemSet( *pSet, aTextFont );
+        lcl_ExtendEditFontAttribs( *pSet );
+        // turn off script spacing to match DrawText output
+        pSet->Put( SvxScriptSpaceItem( false, EE_PARA_ASIANCJKSPACING ) );
+        if ( bIsRTL )
+            lcl_ModifyRTLDefaults( *pSet );
+        pEditEngine->SetDefaults( pSet );
+    }
+
+    //	Wenn in der Zelle URL-Felder enthalten sind, muessen die auch in
+    //	die Eingabezeile uebernommen werden, weil sonst die Positionen nicht stimmen.
+
+    sal_Bool bFilled = false;
+    ScInputHandler* pHdl = SC_MOD()->GetInputHdl();
+    if ( pHdl )			//!	Testen, ob's der richtige InputHdl ist?
+        bFilled = pHdl->GetTextAndFields( *pEditEngine );
+
+    pEditEngine->SetUpdateMode( sal_True );
+
+    //	aString ist die Wahrheit...
+    if ( bFilled && pEditEngine->GetText() == aString )
+        Invalidate();						// Repaint fuer (hinterlegte) Felder
+    else
+        pEditEngine->SetText(aString);		// dann wenigstens den richtigen Text
+
+    pEditView = new EditView( pEditEngine, this );
+    pEditView->SetInsertMode(bIsInsertMode);
+
+    // Text aus Clipboard wird als ASCII einzeilig uebernommen
+    sal_uLong n = pEditView->GetControlWord();
+    pEditView->SetControlWord( n | EV_CNTRL_SINGLELINEPASTE	);
+
+    pEditEngine->InsertView( pEditView, EE_APPEND );
+
+    Resize();
+
+    if ( bIsRTL )
+        lcl_ModifyRTLVisArea( pEditView );
+
+    pEditEngine->SetModifyHdl(LINK(this, ScTextWnd, NotifyHdl));
+
+    if (!maAccTextDatas.empty())
+        maAccTextDatas.back()->StartEdit();
+
+    //	as long as EditEngine and DrawText sometimes differ for CTL text,
+    //	repaint now to have the EditEngine's version visible
+//        SfxObjectShell* pObjSh = SfxObjectShell::Current();
+    if ( pObjSh && pObjSh->ISA(ScDocShell) )
+    {
+        ScDocument* pDoc = ((ScDocShell*)pObjSh)->GetDocument();	// any document
+        sal_uInt8 nScript = pDoc->GetStringScriptType( aString );
+        if ( nScript & SCRIPTTYPE_COMPLEX )
+            Invalidate();
+    }
+}
+
+void ScMultiTextWnd::StopEditEngine( sal_Bool /*bAll*/ )
+{
+}
+
 //========================================================================
-// 							Eingabefenster
+// 							ScTextWnd
 //========================================================================
 
 ScTextWnd::ScTextWnd( Window* pParent )
@@ -1114,161 +1353,6 @@ void ScTextWnd::UpdateAutoCorrFlag()
     }
 }
 
-void lcl_ExtendEditFontAttribs( SfxItemSet& rSet )
-{
-    const SfxPoolItem& rFontItem = rSet.Get( EE_CHAR_FONTINFO );
-    rSet.Put( rFontItem, EE_CHAR_FONTINFO_CJK );
-    rSet.Put( rFontItem, EE_CHAR_FONTINFO_CTL );
-    const SfxPoolItem& rHeightItem = rSet.Get( EE_CHAR_FONTHEIGHT );
-    rSet.Put( rHeightItem, EE_CHAR_FONTHEIGHT_CJK );
-    rSet.Put( rHeightItem, EE_CHAR_FONTHEIGHT_CTL );
-    const SfxPoolItem& rWeightItem = rSet.Get( EE_CHAR_WEIGHT );
-    rSet.Put( rWeightItem, EE_CHAR_WEIGHT_CJK );
-    rSet.Put( rWeightItem, EE_CHAR_WEIGHT_CTL );
-    const SfxPoolItem& rItalicItem = rSet.Get( EE_CHAR_ITALIC );
-    rSet.Put( rItalicItem, EE_CHAR_ITALIC_CJK );
-    rSet.Put( rItalicItem, EE_CHAR_ITALIC_CTL );
-    const SfxPoolItem& rLangItem = rSet.Get( EE_CHAR_LANGUAGE );
-    rSet.Put( rLangItem, EE_CHAR_LANGUAGE_CJK );
-    rSet.Put( rLangItem, EE_CHAR_LANGUAGE_CTL );
-}
-
-void lcl_ModifyRTLDefaults( SfxItemSet& rSet )
-{
-    rSet.Put( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) );
-
-    //	always using rtl writing direction would break formulas
-    //rSet.Put( SvxFrameDirectionItem( FRMDIR_HORI_RIGHT_TOP, EE_PARA_WRITINGDIR ) );
-
-    //	PaperSize width is limited to USHRT_MAX in RTL mode (because of EditEngine's
-    //	sal_uInt16 values in EditLine), so the text may be wrapped and line spacing must be
-    //	increased to not see the beginning of the next line.
-    SvxLineSpacingItem aItem( SVX_LINESPACE_TWO_LINES, EE_PARA_SBL );
-    aItem.SetPropLineSpace( 200 );
-    rSet.Put( aItem );
-}
-
-void lcl_ModifyRTLVisArea( EditView* pEditView )
-{
-    Rectangle aVisArea = pEditView->GetVisArea();
-    Size aPaper = pEditView->GetEditEngine()->GetPaperSize();
-    long nDiff = aPaper.Width() - aVisArea.Right();
-    aVisArea.Left()  += nDiff;
-    aVisArea.Right() += nDiff;
-    pEditView->SetVisArea(aVisArea);
-}
-
-void ScMultiTextWnd::StartEditEngine()
-{
-    //	Bei "eigener Modalitaet" (Doc-modale Dialoge) nicht aktivieren
-
-    SfxObjectShell* pObjSh = SfxObjectShell::Current();
-    if ( pObjSh && pObjSh->IsInModalMode() )
-        return;
-
-    if ( !pEditView || !pEditEngine )
-    {
-        InitEditEngine(pObjSh);
-    }
-
-    SC_MOD()->SetInputMode( SC_INPUT_TOP );
-
-    SfxViewFrame* pViewFrm = SfxViewFrame::Current();
-    if (pViewFrm)
-        pViewFrm->GetBindings().Invalidate( SID_ATTR_INSERT );
-}
-
-void ScMultiTextWnd::InitEditEngine(SfxObjectShell* pObjSh)
-{
-    ScFieldEditEngine* pNew;
-    ScTabViewShell* pViewSh = ScTabViewShell::GetActiveViewShell();
-    if ( pViewSh )
-    {
-        const ScDocument* pDoc = pViewSh->GetViewData()->GetDocument();
-        pNew = new ScFieldEditEngine( pDoc->GetEnginePool(), pDoc->GetEditPool() );
-    }
-    else
-        pNew = new ScFieldEditEngine( EditEngine::CreatePool(),	NULL, sal_True );
-    pNew->SetExecuteURL( false );
-    pEditEngine = pNew;
-
-    Size barSize=GetOutputSizePixel();
-
-    long barHeight=barSize.Height();
-    long textHeight=LogicToPixel( Size( 0, GetTextHeight() ) ).Height();
-    long nDiff =  barHeight - textHeight;
-
-    barSize.Height()=nDiff+barHeight;
-    barSize.Width() -= 2*nTextStartPos-4;
-    pEditEngine->SetUpdateMode( false );
-    pEditEngine->SetPaperSize( PixelToLogic(Size(barSize.Width(),10000)) );
-    pEditEngine->SetWordDelimiters(
-                    ScEditUtil::ModifyDelimiters( pEditEngine->GetWordDelimiters() ) );
-
-    UpdateAutoCorrFlag();
-
-    {
-        SfxItemSet* pSet = new SfxItemSet( pEditEngine->GetEmptyItemSet() );
-        pEditEngine->SetFontInfoInItemSet( *pSet, aTextFont );
-        lcl_ExtendEditFontAttribs( *pSet );
-        // turn off script spacing to match DrawText output
-        pSet->Put( SvxScriptSpaceItem( false, EE_PARA_ASIANCJKSPACING ) );
-        if ( bIsRTL )
-            lcl_ModifyRTLDefaults( *pSet );
-        pEditEngine->SetDefaults( pSet );
-    }
-
-    //	Wenn in der Zelle URL-Felder enthalten sind, muessen die auch in
-    //	die Eingabezeile uebernommen werden, weil sonst die Positionen nicht stimmen.
-
-    sal_Bool bFilled = false;
-    ScInputHandler* pHdl = SC_MOD()->GetInputHdl();
-    if ( pHdl )			//!	Testen, ob's der richtige InputHdl ist?
-        bFilled = pHdl->GetTextAndFields( *pEditEngine );
-
-    pEditEngine->SetUpdateMode( sal_True );
-
-    //	aString ist die Wahrheit...
-    if ( bFilled && pEditEngine->GetText() == aString )
-        Invalidate();						// Repaint fuer (hinterlegte) Felder
-    else
-        pEditEngine->SetText(aString);		// dann wenigstens den richtigen Text
-
-    pEditView = new EditView( pEditEngine, this );
-    pEditView->SetInsertMode(bIsInsertMode);
-
-    // Text aus Clipboard wird als ASCII einzeilig uebernommen
-    sal_uLong n = pEditView->GetControlWord();
-    pEditView->SetControlWord( n | EV_CNTRL_SINGLELINEPASTE	);
-
-    pEditEngine->InsertView( pEditView, EE_APPEND );
-
-    Resize();
-
-    if ( bIsRTL )
-        lcl_ModifyRTLVisArea( pEditView );
-
-    pEditEngine->SetModifyHdl(LINK(this, ScTextWnd, NotifyHdl));
-
-    if (!maAccTextDatas.empty())
-        maAccTextDatas.back()->StartEdit();
-
-    //	as long as EditEngine and DrawText sometimes differ for CTL text,
-    //	repaint now to have the EditEngine's version visible
-//        SfxObjectShell* pObjSh = SfxObjectShell::Current();
-    if ( pObjSh && pObjSh->ISA(ScDocShell) )
-    {
-        ScDocument* pDoc = ((ScDocShell*)pObjSh)->GetDocument();	// any document
-        sal_uInt8 nScript = pDoc->GetStringScriptType( aString );
-        if ( nScript & SCRIPTTYPE_COMPLEX )
-            Invalidate();
-    }
-}
-
-void ScMultiTextWnd::StopEditEngine( sal_Bool /*bAll*/ )
-{
-}
-
 void ScTextWnd::StartEditEngine()
 {
     //	Bei "eigener Modalitaet" (Doc-modale Dialoge) nicht aktivieren
diff --git a/sc/source/ui/inc/inputwin.hxx b/sc/source/ui/inc/inputwin.hxx
index 627c4be..6437bf8 100644
--- a/sc/source/ui/inc/inputwin.hxx
+++ b/sc/source/ui/inc/inputwin.hxx
@@ -33,6 +33,7 @@
 #include <vcl/toolbox.hxx>
 #include <sfx2/childwin.hxx>
 #include <svl/lstner.hxx>
+#include <vcl/button.hxx>
 #include <vcl/combobox.hxx>
 #include <vcl/window.hxx>
 #include <svtools/transfer.hxx>
@@ -171,13 +172,21 @@ public:
     ScMultiTextWnd( Window* pParent );
     virtual void StartEditEngine();
     virtual void StopEditEngine( sal_Bool bAll );
+    void SetMultiLineStatus(bool bMode);
+    bool GetMultiLineStatus();
+    int GetLineCount();
+    void SetSize(bool bIsMultiLine);
+    virtual void Resize();
 protected:
     void InitEditEngine(SfxObjectShell* pObjSh);
 
     virtual void Paint( const Rectangle& rRec );
-    virtual void Resize();
+private:
+    bool bIsMultiLine;
 };
 
+//================================================================================
+
 class ScInputBarGroup : public ScTextWndBase
 {
 
@@ -203,11 +212,15 @@ public:
 
 private:
 
-    ScMultiTextWnd      aTextWindow;
+    ScMultiTextWnd  aMultiTextWnd;
+    PushButton      aButton;
     bool            bIsMultiLine;
 
+    DECL_LINK( ClickHdl,	 PushButton* );
+
 };
 
+//================================================================================
 
 class ScInputWindow : public ToolBox						// Parent-Toolbox
 {


More information about the Libreoffice-commits mailing list