diff options
-rw-r--r-- | sc/source/ui/cctrl/checklistmenu.cxx | 7 | ||||
-rw-r--r-- | sc/source/ui/inc/checklistmenu.hxx | 4 | ||||
-rw-r--r-- | sc/source/ui/inc/gridwin.hxx | 1 | ||||
-rw-r--r-- | sc/source/ui/view/gridwin.cxx | 74 | ||||
-rw-r--r-- | sc/source/ui/view/gridwin2.cxx | 18 |
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); |