[Libreoffice-commits] core.git: Branch 'libreoffice-4-3' - sc/inc sc/sdi sc/source

Kohei Yoshida kohei.yoshida at collabora.com
Fri May 23 08:28:26 PDT 2014


 sc/inc/sc.hrc                          |    1 
 sc/sdi/cellsh.sdi                      |    1 
 sc/sdi/scalc.sdi                       |   23 +++++++++++
 sc/source/ui/app/scdll.cxx             |    2 
 sc/source/ui/dialogs/searchresults.cxx |   68 +++++++++++++++++++++++++++------
 sc/source/ui/inc/searchresults.hxx     |   34 ++++++++++++++--
 sc/source/ui/view/cellsh1.cxx          |   15 +++++++
 sc/source/ui/view/tabvwsh.cxx          |    5 +-
 sc/source/ui/view/viewfun2.cxx         |   14 +++++-
 9 files changed, 144 insertions(+), 19 deletions(-)

New commits:
commit 0f867f052d2672fdb91ee3be9e056ae97a8e642c
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Fri May 23 11:24:24 2014 -0400

    fdo#79011: Properly implement the search results dialog as modeless.
    
    It's unfortunate that adding a modeless dialog is such a pain.  But we
    still need to implemenet this properly else we'll leak at best, or end
    up with tons of weird bugs at worst.
    
    Change-Id: Ie03260f288fad76f994d0ca6a8b1feeade299ffd
    (cherry picked from commit 81c492ef18b04cc283561018d69818cbca7f83ef)

diff --git a/sc/inc/sc.hrc b/sc/inc/sc.hrc
index 2253aac..5204efb 100644
--- a/sc/inc/sc.hrc
+++ b/sc/inc/sc.hrc
@@ -270,6 +270,7 @@
 #define SID_MOVING_AVERAGE_DIALOG           (SC_MESSAGE_START + 77)
 #define SID_TTEST_DIALOG                    (SC_MESSAGE_START + 78)
 #define SID_FTEST_DIALOG                    (SC_MESSAGE_START + 79)
+#define SID_SEARCH_RESULTS_DIALOG           (SC_MESSAGE_START + 80)
 
 // functions
 
diff --git a/sc/sdi/cellsh.sdi b/sc/sdi/cellsh.sdi
index 62ce485..8447768 100644
--- a/sc/sdi/cellsh.sdi
+++ b/sc/sdi/cellsh.sdi
@@ -161,6 +161,7 @@ interface CellSelection
     SID_MOVING_AVERAGE_DIALOG           [ ExecMethod = ExecuteEdit; StateMethod = GetBlockState; ]
     SID_TTEST_DIALOG                    [ ExecMethod = ExecuteEdit; StateMethod = GetBlockState; ]
     SID_FTEST_DIALOG                    [ ExecMethod = ExecuteEdit; StateMethod = GetBlockState; ]
+    SID_SEARCH_RESULTS_DIALOG [ ExecMethod = ExecuteEdit; StateMethod = GetBlockState; ]
     SID_MARKDATAAREA    [ ExecMethod = ExecuteMove; StateMethod = GetStateCursor; ]
     SID_MARKARRAYFORMULA [ ExecMethod = ExecuteMove; StateMethod = GetStateCursor; ]
     SID_SETINPUTMODE    [ ExecMethod = ExecuteMove; StateMethod = GetStateCursor; ]
diff --git a/sc/sdi/scalc.sdi b/sc/sdi/scalc.sdi
index fe3d780..1835459 100644
--- a/sc/sdi/scalc.sdi
+++ b/sc/sdi/scalc.sdi
@@ -3231,6 +3231,29 @@ SfxVoidItem SolverDialog SID_OPENDLG_OPTSOLVER
     GroupId = GID_OPTIONS;
 ]
 
+SfxVoidItem SearchResultsDialog SID_SEARCH_RESULTS_DIALOG
+()
+[
+    /* flags: */
+    AutoUpdate = FALSE,
+    Cachable = Cachable,
+    FastCall = FALSE,
+    HasCoreId = FALSE,
+    HasDialog = TRUE,
+    ReadOnlyDoc = TRUE,
+    Toggle = FALSE,
+    Container = FALSE,
+    RecordAbsolute = FALSE,
+    RecordPerSet;
+    Synchron;
+
+    /* config: */
+    AccelConfig = TRUE,
+    MenuConfig = TRUE,
+    StatusBarConfig = FALSE,
+    ToolBoxConfig = TRUE,
+    GroupId = GID_OPTIONS;
+]
 
 SfxVoidItem ValidityReference SID_VALIDITY_REFERENCE
 ()
