X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/af111fc33841cc8bdc4d6cf027702805333bdd2a..7de24929eb363ba8c52b68a04e20d2774dd0b6b2:/src/motif/filedlg.cpp diff --git a/src/motif/filedlg.cpp b/src/motif/filedlg.cpp index 01b763e48d..9336136f94 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) @@ -149,7 +190,9 @@ static void wxChangeListBoxColours(wxWindow* WXUNUSED(win), Widget widget) // Change colour of the scrolled areas of the listboxes Widget listParent = XtParent (widget); +#if 0 wxWindow::DoChangeBackgroundColour((WXWidget) listParent, *wxWHITE, TRUE); +#endif Widget hsb = (Widget) 0; Widget vsb = (Widget) 0; @@ -161,7 +204,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 +230,20 @@ int wxFileDialog::ShowModal() } else parentWidget = (Widget) wxTheApp->GetTopLevelWidget(); + // prepare the arg list + Arg args[10]; + int ac = 0; + + wxComputeColours (XtDisplay(parentWidget), & m_backgroundColour, + (wxColour*) NULL); - Widget fileSel = XmCreateFileSelectionDialog(parentWidget, "file_selector", NULL, 0); + 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); @@ -224,20 +279,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, (char*)filter.c_str()); XmFileSelectionDoSearch(fileSel, NULL); } @@ -245,18 +297,22 @@ 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, (char*)entirePath.c_str()); } 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 +329,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);