summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sc/source/ui/cctrl/checklistmenu.cxx7
-rw-r--r--sc/source/ui/inc/checklistmenu.hxx4
-rw-r--r--sc/source/ui/inc/gridwin.hxx1
-rw-r--r--sc/source/ui/view/gridwin.cxx74
-rw-r--r--sc/source/ui/view/gridwin2.cxx18
5 files changed, 91 insertions, 13 deletions
diff --git a/sc/source/ui/cctrl/checklistmenu.cxx b/sc/source/ui/cctrl/checklistmenu.cxx
index ed32c8f42bb3..5cf37629d7bd 100644
--- a/sc/source/ui/cctrl/checklistmenu.cxx
+++ b/sc/source/ui/cctrl/checklistmenu.cxx
@@ -1178,15 +1178,14 @@ const Size& ScCheckListMenuWindow::getWindowSize() const
return maWndSize;
}
-void ScCheckListMenuWindow::getResult(boost::unordered_map<OUString, bool, OUStringHash>& rResult)
+void ScCheckListMenuWindow::getResult(ResultType& rResult)
{
- typedef boost::unordered_map<OUString, bool, OUStringHash> ResultMap;
- ResultMap aResult;
+ ResultType aResult;
size_t n = maMembers.size();
for (size_t i = 0; i < n; ++i)
{
bool bState = maChecks.IsChecked(static_cast< sal_uInt16 >( i ));
- aResult.insert(ResultMap::value_type(maMembers[i].maName, bState));
+ aResult.insert(ResultType::value_type(maMembers[i].maName, bState));
}
rResult.swap(aResult);
}
diff --git a/sc/source/ui/inc/checklistmenu.hxx b/sc/source/ui/inc/checklistmenu.hxx
index 6816b063cc24..f2555d16af89 100644
--- a/sc/source/ui/inc/checklistmenu.hxx
+++ b/sc/source/ui/inc/checklistmenu.hxx
@@ -208,6 +208,8 @@ private:
class ScCheckListMenuWindow : public ScMenuFloatingWindow
{
public:
+ typedef boost::unordered_map<rtl::OUString, bool, rtl::OUStringHash> ResultType;
+
/**
* Extended data that the client code may need to store. Create a
* sub-class of this and store data there.
@@ -229,7 +231,7 @@ public:
const Size& getWindowSize() const;
- void getResult(::boost::unordered_map< ::rtl::OUString, bool, ::rtl::OUStringHash>& rResult);
+ void getResult(ResultType& rResult);
void launch(const Rectangle& rRect);
void close(bool bOK);
diff --git a/sc/source/ui/inc/gridwin.hxx b/sc/source/ui/inc/gridwin.hxx
index 0bb6b4de0a6b..00827d9e8985 100644
--- a/sc/source/ui/inc/gridwin.hxx
+++ b/sc/source/ui/inc/gridwin.hxx
@@ -379,6 +379,7 @@ public:
void CheckNeedsRepaint();
+ void UpdateAutoFilterFromMenu();
void UpdateDPFromFieldPopupMenu();
void UpdateVisibleRange();
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index 02486ccc3abf..9ed7fd22a0f4 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -595,14 +595,37 @@ public:
}
};
+struct AutoFilterData : public ScCheckListMenuWindow::ExtendedData
+{
+ ScAddress maPos;
+};
+
+class AutoFilterOKAction : public ScMenuFloatingWindow::Action
+{
+ ScGridWindow* mpWindow;
+public:
+ AutoFilterOKAction(ScGridWindow* p) : mpWindow(p) {}
+
+ virtual void execute()
+ {
+ mpWindow->UpdateAutoFilterFromMenu();
+ }
+};
+
}
void ScGridWindow::LaunchAutoFilterMenu(SCCOL nCol, SCROW nRow)
{
+ SCTAB nTab = pViewData->GetTabNo();
+
mpAutoFilterPopup.reset(new ScCheckListMenuWindow(this, pViewData->GetDocument()));
+ mpAutoFilterPopup->setOKAction(new AutoFilterOKAction(this));
+ std::auto_ptr<AutoFilterData> pData(new AutoFilterData);
+ pData->maPos = ScAddress(nCol, nRow, nTab);
+ mpAutoFilterPopup->setExtendedData(pData.release());
+
Point aPos = pViewData->GetScrPos(nCol, nRow, eWhich);
- SCTAB nTab = pViewData->GetTabNo();
ScDocument* pDoc = pViewData->GetDocument();
long nSizeX = 0;
long nSizeY = 0;
@@ -621,7 +644,7 @@ void ScGridWindow::LaunchAutoFilterMenu(SCCOL nCol, SCROW nRow)
mpAutoFilterPopup->initMembers();
// Populate the menu.
- mpAutoFilterPopup->addMenuItem(ScResId::toString(ScResId(SCSTR_ALLFILTER)), true, new PopupAction);
+// mpAutoFilterPopup->addMenuItem(ScResId::toString(ScResId(SCSTR_ALLFILTER)), true, new PopupAction);
mpAutoFilterPopup->addMenuItem(ScResId::toString(ScResId(SCSTR_TOP10FILTER)), true, new PopupAction);
mpAutoFilterPopup->addMenuItem(ScResId::toString(ScResId(SCSTR_STDFILTER)), true, new PopupAction);
mpAutoFilterPopup->addMenuItem(ScResId::toString(ScResId(SCSTR_EMPTY)), true, new PopupAction);
@@ -631,6 +654,53 @@ void ScGridWindow::LaunchAutoFilterMenu(SCCOL nCol, SCROW nRow)
mpAutoFilterPopup->launch(aCellRect);
}
+void ScGridWindow::UpdateAutoFilterFromMenu()
+{
+ ScCheckListMenuWindow::ResultType aResult;
+ mpAutoFilterPopup->getResult(aResult);
+ size_t nCount = aResult.size();
+ std::vector<rtl::OUString> aSelected;
+ ScCheckListMenuWindow::ResultType::const_iterator itr = aResult.begin(), itrEnd = aResult.end();
+ for (; itr != itrEnd; ++itr)
+ {
+ if (itr->second)
+ aSelected.push_back(itr->first);
+ }
+
+ ScDocument* pDoc = pViewData->GetDocument();
+ const AutoFilterData* pData =
+ static_cast<const AutoFilterData*>(mpAutoFilterPopup->getExtendedData());
+
+ if (!pData)
+ return;
+
+ const ScAddress& rPos = pData->maPos;
+ ScDBData* pDBData = pDoc->GetDBAtCursor(rPos.Col(), rPos.Row(), rPos.Tab());
+ if (!pDBData)
+ return;
+
+ ScQueryParam aParam;
+ pDBData->GetQueryParam(aParam);
+
+ SCSIZE n = aParam.GetEntryCount();
+ for (SCSIZE i = 0; i < n; ++i)
+ {
+ ScQueryEntry& rEntry = aParam.GetEntry(i);
+ rEntry.Clear();
+ }
+
+ if (aSelected.empty())
+ return;
+
+ ScQueryEntry& rEntry = aParam.GetEntry(0);
+ rEntry.bDoQuery = true;
+ rEntry.bQueryByString = true;
+ rEntry.pStr = new String(aSelected[0]);
+
+ pViewData->GetView()->Query(aParam, NULL, true);
+ pDBData->SetQueryParam(aParam);
+}
+
void ScGridWindow::LaunchPageFieldMenu( SCCOL nCol, SCROW nRow )
{
//! merge position/size handling with DoAutoFilterMenue
diff --git a/sc/source/ui/view/gridwin2.cxx b/sc/source/ui/view/gridwin2.cxx
index f791a44a35cc..2688e046a95b 100644
--- a/sc/source/ui/view/gridwin2.cxx
+++ b/sc/source/ui/view/gridwin2.cxx
@@ -545,7 +545,6 @@ void ScGridWindow::DPLaunchFieldPopupMenu(
void ScGridWindow::UpdateDPFromFieldPopupMenu()
{
typedef boost::unordered_map<OUString, OUString, OUStringHash> MemNameMapType;
- typedef boost::unordered_map<OUString, bool, OUStringHash> MemVisibilityType;
if (!mpDPFieldPopup)
return;
@@ -573,20 +572,27 @@ void ScGridWindow::UpdateDPFromFieldPopupMenu()
aMemNameMap.insert(MemNameMapType::value_type(itr->maLayoutName, itr->maName));
// The raw result may contain a mixture of layout names and original names.
- MemVisibilityType aRawResult;
+ ScCheckListMenuWindow::ResultType aRawResult;
mpDPFieldPopup->getResult(aRawResult);
- MemVisibilityType aResult;
- for (MemVisibilityType::const_iterator itr = aRawResult.begin(), itrEnd = aRawResult.end(); itr != itrEnd; ++itr)
+ ScCheckListMenuWindow::ResultType aResult;
+ ScCheckListMenuWindow::ResultType::const_iterator itr = aRawResult.begin(), itrEnd = aRawResult.end();
+ for (; itr != itrEnd; ++itr)
{
MemNameMapType::const_iterator itrNameMap = aMemNameMap.find(itr->first);
if (itrNameMap == aMemNameMap.end())
+ {
// This is an original member name. Use it as-is.
- aResult.insert(MemVisibilityType::value_type(itr->first, itr->second));
+ aResult.insert(
+ ScCheckListMenuWindow::ResultType::value_type(
+ itr->first, itr->second));
+ }
else
{
// This is a layout name. Get the original member name and use it.
- aResult.insert(MemVisibilityType::value_type(itrNameMap->second, itr->second));
+ aResult.insert(
+ ScCheckListMenuWindow::ResultType::value_type(
+ itrNameMap->second, itr->second));
}
}
pDim->UpdateMemberVisibility(aResult);