diff options
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/ui/Accessibility/AccessibleText.cxx | 14 | ||||
-rw-r--r-- | sc/source/ui/app/inputwin.cxx | 274 | ||||
-rw-r--r-- | sc/source/ui/inc/inputwin.hxx | 88 |
3 files changed, 346 insertions, 30 deletions
diff --git a/sc/source/ui/Accessibility/AccessibleText.cxx b/sc/source/ui/Accessibility/AccessibleText.cxx index 2dbbd15c2f12..2e85f48b44bc 100644 --- a/sc/source/ui/Accessibility/AccessibleText.cxx +++ b/sc/source/ui/Accessibility/AccessibleText.cxx @@ -1096,7 +1096,7 @@ ScAccessibleEditLineTextData::ScAccessibleEditLineTextData(EditView* pEditView, ScAccessibleEditObjectTextData(pEditView, pWin), mbEditEngineCreated(false) { - ScTextWnd* pTxtWnd = (ScTextWnd*)pWin; + ScTextWnd* pTxtWnd = dynamic_cast<ScTextWnd*>( pWin ); if (pTxtWnd) pTxtWnd->InsertAccessibleTextData( *this ); @@ -1104,7 +1104,7 @@ ScAccessibleEditLineTextData::ScAccessibleEditLineTextData(EditView* pEditView, ScAccessibleEditLineTextData::~ScAccessibleEditLineTextData() { - ScTextWnd* pTxtWnd = (ScTextWnd*)mpWindow; + ScTextWnd* pTxtWnd = dynamic_cast< ScTextWnd* >(mpWindow); if (pTxtWnd) pTxtWnd->RemoveAccessibleTextData( *this ); @@ -1125,7 +1125,7 @@ ScAccessibleEditLineTextData::~ScAccessibleEditLineTextData() void ScAccessibleEditLineTextData::Dispose() { - ScTextWnd* pTxtWnd = (ScTextWnd*)mpWindow; + ScTextWnd* pTxtWnd = dynamic_cast<ScTextWnd*>(mpWindow); if (pTxtWnd) pTxtWnd->RemoveAccessibleTextData( *this ); @@ -1141,7 +1141,7 @@ ScAccessibleTextData* ScAccessibleEditLineTextData::Clone() const SvxTextForwarder* ScAccessibleEditLineTextData::GetTextForwarder() { - ScTextWnd* pTxtWnd = (ScTextWnd*)mpWindow; + ScTextWnd* pTxtWnd = dynamic_cast<ScTextWnd*>(mpWindow); if (pTxtWnd) { @@ -1187,7 +1187,7 @@ SvxTextForwarder* ScAccessibleEditLineTextData::GetTextForwarder() SvxEditViewForwarder* ScAccessibleEditLineTextData::GetEditViewForwarder( sal_Bool bCreate ) { - ScTextWnd* pTxtWnd = (ScTextWnd*)mpWindow; + ScTextWnd* pTxtWnd = dynamic_cast<ScTextWnd*>(mpWindow); if (pTxtWnd) { @@ -1209,7 +1209,7 @@ SvxEditViewForwarder* ScAccessibleEditLineTextData::GetEditViewForwarder( sal_Bo void ScAccessibleEditLineTextData::ResetEditMode() { - ScTextWnd* pTxtWnd = (ScTextWnd*)mpWindow; + ScTextWnd* pTxtWnd = dynamic_cast<ScTextWnd*>(mpWindow); if (mbEditEngineCreated && mpEditEngine) delete mpEditEngine; @@ -1227,7 +1227,7 @@ void ScAccessibleEditLineTextData::TextChanged() { if (mbEditEngineCreated && mpEditEngine) { - ScTextWnd* pTxtWnd = (ScTextWnd*)mpWindow; + ScTextWnd* pTxtWnd = dynamic_cast<ScTextWnd*>(mpWindow); if (pTxtWnd) mpEditEngine->SetText(pTxtWnd->GetTextString()); diff --git a/sc/source/ui/app/inputwin.cxx b/sc/source/ui/app/inputwin.cxx index 62c67ac21c77..d9efd94e0535 100644 --- a/sc/source/ui/app/inputwin.cxx +++ b/sc/source/ui/app/inputwin.cxx @@ -75,8 +75,10 @@ #include <com/sun/star/accessibility/XAccessible.hpp> #include "AccessibleEditObject.hxx" #include "AccessibleText.hxx" +#include <svtools/miscopt.hxx> #define TEXT_STARTPOS 3 +#define TEXT_MULTI_STARTPOS 5 #define THESIZE 1000000 //!!! langt... :-) #define TBX_WINDOW_HEIGHT 22 // in Pixeln - fuer alle Systeme gleich? @@ -128,16 +130,29 @@ SfxChildWinInfo ScInputWindowWrapper::GetInfo() const //================================================================== #define IMAGE(id) pImgMgr->SeekImage(id) +bool lcl_isExperimentalMode() +{ + SvtMiscOptions aMiscOptions; + return aMiscOptions.IsExperimentalMode(); +} //================================================================== // class ScInputWindow //================================================================== +ScTextWndBase* lcl_chooseRuntimeImpl( Window* pParent ) +{ + if ( !lcl_isExperimentalMode() ) + return new ScTextWnd( pParent ); + return new ScInputBarGroup( pParent ); +} + ScInputWindow::ScInputWindow( Window* pParent, SfxBindings* pBind ) : // mit WB_CLIPCHILDREN, sonst Flicker ToolBox ( pParent, WinBits(WB_BORDER|WB_3DLOOK|WB_CLIPCHILDREN) ), aWndPos ( this ), - aTextWindow ( this ), + pRuntimeWindow ( lcl_chooseRuntimeImpl( this ) ), + aTextWindow ( *pRuntimeWindow ), pInputHdl ( NULL ), pBindings ( pBind ), aTextOk ( ScResId( SCSTR_QHELP_BTNOK ) ), // nicht immer neu aus Resource @@ -189,7 +204,7 @@ ScInputWindow::ScInputWindow( Window* pParent, SfxBindings* pBind ) : SetHelpId( HID_SC_INPUTWIN ); // fuer die ganze Eingabezeile aWndPos .Show(); - aTextWindow .Show(); + aTextWindow.Show(); pInputHdl = SC_MOD()->GetInputHdl( pViewSh, false ); // use own handler even if ref-handler is set if (pInputHdl) @@ -488,6 +503,12 @@ void ScInputWindow::Resize() Size aSize = aTextWindow.GetSizePixel(); aSize.Width() = Max( ((long)(nWidth - nLeft - 5)), (long)0 ); + if ( lcl_isExperimentalMode() ) + { + aSize.Height()= TBX_WINDOW_HEIGHT; + aTextWindow.SetSizePixel( aSize ); + aTextWindow.Resize(); + } aTextWindow.SetSizePixel( aSize ); aTextWindow.Invalidate(); } @@ -703,17 +724,141 @@ void ScInputWindow::DataChanged( const DataChangedEvent& rDCEvt ) } //======================================================================== +// ScInputBarGroup +//======================================================================== + +ScInputBarGroup::ScInputBarGroup(Window* pParent) + : ScTextWndBase ( pParent, WinBits(WB_HIDE) ), + aTextWindow ( this ), + bIsMultiLine ( false ) +{ + aTextWindow.Show(); + aTextWindow.SetQuickHelpText( ScResId( SCSTR_QHELP_INPUTWND ) ); + aTextWindow.SetHelpId ( HID_INSWIN_INPUT ); +} + +ScInputBarGroup::~ScInputBarGroup() +{ + +} + +void +ScInputBarGroup::InsertAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) +{ + aTextWindow.InsertAccessibleTextData( rTextData ); +} + +void +ScInputBarGroup::RemoveAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) +{ + aTextWindow.RemoveAccessibleTextData( rTextData ); +} + +const String& +ScInputBarGroup::GetTextString() const +{ + return aTextWindow.GetTextString(); +} + +void ScInputBarGroup::SetTextString( const String& rString ) +{ + aTextWindow.SetTextString(rString); +} + +void ScInputBarGroup::Resize() +{ + long nWidth = GetSizePixel().Width(); + long nLeft = aTextWindow.GetPosPixel().X(); + Size aSize = aTextWindow.GetSizePixel(); + + aSize.Width() = Max( ((long)(nWidth - nLeft - 40)), (long)0 ); + aSize.Height()=22; + aTextWindow.SetSizePixel( aSize ); + aTextWindow.Invalidate(); +} + +void ScInputBarGroup::GainFocus() +{ + aTextWindow.GrabFocus(); +} + + +void ScInputBarGroup::StopEditEngine( sal_Bool bAll ) +{ + aTextWindow.StopEditEngine( bAll ); +} + +void ScInputBarGroup::StartEditEngine() +{ + aTextWindow.StartEditEngine(); +} + +void ScInputBarGroup::MakeDialogEditView() +{ + aTextWindow.MakeDialogEditView(); +} + + +EditView* ScInputBarGroup::GetEditView() +{ + return aTextWindow.GetEditView(); +} + +sal_Bool ScInputBarGroup::IsInputActive() +{ + return aTextWindow.IsInputActive(); +} + +void ScInputBarGroup::SetFormulaMode(sal_Bool bSet) +{ + aTextWindow.SetFormulaMode(bSet); +} + +ScMultiTextWnd::ScMultiTextWnd( Window* pParen ) : ScTextWnd( pParen ) +{ + nTextStartPos = TEXT_MULTI_STARTPOS; +} + +void ScMultiTextWnd::Paint( const Rectangle& rRec ) +{ + // We always use edit engine to draw text at all times. + if (!pEditEngine) + InitEditEngine(SfxObjectShell::Current()); + + if (pEditView) + { + pEditView->Paint(rRec); + } +} + +void ScMultiTextWnd::Resize() +{ + 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 aPos2(aSize.Width()-5,(aSize.Height()-nDiff)*aSize.Height()/aSize.Height()); + pEditView->SetOutputArea( + PixelToLogic(Rectangle(aPos, aPos2))); + } +} + +//======================================================================== // Eingabefenster //======================================================================== ScTextWnd::ScTextWnd( Window* pParent ) - : Window ( pParent, WinBits(WB_HIDE | WB_BORDER) ), + : ScTextWndBase ( pParent, WinBits(WB_HIDE | WB_BORDER) ), DragSourceHelper( this ), pEditEngine ( NULL ), pEditView ( NULL ), bIsInsertMode( sal_True ), bFormulaMode ( false ), - bInputMode ( false ) + bInputMode ( false ), + nTextStartPos ( TEXT_STARTPOS ) { EnableRTL( false ); // EditEngine can't be used with VCL EnableRTL @@ -767,11 +912,11 @@ void ScTextWnd::Paint( const Rectangle& rRec ) - LogicToPixel( Size( 0, GetTextHeight() ) ).Height(); // if (nDiff<2) nDiff=2; // mind. 1 Pixel - long nStartPos = TEXT_STARTPOS; + long nStartPos = nTextStartPos; if ( bIsRTL ) { // right-align - nStartPos += GetOutputSizePixel().Width() - 2*TEXT_STARTPOS - + nStartPos += GetOutputSizePixel().Width() - 2*nTextStartPos - LogicToPixel( Size( GetTextWidth( aString ), 0 ) ).Width(); // LayoutMode isn't changed as long as ModifyRTLDefaults doesn't include SvxFrameDirectionItem @@ -789,10 +934,10 @@ void ScTextWnd::Resize() long nDiff = aSize.Height() - LogicToPixel( Size( 0, GetTextHeight() ) ).Height(); - aSize.Width() -= 2 * TEXT_STARTPOS - 1; + aSize.Width() -= 2 * nTextStartPos - 1; pEditView->SetOutputArea( - PixelToLogic( Rectangle( Point( TEXT_STARTPOS, (nDiff > 0) ? nDiff/2 : 1 ), + PixelToLogic( Rectangle( Point( nTextStartPos, (nDiff > 0) ? nDiff/2 : 1 ), aSize ) ) ); } } @@ -1013,6 +1158,117 @@ void lcl_ModifyRTLVisArea( EditView* pEditView ) 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 @@ -1206,7 +1462,7 @@ void ScTextWnd::SetTextString( const String& rNewString ) nDifPos = 0; // -1 wegen Rundung und "A" - Point aLogicStart = PixelToLogic(Point(TEXT_STARTPOS-1,0)); + Point aLogicStart = PixelToLogic(Point(nTextStartPos-1,0)); long nStartPos = aLogicStart.X(); long nInvPos = nStartPos; if (nDifPos) diff --git a/sc/source/ui/inc/inputwin.hxx b/sc/source/ui/inc/inputwin.hxx index f65437d942ff..60e3de3fd92a 100644 --- a/sc/source/ui/inc/inputwin.hxx +++ b/sc/source/ui/inc/inputwin.hxx @@ -47,32 +47,48 @@ class ScRangeList; //======================================================================== -class ScTextWnd : public Window, public DragSourceHelper // edit window +class ScTextWndBase : public Window +{ +public: + ScTextWndBase( Window* pParent, WinBits nStyle ) : Window ( pParent, nStyle ) {} + virtual void InsertAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) = 0; + virtual void RemoveAccessibleTextData( ScAccessibleEditLineTextData& rTextData ) = 0; + virtual void SetTextString( const String& rString ) = 0; + virtual const String& GetTextString() const = 0; + virtual void StartEditEngine() = 0; + virtual void StopEditEngine( sal_Bool bAll ) = 0; + virtual EditView* GetEditView() = 0; + virtual void MakeDialogEditView() = 0; + virtual void SetFormulaMode( sal_Bool bSet ) = 0; + virtual sal_Bool IsInputActive() = 0; +}; + +class ScTextWnd : public ScTextWndBase, public DragSourceHelper // edit window { public: ScTextWnd( Window* pParent ); virtual ~ScTextWnd(); - void SetTextString( const String& rString ); - const String& GetTextString() const; + virtual void SetTextString( const String& rString ); + virtual const String& GetTextString() const; sal_Bool IsInputActive(); - EditView* GetEditView(); + virtual EditView* GetEditView(); // fuer FunktionsAutopiloten - void MakeDialogEditView(); + virtual void MakeDialogEditView(); - void StartEditEngine(); - void StopEditEngine( sal_Bool bAll ); + virtual void StartEditEngine(); + virtual void StopEditEngine( sal_Bool bAll ); virtual void DataChanged( const DataChangedEvent& rDCEvt ); - void SetFormulaMode( sal_Bool bSet ); + virtual void SetFormulaMode( sal_Bool bSet ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible(); - void InsertAccessibleTextData( ScAccessibleEditLineTextData& rTextData ); - void RemoveAccessibleTextData( ScAccessibleEditLineTextData& rTextData ); + virtual void InsertAccessibleTextData( ScAccessibleEditLineTextData& rTextData ); + virtual void RemoveAccessibleTextData( ScAccessibleEditLineTextData& rTextData ); DECL_LINK( NotifyHdl, EENotify* ); @@ -92,11 +108,9 @@ protected: virtual String GetText() const; -private: void ImplInitSettings(); void UpdateAutoCorrFlag(); -private: typedef ::std::vector< ScAccessibleEditLineTextData* > AccTextDataVector; String aString; @@ -111,6 +125,7 @@ private: // #102710#; this flag should be true if a key input or a command is handled // it prevents the call of InputChanged in the ModifyHandler of the EditEngine sal_Bool bInputMode; + sal_Int16 nTextStartPos; }; //======================================================================== @@ -150,6 +165,50 @@ private: //======================================================================== +class ScMultiTextWnd : public ScTextWnd +{ +public: + ScMultiTextWnd( Window* pParent ); + virtual void StartEditEngine(); + virtual void StopEditEngine( sal_Bool bAll ); +protected: + void InitEditEngine(SfxObjectShell* pObjSh); + + virtual void Paint( const Rectangle& rRec ); + virtual void Resize(); +}; + +class ScInputBarGroup : public ScTextWndBase +{ + +public: + ScInputBarGroup( Window* Parent ); + virtual ~ScInputBarGroup(); + virtual void InsertAccessibleTextData( ScAccessibleEditLineTextData& rTextData ); + virtual void RemoveAccessibleTextData( ScAccessibleEditLineTextData& rTextData ); +// virtual void Paint(const Rectangle& rRec ); + void SetTextString( const String& rString ); + void StartEditEngine(); + EditView* GetEditView(); + void SetSize(Size aSize); + virtual void Resize(); + virtual const String& GetTextString() const; + virtual void StopEditEngine( sal_Bool bAll ); + void InitEditEngine(SfxObjectShell* pObjSh); + void GainFocus(); + void SetFormulaMode( sal_Bool bSet ); + bool IsFocus(); + void MakeDialogEditView(); + sal_Bool IsInputActive(); + +private: + + ScMultiTextWnd aTextWindow; + bool bIsMultiLine; + +}; + + class ScInputWindow : public ToolBox // Parent-Toolbox { public: @@ -169,7 +228,7 @@ public: void SetFormulaMode( sal_Bool bSet ); - sal_Bool IsInputActive(); + virtual sal_Bool IsInputActive(); EditView* GetEditView(); void TextGrabFocus(); @@ -199,7 +258,8 @@ protected: private: ScPosWnd aWndPos; - ScTextWnd aTextWindow; + std::auto_ptr<ScTextWndBase> pRuntimeWindow; + ScTextWndBase& aTextWindow; ScInputHandler* pInputHdl; SfxBindings* pBindings; String aTextOk; |