+/////////////////////////////////////////////////////////////////////////////
+// Name:        common/fldlgcmn.cpp
+// Purpose:     wxFileDialog common functions
+// Author:      John Labenski
+// Modified by:
+// Created:     14.06.03 (extracted from src/*/filedlg.cpp)
+// RCS-ID:
+// Copyright:   (c) Robert Roebling
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef __GNUG__
+#pragma implementation "filedlg.h"
+#endif
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/string.h"
+    #include "wx/intl.h"
+    #include "wx/window.h"
+#endif // WX_PRECOMP
+
+#include "wx/filedlg.h"
+
+#if wxUSE_FILEDLG
+
+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)
+{
+    // The defaultExtension, 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 wxFileSelector( const wxChar *title,
+                         const wxChar *defaultDir,
+                         const wxChar *defaultFileName,
+                         const wxChar *defaultExtension,
+                         const wxChar *filter,
+                         int flags,
+                         wxWindow *parent,
+                         int x,
+                         int y )
+{
+    wxString filter2;
+    if ( defaultExtension && !filter )
+        filter2 = wxString(wxT("*.")) + wxString(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 ( fileDialog.ShowModal() == wxID_OK )
+    {
+        return fileDialog.GetPath();
+    }
+    else
+    {
+        return wxEmptyString;
+    }
+}
+*/
+
+
+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;
+}
+
+
+
+// Generic file load/save dialog (for internal use only)
+//   see wx[Load/Save]FileSelector
+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);
+
+    wxString wild;
+    const wxChar *ext = extension;
+    if ( ext )
+    {
+        if ( *ext == wxT('.') )
+            ext++;
+
+        wild.Printf(wxT("*.%s"), ext);
+    }
+    else // no extension specified
+    {
+        wild = wxFileSelectorDefaultWildcardStr;
+    }
+
+    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);
+}
+
+
+// Parses the filterStr, returning the number of filters.
+// Returns 0 if none or if there's a problem.
+// filterStr is in the form: "All files (*.*)|*.*|JPEG Files (*.jpeg)|*.jpg"
+
+int wxParseFileFilter(const wxString& filterStr,
+                      wxArrayString& descriptions,
+                      wxArrayString& filters)
+{
+    wxString str(filterStr);
+
+    wxString description, filter;
+    int pos = -1;
+    bool finished = FALSE;
+    do
+    {
+        pos = str.Find(wxT('|'));
+        if (pos == -1)
+            return 0; // Problem
+        description = str.Left(pos);
+        str = str.Mid(pos+1);
+        pos = str.Find(wxT('|'));
+        if (pos == -1)
+        {
+            filter = str;
+            finished = TRUE;
+        }
+        else
+        {
+            filter = str.Left(pos);
+            str = str.Mid(pos+1);
+        }
+
+        descriptions.Add(description);
+        filters.Add(filter);
+    }
+    while (!finished);
+
+    return filters.GetCount();
+}
+
+#endif // wxUSE_FILEDLG
+