diff --git a/sc/source/ui/app/scdll.cxx b/sc/source/ui/app/scdll.cxx
index d4cf759..9f9f839 100644
--- a/sc/source/ui/app/scdll.cxx
+++ b/sc/source/ui/app/scdll.cxx
@@ -72,6 +72,7 @@
 
 #include "docpool.hxx"
 #include "appoptio.hxx"
+#include <searchresults.hxx>
 
 // Controls
 
@@ -285,6 +286,7 @@ void ScDLL::Init()
     ScSpellDialogChildWindow    ::RegisterChildWindow(false, pMod);
 
     ScValidityRefChildWin::RegisterChildWindow(false, pMod);
+    sc::SearchResultsDlgWrapper::RegisterChildWindow(false, pMod);
 
     // EditEngine Field; insofar not already defined in OfficeApplication::Init
     SvClassManager& rClassManager = SvxFieldItem::GetClassManager();
diff --git a/sc/source/ui/dialogs/searchresults.cxx b/sc/source/ui/dialogs/searchresults.cxx
index 3b27a2a..51c5ece 100644
--- a/sc/source/ui/dialogs/searchresults.cxx
+++ b/sc/source/ui/dialogs/searchresults.cxx
@@ -11,14 +11,19 @@
 
 #include <svtools/simptabl.hxx>
 #include <svtools/treelistentry.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
 #include "dociter.hxx"
 #include "document.hxx"
 #include "rangeutl.hxx"
 #include "tabvwsh.hxx"
+#include <sc.hrc>
 
-SearchResults::SearchResults(ScDocument *pDoc) :
-    ModelessDialog(NULL, "SearchResultsDialog", "modules/scalc/ui/searchresults.ui")
-    , mpDoc(pDoc)
+namespace sc {
+
+SearchResultsDlg::SearchResultsDlg( SfxBindings* _pBindings, Window* pParent, sal_uInt16 nId ) :
+    ModelessDialog(pParent, "SearchResultsDialog", "modules/scalc/ui/searchresults.ui"),
+    mpBindings(_pBindings), mnId(nId), mpDoc(NULL)
 {
     SvSimpleTableContainer *pContainer = get<SvSimpleTableContainer>("results");
     Size aControlSize(150, 120);
@@ -30,36 +35,56 @@ SearchResults::SearchResults(ScDocument *pDoc) :
     long nTabs[] = {3, 0, 40, 60};
     mpList->SetTabs(&nTabs[0]);
     mpList->InsertHeaderEntry("Sheet\tCell\tContent");
-    mpList->SetSelectHdl( LINK(this, SearchResults, ListSelectHdl) );
+    mpList->SetSelectHdl( LINK(this, SearchResultsDlg, ListSelectHdl) );
 }
 
-SearchResults::~SearchResults()
+SearchResultsDlg::~SearchResultsDlg()
 {
     delete mpList;
 }
 
-void SearchResults::Show(const ScRangeList &rMatchedRanges)
+void SearchResultsDlg::FillResults( ScDocument* pDoc, const ScRangeList &rMatchedRanges )
 {
     mpList->Clear();
     mpList->SetUpdateMode(false);
     for (size_t i = 0, n = rMatchedRanges.size(); i < n; ++i)
     {
-        ScCellIterator aIter(mpDoc, *rMatchedRanges[i]);
+        ScCellIterator aIter(pDoc, *rMatchedRanges[i]);
         for (bool bHas = aIter.first(); bHas; bHas = aIter.next())
         {
             ScAddress aAddress = aIter.GetPos();
             OUString sAddress;
             ScRangeStringConverter::GetStringFromAddress(sAddress, aAddress,
-                    mpDoc, formula::FormulaGrammar::CONV_OOO);
-            mpList->InsertEntry(sAddress.replace('.', '\t') + "\t" + mpDoc->GetString(aAddress));
+                    pDoc, formula::FormulaGrammar::CONV_OOO);
+            mpList->InsertEntry(sAddress.replace('.', '\t') + "\t" + pDoc->GetString(aAddress));
         }
     }
     mpList->SetUpdateMode(true);
-    ModelessDialog::Show();
+
+    mpDoc = pDoc;
+}
+
+bool SearchResultsDlg::Close()
+{
+    if (mpBindings)
+    {
+        // Remove this dialog from the view frame after the dialog gets
+        // dismissed, else it would keep popping up endlessly!
+        SfxDispatcher* pDispacher = mpBindings ->GetDispatcher();
+        SfxBoolItem aItem(SID_SEARCH_RESULTS_DIALOG, false);
+        if (pDispacher)
+            pDispacher->Execute(
+                SID_SEARCH_RESULTS_DIALOG, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L);
+    }
+
+    return ModelessDialog::Close();
 }
 
