// src/startgui.cc - Copyright 2005, 2006, University // of Padova, dept. of Pure and Applied // Mathematics // // This file is part of SGPEMv2. // // This is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // SGPEMv2 is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with SGPEMv2; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "config.h" #include "gettext.h" #include "schedulables_tree_widget.hh" #include "simulation_widget.hh" #include "gui_builder.hh" #include "graphical_preferences_editor.hh" #include "backend/history.hh" #include "backend/simulation.hh" #include "backend/serializers_gatekeeper.hh" #include "backend/serializer.hh" #include #include #include #include #include #include #include #include #include #include using namespace sgpem; using Gnome::Glade::Xml; void test_me() { // A test for widget display: Simulation& sim = Simulation::get_instance(); sim.get_history().add_process("goofy", 0, 0); } void GuiBuilder::on_edit_preferences_activate() { new PreferencesEditor(); //FIXME: are we leaking this way? } void GuiBuilder::on_file_open_activate() { Glib::ustring msg; try { std::vector serializers = SerializersGatekeeper::get_instance().get_registered(); // FIXME using the first serializer available, this // will need to be changed when multiple serializers will // be made available Serializer& serializer = *serializers.at(0); History& history = Simulation::get_instance().get_history(); // open file dialog... Gtk::FileChooserDialog dialog("Please choose a file", Gtk::FILE_CHOOSER_ACTION_OPEN); dialog.set_transient_for(get_initial_window()); //Add response buttons the the dialog: dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK); //Add filters, so that only certain file types can be selected: for(std::vector::const_iterator iter=serializers.begin(); iter!=serializers.end(); iter++) { Serializer* ser = *iter; Gtk::FileFilter filter_sgpem; filter_sgpem.set_name(ser->get_filename_description()); filter_sgpem.add_pattern(ser->get_filename_extension()); dialog.add_filter(filter_sgpem); } Gtk::FileFilter filter_any; filter_any.set_name("Any files"); filter_any.add_pattern("*"); dialog.add_filter(filter_any); //Show the dialog and wait for a user response: int result = dialog.run(); if(result==Gtk::RESPONSE_OK) { // DISABLED - Actually locks computer // serializer.restore_snapshot("prova1.xgp", history); msg = "File: " + dialog.get_filename() + " loaded."; } // end - if(result==Gtk::RESPONSE_OK) } catch (std::out_of_range e) { msg = _("ERROR: No registered serializer available"); } catch (SerializerError e) { msg = _("ERROR: ") + Glib::ustring(e.what()); } if(!msg.empty()) { Gtk::MessageDialog msg_dialog(get_initial_window(), msg); msg_dialog.run(); } } void GuiBuilder::on_file_save_activate() { _simulation_widget->change_scaling_mode(); } void GuiBuilder::on_file_saveas_activate() { Glib::ustring msg; try { std::vector serializers = SerializersGatekeeper::get_instance().get_registered(); // FIXME using the first serializer available, this // will need to be changed when multiple serializers will // be made available Serializer& serializer = *serializers.at(0); History& history = Simulation::get_instance().get_history(); // open file dialog... Gtk::FileChooserDialog dialog("Please choose a file", Gtk::FILE_CHOOSER_ACTION_SAVE); dialog.set_transient_for(get_initial_window()); //Add response buttons the the dialog: dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); //Add filters, so that only certain file types can be selected: Gtk::FileFilter filter_sgpem; filter_sgpem.set_name("Sgpem files"); filter_sgpem.add_pattern("*.xgp"); dialog.add_filter(filter_sgpem); Gtk::FileFilter filter_any; filter_any.set_name("Any files"); filter_any.add_pattern("*"); dialog.add_filter(filter_any); //Show the dialog and wait for a user response: int result = dialog.run(); if(result==Gtk::RESPONSE_OK) { // DISABLED - Actually locks computer serializer.save_snapshot(dialog.get_filename(), history); msg = "File: " + dialog.get_filename() + " saved."; } // end - if(result==Gtk::RESPONSE_OK) } catch (std::out_of_range e) { msg = _("ERROR: No registered serializer available"); } catch (SerializerError e) { msg = _("ERROR: ") + Glib::ustring(e.what()); } if(!msg.empty()) { Gtk::MessageDialog msg_dialog(get_initial_window(), msg); msg_dialog.run(); } } GuiBuilder::GuiBuilder(const std::string& gladefile) : _refXml(Xml::create(gladefile)) { using namespace Gtk; //Window& main_window = get_initial_window(); // file open dialog MenuItem* file_open = NULL; _refXml->get_widget("MenuItem.File.Open", file_open); file_open->signal_activate().connect(sigc::mem_fun(*this, &GuiBuilder::on_file_open_activate)); // file save dialog MenuItem* file_save = NULL; _refXml->get_widget("MenuItem.File.Save", file_save); file_save->signal_activate().connect(sigc::mem_fun(*this, &GuiBuilder::on_file_save_activate)); // file save dialog MenuItem* file_saveas = NULL; _refXml->get_widget("MenuItem.File.SaveAs", file_saveas); file_saveas->signal_activate().connect(sigc::mem_fun(*this, &GuiBuilder::on_file_saveas_activate)); // Connect extra signals (decide where to do this... // here -- ugly -- derive widgets and then use // Glade::Xml::get_widget_derived -- better --) MenuItem* file_quit = NULL; _refXml->get_widget("MenuItem.File.Quit", file_quit); file_quit->signal_activate().connect(sigc::ptr_fun(&Main::quit)); // preferences dialog MenuItem* edit_preferences = NULL; _refXml->get_widget("MenuItem.Edit.Preferences", edit_preferences); edit_preferences->signal_activate().connect(sigc::mem_fun(*this, &GuiBuilder::on_edit_preferences_activate)); // About dialog MenuItem* help_about = NULL; _refXml->get_widget("MenuItem.Help.About", help_about); AboutDialog* about_dialog = NULL; _refXml->get_widget("AboutDialog", about_dialog); help_about->signal_activate().connect(sigc::mem_fun(*about_dialog, &Window::show)); // Random Error Generator MenuItem* debug_error = NULL; _refXml->get_widget("MenuItem.Debug.Error", debug_error); debug_error->signal_activate().connect(sigc::ptr_fun(test_me)); // Temporary code to test the Schedulables custom widget Expander* scheds_expander = NULL; _refXml->get_widget("SchedulablesExpander", scheds_expander); SchedulablesTreeWidget* scheds_widget = manage(new SchedulablesTreeWidget()); scheds_expander->add(*scheds_widget); // we have to remember to manually show custom added widgets: scheds_widget->show(); // Main simulation widget ScrolledWindow* simulation_window = NULL; _refXml->get_widget("SimulationScrolledWindow", simulation_window); _simulation_widget = new SimulationWidget(); SimulationWidget* simulation_widget = manage(_simulation_widget); simulation_window->add(*simulation_widget); simulation_widget->show(); } GuiBuilder::~GuiBuilder() {} Gtk::Window& GuiBuilder::get_initial_window() const { Gtk::Window* main_window = NULL; _refXml->get_widget("MainWindow", main_window); return *main_window; } void GuiBuilder::open_file(const std::string& filename) { // FIXME: to be written. // Debug line (erase me when done): std::cout << _("Filename to open: ") << filename << std::endl; }