From a4e64fb55ec2490f5cd5297e7a5c6ba35971884c Mon Sep 17 00:00:00 2001 From: Mattia Barbon 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.45.2