]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/filedlgg.cpp
made wxFFile a bit more safe: don't crash when Tell() and Length() are called on...
[wxWidgets.git] / src / generic / filedlgg.cpp
index 3d0b66d391dcc0d8803baa94563871f8d7cc1938..bcb63b71d031696a1d9d4722effda4f2ef5e0f2f 100644 (file)
@@ -1,4 +1,4 @@
-/////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
 // Name:        filedlgg.cpp
 // Purpose:     wxGenericFileDialog
 // Author:      Robert Roebling
@@ -23,7 +23,7 @@
 #if wxUSE_FILEDLG
 
 // NOTE : it probably also supports MAC, untested
-#if !defined(__UNIX__) && !defined(__DOS__) && !defined(__WIN32__)
+#if !defined(__UNIX__) && !defined(__DOS__) && !defined(__WIN32__) && !defined(__OS2__)
 #error wxGenericFileDialog currently only supports Unix, win32 and DOS
 #endif
 
@@ -134,11 +134,11 @@ int wxCALLBACK wxFileDataTimeCompare( long data1, long data2, long data)
      return fd1->GetDateTime().IsLaterThan(fd2->GetDateTime()) ? int(data) : -int(data);
 }
 
-#ifdef __UNIX__
+#if defined(__UNIX__) && !defined(__OS2__)
 #define IsTopMostDir(dir)   (dir == wxT("/"))
 #endif
 
-#if defined(__DOS__) || defined(__WINDOWS__)
+#if defined(__DOS__) || defined(__WINDOWS__) || defined (__OS2__)
 #define IsTopMostDir(dir)   (dir.IsEmpty())
 #endif
 
@@ -154,17 +154,6 @@ extern size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, w
 //  wxFileData
 //-----------------------------------------------------------------------------
 
-wxFileData::wxFileData( const wxFileData& fileData )
-{
-    m_fileName = fileData.GetFileName();
-    m_filePath = fileData.GetFilePath();
-    m_size = fileData.GetSize();
-    m_dateTime = fileData.GetDateTime();
-    m_permissions = fileData.GetPermissions();
-    m_type = fileData.GetType();
-    m_image = GetImageId();
-}
-
 wxFileData::wxFileData( const wxString &filePath, const wxString &fileName, fileType type, int image_id )
 {
     m_fileName = fileName;
@@ -175,6 +164,17 @@ wxFileData::wxFileData( const wxString &filePath, const wxString &fileName, file
     ReadData();
 }
 
+void wxFileData::Copy( const wxFileData& fileData )
+{
+    m_fileName = fileData.GetFileName();
+    m_filePath = fileData.GetFilePath();
+    m_size = fileData.GetSize();
+    m_dateTime = fileData.GetDateTime();
+    m_permissions = fileData.GetPermissions();
+    m_type = fileData.GetType();
+    m_image = GetImageId();
+}
+
 void wxFileData::ReadData()
 {
     if (IsDrive())
@@ -183,7 +183,7 @@ void wxFileData::ReadData()
         return;
     }
 
-#if defined(__DOS__) || defined(__WINDOWS__)
+#if defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__)
     // c:\.. is a drive don't stat it
     if ((m_fileName == wxT("..")) && (m_filePath.length() <= 5))
     {
@@ -195,7 +195,7 @@ void wxFileData::ReadData()
 
     wxStructStat buff;
 
-#if defined(__UNIX__) && (!defined( __EMX__ ) && !defined(__VMS))
+#if defined(__UNIX__) && (!defined( __OS2__ ) && !defined(__VMS))
     lstat( m_filePath.fn_str(), &buff );
     m_type |= S_ISLNK( buff.st_mode ) != 0 ? is_link : 0;
 #else // no lstat()
@@ -343,8 +343,9 @@ void wxFileData::MakeItem( wxListItem &item )
 
     if (IsLink())
     {
-        wxColour *dg = wxTheColourDatabase->FindColour( _T("MEDIUM GREY") );
-        item.SetTextColour(*dg);
+        wxColour dg = wxTheColourDatabase->Find( _T("MEDIUM GREY") );
+        if ( dg.Ok() )
+            item.SetTextColour(dg);
     }
     item.m_data = (long)this;
 }
@@ -357,6 +358,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxFileCtrl,wxListCtrl)
 
 BEGIN_EVENT_TABLE(wxFileCtrl,wxListCtrl)
     EVT_LIST_DELETE_ITEM(-1, wxFileCtrl::OnListDeleteItem)
+    EVT_LIST_DELETE_ALL_ITEMS(-1, wxFileCtrl::OnListDeleteAllItems)
     EVT_LIST_END_LABEL_EDIT(-1, wxFileCtrl::OnListEndLabelEdit)
     EVT_LIST_COL_CLICK(-1, wxFileCtrl::OnListColClick)
 END_EVENT_TABLE()
@@ -487,15 +489,13 @@ void wxFileCtrl::UpdateFiles()
 
     wxBusyCursor bcur; // this may take a while...
 
-    FreeAllItemsData();
     DeleteAllItems();
 
-    wxFileData *fd = (wxFileData *) NULL;
     wxListItem item;
     item.m_itemId = 0;
     item.m_col = 0;
 
