]> git.saurik.com Git - wxWidgets.git/commitdiff
added multiple selections support to wxDirCtrl (closes #10830)
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 6 Jun 2009 14:00:51 +0000 (14:00 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 6 Jun 2009 14:00:51 +0000 (14:00 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60909 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/generic/dirctrlg.h
interface/wx/dirctrl.h
samples/widgets/dirctrl.cpp
src/generic/dirctrlg.cpp
src/xrc/xh_gdctl.cpp

index 7c0640be7df0c2a3c1a44dd4c8354b543c623eb1..b2ff47f63cc4cdeb23d38128c901b9e273bad1ea 100644 (file)
@@ -51,7 +51,9 @@ enum
     // Use 3D borders on internal controls
     wxDIRCTRL_3D_INTERNAL    = 0x0080,
     // Editable labels
-    wxDIRCTRL_EDIT_LABELS    = 0x0100
+    wxDIRCTRL_EDIT_LABELS    = 0x0100,
+    // Allow multiple selection
+    wxDIRCTRL_MULTIPLE       = 0x0200
 };
 
 //-----------------------------------------------------------------------------
@@ -128,12 +130,17 @@ public:
 
     // Get dir or filename
     virtual wxString GetPath() const;
+    virtual void GetPaths(wxArrayString& paths) const;
 
     // Get selected filename path only (else empty string).
     // I.e. don't count a directory as a selection
     virtual wxString GetFilePath() const;
+    virtual void GetFilePaths(wxArrayString& paths) const;
     virtual void SetPath(const wxString& path);
 
+    virtual void SelectPath(const wxString& path, bool select = true);
+    virtual void SelectPaths(const wxArrayString& paths);
+
     virtual void ShowHidden( bool show );
     virtual bool GetShowHidden() { return m_showHidden; }
 
@@ -148,6 +155,8 @@ public:
     virtual wxTreeCtrl* GetTreeCtrl() const { return m_treeCtrl; }
     virtual wxDirFilterListCtrl* GetFilterListCtrl() const { return m_filterListCtrl; }
 
+    virtual void UnselectAll();
+
     // Helper
     virtual void SetupSections();
 
@@ -166,7 +175,6 @@ public:
     // Collapse the entire tree
     virtual void CollapseTree();
 
-
     // overridden base class methods
     virtual void SetFocus();
 
index 4769c9277259f0138ca95066d14f6436f99d7658..fa10290f49a1caaad55e32cbb43192a7f19c6900 100644 (file)
@@ -25,6 +25,8 @@
            directory.
     @style{wxDIRCTRL_EDIT_LABELS}
            Allow the folder and file labels to be editable.
+    @style{wxDIRCTRL_MULTIPLE}
+           Allows multiple files and folders to be selected.
     @endStyleTable
 
     @library{wxbase}
@@ -118,6 +120,13 @@ public:
     */
     virtual wxString GetFilePath() const;
 
+    /**
+        Fills the array @a paths with the currently selected filepaths.
+
+        This function doesn't count a directory as a selection.
+    */
+    virtual void GetFilePaths(wxArrayString& paths) const;
+
     /**
         Returns the filter string.
     */
@@ -138,6 +147,11 @@ public:
     */
     virtual wxString GetPath() const;
 
+    /**
+        Fills the array @a paths with the selected directories and filenames.
+    */
+    virtual void GetPaths(wxArrayString& paths) const;
+
     /**
         Returns the root id for the tree control.
     */
@@ -185,5 +199,27 @@ public:
             control. If @false, they will not be displayed.
     */
     virtual void ShowHidden(bool show);
+
+    /**
+        Selects the given item.
+
+        In multiple selection controls, can be also used to deselect a
+        currently selected item if the value of @a select is false.
+        Existing selections are not changed. Only visible items can be
+        (de)selected, otherwise use ExpandPath().
+    */
+    virtual void SelectPath(const wxString& path, bool select = true);
+
+    /**
+        Selects only the specified paths, clearing any previous selection.
+
+        Only supported when wxDIRCTRL_MULTIPLE is set.
+    */
+    virtual void SelectPaths(const wxArrayString& paths);
+
+    /**
+        Removes the selection from all currently selected items.
+    */
+    virtual void UnselectAll();
 };
 
index 654e256197b5c2560ce5228104919f1f85b23285..1d8ad59cbd38ede41763d2df59e248ad69544dec 100644 (file)
@@ -133,7 +133,9 @@ protected:
     wxCheckBox *m_chkDirOnly,
                *m_chk3D,
                *m_chkFirst,
-               *m_chkLabels;
+               *m_chkLabels,
+               *m_chkMulti;
+
     // filters
     wxCheckBox *m_fltr[3];
 
@@ -185,6 +187,7 @@ void DirCtrlWidgetsPage::CreateContent()
     m_chk3D      = CreateCheckBoxAndAddToSizer(sizerUseFlags, _T("wxDIRCTRL_3D_INTERNAL"));
     m_chkFirst   = CreateCheckBoxAndAddToSizer(sizerUseFlags, _T("wxDIRCTRL_SELECT_FIRST"));
     m_chkLabels  = CreateCheckBoxAndAddToSizer(sizerUseFlags, _T("wxDIRCTRL_EDIT_LABELS"));
+    m_chkMulti   = CreateCheckBoxAndAddToSizer(sizerUseFlags, _T("wxDIRCTRL_MULTIPLE"));
     sizerLeft->Add(sizerUseFlags, wxSizerFlags().Expand().Border());
 
     wxSizer *sizerFilters =
@@ -245,13 +248,14 @@ void DirCtrlWidgetsPage::CreateDirCtrl()
         ( m_chkDirOnly->IsChecked() ? wxDIRCTRL_DIR_ONLY : 0 ) |
         ( m_chk3D->IsChecked() ? wxDIRCTRL_3D_INTERNAL : 0 ) |
         ( m_chkFirst->IsChecked() ? wxDIRCTRL_SELECT_FIRST : 0 ) |
-        ( m_chkLabels->IsChecked() ? wxDIRCTRL_EDIT_LABELS : 0 )
+        ( m_chkLabels->IsChecked() ? wxDIRCTRL_EDIT_LABELS : 0 ) |
+        ( m_chkMulti->IsChecked() ? wxDIRCTRL_MULTIPLE : 0)
     );
 
     wxString filter;
