X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/af111fc33841cc8bdc4d6cf027702805333bdd2a..4fd899b671b25d3671e3fceb1b59f8edd9113af9:/src/motif/filedlg.cpp diff --git a/src/motif/filedlg.cpp b/src/motif/filedlg.cpp index 01b763e48d..8f4d17b899 100644 --- a/src/motif/filedlg.cpp +++ b/src/motif/filedlg.cpp @@ -13,6 +13,12 @@ #pragma implementation "filedlg.h" #endif +#ifdef __VMS +#define XtDisplay XTDISPLAY +#define XtParent XTPARENT +#define XtWindow XTWINDOW +#endif + #include "wx/defs.h" #include "wx/utils.h" #include "wx/dialog.h" @@ -20,7 +26,11 @@ #include "wx/intl.h" #include "wx/app.h" #include "wx/settings.h" +#include "wx/tokenzr.h" +#ifdef __VMS__ +#pragma message disable nosimpint +#endif #include #include #include @@ -31,10 +41,13 @@ #include #include #include +#ifdef __VMS__ +#pragma message enable nosimpint +#endif + +#include "wx/motif/private.h" -#if !USE_SHARED_LIBRARY IMPLEMENT_CLASS(wxFileDialog, wxDialog) -#endif #define DEFAULT_FILE_SELECTOR_SIZE 0 // Let Motif defines the size of File @@ -106,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) ) { @@ -128,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) @@ -161,7 +202,7 @@ static void wxChangeListBoxColours(wxWindow* WXUNUSED(win), Widget widget) /* TODO: should scrollbars be affected? Should probably have separate * function to change them (by default, taken from wxSystemSettings) */ - wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE); + wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); wxWindow::DoChangeBackgroundColour((WXWidget) hsb, backgroundColour, TRUE); wxWindow::DoChangeBackgroundColour((WXWidget) vsb, backgroundColour, TRUE); @@ -187,8 +228,20 @@ int wxFileDialog::ShowModal() } else parentWidget = (Widget) wxTheApp->GetTopLevelWidget(); + // prepare the arg list + Arg args[10]; + int ac = 0; - Widget fileSel = XmCreateFileSelectionDialog(parentWidget, "file_selector", NULL, 0); + wxComputeColours (XtDisplay(parentWidget), & m_backgroundColour, + (wxColour*) NULL); + + XtSetArg(args[ac], XmNbackground, g_itemColors[wxBACK_INDEX].pixel); ac++; + XtSetArg(args[ac], XmNtopShadowColor, g_itemColors[wxTOPS_INDEX].pixel); ac++; + XtSetArg(args[ac], XmNbottomShadowColor, g_itemColors[wxBOTS_INDEX].pixel); ac++; + XtSetArg(args[ac], XmNforeground, g_itemColors[wxFORE_INDEX].pixel); ac++; + + + Widget fileSel = XmCreateFileSelectionDialog(parentWidget, "file_selector", args, ac); XtUnmanageChild(XmFileSelectionBoxGetChild(fileSel, XmDIALOG_HELP_BUTTON)); Widget filterWidget = XmFileSelectionBoxGetChild(fileSel, XmDIALOG_FILTER_TEXT); @@ -231,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); } @@ -257,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. @@ -273,17 +330,10 @@ int wxFileDialog::ShowModal() XmNresizePolicy, XmRESIZE_NONE, NULL); #endif - DoChangeBackgroundColour((WXWidget) fileSel, m_backgroundColour); + // DoChangeBackgroundColour((WXWidget) fileSel, m_backgroundColour); DoChangeBackgroundColour((WXWidget) filterWidget, *wxWHITE); DoChangeBackgroundColour((WXWidget) selectionWidget, *wxWHITE); - // apparently, this provokes a crash -#if 0 - DoChangeBackgroundColour((WXWidget) okWidget, m_backgroundColour, TRUE); - DoChangeBackgroundColour((WXWidget) cancelWidget, m_backgroundColour, TRUE); - DoChangeBackgroundColour((WXWidget) applyWidget, m_backgroundColour, TRUE); -#endif - wxChangeListBoxColours(this, dirListWidget); wxChangeListBoxColours(this, fileListWidget);