]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/filedlgg.cpp
reversed some parts of wxGetKeyState for linkage reasons...
[wxWidgets.git] / src / generic / filedlgg.cpp
index f1fa6a4c9ff623b197e533141f9fdd27999d71df..6f301a8f232db66f95e02e5f83f95a8fa6a64f66 100644 (file)
@@ -9,7 +9,7 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
 #pragma implementation "filedlgg.h"
 #endif
 
 #pragma implementation "filedlgg.h"
 #endif
 
@@ -23,7 +23,7 @@
 #if wxUSE_FILEDLG
 
 // NOTE : it probably also supports MAC, untested
 #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
 
 #error wxGenericFileDialog currently only supports Unix, win32 and DOS
 #endif
 
     #endif
 #endif
 
     #endif
 #endif
 
+#ifdef __WINDOWS__
+    #include "wx/msw/wrapwin.h"
+    #include "wx/msw/mslu.h"
+#endif
+
 #ifdef __WATCOMC__
     #include <direct.h>
 #endif
 #ifdef __WATCOMC__
     #include <direct.h>
 #endif
@@ -77,7 +82,7 @@
 // ----------------------------------------------------------------------------
 
 static
 // ----------------------------------------------------------------------------
 
 static
-int wxFileDataNameCompare( long data1, long data2, long data)
+int wxCALLBACK wxFileDataNameCompare( long data1, long data2, long data)
 {
      wxFileData *fd1 = (wxFileData*)data1;
      wxFileData *fd2 = (wxFileData*)data2;
 {
      wxFileData *fd1 = (wxFileData*)data1;
      wxFileData *fd2 = (wxFileData*)data2;
@@ -89,7 +94,7 @@ int wxFileDataNameCompare( long data1, long data2, long data)
 }
 
 static
 }
 
 static
-int wxFileDataSizeCompare( long data1, long data2, long data)
+int wxCALLBACK wxFileDataSizeCompare( long data1, long data2, long data)
 {
      wxFileData *fd1 = (wxFileData*)data1;
      wxFileData *fd2 = (wxFileData*)data2;
 {
      wxFileData *fd1 = (wxFileData*)data1;
      wxFileData *fd2 = (wxFileData*)data2;
@@ -103,7 +108,7 @@ int wxFileDataSizeCompare( long data1, long data2, long data)
 }
 
 static
 }
 
 static
-int wxFileDataTypeCompare( long data1, long data2, long data)
+int wxCALLBACK wxFileDataTypeCompare( long data1, long data2, long data)
 {
      wxFileData *fd1 = (wxFileData*)data1;
      wxFileData *fd2 = (wxFileData*)data2;
 {
      wxFileData *fd1 = (wxFileData*)data1;
      wxFileData *fd2 = (wxFileData*)data2;
@@ -117,7 +122,7 @@ int wxFileDataTypeCompare( long data1, long data2, long data)
 }
 
 static
 }
 
 static
-int wxFileDataTimeCompare( long data1, long data2, long data)
+int wxCALLBACK wxFileDataTimeCompare( long data1, long data2, long data)
 {
      wxFileData *fd1 = (wxFileData*)data1;
      wxFileData *fd2 = (wxFileData*)data2;
 {
      wxFileData *fd1 = (wxFileData*)data1;
      wxFileData *fd2 = (wxFileData*)data2;
@@ -129,11 +134,11 @@ int wxFileDataTimeCompare( long data1, long data2, long data)
      return fd1->GetDateTime().IsLaterThan(fd2->GetDateTime()) ? int(data) : -int(data);
 }
 
      return fd1->GetDateTime().IsLaterThan(fd2->GetDateTime()) ? int(data) : -int(data);
 }
 
-#ifdef __UNIX__
+#if defined(__UNIX__) && !defined(__OS2__)
 #define IsTopMostDir(dir)   (dir == wxT("/"))
 #endif
 
 #define IsTopMostDir(dir)   (dir == wxT("/"))
 #endif
 
-#if defined(__DOS__) || defined(__WINDOWS__)
+#if defined(__DOS__) || defined(__WINDOWS__) || defined (__OS2__)
 #define IsTopMostDir(dir)   (dir.IsEmpty())
 #endif
 
 #define IsTopMostDir(dir)   (dir.IsEmpty())
 #endif
 
@@ -178,9 +183,9 @@ void wxFileData::ReadData()
         return;
     }
 
         return;
     }
 
