sc/inc/cellvalue.hxx | 2 + sc/source/core/data/cellvalue.cxx | 43 +++++++++++++-------- sc/source/ui/inc/undocell.hxx | 17 +++----- sc/source/ui/undo/undocell.cxx | 76 ++++++-------------------------------- sc/source/ui/view/viewfun4.cxx | 69 +++++++++++++--------------------- 5 files changed, 76 insertions(+), 131 deletions(-)
New commits: commit c177e1cbec9da5c33b57b55493bbeae198051b6f Author: Kohei Yoshida <[email protected]> Date: Thu Feb 27 23:22:21 2014 -0500 Simplify ScViewFunc::DoThesaurus() with ScCellValue. Change-Id: Ic5d31107aa7653cd8e3fae096888bd633696074f diff --git a/sc/inc/cellvalue.hxx b/sc/inc/cellvalue.hxx index dd07d1c..08cd8ce 100644 --- a/sc/inc/cellvalue.hxx +++ b/sc/inc/cellvalue.hxx @@ -77,6 +77,8 @@ struct SC_DLLPUBLIC ScCellValue void release( ScColumn& rColumn, SCROW nRow ); + OUString getString( const ScDocument* pDoc ); + bool isEmpty() const; bool equalsWithoutFormat( const ScCellValue& r ) const; diff --git a/sc/source/core/data/cellvalue.cxx b/sc/source/core/data/cellvalue.cxx index 0a9d53d..3155f98 100644 --- a/sc/source/core/data/cellvalue.cxx +++ b/sc/source/core/data/cellvalue.cxx @@ -154,6 +154,27 @@ bool hasNumericImpl( CellType eType, ScFormulaCell* pFormula ) } } +template<typename _CellT> +OUString getStringImpl( const _CellT& rCell, const ScDocument* pDoc ) +{ + switch (rCell.meType) + { + case CELLTYPE_VALUE: + return OUString::number(rCell.mfValue); + case CELLTYPE_STRING: + return rCell.mpString->getString(); + case CELLTYPE_EDIT: + if (rCell.mpEditText) + return ScEditUtil::GetString(*rCell.mpEditText, pDoc); + break; + case CELLTYPE_FORMULA: + return rCell.mpFormula->GetString().getString(); + default: + ; + } + return EMPTY_OUSTRING; +} + } ScCellValue::ScCellValue() : meType(CELLTYPE_NONE), mfValue(0.0) {} @@ -442,6 +463,11 @@ void ScCellValue::release( ScColumn& rColumn, SCROW nRow ) mfValue = 0.0; } +OUString ScCellValue::getString( const ScDocument* pDoc ) +{ + return getStringImpl(*this, pDoc); +} + bool ScCellValue::isEmpty() const { return meType == CELLTYPE_NONE; @@ -553,22 +579,7 @@ double ScRefCellValue::getValue() OUString ScRefCellValue::getString( const ScDocument* pDoc ) { - switch (meType) - { - case CELLTYPE_VALUE: - return OUString::number(mfValue); - case CELLTYPE_STRING: - return mpString->getString(); - case CELLTYPE_EDIT: - if (mpEditText) - return ScEditUtil::GetString(*mpEditText, pDoc); - break; - case CELLTYPE_FORMULA: - return mpFormula->GetString().getString(); - default: - ; - } - return EMPTY_OUSTRING; + return getStringImpl(*this, pDoc); } bool ScRefCellValue::isEmpty() const diff --git a/sc/source/ui/inc/undocell.hxx b/sc/source/ui/inc/undocell.hxx index 3562983..6bda9c7 100644 --- a/sc/source/ui/inc/undocell.hxx +++ b/sc/source/ui/inc/undocell.hxx @@ -229,10 +229,9 @@ class ScUndoThesaurus: public ScSimpleUndo { public: TYPEINFO(); - ScUndoThesaurus( ScDocShell* pNewDocShell, - SCCOL nNewCol, SCROW nNewRow, SCTAB nNewTab, - const OUString& rNewUndoStr, const EditTextObject* pUndoTObj, - const OUString& rNewRedoStr, const EditTextObject* pRedoTObj); + ScUndoThesaurus( ScDocShell* pNewDocShell, + SCCOL nNewCol, SCROW nNewRow, SCTAB nNewTab, + const ScCellValue& rOldText, const ScCellValue& rNewText ); virtual ~ScUndoThesaurus(); virtual void Undo(); @@ -246,14 +245,12 @@ private: SCCOL nCol; SCROW nRow; SCTAB nTab; - OUString aUndoStr; // Data at String cell - EditTextObject* pUndoTObject; // at Edit cell - OUString aRedoStr; - EditTextObject* pRedoTObject; sal_uLong nEndChangeAction; - void DoChange( bool bUndo, const OUString& rStr, - const EditTextObject* pTObj ); + ScCellValue maOldText; + ScCellValue maNewText; + + void DoChange( bool bUndo, const ScCellValue& rText ); void SetChangeTrack( const ScCellValue& rOldCell ); }; diff --git a/sc/source/ui/undo/undocell.cxx b/sc/source/ui/undo/undocell.cxx index 7a6f4e1..60f6594 100644 --- a/sc/source/ui/undo/undocell.cxx +++ b/sc/source/ui/undo/undocell.cxx @@ -646,39 +646,20 @@ bool ScUndoPrintZoom::CanRepeat(SfxRepeatTarget& rTarget) const return rTarget.ISA(ScTabViewTarget); } -ScUndoThesaurus::ScUndoThesaurus( ScDocShell* pNewDocShell, - SCCOL nNewCol, SCROW nNewRow, SCTAB nNewTab, - const OUString& rNewUndoStr, const EditTextObject* pUndoTObj, - const OUString& rNewRedoStr, const EditTextObject* pRedoTObj) : +ScUndoThesaurus::ScUndoThesaurus( + ScDocShell* pNewDocShell, SCCOL nNewCol, SCROW nNewRow, SCTAB nNewTab, + const ScCellValue& rOldText, const ScCellValue& rNewText ) : ScSimpleUndo( pNewDocShell ), nCol( nNewCol ), nRow( nNewRow ), nTab( nNewTab ), - aUndoStr( rNewUndoStr ), - aRedoStr( rNewRedoStr ) + maOldText(rOldText), + maNewText(rNewText) { - pUndoTObject = (pUndoTObj) ? pUndoTObj->Clone() : NULL; - pRedoTObject = (pRedoTObj) ? pRedoTObj->Clone() : NULL; - - ScCellValue aOldCell; - if ( pUndoTObject ) - { - aOldCell.meType = CELLTYPE_EDIT; - aOldCell.mpEditText = pUndoTObject->Clone(); - } - else - { - aOldCell.meType = CELLTYPE_STRING; - aOldCell.mpString = new svl::SharedString(pDocShell->GetDocument()->GetSharedStringPool().intern(aUndoStr)); - } - SetChangeTrack(aOldCell); + SetChangeTrack(maOldText); } -ScUndoThesaurus::~ScUndoThesaurus() -{ - delete pUndoTObject; - delete pRedoTObject; -} +ScUndoThesaurus::~ScUndoThesaurus() {} OUString ScUndoThesaurus::GetComment() const { @@ -699,8 +680,7 @@ void ScUndoThesaurus::SetChangeTrack( const ScCellValue& rOldCell ) nEndChangeAction = 0; } -void ScUndoThesaurus::DoChange( bool bUndo, const OUString& rStr, - const EditTextObject* pTObj ) +void ScUndoThesaurus::DoChange( bool bUndo, const ScCellValue& rText ) { ScDocument* pDoc = pDocShell->GetDocument(); @@ -712,39 +692,9 @@ void ScUndoThesaurus::DoChange( bool bUndo, const OUString& rStr, } ScAddress aPos(nCol, nRow, nTab); - - if (pTObj) - { - // This is edit text. - if (pDoc->GetCellType(aPos) == CELLTYPE_EDIT) - { - ScCellValue aOldCell; - if (!bUndo) - aOldCell.assign(*pDoc, aPos); - - // A copy of pTObj will be stored in the cell. - pDoc->SetEditText(aPos, *pTObj, pDoc->GetEditPool()); - - if ( !bUndo ) - SetChangeTrack(aOldCell); - } - else - { - OSL_FAIL("Not CELLTYPE_EDIT for Un/RedoThesaurus"); - } - } - else - { - // This is simple unformatted string. - ScCellValue aOldCell; - if (!bUndo) - aOldCell.assign(*pDoc, aPos); - - pDoc->SetString( nCol, nRow, nTab, rStr ); - - if (!bUndo) - SetChangeTrack(aOldCell); - } + rText.commit(*pDoc, aPos); + if (!bUndo) + SetChangeTrack(maOldText); pDocShell->PostPaintCell( nCol, nRow, nTab ); } @@ -752,7 +702,7 @@ void ScUndoThesaurus::DoChange( bool bUndo, const OUString& rStr, void ScUndoThesaurus::Undo() { BeginUndo(); - DoChange( true, aUndoStr, pUndoTObject ); + DoChange(true, maOldText); ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack(); if ( pChangeTrack ) pChangeTrack->Undo( nEndChangeAction, nEndChangeAction ); @@ -762,7 +712,7 @@ void ScUndoThesaurus::Undo() void ScUndoThesaurus::Redo() { BeginRedo(); - DoChange( false, aRedoStr, pRedoTObject ); + DoChange(false, maNewText); EndRedo(); } diff --git a/sc/source/ui/view/viewfun4.cxx b/sc/source/ui/view/viewfun4.cxx index 5261609..352ed4f 100644 --- a/sc/source/ui/view/viewfun4.cxx +++ b/sc/source/ui/view/viewfun4.cxx @@ -38,6 +38,7 @@ #include <svl/stritem.hxx> #include <svtools/transfer.hxx> #include <svl/urlbmk.hxx> +#include <svl/sharedstringpool.hxx> #include <vcl/msgbox.hxx> #include <avmedia/mediawindow.hxx> @@ -311,12 +312,9 @@ void ScViewFunc::DoThesaurus( bool bRecord ) ScMarkData& rMark = GetViewData()->GetMarkData(); ScSplitPos eWhich = GetViewData()->GetActivePart(); EESpellState eState; - OUString sOldText, sNewString; - EditTextObject* pOldTObj = NULL; - const EditTextObject* pTObject = NULL; EditView* pEditView = NULL; boost::scoped_ptr<ESelection> pEditSel; - ScEditEngineDefaulter* pThesaurusEngine; + boost::scoped_ptr<ScEditEngineDefaulter> pThesaurusEngine; bool bIsEditMode = GetViewData()->HasEditView(eWhich); if (bRecord && !pDoc->IsUndoEnabled()) bRecord = false; @@ -342,8 +340,9 @@ void ScViewFunc::DoThesaurus( bool bRecord ) return; } - CellType eCellType = pDoc->GetCellType(aPos); - if (eCellType != CELLTYPE_STRING && eCellType != CELLTYPE_EDIT) + ScCellValue aOldText; + aOldText.assign(*pDoc, aPos); + if (aOldText.meType != CELLTYPE_STRING && aOldText.meType != CELLTYPE_EDIT) { ErrorMessage(STR_THESAURUS_NO_STRING); return; @@ -351,38 +350,26 @@ void ScViewFunc::DoThesaurus( bool bRecord ) uno::Reference<linguistic2::XSpellChecker1> xSpeller = LinguMgr::GetSpellChecker(); - pThesaurusEngine = new ScEditEngineDefaulter( pDoc->GetEnginePool() ); + pThesaurusEngine.reset(new ScEditEngineDefaulter(pDoc->GetEnginePool())); pThesaurusEngine->SetEditTextObjectPool( pDoc->GetEditPool() ); pThesaurusEngine->SetRefDevice(GetViewData()->GetActiveWin()); pThesaurusEngine->SetSpeller(xSpeller); - MakeEditView(pThesaurusEngine, nCol, nRow ); + MakeEditView(pThesaurusEngine.get(), nCol, nRow ); const ScPatternAttr* pPattern = NULL; - SfxItemSet* pEditDefaults = new SfxItemSet(pThesaurusEngine->GetEmptyItemSet()); + boost::scoped_ptr<SfxItemSet> pEditDefaults( + new SfxItemSet(pThesaurusEngine->GetEmptyItemSet())); pPattern = pDoc->GetPattern(nCol, nRow, nTab); if (pPattern) { - pPattern->FillEditItemSet( pEditDefaults ); + pPattern->FillEditItemSet( pEditDefaults.get() ); pThesaurusEngine->SetDefaults( *pEditDefaults ); } - if (eCellType == CELLTYPE_STRING) - { - sOldText = pDoc->GetString(aPos); - pThesaurusEngine->SetText(sOldText); - } - else if (eCellType == CELLTYPE_EDIT) - { - pTObject = pDoc->GetEditText(aPos); - if (pTObject) - { - pOldTObj = pTObject->Clone(); - pThesaurusEngine->SetText(*pTObject); - } - } + if (aOldText.meType == CELLTYPE_EDIT) + pThesaurusEngine->SetText(*aOldText.mpEditText); else - { - OSL_FAIL("DoThesaurus: Keine String oder Editzelle"); - } + pThesaurusEngine->SetText(aOldText.getString(pDoc)); + pEditView = GetViewData()->GetEditView(GetViewData()->GetActivePart()); if (pEditSel) pEditView->SetSelection(*pEditSel); @@ -407,34 +394,32 @@ void ScViewFunc::DoThesaurus( bool bRecord ) } if (pThesaurusEngine->IsModified()) { - EditTextObject* pNewTObj = NULL; - if (pTObject) + ScCellValue aNewText; + + if (aOldText.meType == CELLTYPE_EDIT) { // The cell will own the text object instance. - pDoc->SetEditText( - ScAddress(nCol,nRow,nTab), pThesaurusEngine->CreateTextObject()); + EditTextObject* pText = pThesaurusEngine->CreateTextObject(); + pDoc->SetEditText(ScAddress(nCol,nRow,nTab), pText); + aNewText.set(*pText); } else { - sNewString = pThesaurusEngine->GetText(); - pDoc->SetString(nCol, nRow, nTab, sNewString); + OUString aStr = pThesaurusEngine->GetText(); + aNewText.set(pDoc->GetSharedStringPool().intern(aStr)); + pDoc->SetString(nCol, nRow, nTab, aStr); } -// erack! it's broadcasted -// pDoc->SetDirty(); + pDocSh->SetDocumentModified(); if (bRecord) { GetViewData()->GetDocShell()->GetUndoManager()->AddUndoAction( - new ScUndoThesaurus( GetViewData()->GetDocShell(), - nCol, nRow, nTab, - sOldText, pOldTObj, sNewString, pNewTObj)); + new ScUndoThesaurus( + GetViewData()->GetDocShell(), nCol, nRow, nTab, aOldText, aNewText)); } - delete pNewTObj; } + KillEditView(true); - delete pEditDefaults; - delete pThesaurusEngine; - delete pOldTObj; pDocSh->PostPaintGridAll(); } _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
