sc/inc/sc.hrc | 5 + sc/source/ui/inc/viewfunc.hxx | 3 - sc/source/ui/src/units.src | 5 + sc/source/ui/view/viewfunc.cxx | 114 +++++++++++++++++++++++++++++++++-------- 4 files changed, 104 insertions(+), 23 deletions(-)
New commits: commit 54fc383bee9fe07388a9f9d5b6ae13a1e0e9eca0 Author: Andrzej Hunt <andr...@ahunt.org> Date: Fri Aug 7 08:25:48 2015 +0100 Implement undoing conversion of individual locally annotated cells Change-Id: I16b62f1105f7839b047a96fdab0e3e6089d400ee diff --git a/sc/inc/sc.hrc b/sc/inc/sc.hrc index 42a0561..fe78cd8 100644 --- a/sc/inc/sc.hrc +++ b/sc/inc/sc.hrc @@ -1005,7 +1005,10 @@ #define STR_UNITS_CONVERSION_RECOMMENDED (STR_START + 455) #define BT_UNITS_CONVERT_THIS_CELL (STR_START + 456) #define BT_UNITS_CONV_ALL (STR_START + 457) -#define STR_END (BT_UNITS_CONV_ALL) + +#define STR_UNDO_UNITSCONVERSION (STR_START + 458) + +#define STR_END (STR_UNDO_UNITSCONVERSION) #define BMP_START (STR_END) diff --git a/sc/source/ui/src/units.src b/sc/source/ui/src/units.src index d666923..bc9a315 100644 --- a/sc/source/ui/src/units.src +++ b/sc/source/ui/src/units.src @@ -55,4 +55,9 @@ PushButton BT_UNITS_CONV_ALL Text [ en-US ] = "Convert (automatically for all cells needing $2)" ; }; +String STR_UNDO_UNITSCONVERSION +{ + Text [ en-US ] = "Units conversion"; +}; + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx index 063a3a8..a6f66e7 100644 --- a/sc/source/ui/view/viewfunc.cxx +++ b/sc/source/ui/view/viewfunc.cxx @@ -2976,8 +2976,7 @@ void ScViewFunc::NotifyUnitConversionRecommended( const ScAddress& rCellAddress, rCellAddress, pDoc, rsHeaderUnit, - rsCellUnit, - pDocSh ); + rsCellUnit ); pButtonConvertCell->SetClickHdl( LINK( this, ScViewFunc, UnitConversionRecommendedHandler ) ); OUString sConvertText = pButtonConvertCell->GetText(); @@ -2994,32 +2993,108 @@ IMPL_LINK( ScViewFunc, UnitConversionRecommendedHandler, UnitConversionPushButto #ifdef ENABLE_CALC_UNITVERIFICATION boost::shared_ptr< Units > pUnits = Units::GetUnits(); - ScDocShell* pDocShell = static_cast<ScDocShell*>(pButton->mpDoc->GetDocumentShell()); + ScDocument* pDoc = pButton->mpDoc; + ScDocShell* pDocShell = static_cast<ScDocShell*>(pDoc->GetDocumentShell()); ScDocShellModificator aModificator( *pDocShell ); + bool bUndo = pDoc->IsUndoEnabled(); + ScCellValue aOldVal; + ScDocument* pUndoDoc; + ScMarkData aMark; - OUString sOriginalValue = pButton->mpDoc->GetString( pButton->aCellAddress ); + svl::IUndoManager* pUndoManager; + ScDrawLayer* pDrawLayer; + + if ( bUndo ) + { + pUndoManager = pDocShell->GetUndoManager(); + + aOldVal.assign( *pDoc, pButton->aCellAddress ); + + aMark.SetMarkArea( pButton->aCellAddress ); + pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); + pUndoDoc->InitUndo( pDoc, pButton->aCellAddress.Tab(), pButton->aCellAddress.Tab() ); + pDoc->CopyToDocument( ScRange( pButton->aCellAddress ), IDF_ATTRIB, false, pUndoDoc, &aMark ); + + // This commences logging of changes to the drawing layer + // (i.e. notes) for storing in an undo. (See more below.) + pDrawLayer = pDoc->GetDrawLayer(); + pDrawLayer->BeginCalcUndo(false); + } + + OUString sOriginalValue = pDoc->GetString( pButton->aCellAddress ); pUnits->convertCellToHeaderUnit( pButton->aCellAddress, - pButton->mpDoc, + pDoc, pButton->sHeaderUnit, pButton->sCellUnit ); - ScPostIt* pNote = pButton->mpDoc->GetOrCreateNote( pButton->aCellAddress ); - OUString sCurrentNote = pNote->GetText(); - - OUString sConversionNote("Original input: " + sOriginalValue); + const OUString sCurrentNoteText = pDoc->GetOrCreateNote( pButton->aCellAddress )->GetText(); + const OUString sConversionNote("Original input: " + sOriginalValue); + OUString sNewNoteText; - if (sCurrentNote.isEmpty()) + if (sCurrentNoteText.isEmpty()) { - pNote->SetText( pButton->aCellAddress, sConversionNote ); + sNewNoteText = sConversionNote; } else { - pNote->SetText( pButton->aCellAddress, sCurrentNote + "\n\n" + sConversionNote ); + sNewNoteText = sCurrentNoteText + "\n\n" + sConversionNote; } + // ensure existing caption object before draw undo tracking starts + ScPostIt* pOldNote = pDoc->ReleaseNote( pButton->aCellAddress ); + ScNoteData aOldNoteData = pOldNote->GetNoteData(); + delete pOldNote; + + ScPostIt* pNewNote = ScNoteUtil::CreateNoteFromString( *pDoc, pButton->aCellAddress, sNewNoteText, false, true ); + assert( pNewNote ); + + if ( bUndo ) + { + const OUString aUndo( ScResId( STR_UNDO_UNITSCONVERSION ) ); + pUndoManager->EnterListAction( aUndo, aUndo ); + + ScCellValue aNewVal; + aNewVal.assign( *pDoc, pButton->aCellAddress ); + const ScPatternAttr* pNewPat = pDoc->GetPattern( pButton->aCellAddress ); + + pUndoManager->AddUndoAction( new ScUndoSetCell( pDocShell, pButton->aCellAddress, aOldVal, aNewVal ) ); + pUndoManager->AddUndoAction( new ScUndoSelectionAttr( pDocShell, + aMark, + pButton->aCellAddress.Col(), pButton->aCellAddress.Row(), pButton->aCellAddress.Tab(), + pButton->aCellAddress.Col(), pButton->aCellAddress.Row(), pButton->aCellAddress.Tab(), + pUndoDoc, + false, + pNewPat) ); + ScNoteData aNewNoteData = pNewNote->GetNoteData(); + + // We specifically need to differentiate between a completely new + // note, or editing an existing note. ScUndoReplaceNote has two + // different constructors for each case. + if ( sCurrentNoteText.isEmpty() ) + { + pUndoManager->AddUndoAction( new ScUndoReplaceNote( *pDocShell, pButton->aCellAddress, + aNewNoteData, true, nullptr ) ); + } + else + { + // Actual note content changes are stored in the DrawLayer CalcUndo, + // as opposed to being the NoteData (which just seems to store note + // metadata) - hence we need to make sure that we save that too. + pUndoManager->AddUndoAction( new ScUndoReplaceNote( *pDocShell, pButton->aCellAddress, + aOldNoteData, aNewNoteData, + pDrawLayer->GetCalcUndo() ) ); + } + pUndoManager->LeaveListAction(); + } + + pDocShell->PostPaint(ScRange( pButton->aCellAddress), PAINT_GRID); + aModificator.SetDocumentModified(); + SfxGetpApp()->Broadcast(SfxSimpleHint(SC_HINT_AREAS_CHANGED)); + + #endif OUString sAddress; commit cbf554b8241a7e4fe033ef67ef9ee2a9e30f7cea Author: Andrzej Hunt <andr...@ahunt.org> Date: Thu Aug 6 09:20:40 2015 +0100 Remove redundant parameters. Change-Id: I0230fdd69d4f60058ca4f0258c5098f77099a3e4 diff --git a/sc/source/ui/inc/viewfunc.hxx b/sc/source/ui/inc/viewfunc.hxx index 5574fcf..c952c5a 100644 --- a/sc/source/ui/inc/viewfunc.hxx +++ b/sc/source/ui/inc/viewfunc.hxx @@ -386,8 +386,7 @@ private: ScDocument* pDoc, const OUString& sHeaderUnit, const ScAddress& rHeaderAddress, - const OUString& sCellUnit, - ScDocShell* pDocSh ); + const OUString& sCellUnit ); DECL_LINK( UnitConversionRecommendedHandler, UnitConversionPushButton* ); }; diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx index 7220246..063a3a8 100644 --- a/sc/source/ui/view/viewfunc.cxx +++ b/sc/source/ui/view/viewfunc.cxx @@ -594,7 +594,7 @@ void ScViewFunc::EnterData( SCCOL nCol, SCROW nRow, SCTAB nTab, ScAddress aHeaderAddress; if ( pUnits->isCellConversionRecommended( aAddress, pDoc, sHeaderUnit, aHeaderAddress, sCellUnit ) ) - NotifyUnitConversionRecommended( aAddress, pDoc, sHeaderUnit, aHeaderAddress, sCellUnit, pDocSh ); + NotifyUnitConversionRecommended( aAddress, pDoc, sHeaderUnit, aHeaderAddress, sCellUnit ); else { SfxViewFrame* pViewFrame = GetViewData().GetViewShell()->GetFrame(); @@ -2932,21 +2932,18 @@ struct UnitConversionPushButton: public PushButton ScDocument* mpDoc; const OUString sHeaderUnit; const OUString sCellUnit; - ScDocShell* mpDocSh; UnitConversionPushButton( vcl::Window* pParent, const ResId& rResId, const ScAddress& rCellAddress, ScDocument* pDoc, const OUString& rsHeaderUnit, - const OUString& rsCellUnit, - ScDocShell* pDocSh ): + const OUString& rsCellUnit ): PushButton( pParent, rResId ), aCellAddress( rCellAddress ), mpDoc( pDoc ), sHeaderUnit( rsHeaderUnit ), - sCellUnit( rsCellUnit ), - mpDocSh( pDocSh ) + sCellUnit( rsCellUnit ) {} }; @@ -2954,8 +2951,8 @@ void ScViewFunc::NotifyUnitConversionRecommended( const ScAddress& rCellAddress, ScDocument* pDoc, const OUString& rsHeaderUnit, const ScAddress& rHeaderAddress, - const OUString& rsCellUnit, - ScDocShell* pDocSh ) { + const OUString& rsCellUnit ) +{ SfxViewFrame* pViewFrame = GetViewData().GetViewShell()->GetFrame(); // As with NotifyUnitErrorInFormula we use the cell address as the infobar id. @@ -2997,7 +2994,9 @@ IMPL_LINK( ScViewFunc, UnitConversionRecommendedHandler, UnitConversionPushButto #ifdef ENABLE_CALC_UNITVERIFICATION boost::shared_ptr< Units > pUnits = Units::GetUnits(); - ScDocShellModificator aModificator( *pButton->mpDocSh ); + ScDocShell* pDocShell = static_cast<ScDocShell*>(pButton->mpDoc->GetDocumentShell()); + + ScDocShellModificator aModificator( *pDocShell ); OUString sOriginalValue = pButton->mpDoc->GetString( pButton->aCellAddress ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits