]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/filedlg.cpp
WinCE fixes from "Viktor Voroshylo" <viktor@voroshylo.com>
[wxWidgets.git] / src / msw / filedlg.cpp
index c69ed436ec93847d664769cf05433b5fa2d6d5da..8677731279a52075f4b0e85ba48924241dbb7cd2 100644 (file)
@@ -5,7 +5,7 @@
 // Modified by:
 // Created:     01/02/97
 // RCS-ID:      $Id$
-// Copyright:   (c) Julian Smart and Markus Holzem
+// Copyright:   (c) Julian Smart
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
@@ -17,7 +17,7 @@
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "filedlg.h"
 #endif
 
     #pragma hdrstop
 #endif
 
-#if wxUSE_FILEDLG
+#if wxUSE_FILEDLG && !wxUSE_SMARTPHONE
 
 #ifndef WX_PRECOMP
     #include "wx/utils.h"
     #include "wx/msgdlg.h"
-    #include "wx/dialog.h"
     #include "wx/filedlg.h"
+    #include "wx/filefn.h"
     #include "wx/intl.h"
     #include "wx/log.h"
     #include "wx/app.h"
@@ -42,7 +42,7 @@
 
 #include "wx/msw/private.h"
 
-#if !defined(__WIN32__) || defined(__SALFORDC__) || defined(__WXWINE__)
+#if !defined(__WIN32__) || defined(__WXWINCE__)
     #include <commdlg.h>
 #endif
 
@@ -50,6 +50,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "wx/filename.h"
 #include "wx/tokenzr.h"
 
 #ifndef OFN_EXPLORER
@@ -61,7 +62,7 @@
 // ----------------------------------------------------------------------------
 
 #ifdef __WIN32__
-# define wxMAXPATH   4096
+# define wxMAXPATH   65534
 #else
 # define wxMAXPATH   1024
 #endif
 // implementation
 // ============================================================================
 
-// ----------------------------------------------------------------------------
-// wxWin macros
-// ----------------------------------------------------------------------------
-
-IMPLEMENT_CLASS(wxFileDialog, wxDialog)
+IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase)
 
 // ----------------------------------------------------------------------------
-// global functions
+// wxFileDialog
 // ----------------------------------------------------------------------------
 
-wxString wxFileSelector(const wxChar *title,
-                        const wxChar *defaultDir,
-                        const wxChar *defaultFileName,
-                        const wxChar *defaultExtension,
-                        const wxChar *filter,
-                        int flags,
-                        wxWindow *parent,
-                        int x, int y)
-{
-    // In the original implementation, defaultExtension is passed to the
-    // lpstrDefExt member of OPENFILENAME. This extension, if non-NULL, is
-    // appended to the filename if the user fails to type an extension. The new
-    // implementation (taken from wxFileSelectorEx) appends the extension
-    // automatically, by looking at the filter specification. In fact this
-    // should be better than the native Microsoft implementation because
-    // Windows only allows *one* default extension, whereas here we do the
-    // right thing depending on the filter the user has chosen.
-
-    // If there's a default extension specified but no filter, we create a
-    // suitable filter.
-
-    wxString filter2;
-    if ( defaultExtension && !filter )
-        filter2 = wxString(wxT("*.")) + defaultExtension;
-    else if ( filter )
-        filter2 = filter;
-
-    wxString defaultDirString;
-    if (defaultDir)
-        defaultDirString = defaultDir;
-
-    wxString defaultFilenameString;
-    if (defaultFileName)
-        defaultFilenameString = defaultFileName;
-
-    wxFileDialog fileDialog(parent, title, defaultDirString,
-                            defaultFilenameString, filter2,
-                            flags, wxPoint(x, y));
-    if( wxStrlen(defaultExtension) != 0 )
-    {
-        int filterFind = 0,
-            filterIndex = 0;
-
-        for( unsigned int i = 0; i < filter2.Len(); i++ )
-        {
-            if( filter2.GetChar(i) == wxT('|') )
-            {
-                // save the start index of the new filter
-                unsigned int is = i++;
-
-                // find the end of the filter
-                for( ; i < filter2.Len(); i++ )
-                {
-                    if(filter2[i] == wxT('|'))
-                        break;
-                }
-
-                if( i-is-1 > 0 && is+1 < filter2.Len() )
-                {
-                    if( filter2.Mid(is+1,i-is-1).Contains(defaultExtension) )
-                    {
-                        filterFind = filterIndex;
-                        break;
-                    }
-                }
-
-                filterIndex++;
-            }
-        }
-
-        fileDialog.SetFilterIndex(filterFind);
-    }
-
-    wxString filename;
-    if ( fileDialog.ShowModal() == wxID_OK )
-    {
-        filename = fileDialog.GetPath();
-    }
-
-    return filename;
-}
-
-
-wxString wxFileSelectorEx(const wxChar *title,
-                       const wxChar *defaultDir,
-                       const wxChar *defaultFileName,
-                       int* defaultFilterIndex,
-                       const wxChar *filter,
-                       int       flags,
-                       wxWindow* parent,
-                       int       x,
-                       int       y)
-
-{
-    wxFileDialog fileDialog(parent,
-                            title ? title : wxT(""),
-                            defaultDir ? defaultDir : wxT(""),
-                            defaultFileName ? defaultFileName : wxT(""),
-                            filter ? filter : wxT(""),
-                            flags, wxPoint(x, y));
-
-    wxString filename;
-    if ( fileDialog.ShowModal() == wxID_OK )
-    {
-        if ( defaultFilterIndex )
-            *defaultFilterIndex = fileDialog.GetFilterIndex();
-
-        filename = fileDialog.GetPath();
-    }
-
-    return filename;
-}
+wxFileDialog::wxFileDialog(wxWindow *parent,
+                           const wxString& message,
+                           const wxString& defaultDir,
+                           const wxString& defaultFileName,
+                           const wxString& wildCard,
+                           long style,
+                           const wxPoint& pos)
+             :wxFileDialogBase(parent, message, defaultDir, defaultFileName, wildCard, style, pos)
 
-wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
-        const wxString& defaultDir, const wxString& defaultFileName, const wxString& wildCard,
-        long style, const wxPoint& WXUNUSED(pos))
 {
-    m_message = message;
-    m_dialogStyle = style;
     if ( ( m_dialogStyle & wxMULTIPLE ) && ( m_dialogStyle & wxSAVE ) )
         m_dialogStyle &= ~wxMULTIPLE;
-    m_parent = parent;
-    m_path = wxT("");
-    m_fileName = defaultFileName;
-    m_dir = defaultDir;
-    m_wildCard = wildCard;
-    m_filterIndex = 0;
 }
 
 void wxFileDialog::GetPaths(wxArrayString& paths) const
@@ -224,10 +106,26 @@ void wxFileDialog::GetPaths(wxArrayString& paths) const
     size_t count = m_fileNames.GetCount();
     for ( size_t n = 0; n < count; n++ )
     {
-        paths.Add(dir + m_fileNames[n]);
+        if (wxFileName(m_fileNames[n]).IsAbsolute())
+            paths.Add(m_fileNames[n]);
+        else
+            paths.Add(dir + m_fileNames[n]);
     }
 }
 
+void wxFileDialog::GetFilenames(wxArrayString& files) const
+{
+    files = m_fileNames;
+}
+
+void wxFileDialog::SetPath(const wxString& path)
+{
+    wxString ext;
+    wxSplitPath(path, &m_dir, &m_fileName, &ext);
+    if ( !ext.empty() )
+        m_fileName << _T('.') << ext;
+}
+
 int wxFileDialog::ShowModal()
 {
     HWND hWnd = 0;
@@ -287,10 +185,11 @@ int wxFileDialog::ShowModal()
     // Convert forward slashes to backslashes (file selector doesn't like
     // forward slashes) and also squeeze multiple consecutive slashes into one
     // as it doesn't like two backslashes in a row neither
-    wxString dir;
-    size_t len = m_dir.length();
+
+    wxString   dir;
+    size_t     i, len = m_dir.length();
     dir.reserve(len);
-    for ( size_t i = 0; i < len; i++ )
+    for ( i = 0; i < len; i++ )
     {
         wxChar ch = m_dir[i];
         switch ( ch )
@@ -308,8 +207,11 @@ int wxFileDialog::ShowModal()
                     if ( chNext != _T('\\') && chNext != _T('/') )
                         break;
 
-                    // ignore the next one
-                    i++;
+                    // ignore the next one, unless it is at the start of a UNC path
+                    if (i > 0)
+                        i++;
+                    else
+                        break;    
                 }
                 // fall through
 
@@ -397,7 +299,7 @@ int wxFileDialog::ShowModal()
                                             : (GetOpenFileName(&of) != 0);
         }
     }
-#endif
+#endif // __WIN32__
 
     if ( success )
     {
@@ -405,10 +307,11 @@ int wxFileDialog::ShowModal()
 
         if ( ( m_dialogStyle & wxMULTIPLE ) &&
 #if defined(OFN_EXPLORER)
-             ( fileNameBuffer[of.nFileOffset-1] == wxT('\0') ) )
+             ( fileNameBuffer[of.nFileOffset-1] == wxT('\0') )
 #else
-             ( fileNameBuffer[of.nFileOffset-1] == wxT(' ') ) )
+             ( fileNameBuffer[of.nFileOffset-1] == wxT(' ') )
 #endif // OFN_EXPLORER
