From a4e64fb55ec2490f5cd5297e7a5c6ba35971884c Mon Sep 17 00:00:00 2001
From: Mattia Barbon <mbarbon@cpan.org>
Date: Sat, 11 Jan 2003 14:36:25 +0000
Subject: [PATCH]   Documented wxMotif filedialog limitations WRT wildcard
 syntax. Modified filedialog to either extract the wildcard (if only one
 wildcard is present) or assert (if more than one is present).

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@18681 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/filedlg.tex   | 15 +++++++++++++-
 samples/dialogs/dialogs.cpp |  4 ++++
 src/motif/filedlg.cpp       | 41 +++++++++++++++++++++++++++++++++----
 3 files changed, 55 insertions(+), 5 deletions(-)

diff --git a/docs/latex/wx/filedlg.tex b/docs/latex/wx/filedlg.tex
index 5f2b412dd6..36657dadfe 100644
--- a/docs/latex/wx/filedlg.tex
+++ b/docs/latex/wx/filedlg.tex
@@ -38,6 +38,13 @@ types of file with a description for each, such as:
  "BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif"
 \end{verbatim}
 
+It must be noted that wildcard support in the native Motif file
+dialog is quite limited: only one alternative is supported,
+and it is displayed without the descriptive test; ``BMP files (*.bmp)|*.bmp''
+is displayed as ``*.bmp'', and both
+``BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif'' and
+``Image files|*.bmp;*.gif'' are errors.
+
 \latexignore{\rtfignore{\wxheading{Members}}}
 
 \membersection{wxFileDialog::wxFileDialog}\label{wxfiledialogconstr}
@@ -58,7 +65,10 @@ Constructor. Use \helpref{wxFileDialog::ShowModal}{wxfiledialogshowmodal} to sho
 
 \docparam{defaultFile}{The default filename, or the empty string.}
 
-\docparam{wildcard}{A wildcard, such as ``*.*" or ``BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif".}
+\docparam{wildcard}{A wildcard, such as ``*.*" or ``BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif".
+
+Note that the native Motif dialog has some limitations with respect to
+wildcards; see the Remarks section above.}
 
 \docparam{style}{A dialog style. A bitlist of:
 
@@ -192,6 +202,9 @@ Sets the wildcard, which can contain multiple file types, for example:
 
 ``BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif"
 
+Note that the native Motif dialog has some limitations with respect to
+wildcards; see the Remarks section above.
+
 \membersection{wxFileDialog::ShowModal}\label{wxfiledialogshowmodal}
 
 \func{int}{ShowModal}{\void}
diff --git a/samples/dialogs/dialogs.cpp b/samples/dialogs/dialogs.cpp
index 4ab181ce25..25e42ae0b5 100644
--- a/samples/dialogs/dialogs.cpp
+++ b/samples/dialogs/dialogs.cpp
@@ -457,7 +457,11 @@ void MyFrame::FileOpen(wxCommandEvent& WXUNUSED(event) )
                     _T("Testing open file dialog"),
                     _T(""),
                     _T(""),
+#ifdef __WXMOTIF__
+                    _T("C++ files (*.cpp)|*.cpp")
+#else
                     _T("C++ files (*.h;*.cpp)|*.h;*.cpp")
+#endif
                  );
 
     dialog.SetDirectory(wxGetHomeDir());
diff --git a/src/motif/filedlg.cpp b/src/motif/filedlg.cpp
index 91f301028c..8f4d17b899 100644
--- a/src/motif/filedlg.cpp
+++ b/src/motif/filedlg.cpp
@@ -26,6 +26,7 @@
 #include "wx/intl.h"
 #include "wx/app.h"
 #include "wx/settings.h"
+#include "wx/tokenzr.h"
 
 #ifdef __VMS__
 #pragma message disable nosimpint
@@ -118,6 +119,14 @@ wxString wxFileSelectorEx(const char *title,
 wxString wxFileDialog::m_fileSelectorAnswer = "";
 bool wxFileDialog::m_fileSelectorReturned = FALSE;
 
+static void wxFileSelClose(Widget WXUNUSED(w),
+                           void* WXUNUSED(client_data),
+                           XmAnyCallbackStruct *WXUNUSED(call_data))
+{
+    wxFileDialog::m_fileSelectorAnswer = "";
+    wxFileDialog::m_fileSelectorReturned = TRUE;
+}
+
 void wxFileSelCancel( Widget WXUNUSED(fs), XtPointer WXUNUSED(client_data),
                      XmFileSelectionBoxCallbackStruct *WXUNUSED(cbs) )
 {
@@ -140,6 +149,26 @@ void wxFileSelOk(Widget WXUNUSED(fs), XtPointer WXUNUSED(client_data), XmFileSel
     }
 }
 
+static wxString ParseWildCard( const wxString& wild )
+{
+    static const wxChar* msg =
+        _T("Motif file dialog does not understand this ")
+        _T("wildcard syntax");
+
+    wxStringTokenizer tok( wild, _T("|") );
+
+    wxCHECK_MSG( tok.CountTokens() <= 2, _T("*.*"), msg );
+
+    if( tok.CountTokens() == 1 ) return wild;
+
+    // CountTokens == 2
+    tok.GetNextToken();
+    wxStringTokenizer tok2( tok.GetNextToken(), _T(";") );
+
+    wxCHECK_MSG( tok2.CountTokens() == 1, tok2.GetNextToken(), msg );
+    return tok2.GetNextToken();
+}
+
 wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
                            const wxString& defaultDir, const wxString& defaultFileName, const wxString& wildCard,
                            long style, const wxPoint& pos)
@@ -255,13 +284,15 @@ int wxFileDialog::ShowModal()
 
     if (m_wildCard != "")
     {
-        wxString filter("");
+        // return something understandable by Motif
+        wxString wildCard = ParseWildCard( m_wildCard );
+        wxString filter;
         if (m_dir != "")
-            filter = m_dir + wxString("/") + m_wildCard;
+            filter = m_dir + wxString("/") + wildCard;
         else
-            filter = m_wildCard;
+            filter = wildCard;
 
-        XmTextSetString(filterWidget, (char*) (const char*) filter);
+        XmTextSetString(filterWidget, (char*)filter.c_str());
         XmFileSelectionDoSearch(fileSel, NULL);
     }
 
@@ -281,6 +312,8 @@ int wxFileDialog::ShowModal()
 
     XtAddCallback(fileSel, XmNcancelCallback, (XtCallbackProc)wxFileSelCancel, (XtPointer)NULL);
     XtAddCallback(fileSel, XmNokCallback, (XtCallbackProc)wxFileSelOk, (XtPointer)NULL);
+    XtAddCallback(fileSel, XmNunmapCallback,
+                  (XtCallbackProc)wxFileSelClose, (XtPointer)this);
 
     //#if XmVersion > 1000
     // I'm not sure about what you mean with XmVersion.
-- 
2.50.0