-#if defined(__DOS__) || defined(__WINDOWS__)
+#if defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__)
     // c:\.. is a drive don't stat it
     // c:\.. is a drive don't stat it
-    if ((fileName == wxT("..")) && (filePath.length() <= 5))
+    if ((m_fileName == wxT("..")) && (m_filePath.length() <= 5))
     {
         m_type = is_drive;
         m_size = 0;
     {
         m_type = is_drive;
         m_size = 0;
@@ -190,7 +195,7 @@ void wxFileData::ReadData()
 
     wxStructStat buff;
 
 
     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()
     lstat( m_filePath.fn_str(), &buff );
     m_type |= S_ISLNK( buff.st_mode ) != 0 ? is_link : 0;
 #else // no lstat()
@@ -225,7 +230,7 @@ void wxFileData::ReadData()
                          buff.st_mode & wxS_IWOTH ? _T('w') : _T('-'),
                          buff.st_mode & wxS_IXOTH ? _T('x') : _T('-'));
 #elif defined(__WIN32__)
                          buff.st_mode & wxS_IWOTH ? _T('w') : _T('-'),
                          buff.st_mode & wxS_IXOTH ? _T('x') : _T('-'));
 #elif defined(__WIN32__)
-    DWORD attribs = GetFileAttributes(filePath);
+    DWORD attribs = GetFileAttributes(m_filePath);
     if (attribs != (DWORD)-1)
     {
         m_permissions.Printf(_T("%c%c%c%c"),
     if (attribs != (DWORD)-1)
     {
         m_permissions.Printf(_T("%c%c%c%c"),
@@ -338,8 +343,9 @@ void wxFileData::MakeItem( wxListItem &item )
 
     if (IsLink())
     {
 
     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;
 }
     }
     item.m_data = (long)this;
 }
@@ -485,12 +491,11 @@ void wxFileCtrl::UpdateFiles()
     FreeAllItemsData();
     DeleteAllItems();
 
     FreeAllItemsData();
     DeleteAllItems();
 
-    wxFileData *fd = (wxFileData *) NULL;
     wxListItem item;
     item.m_itemId = 0;
     item.m_col = 0;
 
     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;
     if ( IsTopMostDir(m_dirName) )
         {
         wxArrayString names, paths;
@@ -499,7 +504,7 @@ void wxFileCtrl::UpdateFiles()
 
         for (n=0; n<count; n++)
             {
 
         for (n=0; n<count; n++)
             {
-            fd = new wxFileData(paths[n], names[n], wxFileData::is_drive, icons[n]);
+            wxFileData *fd = new wxFileData(paths[n], names[n], wxFileData::is_drive, icons[n]);
                 Add(fd, item);
                 item.m_itemId++;
             }
                 Add(fd, item);
                 item.m_itemId++;
             }
@@ -511,19 +516,19 @@ void wxFileCtrl::UpdateFiles()
         if ( !IsTopMostDir(m_dirName) )
         {
             wxString p(wxPathOnly(m_dirName));
         if ( !IsTopMostDir(m_dirName) )
         {
             wxString p(wxPathOnly(m_dirName));
-#ifdef __UNIX__
+#if defined(__UNIX__) && !defined(__OS2__)
             if (p.IsEmpty()) p = wxT("/");
 #endif // __UNIX__
             if (p.IsEmpty()) p = wxT("/");
 #endif // __UNIX__
-            fd = new wxFileData(p, wxT(".."), wxFileData::is_dir, wxFileIconsTable::folder);
+            wxFileData *fd = new wxFileData(p, wxT(".."), wxFileData::is_dir, wxFileIconsTable::folder);
             Add(fd, item);
             item.m_itemId++;
         }
 
         wxString dirname(m_dirName);
             Add(fd, item);
             item.m_itemId++;
         }
 
         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('\\');
         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() )
         wxDir dir(dirname);
 
         if ( dir.IsOpened() )
@@ -541,7 +546,7 @@ void wxFileCtrl::UpdateFiles()
             cont = dir.GetFirst(&f, wxEmptyString, wxDIR_DIRS | hiddenFlag);
             while (cont)
             {
             cont = dir.GetFirst(&f, wxEmptyString, wxDIR_DIRS | hiddenFlag);
             while (cont)
             {
-                fd = new wxFileData(dirPrefix + f, f, wxFileData::is_dir, wxFileIconsTable::folder);
+                wxFileData *fd = new wxFileData(dirPrefix + f, f, wxFileData::is_dir, wxFileIconsTable::folder);
                 Add(fd, item);
                 item.m_itemId++;
                 cont = dir.GetNext(&f);
                 Add(fd, item);
                 item.m_itemId++;
                 cont = dir.GetNext(&f);
@@ -556,7 +561,7 @@ void wxFileCtrl::UpdateFiles()
                                         wxDIR_FILES | hiddenFlag);
                 while (cont)
                 {
                                         wxDIR_FILES | hiddenFlag);
                 while (cont)
                 {
-                    fd = new wxFileData(dirPrefix + f, f, wxFileData::is_file, wxFileIconsTable::file);
+                    wxFileData *fd = new wxFileData(dirPrefix + f, f, wxFileData::is_file, wxFileIconsTable::file);
                     Add(fd, item);
                     item.m_itemId++;
                     cont = dir.GetNext(&f);
                     Add(fd, item);
                     item.m_itemId++;
                     cont = dir.GetNext(&f);
@@ -632,7 +637,7 @@ void wxFileCtrl::GoToParentDir()
             m_dirName.Remove( len-1, 1 );
         wxString fname( wxFileNameFromPath(m_dirName) );
         m_dirName = wxPathOnly( m_dirName );
             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('.'))
         if (!m_dirName.IsEmpty())
         {
             if (m_dirName.Last() == wxT('.'))
@@ -810,7 +815,7 @@ wxFileCtrl::~wxFileCtrl()
 #define  ID_ACTIVATED     (wxID_FILEDLGG + 11)
 #define  ID_CHECK         (wxID_FILEDLGG + 12)
 
 #define  ID_ACTIVATED     (wxID_FILEDLGG + 11)
 #define  ID_CHECK         (wxID_FILEDLGG + 12)
 
-IMPLEMENT_DYNAMIC_CLASS(wxGenericFileDialog,wxDialog)
+IMPLEMENT_DYNAMIC_CLASS(wxGenericFileDialog, wxFileDialogBase)
 
 BEGIN_EVENT_TABLE(wxGenericFileDialog,wxDialog)
         EVT_BUTTON(ID_LIST_MODE, wxGenericFileDialog::OnList)
 
 BEGIN_EVENT_TABLE(wxGenericFileDialog,wxDialog)
         EVT_BUTTON(ID_LIST_MODE, wxGenericFileDialog::OnList)
@@ -837,9 +842,11 @@ wxGenericFileDialog::wxGenericFileDialog(wxWindow *parent,
                            const wxString& wildCard,
                            long style,
                            const wxPoint& pos )
                            const wxString& wildCard,
                            long style,
                            const wxPoint& pos )
-            : wxDialog( parent, -1, message, pos, wxDefaultSize,
-                        wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER )
+                    :wxFileDialogBase(parent, message, defaultDir, defaultFile, wildCard, style, pos)
 {
 {
+    wxDialog::Create( parent, -1, message, pos, wxDefaultSize,
+                      wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER );
+
     if (wxConfig::Get(FALSE))
     {
         wxConfig::Get()->Read(wxT("/wxWindows/wxFileDialog/ViewStyle"),
     if (wxConfig::Get(FALSE))
     {
         wxConfig::Get()->Read(wxT("/wxWindows/wxFileDialog/ViewStyle"),
@@ -848,15 +855,11 @@ wxGenericFileDialog::wxGenericFileDialog(wxWindow *parent,
                               &ms_lastShowHidden);
     }
 
                               &ms_lastShowHidden);
     }
 
-    m_message = message;
-    m_dialogStyle = style;
-
     if (m_dialogStyle == 0)
         m_dialogStyle = wxOPEN;
     if ((m_dialogStyle & wxMULTIPLE ) && !(m_dialogStyle & wxOPEN))
         m_dialogStyle |= wxOPEN;
 
     if (m_dialogStyle == 0)
         m_dialogStyle = wxOPEN;
     if ((m_dialogStyle & wxMULTIPLE ) && !(m_dialogStyle & wxOPEN))
         m_dialogStyle |= wxOPEN;
 
-    m_dir = defaultDir;
     if ((m_dir.empty()) || (m_dir == wxT(".")))
     {
         m_dir = wxGetCwd();
     if ((m_dir.empty()) || (m_dir == wxT(".")))
     {
         m_dir = wxGetCwd();
@@ -869,28 +872,13 @@ wxGenericFileDialog::wxGenericFileDialog(wxWindow *parent,
     m_path = m_dir;
     m_path += wxFILE_SEP_PATH;
     m_path += defaultFile;
     m_path = m_dir;
     m_path += wxFILE_SEP_PATH;
     m_path += defaultFile;
-    m_fileName = defaultFile;
-    m_wildCard = wildCard;
-    m_filterIndex = 0;
     m_filterExtension = wxEmptyString;
 
     // interpret wildcards
     m_filterExtension = wxEmptyString;
 
     // interpret wildcards
-
-    if (m_wildCard.IsEmpty())
-        m_wildCard = _("All files (*)|*");
-
     wxArrayString wildDescriptions, wildFilters;
     wxArrayString wildDescriptions, wildFilters;
-    int wild_count = wxParseFileFilter(m_wildCard, wildDescriptions, wildFilters);
-
-    wxASSERT_MSG(wild_count > 0, wxT("Wrong file type descripition") );
-
-    // if error parsing, add default back
-    if (wildFilters.GetCount() < 1u)
+    if ( !ParseWildcard(m_wildCard, wildDescriptions, wildFilters) )
     {
     {
-        wild_count = 1;
-        m_wildCard = _("All files (*)|*");
-        wildDescriptions.Add(_("All files (*)"));
-        wildFilters.Add(wxT("*"));
+        wxFAIL_MSG( wxT("Wrong file type description") );
     }
 
     // layout
     }
 
     // layout
@@ -1212,13 +1200,7 @@ void wxGenericFileDialog::HandleAction( const wxString &fn )
     //     file without extension as well?
     if ( !(m_dialogStyle & wxOPEN) || !wxFileExists(filename) )
     {
     //     file without extension as well?
     if ( !(m_dialogStyle & wxOPEN) || !wxFileExists(filename) )
     {
-        wxString ext;
-        wxSplitPath(filename, NULL, NULL, &ext);
-        if ( ext.empty() )
-        {
-            // append the first extension of the filter string
-            filename += m_filterExtension.BeforeFirst(_T(';'));
-        }
+        filename = AppendExtension(filename, m_filterExtension);
     }
 
     // check that the file [doesn't] exist if necessary
     }
 
     // check that the file [doesn't] exist if necessary
@@ -1227,8 +1209,7 @@ void wxGenericFileDialog::HandleAction( const wxString &fn )
                 wxFileExists( filename ) )
     {
         wxString msg;
                 wxFileExists( filename ) )
     {
         wxString msg;
-        msg.Printf( _("File '%s' already exists, do you really want to "
-                     "overwrite it?"), filename.c_str() );
+        msg.Printf( _("File '%s' already exists, do you really want to overwrite it?"), filename.c_str() );
 
         if (wxMessageBox(msg, _("Confirm"), wxYES_NO) != wxYES)
             return;
 
         if (wxMessageBox(msg, _("Confirm"), wxYES_NO) != wxYES)
             return;
@@ -1249,7 +1230,7 @@ void wxGenericFileDialog::HandleAction( const wxString &fn )
         wxString cwd;
         wxSplitPath(filename, &cwd, NULL, NULL);
 
         wxString cwd;
         wxSplitPath(filename, &cwd, NULL, NULL);
 
-        if ( cwd != wxGetWorkingDirectory() )
+        if ( cwd != wxGetCwd() )
         {
             wxSetWorkingDirectory(cwd);
         }
         {
             wxSetWorkingDirectory(cwd);
         }
@@ -1374,9 +1355,9 @@ void wxGenericFileDialog::UpdateControls()
     bool enable = !IsTopMostDir(dir);
     m_upDirButton->Enable(enable);
 
     bool enable = !IsTopMostDir(dir);
     m_upDirButton->Enable(enable);
 
-#if defined(__DOS__) || defined(__WINDOWS__)
+#if defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__)
     m_newDirButton->Enable(enable);
     m_newDirButton->Enable(enable);
-#endif // defined(__DOS__) || defined(__WINDOWS__)
+#endif // defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__)
 }
 
 #ifdef USE_GENERIC_FILEDIALOG
 }
 
 #ifdef USE_GENERIC_FILEDIALOG