]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/filedlg.cpp
fix for IsAlive() called after Kill() or Exit()
[wxWidgets.git] / src / msw / filedlg.cpp
index 249f674d4e2b44ab67cb2a2a114088e8a97f3b09..27d08e5447e07ea6084675c7d1137c2899fe3d8a 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
 /////////////////////////////////////////////////////////////////////////////
 
@@ -35,6 +35,7 @@
     #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 +43,7 @@
 
 #include "wx/msw/private.h"
 
-#if !defined(__WIN32__) || defined(__SALFORDC__) || defined(__WXWINE__)
+#if !defined(__WIN32__) || defined(__SALFORDC__)
     #include <commdlg.h>
 #endif
 
@@ -50,6 +51,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "wx/filename.h"
 #include "wx/tokenzr.h"
 
 #ifndef OFN_EXPLORER
@@ -61,7 +63,7 @@
 // ----------------------------------------------------------------------------
 
 #ifdef __WIN32__
-# define wxMAXPATH   4096
+# define wxMAXPATH   65534
 #else
 # define wxMAXPATH   1024
 #endif
 IMPLEMENT_CLASS(wxFileDialog, wxDialog)
 
 // ----------------------------------------------------------------------------
-// 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& WXUNUSED(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_path = wxEmptyString;
     m_fileName = defaultFileName;
     m_dir = defaultDir;
     m_wildCard = wildCard;
@@ -224,10 +117,21 @@ 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::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;
@@ -259,12 +163,13 @@ int wxFileDialog::ShowModal()
     {
         msw_flags |= OFN_NOCHANGEDIR;
     }
-
+/* chris elliott for some reason this does not work usefully if no extension
+   is given, as it test for junk instead of junk.ext
     if ( m_dialogStyle & wxOVERWRITE_PROMPT )
     {
         msw_flags |= OFN_OVERWRITEPROMPT;
     }
-
+*/
     OPENFILENAME of;
     wxZeroMemory(of);
 
@@ -309,8 +214,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
 
@@ -398,24 +306,6 @@ int wxFileDialog::ShowModal()
                                             : (GetOpenFileName(&of) != 0);
         }
     }
-
-#if wxUSE_UNICODE_MSLU && defined(OFN_EXPLORER)
-    // VS: these's a bug in unicows.dll - when multiple files are
-    //     selected, of.nFileOffset doesn't point to the first 
-    //     filename but rather to the last component of directory
-    //     name. Let's try to fix it:
-    if ( (m_dialogStyle & wxMULTIPLE) &&
-         (fileNameBuffer[of.nFileOffset-1] != wxT('\0')) &&
-         wxGetOsVersion() == wxWIN95 /*using unicows.dll*/)
-    {
-        if ( wxDirExists(fileNameBuffer) )
-        {
-            // 1st component is dir => multiple files selected
-            of.nFileOffset = wxStrlen(fileNameBuffer)+1;
-        }
-    }
-#endif // wxUSE_UNICODE_MSLU
-
 #endif // __WIN32__
 
     if ( success )
@@ -471,6 +361,17 @@ int wxFileDialog::ShowModal()
             {
                 // User has typed a filename without an extension:
 
+                // A filename can end in a "." here ("abc."), this means it
+                // does not have an extension. Because later on a "." with
+                // the default extension is appended we remove the "." if
+                // filename ends with one (We don't want files called
+                // "abc..ext")
+                int idx = wxStrlen(fileNameBuffer) - 1;
+                if ( fileNameBuffer[idx] == wxT('.') )
+                {
+                    fileNameBuffer[idx] = wxT('\0');
+                }
+
                 int   maxFilter = (int)(of.nFilterIndex*2L-1L);
                 extension = filterBuffer;
 
@@ -499,6 +400,18 @@ int wxFileDialog::ShowModal()
             m_fileNames.Add(m_fileName);
             m_dir = wxPathOnly(fileNameBuffer);
         }
+        //=== Simulating the wxOVERWRITE_PROMPT >>============================
+        //should we also test for file save style ??
+        if ( (m_dialogStyle & wxOVERWRITE_PROMPT) &&
+             ::wxFileExists( fileNameBuffer ) )
+             {
+             wxString messageText;
+             messageText.Printf(_("File '%s' already exists.\nDo you want to replace it?"), fileNameBuffer);
+             if ( wxMessageBox(messageText, wxT("Save File As"), wxYES_NO | wxICON_EXCLAMATION  ) != wxYES )
+             {
+                 success = FALSE;
+             }            
+        }
     }
     else
     {
@@ -519,50 +432,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