-IMPL_LINK_NOARG( SearchResults, ListSelectHdl )
+IMPL_LINK_NOARG( SearchResultsDlg, ListSelectHdl )
 {
+    if (!mpDoc)
+        return 0;
+
     SvTreeListEntry *pEntry = mpList->FirstSelected();
     ScAddress aAddress;
     sal_Int32 nOffset = 0;
@@ -70,7 +95,28 @@ IMPL_LINK_NOARG( SearchResults, ListSelectHdl )
     pScViewShell->SetTabNo(aAddress.Tab());
     pScViewShell->SetCursor(aAddress.Col(), aAddress.Row());
     pScViewShell->AlignToCursor(aAddress.Col(), aAddress.Row(), SC_FOLLOW_JUMP);
+
     return 0;
 }
 
+SearchResultsDlgWrapper::SearchResultsDlgWrapper(
+    Window* _pParent, sal_uInt16 nId, SfxBindings* pBindings, SfxChildWinInfo* /*pInfo*/ ) :
+    SfxChildWindow(_pParent, nId)
+{
+    pWindow = new SearchResultsDlg(pBindings, _pParent, nId);
+}
+
+SearchResultsDlgWrapper::~SearchResultsDlgWrapper() {}
+
+SfxChildWinInfo SearchResultsDlgWrapper::GetInfo() const
+{
+    SfxChildWinInfo aInfo = SfxChildWindow::GetInfo();
+    aInfo.bVisible = false;
+    return aInfo;
+}
+
+SFX_IMPL_CHILDWINDOW_WITHID(SearchResultsDlgWrapper, SID_SEARCH_RESULTS_DIALOG);
+
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/inc/searchresults.hxx b/sc/source/ui/inc/searchresults.hxx
index aa03069..efb35f8 100644
--- a/sc/source/ui/inc/searchresults.hxx
+++ b/sc/source/ui/inc/searchresults.hxx
@@ -11,21 +11,45 @@
 #define INCLUDED_SC_SOURCE_UI_INC_SEARCHRESULTS_HXX
 
 #include <vcl/dialog.hxx>
+#include <sfx2/childwin.hxx>
+
 class ScDocument;
 class ScRangeList;
 class SvSimpleTable;
 
-class SearchResults : public ModelessDialog
+namespace sc {
+
+class SearchResultsDlg : public ModelessDialog
 {
-    ScDocument *mpDoc;
     SvSimpleTable *mpList;
+    SfxBindings* mpBindings;
+    sal_uInt16 mnId;
+
+    ScDocument* mpDoc;
+
     DECL_LINK( ListSelectHdl, void * );
 public:
-    SearchResults(ScDocument *);
-    virtual ~SearchResults();
-    void Show(const ScRangeList &);
+    SearchResultsDlg( SfxBindings* _pBindings, Window* pParent, sal_uInt16 nId );
+    virtual ~SearchResultsDlg();
+
+    void FillResults( ScDocument* pDoc, const ScRangeList& rMatchedRanges );
+
+    virtual bool Close() SAL_OVERRIDE;
 };
 
+class SearchResultsDlgWrapper : public SfxChildWindow
+{
+public:
+    SearchResultsDlgWrapper(
+        Window* _pParent, sal_uInt16 nId, SfxBindings* pBindings, SfxChildWinInfo* pInfo );
+
+    virtual ~SearchResultsDlgWrapper();
+
+    SFX_DECL_CHILDWINDOW_WITHID(SearchResultsDlgWrapper);
+};
+
+}
+
 #endif
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx
index 8781fb7..9ca1e1a 100644
--- a/sc/source/ui/view/cellsh1.cxx
+++ b/sc/source/ui/view/cellsh1.cxx
@@ -84,6 +84,7 @@
 #include <tokenarray.hxx>
 #include <formulacell.hxx>
 #include <gridwin.hxx>
+#include <searchresults.hxx>
 
 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
 #include <com/sun/star/lang/XInitialization.hpp>
@@ -998,6 +999,20 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq )
             }
             break;
 
