]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dirdlgg.cpp
fix for wxCalendarCtrl::Create() (bug 458167)
[wxWidgets.git] / src / generic / dirdlgg.cpp
index 5343555b80b96253b2fca0302d340f5100db00e0..454b60cc0511013a9595f7ba55246f94aaa5fb2a 100644 (file)
@@ -29,6 +29,7 @@
 #include "wx/button.h"
 #include "wx/layout.h"
 #include "wx/msgdlg.h"
+#include "wx/textctrl.h"
 #include "wx/textdlg.h"
 #include "wx/filefn.h"
 #include "wx/cmndata.h"
@@ -38,6 +39,8 @@
 #include "wx/icon.h"
 #include "wx/log.h"
 #include "wx/sizer.h"
+#include "wx/tokenzr.h"
+#include "wx/dir.h"
 
 #if wxUSE_STATLINE
     #include "wx/statline.h"
@@ -50,6 +53,7 @@
 #undef GetFirstChild
 #endif
 
+#ifndef __WXMSW__
 /* XPM */
 static char * icon1_xpm[] = {
 /* width height ncolors chars_per_pixel */
@@ -108,6 +112,8 @@ static char * icon2_xpm[] = {
 "                ",
 "                "};
 
+#endif // !wxMSW
+
 static const int ID_DIRCTRL = 1000;
 static const int ID_TEXTCTRL = 1001;
 static const int ID_OK = 1002;
@@ -143,10 +149,7 @@ void wxDirItemData::SetNewDirName( wxString path )
 
 bool wxDirItemData::HasSubDirs()
 {
-    wxString search = m_path + "/*";
-    wxLogNull log;
-    wxString path = wxFindFirstFile( search, wxDIR );
-    return (bool)(!path.IsNull());
+    return wxDir(m_path).HasSubDirs();
 }
 
 //-----------------------------------------------------------------------------
@@ -167,18 +170,21 @@ wxDirCtrl::wxDirCtrl(void)
     m_showHidden = FALSE;
 }
 
-wxDirCtrl::wxDirCtrl(wxWindow *parent, const wxWindowID id, const wxString &WXUNUSED(dir),
-            const wxPoint& pos, const wxSize& size,
-            const long style, const wxString& name )
- :
-  wxTreeCtrl( parent, id, pos, size, style, wxDefaultValidator, name )
+wxDirCtrl::wxDirCtrl(wxWindow *parent,
+                     const wxWindowID id,
+                     const wxString &WXUNUSED(dir),
+                     const wxPoint& pos,
+                     const wxSize& size,
+                     const long style,
+                     const wxString& name )
+         : wxTreeCtrl( parent, id, pos, size, style, wxDefaultValidator, name )
 {
- #ifndef __WXMSW__
+#ifndef __WXMSW__
     m_imageListNormal = new wxImageList(16, 16, TRUE);
     m_imageListNormal->Add(wxICON(icon1));
     m_imageListNormal->Add(wxICON(icon2));
     SetImageList(m_imageListNormal);
- #endif
+#endif // !MSW
 
     m_showHidden = FALSE;
     m_rootId = AddRoot( _("Sections") );
@@ -204,8 +210,8 @@ void wxDirCtrl::SetupSections()
   wxGetHomeDir(&home);
   ADD_SECTION(home, _("My Home") )
   ADD_SECTION(wxT("/mnt"), _("Mounted Devices") )
-  ADD_SECTION(wxT("/usr"), _("User") )
   ADD_SECTION(wxT("/usr/local"), _("User Local") )
+  ADD_SECTION(wxT("/usr"), _("User") )
   ADD_SECTION(wxT("/var"), _("Variables") )
   ADD_SECTION(wxT("/etc"), _("Etcetera") )
   ADD_SECTION(wxT("/tmp"), _("Temporary") )
@@ -220,13 +226,15 @@ void wxDirCtrl::CreateItems(const wxTreeItemId &parent)
 
 //  wxASSERT(m_paths.Count() == m_names.Count());  ?
 
-    for (unsigned int i=0; i<m_paths.Count(); i++)
+    size_t count = m_paths.GetCount();
+    for ( size_t i=0; i<count; i++)
     {
-  dir_item = new wxDirItemData(m_paths[i],m_names[i]);
+        dir_item = new wxDirItemData(m_paths[i],m_names[i]);
 #ifdef __WXMSW__
-  id = AppendItem( parent, m_names[i], -1, -1, dir_item);
+        id = AppendItem( parent, m_names[i], -1, -1, dir_item);
 #else
-  id = AppendItem( parent, m_names[i], 0, 1, dir_item);
+        id = AppendItem( parent, m_names[i], 0, -1, dir_item);
+        SetItemImage( id, 1, wxTreeItemIcon_Expanded );
 #endif
         if (dir_item->m_hasSubDirs) SetItemHasChildren(id);
     }
@@ -254,12 +262,12 @@ void wxDirCtrl::OnEndEditItem(wxTreeEvent &event)
     if ((event.GetLabel().IsEmpty()) ||
         (event.GetLabel() == _(".")) ||
         (event.GetLabel() == _("..")) ||
-  (event.GetLabel().First( wxT("/") ) != wxNOT_FOUND))
+        (event.GetLabel().First( wxT("/") ) != wxNOT_FOUND))
     {
         wxMessageDialog dialog(this, _("Illegal directory name."), _("Error"), wxOK | wxICON_ERROR );
-  dialog.ShowModal();
+        dialog.ShowModal();
         event.Veto();
-  return;
+        return;
     }
 
     wxTreeItemId id = event.GetItem();
