]> 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 b336cabd6c1cb6bd7ce0fd9799437738b797c6e0..bcb63b71d031696a1d9d4722effda4f2ef5e0f2f 100644 (file)
@@ -1,4 +1,4 @@
-/////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
 // Name:        filedlgg.cpp
 // Purpose:     wxGenericFileDialog
 // Author:      Robert Roebling
@@ -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())
@@ -358,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()
@@ -488,7 +489,6 @@ void wxFileCtrl::UpdateFiles()
 
     wxBusyCursor bcur; // this may take a while...
 
-    FreeAllItemsData();
     DeleteAllItems();
 
     wxListItem item;
@@ -505,8 +505,10 @@ void wxFileCtrl::UpdateFiles()
         for (n=0; n<count; n++)
             {
             wxFileData *fd = new wxFileData(paths[n], names[n], wxFileData::is_drive, icons[n]);
-                Add(fd, item);
+            if (Add(fd, item) != -1)
                 item.m_itemId++;
+            else
+                delete fd;
             }
         }
     else
@@ -520,8 +522,10 @@ void wxFileCtrl::UpdateFiles()
             if (p.IsEmpty()) p = wxT("/");
 #endif // __UNIX__
             wxFileData *fd = new wxFileData(p, wxT(".."), wxFileData::is_dir, wxFileIconsTable::folder);
-            Add(fd, item);
+            if (Add(fd, item) != -1)
             item.m_itemId++;
+            else
+                delete fd;
         }
 
         wxString dirname(m_dirName);
@@ -547,8 +551,11 @@ void wxFileCtrl::UpdateFiles()
             while (cont)
             {
                 wxFileData *fd = new wxFileData(dirPrefix + f, f, wxFileData::is_dir, wxFileIconsTable::folder);
-                Add(fd, item);
+                if (Add(fd, item) != -1)
                 item.m_itemId++;
+                else
+                    delete fd;
+
                 cont = dir.GetNext(&f);
             }
 
@@ -562,8 +569,11 @@ void wxFileCtrl::UpdateFiles()
                 while (cont)
                 {
                     wxFileData *fd = new wxFileData(dirPrefix + f, f, wxFileData::is_file, wxFileIconsTable::file);
-                    Add(fd, item);
+                    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()
@@ -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();
 }
 
 //-----------------------------------------------------------------------------
@@ -835,10 +856,6 @@ END_EVENT_TABLE()
 long wxGenericFileDialog::ms_lastViewStyle = wxLC_LIST;
 bool wxGenericFileDialog::ms_lastShowHidden = FALSE;
 
-wxGenericFileDialog::wxGenericFileDialog()
-{
-}
-
 wxGenericFileDialog::wxGenericFileDialog(wxWindow *parent,
                            const wxString& message,
                            const wxString& defaultDir,
@@ -1368,21 +1385,6 @@ void wxGenericFileDialog::UpdateControls()
 
 IMPLEMENT_DYNAMIC_CLASS(wxFileDialog, wxGenericFileDialog);
 
-wxFileDialog::wxFileDialog()
-{
-}
-
-wxFileDialog::wxFileDialog(wxWindow *parent,
-                           const wxString& message,
-                           const wxString& defaultDir,
-                           const wxString& defaultFile,
-                           const wxString& wildCard,
-                           long style,
-                           const wxPoint& pos)
-          :wxGenericFileDialog(parent, message, defaultDir, defaultFile, wildCard, style, pos)
-{
-}
-
 #endif // USE_GENERIC_FILEDIALOG
 
 #endif // wxUSE_FILEDLG