]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/gtk/filedlg.cpp
Added chapter on collection and container classes to contents
[wxWidgets.git] / src / gtk / filedlg.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: filedlg.cpp
3// Purpose:
4// Author: Robert Roebling
5// Id: $Id$
6// Copyright: (c) 1998 Robert Roebling
7// Licence: wxWindows licence
8/////////////////////////////////////////////////////////////////////////////
9
10#ifdef __GNUG__
11#pragma implementation "filedlg.h"
12#endif
13
14#include "wx/filedlg.h"
15#include "wx/utils.h"
16#include "wx/intl.h"
17#include "wx/generic/msgdlgg.h"
18
19
20#ifdef __VMS__
21#define gtk_file_selection_hide_fileop_buttons gtk_file_selection_hide_fileop_
22#endif
23#include <gtk/gtk.h>
24
25//-----------------------------------------------------------------------------
26// idle system
27//-----------------------------------------------------------------------------
28
29extern void wxapp_install_idle_handler();
30extern bool g_isIdle;
31
32//-----------------------------------------------------------------------------
33// "delete_event"
34//-----------------------------------------------------------------------------
35
36static
37bool gtk_filedialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxDialog *win )
38{
39 if (g_isIdle) wxapp_install_idle_handler();
40
41/*
42 printf( "OnDelete from " );
43 if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
44 printf( win->GetClassInfo()->GetClassName() );
45 printf( ".\n" );
46*/
47
48 win->Close();
49
50 return TRUE;
51}
52
53//-----------------------------------------------------------------------------
54// "clicked" for OK-button
55//-----------------------------------------------------------------------------
56
57static
58void gtk_filedialog_ok_callback( GtkWidget *WXUNUSED(widget), wxFileDialog *dialog )
59{
60 if (g_isIdle) wxapp_install_idle_handler();
61
62 int style = dialog->GetStyle();
63
64 GtkFileSelection *filedlg = GTK_FILE_SELECTION(dialog->m_widget);
65 char *filename = gtk_file_selection_get_filename(filedlg);
66
67 if ( (style & wxSAVE) && ( style & wxOVERWRITE_PROMPT ) )
68 {
69 if (wxFileExists( filename ))
70 {
71 wxString msg;
72 msg.Printf( _("File '%s' already exists, do you really want to "
73 "overwrite it?"), filename);
74
75 if (wxMessageBox(msg, _("Confirm"), wxYES_NO) != wxYES)
76 return;
77 }
78 }
79 else if ( (style & wxOPEN) && ( style & wxFILE_MUST_EXIST) )
80 {
81 if ( !wxFileExists( filename ) )
82 {
83 wxMessageBox(_("Please choose an existing file."), _("Error"), wxOK);
84
85 return;
86 }
87 }
88
89 dialog->SetPath( filename );
90
91 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK);
92 event.SetEventObject( dialog );
93 dialog->GetEventHandler()->ProcessEvent( event );
94}
95
96//-----------------------------------------------------------------------------
97// "clicked" for Cancel-button
98//-----------------------------------------------------------------------------
99
100static
101void gtk_filedialog_cancel_callback( GtkWidget *WXUNUSED(w), wxFileDialog *dialog )
102{
103 if (g_isIdle) wxapp_install_idle_handler();
104
105 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
106 event.SetEventObject( dialog );
107 dialog->GetEventHandler()->ProcessEvent( event );
108}
109
110//-----------------------------------------------------------------------------
111// wxFileDialog
112//-----------------------------------------------------------------------------
113
114IMPLEMENT_DYNAMIC_CLASS(wxFileDialog,wxDialog)
115
116wxFileDialog::wxFileDialog( wxWindow *parent, const wxString& message,
117 const wxString& defaultDir, const wxString& defaultFileName,
118 const wxString& wildCard,
119 long style, const wxPoint& pos )
120{
121 m_needParent = FALSE;
122
123 if (!PreCreation( parent, pos, wxDefaultSize ) ||
124 !CreateBase( parent, -1, pos, wxDefaultSize, style | wxDIALOG_MODAL, wxDefaultValidator, wxT("filedialog") ))
125 {
126 wxFAIL_MSG( wxT("wxXX creation failed") );
127 return;
128 }
129
130 m_message = message;
131 m_path = wxT("");
132 m_fileName = defaultFileName;
133 m_dir = defaultDir;
134 m_wildCard = wildCard;
135 m_dialogStyle = style;
136 m_filterIndex = 1;
137
138 m_widget = gtk_file_selection_new( m_message.mbc_str() );
139
140 int x = (gdk_screen_width () - 400) / 2;
141 int y = (gdk_screen_height () - 400) / 2;
142 gtk_widget_set_uposition( m_widget, x, y );
143
144 GtkFileSelection *sel = GTK_FILE_SELECTION(m_widget);
145 gtk_file_selection_hide_fileop_buttons( sel ); // they don't work anyway
146
147 m_path.Append(m_dir);
148 if( ! m_path.IsEmpty() && m_path.Last()!=wxT('/') )
149 m_path.Append('/');
150 m_path.Append(m_fileName);
151
152 if(m_path.Length()>1) gtk_file_selection_set_filename(sel,m_path.mbc_str());
153
154 gtk_signal_connect( GTK_OBJECT(sel->ok_button), "clicked",
155 GTK_SIGNAL_FUNC(gtk_filedialog_ok_callback), (gpointer*)this );
156
157 // strange way to internationalize
158 gtk_label_set( GTK_LABEL( GTK_BUTTON(sel->ok_button)->child ), wxConvCurrent->cWX2MB(_("OK")) );
159
160 gtk_signal_connect( GTK_OBJECT(sel->cancel_button), "clicked",
161 GTK_SIGNAL_FUNC(gtk_filedialog_cancel_callback), (gpointer*)this );
162
163 // strange way to internationalize
164 gtk_label_set( GTK_LABEL( GTK_BUTTON(sel->cancel_button)->child ), wxConvCurrent->cWX2MB(_("Cancel")) );
165
166 gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event",
167 GTK_SIGNAL_FUNC(gtk_filedialog_delete_callback), (gpointer)this );
168}
169
170void wxFileDialog::SetPath(const wxString& path)
171{
172 // not only set the full path but also update filename and dir
173 m_path = path;
174 if ( !!path )
175 {
176 wxString ext;
177 wxSplitPath(path, &m_dir, &m_fileName, &ext);
178 if (!ext.IsEmpty())
179 {
180 m_fileName += wxT(".");
181 m_fileName += ext;
182 }
183 }
184}
185
186// ----------------------------------------------------------------------------
187// global functions
188// ----------------------------------------------------------------------------
189
190wxString
191wxFileSelectorEx(const wxChar *message,
192 const wxChar *default_path,
193 const wxChar *default_filename,
194 int *indexDefaultExtension,
195 const wxChar *wildcard,
196 int flags,
197 wxWindow *parent,
198 int x, int y)
199{
200 // TODO: implement this somehow
201 return wxFileSelector(message, default_path, default_filename, wxT(""),
202 wildcard, flags, parent, x, y);
203}
204
205wxString wxFileSelector( const wxChar *title,
206 const wxChar *defaultDir, const wxChar *defaultFileName,
207 const wxChar *defaultExtension, const wxChar *filter, int flags,
208 wxWindow *parent, int x, int y )
209{
210 wxString filter2;
211 if ( defaultExtension && !filter )
212 filter2 = wxString(wxT("*.")) + wxString(defaultExtension) ;
213 else if ( filter )
214 filter2 = filter;
215
216 wxString defaultDirString;
217 if (defaultDir)
218 defaultDirString = defaultDir;
219
220 wxString defaultFilenameString;
221 if (defaultFileName)
222 defaultFilenameString = defaultFileName;
223
224 wxFileDialog fileDialog( parent, title, defaultDirString, defaultFilenameString, filter2, flags, wxPoint(x, y) );
225
226 if ( fileDialog.ShowModal() == wxID_OK )
227 {
228 return fileDialog.GetPath();
229 }
230 else
231 {
232 return wxEmptyString;
233 }
234}
235
236wxString wxLoadFileSelector( const wxChar *what, const wxChar *extension, const wxChar *default_name, wxWindow *parent )
237{
238 wxChar *ext = (wxChar *)extension;
239
240 wxChar prompt[50];
241 wxString str = _("Load %s file");
242 wxSprintf(prompt, str, what);
243
244 if (*ext == wxT('.')) ext++;
245 wxChar wild[60];
246 wxSprintf(wild, wxT("*.%s"), ext);
247
248 return wxFileSelector (prompt, (const wxChar *) NULL, default_name, ext, wild, 0, parent);
249}
250
251wxString wxSaveFileSelector(const wxChar *what, const wxChar *extension, const wxChar *default_name,
252 wxWindow *parent )
253{
254 wxChar *ext = (wxChar *)extension;
255
256 wxChar prompt[50];
257 wxString str = _("Save %s file");
258 wxSprintf(prompt, str, what);
259
260 if (*ext == wxT('.')) ext++;
261 wxChar wild[60];
262 wxSprintf(wild, wxT("*.%s"), ext);
263
264 return wxFileSelector (prompt, (const wxChar *) NULL, default_name, ext, wild, 0, parent);
265}
266