@@ -275,7 +283,7 @@ void wxDirCtrl::OnEndEditItem(wxTreeEvent &event)
     if (wxFileExists(new_name))
     {
         wxMessageDialog dialog(this, _("File name exists already."), _("Error"), wxOK | wxICON_ERROR );
-  dialog.ShowModal();
+        dialog.ShowModal();
         event.Veto();
     }
 
@@ -286,7 +294,7 @@ void wxDirCtrl::OnEndEditItem(wxTreeEvent &event)
     else
     {
         wxMessageDialog dialog(this, _("Operation not permitted."), _("Error"), wxOK | wxICON_ERROR );
-  dialog.ShowModal();
+        dialog.ShowModal();
         event.Veto();
     }
 }
@@ -304,29 +312,24 @@ void wxDirCtrl::OnExpandItem(wxTreeEvent &event)
     wxBeginBusyCursor();
 
     wxDirItemData *data = (wxDirItemData *)GetItemData(event.GetItem());
-    wxASSERT(data);
-
-    wxString search,path,filename;
 
     m_paths.Clear();
     m_names.Clear();
-#ifdef __WXMSW__
-    search = data->m_path + "\\*.*";
-#else
-    search = data->m_path + "/*";
-#endif
-    for (path = wxFindFirstFile( search, wxDIR ); !path.IsNull();
-       path=wxFindNextFile() )
+
+    wxString path = data->m_path;
+
+    wxDir dir(path);
+
+    path += _T('/');
+
+    wxString filename;
+    bool cont = dir.GetFirst(&filename, "", wxDIR_DIRS | wxDIR_HIDDEN);
+    while ( cont )
     {
-        filename = wxFileNameFromPath( path );
-        /* Don't add "." and ".." to the tree. I think wxFindNextFile
-         * also checks this, but I don't quite understand what happens
-         * there. Also wxFindNextFile seems to swallow hidden dirs */
-        if ((filename != ".") && (filename != ".."))
-        {
-            m_paths.Add(path);
-            m_names.Add(filename);
-        }
+        m_paths.Add(path + filename);
+        m_names.Add(filename);
+
+        cont = dir.GetNext(&filename);
     }
 
     CreateItems( event.GetItem() );
@@ -356,11 +359,7 @@ void wxDirCtrl::OnCollapseItem(wxTreeEvent &event )
 //-----------------------------------------------------------------------------
 
 
-#if !USE_SHARED_LIBRARY
-IMPLEMENT_CLASS(wxDirDialog, wxDialog)
-#else
 IMPLEMENT_DYNAMIC_CLASS( wxDirDialog, wxDialog )
-#endif
 
 BEGIN_EVENT_TABLE( wxDirDialog, wxDialog )
   EVT_TREE_KEY_DOWN        (ID_DIRCTRL,   wxDirDialog::OnTreeKeyDown)
@@ -373,11 +372,13 @@ BEGIN_EVENT_TABLE( wxDirDialog, wxDialog )
   //  EVT_CHECKBOX             (ID_CHECK,     wxDirDialog::OnCheck)
 END_EVENT_TABLE()
 
-wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message,
-       const wxString& defaultPath, long style,
-       const wxPoint& pos) :
-  wxDialog(parent, -1, message, pos, wxSize(300,300),
-     wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+wxDirDialog::wxDirDialog(wxWindow *parent,
+                         const wxString& message,
+                         const wxString& defaultPath,
+                         long style,
+                         const wxPoint& pos)
+           : wxDialog(parent, -1, message, pos, wxSize(300,300),
+                      wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
 {
     m_message = message;
     m_dialogStyle = style;
@@ -390,8 +391,12 @@ wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message,
     wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
 
     // 1) dir ctrl
-    m_dir = new wxDirCtrl( this, ID_DIRCTRL, "/", wxDefaultPosition, wxSize(200,200),
-      wxTR_HAS_BUTTONS | wxSUNKEN_BORDER | wxTR_EDIT_LABELS);
+    m_dir = new wxDirCtrl( this, ID_DIRCTRL, _T("/"),
+                           wxDefaultPosition,
+                           wxSize(200,200),
+                           wxTR_HAS_BUTTONS |
+                           wxSUNKEN_BORDER |
+                           wxTR_EDIT_LABELS );
     topsizer->Add( m_dir, 1, wxTOP|wxLEFT|wxRIGHT | wxEXPAND, 10 );
 
     // 2) text ctrl
@@ -428,6 +433,66 @@ wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message,
 
     Centre( wxBOTH );
 
+    if (m_path == wxT("~"))
+        wxGetHomeDir( &m_path );
+
+    // choose the directory corresponding to defaultPath in the tree
+    // VZ: using wxStringTokenizer is probably unsafe here (escaped slashes
+    //     will not be processed correctly...)
+    wxStringTokenizer tk(m_path, wxFILE_SEP_PATH, wxTOKEN_STRTOK);
+
+    wxString path;
+
+    long cookie = 0;
+    // default to root dir
+    wxTreeItemId item = m_dir->GetFirstChild(m_dir->GetRootItem(), cookie);
+
+    if (!m_path.IsEmpty() && (m_path != wxT("/")) && (m_dir->m_paths.Count() > 1))
+    {
+        size_t count = m_dir->m_paths.GetCount();
+        for ( size_t i=1; i<count; i++)
+        {
+            if (m_path.Find( m_dir->m_paths[i] ) == 0)
+            {
+                path = m_dir->m_paths[i];
+
+                for (size_t j = 0; j < i; j++)
+                   item = m_dir->GetNextChild(m_dir->GetRootItem(), cookie);
+
+                wxStringTokenizer tk2(path, wxFILE_SEP_PATH, wxTOKEN_STRTOK);
+                for (size_t h = 0; h < tk2.CountTokens(); h++)
+                   tk.GetNextToken();
+
+                break;
+            }
+        }
+    }
+    while ( tk.HasMoreTokens() && item.IsOk() )
+    {
+        path << wxFILE_SEP_PATH << tk.GetNextToken();
+
+        m_dir->Expand(item);
+
+        wxTreeItemId child = m_dir->GetFirstChild(item, cookie);
+        while ( child.IsOk() )
+        {
+            wxDirItemData *data = (wxDirItemData*)m_dir->GetItemData(child);
+            if ( data->m_path == path )
+                break;
+
+            child = m_dir->GetNextChild(item, cookie);
+        }
+
+        item = child;
+    }
+
+    if ( item.IsOk() )
+    {
+        m_dir->Expand(item);
+        m_dir->SelectItem(item);
+        m_dir->EnsureVisible(item);
+    }
+
     wxEndBusyCursor();
 }
 
@@ -514,24 +579,24 @@ void wxDirDialog::OnNew( wxCommandEvent& WXUNUSED(event) )
     {
         // try NewName0, NewName1 etc.
         int i = 0;
-  do {
+        do {
             new_name = wxT("NewName");
-      wxString num;
-      num.Printf( "%d", i );
-      new_name += num;
+            wxString num;
+            num.Printf( wxT("%d"), i );
+            new_name += num;
 
             path = data->m_path;
             path += wxT("/");
             path += new_name;
-      i++;
-  } while (wxFileExists(path));
+            i++;
+        } while (wxFileExists(path));
     }
 
     wxLogNull log;
     if (!wxMkdir(path))
     {
         wxMessageDialog dialog(this, _("Operation not permitted."), _("Error"), wxOK | wxICON_ERROR );
-  dialog.ShowModal();
+        dialog.ShowModal();
         return;
     }
 
@@ -548,4 +613,4 @@ void wxDirDialog::OnCheck( wxCommandEvent& WXUNUSED(event) )
 }
 */
 
-#endif
+#endif // wxUSE_DIRDLG