alpar@174: /* -*- C++ -*- alpar@174: * alpar@174: * This file is a part of LEMON, a generic C++ optimization library alpar@174: * alpar@174: * Copyright (C) 2003-2006 alpar@174: * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport alpar@174: * (Egervary Research Group on Combinatorial Optimization, EGRES). alpar@174: * alpar@174: * Permission to use, modify and distribute this software is granted alpar@174: * provided that this copyright notice appears in all copies. For alpar@174: * precise terms see the accompanying LICENSE file. alpar@174: * alpar@174: * This software is provided "AS IS" with no warranty of any kind, alpar@174: * express or implied, and with no claim as to its suitability for any alpar@174: * purpose. alpar@174: * alpar@174: */ alpar@174: hegyi@96: #include hegyi@194: #include hegyi@191: #include hegyi@194: #include hegyi@194: #include hegyi@194: #include hegyi@96: hegyi@194: hegyi@194: hegyi@194: NoteBookTab::NoteBookTab():mapwinexists(false), designwinexists(false) hegyi@96: { hegyi@194: mapstorage=new MapStorage(*this); hegyi@194: ladanyi@136: Gtk::ScrolledWindow *pScrolledWindow = manage(new Gtk::ScrolledWindow); hegyi@96: gd_canvas=new GraphDisplayerCanvas(*this); ladanyi@136: pScrolledWindow->add(*gd_canvas); ladanyi@136: add(*pScrolledWindow); hegyi@96: hegyi@96: //connecting signals - controller character hegyi@194: mapstorage->signal_prop_ch().connect(sigc::mem_fun(*gd_canvas, &GraphDisplayerCanvas::propertyChange)); hegyi@194: mapstorage->signal_node_map_ch().connect(sigc::mem_fun(*this, &NoteBookTab::registerNewNodeMap)); hegyi@194: mapstorage->signal_edge_map_ch().connect(sigc::mem_fun(*this, &NoteBookTab::registerNewEdgeMap)); hegyi@96: show_all_children(); hegyi@96: show(); hegyi@96: } hegyi@96: hegyi@96: void NoteBookTab::readFile(const std::string &file) hegyi@96: { hegyi@194: mapstorage->readFromFile(file); hegyi@194: mapstorage->file_name = file; hegyi@194: mapstorage->modified = false; hegyi@96: gd_canvas->drawGraph(); hegyi@96: if(mapwinexists) hegyi@96: { hegyi@194: mapwin->update(mapstorage->getEdgeMapList(), mapstorage->getNodeMapList()); hegyi@96: } hegyi@96: signal_title.emit(Glib::filename_display_basename(file)); hegyi@96: } hegyi@96: hegyi@96: void NoteBookTab::newFile() hegyi@96: { hegyi@194: if (mapstorage->modified) hegyi@96: { hegyi@96: Gtk::MessageDialog mdialog("Save changes before closing?", true, hegyi@96: Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE); hegyi@102: mdialog.add_button("Close file _without Saving", Gtk::RESPONSE_REJECT); hegyi@96: mdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); hegyi@96: mdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); hegyi@96: switch (mdialog.run()) hegyi@96: { hegyi@96: case Gtk::RESPONSE_CANCEL: hegyi@96: return; hegyi@96: case Gtk::RESPONSE_REJECT: hegyi@96: break; hegyi@96: case Gtk::RESPONSE_ACCEPT: hegyi@96: saveFile(); hegyi@96: break; hegyi@96: } hegyi@96: } hegyi@96: gd_canvas->clear(); hegyi@194: mapstorage->clear(); hegyi@96: if(mapwinexists) hegyi@96: { hegyi@194: mapwin->update(mapstorage->getEdgeMapList(), mapstorage->getNodeMapList()); hegyi@96: } hegyi@96: signal_title.emit("unsaved file"); hegyi@96: } hegyi@96: hegyi@96: void NoteBookTab::openFile() hegyi@96: { hegyi@194: if (mapstorage->modified) hegyi@96: { hegyi@96: Gtk::MessageDialog mdialog("Save changes before closing?", true, hegyi@96: Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE); hegyi@102: mdialog.add_button("Close file _without Saving", Gtk::RESPONSE_REJECT); hegyi@96: mdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); hegyi@96: mdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); hegyi@96: switch (mdialog.run()) hegyi@96: { hegyi@96: case Gtk::RESPONSE_CANCEL: hegyi@96: return; hegyi@96: case Gtk::RESPONSE_REJECT: hegyi@96: break; hegyi@96: case Gtk::RESPONSE_ACCEPT: hegyi@96: saveFile(); hegyi@96: break; hegyi@96: } hegyi@96: } hegyi@96: Gtk::FileChooserDialog fcdialog("Open File"); hegyi@96: fcdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); hegyi@96: fcdialog.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT); hegyi@96: if (fcdialog.run() == Gtk::RESPONSE_ACCEPT) hegyi@96: { hegyi@96: gd_canvas->clear(); hegyi@194: mapstorage->clear(); hegyi@96: Glib::ustring filename = fcdialog.get_filename(); hegyi@194: if (!mapstorage->readFromFile(filename)) hegyi@96: { hegyi@194: mapstorage->file_name = filename; hegyi@194: mapstorage->modified = false; hegyi@96: gd_canvas->drawGraph(); hegyi@96: if(mapwinexists) hegyi@96: { hegyi@194: mapwin->update(mapstorage->getEdgeMapList(), mapstorage->getNodeMapList()); hegyi@96: } hegyi@96: signal_title.emit(Glib::filename_display_basename(filename)); hegyi@96: } hegyi@96: } hegyi@96: } hegyi@96: hegyi@96: void NoteBookTab::saveFile() hegyi@96: { hegyi@194: if (mapstorage->file_name == "") { hegyi@96: saveFileAs(); hegyi@96: } hegyi@96: else hegyi@96: { hegyi@194: mapstorage->writeToFile(mapstorage->file_name); hegyi@194: mapstorage->modified = false; hegyi@194: signal_title.emit(Glib::filename_display_basename(mapstorage->file_name)); hegyi@96: } hegyi@96: } hegyi@96: hegyi@96: void NoteBookTab::saveFileAs() hegyi@96: { hegyi@96: Gtk::FileChooserDialog fcdialog("Save File", Gtk::FILE_CHOOSER_ACTION_SAVE); hegyi@96: fcdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); hegyi@96: fcdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); hegyi@96: if (fcdialog.run() == Gtk::RESPONSE_ACCEPT) hegyi@96: { hegyi@96: Glib::ustring filename = fcdialog.get_filename(); hegyi@194: mapstorage->file_name = filename; hegyi@194: mapstorage->writeToFile(filename); hegyi@194: mapstorage->modified = false; hegyi@96: signal_title.emit(Glib::filename_display_basename(filename)); hegyi@96: } hegyi@96: } hegyi@96: hegyi@96: void NoteBookTab::close() hegyi@96: { hegyi@194: if (mapstorage->modified) hegyi@96: { hegyi@96: Gtk::MessageDialog mdialog("Save changes before closing?", true, hegyi@96: Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE); hegyi@96: mdialog.add_button("Close _without Saving", Gtk::RESPONSE_REJECT); hegyi@96: mdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); hegyi@96: mdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); hegyi@96: switch (mdialog.run()) hegyi@96: { hegyi@96: case Gtk::RESPONSE_CANCEL: hegyi@96: return; hegyi@96: case Gtk::RESPONSE_REJECT: hegyi@96: break; hegyi@96: case Gtk::RESPONSE_ACCEPT: hegyi@96: saveFile(); hegyi@96: break; hegyi@96: } hegyi@96: } hegyi@96: gd_canvas->clear(); hegyi@194: mapstorage->clear(); hegyi@96: if(mapwinexists) hegyi@96: { hegyi@194: mapwin->update(mapstorage->getEdgeMapList(), mapstorage->getNodeMapList()); hegyi@96: } hegyi@96: signal_title.emit("unsaved file"); hegyi@96: } hegyi@96: hegyi@96: void NoteBookTab::propertyChange(bool itisedge, int prop, std::string mapname) hegyi@96: { hegyi@194: mapstorage->changeActiveMap(itisedge, prop, mapname); hegyi@96: } hegyi@96: hegyi@96: sigc::signal NoteBookTab::signal_newmap_needed() hegyi@96: { hegyi@96: return signal_newmap; hegyi@96: } hegyi@96: hegyi@121: void NoteBookTab::popupNewMapWin(bool itisedge) hegyi@96: { hegyi@96: signal_newmap.emit(this, itisedge); hegyi@96: } hegyi@96: hegyi@96: std::string NoteBookTab::getActiveEdgeMap(int prop) hegyi@96: { hegyi@194: return mapstorage->getActiveEdgeMap(prop); hegyi@96: } hegyi@96: hegyi@96: std::string NoteBookTab::getActiveNodeMap(int prop) hegyi@96: { hegyi@194: return mapstorage->getActiveNodeMap(prop); hegyi@96: } hegyi@96: hegyi@96: void NoteBookTab::registerNewEdgeMap(std::string mapname) hegyi@96: { hegyi@96: if(mapwinexists) hegyi@96: { hegyi@96: mapwin->registerNewEdgeMap(mapname); hegyi@96: } hegyi@96: } hegyi@96: hegyi@96: void NoteBookTab::registerNewNodeMap(std::string mapname) hegyi@96: { hegyi@96: if(mapwinexists) hegyi@96: { hegyi@96: mapwin->registerNewNodeMap(mapname); hegyi@96: } hegyi@96: } hegyi@96: hegyi@96: void NoteBookTab::createMapWin(std::string name) hegyi@96: { hegyi@96: if(!mapwinexists) hegyi@96: { hegyi@194: mapwin=new MapWin("Map Setup - "+name, mapstorage->getEdgeMapList(), mapstorage->getNodeMapList(), *this); hegyi@194: mapst2mapwin=mapstorage->signal_map_win_ch().connect(sigc::mem_fun(*mapwin, &MapWin::changeEntry)); hegyi@96: mapwin->show(); hegyi@96: mapwinexists=true; hegyi@96: } hegyi@96: } hegyi@96: hegyi@191: void NoteBookTab::createExportToEPSWin(std::string name) hegyi@191: { hegyi@191: if(!epswinexists) hegyi@191: { hegyi@191: epswin=new EpsWin("Export to EPS - "+name, *this); hegyi@191: epswin->show(); hegyi@191: epswinexists=true; hegyi@191: } hegyi@191: } hegyi@191: hegyi@191: hegyi@160: void NoteBookTab::createDesignWin(std::string name) hegyi@160: { hegyi@160: if(!designwinexists) hegyi@160: { hegyi@160: double attraction, propulsation; hegyi@160: int iterations; hegyi@194: mapstorage->get_design_data(attraction, propulsation, iterations); hegyi@172: designwin=new DesignWin("Design Setup - "+name, attraction, propulsation, iterations, *this); hegyi@160: hegyi@177: designwin->signal_attraction().connect(sigc::mem_fun(mapstorage, &MapStorage::set_attraction)); hegyi@177: designwin->signal_propulsation().connect(sigc::mem_fun(mapstorage, &MapStorage::set_propulsation)); hegyi@177: designwin->signal_iteration().connect(sigc::mem_fun(mapstorage, &MapStorage::set_iteration)); hegyi@160: designwin->close_run().connect(sigc::mem_fun(*gd_canvas, &GraphDisplayerCanvas::reDesignGraph)); hegyi@160: hegyi@160: designwin->signal_delete_event().connect(sigc::mem_fun(*this, &NoteBookTab::closeDesignWin)); hegyi@160: hegyi@194: mapst2designwin=mapstorage->signal_design_win_ch().connect(sigc::mem_fun(*designwin, &DesignWin::set_data)); hegyi@177: hegyi@160: designwin->show(); hegyi@160: designwinexists=true; hegyi@160: } hegyi@160: } hegyi@160: hegyi@96: void NoteBookTab::closeMapWin() hegyi@96: { hegyi@172: mapst2mapwin.disconnect(); hegyi@96: mapwinexists=false; hegyi@96: delete mapwin; hegyi@96: } hegyi@96: hegyi@191: void NoteBookTab::closeEpsWin() hegyi@191: { hegyi@191: epswinexists=false; hegyi@191: delete epswin; hegyi@191: } hegyi@191: hegyi@160: bool NoteBookTab::closeDesignWin(GdkEventAny * e) hegyi@160: { hegyi@160: if(e->type==GDK_DELETE) hegyi@160: { hegyi@160: designwinexists=false; hegyi@177: mapst2designwin.disconnect(); hegyi@160: delete designwin; hegyi@160: } hegyi@160: } hegyi@160: hegyi@96: sigc::signal NoteBookTab::signal_title_ch() hegyi@96: { hegyi@96: return signal_title; hegyi@96: } hegyi@96: hegyi@157: void NoteBookTab::setView(bool autoscale, bool zoomtrack, double width, double radius) hegyi@154: { hegyi@157: gd_canvas->setView(autoscale, zoomtrack, width, radius); hegyi@154: } hegyi@154: hegyi@157: void NoteBookTab::getView(bool & autoscale, bool & zoomtrack, double& width, double& radius) hegyi@154: { hegyi@157: gd_canvas->getView(autoscale, zoomtrack, width, radius); hegyi@154: } hegyi@160: hegyi@160: void NoteBookTab::reDesignGraph() hegyi@160: { hegyi@160: gd_canvas->reDesignGraph(); hegyi@160: } hegyi@160: hegyi@172: void NoteBookTab::active_maps_needed() hegyi@172: { hegyi@194: mapstorage->broadcastActiveMaps(); hegyi@172: } hegyi@191: hegyi@191: void NoteBookTab::exportGraphToEPS(std::vector options, std::string filename) hegyi@191: { hegyi@194: mapstorage->exportGraphToEPS(options, filename); hegyi@191: }