+        case SID_SEARCH_RESULTS_DIALOG:
+        {
+            const SfxPoolItem* pItem = NULL;
+            if (pReqArgs->HasItem(SID_SEARCH_RESULTS_DIALOG, &pItem))
+            {
+                bool bVisible = static_cast<const SfxBoolItem*>(pItem)->GetValue();
+                SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
+                // The window ID should equal the slot ID, but not a biggie if it wasn't.
+                sal_uInt16 nId = sc::SearchResultsDlgWrapper::GetChildWindowId();
+                pViewFrm->SetChildWindow(nId, bVisible, false);
+            }
+            rReq.Done();
+        }
+        break;
 
         //  disposal (Outlines)
         //  SID_AUTO_OUTLINE, SID_OUTLINE_DELETEALL in Execute (in docsh.idl)
diff --git a/sc/source/ui/view/tabvwsh.cxx b/sc/source/ui/view/tabvwsh.cxx
index 42baf8d..01e61d9 100644
--- a/sc/source/ui/view/tabvwsh.cxx
+++ b/sc/source/ui/view/tabvwsh.cxx
@@ -20,6 +20,7 @@
 #include "scitems.hxx"
 #include <svx/galbrws.hxx>
 #include <svx/imapdlg.hxx>
+#include <svx/srchdlg.hxx>
 #include <svl/srchitem.hxx>
 #include <sfx2/templdlg.hxx>
 #include <sfx2/objface.hxx>
@@ -39,6 +40,7 @@
 #include "dwfunctr.hxx"
 #include "sc.hrc"
 #include "spelldialog.hxx"
+#include <searchresults.hxx>
 
 #define ScTabViewShell
 #include "scslots.hxx"
@@ -79,11 +81,12 @@ void ScTabViewShell::InitInterface_Impl()
     GetStaticInterface()->RegisterChildWindow(ScAcceptChgDlgWrapper::GetChildWindowId());
     GetStaticInterface()->RegisterChildWindow(ScHighlightChgDlgWrapper::GetChildWindowId());
     GetStaticInterface()->RegisterChildWindow(ScSimpleRefDlgWrapper::GetChildWindowId());
-    GetStaticInterface()->RegisterChildWindow(SID_SEARCH_DLG);
+    GetStaticInterface()->RegisterChildWindow(SvxSearchDialogWrapper::GetChildWindowId());
     GetStaticInterface()->RegisterChildWindow(SID_HYPERLINK_DIALOG);
     GetStaticInterface()->RegisterChildWindow(GalleryChildWindow::GetChildWindowId());
     GetStaticInterface()->RegisterChildWindow(ScSpellDialogChildWindow::GetChildWindowId());
     GetStaticInterface()->RegisterChildWindow(ScValidityRefChildWin::GetChildWindowId());
+    GetStaticInterface()->RegisterChildWindow(sc::SearchResultsDlgWrapper::GetChildWindowId());
 
     GetStaticInterface()->RegisterChildWindow(ScRandomNumberGeneratorDialogWrapper::GetChildWindowId());
     GetStaticInterface()->RegisterChildWindow(ScSamplingDialogWrapper::GetChildWindowId());
diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx
index 3bbb8e2..85ec403 100644
--- a/sc/source/ui/view/viewfun2.cxx
+++ b/sc/source/ui/view/viewfun2.cxx
@@ -1580,8 +1580,18 @@ bool ScViewFunc::SearchAndReplace( const SvxSearchItem* pSearchItem,
 
             if (nCommand == SVX_SEARCHCMD_FIND_ALL || nCommand == SVX_SEARCHCMD_REPLACE_ALL)
             {
-                SearchResults aSearchResults(pDoc);
-                aSearchResults.Show(aMatchedRanges);
+                SfxViewFrame* pViewFrm = SfxViewFrame::Current();
+                if (pViewFrm)
+                {
+                    pViewFrm->ShowChildWindow(sc::SearchResultsDlgWrapper::GetChildWindowId(), true);
+                    SfxChildWindow* pWnd = pViewFrm->GetChildWindow(sc::SearchResultsDlgWrapper::GetChildWindowId());
+                    if (pWnd)
+                    {
+                        sc::SearchResultsDlg* pDlg = static_cast<sc::SearchResultsDlg*>(pWnd->GetWindow());
+                        if (pDlg)
+                            pDlg->FillResults(pDoc, aMatchedRanges);
+                    }
+                }
 
                 rMark.ResetMark();
                 for (size_t i = 0, n = aMatchedRanges.size(); i < n; ++i)


More information about the Libreoffice-commits mailing list