]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dirctrlg.cpp
Ensure there is valid context for DrawRectangle
[wxWidgets.git] / src / generic / dirctrlg.cpp
index fae330fa03a1faf36b320df3eb3236734e60efbf..78f8ffc2529a39b3dcecff52ee41e5759ce16fd0 100644 (file)
@@ -29,7 +29,6 @@
     #include "wx/icon.h"
     #include "wx/settings.h"
     #include "wx/msgdlg.h"
-    #include "wx/cmndata.h"
     #include "wx/choice.h"
     #include "wx/textctrl.h"
     #include "wx/layout.h"
@@ -56,7 +55,7 @@
     #include  "wx/osx/private.h"  // includes mac headers
 #endif
 
-#ifdef __WXMSW__
+#ifdef __WINDOWS__
 #include <windows.h>
 #include "wx/msw/winundef.h"
 #include "wx/volume.h"
@@ -72,7 +71,7 @@
     #include <ctype.h>
 #endif
 
-#endif
+#endif // __WINDOWS__
 
 #if defined(__OS2__) || defined(__DOS__)
     #ifdef __OS2__
@@ -103,6 +102,12 @@ extern WXDLLEXPORT_DATA(const char) wxFileSelectorDefaultWildcardStr[];
 
 bool wxIsDriveAvailable(const wxString& dirName);
 
+// ----------------------------------------------------------------------------
+// events
+// ----------------------------------------------------------------------------
+
+wxDEFINE_EVENT( wxEVT_COMMAND_DIRCTRL_CHANGED, wxTreeEvent );
+
 // ----------------------------------------------------------------------------
 // wxGetAvailableDrives, for WINDOWS, DOS, OS2, MAC, UNIX (returns "/")
 // ----------------------------------------------------------------------------
@@ -251,7 +256,7 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI
         }
     }
 
-#elif defined(__UNIX__) || defined(__WXPALMOS__)
+#elif defined(__UNIX__)
     paths.Add(wxT("/"));
     names.Add(wxT("/"));
     icon_ids.Add(wxFileIconsTable::computer);
