Kaydet (Commit) 792fb5b9 authored tarafından Markus Mohrhard's avatar Markus Mohrhard

ManageNames: only calculate formula for visible range names

üst c21b1126
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include <boost/ptr_container/ptr_map.hpp> #include <boost/ptr_container/ptr_map.hpp>
class ScRangeName; class ScRangeName;
class ScRangeData;
struct ScRangeNameLine struct ScRangeNameLine
{ {
...@@ -64,8 +65,17 @@ private: ...@@ -64,8 +65,17 @@ private:
HeaderBar maHeaderBar; HeaderBar maHeaderBar;
rtl::OUString maGlobalString; rtl::OUString maGlobalString;
// should be const because we should not modify it here
const boost::ptr_map<rtl::OUString, ScRangeName>& mrRangeMap;
// for performance, save which entries already have the formula entry
// otherwise opening the dialog with a lot of range names is extremelly slow because
// we would calculate all formula strings during opening
std::map<SvLBoxEntry*, bool> maCalculatedFormulaEntries;
void GetLine(ScRangeNameLine& aLine, SvLBoxEntry* pEntry); void GetLine(ScRangeNameLine& aLine, SvLBoxEntry* pEntry);
void Init( const boost::ptr_map<rtl::OUString, ScRangeName>& rRangeMap ); void Init();
void CheckForFormulaString();
const ScRangeData* findRangeData(const ScRangeNameLine& rLine);
public: public:
ScRangeManagerTable( Window* pParent, boost::ptr_map<rtl::OUString, ScRangeName>& aTabRangeNames ); ScRangeManagerTable( Window* pParent, boost::ptr_map<rtl::OUString, ScRangeName>& aTabRangeNames );
...@@ -78,6 +88,7 @@ public: ...@@ -78,6 +88,7 @@ public:
bool IsMultiSelection(); bool IsMultiSelection();
std::vector<ScRangeNameLine> GetSelectedEntries(); std::vector<ScRangeNameLine> GetSelectedEntries();
DECL_LINK( ScrollHdl, void*);
DECL_LINK( HeaderEndDragHdl, void*); DECL_LINK( HeaderEndDragHdl, void*);
}; };
......
...@@ -60,7 +60,8 @@ String createEntryString(const ScRangeNameLine& rLine) ...@@ -60,7 +60,8 @@ String createEntryString(const ScRangeNameLine& rLine)
ScRangeManagerTable::ScRangeManagerTable( Window* pWindow, boost::ptr_map<rtl::OUString, ScRangeName>& rRangeMap ): 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 ),
maGlobalString( ScGlobal::GetRscString(STR_GLOBAL_SCOPE)) maGlobalString( ScGlobal::GetRscString(STR_GLOBAL_SCOPE)),
mrRangeMap( rRangeMap )
{ {
Size aBoxSize( pWindow->GetOutputSizePixel() ); Size aBoxSize( pWindow->GetOutputSizePixel() );
...@@ -84,12 +85,16 @@ ScRangeManagerTable::ScRangeManagerTable( Window* pWindow, boost::ptr_map<rtl::O ...@@ -84,12 +85,16 @@ ScRangeManagerTable::ScRangeManagerTable( Window* pWindow, boost::ptr_map<rtl::O
maHeaderBar.SetEndDragHdl( LINK( this, ScRangeManagerTable, HeaderEndDragHdl ) ); maHeaderBar.SetEndDragHdl( LINK( this, ScRangeManagerTable, HeaderEndDragHdl ) );
Init();
Show(); Show();
maHeaderBar.Show(); maHeaderBar.Show();
SetSelectionMode(MULTIPLE_SELECTION); SetSelectionMode(MULTIPLE_SELECTION);
Init(rRangeMap);
if (GetEntryCount()) if (GetEntryCount())
{
SetCurEntry(GetEntryOnPos(0)); SetCurEntry(GetEntryOnPos(0));
CheckForFormulaString();
}
SetScrolledHdl( LINK( this, ScRangeManagerTable, ScrollHdl ) );
} }
ScRangeManagerTable::~ScRangeManagerTable() ScRangeManagerTable::~ScRangeManagerTable()
...@@ -116,11 +121,11 @@ void ScRangeManagerTable::GetLine(ScRangeNameLine& rLine, SvLBoxEntry* pEntry) ...@@ -116,11 +121,11 @@ void ScRangeManagerTable::GetLine(ScRangeNameLine& rLine, SvLBoxEntry* pEntry)
rLine.aScope = GetEntryText(pEntry, 2); rLine.aScope = GetEntryText(pEntry, 2);
} }
void ScRangeManagerTable::Init(const boost::ptr_map<rtl::OUString, ScRangeName>& rRangeMap) void ScRangeManagerTable::Init()
{ {
Clear(); Clear();
for (boost::ptr_map<rtl::OUString, ScRangeName>::const_iterator itr = rRangeMap.begin(); for (boost::ptr_map<rtl::OUString, ScRangeName>::const_iterator itr = mrRangeMap.begin();
itr != rRangeMap.end(); ++itr) itr != mrRangeMap.end(); ++itr)
{ {
const ScRangeName* pLocalRangeName = itr->second; const ScRangeName* pLocalRangeName = itr->second;
ScRangeNameLine aLine; ScRangeNameLine aLine;
...@@ -134,13 +139,44 @@ void ScRangeManagerTable::Init(const boost::ptr_map<rtl::OUString, ScRangeName>& ...@@ -134,13 +139,44 @@ void ScRangeManagerTable::Init(const boost::ptr_map<rtl::OUString, ScRangeName>&
if (!it->second->HasType(RT_DATABASE) && !it->second->HasType(RT_SHARED)) if (!it->second->HasType(RT_DATABASE) && !it->second->HasType(RT_SHARED))
{ {
aLine.aName = it->second->GetName(); aLine.aName = it->second->GetName();
it->second->GetSymbol(aLine.aExpression);
addEntry(aLine); addEntry(aLine);
} }
} }
} }
} }
const ScRangeData* ScRangeManagerTable::findRangeData(const ScRangeNameLine& rLine)
{
const ScRangeName* pRangeName;
if (rLine.aScope == maGlobalString)
pRangeName = mrRangeMap.find(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(STR_GLOBAL_RANGE_NAME)))->second;
else
pRangeName = mrRangeMap.find(rLine.aScope)->second;
return pRangeName->findByUpperName(ScGlobal::pCharClass->upper(rLine.aName));
}
void ScRangeManagerTable::CheckForFormulaString()
{
for (SvLBoxEntry* pEntry = GetFirstEntryInView(); pEntry ; pEntry = GetNextEntryInView(pEntry))
{
std::map<SvLBoxEntry*, bool>::const_iterator itr = maCalculatedFormulaEntries.find(pEntry);
if (itr == maCalculatedFormulaEntries.end() || itr->second == false)
{
ScRangeNameLine aLine;
GetLine( aLine, pEntry);
const ScRangeData* pData = findRangeData( aLine );
rtl::OUString aFormulaString;
pData->GetSymbol(aFormulaString);
SetEntryText(aFormulaString, pEntry, 1);
maCalculatedFormulaEntries.insert( std::pair<SvLBoxEntry*, bool>(pEntry, true) );
}
}
}
void ScRangeManagerTable::DeleteSelectedEntries() void ScRangeManagerTable::DeleteSelectedEntries()
{ {
if (GetSelectionCount()) if (GetSelectionCount())
...@@ -237,5 +273,11 @@ IMPL_LINK( ScRangeManagerTable, HeaderEndDragHdl, void*, EMPTYARG) ...@@ -237,5 +273,11 @@ IMPL_LINK( ScRangeManagerTable, HeaderEndDragHdl, void*, EMPTYARG)
return 0; return 0;
} }
IMPL_LINK( ScRangeManagerTable, ScrollHdl, void*, EMPTYARG)
{
CheckForFormulaString();
return 0;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
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