1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxFileDialog
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "filedlg.h"
18 #include "wx/dialog.h"
19 #include "wx/filedlg.h"
24 #include <Xm/MwmUtil.h>
26 #include <Xm/BulletinB.h>
29 #include <Xm/DialogS.h>
30 #include <Xm/FileSB.h>
31 #include <Xm/RowColumn.h>
32 #include <Xm/LabelG.h>
34 #if !USE_SHARED_LIBRARY
35 IMPLEMENT_CLASS(wxFileDialog
, wxDialog
)
38 #define DEFAULT_FILE_SELECTOR_SIZE 0
39 // Let Motif defines the size of File
40 // Selector Box (if 1), or fix it to
41 // wxFSB_WIDTH x wxFSB_HEIGHT (if 0)
42 #define wxFSB_WIDTH 600
43 #define wxFSB_HEIGHT 500
46 char *wxFileSelector(const char *title
,
47 const char *defaultDir
, const char *defaultFileName
,
48 const char *defaultExtension
, const char *filter
, int flags
,
49 wxWindow
*parent
, int x
, int y
)
51 // If there's a default extension specified but no filter, we create a suitable
55 if ( defaultExtension
&& !filter
)
56 filter2
= wxString("*.") + wxString(defaultExtension
) ;
60 wxString defaultDirString
;
62 defaultDirString
= defaultDir
;
64 defaultDirString
= "";
66 wxString defaultFilenameString
;
68 defaultFilenameString
= defaultFileName
;
70 defaultFilenameString
= "";
72 wxFileDialog
fileDialog(parent
, title
, defaultDirString
, defaultFilenameString
, filter2
, flags
, wxPoint(x
, y
));
74 if ( fileDialog
.ShowModal() == wxID_OK
)
76 strcpy(wxBuffer
, (const char *)fileDialog
.GetPath());
83 char *wxFileSelectorEx(const char *title
,
84 const char *defaultDir
,
85 const char *defaultFileName
,
86 int* defaultFilterIndex
,
94 wxFileDialog
fileDialog(parent
, title
? title
: "", defaultDir
? defaultDir
: "",
95 defaultFileName
? defaultFileName
: "", filter
? filter
: "", flags
, wxPoint(x
, y
));
97 if ( fileDialog
.ShowModal() == wxID_OK
)
99 *defaultFilterIndex
= fileDialog
.GetFilterIndex();
100 strcpy(wxBuffer
, (const char *)fileDialog
.GetPath());
107 wxString
wxFileDialog::m_fileSelectorAnswer
= "";
108 bool wxFileDialog::m_fileSelectorReturned
= FALSE
;
110 void wxFileSelCancel( Widget
WXUNUSED(fs
), XtPointer
WXUNUSED(client_data
),
111 XmFileSelectionBoxCallbackStruct
*WXUNUSED(cbs
) )
113 wxFileDialog::m_fileSelectorAnswer
= "";
114 wxFileDialog::m_fileSelectorReturned
= TRUE
;
117 void wxFileSelOk(Widget
WXUNUSED(fs
), XtPointer
WXUNUSED(client_data
), XmFileSelectionBoxCallbackStruct
*cbs
)
119 char *filename
= NULL
;
120 if (!XmStringGetLtoR(cbs
->value
, XmSTRING_DEFAULT_CHARSET
, &filename
)) {
121 wxFileDialog::m_fileSelectorAnswer
= "";
122 wxFileDialog::m_fileSelectorReturned
= TRUE
;
125 wxFileDialog::m_fileSelectorAnswer
= filename
;
128 wxFileDialog::m_fileSelectorReturned
= TRUE
;
132 wxFileDialog::wxFileDialog(wxWindow
*parent
, const wxString
& message
,
133 const wxString
& defaultDir
, const wxString
& defaultFileName
, const wxString
& wildCard
,
134 long style
, const wxPoint
& pos
)
137 m_dialogStyle
= style
;
140 m_fileName
= defaultFileName
;
142 m_wildCard
= wildCard
;
147 int wxFileDialog::ShowModal()
151 // static char fileBuf[512];
152 Widget parentWidget
= (Widget
) 0;
155 parentWidget
= (Widget
) m_parent
->GetTopWidget();
158 parentWidget
= (Widget
) wxTheApp
->GetTopLevelWidget();
160 Widget fileSel
= XmCreateFileSelectionDialog(parentWidget
, "file_selector", NULL
, 0);
161 XtUnmanageChild(XmFileSelectionBoxGetChild(fileSel
, XmDIALOG_HELP_BUTTON
));
163 Widget shell
= XtParent(fileSel
);
165 if (!m_message
.IsNull())
166 XtVaSetValues(shell
, XmNtitle
, (char*) (const char*) m_message
, NULL
);
168 wxString
entirePath("");
170 if ((m_dir
!= "") && (m_fileName
!= ""))
172 entirePath
= m_dir
+ wxString("/") + m_fileName
;
174 else if ((m_dir
!= "") && (m_fileName
== ""))
176 entirePath
= m_dir
+ wxString("/");
178 else if ((m_dir
== "") && (m_fileName
!= ""))
180 entirePath
= m_fileName
;
183 if (entirePath
!= "")
185 Widget selectionWidget
= XmFileSelectionBoxGetChild(fileSel
, XmDIALOG_TEXT
);
186 XmTextSetString(selectionWidget
, (char*) (const char*) entirePath
);
189 if (m_wildCard
!= "")
193 filter
= m_dir
+ wxString("/") + m_wildCard
;
197 Widget filterWidget
= XmFileSelectionBoxGetChild(fileSel
, XmDIALOG_FILTER_TEXT
);
198 XmTextSetString(filterWidget
, (char*) (const char*) filter
);
199 XmFileSelectionDoSearch(fileSel
, NULL
);
202 // Suggested by Terry Gitnick, 16/9/97, because of change in Motif
203 // file selector on Solaris 1.5.1.
206 XmString thePath
= XmStringCreateLtoR ((char*) (const char*) m_dir
,
207 XmSTRING_DEFAULT_CHARSET
);
209 XtVaSetValues (fileSel
,
210 XmNdirectory
, thePath
,
213 XmStringFree(thePath
);
216 XtAddCallback(fileSel
, XmNcancelCallback
, (XtCallbackProc
)wxFileSelCancel
, (XtPointer
)NULL
);
217 XtAddCallback(fileSel
, XmNokCallback
, (XtCallbackProc
)wxFileSelOk
, (XtPointer
)NULL
);
219 //#if XmVersion > 1000
220 // I'm not sure about what you mean with XmVersion.
221 // If this is for Motif1.1/Motif1.2, then check XmVersion>=1200
222 // (Motif1.1.4 ==> XmVersion 1100 )
223 // Nevertheless, I put here a #define, so anyone can choose in (I)makefile...
225 #if !DEFAULT_FILE_SELECTOR_SIZE
226 int width
= wxFSB_WIDTH
;
227 int height
= wxFSB_HEIGHT
;
228 XtVaSetValues(fileSel
,
231 XmNresizePolicy
, XmRESIZE_NONE
,
235 XtManageChild(fileSel
);
237 m_fileSelectorAnswer
= "";
238 m_fileSelectorReturned
= FALSE
;
242 XtAddGrab(XtParent(fileSel
), TRUE
, FALSE
);
244 while (!m_fileSelectorReturned
)
246 XtAppProcessEvent((XtAppContext
) wxTheApp
->GetAppContext(), XtIMAll
);
248 XtRemoveGrab(XtParent(fileSel
));
250 XmUpdateDisplay((Widget
) wxTheApp
->GetTopLevelWidget()); // Experimental
252 // XtDestroyWidget(fileSel);
253 XtUnmapWidget(XtParent(fileSel
));
254 XtDestroyWidget(XtParent(fileSel
));
256 // Now process all events, because otherwise
257 // this might remain on the screen
258 XSync(XtDisplay((Widget
) wxTheApp
->GetTopLevelWidget()), FALSE
);
259 while (XtAppPending((XtAppContext
) wxTheApp
->GetAppContext()))
261 XFlush(XtDisplay((Widget
) wxTheApp
->GetTopLevelWidget()));
262 XtAppNextEvent((XtAppContext
) wxTheApp
->GetAppContext(), &event
);
263 XtDispatchEvent(&event
);
266 m_path
= m_fileSelectorAnswer
;
267 m_fileName
= wxFileNameFromPath(m_fileSelectorAnswer
);
268 m_dir
= wxPathOnly(m_path
);
270 if (m_fileName
== "")
276 // Generic file load/save dialog
278 wxDefaultFileSelector(bool load
, const char *what
, const char *extension
, const char *default_name
, wxWindow
*parent
)
280 char *ext
= (char *)extension
;
285 str
= "Load %s file";
287 str
= "Save %s file";
288 sprintf(prompt
, wxGetTranslation(str
), what
);
290 if (*ext
== '.') ext
++;
292 sprintf(wild
, "*.%s", ext
);
294 return wxFileSelector (prompt
, NULL
, default_name
, ext
, wild
, 0, parent
);
297 // Generic file load dialog
299 wxLoadFileSelector(const char *what
, const char *extension
, const char *default_name
, wxWindow
*parent
)
301 return wxDefaultFileSelector(TRUE
, what
, extension
, default_name
, parent
);
305 // Generic file save dialog
307 wxSaveFileSelector(const char *what
, const char *extension
, const char *default_name
, wxWindow
*parent
)
309 return wxDefaultFileSelector(FALSE
, what
, extension
, default_name
, parent
);