]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/filedlg.cpp
check that wxString is valid before dumping it
[wxWidgets.git] / src / os2 / filedlg.cpp
index 21c89aaa9197b6a7d42d86198ef1522afdc8d4f0..c7e65a98a02a7348bfb92b70a37876ff41b92705 100644 (file)
 #ifndef WX_PRECOMP
     #include "wx/utils.h"
     #include "wx/msgdlg.h"
-    #include "wx/dialog.h"
     #include "wx/filedlg.h"
     #include "wx/intl.h"
     #include "wx/log.h"
     #include "wx/app.h"
+    #include "wx/math.h"
 #endif
 
 #define INCL_PM
@@ -31,7 +31,6 @@
 
 #include "wx/os2/private.h"
 
-#include <math.h>
 #include <stdlib.h>
 #include <string.h>
 
 #ifndef MAXEXT
 # define MAXEXT                         5
 #endif
-IMPLEMENT_CLASS(wxFileDialog, wxDialog)
-
-// ----------------------------------------------------------------------------
-// global functions
-// ----------------------------------------------------------------------------
-
-wxString wxFileSelector(
-  const char*                       pzTitle
-, const char*                       pzDefaultDir
-, const char*                       pzDefaultFileName
-, const char*                       pzDefaultExtension
-, const char*                       pzFilter
-, int                               nFlags
-, wxWindow*                         pParent
-, int                               nX
-, int                               nY
-)
-{
-    wxString                        sFilter("");
-    wxString                        sDefaultDirString;
-    wxString                        sDefaultFilenameString;
-
-    //
-    // If there's a default extension specified but no filter, we create
-    // a suitable filter.
-    //
-    if (pzDefaultExtension && !pzFilter)
-        sFilter = wxString("*.") + wxString(pzDefaultExtension);
-    else if (pzFilter)
-        sFilter = pzFilter;
-
-    if (pzDefaultDir)
-        sDefaultDirString = pzDefaultDir;
-    else
-        sDefaultDirString = "";
-
-    if (pzDefaultFileName)
-        sDefaultFilenameString = pzDefaultFileName;
-    else
-        sDefaultFilenameString = "";
-
-    wxFileDialog                    vFileDialog( pParent
-                                                ,pzTitle
-                                                ,sDefaultDirString
-                                                ,sDefaultFilenameString
-                                                ,sFilter
-                                                ,nFlags
-                                                ,wxPoint(nX, nY)
-                                               );
-
-    if (wxStrlen(pzDefaultExtension) != 0)
-    {
-        int                         nFilterFind = 0;
-        int                         nFilterIndex = 0;
-
-        for (unsigned int i = 0; i < sFilter.Len(); i++)
-        {
-            if (sFilter.GetChar(i) == wxT('|'))
-            {
-                //
-                // Save the start index of the new filter
-                unsigned int        uIs = i++;
-
-                //
-                // Find the end of the filter
-                //
-                for(; i < sFilter.Len(); i++)
-                {
-                    if(sFilter[i] == wxT('|'))
-                        break;
-                }
-
-                if( i - uIs - 1 > 0 && uIs + 1 < sFilter.Len() )
-                {
-                    if(sFilter.Mid(uIs + 1, i - uIs - 1).Contains(pzDefaultExtension))
-                    {
-                        nFilterFind = nFilterIndex;
-                        break;
-                    }
-                }
-                nFilterIndex++;
-            }
-        }
-        vFileDialog.SetFilterIndex(nFilterFind);
-    }
-    if (vFileDialog.ShowModal() == wxID_OK)
-    {
-        return vFileDialog.GetPath();
-    }
-    else
-        return wxEmptyString;
-} // end of wxFileSelector
-
-wxString wxFileSelectorEx (
-  const char*                       pzTitle
-, const char*                       pzDefaultDir
-, const char*                       pzDefaultFileName
-, int*                              pnDefaultFilterIndex
-, const char*                       pzFilter
-, int                               nFlags
-, wxWindow*                         pParent
-, int                               nX
-, int                               nY
-)
-{
-    wxFileDialog                    vFileDialog( pParent
-                                                ,pzTitle ? pzTitle : ""
-                                                ,pzDefaultDir ? pzDefaultDir : ""
-                                                ,pzDefaultFileName ? pzDefaultFileName : ""
-                                                ,pzFilter ? pzFilter : ""
-                                                ,nFlags
-                                                ,wxPoint(nX, nY)
-                                               );
-
-    if (vFileDialog.ShowModal() == wxID_OK)
-    {
-        *pnDefaultFilterIndex = vFileDialog.GetFilterIndex();
-        return vFileDialog.GetPath();
-    }
-    else
-        return wxEmptyString;
-} // end of wxFileSelectorEx
+IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase)
 
 // ----------------------------------------------------------------------------
 // CLASS wxFileDialog
