diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2011-11-21 11:19:38 +0100 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2011-11-23 06:25:33 +0100 |
commit | b1097c47695210f8824dcc4fc456b95897fc3972 (patch) | |
tree | 8128cb9ecd4a41136107623c6ab0e4f6ee3790f5 /sc | |
parent | 106f128f359deb1c9553c105eff4bf829fdd9736 (diff) |
ManageNames: add undo to Define Names dialog
Diffstat (limited to 'sc')
-rw-r--r-- | sc/inc/undorangename.hxx | 19 | ||||
-rw-r--r-- | sc/source/ui/inc/namedefdlg.hxx | 4 | ||||
-rw-r--r-- | sc/source/ui/inc/namedlg.hxx | 1 | ||||
-rw-r--r-- | sc/source/ui/namedlg/namedefdlg.cxx | 32 | ||||
-rw-r--r-- | sc/source/ui/namedlg/namedlg.cxx | 62 | ||||
-rw-r--r-- | sc/source/ui/undo/undorangename.cxx | 61 | ||||
-rw-r--r-- | sc/source/ui/view/tabvwshc.cxx | 2 |
7 files changed, 130 insertions, 51 deletions
diff --git a/sc/inc/undorangename.hxx b/sc/inc/undorangename.hxx index f1c1668a7b8b..df6ff23e97ab 100644 --- a/sc/inc/undorangename.hxx +++ b/sc/inc/undorangename.hxx @@ -61,6 +61,25 @@ private: boost::ptr_map<rtl::OUString, ScRangeName> maNewNames; }; +class ScUndoAddRangeData : public ScSimpleUndo +{ +public: + // nTab = -1 for global range names + ScUndoAddRangeData(ScDocShell* pDocSh, ScRangeData* pRangeData, SCTAB nTab); + + virtual ~ScUndoAddRangeData(); + + virtual void Undo(); + virtual void Redo(); + virtual void Repeat(SfxRepeatTarget& rTarget); + virtual sal_Bool CanRepeat(SfxRepeatTarget& rTarget) const; + virtual String GetComment() const; + +private: + ScRangeData* mpRangeData; + SCTAB mnTab; +}; + #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/inc/namedefdlg.hxx b/sc/source/ui/inc/namedefdlg.hxx index 5cbf5555a386..14ba9198a1cf 100644 --- a/sc/source/ui/inc/namedefdlg.hxx +++ b/sc/source/ui/inc/namedefdlg.hxx @@ -37,6 +37,7 @@ class ScRangeName; class ScDocument; +class ScDocShell; class ScNameDefDlg : public ScAnyRefDlg { @@ -63,6 +64,7 @@ private: bool mbUndo; //if true we need to add an undo action after creating a range name ScDocument* mpDoc; + ScDocShell* mpDocShell; ScAddress maCursorPos; rtl::OUString maGlobalNameStr; @@ -85,7 +87,7 @@ protected: public: ScNameDefDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, - ScDocument* pDoc, std::map<rtl::OUString, ScRangeName*> aRangeMap, + ScDocShell* pDocShell, std::map<rtl::OUString, ScRangeName*> aRangeMap, const ScAddress& aCursorPos, const bool bUndo); virtual void SetReference( const ScRange& rRef, ScDocument* pDoc ); diff --git a/sc/source/ui/inc/namedlg.hxx b/sc/source/ui/inc/namedlg.hxx index a5b546165fcf..85a7ac9fc9f2 100644 --- a/sc/source/ui/inc/namedlg.hxx +++ b/sc/source/ui/inc/namedlg.hxx @@ -117,6 +117,7 @@ private: bool IsNameValid(); bool IsFormulaValid(); + ScRangeName* GetRangeName(const rtl::OUString& rScope); bool AddPushed(); void RemovePushed(); diff --git a/sc/source/ui/namedlg/namedefdlg.cxx b/sc/source/ui/namedlg/namedefdlg.cxx index bc08852721fd..e1b2883d4937 100644 --- a/sc/source/ui/namedlg/namedefdlg.cxx +++ b/sc/source/ui/namedlg/namedefdlg.cxx @@ -7,6 +7,7 @@ #include "globalnames.hxx" #include "rangenam.hxx" #include "reffact.hxx" +#include "undorangename.hxx" // defines ------------------------------------------------------------------- @@ -18,7 +19,7 @@ #define ABS_DREF3D ABS_DREF | SCA_TAB_3D ScNameDefDlg::ScNameDefDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent, - ScDocument* pDoc, std::map<rtl::OUString, ScRangeName*> aRangeMap, + ScDocShell* pDocShell, std::map<rtl::OUString, ScRangeName*> aRangeMap, const ScAddress& aCursorPos, const bool bUndo ) : ScAnyRefDlg( pB, pCW, pParent, RID_SCDLG_NAMES_DEFINE ), maBtnAdd( this, ScResId( BTN_ADD ) ), @@ -37,7 +38,8 @@ ScNameDefDlg::ScNameDefDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParen maBtnPrintArea( this, ScResId( BTN_PRINTAREA ) ), maBtnCriteria( this, ScResId( BTN_CRITERIA ) ), mbUndo( bUndo ), - mpDoc( pDoc ), + mpDoc( pDocShell->GetDocument() ), + mpDocShell ( pDocShell ), maCursorPos( aCursorPos ), maGlobalNameStr( ResId::toString( ScResId( STR_GLOBAL_SCOPE ) ) ), maRangeMap( aRangeMap ) @@ -45,11 +47,11 @@ ScNameDefDlg::ScNameDefDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParen // Initialize scope list. maLbScope.InsertEntry(maGlobalNameStr); maLbScope.SelectEntryPos(0); - SCTAB n = pDoc->GetTableCount(); + SCTAB n = mpDoc->GetTableCount(); for (SCTAB i = 0; i < n; ++i) { rtl::OUString aTabName; - pDoc->GetName(i, aTabName); + mpDoc->GetName(i, aTabName); maLbScope.InsertEntry(aTabName); } @@ -159,11 +161,23 @@ void ScNameDefDlg::AddPushed() if (mbUndo) { - //this means we called directly through the menu - //add a new ScUndoInsertName entry to undo - // - //TODO:FIXME need to add the undo code here + // this means we called directly through the menu + + SCTAB nTab; + // if no table with that name is found, assume global range name + if (!mpDoc->GetTable(aScope, nTab)) + nTab = -1; + + mpDocShell->GetUndoManager()->AddUndoAction( + new ScUndoAddRangeData( mpDocShell, pNewEntry, nTab) ); + + // set table stream invalid, otherwise RangeName won't be saved if no other + // call invalidates the stream + if (nTab != -1) + mpDoc->SetStreamValid(nTab, false); } + SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) ); + Close(); } else { @@ -175,8 +189,6 @@ void ScNameDefDlg::AddPushed() } } } - SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) ); - Close(); } sal_Bool ScNameDefDlg::IsRefInputMode() const diff --git a/sc/source/ui/namedlg/namedlg.cxx b/sc/source/ui/namedlg/namedlg.cxx index c64e0349200f..449fc8fbe2eb 100644 --- a/sc/source/ui/namedlg/namedlg.cxx +++ b/sc/source/ui/namedlg/namedlg.cxx @@ -55,8 +55,6 @@ #include <memory> #include <iostream> -using ::std::auto_ptr; - // defines ------------------------------------------------------------------- #define ABS_SREF SCA_VALID \ @@ -66,27 +64,6 @@ using ::std::auto_ptr; #define ABS_SREF3D ABS_SREF | SCA_TAB_3D #define ABS_DREF3D ABS_DREF | SCA_TAB_3D -//helper - -namespace { - -ScRangeName* GetRangeName(const rtl::OUString& rTableName, ScDocument* pDoc) -{ - ScRangeName* pRangeName; - SCTAB nTab; - if ( pDoc->GetTable(rTableName, nTab)) - { - pRangeName = pDoc->GetRangeName(nTab); - } - else - { - pRangeName = pDoc->GetRangeName(); - } - return pRangeName; -} - -} - //logic #define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute(); @@ -153,11 +130,12 @@ void ScNameDlg::Init() //init UI std::map<rtl::OUString, ScRangeName*> aRangeMap; mpDoc->GetRangeNameMap(aRangeMap); - RangeNameContainer::iterator itr = maRangeMap.begin(), itrEnd = maRangeMap.end(); + std::map<rtl::OUString, ScRangeName*>::iterator itr = aRangeMap.begin(), itrEnd = aRangeMap.end(); for (; itr != itrEnd; ++itr) { rtl::OUString aTemp(itr->first); maRangeMap.insert(aTemp, new ScRangeName(*itr->second)); + std::cout << "RangeName: " << rtl::OUStringToOString(aTemp, RTL_TEXTENCODING_UTF8).getStr() << std::endl; } mpRangeManagerTable = new ScRangeManagerTable(&maNameMgrCtrl, maRangeMap); @@ -237,6 +215,7 @@ void ScNameDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) sal_Bool ScNameDlg::Close() { + std::cout << "Ok Pushed!" << std::endl; ScDocFunc aFunc(*mpViewData->GetDocShell()); aFunc.ModifyAllRangeNames(maRangeMap); return DoClose( ScNameDlgWrapper::GetChildWindowId() ); @@ -265,16 +244,12 @@ bool ScNameDlg::IsNameValid() { rtl::OUString aScope = maLbScope.GetSelectEntry(); rtl::OUString aName = maEdName.GetText(); + aName = aName.trim(); - ScRangeName* pRangeName = NULL; - if(aScope == maGlobalNameStr) - { - pRangeName = maRangeMap.find(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_GLOBAL_RANGE_NAME)))->second; - } - else - { - pRangeName = maRangeMap.find(aScope)->second; - } + if (!aName.getLength()) + return false; + + ScRangeName* pRangeName = GetRangeName( aScope ); if (!ScRangeData::IsNameValid( aName, mpDoc )) { @@ -298,6 +273,14 @@ bool ScNameDlg::IsFormulaValid() return true; } +ScRangeName* ScNameDlg::GetRangeName(const rtl::OUString& rScope) +{ + if (rScope == maGlobalNameStr) + return maRangeMap.find(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_GLOBAL_RANGE_NAME)))->second; + else + return maRangeMap.find(rScope)->second; +} + //updates the table and the buttons void ScNameDlg::UpdateNames() { @@ -329,7 +312,7 @@ void ScNameDlg::CalcCurTableAssign( String& aAssign, ScRangeData* pRangeData ) void ScNameDlg::ShowOptions(const ScRangeNameLine& rLine) { - ScRangeName* pRangeName = GetRangeName(rLine.aScope, mpDoc); + ScRangeName* pRangeName = GetRangeName(rLine.aScope); ScRangeData* pData = pRangeName->findByName(rLine.aName); if (pData) { @@ -356,7 +339,7 @@ bool ScNameDlg::AddPushed() rtl::OUString aScope = maLbScope.GetSelectEntry(); rtl::OUString aExpr = maEdAssign.GetText(); - ScRangeName* pRangeName = GetRangeName(aScope, mpDoc); + ScRangeName* pRangeName = GetRangeName(aScope); RangeType nType = RT_NAME | (maBtnRowHeader.IsChecked() ? RT_ROWHEADER : RangeType(0)) @@ -394,7 +377,7 @@ void ScNameDlg::RemovePushed() mpRangeManagerTable->DeleteSelectedEntries(); for (std::vector<ScRangeNameLine>::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr) { - ScRangeName* pRangeName = GetRangeName( itr->aScope, mpDoc ); + ScRangeName* pRangeName = GetRangeName(itr->aScope); std::cout << rtl::OUStringToOString(itr->aName, RTL_TEXTENCODING_UTF8).getStr() << std::endl; std::cout << rtl::OUStringToOString(ScGlobal::pCharClass->upper(itr->aName), RTL_TEXTENCODING_UTF8).getStr() << std::endl;; ScRangeData* pData = pRangeName->findByUpperName(ScGlobal::pCharClass->upper(itr->aName)); @@ -421,12 +404,15 @@ void ScNameDlg::NameModified() } rtl::OUString aOldScope = aLine.aScope; + //empty table + if (aOldScope.isEmpty()) + return; rtl::OUString aExpr = maEdAssign.GetText(); rtl::OUString aNewScope = maLbScope.GetSelectEntry(); - ScRangeName* pOldRangeName = GetRangeName( aOldScope, mpDoc ); + ScRangeName* pOldRangeName = GetRangeName( aOldScope ); ScRangeData* pData = pOldRangeName->findByUpperName( ScGlobal::pCharClass->upper(aOldName) ); - ScRangeName* pNewRangeName = GetRangeName( aNewScope, mpDoc ); + ScRangeName* pNewRangeName = GetRangeName( aNewScope ); OSL_ENSURE(pData, "model and table should be in sync"); // be safe and check for range data if (pData) diff --git a/sc/source/ui/undo/undorangename.cxx b/sc/source/ui/undo/undorangename.cxx index b7b1e2cc6c2a..28d60437475c 100644 --- a/sc/source/ui/undo/undorangename.cxx +++ b/sc/source/ui/undo/undorangename.cxx @@ -47,7 +47,6 @@ ScUndoAllRangeNames::ScUndoAllRangeNames( const boost::ptr_map<rtl::OUString, ScRangeName>& rNewNames) : ScSimpleUndo(pDocSh) { - // Copy sheet-local names. std::map<rtl::OUString, ScRangeName*>::const_iterator itr, itrEnd; for (itr = rOldNames.begin(), itrEnd = rOldNames.end(); itr != itrEnd; ++itr) { @@ -108,4 +107,64 @@ void ScUndoAllRangeNames::DoChange(const boost::ptr_map<rtl::OUString, ScRangeNa SFX_APP()->Broadcast(SfxSimpleHint(SC_HINT_AREAS_CHANGED)); } +ScUndoAddRangeData::ScUndoAddRangeData(ScDocShell* pDocSh, ScRangeData* pRangeData, SCTAB nTab) : + ScSimpleUndo(pDocSh), + mpRangeData(new ScRangeData(*pRangeData)), + mnTab(nTab) +{ + +} + +ScUndoAddRangeData::~ScUndoAddRangeData() +{ + delete mpRangeData; +} + +void ScUndoAddRangeData::Undo() +{ + ScDocument* pDoc = pDocShell->GetDocument(); + ScRangeName* pRangeName = NULL; + if (mnTab == -1) + { + pRangeName = pDoc->GetRangeName(); + } + else + { + pRangeName = pDoc->GetRangeName( mnTab ); + } + pRangeName->erase(*mpRangeData); + SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) ); + +} + +void ScUndoAddRangeData::Redo() +{ + ScDocument* pDoc = pDocShell->GetDocument(); + ScRangeName* pRangeName = NULL; + if (mnTab == -1) + { + pRangeName = pDoc->GetRangeName(); + } + else + { + pRangeName = pDoc->GetRangeName( mnTab ); + } + pRangeName->insert(new ScRangeData(*mpRangeData)); + SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) ); +} + +void ScUndoAddRangeData::Repeat(SfxRepeatTarget& /*rTarget*/) +{ +} + +sal_Bool ScUndoAddRangeData::CanRepeat(SfxRepeatTarget& /*rTarget*/) const +{ + return sal_False; +} + +String ScUndoAddRangeData::GetComment() const +{ + return ScGlobal::GetRscString(STR_UNDO_RANGENAMES); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/view/tabvwshc.cxx b/sc/source/ui/view/tabvwshc.cxx index 2dca9766a0ee..5f648fb2cc26 100644 --- a/sc/source/ui/view/tabvwshc.cxx +++ b/sc/source/ui/view/tabvwshc.cxx @@ -122,7 +122,7 @@ SfxModelessDialog* ScTabViewShell::CreateRefDialog( std::cout << "tabvwsh" << std::endl; std::map<rtl::OUString, ScRangeName*> aRangeMap; pDoc->GetRangeNameMap(aRangeMap); - pResult = new ScNameDefDlg( pB, pCW, pParent, GetViewData()->GetDocument(), aRangeMap, + pResult = new ScNameDefDlg( pB, pCW, pParent, GetViewData()->GetDocShell(), aRangeMap, ScAddress( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() ), true ); |