X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a756f210019dd5b51331b7181c816d3882146a30..245f35816d761212279e8cf223475efb7a367553:/src/motif/filedlg.cpp diff --git a/src/motif/filedlg.cpp b/src/motif/filedlg.cpp index 91f301028c..ed2ca5e9c4 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,28 @@ void wxFileSelOk(Widget WXUNUSED(fs), XtPointer WXUNUSED(client_data), XmFileSel } } +static wxString ParseWildCard( const wxString& wild ) +{ +#ifdef __WXDEBUG__ + static const wxChar* msg = + _T("Motif file dialog does not understand this ") + _T("wildcard syntax"); +#endif + + 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) @@ -157,11 +188,13 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message, static void wxChangeListBoxColours(wxWindow* WXUNUSED(win), Widget widget) { - wxWindow::DoChangeBackgroundColour((WXWidget) widget, *wxWHITE); + wxDoChangeBackgroundColour((WXWidget) widget, *wxWHITE); // Change colour of the scrolled areas of the listboxes Widget listParent = XtParent (widget); - wxWindow::DoChangeBackgroundColour((WXWidget) listParent, *wxWHITE, TRUE); +#if 0 + wxDoChangeBackgroundColour((WXWidget) listParent, *wxWHITE, TRUE); +#endif Widget hsb = (Widget) 0; Widget vsb = (Widget) 0; @@ -174,8 +207,8 @@ static void wxChangeListBoxColours(wxWindow* WXUNUSED(win), Widget widget) * function to change them (by default, taken from wxSystemSettings) */ wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); - wxWindow::DoChangeBackgroundColour((WXWidget) hsb, backgroundColour, TRUE); - wxWindow::DoChangeBackgroundColour((WXWidget) vsb, backgroundColour, TRUE); + wxDoChangeBackgroundColour((WXWidget) hsb, backgroundColour, TRUE); + wxDoChangeBackgroundColour((WXWidget) vsb, backgroundColour, TRUE); if (hsb) XtVaSetValues (hsb, @@ -194,9 +227,7 @@ int wxFileDialog::ShowModal() // static char fileBuf[512]; Widget parentWidget = (Widget) 0; if (m_parent) - { parentWidget = (Widget) m_parent->GetTopWidget(); - } else parentWidget = (Widget) wxTheApp->GetTopLevelWidget(); // prepare the arg list @@ -231,7 +262,9 @@ int wxFileDialog::ShowModal() Widget shell = XtParent(fileSel); if (!m_message.IsNull()) - XtVaSetValues(shell, XmNtitle, (char*) (const char*) m_message, NULL); + XtVaSetValues(shell, + XmNtitle, wxConstCast(m_message.c_str(), char), + NULL); wxString entirePath(""); @@ -248,20 +281,17 @@ int wxFileDialog::ShowModal() entirePath = m_fileName; } - if (entirePath != "") - { - XmTextSetString(selectionWidget, (char*) (const char*) entirePath); - } - 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, wxConstCast(filter.c_str(), char)); XmFileSelectionDoSearch(fileSel, NULL); } @@ -269,18 +299,23 @@ int wxFileDialog::ShowModal() // file selector on Solaris 1.5.1. if ( m_dir != "" ) { - XmString thePath = XmStringCreateLtoR ((char*) (const char*) m_dir, - XmSTRING_DEFAULT_CHARSET); + wxXmString thePath( m_dir ); XtVaSetValues (fileSel, - XmNdirectory, thePath, + XmNdirectory, thePath(), NULL); + } - XmStringFree(thePath); + if (entirePath != "") + { + XmTextSetString(selectionWidget, + wxConstCast(entirePath.c_str(), char)); } 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. @@ -297,9 +332,9 @@ int wxFileDialog::ShowModal() XmNresizePolicy, XmRESIZE_NONE, NULL); #endif - // DoChangeBackgroundColour((WXWidget) fileSel, m_backgroundColour); - DoChangeBackgroundColour((WXWidget) filterWidget, *wxWHITE); - DoChangeBackgroundColour((WXWidget) selectionWidget, *wxWHITE); + // wxDoChangeBackgroundColour((WXWidget) fileSel, m_backgroundColour); + wxDoChangeBackgroundColour((WXWidget) filterWidget, *wxWHITE); + wxDoChangeBackgroundColour((WXWidget) selectionWidget, *wxWHITE); wxChangeListBoxColours(this, dirListWidget); wxChangeListBoxColours(this, fileListWidget); @@ -312,28 +347,25 @@ int wxFileDialog::ShowModal() wxEndBusyCursor(); XtAddGrab(XtParent(fileSel), TRUE, FALSE); + XtAppContext context = (XtAppContext) wxTheApp->GetAppContext(); XEvent event; while (!m_fileSelectorReturned) { - XtAppProcessEvent((XtAppContext) wxTheApp->GetAppContext(), XtIMAll); + XtAppNextEvent(context, &event); + XtDispatchEvent(&event); } XtRemoveGrab(XtParent(fileSel)); - XmUpdateDisplay((Widget) wxTheApp->GetTopLevelWidget()); // Experimental + // XmUpdateDisplay((Widget) wxTheApp->GetTopLevelWidget()); // Experimental + + Display* display = XtDisplay(fileSel); - // XtDestroyWidget(fileSel); XtUnmapWidget(XtParent(fileSel)); XtDestroyWidget(XtParent(fileSel)); // Now process all events, because otherwise // this might remain on the screen - XSync(XtDisplay((Widget) wxTheApp->GetTopLevelWidget()), FALSE); - while (XtAppPending((XtAppContext) wxTheApp->GetAppContext())) - { - XFlush(XtDisplay((Widget) wxTheApp->GetTopLevelWidget())); - XtAppNextEvent((XtAppContext) wxTheApp->GetAppContext(), &event); - XtDispatchEvent(&event); - } + wxFlushEvents(display); m_path = m_fileSelectorAnswer; m_fileName = wxFileNameFromPath(m_fileSelectorAnswer); @@ -349,7 +381,7 @@ int wxFileDialog::ShowModal() static wxString wxDefaultFileSelector(bool load, const char *what, const char *extension, const char *default_name, wxWindow *parent) { - char *ext = (char *)extension; + char *ext = wxConstCast(extension, char); wxString prompt; wxString str;