summaryrefslogtreecommitdiff
path: root/sc/source/ui
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2011-11-21 11:19:38 +0100
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2011-11-23 06:25:33 +0100
commitb1097c47695210f8824dcc4fc456b95897fc3972 (patch)
tree8128cb9ecd4a41136107623c6ab0e4f6ee3790f5 /sc/source/ui
parent106f128f359deb1c9553c105eff4bf829fdd9736 (diff)
ManageNames: add undo to Define Names dialog
Diffstat (limited to 'sc/source/ui')
-rw-r--r--sc/source/ui/inc/namedefdlg.hxx4
-rw-r--r--sc/source/ui/inc/namedlg.hxx1
-rw-r--r--sc/source/ui/namedlg/namedefdlg.cxx32
-rw-r--r--sc/source/ui/namedlg/namedlg.cxx62
-rw-r--r--sc/source/ui/undo/undorangename.cxx61
-rw-r--r--sc/source/ui/view/tabvwshc.cxx2
6 files changed, 111 insertions, 51 deletions
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 );