-    for (int i = 0; i < 3; ++i) 
+    for (int i = 0; i < 3; ++i)
     {
-        if (m_fltr[i]->IsChecked()) 
+        if (m_fltr[i]->IsChecked())
         {
             if (!filter.IsEmpty())
                 filter += wxT("|");
index b50262b473d8f29d4e1f28196333aa3948753d3c..9bb119ebea1bc63dca59e602ed82108c275f8be8 100644 (file)
@@ -472,6 +472,7 @@ wxBEGIN_FLAGS( wxGenericDirCtrlStyle )
     wxFLAGS_MEMBER(wxDIRCTRL_DIR_ONLY)
     wxFLAGS_MEMBER(wxDIRCTRL_3D_INTERNAL)
     wxFLAGS_MEMBER(wxDIRCTRL_SELECT_FIRST)
+    wxFLAGS_MEMBER(wxDIRCTRL_MULTIPLE)
 
 wxEND_FLAGS( wxGenericDirCtrlStyle )
 
@@ -560,6 +561,9 @@ bool wxGenericDirCtrl::Create(wxWindow *parent,
     if (style & wxDIRCTRL_EDIT_LABELS)
         treeStyle |= wxTR_EDIT_LABELS;
 
+    if (style & wxDIRCTRL_MULTIPLE)
+        treeStyle |= wxTR_MULTIPLE;
+
     if ((style & wxDIRCTRL_3D_INTERNAL) == 0)
         treeStyle |= wxNO_BORDER;
 
@@ -629,9 +633,22 @@ void wxGenericDirCtrl::ShowHidden( bool show )
 
     m_showHidden = show;
 
-    wxString path = GetPath();
-    ReCreateTree();
-    SetPath(path);
+    if ( HasFlag(wxDIRCTRL_MULTIPLE) )
+    {
+        wxArrayString paths;
+        GetPaths(paths);
+        ReCreateTree();
+        for ( unsigned n = 0; n < paths.size(); n++ )
+        {
+            ExpandPath(paths[n]);
+        }
+    }
+    else
+    {
+        wxString path = GetPath();
+        ReCreateTree();
+        SetPath(path);
+    }
 }
 
 const wxTreeItemId
@@ -1095,6 +1112,20 @@ wxString wxGenericDirCtrl::GetPath() const
         return wxEmptyString;
 }
 
+void wxGenericDirCtrl::GetPaths(wxArrayString& paths) const
+{
+    paths.clear();
+
+    wxArrayTreeItemIds items;
+    m_treeCtrl->GetSelections(items);
+    for ( unsigned n = 0; n < items.size(); n++ )
+    {
+        wxTreeItemId id = items[n];
+        wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id);
+        paths.Add(data->m_path);
+    }
+}
+
 wxString wxGenericDirCtrl::GetFilePath() const
 {
     wxTreeItemId id = m_treeCtrl->GetSelection();
@@ -1110,6 +1141,21 @@ wxString wxGenericDirCtrl::GetFilePath() const
         return wxEmptyString;
 }
 