@@ -192,34 +70,29 @@ wxFileDialog::wxFileDialog (
 , long                              lStyle
 , const wxPoint&                    rPos
 )
+    :wxFileDialogBase(pParent, rsMessage, rsDefaultDir, rsDefaultFileName, rsWildCard, lStyle, rPos)
+
 {
-    m_sMessage     = rsMessage;
-    m_lDialogStyle = lStyle;
-    if ((m_lDialogStyle & wxMULTIPLE) && (m_lDialogStyle & wxSAVE))
-        m_lDialogStyle &= ~wxMULTIPLE;
-    m_pParent      = pParent;
-    m_sPath        = "";
-    m_sFileName    = rsDefaultFileName;
-    m_sDir         = rsDefaultDir;
-    m_sWildCard    = rsWildCard;
-    m_nFilterIndex = 1;
-    m_vPos         = rPos;
+    if ((m_dialogStyle & wxMULTIPLE) && (m_dialogStyle & wxSAVE))
+        m_dialogStyle &= ~wxMULTIPLE;
+
+    m_filterIndex = 1;
 } // end of wxFileDialog::wxFileDialog
 
 void wxFileDialog::GetPaths (
   wxArrayString&                    rasPaths
 ) const
 {
-    wxString                        sDir(m_sDir);
-    size_t                          nCount = m_asFileNames.GetCount();
+    wxString                        sDir(m_dir);
+    size_t                          nCount = m_fileNames.GetCount();
 
     rasPaths.Empty();
-    if (m_sDir.Last() != _T('\\'))
+    if (m_dir.Last() != _T('\\'))
         sDir += _T('\\');
 
     for ( size_t n = 0; n < nCount; n++ )
     {
-        rasPaths.Add(sDir + m_asFileNames[n]);
+        rasPaths.Add(sDir + m_fileNames[n]);
     }
 } // end of wxFileDialog::GetPaths
 