@@ -271,7 +276,7 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI
 
 bool wxIsDriveAvailable(const wxString& dirName)
 {
-    // FIXME_MGL - this method leads to hang up under Watcom for some reason
+    // FIXME: this method leads to hang up under Watcom for some reason
 #ifdef __WATCOMC__
     wxUnusedVar(dirName);
 #else
@@ -311,7 +316,7 @@ int setdrive(int WXUNUSED_IN_WINCE(drive))
 #else
     newdrive[2] = wxT('\0');
 #endif
-#if defined(__WXMSW__)
+#if defined(__WINDOWS__)
     if (::SetCurrentDirectory(newdrive))
 #else
     // VA doesn't know what LPSTR is and has its own set
@@ -442,6 +447,7 @@ BEGIN_EVENT_TABLE(wxGenericDirCtrl, wxControl)
   EVT_TREE_ITEM_COLLAPSED     (wxID_TREECTRL, wxGenericDirCtrl::OnCollapseItem)
   EVT_TREE_BEGIN_LABEL_EDIT   (wxID_TREECTRL, wxGenericDirCtrl::OnBeginEditItem)
   EVT_TREE_END_LABEL_EDIT     (wxID_TREECTRL, wxGenericDirCtrl::OnEndEditItem)
+  EVT_TREE_SEL_CHANGED        (wxID_TREECTRL, wxGenericDirCtrl::OnTreeSelChange)
   EVT_SIZE                    (wxGenericDirCtrl::OnSize)
 END_EVENT_TABLE()
 
@@ -471,7 +477,7 @@ void wxGenericDirCtrl::ExpandRoot()
 }
 
 bool wxGenericDirCtrl::Create(wxWindow *parent,
-                              const wxWindowID id,
+                              const wxWindowID treeid,
                               const wxString& dir,
                               const wxPoint& pos,
                               const wxSize& size,
@@ -480,7 +486,7 @@ bool wxGenericDirCtrl::Create(wxWindow *parent,
                               int defaultFilter,
                               const wxString& name)
 {
-    if (!wxControl::Create(parent, id, pos, size, style, wxDefaultValidator, name))
+    if (!wxControl::Create(parent, treeid, pos, size, style, wxDefaultValidator, name))
         return false;
 
     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
@@ -512,7 +518,7 @@ bool wxGenericDirCtrl::Create(wxWindow *parent,
     m_treeCtrl = CreateTreeCtrl(this, wxID_TREECTRL,
                                 wxPoint(0,0), GetClientSize(), treeStyle);
 
-    if (!filter.empty())
+    if (!filter.empty() && (style & wxDIRCTRL_SHOW_FILTERS))
         m_filterListCtrl = new wxDirFilterListCtrl(this, wxID_FILTERLISTCTRL);
 
     m_defaultPath = dir;
@@ -563,9 +569,9 @@ void wxGenericDirCtrl::Init()
     m_filterListCtrl = NULL;
 }
 
-wxTreeCtrl* wxGenericDirCtrl::CreateTreeCtrl(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long treeStyle)
+wxTreeCtrl* wxGenericDirCtrl::CreateTreeCtrl(wxWindow *parent, wxWindowID treeid, const wxPoint& pos, const wxSize& size, long treeStyle)
 {
-    return new wxTreeCtrl(parent, id, pos, size, treeStyle);
+    return new wxTreeCtrl(parent, treeid, pos, size, treeStyle);
 }
 
 void wxGenericDirCtrl::ShowHidden( bool show )
@@ -598,11 +604,11 @@ wxGenericDirCtrl::AddSection(const wxString& path, const wxString& name, int ima
 {
     wxDirItemData *dir_item = new wxDirItemData(path,name,true);
 
-    wxTreeItemId id = AppendItem( m_rootId, name, imageId, -1, dir_item);
+    wxTreeItemId treeid = AppendItem( m_rootId, name, imageId, -1, dir_item);
 
-    m_treeCtrl->SetItemHasChildren(id);
+    m_treeCtrl->SetItemHasChildren(treeid);
 
-    return id;
+    return treeid;
 }
 
 void wxGenericDirCtrl::SetupSections()
@@ -666,8 +672,8 @@ void wxGenericDirCtrl::OnEndEditItem(wxTreeEvent &event)
         return;
     }
 
-    wxTreeItemId id = event.GetItem();
-    wxDirItemData *data = (wxDirItemData*)m_treeCtrl->GetItemData( id );
+    wxTreeItemId treeid = event.GetItem();
+    wxDirItemData *data = GetItemData( treeid );
     wxASSERT( data );
 
     wxString new_name( wxPathOnly( data->m_path ) );
@@ -695,6 +701,24 @@ void wxGenericDirCtrl::OnEndEditItem(wxTreeEvent &event)
     }
 }
 