+void wxGenericDirCtrl::GetFilePaths(wxArrayString& paths) const
+{
+    paths.clear();
+
+    wxArrayTreeItemIds items;
+    m_treeCtrl->GetSelections(items);
+    for ( unsigned n = 0; n < items.size(); n++ )
+    {
+        wxTreeItemId id = items[n];
+        wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id);
+        if ( !data->m_isDir )
+            paths.Add(data->m_path);
+    }
+}
+
 void wxGenericDirCtrl::SetPath(const wxString& path)
 {
     m_defaultPath = path;
@@ -1117,6 +1163,48 @@ void wxGenericDirCtrl::SetPath(const wxString& path)
         ExpandPath(path);
 }
 
+void wxGenericDirCtrl::SelectPath(const wxString& path, bool select)
+{
+    bool done = false;
+    wxTreeItemId id = FindChild(m_rootId, path, done);
+    wxTreeItemId lastId = id; // The last non-zero id
+    while ( id.IsOk() && !done )
+    {
+        id = FindChild(id, path, done);
+        if ( id.IsOk() )
+            lastId = id;
+    }
+    if ( !lastId.IsOk() )
+        return;
+
+    if ( done )
+    {
+        if(select && m_treeCtrl->IsSelected(id))
+            return;
+        else
+        {
+            m_treeCtrl->SelectItem(id, select);
+        }
+    }
+}
+
+void wxGenericDirCtrl::SelectPaths(const wxArrayString& paths)
+{
+    if ( HasFlag(wxDIRCTRL_MULTIPLE) )
+    {
+        UnselectAll();
+        for ( unsigned n = 0; n < paths.size(); n++ )
+        {
+            SelectPath(paths[n]);
+        }
+    }
+}
+
+void wxGenericDirCtrl::UnselectAll()
+{
+    m_treeCtrl->UnselectAll();
+}
+
 // Not used
 #if 0
 void wxGenericDirCtrl::FindChildFiles(wxTreeItemId id, int dirFlags, wxArrayString& filenames)
index bbd0a0df59217405a6f6c1215d5a138ecdab2cb6..367ab6048954f0a1e002b9ec042e132969dc5286 100644 (file)
@@ -34,6 +34,7 @@ wxGenericDirCtrlXmlHandler::wxGenericDirCtrlXmlHandler()
     XRC_ADD_STYLE(wxDIRCTRL_3D_INTERNAL);
     XRC_ADD_STYLE(wxDIRCTRL_SELECT_FIRST);
     XRC_ADD_STYLE(wxDIRCTRL_EDIT_LABELS);
+    XRC_ADD_STYLE(wxDIRCTRL_MULTIPLE);
     AddWindowStyles();
 }