-#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXMAC__) || defined(__WXPM__)
+#if defined(__WINDOWS__) || defined(__DOS__) || defined(__WXMAC__) || defined(__OS2__)
     if ( IsTopMostDir(m_dirName) )
         {
         wxArrayString names, paths;
@@ -504,9 +504,11 @@ void wxFileCtrl::UpdateFiles()
 
         for (n=0; n<count; n++)
             {
-            fd = new wxFileData(paths[n], names[n], wxFileData::is_drive, icons[n]);
-                Add(fd, item);
+            wxFileData *fd = new wxFileData(paths[n], names[n], wxFileData::is_drive, icons[n]);
+            if (Add(fd, item) != -1)
                 item.m_itemId++;
+            else
+                delete fd;
             }
         }
     else
@@ -516,19 +518,21 @@ void wxFileCtrl::UpdateFiles()
         if ( !IsTopMostDir(m_dirName) )
         {
             wxString p(wxPathOnly(m_dirName));
-#ifdef __UNIX__
+#if defined(__UNIX__) && !defined(__OS2__)
             if (p.IsEmpty()) p = wxT("/");
 #endif // __UNIX__
-            fd = new wxFileData(p, wxT(".."), wxFileData::is_dir, wxFileIconsTable::folder);
-            Add(fd, item);
+            wxFileData *fd = new wxFileData(p, wxT(".."), wxFileData::is_dir, wxFileIconsTable::folder);
+            if (Add(fd, item) != -1)
             item.m_itemId++;
+            else
+                delete fd;
         }
 
         wxString dirname(m_dirName);
-#if defined(__DOS__) || defined(__WINDOWS__)
+#if defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__)
         if (dirname.length() == 2 && dirname[1u] == wxT(':'))
             dirname << wxT('\\');
-#endif // defined(__DOS__) || defined(__WINDOWS__)
+#endif // defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__)
         wxDir dir(dirname);
 
         if ( dir.IsOpened() )
@@ -546,9 +550,12 @@ void wxFileCtrl::UpdateFiles()
             cont = dir.GetFirst(&f, wxEmptyString, wxDIR_DIRS | hiddenFlag);
             while (cont)
             {
-                fd = new wxFileData(dirPrefix + f, f, wxFileData::is_dir, wxFileIconsTable::folder);
-                Add(fd, item);
+                wxFileData *fd = new wxFileData(dirPrefix + f, f, wxFileData::is_dir, wxFileIconsTable::folder);
+                if (Add(fd, item) != -1)
                 item.m_itemId++;
+                else
+                    delete fd;
+
                 cont = dir.GetNext(&f);
             }
 
@@ -561,9 +568,12 @@ void wxFileCtrl::UpdateFiles()
                                         wxDIR_FILES | hiddenFlag);
                 while (cont)
                 {
-                    fd = new wxFileData(dirPrefix + f, f, wxFileData::is_file, wxFileIconsTable::file);
-                    Add(fd, item);
+                    wxFileData *fd = new wxFileData(dirPrefix + f, f, wxFileData::is_file, wxFileIconsTable::file);
+                    if (Add(fd, item) != -1)
                     item.m_itemId++;
+                    else
+                        delete fd;
+
                     cont = dir.GetNext(&f);
                 }
             }
@@ -626,6 +636,8 @@ void wxFileCtrl::MakeDir()
         EnsureVisible( id );
         EditLabel( id );
     }
+    else
+        delete fd;
 }
 
 void wxFileCtrl::GoToParentDir()
@@ -637,7 +649,7 @@ void wxFileCtrl::GoToParentDir()
             m_dirName.Remove( len-1, 1 );
         wxString fname( wxFileNameFromPath(m_dirName) );
         m_dirName = wxPathOnly( m_dirName );
-#if defined(__DOS__) || defined(__WINDOWS__)
+#if defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__)
         if (!m_dirName.IsEmpty())
         {
             if (m_dirName.Last() == wxT('.'))
@@ -673,10 +685,15 @@ void wxFileCtrl::GoToDir( const wxString &dir )
     EnsureVisible( 0 );
 }
 
-void wxFileCtrl::FreeItemData(const wxListItem& item)
+void wxFileCtrl::FreeItemData(wxListItem& item)
 {
-    wxFileData *fd = (wxFileData*)item.m_data;
-    delete fd;
+    if ( item.m_data )
+    {
+        wxFileData *fd = (wxFileData*)item.m_data;
+        delete fd;
+
+        item.m_data = 0;
+    }
 }
 
 void wxFileCtrl::OnListDeleteItem( wxListEvent &event )
@@ -684,6 +701,11 @@ void wxFileCtrl::OnListDeleteItem( wxListEvent &event )
     FreeItemData(event.m_item);
 }
 
+void wxFileCtrl::OnListDeleteAllItems( wxListEvent &event )
+{
+    FreeAllItemsData();
+}
+
 void wxFileCtrl::FreeAllItemsData()
 {
     wxListItem item;
@@ -797,7 +819,6 @@ void wxFileCtrl::SortItems(wxFileData::fileListFieldType field, bool foward)
 
 wxFileCtrl::~wxFileCtrl()
 {
-    FreeAllItemsData();
 }
 
 //-----------------------------------------------------------------------------
@@ -1355,9 +1376,9 @@ void wxGenericFileDialog::UpdateControls()
     bool enable = !IsTopMostDir(dir);
     m_upDirButton->Enable(enable);
 
-#if defined(__DOS__) || defined(__WINDOWS__)
+#if defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__)
     m_newDirButton->Enable(enable);
-#endif // defined(__DOS__) || defined(__WINDOWS__)
+#endif // defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__)
 }
 
 #ifdef USE_GENERIC_FILEDIALOG