]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/filedlg.cpp
fixed crash under GTK+ 2.0
[wxWidgets.git] / src / motif / filedlg.cpp
index a17964d2b87b4d7a09e58973ff288dc0bce68fd5..91f301028c958aeab9481ef2f0a8099a716ab1a5 100644 (file)
 #pragma implementation "filedlg.h"
 #endif
 
 #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"
 #include "wx/filedlg.h"
 #include "wx/intl.h"
 #include "wx/app.h"
 #include "wx/defs.h"
 #include "wx/utils.h"
 #include "wx/dialog.h"
 #include "wx/filedlg.h"
 #include "wx/intl.h"
 #include "wx/app.h"
+#include "wx/settings.h"
 
 
+#ifdef __VMS__
+#pragma message disable nosimpint
+#endif
 #include <Xm/Xm.h>
 #include <Xm/MwmUtil.h>
 #include <Xm/Label.h>
 #include <Xm/Xm.h>
 #include <Xm/MwmUtil.h>
 #include <Xm/Label.h>
 #include <Xm/FileSB.h>
 #include <Xm/RowColumn.h>
 #include <Xm/LabelG.h>
 #include <Xm/FileSB.h>
 #include <Xm/RowColumn.h>
 #include <Xm/LabelG.h>
+#ifdef __VMS__
+#pragma message enable nosimpint
+#endif
+
+#include "wx/motif/private.h"
 
 
-#if !USE_SHARED_LIBRARY
 IMPLEMENT_CLASS(wxFileDialog, wxDialog)
 IMPLEMENT_CLASS(wxFileDialog, wxDialog)
-#endif
 
 
-#define        DEFAULT_FILE_SELECTOR_SIZE 0
+#define DEFAULT_FILE_SELECTOR_SIZE 0
 // Let Motif defines the size of File
 // Selector Box (if 1), or fix it to
 // wxFSB_WIDTH x wxFSB_HEIGHT (if 0)
 // Let Motif defines the size of File
 // Selector Box (if 1), or fix it to
 // wxFSB_WIDTH x wxFSB_HEIGHT (if 0)
-#define        wxFSB_WIDTH                600
+#define wxFSB_WIDTH                600
 #define wxFSB_HEIGHT               500
 
 
 #define wxFSB_HEIGHT               500
 
 
-char *wxFileSelector(const char *title,
+wxString wxFileSelector(const char *title,
                      const char *defaultDir, const char *defaultFileName,
                      const char *defaultExtension, const char *filter, int flags,
                      wxWindow *parent, int x, int y)
 {
     // If there's a default extension specified but no filter, we create a suitable
     // filter.
                      const char *defaultDir, const char *defaultFileName,
                      const char *defaultExtension, const char *filter, int flags,
                      wxWindow *parent, int x, int y)
 {
     // If there's a default extension specified but no filter, we create a suitable
     // filter.
-    
+
     wxString filter2("");
     if ( defaultExtension && !filter )
         filter2 = wxString("*.") + wxString(defaultExtension) ;
     else if ( filter )
         filter2 = filter;
     wxString filter2("");
     if ( defaultExtension && !filter )
         filter2 = wxString("*.") + wxString(defaultExtension) ;
     else if ( filter )
         filter2 = filter;
-    
+
     wxString defaultDirString;
     if (defaultDir)
         defaultDirString = defaultDir;
     else
         defaultDirString = "";
     wxString defaultDirString;
     if (defaultDir)
         defaultDirString = defaultDir;
     else
         defaultDirString = "";
-    
+
     wxString defaultFilenameString;
     if (defaultFileName)
         defaultFilenameString = defaultFileName;
     else
         defaultFilenameString = "";
     wxString defaultFilenameString;
     if (defaultFileName)
         defaultFilenameString = defaultFileName;
     else
         defaultFilenameString = "";
-    
+
     wxFileDialog fileDialog(parent, title, defaultDirString, defaultFilenameString, filter2, flags, wxPoint(x, y));
     wxFileDialog fileDialog(parent, title, defaultDirString, defaultFilenameString, filter2, flags, wxPoint(x, y));
-    
+
     if ( fileDialog.ShowModal() == wxID_OK )
     {
     if ( fileDialog.ShowModal() == wxID_OK )
     {
-        strcpy(wxBuffer, (const char *)fileDialog.GetPath());
-        return wxBuffer;
+        return fileDialog.GetPath();
     }
     else
     }
     else
-        return NULL;
+        return wxEmptyString;
 }
 
 }
 
