Kaydet (Commit) 106f128f authored tarafından Markus Mohrhard's avatar Markus Mohrhard

ManageNames: make global undo work again with dialog

üst 26c86c78
...@@ -466,6 +466,7 @@ public: ...@@ -466,6 +466,7 @@ public:
*/ */
SC_DLLPUBLIC void GetAllTabRangeNames(ScRangeName::TabNameCopyMap& rRangeNames) const; SC_DLLPUBLIC void GetAllTabRangeNames(ScRangeName::TabNameCopyMap& rRangeNames) const;
SC_DLLPUBLIC void SetAllTabRangeNames(const ScRangeName::TabNameCopyMap& rRangeNames); SC_DLLPUBLIC void SetAllTabRangeNames(const ScRangeName::TabNameCopyMap& rRangeNames);
SC_DLLPUBLIC void SetAllRangeNames( const boost::ptr_map<rtl::OUString, ScRangeName>& rRangeMap);
void GetTabRangeNameMap(std::map<rtl::OUString, ScRangeName*>& rRangeName); void GetTabRangeNameMap(std::map<rtl::OUString, ScRangeName*>& rRangeName);
void GetRangeNameMap(std::map<rtl::OUString, ScRangeName*>& rRangeName); void GetRangeNameMap(std::map<rtl::OUString, ScRangeName*>& rRangeName);
SC_DLLPUBLIC ScRangeName* GetRangeName(SCTAB nTab) const; SC_DLLPUBLIC ScRangeName* GetRangeName(SCTAB nTab) const;
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "undobase.hxx" #include "undobase.hxx"
#include "rangenam.hxx" #include "rangenam.hxx"
#include <boost/ptr_container/ptr_map.hpp>
class ScDocShell; class ScDocShell;
...@@ -41,10 +42,8 @@ class ScUndoAllRangeNames : public ScSimpleUndo ...@@ -41,10 +42,8 @@ class ScUndoAllRangeNames : public ScSimpleUndo
{ {
public: public:
ScUndoAllRangeNames(ScDocShell* pDocSh, ScUndoAllRangeNames(ScDocShell* pDocSh,
const ScRangeName* pOldGlobal, const std::map<rtl::OUString, ScRangeName*>& rOldNames,
const ScRangeName* pNewGlobal, const boost::ptr_map<rtl::OUString, ScRangeName>& rNewNames);
const ScRangeName::TabNameCopyMap& rOldLocal,
const ScRangeName::TabNameCopyMap& rNewLocal);
virtual ~ScUndoAllRangeNames(); virtual ~ScUndoAllRangeNames();
...@@ -55,13 +54,11 @@ public: ...@@ -55,13 +54,11 @@ public:
virtual String GetComment() const; virtual String GetComment() const;
private: private:
void DoChange(const ScRangeName& rGlobal, const ScRangeName::TabNameMap& rLocal); void DoChange(const boost::ptr_map<rtl::OUString, ScRangeName*>& rNames);
private: private:
ScRangeName maOldGlobalNames; boost::ptr_map<rtl::OUString, ScRangeName> maOldNames;
ScRangeName maNewGlobalNames; boost::ptr_map<rtl::OUString, ScRangeName> maNewNames;
ScRangeName::TabNameMap maOldLocalNames;
ScRangeName::TabNameMap maNewLocalNames;
}; };
#endif #endif
......
...@@ -126,6 +126,34 @@ void ScDocument::SetAllTabRangeNames(const ScRangeName::TabNameCopyMap& rNames) ...@@ -126,6 +126,34 @@ void ScDocument::SetAllTabRangeNames(const ScRangeName::TabNameCopyMap& rNames)
SetRangeName(itr->first, new ScRangeName(*itr->second)); SetRangeName(itr->first, new ScRangeName(*itr->second));
} }
void ScDocument::SetAllRangeNames( const boost::ptr_map<rtl::OUString, ScRangeName>& rRangeMap)
{
rtl::OUString aGlobalStr(RTL_CONSTASCII_USTRINGPARAM(STR_GLOBAL_RANGE_NAME));
boost::ptr_map<rtl::OUString,ScRangeName>::const_iterator itr = rRangeMap.begin(), itrEnd = rRangeMap.end();
for (; itr!=itrEnd; ++itr)
{
if (itr->first == aGlobalStr)
{
delete pRangeName;
const ScRangeName* pName = itr->second;
if (pName->empty())
pRangeName = NULL;
else
pRangeName = new ScRangeName( *pName );
}
else
{
const ScRangeName* pName = itr->second;
SCTAB nTab;
GetTable(itr->first, nTab);
if (pName->empty())
SetRangeName( nTab, NULL );
else
SetRangeName( nTab, new ScRangeName( *pName ) );
}
}
}
void ScDocument::GetTabRangeNameMap(std::map<rtl::OUString, ScRangeName*>& aRangeNameMap) void ScDocument::GetTabRangeNameMap(std::map<rtl::OUString, ScRangeName*>& aRangeNameMap)
{ {
for (SCTAB i = 0; i < static_cast<SCTAB>(maTabs.size()); ++i) for (SCTAB i = 0; i < static_cast<SCTAB>(maTabs.size()); ++i)
......
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
#include "drwlayer.hxx" #include "drwlayer.hxx"
#include "editutil.hxx" #include "editutil.hxx"
#include "globstr.hrc" #include "globstr.hrc"
#include "globalnames.hxx"
#include "olinetab.hxx" #include "olinetab.hxx"
#include "patattr.hxx" #include "patattr.hxx"
#include "rangenam.hxx" #include "rangenam.hxx"
...@@ -4528,6 +4529,30 @@ bool ScDocFunc::SetNewRangeNames( ScRangeName* pNewRanges, bool bModifyDoc, SCTA ...@@ -4528,6 +4529,30 @@ bool ScDocFunc::SetNewRangeNames( ScRangeName* pNewRanges, bool bModifyDoc, SCTA
return true; return true;
} }
void ScDocFunc::ModifyAllRangeNames( const boost::ptr_map<rtl::OUString, ScRangeName>& rRangeMap )
{
ScDocShellModificator aModificator(rDocShell);
ScDocument* pDoc = rDocShell.GetDocument();
if (pDoc->IsUndoEnabled())
{
std::map<rtl::OUString, ScRangeName*> aOldRangeMap;
pDoc->GetRangeNameMap(aOldRangeMap);
rDocShell.GetUndoManager()->AddUndoAction(
new ScUndoAllRangeNames(&rDocShell, aOldRangeMap, rRangeMap));
}
pDoc->CompileNameFormula(true);
// set all range names
pDoc->SetAllRangeNames(rRangeMap);
pDoc->CompileNameFormula(false);
aModificator.SetDocumentModified();
SFX_APP()->Broadcast(SfxSimpleHint(SC_HINT_AREAS_CHANGED));
}
//------------------------------------------------------------------------ //------------------------------------------------------------------------
void ScDocFunc::CreateOneName( ScRangeName& rList, void ScDocFunc::CreateOneName( ScRangeName& rList,
......
...@@ -184,6 +184,13 @@ public: ...@@ -184,6 +184,13 @@ public:
bool SetNewRangeNames( ScRangeName* pNewRanges, bool bModifyDoc = true, SCTAB nTab = -1 ); // takes ownership of pNewRanges //nTab = -1 for local range names bool SetNewRangeNames( ScRangeName* pNewRanges, bool bModifyDoc = true, SCTAB nTab = -1 ); // takes ownership of pNewRanges //nTab = -1 for local range names
bool ModifyRangeNames( const ScRangeName& rNewRanges, SCTAB nTab = -1 ); bool ModifyRangeNames( const ScRangeName& rNewRanges, SCTAB nTab = -1 );
/**
* Modify all range names, global scope names as well as sheet local ones,
* in one go. Note that this method will <b>not</b> destroy the instances
* passed as arguments (it creates copies); the caller is responsible for
* destroying them.
*/
void ModifyAllRangeNames( const boost::ptr_map<rtl::OUString, ScRangeName>& rRangeMap );
sal_Bool CreateNames( const ScRange& rRange, sal_uInt16 nFlags, sal_Bool bApi, SCTAB nTab = -1 ); // -1 for global range names sal_Bool CreateNames( const ScRange& rRange, sal_uInt16 nFlags, sal_Bool bApi, SCTAB nTab = -1 ); // -1 for global range names
sal_Bool InsertNameList( const ScAddress& rStartPos, sal_Bool bApi ); sal_Bool InsertNameList( const ScAddress& rStartPos, sal_Bool bApi );
......
...@@ -103,7 +103,9 @@ private: ...@@ -103,7 +103,9 @@ private:
const ScAddress maCursorPos; const ScAddress maCursorPos;
Selection maCurSel; Selection maCurSel;
std::map<rtl::OUString, ScRangeName*> maRangeMap; typedef boost::ptr_map<rtl::OUString, ScRangeName> RangeNameContainer;
RangeNameContainer maRangeMap;
private: private:
void Init(); void Init();
......
...@@ -45,21 +45,19 @@ class SC_DLLPUBLIC ScRangeManagerTable : public SvTabListBox ...@@ -45,21 +45,19 @@ class SC_DLLPUBLIC ScRangeManagerTable : public SvTabListBox
{ {
private: private:
HeaderBar maHeaderBar; HeaderBar maHeaderBar;
ScRangeName* mpGlobalRangeName;
std::map<rtl::OUString, ScRangeName*> maTabRangeNames;
rtl::OUString maGlobalString; rtl::OUString maGlobalString;
void GetLine(ScRangeNameLine& aLine, SvLBoxEntry* pEntry); void GetLine(ScRangeNameLine& aLine, SvLBoxEntry* pEntry);
void Init( const boost::ptr_map<rtl::OUString, ScRangeName>& rRangeMap );
public: public:
ScRangeManagerTable( Window* pParent, ScRangeName* pGlobalRangeName, std::map<rtl::OUString, ScRangeName*> aTabRangeNames ); ScRangeManagerTable( Window* pParent, boost::ptr_map<rtl::OUString, ScRangeName>& aTabRangeNames );
~ScRangeManagerTable() {}; ~ScRangeManagerTable() {};
void addEntry( const ScRangeNameLine& rLine ); void addEntry( const ScRangeNameLine& rLine );
void DeleteSelectedEntries(); void DeleteSelectedEntries();
void GetCurrentLine(ScRangeNameLine& rLine); void GetCurrentLine(ScRangeNameLine& rLine);
void UpdateEntries();
bool IsMultiSelection(); bool IsMultiSelection();
std::vector<ScRangeNameLine> GetSelectedEntries(); std::vector<ScRangeNameLine> GetSelectedEntries();
}; };
......
...@@ -151,8 +151,16 @@ void ScNameDlg::Init() ...@@ -151,8 +151,16 @@ void ScNameDlg::Init()
OSL_ENSURE( mpViewData && mpDoc, "ViewData oder Document nicht gefunden!" ); OSL_ENSURE( mpViewData && mpDoc, "ViewData oder Document nicht gefunden!" );
//init UI //init UI
mpDoc->GetRangeNameMap(maRangeMap); std::map<rtl::OUString, ScRangeName*> aRangeMap;
mpRangeManagerTable = new ScRangeManagerTable(&maNameMgrCtrl, mpDoc->GetRangeName(), maRangeMap); mpDoc->GetRangeNameMap(aRangeMap);
RangeNameContainer::iterator itr = maRangeMap.begin(), itrEnd = maRangeMap.end();
for (; itr != itrEnd; ++itr)
{
rtl::OUString aTemp(itr->first);
maRangeMap.insert(aTemp, new ScRangeName(*itr->second));
}
mpRangeManagerTable = new ScRangeManagerTable(&maNameMgrCtrl, maRangeMap);
mpRangeManagerTable->SetSelectHdl( LINK( this, ScNameDlg, SelectionChangedHdl_Impl ) ); mpRangeManagerTable->SetSelectHdl( LINK( this, ScNameDlg, SelectionChangedHdl_Impl ) );
mpRangeManagerTable->SetDeselectHdl( LINK( this, ScNameDlg, SelectionChangedHdl_Impl ) ); mpRangeManagerTable->SetDeselectHdl( LINK( this, ScNameDlg, SelectionChangedHdl_Impl ) );
...@@ -229,6 +237,8 @@ void ScNameDlg::SetReference( const ScRange& rRef, ScDocument* pDocP ) ...@@ -229,6 +237,8 @@ void ScNameDlg::SetReference( const ScRange& rRef, ScDocument* pDocP )
sal_Bool ScNameDlg::Close() sal_Bool ScNameDlg::Close()
{ {
ScDocFunc aFunc(*mpViewData->GetDocShell());
aFunc.ModifyAllRangeNames(maRangeMap);
return DoClose( ScNameDlgWrapper::GetChildWindowId() ); return DoClose( ScNameDlgWrapper::GetChildWindowId() );
} }
...@@ -291,8 +301,6 @@ bool ScNameDlg::IsFormulaValid() ...@@ -291,8 +301,6 @@ bool ScNameDlg::IsFormulaValid()
//updates the table and the buttons //updates the table and the buttons
void ScNameDlg::UpdateNames() void ScNameDlg::UpdateNames()
{ {
mpRangeManagerTable->UpdateEntries();
ScRangeNameLine aLine; ScRangeNameLine aLine;
mpRangeManagerTable->GetCurrentLine(aLine); mpRangeManagerTable->GetCurrentLine(aLine);
if (aLine.aName.getLength()) if (aLine.aName.getLength())
......
...@@ -55,11 +55,9 @@ String createEntryString(const ScRangeNameLine& rLine) ...@@ -55,11 +55,9 @@ String createEntryString(const ScRangeNameLine& rLine)
return aRet; return aRet;
} }
ScRangeManagerTable::ScRangeManagerTable( Window* pWindow, ScRangeName* pGlobalRangeName, std::map<rtl::OUString, ScRangeName*> aTabRangeNames ): ScRangeManagerTable::ScRangeManagerTable( Window* pWindow, boost::ptr_map<rtl::OUString, ScRangeName>& rRangeMap ):
SvTabListBox( pWindow, WB_SORT | WB_HSCROLL | WB_CLIPCHILDREN | WB_TABSTOP ), SvTabListBox( pWindow, WB_SORT | WB_HSCROLL | WB_CLIPCHILDREN | WB_TABSTOP ),
maHeaderBar( pWindow, WB_BUTTONSTYLE | WB_BOTTOMBORDER ), maHeaderBar( pWindow, WB_BUTTONSTYLE | WB_BOTTOMBORDER ),
mpGlobalRangeName( pGlobalRangeName ),
maTabRangeNames( aTabRangeNames ),
maGlobalString( ResId::toString(ScResId(STR_GLOBAL_SCOPE))) maGlobalString( ResId::toString(ScResId(STR_GLOBAL_SCOPE)))
{ {
Size aBoxSize( pWindow->GetOutputSizePixel() ); Size aBoxSize( pWindow->GetOutputSizePixel() );
...@@ -85,6 +83,7 @@ ScRangeManagerTable::ScRangeManagerTable( Window* pWindow, ScRangeName* pGlobalR ...@@ -85,6 +83,7 @@ ScRangeManagerTable::ScRangeManagerTable( Window* pWindow, ScRangeName* pGlobalR
Show(); Show();
maHeaderBar.Show(); maHeaderBar.Show();
SetSelectionMode(MULTIPLE_SELECTION); SetSelectionMode(MULTIPLE_SELECTION);
Init(rRangeMap);
} }
void ScRangeManagerTable::addEntry(const ScRangeNameLine& rLine) void ScRangeManagerTable::addEntry(const ScRangeNameLine& rLine)
...@@ -106,13 +105,13 @@ void ScRangeManagerTable::GetLine(ScRangeNameLine& rLine, SvLBoxEntry* pEntry) ...@@ -106,13 +105,13 @@ void ScRangeManagerTable::GetLine(ScRangeNameLine& rLine, SvLBoxEntry* pEntry)
rLine.aScope = GetEntryText(pEntry, 2); rLine.aScope = GetEntryText(pEntry, 2);
} }
void ScRangeManagerTable::UpdateEntries() void ScRangeManagerTable::Init(const boost::ptr_map<rtl::OUString, ScRangeName>& rRangeMap)
{ {
Clear(); Clear();
for (std::map<rtl::OUString, ScRangeName*>::iterator itr = maTabRangeNames.begin(); for (boost::ptr_map<rtl::OUString, ScRangeName>::const_iterator itr = rRangeMap.begin();
itr != maTabRangeNames.end(); ++itr) itr != rRangeMap.end(); ++itr)
{ {
ScRangeName* pLocalRangeName = itr->second; const ScRangeName* pLocalRangeName = itr->second;
ScRangeNameLine aLine; ScRangeNameLine aLine;
if (itr->first == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_GLOBAL_RANGE_NAME))) if (itr->first == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_GLOBAL_RANGE_NAME)))
aLine.aScope = maGlobalString; aLine.aScope = maGlobalString;
......
...@@ -43,31 +43,27 @@ using ::std::auto_ptr; ...@@ -43,31 +43,27 @@ using ::std::auto_ptr;
ScUndoAllRangeNames::ScUndoAllRangeNames( ScUndoAllRangeNames::ScUndoAllRangeNames(
ScDocShell* pDocSh, ScDocShell* pDocSh,
const ScRangeName* pOldGlobal, const ScRangeName* pNewGlobal, const std::map<rtl::OUString, ScRangeName*>& rOldNames,
const ScRangeName::TabNameCopyMap &rOldLocal, const ScRangeName::TabNameCopyMap &rNewLocal) : const boost::ptr_map<rtl::OUString, ScRangeName>& rNewNames) :
ScSimpleUndo(pDocSh) ScSimpleUndo(pDocSh)
{ {
if (pOldGlobal)
maOldGlobalNames = *pOldGlobal;
if (pNewGlobal)
maNewGlobalNames = *pNewGlobal;
// Copy sheet-local names. // Copy sheet-local names.
ScRangeName::TabNameCopyMap::const_iterator itr, itrEnd; std::map<rtl::OUString, ScRangeName*>::const_iterator itr, itrEnd;
for (itr = rOldLocal.begin(), itrEnd = rOldLocal.end(); itr != itrEnd; ++itr) for (itr = rOldNames.begin(), itrEnd = rOldNames.end(); itr != itrEnd; ++itr)
{ {
SAL_WNODEPRECATED_DECLARATIONS_PUSH SAL_WNODEPRECATED_DECLARATIONS_PUSH
auto_ptr<ScRangeName> p(new ScRangeName(*itr->second)); auto_ptr<ScRangeName> p(new ScRangeName(*itr->second));
SAL_WNODEPRECATED_DECLARATIONS_POP SAL_WNODEPRECATED_DECLARATIONS_POP
maOldLocalNames.insert(itr->first, p); maOldNames.insert(itr->first, p);
} }
for (itr = rNewLocal.begin(), itrEnd = rNewLocal.end(); itr != itrEnd; ++itr) boost::ptr_map<rtl::OUString, ScRangeName>::const_iterator it, itEnd;
for (it = rNewNames.begin(), itEnd = rNewNames.end(); it != itEnd; ++it)
{ {
SAL_WNODEPRECATED_DECLARATIONS_PUSH SAL_WNODEPRECATED_DECLARATIONS_PUSH
auto_ptr<ScRangeName> p(new ScRangeName(*itr->second)); auto_ptr<ScRangeName> p(new ScRangeName(*it->second));
SAL_WNODEPRECATED_DECLARATIONS_POP SAL_WNODEPRECATED_DECLARATIONS_POP
maNewLocalNames.insert(itr->first, p); maNewNames.insert(it->first, p);
} }
} }
...@@ -77,12 +73,12 @@ ScUndoAllRangeNames::~ScUndoAllRangeNames() ...@@ -77,12 +73,12 @@ ScUndoAllRangeNames::~ScUndoAllRangeNames()
void ScUndoAllRangeNames::Undo() void ScUndoAllRangeNames::Undo()
{ {
DoChange(maOldGlobalNames, maOldLocalNames); DoChange(maOldNames);
} }
void ScUndoAllRangeNames::Redo() void ScUndoAllRangeNames::Redo()
{ {
DoChange(maNewGlobalNames, maNewLocalNames); DoChange(maNewNames);
} }
void ScUndoAllRangeNames::Repeat(SfxRepeatTarget& /*rTarget*/) void ScUndoAllRangeNames::Repeat(SfxRepeatTarget& /*rTarget*/)
...@@ -99,21 +95,13 @@ String ScUndoAllRangeNames::GetComment() const ...@@ -99,21 +95,13 @@ String ScUndoAllRangeNames::GetComment() const
return ScGlobal::GetRscString(STR_UNDO_RANGENAMES); return ScGlobal::GetRscString(STR_UNDO_RANGENAMES);
} }
void ScUndoAllRangeNames::DoChange(const ScRangeName& rGlobal, const ScRangeName::TabNameMap& rLocal) void ScUndoAllRangeNames::DoChange(const boost::ptr_map<rtl::OUString, ScRangeName*>& rNames)
{ {
ScDocument& rDoc = *pDocShell->GetDocument(); ScDocument& rDoc = *pDocShell->GetDocument();
rDoc.CompileNameFormula(true); rDoc.CompileNameFormula(true);
// Global names. rDoc.SetAllRangeNames(rNames);
if (rGlobal.empty())
rDoc.SetRangeName(NULL);
else
rDoc.SetRangeName(new ScRangeName(rGlobal));
ScRangeName::TabNameCopyMap aCopy;
ScRangeName::copyLocalNames(rLocal, aCopy);
rDoc.SetAllTabRangeNames(aCopy);
rDoc.CompileNameFormula(true); rDoc.CompileNameFormula(true);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment