]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dirctrlg.cpp
Added headers that didn't get installed.
[wxWidgets.git] / src / generic / dirctrlg.cpp
index c1bda3cbd6282ddd1360c66d455bf29b3277c657..2389927c24fcb469f80e41476203177580cd4285 100644 (file)
@@ -63,7 +63,9 @@
 //         older releases don't, but it should be verified and the checks modified
 //         accordingly.
 #if !defined(__GNUWIN32__) || (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1)
+#if !defined(__WXWINCE__)
   #include <direct.h>
+#endif
   #include <stdlib.h>
   #include <ctype.h>
 #endif
@@ -79,7 +81,7 @@
 #endif
 #include <stdlib.h>
 #include <ctype.h>
-
+extern bool wxIsDriveAvailable(const wxString& dirName);
 #endif // __WXPM__
 
 #if defined(__WXMAC__)
 #undef GetFirstChild
 #endif
 
+// declared in filedlg.h, defined in fldlgcmn.cpp
+extern int wxParseFileFilter(const wxString& filterStr, wxArrayString& descriptions, wxArrayString& filters);
+
 // ----------------------------------------------------------------------------
 // wxGetAvailableDrives, for WINDOWS, DOS, WXPM, MAC, UNIX (returns "/")
 // ----------------------------------------------------------------------------
@@ -107,7 +112,12 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI
 {
 #if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXPM__)
 
-#ifdef __WIN32__
+#ifdef __WXWINCE__
+    // No logical drives; return "\"
+    paths.Add(wxT("\\"));
+    names.Add(wxT("\\"));
+    return 1;
+#elif defined(__WIN32__)
     wxChar driveBuffer[256];
     size_t n = (size_t) GetLogicalDriveStrings(255, driveBuffer);
     size_t i = 0;
@@ -287,7 +297,9 @@ bool wxIsDriveAvailable(const wxString& dirName)
 
 int setdrive(int drive)
 {
-#if defined(__GNUWIN32__) && \
+#ifdef __WXWINCE__
+    return 0;
+#elif defined(__GNUWIN32__) && \
     (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1)
     return _chdrive(drive);
 #else
@@ -299,11 +311,7 @@ int setdrive(int drive)
        newdrive[1] = wxT(':');
        newdrive[2] = wxT('\0');
 #if defined(__WXMSW__)
-#ifdef __WIN16__
-    if (wxSetWorkingDirectory(newdrive))
-#else
        if (::SetCurrentDirectory(newdrive))
-#endif
 #else
     // VA doesn't know what LPSTR is and has its own set
        if (DosSetCurrentDir((PSZ)newdrive))
@@ -316,6 +324,9 @@ int setdrive(int drive)
 
 bool wxIsDriveAvailable(const wxString& dirName)
 {
+#ifdef __WXWINCE__
+    return FALSE;
+#else
 #ifdef __WIN32__
     UINT errorMode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
 #endif
@@ -345,16 +356,15 @@ bool wxIsDriveAvailable(const wxString& dirName)
 #endif
 
     return success;
+#endif
 }
 #endif // __WINDOWS__ || __WXPM__
 
+
 // Function which is called by quick sort. We want to override the default wxArrayString behaviour,
 // and sort regardless of case.
-static int LINKAGEMODE wxDirCtrlStringCompareFunction(const void *first, const void *second)
+static int LINKAGEMODE wxDirCtrlStringCompareFunction(wxString* strFirst, wxString* strSecond)
 {
-    wxString *strFirst = (wxString *)first;
-    wxString *strSecond = (wxString *)second;
-
     return strFirst->CmpNoCase(*strSecond);
 }
 
@@ -459,10 +469,14 @@ bool wxGenericDirCtrl::Create(wxWindow *parent,
 
     if ((style & wxDIRCTRL_3D_INTERNAL) == 0)
         treeStyle |= wxNO_BORDER;
+    else
+        treeStyle |= wxBORDER_SUNKEN;
 
     long filterStyle = 0;
     if ((style & wxDIRCTRL_3D_INTERNAL) == 0)
         filterStyle |= wxNO_BORDER;
+    else
+        filterStyle |= wxBORDER_SUNKEN;
 
     m_treeCtrl = new wxTreeCtrl(this, wxID_TREECTRL, pos, size, treeStyle);
 
@@ -525,13 +539,16 @@ void wxGenericDirCtrl::ShowHidden( bool show )
     SetPath(path);
 }
 
-void wxGenericDirCtrl::AddSection(const wxString& path, const wxString& name, int imageId)
+const wxTreeItemId
+wxGenericDirCtrl::AddSection(const wxString& path, const wxString& name, int imageId)
 {
     wxDirItemData *dir_item = new wxDirItemData(path,name,TRUE);
 
-    wxTreeItemId id = m_treeCtrl->AppendItem( m_rootId, name, imageId, -1, dir_item);
-            
+    wxTreeItemId id = AppendItem( m_rootId, name, imageId, -1, dir_item);
+
     m_treeCtrl->SetItemHasChildren(id);
+
+    return id;
 }
 
 void wxGenericDirCtrl::SetupSections()
@@ -540,7 +557,7 @@ void wxGenericDirCtrl::SetupSections()
     wxArrayInt icons;
 
     size_t n, count = wxGetAvailableDrives(paths, names, icons);
-      
+
     for (n = 0; n < count; n++)
     {
         AddSection(paths[n], names[n], icons[n]);
@@ -614,7 +631,9 @@ void wxGenericDirCtrl::OnExpandItem(wxTreeEvent &event)
 
     // VS: this is needed because the event handler is called from wxTreeCtrl
     //     ctor when wxTR_HIDE_ROOT was specified
-    if (m_rootId == 0)
+
+    if (!m_rootId.IsOk())
+
         m_rootId = m_treeCtrl->GetRootItem();
 
     ExpandDir(parentId);
@@ -712,7 +731,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId)
             while (d.GetNext(& eachFilename));
         }
     }