-char *wxFileSelectorEx(const char *title,
+wxString wxFileSelectorEx(const char *title,
                        const char *defaultDir,
                        const char *defaultFileName,
                        int* defaultFilterIndex,
                        const char *defaultDir,
                        const char *defaultFileName,
                        int* defaultFilterIndex,
@@ -89,25 +101,24 @@ char *wxFileSelectorEx(const char *title,
                        wxWindow* parent,
                        int       x,
                        int       y)
                        wxWindow* parent,
                        int       x,
                        int       y)
-                       
+
 {
     wxFileDialog fileDialog(parent, title ? title : "", defaultDir ? defaultDir : "",
         defaultFileName ? defaultFileName : "", filter ? filter : "", flags, wxPoint(x, y));
 {
     wxFileDialog fileDialog(parent, title ? title : "", defaultDir ? defaultDir : "",
         defaultFileName ? defaultFileName : "", filter ? filter : "", flags, wxPoint(x, y));
-    
+
     if ( fileDialog.ShowModal() == wxID_OK )
     {
         *defaultFilterIndex = fileDialog.GetFilterIndex();
     if ( fileDialog.ShowModal() == wxID_OK )
     {
         *defaultFilterIndex = fileDialog.GetFilterIndex();
-        strcpy(wxBuffer, (const char *)fileDialog.GetPath());
-        return wxBuffer;
+        return fileDialog.GetPath();
     }
     else
     }
     else
-        return NULL;
+        return wxEmptyString;
 }
 
 wxString wxFileDialog::m_fileSelectorAnswer = "";
 bool wxFileDialog::m_fileSelectorReturned = FALSE;
 
 }
 
 wxString wxFileDialog::m_fileSelectorAnswer = "";
 bool wxFileDialog::m_fileSelectorReturned = FALSE;
 
-void wxFileSelCancel( Widget WXUNUSED(fs), XtPointer WXUNUSED(client_data), 
+void wxFileSelCancel( Widget WXUNUSED(fs), XtPointer WXUNUSED(client_data),
                      XmFileSelectionBoxCallbackStruct *WXUNUSED(cbs) )
 {
     wxFileDialog::m_fileSelectorAnswer = "";
                      XmFileSelectionBoxCallbackStruct *WXUNUSED(cbs) )
 {
     wxFileDialog::m_fileSelectorAnswer = "";
@@ -144,10 +155,42 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
     m_pos = pos;
 }
 
     m_pos = pos;
 }
 
+static void wxChangeListBoxColours(wxWindow* WXUNUSED(win), Widget widget)
+{
+    wxWindow::DoChangeBackgroundColour((WXWidget) widget, *wxWHITE);
+
+    // Change colour of the scrolled areas of the listboxes
+    Widget listParent = XtParent (widget);
+    wxWindow::DoChangeBackgroundColour((WXWidget) listParent, *wxWHITE, TRUE);
+
+    Widget hsb = (Widget) 0;
+    Widget vsb = (Widget) 0;
+    XtVaGetValues (listParent,
+        XmNhorizontalScrollBar, &hsb,
+        XmNverticalScrollBar, &vsb,
+        NULL);
+
+   /* TODO: should scrollbars be affected? Should probably have separate
+    * 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);
+
+    if (hsb)
+      XtVaSetValues (hsb,
+        XmNtroughColor, backgroundColour.AllocColour(XtDisplay(hsb)),
+        NULL);
+    if (vsb)
+      XtVaSetValues (vsb,
+        XmNtroughColor, backgroundColour.AllocColour(XtDisplay(vsb)),
+        NULL);
+}
+
 int wxFileDialog::ShowModal()
 {
     wxBeginBusyCursor();
 int wxFileDialog::ShowModal()
 {
     wxBeginBusyCursor();
-    
+
     //  static char fileBuf[512];
     Widget parentWidget = (Widget) 0;
     if (m_parent)
     //  static char fileBuf[512];
     Widget parentWidget = (Widget) 0;
     if (m_parent)
@@ -156,17 +199,42 @@ int wxFileDialog::ShowModal()
     }
     else
         parentWidget = (Widget) wxTheApp->GetTopLevelWidget();
     }
     else
         parentWidget = (Widget) wxTheApp->GetTopLevelWidget();
-    
-    Widget fileSel = XmCreateFileSelectionDialog(parentWidget, "file_selector", NULL, 0);
+    // prepare the arg list
+    Arg args[10];
+    int ac = 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));
     XtUnmanageChild(XmFileSelectionBoxGetChild(fileSel, XmDIALOG_HELP_BUTTON));
-    
+
+    Widget filterWidget = XmFileSelectionBoxGetChild(fileSel, XmDIALOG_FILTER_TEXT);
+    Widget selectionWidget = XmFileSelectionBoxGetChild(fileSel, XmDIALOG_TEXT);
+    Widget dirListWidget = XmFileSelectionBoxGetChild(fileSel, XmDIALOG_DIR_LIST);
+    Widget fileListWidget = XmFileSelectionBoxGetChild(fileSel, XmDIALOG_LIST);
+
+    // code using these vars disabled
+#if 0
+    Widget okWidget = XmFileSelectionBoxGetChild(fileSel, XmDIALOG_OK_BUTTON);
+    Widget applyWidget = XmFileSelectionBoxGetChild(fileSel, XmDIALOG_APPLY_BUTTON);
+    Widget cancelWidget = XmFileSelectionBoxGetChild(fileSel, XmDIALOG_CANCEL_BUTTON);
+#endif
+
+
     Widget shell = XtParent(fileSel);
     Widget shell = XtParent(fileSel);
-    
+
     if (!m_message.IsNull())
         XtVaSetValues(shell, XmNtitle, (char*) (const char*) m_message, NULL);
     if (!m_message.IsNull())
         XtVaSetValues(shell, XmNtitle, (char*) (const char*) m_message, NULL);
-    
+
     wxString entirePath("");
     wxString entirePath("");
-    
+
     if ((m_dir != "") && (m_fileName != ""))
     {
         entirePath = m_dir + wxString("/") + m_fileName;
     if ((m_dir != "") && (m_fileName != ""))
     {
         entirePath = m_dir + wxString("/") + m_fileName;
@@ -179,13 +247,12 @@ int wxFileDialog::ShowModal()
     {
         entirePath = m_fileName;
     }
     {
         entirePath = m_fileName;
     }
-    
+
     if (entirePath != "")
     {
     if (entirePath != "")
     {
-        Widget selectionWidget = XmFileSelectionBoxGetChild(fileSel, XmDIALOG_TEXT);
         XmTextSetString(selectionWidget, (char*) (const char*) entirePath);
     }
         XmTextSetString(selectionWidget, (char*) (const char*) entirePath);
     }
-    
+
     if (m_wildCard != "")
     {
         wxString filter("");
     if (m_wildCard != "")
     {
         wxString filter("");
@@ -193,29 +260,28 @@ int wxFileDialog::ShowModal()
             filter = m_dir + wxString("/") + m_wildCard;
         else
             filter = m_wildCard;
             filter = m_dir + wxString("/") + m_wildCard;
         else
             filter = m_wildCard;
-        
-        Widget filterWidget = XmFileSelectionBoxGetChild(fileSel, XmDIALOG_FILTER_TEXT);
+
         XmTextSetString(filterWidget, (char*) (const char*) filter);
         XmFileSelectionDoSearch(fileSel, NULL);
     }
         XmTextSetString(filterWidget, (char*) (const char*) filter);
         XmFileSelectionDoSearch(fileSel, NULL);
     }
-    
+
     // Suggested by Terry Gitnick, 16/9/97, because of change in Motif
     // file selector on Solaris 1.5.1.
     if ( m_dir != "" )
     {
         XmString thePath = XmStringCreateLtoR ((char*) (const char*) m_dir,
             XmSTRING_DEFAULT_CHARSET);
     // Suggested by Terry Gitnick, 16/9/97, because of change in Motif
     // file selector on Solaris 1.5.1.
     if ( m_dir != "" )
     {
         XmString thePath = XmStringCreateLtoR ((char*) (const char*) m_dir,
             XmSTRING_DEFAULT_CHARSET);
-        
+
         XtVaSetValues (fileSel,
             XmNdirectory, thePath,
             NULL);
         XtVaSetValues (fileSel,
             XmNdirectory, thePath,
             NULL);
-        
+
         XmStringFree(thePath);
     }
         XmStringFree(thePath);
     }
-    
+
     XtAddCallback(fileSel, XmNcancelCallback, (XtCallbackProc)wxFileSelCancel, (XtPointer)NULL);
     XtAddCallback(fileSel, XmNokCallback, (XtCallbackProc)wxFileSelOk, (XtPointer)NULL);
     XtAddCallback(fileSel, XmNcancelCallback, (XtCallbackProc)wxFileSelCancel, (XtPointer)NULL);
     XtAddCallback(fileSel, XmNokCallback, (XtCallbackProc)wxFileSelOk, (XtPointer)NULL);
-    
+
     //#if XmVersion > 1000
     // I'm not sure about what you mean with XmVersion.
     // If this is for Motif1.1/Motif1.2, then check XmVersion>=1200
     //#if XmVersion > 1000
     // I'm not sure about what you mean with XmVersion.
     // If this is for Motif1.1/Motif1.2, then check XmVersion>=1200
@@ -231,14 +297,20 @@ int wxFileDialog::ShowModal()
         XmNresizePolicy, XmRESIZE_NONE,
         NULL);
 #endif
         XmNresizePolicy, XmRESIZE_NONE,
         NULL);
 #endif
-    
+    //    DoChangeBackgroundColour((WXWidget) fileSel, m_backgroundColour);
+    DoChangeBackgroundColour((WXWidget) filterWidget, *wxWHITE);
+    DoChangeBackgroundColour((WXWidget) selectionWidget, *wxWHITE);
+
+    wxChangeListBoxColours(this, dirListWidget);
+    wxChangeListBoxColours(this, fileListWidget);
+
     XtManageChild(fileSel);
     XtManageChild(fileSel);
-    
+
     m_fileSelectorAnswer = "";
     m_fileSelectorReturned = FALSE;
     m_fileSelectorAnswer = "";
     m_fileSelectorReturned = FALSE;
-    
+
     wxEndBusyCursor();
     wxEndBusyCursor();
-    
+
     XtAddGrab(XtParent(fileSel), TRUE, FALSE);
     XEvent event;
     while (!m_fileSelectorReturned)
     XtAddGrab(XtParent(fileSel), TRUE, FALSE);
     XEvent event;
     while (!m_fileSelectorReturned)
@@ -246,13 +318,13 @@ int wxFileDialog::ShowModal()
         XtAppProcessEvent((XtAppContext) wxTheApp->GetAppContext(), XtIMAll);
     }
     XtRemoveGrab(XtParent(fileSel));
         XtAppProcessEvent((XtAppContext) wxTheApp->GetAppContext(), XtIMAll);
     }
     XtRemoveGrab(XtParent(fileSel));
-    
+
     XmUpdateDisplay((Widget) wxTheApp->GetTopLevelWidget()); // Experimental
     XmUpdateDisplay((Widget) wxTheApp->GetTopLevelWidget()); // Experimental
-    
+
     //  XtDestroyWidget(fileSel);
     XtUnmapWidget(XtParent(fileSel));
     XtDestroyWidget(XtParent(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);
     // Now process all events, because otherwise
     // this might remain on the screen
     XSync(XtDisplay((Widget) wxTheApp->GetTopLevelWidget()), FALSE);
@@ -262,11 +334,11 @@ int wxFileDialog::ShowModal()
         XtAppNextEvent((XtAppContext) wxTheApp->GetAppContext(), &event);
         XtDispatchEvent(&event);
     }
         XtAppNextEvent((XtAppContext) wxTheApp->GetAppContext(), &event);
         XtDispatchEvent(&event);
     }
-    
+
     m_path = m_fileSelectorAnswer;
     m_fileName = wxFileNameFromPath(m_fileSelectorAnswer);
     m_dir = wxPathOnly(m_path);
     m_path = m_fileSelectorAnswer;
     m_fileName = wxFileNameFromPath(m_fileSelectorAnswer);
     m_dir = wxPathOnly(m_path);
-    
+
     if (m_fileName == "")
         return wxID_CANCEL;
     else
     if (m_fileName == "")
         return wxID_CANCEL;
     else
@@ -274,37 +346,36 @@ int wxFileDialog::ShowModal()
 }
 
 // Generic file load/save dialog
 }
 
 // Generic file load/save dialog
-static char *
+static wxString
 wxDefaultFileSelector(bool load, const char *what, const char *extension, const char *default_name, wxWindow *parent)
 {
     char *ext = (char *)extension;
 wxDefaultFileSelector(bool load, const char *what, const char *extension, const char *default_name, wxWindow *parent)
 {
     char *ext = (char *)extension;
-    
-    char prompt[50];
+
+    wxString prompt;
     wxString str;
     if (load)
     wxString str;
     if (load)
-        str = "Load %s file";
+        str = _("Load %s file");
     else
     else
-        str = "Save %s file";
-    sprintf(prompt, wxGetTranslation(str), what);
-    
-    if (*ext == '.') ext++;
-    char wild[60];
-    sprintf(wild, "*.%s", ext);
-    
+        str = _("Save %s file");
+    prompt.Printf(str, what);
+
+    if (*ext == '.')
+        ext++;
+    wxString wild;
+    wild.Printf("*.%s", ext);
+
     return wxFileSelector (prompt, NULL, default_name, ext, wild, 0, parent);
 }
 
 // Generic file load dialog
     return wxFileSelector (prompt, NULL, default_name, ext, wild, 0, parent);
 }
 
 // Generic file load dialog
-char *
-wxLoadFileSelector(const char *what, const char *extension, const char *default_name, wxWindow *parent)
+wxString wxLoadFileSelector(const char *what, const char *extension, const char *default_name, wxWindow *parent)
 {
     return wxDefaultFileSelector(TRUE, what, extension, default_name, parent);
 }
 
 
 // Generic file save dialog
 {
     return wxDefaultFileSelector(TRUE, what, extension, default_name, parent);
 }
 
 
 // Generic file save dialog
-char *
-wxSaveFileSelector(const char *what, const char *extension, const char *default_name, wxWindow *parent)
+wxString wxSaveFileSelector(const char *what, const char *extension, const char *default_name, wxWindow *parent)
 {
     return wxDefaultFileSelector(FALSE, what, extension, default_name, parent);
 }
 {
     return wxDefaultFileSelector(FALSE, what, extension, default_name, parent);
 }