+           )
         {
 #if defined(OFN_EXPLORER)
             m_dir = fileNameBuffer;
@@ -423,7 +326,7 @@ int wxFileDialog::ShowModal()
                 i += wxStrlen(&fileNameBuffer[i]) + 1;
             }
 #else
-            wxStringTokenizer toke(fileNameBuffer, " \t\r\n");
+            wxStringTokenizer toke(fileNameBuffer, _T(" \t\r\n"));
             m_dir = toke.GetNextToken();
             m_fileName = toke.GetNextToken();
             m_fileNames.Add(m_fileName);
@@ -436,42 +339,27 @@ int wxFileDialog::ShowModal()
             if ( m_dir.Last() != _T('\\') )
                 dir += _T('\\');
 
-            m_fileNames.Sort();
             m_path = dir + m_fileName;
         }
         else
         {
-            const wxChar* extension = NULL;
-
             //=== Adding the correct extension >>=================================
 
             m_filterIndex = (int)of.nFilterIndex - 1;
 
-            if ( !of.nFileExtension || (of.nFileExtension && fileNameBuffer[ of.nFileExtension-1] != wxT('.')) )
-            {                                    // user has typed an filename
-                // without an extension:
-
-                int   maxFilter = (int)(of.nFilterIndex*2L-1L);
-                extension = filterBuffer;
-
-                for( int i = 0; i < maxFilter; i++ ) {          // get extension
-                    extension = extension + wxStrlen( extension ) +1;
-                }
+            if ( !of.nFileExtension || 
+                 (of.nFileExtension && fileNameBuffer[of.nFileExtension] == wxT('\0')) )
+            {
+                // User has typed a filename without an extension:
+                const wxChar* extension = filterBuffer;
+                int   maxFilter = (int)(of.nFilterIndex*2L) - 1;
 
-                extension = wxStrrchr( extension, wxT('.') );
-                if (  extension                                 // != "blabla"
-                        && !wxStrrchr( extension, wxT('*') )       // != "blabla.*"
-                        && !wxStrrchr( extension, wxT('?') )       // != "blabla.?"
-                        && extension[1]                           // != "blabla."
-                        && extension[1] != wxT(' ') )              // != "blabla. "
-                {
-                    // now concat extension to the fileName:
-                    m_fileName = wxString(fileNameBuffer) + extension;
+                for( int i = 0; i < maxFilter; i++ )           // get extension
+                    extension = extension + wxStrlen( extension ) + 1;
 
-                    int len = wxStrlen( fileNameBuffer );
-                    wxStrncpy( fileNameBuffer + len, extension, wxMAXPATH - len );
-                    fileNameBuffer[ wxMAXPATH -1 ] = wxT('\0');
-                }
+                m_fileName = AppendExtension(fileNameBuffer, extension);
+                wxStrncpy(fileNameBuffer, m_fileName.c_str(), wxMin(m_fileName.Len(), wxMAXPATH-1));
+                fileNameBuffer[wxMin(m_fileName.Len(), wxMAXPATH-1)] = wxT('\0');
             }
 
             m_path = fileNameBuffer;
@@ -499,50 +387,5 @@ int wxFileDialog::ShowModal()
 
 }
 
-// Generic file load/save dialog (for internal use only)
-static
-wxString wxDefaultFileSelector(bool load,
-                               const wxChar *what,
-                               const wxChar *extension,
-                               const wxChar *default_name,
-                               wxWindow *parent)
-{
-    wxString prompt;
-    wxString str;
-    if (load)
-        str = _("Load %s file");
-    else
-        str = _("Save %s file");
-    prompt.Printf(str, what);
-
-    const wxChar *ext = extension;
-    if (*ext == wxT('.'))
-        ext++;
-
-    wxString wild;
-    wild.Printf(wxT("*.%s"), ext);
-
-    return wxFileSelector(prompt, NULL, default_name, ext, wild,
-                          load ? wxOPEN : wxSAVE, parent);
-}
-
-// Generic file load dialog
-WXDLLEXPORT wxString wxLoadFileSelector(const wxChar *what,
-                                        const wxChar *extension,
-                                        const wxChar *default_name,
-                                        wxWindow *parent)
-{
-    return wxDefaultFileSelector(TRUE, what, extension, default_name, parent);
-}
-
-// Generic file save dialog
-WXDLLEXPORT wxString wxSaveFileSelector(const wxChar *what,
-                                        const wxChar *extension,
-                                        const wxChar *default_name,
-                                        wxWindow *parent)
-{
-    return wxDefaultFileSelector(FALSE, what, extension, default_name, parent);
-}
-
 #endif // wxUSE_FILEDLG