[Libreoffice-commits] .: Branch 'feature/new-autofilter-popup' - sc/source

Kohei Yoshida kohei at kemper.freedesktop.org
Thu Nov 3 12:59:05 PDT 2011


 sc/source/ui/cctrl/checklistmenu.cxx |    7 +--
 sc/source/ui/inc/checklistmenu.hxx   |    4 +
 sc/source/ui/inc/gridwin.hxx         |    1 
 sc/source/ui/view/gridwin.cxx        |   74 ++++++++++++++++++++++++++++++++++-
 sc/source/ui/view/gridwin2.cxx       |   18 +++++---
 5 files changed, 91 insertions(+), 13 deletions(-)

New commits:
commit daa79d76ff32274849d25c6c396bd2474088c3e8
Author: Kohei Yoshida <kohei.yoshida at suse.com>
Date:   Thu Nov 3 15:58:49 2011 -0400

    Test-run the filter query after pressing OK. It's far from perfect.

diff --git a/sc/source/ui/cctrl/checklistmenu.cxx b/sc/source/ui/cctrl/checklistmenu.cxx
index ed32c8f..5cf3762 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 6816b06..f2555d1 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 0bb6b4d..00827d9 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 02486cc..9ed7fd2 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 f791a44..2688e04 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);


More information about the Libreoffice-commits mailing list