+void wxGenericDirCtrl::OnTreeSelChange(wxTreeEvent &event)
+{
+    wxTreeEvent changedEvent(wxEVT_COMMAND_DIRCTRL_CHANGED, GetId());
+
+    changedEvent.SetEventObject(this);
+    changedEvent.SetItem(event.GetItem());
+    changedEvent.SetClientObject(m_treeCtrl->GetItemData(event.GetItem()));
+
+    if (GetEventHandler()->SafelyProcessEvent(changedEvent) && !changedEvent.IsAllowed())
+    {
+        event.Veto();
+    }
+    else
+    {
+        event.Skip();
+    }
+}
+
 void wxGenericDirCtrl::OnExpandItem(wxTreeEvent &event)
 {
     wxTreeItemId parentId = event.GetItem();
@@ -717,7 +741,7 @@ void wxGenericDirCtrl::CollapseDir(wxTreeItemId parentId)
 {
     wxTreeItemId child;
 
-    wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(parentId);
+    wxDirItemData *data = GetItemData(parentId);
     if (!data->m_isExpanded)
         return;
 
@@ -732,7 +756,7 @@ void wxGenericDirCtrl::CollapseDir(wxTreeItemId parentId)
 
 void wxGenericDirCtrl::PopulateNode(wxTreeItemId parentId)
 {
-    wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(parentId);
+    wxDirItemData *data = GetItemData(parentId);
 
     if (data->m_isExpanded)
         return;
@@ -844,9 +868,9 @@ void wxGenericDirCtrl::PopulateNode(wxTreeItemId parentId)
         path += eachFilename;
 
         wxDirItemData *dir_item = new wxDirItemData(path,eachFilename,true);
-        wxTreeItemId id = AppendItem( parentId, eachFilename,
+        wxTreeItemId treeid = AppendItem( parentId, eachFilename,
                                       wxFileIconsTable::folder, -1, dir_item);
-        m_treeCtrl->SetItemImage( id, wxFileIconsTable::folder_open,
+        m_treeCtrl->SetItemImage( treeid, wxFileIconsTable::folder_open,
                                   wxTreeItemIcon_Expanded );
 
         // assume that it does have children by default as it can take a long
@@ -854,7 +878,7 @@ void wxGenericDirCtrl::PopulateNode(wxTreeItemId parentId)
         //
         // and if we're wrong, we'll correct the icon later if
         // the user really tries to open this item
-        m_treeCtrl->SetItemHasChildren(id);
+        m_treeCtrl->SetItemHasChildren(treeid);
     }
 
     // Add the sorted filenames
@@ -923,7 +947,7 @@ wxTreeItemId wxGenericDirCtrl::FindChild(wxTreeItemId parentId, const wxString&
     wxTreeItemId childId = m_treeCtrl->GetFirstChild(parentId, cookie);
     while (childId.IsOk())
     {
-        wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(childId);
+        wxDirItemData* data = GetItemData(childId);
 
         if (data && !data->m_path.empty())
         {
@@ -961,20 +985,20 @@ wxTreeItemId wxGenericDirCtrl::FindChild(wxTreeItemId parentId, const wxString&
 bool wxGenericDirCtrl::ExpandPath(const wxString& path)
 {
     bool done = false;
-    wxTreeItemId id = FindChild(m_rootId, path, done);
-    wxTreeItemId lastId = id; // The last non-zero id
-    while (id.IsOk() && !done)
+    wxTreeItemId treeid = FindChild(m_rootId, path, done);
+    wxTreeItemId lastId = treeid; // The last non-zero treeid
+    while (treeid.IsOk() && !done)
     {
-        ExpandDir(id);
+        ExpandDir(treeid);
 
-        id = FindChild(id, path, done);
-        if (id.IsOk())
-            lastId = id;
+        treeid = FindChild(treeid, path, done);
+        if (treeid.IsOk())
+            lastId = treeid;
     }
     if (!lastId.IsOk())
         return false;
 
-    wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(lastId);
+    wxDirItemData *data = GetItemData(lastId);
     if (data->m_isDir)
     {
         m_treeCtrl->Expand(lastId);
@@ -987,7 +1011,7 @@ bool wxGenericDirCtrl::ExpandPath(const wxString& path)
         bool selectedChild = false;
         while (childId.IsOk())
         {
-            data = (wxDirItemData*) m_treeCtrl->GetItemData(childId);
+            data = GetItemData(childId);
 
             if (data && data->m_path != wxEmptyString && !data->m_isDir)
             {
@@ -1017,17 +1041,17 @@ bool wxGenericDirCtrl::ExpandPath(const wxString& path)
 bool wxGenericDirCtrl::CollapsePath(const wxString& path)
 {
     bool done           = false;
-    wxTreeItemId id     = FindChild(m_rootId, path, done);
-    wxTreeItemId lastId = id; // The last non-zero id
+    wxTreeItemId treeid     = FindChild(m_rootId, path, done);
+    wxTreeItemId lastId = treeid; // The last non-zero treeid
 
-    while ( id.IsOk() && !done )
+    while ( treeid.IsOk() && !done )
     {
-        CollapseDir(id);
+        CollapseDir(treeid);
 
-        id = FindChild(id, path, done);
+        treeid = FindChild(treeid, path, done);
 
-        if ( id.IsOk() )
-            lastId = id;
+        if ( treeid.IsOk() )
+            lastId = treeid;
     }
 
     if ( !lastId.IsOk() )
@@ -1039,6 +1063,18 @@ bool wxGenericDirCtrl::CollapsePath(const wxString& path)
     return true;
 }
 
+wxDirItemData* wxGenericDirCtrl::GetItemData(wxTreeItemId itemId)
+{
+    return static_cast<wxDirItemData*>(m_treeCtrl->GetItemData(itemId));
+}
+
+wxString wxGenericDirCtrl::GetPath(wxTreeItemId itemId) const
+{
+    const wxDirItemData*
+        data = static_cast<wxDirItemData*>(m_treeCtrl->GetItemData(itemId));
+
+    return data->m_path;
+}
 
 wxString wxGenericDirCtrl::GetPath() const
 {
@@ -1050,19 +1086,17 @@ wxString wxGenericDirCtrl::GetPath() const
         if (items.size() > 0)
         {
             // return first string only
-            wxTreeItemId id = items[0];
-            wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id);
-            return data->m_path;
+            wxTreeItemId treeid = items[0];
+            return GetPath(treeid);
         }
 
         return wxEmptyString;
     }
 
-    wxTreeItemId id = m_treeCtrl->GetSelection();
-    if (id)
+    wxTreeItemId treeid = m_treeCtrl->GetSelection();
+    if (treeid)
     {
-        wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id);
-        return data->m_path;
+        return GetPath(treeid);
     }
     else
         return wxEmptyString;
@@ -1076,18 +1110,17 @@ void wxGenericDirCtrl::GetPaths(wxArrayString& paths) const
     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);
+        wxTreeItemId treeid = items[n];
+        paths.push_back(GetPath(treeid));
     }
 }
 
 wxString wxGenericDirCtrl::GetFilePath() const
 {
-    wxTreeItemId id = m_treeCtrl->GetSelection();
-    if (id)
+    wxTreeItemId treeid = m_treeCtrl->GetSelection();
+    if (treeid)
     {
-        wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id);
+        wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(treeid);
         if (data->m_isDir)
             return wxEmptyString;
         else
@@ -1105,8 +1138,8 @@ void wxGenericDirCtrl::GetFilePaths(wxArrayString& paths) const
     m_treeCtrl->GetSelections(items);
     for ( unsigned n = 0; n < items.size(); n++ )
     {
-        wxTreeItemId id = items[n];
-        wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id);
+        wxTreeItemId treeid = items[n];
+        wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(treeid);
         if ( !data->m_isDir )
             paths.Add(data->m_path);
     }
@@ -1122,20 +1155,20 @@ void wxGenericDirCtrl::SetPath(const wxString& 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 )
+    wxTreeItemId treeid = FindChild(m_rootId, path, done);
+    wxTreeItemId lastId = treeid; // The last non-zero treeid
+    while ( treeid.IsOk() && !done )
     {
-        id = FindChild(id, path, done);
-        if ( id.IsOk() )
-            lastId = id;
+        treeid = FindChild(treeid, path, done);
+        if ( treeid.IsOk() )
+            lastId = treeid;
     }
     if ( !lastId.IsOk() )
         return;
 
     if ( done )
     {
-        m_treeCtrl->SelectItem(id, select);
+        m_treeCtrl->SelectItem(treeid, select);
     }
 }
 
@@ -1158,9 +1191,9 @@ void wxGenericDirCtrl::UnselectAll()
 
 // Not used
 #if 0
-void wxGenericDirCtrl::FindChildFiles(wxTreeItemId id, int dirFlags, wxArrayString& filenames)
+void wxGenericDirCtrl::FindChildFiles(wxTreeItemId treeid, int dirFlags, wxArrayString& filenames)
 {
-    wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(id);
+    wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(treeid);
 
     // This may take a longish time. Go to busy cursor
     wxBusyCursor busy;
@@ -1171,7 +1204,7 @@ void wxGenericDirCtrl::FindChildFiles(wxTreeItemId id, int dirFlags, wxArrayStri
 
     wxString dirName(data->m_path);
 
-#if defined(__WXMSW__) || defined(__OS2__)
+#if defined(__WINDOWS__) || defined(__OS2__)
     if (dirName.Last() == ':')
         dirName += wxString(wxFILE_SEP_PATH);
 #endif
@@ -1218,7 +1251,7 @@ void wxGenericDirCtrl::SetFilter(const wxString& filter)
 {
     m_filter = filter;
 
-    if (!filter.empty() && !m_filterListCtrl)
+    if (!filter.empty() && !m_filterListCtrl && HasFlag(wxDIRCTRL_SHOW_FILTERS))
         m_filterListCtrl = new wxDirFilterListCtrl(this, wxID_FILTERLISTCTRL);
     else if (filter.empty() && m_filterListCtrl)
     {
@@ -1316,7 +1349,7 @@ BEGIN_EVENT_TABLE(wxDirFilterListCtrl, wxChoice)
 END_EVENT_TABLE()
 
 bool wxDirFilterListCtrl::Create(wxGenericDirCtrl* parent,
-                                 const wxWindowID id,
+                                 const wxWindowID treeid,
                                  const wxPoint& pos,
                                  const wxSize& size,
                                  long style)
@@ -1330,7 +1363,7 @@ bool wxDirFilterListCtrl::Create(wxGenericDirCtrl* parent,
                                                         : wxBORDER_NONE;
     }
 
-    return wxChoice::Create(parent, id, pos, size, 0, NULL, style);
+    return wxChoice::Create(parent, treeid, pos, size, 0, NULL, style);
 }
 
 void wxDirFilterListCtrl::Init()
@@ -1485,9 +1518,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxFileIconsTableModule, wxModule)
 class wxFileIconEntry : public wxObject
 {
 public:
-    wxFileIconEntry(int i) { id = i; }
+    wxFileIconEntry(int i) { iconid = i; }
 
-    int id;
+    int iconid;
 };
 
 wxFileIconsTable::wxFileIconsTable()
@@ -1573,7 +1606,7 @@ wxImageList *wxFileIconsTable::GetSmallImageList()
     return m_smallImageList;
 }
 
-#if wxUSE_MIMETYPE && wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB)
+#if wxUSE_MIMETYPE && wxUSE_IMAGE && (!defined(__WINDOWS__) || wxUSE_WXDIB)
 // VS: we don't need this function w/o wxMimeTypesManager because we'll only have
 //     one icon and we won't resize it
 
@@ -1689,7 +1722,7 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
     if (!extension.empty())
     {
         wxFileIconEntry *entry = (wxFileIconEntry*) m_HashTable->Get(extension);
-        if (entry) return (entry -> id);
+        if (entry) return (entry -> iconid);
     }
 
     wxFileType *ft = (mime.empty()) ?
@@ -1709,7 +1742,7 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
 
     delete ft;
 
-    if ( !ic.Ok() )
+    if ( !ic.IsOk() )
     {
         int newid = file;
         m_HashTable->Put(extension, new wxFileIconEntry(newid));
@@ -1719,7 +1752,7 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
     wxBitmap bmp;
     bmp.CopyFromIcon(ic);
 
-    if ( !bmp.Ok() )
+    if ( !bmp.IsOk() )
     {
         int newid = file;
         m_HashTable->Put(extension, new wxFileIconEntry(newid));
@@ -1728,12 +1761,12 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
 
     const unsigned int size = 16;
 
-    int id = m_smallImageList->GetImageCount();
+    int treeid = m_smallImageList->GetImageCount();
     if ((bmp.GetWidth() == (int) size) && (bmp.GetHeight() == (int) size))
     {
         m_smallImageList->Add(bmp);
     }
-#if wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB)
+#if wxUSE_IMAGE && (!defined(__WINDOWS__) || wxUSE_WXDIB)
     else
     {
         wxImage img = bmp.ConvertToImage();
@@ -1746,8 +1779,8 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
     }
 #endif // wxUSE_IMAGE
 
-    m_HashTable->Put(extension, new wxFileIconEntry(id));
-    return id;
+    m_HashTable->Put(extension, new wxFileIconEntry(treeid));
+    return treeid;
 
 #else // !wxUSE_MIMETYPE