-    dirs.Sort((wxArrayString::CompareFunction) wxDirCtrlStringCompareFunction);
+    dirs.Sort(wxDirCtrlStringCompareFunction);
 
     // Now do the filenames -- but only if we're allowed to
     if ((GetWindowStyle() & wxDIRCTRL_DIR_ONLY) == 0)
@@ -735,7 +754,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId)
                 while (d.GetNext(& eachFilename));
             }
         }
-        filenames.Sort((wxArrayString::CompareFunction) wxDirCtrlStringCompareFunction);
+        filenames.Sort(wxDirCtrlStringCompareFunction);
     }
 
     // Add the sorted dirs
@@ -749,7 +768,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId)
         path += eachFilename;
 
         wxDirItemData *dir_item = new wxDirItemData(path,eachFilename,TRUE);
-        wxTreeItemId id = m_treeCtrl->AppendItem( parentId, eachFilename,
+        wxTreeItemId id = AppendItem( parentId, eachFilename,
                                       wxFileIconsTable::folder, -1, dir_item);
         m_treeCtrl->SetItemImage( id, wxFileIconsTable::folder_open,
                                   wxTreeItemIcon_Expanded );
@@ -781,7 +800,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId)
             int image_id = wxFileIconsTable::file;
             if (eachFilename.Find(wxT('.')) != wxNOT_FOUND)
                 image_id = wxTheFileIconsTable->GetIconID(eachFilename.AfterLast(wxT('.')));
-            (void)m_treeCtrl->AppendItem( parentId, eachFilename, image_id, -1, dir_item);
+            (void) AppendItem( parentId, eachFilename, image_id, -1, dir_item);
         }
     }
 }
@@ -1023,41 +1042,11 @@ bool wxGenericDirCtrl::ExtractWildcard(const wxString& filterStr, int n, wxStrin
 
 // Parses the global filter, returning the number of filters.
 // Returns 0 if none or if there's a problem.
-// filterStr is in the form:
-//
-// "All files (*.*)|*.*|JPEG Files (*.jpeg)|*.jpg"
+// filterStr is in the form: "All files (*.*)|*.*|JPEG Files (*.jpeg)|*.jpg"
 
 int wxGenericDirCtrl::ParseFilter(const wxString& filterStr, wxArrayString& filters, wxArrayString& descriptions)
 {
-    wxString str(filterStr);
-
-    wxString description, filter;
-    int pos;
-    bool finished = FALSE;
-    do
-    {
-        pos = str.Find(wxT('|'));
-        if (pos == -1)
-            return 0; // Problem
-        description = str.Left(pos);
-        str = str.Mid(pos+1);
-        pos = str.Find(wxT('|'));
-        if (pos == -1)
-        {
-            filter = str;
-            finished = TRUE;
-        }
-        else
-        {
-            filter = str.Left(pos);
-            str = str.Mid(pos+1);
-        }
-        descriptions.Add(description);
-        filters.Add(filter);
-    }
-    while (!finished) ;
-
-    return filters.Count();
+    return wxParseFileFilter(filterStr, descriptions, filters );
 }
 
 void wxGenericDirCtrl::DoResize()
@@ -1096,6 +1085,26 @@ void wxGenericDirCtrl::OnSize(wxSizeEvent& WXUNUSED(event))
     DoResize();
 }
 
+wxTreeItemId wxGenericDirCtrl::AppendItem (const wxTreeItemId & parent,
+                                          const wxString & text,
+                                          int image, int selectedImage,
+                                          wxTreeItemData * data)
+{
+  wxTreeCtrl *treeCtrl = GetTreeCtrl ();
+
+  wxASSERT (treeCtrl);
+
+  if (treeCtrl)
+  {
+    return treeCtrl->AppendItem (parent, text, image, selectedImage, data);
+  }
+  else
+  {
+    return wxTreeItemId();
+  }
+}
+
+
 //-----------------------------------------------------------------------------
 // wxDirFilterListCtrl
 //-----------------------------------------------------------------------------
@@ -1151,6 +1160,7 @@ void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilt
     }
 }
 
+
 // ----------------------------------------------------------------------------
 // wxFileIconsTable icons
 // ----------------------------------------------------------------------------
@@ -1365,7 +1375,11 @@ wxFileIconsTable::wxFileIconsTable()
 
 wxFileIconsTable::~wxFileIconsTable()
 {
-    if (m_HashTable) delete m_HashTable;
+    if (m_HashTable)
+    {
+        WX_CLEAR_HASH_TABLE(*m_HashTable);
+        delete m_HashTable;
+    }
     if (m_smallImageList) delete m_smallImageList;
 }
 
@@ -1373,11 +1387,9 @@ wxFileIconsTable::~wxFileIconsTable()
 void wxFileIconsTable::Create()
 {
     wxCHECK_RET(!m_smallImageList && !m_HashTable, wxT("creating icons twice"));
-printf("creating \n"); fflush(stdout);
     m_HashTable = new wxHashTable(wxKEY_STRING);
     m_smallImageList = new wxImageList(16, 16);
 
-    m_HashTable->DeleteContents(TRUE);
     // folder:
     m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_FOLDER, wxART_CMN_DIALOG));
     // folder_open
@@ -1398,6 +1410,7 @@ printf("creating \n"); fflush(stdout);
     if (GetIconID(wxEmptyString, _T("application/x-executable")) == file)
     {
         m_smallImageList->Add(wxArtProvider::GetBitmap(wxART_EXECUTABLE_FILE, wxART_CMN_DIALOG));
+        delete m_HashTable->Get(_T("exe"));
         m_HashTable->Delete(_T("exe"));
         m_HashTable->Put(_T("exe"), new wxFileIconEntry(executable));
     }
@@ -1526,8 +1539,17 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
     wxFileType *ft = (mime.IsEmpty()) ?
                    wxTheMimeTypesManager -> GetFileTypeFromExtension(extension) :
                    wxTheMimeTypesManager -> GetFileTypeFromMimeType(mime);
+
+    wxIconLocation iconLoc;
     wxIcon ic;
-    if (ft == NULL || (!ft->GetIcon(&ic)) || (!ic.Ok()))
+    if ( ft && ft->GetIcon(&iconLoc) )
+    {
+        ic = wxIcon(iconLoc);
+    }
+
+    delete ft;
+
+    if ( !ic.Ok() )
     {
         int newid = file;
         m_HashTable->Put(extension, new wxFileIconEntry(newid));
@@ -1538,8 +1560,6 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
     tmpBmp.CopyFromIcon(ic);
     wxImage img = tmpBmp.ConvertToImage();
 
-    delete ft;
-
     int id = m_smallImageList->GetImageCount();
     if (img.GetWidth() == 16 && img.GetHeight() == 16)
         m_smallImageList->Add(wxBitmap(img));