diff options
author | Kohei Yoshida <kohei.yoshida@suse.com> | 2011-12-13 00:08:41 -0500 |
---|---|---|
committer | Noel Power <noel.power@novell.com> | 2011-12-13 13:06:10 +0000 |
commit | 4b6e0d42d72f8d2f5a18a0e0af595d884d96f552 (patch) | |
tree | 4acde684c172f626dc097666d95be6e272333e66 /sc | |
parent | 43c7830b03d141ae11d8617c0fdabefa32dd243c (diff) |
Pass the correct ScTabViewShell instance to the input box.
This eliminates the need to store the assigned doc pointer to cross-check
against whenever the edit engine is initialized. It's cleaner this way
& fdo#43614 still remains fixed.
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/ui/app/inputwin.cxx | 69 | ||||
-rw-r--r-- | sc/source/ui/inc/inputwin.hxx | 15 |
2 files changed, 43 insertions, 41 deletions
diff --git a/sc/source/ui/app/inputwin.cxx b/sc/source/ui/app/inputwin.cxx index 649050b4eaa5..5843cda72755 100644 --- a/sc/source/ui/app/inputwin.cxx +++ b/sc/source/ui/app/inputwin.cxx @@ -159,18 +159,27 @@ bool lcl_isExperimentalMode() // class ScInputWindow //================================================================== -ScTextWndBase* lcl_chooseRuntimeImpl( Window* pParent ) +ScTextWndBase* lcl_chooseRuntimeImpl( Window* pParent, SfxBindings* pBind ) { + ScTabViewShell* pViewSh = NULL; + SfxDispatcher* pDisp = pBind->GetDispatcher(); + if ( pDisp ) + { + SfxViewFrame* pViewFrm = pDisp->GetFrame(); + if ( pViewFrm ) + pViewSh = PTR_CAST( ScTabViewShell, pViewFrm->GetViewShell() ); + } + if ( !lcl_isExperimentalMode() ) - return new ScTextWnd( pParent ); - return new ScInputBarGroup( pParent ); + return new ScTextWnd( pParent, pViewSh ); + return new ScInputBarGroup( pParent, pViewSh ); } ScInputWindow::ScInputWindow( Window* pParent, SfxBindings* pBind ) : // mit WB_CLIPCHILDREN, sonst Flicker ToolBox ( pParent, WinBits(WB_BORDER|WB_3DLOOK|WB_CLIPCHILDREN) ), aWndPos ( this ), - pRuntimeWindow ( lcl_chooseRuntimeImpl( this ) ), + pRuntimeWindow ( lcl_chooseRuntimeImpl( this, pBind ) ), aTextWindow ( *pRuntimeWindow ), pInputHdl ( NULL ), pBindings ( pBind ), @@ -848,9 +857,9 @@ void ScInputWindow::MouseButtonUp( const MouseEvent& rMEvt ) // ScInputBarGroup //======================================================================== -ScInputBarGroup::ScInputBarGroup(Window* pParent) +ScInputBarGroup::ScInputBarGroup(Window* pParent, ScTabViewShell* pViewSh) : ScTextWndBase ( pParent, WinBits(WB_HIDE | WB_TABSTOP ) ), - aMultiTextWnd ( this ), + aMultiTextWnd ( this, pViewSh ), aButton ( this, WB_TABSTOP | WB_RECTSTYLE ), aScrollBar ( this, WB_TABSTOP | WB_VERT | WB_DRAG ) { @@ -1094,11 +1103,10 @@ IMPL_LINK( ScInputBarGroup, Impl_ScrollHdl, ScrollBar*, EMPTYARG ) // ScMultiTextWnd //======================================================================== -ScMultiTextWnd::ScMultiTextWnd( ScInputBarGroup* pParen ) +ScMultiTextWnd::ScMultiTextWnd( ScInputBarGroup* pParen, ScTabViewShell* pViewSh ) : - ScTextWnd( pParen/*, WB_TABSTOP*/ ), + ScTextWnd( pParen, pViewSh ), mrGroupBar(* pParen ), - mpAssignedDocument( NULL ), mnLines( 1 ), mnLastExpandedLines( INPUTWIN_MULTILINES ) { @@ -1119,7 +1127,7 @@ void ScMultiTextWnd::Paint( const Rectangle& rRec ) EditView* ScMultiTextWnd::GetEditView() { if ( !pEditView ) - InitEditEngine( SfxObjectShell::Current() ); + InitEditEngine(); return pEditView; } @@ -1226,7 +1234,7 @@ void ScMultiTextWnd::StartEditEngine() if ( !pEditView || !pEditEngine ) { - InitEditEngine(pObjSh); + InitEditEngine(); } SC_MOD()->SetInputMode( SC_INPUT_TOP ); @@ -1281,31 +1289,15 @@ void lcl_ModifyRTLVisArea( EditView* pEditView ) } -void ScMultiTextWnd::InitEditEngine(SfxObjectShell* pObjSh) +void ScMultiTextWnd::InitEditEngine() { ScFieldEditEngine* pNew; - ScTabViewShell* pViewSh = ScTabViewShell::GetActiveViewShell(); + ScTabViewShell* pViewSh = GetViewShell(); + ScDocShell* pDocSh = NULL; if ( pViewSh ) { + pDocSh = pViewSh->GetViewData()->GetDocShell(); const ScDocument* pDoc = pViewSh->GetViewData()->GetDocument(); - - // fdo#43614 If called from Paint() because pEditEngine==0 it may be - // that StopEditEngine() was previously called when opening another - // document or switching documents, the Paint() wants to paint the - // previous document, but GetActiveViewShell() already returns the - // shell of the new document. In that case we'd create an EditEngine - // with the wrong item pool that later crashes when the corresponding - // document was closed and may lead to other sorts of trouble. - - if (mpAssignedDocument) - { - if (mpAssignedDocument != pDoc) - return; // Bail out, don't create and remember an - // EditEngine without document pools for this case. - } - else - mpAssignedDocument = pDoc; // stick with this document - pNew = new ScFieldEditEngine( pDoc->GetEnginePool(), pDoc->GetEditPool() ); } else @@ -1371,10 +1363,9 @@ void ScMultiTextWnd::InitEditEngine(SfxObjectShell* pObjSh) // 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) ) + if (pDocSh) { - ScDocument* pDoc = ((ScDocShell*)pObjSh)->GetDocument(); // any document + ScDocument* pDoc = pDocSh->GetDocument(); // any document sal_uInt8 nScript = pDoc->GetStringScriptType( aString ); if ( nScript & SCRIPTTYPE_COMPLEX ) Invalidate(); @@ -1405,7 +1396,7 @@ void ScMultiTextWnd::SetTextString( const String& rNewString ) // ScTextWnd //======================================================================== -ScTextWnd::ScTextWnd( Window* pParent ) +ScTextWnd::ScTextWnd( Window* pParent, ScTabViewShell* pViewSh ) : ScTextWndBase ( pParent, WinBits(WB_HIDE | WB_BORDER) ), DragSourceHelper( this ), pEditEngine ( NULL ), @@ -1413,7 +1404,8 @@ ScTextWnd::ScTextWnd( Window* pParent ) bIsInsertMode( sal_True ), bFormulaMode ( false ), bInputMode ( false ), - nTextStartPos ( TEXT_STARTPOS ) + nTextStartPos ( TEXT_STARTPOS ), + mpViewShell(pViewSh) { EnableRTL( false ); // EditEngine can't be used with VCL EnableRTL @@ -1669,6 +1661,11 @@ void ScTextWnd::UpdateAutoCorrFlag() } } +ScTabViewShell* ScTextWnd::GetViewShell() +{ + return mpViewShell; +} + 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 9f70ecb597fd..1e896e7c0740 100644 --- a/sc/source/ui/inc/inputwin.hxx +++ b/sc/source/ui/inc/inputwin.hxx @@ -47,6 +47,7 @@ class ScAccessibleEditLineTextData; struct EENotify; class ScRangeList; class ScDocument; +class ScTabViewShell; //======================================================================== @@ -69,7 +70,7 @@ public: class ScTextWnd : public ScTextWndBase, public DragSourceHelper // edit window { public: - ScTextWnd( Window* pParent ); + ScTextWnd( Window* pParent, ScTabViewShell* pViewSh ); virtual ~ScTextWnd(); virtual void SetTextString( const String& rString ); @@ -114,6 +115,8 @@ protected: void ImplInitSettings(); void UpdateAutoCorrFlag(); + ScTabViewShell* GetViewShell(); + typedef ::std::vector< ScAccessibleEditLineTextData* > AccTextDataVector; String aString; @@ -129,6 +132,9 @@ protected: // it prevents the call of InputChanged in the ModifyHandler of the EditEngine sal_Bool bInputMode; sal_Int16 nTextStartPos; + +private: + ScTabViewShell* mpViewShell; }; //======================================================================== @@ -172,7 +178,7 @@ class ScInputBarGroup; class ScMultiTextWnd : public ScTextWnd { public: - ScMultiTextWnd( ScInputBarGroup* pParent ); + ScMultiTextWnd( ScInputBarGroup* pParent, ScTabViewShell* pViewSh ); virtual ~ScMultiTextWnd(); virtual void StartEditEngine(); virtual void StopEditEngine( sal_Bool bAll ); @@ -188,7 +194,7 @@ public: long GetLastNumExpandedLines() { return mnLastExpandedLines; } protected: void SetScrollBarRange(); - void InitEditEngine(SfxObjectShell* pObjSh); + void InitEditEngine(); virtual void Paint( const Rectangle& rRec ); DECL_LINK( NotifyHdl, EENotify* ); @@ -196,7 +202,6 @@ protected: private: long GetPixelTextHeight(); ScInputBarGroup& mrGroupBar; - const ScDocument* mpAssignedDocument; long mnLines; long mnLastExpandedLines; }; @@ -205,7 +210,7 @@ class ScInputBarGroup : public ScTextWndBase { public: - ScInputBarGroup( Window* Parent ); + ScInputBarGroup( Window* Parent, ScTabViewShell* pViewSh ); virtual ~ScInputBarGroup(); virtual void InsertAccessibleTextData( ScAccessibleEditLineTextData& rTextData ); virtual void RemoveAccessibleTextData( ScAccessibleEditLineTextData& rTextData ); |