diff --git a/src/common/descrip.mms b/src/common/descrip.mms index 09e28969fc..c8930dcc0b 100644 --- a/src/common/descrip.mms +++ b/src/common/descrip.mms @@ -2,7 +2,7 @@ # * # Make file for VMS * # Author : J.Jansen (joukj@hrem.nano.tudelft.nl) * -# Date : 19 January 2006 * +# Date : 3 May 2006 * # * #***************************************************************************** .first @@ -64,6 +64,8 @@ OBJECTS = \ cmndata.obj,\ config.obj,\ containr.obj,\ + convauto.obj,\ + colourcmn.obj,\ cshelp.obj,\ ctrlcmn.obj,\ ctrlsub.obj,\ @@ -207,6 +209,8 @@ SOURCES = \ cmndata.cpp,\ config.cpp,\ containr.cpp,\ + convauto.cpp,\ + colourcmn.cpp,\ cshelp.cpp,\ ctrlcmn.cpp,\ ctrlsub.cpp,\ @@ -390,6 +394,8 @@ cmdproc.obj : cmdproc.cpp cmndata.obj : cmndata.cpp config.obj : config.cpp containr.obj : containr.cpp +convauto.obj : convauto.cpp +colourcmn.obj : colourcmn.cpp cshelp.obj : cshelp.cpp ctrlcmn.obj : ctrlcmn.cpp ctrlsub.obj : ctrlsub.cpp diff --git a/src/gtk1/descrip.mms b/src/gtk1/descrip.mms index a4d74a08ca..be5d1c9d2d 100644 --- a/src/gtk1/descrip.mms +++ b/src/gtk1/descrip.mms @@ -2,7 +2,7 @@ # * # Make file for VMS * # Author : J.Jansen (joukj@hrem.stm.tudelft.nl) * -# Date : 2 March 2000 * +# Date : 2 May 2006 * # * #***************************************************************************** .first @@ -39,6 +39,7 @@ OBJECTS = \ dcclient.obj,\ dcmemory.obj,\ dcscreen.obj,\ + dirdlg.obj,\ dnd.obj,\ evtloop.obj,\ filedlg.obj,\ @@ -115,6 +116,7 @@ SOURCES =\ dcmemory.cpp,\ dcscreen.cpp,\ dialog.cpp,\ + dirdlg.cpp,\ dnd.cpp,\ evtloop.cpp,\ filedlg.cpp,\ @@ -236,3 +238,4 @@ utilsgtk.obj : utilsgtk.cpp utilsres.obj : utilsres.cpp win_gtk.obj : win_gtk.c window.obj : window.cpp +dirdlg.obj : dirdlg.cpp diff --git a/src/gtk1/dirdlg.cpp b/src/gtk1/dirdlg.cpp new file mode 100644 index 0000000000..56ad5ae859 --- /dev/null +++ b/src/gtk1/dirdlg.cpp @@ -0,0 +1,276 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/gtk/dirdlg.cpp +// Purpose: native implementation of wxDirDialog +// Author: Robert Roebling, Zbigniew Zagorski, Mart Raudsepp, Francesco Montorsi +// Id: $Id$ +// Copyright: (c) 1998 Robert Roebling, 2004 Zbigniew Zagorski, 2005 Mart Raudsepp +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + + + +/* + NOTE: the GtkFileChooser interface can be used both for wxFileDialog and for wxDirDialog. + Thus following code is very similar (even if not identic) to src/gtk/filedlg.cpp + If you find a problem in this code, remember to check also that file ! +*/ + + + +#if wxUSE_DIRDLG + +#include "wx/dirdlg.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/filedlg.h" +#endif + +#ifdef __WXGTK24__ + +#include +#include "wx/gtk/private.h" + +#include // chdir + +#include "wx/filename.h" // wxFilename +#include "wx/tokenzr.h" // wxStringTokenizer +#include "wx/filefn.h" // ::wxGetCwd +#include "wx/msgdlg.h" // wxMessageDialog + +//----------------------------------------------------------------------------- +// idle system +//----------------------------------------------------------------------------- + +extern void wxapp_install_idle_handler(); + +//----------------------------------------------------------------------------- +// "clicked" for OK-button +//----------------------------------------------------------------------------- + +extern "C" { +static void gtk_filedialog_ok_callback(GtkWidget *widget, wxDirDialog *dialog) +{ + int style = dialog->GetStyle(); + gchar* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); + + // gtk version numbers must be identical with the one in ctor (that calls set_do_overwrite_confirmation) +#if GTK_CHECK_VERSION(2,7,3) + if(gtk_check_version(2,7,3) != NULL) +#endif + if ((style & wxSAVE) && (style & wxOVERWRITE_PROMPT)) + { + if ( g_file_test(filename, G_FILE_TEST_EXISTS) ) + { + wxString msg; + + msg.Printf( + _("File '%s' already exists, do you really want to overwrite it?"), + wxString(wxConvFileName->cMB2WX(filename)).c_str()); + + wxMessageDialog dlg(dialog, msg, _("Confirm"), + wxYES_NO | wxICON_QUESTION); + if (dlg.ShowModal() != wxID_YES) + { + g_free(filename); + return; + } + } + } + + // change to the directory where the user went if asked + if (style & wxCHANGE_DIR) + { + // Use chdir to not care about filename encodings + gchar* folder = g_path_get_dirname(filename); + chdir(folder); + g_free(folder); + } + + g_free(filename); + + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK); + event.SetEventObject(dialog); + dialog->GetEventHandler()->ProcessEvent(event); +} +} + +//----------------------------------------------------------------------------- +// "clicked" for Cancel-button +//----------------------------------------------------------------------------- + +extern "C" { +static void gtk_filedialog_cancel_callback(GtkWidget *WXUNUSED(w), + wxDirDialog *dialog) +{ + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); + event.SetEventObject(dialog); + dialog->GetEventHandler()->ProcessEvent(event); +} +} + +extern "C" { +static void gtk_filedialog_response_callback(GtkWidget *w, + gint response, + wxDirDialog *dialog) +{ + wxapp_install_idle_handler(); + + if (response == GTK_RESPONSE_ACCEPT) + gtk_filedialog_ok_callback(w, dialog); + else if (response == GTK_RESPONSE_CANCEL) + gtk_filedialog_cancel_callback(w, dialog); + else // "delete" + { + gtk_filedialog_cancel_callback(w, dialog); + dialog->m_destroyed_by_delete = true; + } +} +} + +#endif // __WXGTK24__ + +//----------------------------------------------------------------------------- +// wxDirDialog +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxDirDialog,wxGenericDirDialog) + +BEGIN_EVENT_TABLE(wxDirDialog,wxGenericDirDialog) + EVT_BUTTON(wxID_OK, wxDirDialog::OnFakeOk) +END_EVENT_TABLE() + +wxDirDialog::wxDirDialog(wxWindow* parent, const wxString& title, + const wxString& defaultPath, long style, + const wxPoint& pos, const wxSize& sz, + const wxString& name) +{ +#ifdef __WXGTK24__ + if (!gtk_check_version(2,4,0)) + { + m_message = title; + m_needParent = false; + m_destroyed_by_delete = false; + + if (!PreCreation(parent, pos, wxDefaultSize) || + !CreateBase(parent, wxID_ANY, pos, wxDefaultSize, style, + wxDefaultValidator, wxT("filedialog"))) + { + wxFAIL_MSG( wxT("wxDirDialog creation failed") ); + return; + } + + GtkFileChooserAction gtk_action; + GtkWindow* gtk_parent = NULL; + if (parent) + gtk_parent = GTK_WINDOW( gtk_widget_get_toplevel(parent->m_widget) ); + + gtk_action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; + if (style & wxDD_NEW_DIR_BUTTON) + gtk_action = GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER; + + m_widget = gtk_file_chooser_dialog_new( + wxGTK_CONV(m_message), + gtk_parent, + gtk_action, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + + // local-only property could be set to false to allow non-local files to be loaded. + // In that case get/set_uri(s) should be used instead of get/set_filename(s) everywhere + // and the GtkFileChooserDialog should probably also be created with a backend, + // e.g "gnome-vfs", "default", ... (gtk_file_chooser_dialog_new_with_backend). + // Currently local-only is kept as the default - true: + // gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(m_widget), true); + + g_signal_connect(G_OBJECT(m_widget), "response", + GTK_SIGNAL_FUNC(gtk_filedialog_response_callback), (gpointer)this); + + if ( !defaultPath.empty() ) + gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(m_widget), + wxConvFileName->cWX2MB(defaultPath) ); + } + else +#endif + wxGenericDirDialog::Create(parent, title, defaultPath, style, pos, sz, name); +} + +wxDirDialog::~wxDirDialog() +{ +#ifdef __WXGTK24__ + if (!gtk_check_version(2,4,0)) + { + if (m_destroyed_by_delete) + m_widget = NULL; + } +#endif +} + +void wxDirDialog::OnFakeOk( wxCommandEvent &event ) +{ +#ifdef __WXGTK24__ + if (!gtk_check_version(2,4,0)) + wxDialog::OnOK( event ); + else +#endif + wxGenericDirDialog::OnOK( event ); +} + +int wxDirDialog::ShowModal() +{ +#ifdef __WXGTK24__ + if (!gtk_check_version(2,4,0)) + return wxDialog::ShowModal(); + else +#endif + return wxGenericDirDialog::ShowModal(); +} + +bool wxDirDialog::Show( bool show ) +{ +#ifdef __WXGTK24__ + if (!gtk_check_version(2,4,0)) + return wxDialog::Show( show ); + else +#endif + return wxGenericDirDialog::Show( show ); +} + +void wxDirDialog::DoSetSize(int x, int y, int width, int height, int sizeFlags ) +{ + if (!m_wxwindow) + return; + else + wxGenericDirDialog::DoSetSize( x, y, width, height, sizeFlags ); +} + +void wxDirDialog::SetPath(const wxString& dir) +{ +#ifdef __WXGTK24__ + if (!gtk_check_version(2,4,0)) + { + if (wxDirExists(dir)) + { + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget), wxConvFileName->cWX2MB(dir)); + } + } + else +#endif + wxGenericDirDialog::SetPath( dir ); +} + +wxString wxDirDialog::GetPath() const +{ +#ifdef __WXGTK24__ + if (!gtk_check_version(2,4,0)) + return wxConvFileName->cMB2WX( gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(m_widget) ) ); + else +#endif + return wxGenericDirDialog::GetPath(); +} + +#endif // wxUSE_DIRDLG