1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxFileDialog
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "filedlg.h"
17 #define XtDisplay XTDISPLAY
18 #define XtParent XTPARENT
19 #define XtWindow XTWINDOW
24 #include "wx/dialog.h"
25 #include "wx/filedlg.h"
28 #include "wx/settings.h"
29 #include "wx/tokenzr.h"
32 #pragma message disable nosimpint
35 #include <Xm/MwmUtil.h>
37 #include <Xm/BulletinB.h>
40 #include <Xm/DialogS.h>
41 #include <Xm/FileSB.h>
42 #include <Xm/RowColumn.h>
43 #include <Xm/LabelG.h>
45 #pragma message enable nosimpint
48 #include "wx/motif/private.h"
50 IMPLEMENT_CLASS(wxFileDialog
, wxDialog
)
52 #define DEFAULT_FILE_SELECTOR_SIZE 0
53 // Let Motif defines the size of File
54 // Selector Box (if 1), or fix it to
55 // wxFSB_WIDTH x wxFSB_HEIGHT (if 0)
56 #define wxFSB_WIDTH 600
57 #define wxFSB_HEIGHT 500
60 wxString
wxFileSelector(const char *title
,
61 const char *defaultDir
, const char *defaultFileName
,
62 const char *defaultExtension
, const char *filter
, int flags
,
63 wxWindow
*parent
, int x
, int y
)
65 // If there's a default extension specified but no filter, we create a suitable
69 if ( defaultExtension
&& !filter
)
70 filter2
= wxString("*.") + wxString(defaultExtension
) ;
74 wxString defaultDirString
;
76 defaultDirString
= defaultDir
;
78 defaultDirString
= "";
80 wxString defaultFilenameString
;
82 defaultFilenameString
= defaultFileName
;
84 defaultFilenameString
= "";
86 wxFileDialog
fileDialog(parent
, title
, defaultDirString
, defaultFilenameString
, filter2
, flags
, wxPoint(x
, y
));
88 if ( fileDialog
.ShowModal() == wxID_OK
)
90 return fileDialog
.GetPath();
96 wxString
wxFileSelectorEx(const char *title
,
97 const char *defaultDir
,
98 const char *defaultFileName
,
99 int* defaultFilterIndex
,
107 wxFileDialog
fileDialog(parent
, title
? title
: "", defaultDir
? defaultDir
: "",
108 defaultFileName
? defaultFileName
: "", filter
? filter
: "", flags
, wxPoint(x
, y
));
110 if ( fileDialog
.ShowModal() == wxID_OK
)
112 *defaultFilterIndex
= fileDialog
.GetFilterIndex();
113 return fileDialog
.GetPath();
116 return wxEmptyString
;
119 wxString
wxFileDialog::m_fileSelectorAnswer
= "";
120 bool wxFileDialog::m_fileSelectorReturned
= FALSE
;
122 static void wxFileSelClose(Widget
WXUNUSED(w
),
123 void* WXUNUSED(client_data
),
124 XmAnyCallbackStruct
*WXUNUSED(call_data
))
126 wxFileDialog::m_fileSelectorAnswer
= "";
127 wxFileDialog::m_fileSelectorReturned
= TRUE
;
130 void wxFileSelCancel( Widget
WXUNUSED(fs
), XtPointer
WXUNUSED(client_data
),
131 XmFileSelectionBoxCallbackStruct
*WXUNUSED(cbs
) )
133 wxFileDialog::m_fileSelectorAnswer
= "";
134 wxFileDialog::m_fileSelectorReturned
= TRUE
;
137 void wxFileSelOk(Widget
WXUNUSED(fs
), XtPointer
WXUNUSED(client_data
), XmFileSelectionBoxCallbackStruct
*cbs
)
139 char *filename
= NULL
;
140 if (!XmStringGetLtoR(cbs
->value
, XmSTRING_DEFAULT_CHARSET
, &filename
)) {
141 wxFileDialog::m_fileSelectorAnswer
= "";
142 wxFileDialog::m_fileSelectorReturned
= TRUE
;
145 wxFileDialog::m_fileSelectorAnswer
= filename
;
148 wxFileDialog::m_fileSelectorReturned
= TRUE
;
152 static wxString
ParseWildCard( const wxString
& wild
)
155 static const wxChar
* msg
=
156 _T("Motif file dialog does not understand this ")
157 _T("wildcard syntax");
160 wxStringTokenizer
tok( wild
, _T("|") );
162 wxCHECK_MSG( tok
.CountTokens() <= 2, _T("*.*"), msg
);
164 if( tok
.CountTokens() == 1 ) return wild
;
168 wxStringTokenizer
tok2( tok
.GetNextToken(), _T(";") );
170 wxCHECK_MSG( tok2
.CountTokens() == 1, tok2
.GetNextToken(), msg
);
171 return tok2
.GetNextToken();
174 wxFileDialog::wxFileDialog(wxWindow
*parent
, const wxString
& message
,
175 const wxString
& defaultDir
, const wxString
& defaultFileName
, const wxString
& wildCard
,
176 long style
, const wxPoint
& pos
)
179 m_dialogStyle
= style
;
182 m_fileName
= defaultFileName
;
184 m_wildCard
= wildCard
;
189 static void wxChangeListBoxColours(wxWindow
* WXUNUSED(win
), Widget widget
)
191 wxDoChangeBackgroundColour((WXWidget
) widget
, *wxWHITE
);
193 // Change colour of the scrolled areas of the listboxes
194 Widget listParent
= XtParent (widget
);
196 wxDoChangeBackgroundColour((WXWidget
) listParent
, *wxWHITE
, TRUE
);
199 Widget hsb
= (Widget
) 0;
200 Widget vsb
= (Widget
) 0;
201 XtVaGetValues (listParent
,
202 XmNhorizontalScrollBar
, &hsb
,
203 XmNverticalScrollBar
, &vsb
,
206 /* TODO: should scrollbars be affected? Should probably have separate
207 * function to change them (by default, taken from wxSystemSettings)
209 wxColour backgroundColour
= wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE
);
210 wxDoChangeBackgroundColour((WXWidget
) hsb
, backgroundColour
, TRUE
);
211 wxDoChangeBackgroundColour((WXWidget
) vsb
, backgroundColour
, TRUE
);
215 XmNtroughColor
, backgroundColour
.AllocColour(XtDisplay(hsb
)),
219 XmNtroughColor
, backgroundColour
.AllocColour(XtDisplay(vsb
)),
223 int wxFileDialog::ShowModal()
227 // static char fileBuf[512];
228 Widget parentWidget
= (Widget
) 0;
231 parentWidget
= (Widget
) m_parent
->GetTopWidget();
234 parentWidget
= (Widget
) wxTheApp
->GetTopLevelWidget();
235 // prepare the arg list
239 wxComputeColours (XtDisplay(parentWidget
), & m_backgroundColour
,
242 XtSetArg(args
[ac
], XmNbackground
, g_itemColors
[wxBACK_INDEX
].pixel
); ac
++;
243 XtSetArg(args
[ac
], XmNtopShadowColor
, g_itemColors
[wxTOPS_INDEX
].pixel
); ac
++;
244 XtSetArg(args
[ac
], XmNbottomShadowColor
, g_itemColors
[wxBOTS_INDEX
].pixel
); ac
++;
245 XtSetArg(args
[ac
], XmNforeground
, g_itemColors
[wxFORE_INDEX
].pixel
); ac
++;
248 Widget fileSel
= XmCreateFileSelectionDialog(parentWidget
, "file_selector", args
, ac
);
249 XtUnmanageChild(XmFileSelectionBoxGetChild(fileSel
, XmDIALOG_HELP_BUTTON
));
251 Widget filterWidget
= XmFileSelectionBoxGetChild(fileSel
, XmDIALOG_FILTER_TEXT
);
252 Widget selectionWidget
= XmFileSelectionBoxGetChild(fileSel
, XmDIALOG_TEXT
);
253 Widget dirListWidget
= XmFileSelectionBoxGetChild(fileSel
, XmDIALOG_DIR_LIST
);
254 Widget fileListWidget
= XmFileSelectionBoxGetChild(fileSel
, XmDIALOG_LIST
);
256 // code using these vars disabled
258 Widget okWidget
= XmFileSelectionBoxGetChild(fileSel
, XmDIALOG_OK_BUTTON
);
259 Widget applyWidget
= XmFileSelectionBoxGetChild(fileSel
, XmDIALOG_APPLY_BUTTON
);
260 Widget cancelWidget
= XmFileSelectionBoxGetChild(fileSel
, XmDIALOG_CANCEL_BUTTON
);
264 Widget shell
= XtParent(fileSel
);
266 if (!m_message
.IsNull())
268 XmNtitle
, wxConstCast(m_message
.c_str(), char),
271 wxString
entirePath("");
273 if ((m_dir
!= "") && (m_fileName
!= ""))
275 entirePath
= m_dir
+ wxString("/") + m_fileName
;
277 else if ((m_dir
!= "") && (m_fileName
== ""))
279 entirePath
= m_dir
+ wxString("/");
281 else if ((m_dir
== "") && (m_fileName
!= ""))
283 entirePath
= m_fileName
;
286 if (m_wildCard
!= "")
288 // return something understandable by Motif
289 wxString wildCard
= ParseWildCard( m_wildCard
);
292 filter
= m_dir
+ wxString("/") + wildCard
;
296 XmTextSetString(filterWidget
, wxConstCast(filter
.c_str(), char));
297 XmFileSelectionDoSearch(fileSel
, NULL
);
300 // Suggested by Terry Gitnick, 16/9/97, because of change in Motif
301 // file selector on Solaris 1.5.1.
304 wxXmString
thePath( m_dir
);
306 XtVaSetValues (fileSel
,
307 XmNdirectory
, thePath(),
311 if (entirePath
!= "")
313 XmTextSetString(selectionWidget
,
314 wxConstCast(entirePath
.c_str(), char));
317 XtAddCallback(fileSel
, XmNcancelCallback
, (XtCallbackProc
)wxFileSelCancel
, (XtPointer
)NULL
);
318 XtAddCallback(fileSel
, XmNokCallback
, (XtCallbackProc
)wxFileSelOk
, (XtPointer
)NULL
);
319 XtAddCallback(fileSel
, XmNunmapCallback
,
320 (XtCallbackProc
)wxFileSelClose
, (XtPointer
)this);
322 //#if XmVersion > 1000
323 // I'm not sure about what you mean with XmVersion.
324 // If this is for Motif1.1/Motif1.2, then check XmVersion>=1200
325 // (Motif1.1.4 ==> XmVersion 1100 )
326 // Nevertheless, I put here a #define, so anyone can choose in (I)makefile...
328 #if !DEFAULT_FILE_SELECTOR_SIZE
329 int width
= wxFSB_WIDTH
;
330 int height
= wxFSB_HEIGHT
;
331 XtVaSetValues(fileSel
,
334 XmNresizePolicy
, XmRESIZE_NONE
,
337 // wxDoChangeBackgroundColour((WXWidget) fileSel, m_backgroundColour);
338 wxDoChangeBackgroundColour((WXWidget
) filterWidget
, *wxWHITE
);
339 wxDoChangeBackgroundColour((WXWidget
) selectionWidget
, *wxWHITE
);
341 wxChangeListBoxColours(this, dirListWidget
);
342 wxChangeListBoxColours(this, fileListWidget
);
344 XtManageChild(fileSel
);
346 m_fileSelectorAnswer
= "";
347 m_fileSelectorReturned
= FALSE
;
351 XtAddGrab(XtParent(fileSel
), TRUE
, FALSE
);
353 while (!m_fileSelectorReturned
)
355 XtAppProcessEvent((XtAppContext
) wxTheApp
->GetAppContext(), XtIMAll
);
357 XtRemoveGrab(XtParent(fileSel
));
359 XmUpdateDisplay((Widget
) wxTheApp
->GetTopLevelWidget()); // Experimental
361 // XtDestroyWidget(fileSel);
362 XtUnmapWidget(XtParent(fileSel
));
363 XtDestroyWidget(XtParent(fileSel
));
365 // Now process all events, because otherwise
366 // this might remain on the screen
367 XSync(XtDisplay((Widget
) wxTheApp
->GetTopLevelWidget()), FALSE
);
368 while (XtAppPending((XtAppContext
) wxTheApp
->GetAppContext()))
370 XFlush(XtDisplay((Widget
) wxTheApp
->GetTopLevelWidget()));
371 XtAppNextEvent((XtAppContext
) wxTheApp
->GetAppContext(), &event
);
372 XtDispatchEvent(&event
);
375 m_path
= m_fileSelectorAnswer
;
376 m_fileName
= wxFileNameFromPath(m_fileSelectorAnswer
);
377 m_dir
= wxPathOnly(m_path
);
379 if (m_fileName
== "")
385 // Generic file load/save dialog
387 wxDefaultFileSelector(bool load
, const char *what
, const char *extension
, const char *default_name
, wxWindow
*parent
)
389 char *ext
= wxConstCast(extension
, char);
394 str
= _("Load %s file");
396 str
= _("Save %s file");
397 prompt
.Printf(str
, what
);
402 wild
.Printf("*.%s", ext
);
404 return wxFileSelector (prompt
, NULL
, default_name
, ext
, wild
, 0, parent
);
407 // Generic file load dialog
408 wxString
wxLoadFileSelector(const char *what
, const char *extension
, const char *default_name
, wxWindow
*parent
)
410 return wxDefaultFileSelector(TRUE
, what
, extension
, default_name
, parent
);
414 // Generic file save dialog
415 wxString
wxSaveFileSelector(const char *what
, const char *extension
, const char *default_name
, wxWindow
*parent
)
417 return wxDefaultFileSelector(FALSE
, what
, extension
, default_name
, parent
);