@@ -227,18 +100,20 @@ int wxFileDialog::ShowModal()
 {
     wxString                        sTheFilter;
     wxString                        sFilterBuffer;
+    wxChar*                         pzFilterBuffer;
     static wxChar                   zFileNameBuffer[wxMAXPATH];           // the file-name
     HWND                            hWnd = 0;
     wxChar                          zTitleBuffer[wxMAXFILE + 1 + wxMAXEXT];  // the file-name, without path
-    wxString                       sDir;
-    size_t                             i;
-    size_t                          nLen = m_sDir.length();
+    wxString                        sDir;
+    size_t                          i;
+    size_t                          nLen = m_dir.length();
+    int                             nCount = 0;
     FILEDLG                         vFileDlg;
     ULONG                           lFlags = 0L;
 
     memset(&vFileDlg, '\0', sizeof(FILEDLG));
-    if (m_pParent)
-        hWnd = (HWND) m_pParent->GetHWND();
+    if (m_parent)
+        hWnd = (HWND) m_parent->GetHWND();
     if (!hWnd && wxTheApp->GetTopWindow())
         hWnd = (HWND) wxTheApp->GetTopWindow()->GetHWND();
 
@@ -246,17 +121,24 @@ int wxFileDialog::ShowModal()
     *zFileNameBuffer = wxT('\0');
     *zTitleBuffer    = wxT('\0');
 
-    m_lDialogStyle & wxSAVE ? lFlags != FDS_SAVEAS_DIALOG
-                                      : FDS_OPEN_DIALOG
-                                      ;
-    if ((m_lDialogStyle & wxHIDE_READONLY) || (m_lDialogStyle & wxSAVE))
+    if (m_dialogStyle & wxSAVE)
+        lFlags = FDS_SAVEAS_DIALOG;
+    else
+        lFlags = FDS_OPEN_DIALOG;
+
+#if WXWIN_COMPATIBILITY_2_4
+    if (m_dialogStyle & wxHIDE_READONLY)
+        lFlags |= FDS_SAVEAS_DIALOG;
+#endif
+
+    if (m_dialogStyle & wxSAVE)
         lFlags |= FDS_SAVEAS_DIALOG;
-    if (m_lDialogStyle & wxMULTIPLE )
+    if (m_dialogStyle & wxMULTIPLE )
         lFlags |= FDS_OPEN_DIALOG | FDS_MULTIPLESEL;
 
     vFileDlg.cbSize = sizeof(FILEDLG);
     vFileDlg.fl = lFlags;
-    vFileDlg.pszTitle = zTitleBuffer;
+    vFileDlg.pszTitle = (PSZ)zTitleBuffer;
 
     //
     // Convert forward slashes to backslashes (file selector doesn't like
@@ -266,7 +148,7 @@ int wxFileDialog::ShowModal()
     sDir.reserve(nLen);
     for ( i = 0; i < nLen; i++ )
     {
-        wxChar                      ch = m_sDir[i];
+        wxChar                      ch = m_dir[i];
 
         switch (ch)
         {
@@ -282,7 +164,7 @@ int wxFileDialog::ShowModal()
             case _T('\\'):
                 while (i < nLen - 1)
                 {
-                    wxChar          chNext = m_sDir[i + 1];
+                    wxChar          chNext = m_dir[i + 1];
 
                     if (chNext != _T('\\') && chNext != _T('/'))
                         break;
@@ -306,79 +188,72 @@ int wxFileDialog::ShowModal()
                 sDir += ch;
         }
     }
-    if ( wxStrlen(m_sWildCard) == 0 )
-        sTheFilter = "";
-    else
-        sTheFilter = m_sWildCard ;
-
-    if (!wxStrchr(sTheFilter, wxT('|') ) )
-    {
-        //
-        // Only one filter ==> default text
-        //
-        sFilterBuffer.Printf( _("Files (%s)|%s")
-                             ,sTheFilter.c_str()
-                             ,sTheFilter.c_str()
-                            );
-    }
+    if ( wxStrlen(m_wildCard) == 0 )
+        sTheFilter = wxEmptyString;
     else
-    {                                // more then one filter
-        sFilterBuffer = sTheFilter;
-    }
-
-    sFilterBuffer += wxT("|");
+        sTheFilter = m_wildCard;
 
-    //
-    // Replace | with \0
-    //
-    for (i = 0; i < sFilterBuffer.Len(); i++ )
+    wxStrtok((wxChar*)sTheFilter.c_str(), wxT("|"), &pzFilterBuffer);
+    while(pzFilterBuffer != NULL)
     {
-        if (sFilterBuffer.GetChar(i) == wxT('|'))
+        if (nCount > 0 && !(nCount % 2))
+            sDir += wxT(";");
+        if (nCount % 2)
         {
-            sFilterBuffer[i] = wxT('\0');
+            sDir += pzFilterBuffer;
         }
+        wxStrtok(NULL, wxT("|"), &pzFilterBuffer);
+        nCount++;
     }
-    if (!sTheFilter.IsEmpty())
-        sDir += sTheFilter;
-    else
-        sDir += m_sFileName;
-    wxStrcpy(vFileDlg.szFullFile, sDir.c_str());
-
-    hWnd = ::WinFileDlg( GetHwndOf(m_pParent)
-                        ,GetHwndOf(m_pParent)
+    if (nCount == 0)
+        sDir += m_fileName;
+    if (sDir.IsEmpty())
+        sDir = wxT("*.*");
+    wxStrcpy((wxChar*)vFileDlg.szFullFile, sDir);
+    sFilterBuffer = sDir;
+
+    hWnd = ::WinFileDlg( HWND_DESKTOP
+                        ,GetHwndOf(m_parent)
                         ,&vFileDlg
                        );
     if (hWnd && vFileDlg.lReturn == DID_OK)
     {
-        m_asFileNames.Empty();
-        if ((m_lDialogStyle & wxMULTIPLE ) && vFileDlg.ulFQFCount > 1)
+        m_fileNames.Empty();
+        if ((m_dialogStyle & wxMULTIPLE ) && vFileDlg.ulFQFCount > 1)
         {
-            for (int i = 0; i < vFileDlg.ulFQFCount; i++)
+            for (int i = 0; i < (int)vFileDlg.ulFQFCount; i++)
             {
                 if (i == 0)
                 {
-                    m_sDir = wxPathOnly(wxString((const char*)vFileDlg.papszFQFilename[i]));
-                    m_sPath = (const char*)vFileDlg.papszFQFilename[i];
+                    m_dir = wxPathOnly(wxString((const wxChar*)*vFileDlg.papszFQFilename[0]));
+                    m_path = (const wxChar*)*vFileDlg.papszFQFilename[0];
                 }
-                m_sFileName = wxFileNameFromPath(wxString((const char*)vFileDlg.papszFQFilename[i]));
-                m_asFileNames.Add(m_sFileName);
+                m_fileName = wxFileNameFromPath(wxString((const wxChar*)*vFileDlg.papszFQFilename[i]));
+                m_fileNames.Add(m_fileName);
             }
+            ::WinFreeFileDlgList(vFileDlg.papszFQFilename);
         }
-        else if (!m_lDialogStyle & wxSAVE)
+        else if (!(m_dialogStyle & wxSAVE))
         {
-            m_sPath = vFileDlg.szFullFile;
-            m_sFileName = wxFileNameFromPath(vFileDlg.szFullFile);
-            m_sDir = wxPathOnly(vFileDlg.szFullFile);
+            m_path = (wxChar*)vFileDlg.szFullFile;
+            m_fileName = wxFileNameFromPath(wxString((const wxChar*)vFileDlg.szFullFile));
+            m_dir = wxPathOnly((const wxChar*)vFileDlg.szFullFile);
         }
         else // save file
         {
             const wxChar*           pzExtension = NULL;
 
-            wxStrcpy(zFileNameBuffer, vFileDlg.szFullFile);
+            wxStrcpy(zFileNameBuffer, (const wxChar*)vFileDlg.szFullFile);
 
             int                     nIdx = wxStrlen(zFileNameBuffer) - 1;
+            wxString                sExt;
 
-            if (zFileNameBuffer[nIdx] == wxT('.') )
+            wxSplitPath( zFileNameBuffer
+                        ,&m_path
+                        ,&m_fileName
+                        ,&sExt
+                       );
+            if (zFileNameBuffer[nIdx] == wxT('.') || sExt.IsEmpty())
             {
                 zFileNameBuffer[nIdx] = wxT('\0');
 
@@ -393,7 +268,7 @@ int wxFileDialog::ShowModal()
                 //
                 pzExtension = sFilterBuffer.c_str();
 
-                for( int i = 0; i < sFilterBuffer.length(); i++ )
+                for( int i = 0; i < (int)sFilterBuffer.length(); i++ )
                 {
                     //
                     // Get extension
@@ -409,28 +284,28 @@ int wxFileDialog::ShowModal()
                         //
                         // Now concat extension to the fileName:
                         //
-                        m_sPath = wxString(zFileNameBuffer) + pzExtension;
+                        m_path = wxString(zFileNameBuffer) + pzExtension;
                     }
                 }
             }
             else
             {
-                m_sPath = vFileDlg.szFullFile;
+                m_path = (wxChar*)vFileDlg.szFullFile;
             }
-            m_sFileName = wxFileNameFromPath(vFileDlg.szFullFile);
-            m_sDir = wxPathOnly(vFileDlg.szFullFile);
+            m_fileName = wxFileNameFromPath((const wxChar*)vFileDlg.szFullFile);
+            m_dir = wxPathOnly((const wxChar*)vFileDlg.szFullFile);
 
             //
             // === Simulating the wxOVERWRITE_PROMPT >>============================
             //
-            if ((m_lDialogStyle & wxOVERWRITE_PROMPT) &&
-                (m_lDialogStyle & wxSAVE) &&
-                (wxFileExists(m_sPath.c_str())))
+            if ((m_dialogStyle & wxOVERWRITE_PROMPT) &&
+                (m_dialogStyle & wxSAVE) &&
+                (wxFileExists(m_path.c_str())))
             {
                 wxString            sMessageText;
 
                 sMessageText.Printf( _("File '%s' already exists.\nDo you want to replace it?")
-                                    ,m_sPath.c_str()
+                                    ,m_path.c_str()
                                    );
                 if (wxMessageBox( sMessageText
                                  ,wxT("Save File As")
@@ -446,75 +321,3 @@ int wxFileDialog::ShowModal()
     return wxID_CANCEL;
 } // end of wxFileDialog::ShowModal
 
-//
-// Generic file load/save dialog
-//
-static wxString wxDefaultFileSelector (
-  bool                              bLoad
-, const char*                       pzWhat
-, const char*                       pzExtension
-, const char*                       pzDefaultName
-, wxWindow*                         pParent
-)
-{
-    char*                           pzExt = (char *)pzExtension;
-    char                            zPrompt[50];
-    wxString                        sStr;
-    char                            zWild[60];
-
-    if (bLoad)
-        sStr = "Load %s file";
-    else
-        sStr = "Save %s file";
-    sprintf(zPrompt, wxGetTranslation(sStr), pzWhat);
-
-    if (*pzExt == '.')
-        pzExt++;
-    sprintf(zWild, "*.%s", pzExt);
-    return wxFileSelector ( zPrompt
-                           ,NULL
-                           ,pzDefaultName
-                           ,pzExt
-                           ,zWild
-                           ,0
-                           ,pParent
-                          );
-} // end of wxDefaultFileSelector
-
-//
-// Generic file load dialog
-//
-wxString wxLoadFileSelector (
-  const char*                       pzWhat
-, const char*                       pzExtension
-, const char*                       pzDefaultName
-, wxWindow*                         pParent
-)
-{
-    return wxDefaultFileSelector( TRUE
-                                 ,pzWhat
-                                 ,pzExtension
-                                 ,pzDefaultName
-                                 ,pParent
-                                );
-} // end of wxLoadFileSelector
-
-
-//
-// Generic file save dialog
-//
-wxString wxSaveFileSelector (
-  const char*                       pzWhat
-, const char*                       pzExtension
-, const char*                       pzDefaultName
-, wxWindow*                         pParent
-)
-{
-    return wxDefaultFileSelector( FALSE
-                                 ,pzWhat
-                                 ,pzExtension
-                                 ,pzDefaultName
-                                 ,pParent
-                                );
-} // end of wxSaveFileSelector
-