nbtab.cc
author Akos Ladanyi <ladanyi@tmit.bme.hu>
Mon, 07 Jul 2008 15:20:43 +0100
changeset 3 2cc5ed6e6255
permissions -rw-r--r--
Use hg changeset hash instead of svn revision.
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2006
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #include <nbtab.h>
    20 #include <mapstorage.h>
    21 #include <eps_win.h>
    22 #include <map_win.h>
    23 #include <design_win.h>
    24 #include <graph_displayer_canvas.h>
    25 
    26 
    27 
    28 NoteBookTab::NoteBookTab():mapwinexists(false), designwinexists(false), epswinexists(false)
    29 {
    30   mapstorage=new MapStorage();
    31 
    32   Gtk::ScrolledWindow *pScrolledWindow = Gtk::manage(new Gtk::ScrolledWindow);
    33   pScrolledWindow->set_shadow_type(Gtk::SHADOW_ETCHED_IN);
    34   gd_canvas=Gtk::manage(new DigraphDisplayerCanvas(*this));
    35   pScrolledWindow->add(*gd_canvas);
    36   add(*pScrolledWindow);
    37 
    38   //connecting signals - controller character
    39   mapstorage->signal_prop_ch().connect(sigc::mem_fun(*gd_canvas, &DigraphDisplayerCanvas::propertyChange));
    40   mapstorage->signal_node_map_ch().connect(sigc::mem_fun(*this, &NoteBookTab::registerNewNodeMap));
    41   mapstorage->signal_arc_map_ch().connect(sigc::mem_fun(*this, &NoteBookTab::registerNewArcMap));
    42   mapstorage->signal_background_ch().connect(sigc::mem_fun(*gd_canvas, &DigraphDisplayerCanvas::setBackground));
    43   show_all_children();
    44   show();
    45 }
    46 
    47 NoteBookTab::~NoteBookTab()
    48 {
    49   delete mapstorage;
    50 }
    51 
    52 void NoteBookTab::readFile(const std::string &file)
    53 {
    54   mapstorage->readFromFile(file);
    55   mapstorage->setFileName(file);
    56   mapstorage->setModified(false);
    57   gd_canvas->drawDigraph();
    58   if(mapwinexists)
    59     {
    60       mapwin->update(
    61           mapstorage->getArcMapList(NUM),
    62           mapstorage->getArcMapList(STR),
    63           mapstorage->getNodeMapList(NUM),
    64           mapstorage->getNodeMapList(STR));
    65     }
    66   title_changed(Glib::filename_display_basename(file));
    67 }
    68 
    69 void NoteBookTab::newFile()
    70 {
    71   if (mapstorage->getModified())
    72   {
    73     Gtk::MessageDialog mdialog("<b>Save changes before closing?</b>", true,
    74         Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);
    75     mdialog.add_button("Close file _without Saving", Gtk::RESPONSE_REJECT);
    76     mdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
    77     mdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
    78     switch (mdialog.run())
    79     {
    80       case Gtk::RESPONSE_CANCEL:
    81         return;
    82       case Gtk::RESPONSE_REJECT:
    83         break;
    84       case Gtk::RESPONSE_ACCEPT:
    85         saveFile();
    86         break;
    87     }
    88   }
    89   gd_canvas->clear();
    90   mapstorage->clear();
    91   if(mapwinexists)
    92     {
    93       mapwin->update(
    94           mapstorage->getArcMapList(NUM),
    95           mapstorage->getArcMapList(STR),
    96           mapstorage->getNodeMapList(NUM),
    97           mapstorage->getNodeMapList(STR));
    98     }
    99   title_changed("unsaved file");
   100 }
   101 
   102 void NoteBookTab::openFile()
   103 {
   104   if (mapstorage->getModified())
   105   {
   106     Gtk::MessageDialog mdialog("<b>Save changes before closing?</b>", true, 
   107         Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);
   108     mdialog.add_button("Close file _without Saving", Gtk::RESPONSE_REJECT);
   109     mdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
   110     mdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
   111     switch (mdialog.run())
   112     {
   113       case Gtk::RESPONSE_CANCEL:
   114         return;
   115       case Gtk::RESPONSE_REJECT:
   116         break;
   117       case Gtk::RESPONSE_ACCEPT:
   118         saveFile();
   119         break;
   120     }
   121   }
   122   Gtk::FileChooserDialog fcdialog("Open File");
   123   fcdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
   124   fcdialog.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
   125   if (fcdialog.run() == Gtk::RESPONSE_ACCEPT)
   126   {
   127     gd_canvas->clear();
   128     std::cout << mapstorage << std::endl;
   129     mapstorage->clear();
   130     Glib::ustring filename = fcdialog.get_filename();
   131     if (!mapstorage->readFromFile(filename))
   132     {
   133       mapstorage->setFileName(filename);
   134       mapstorage->setModified(false);
   135       gd_canvas->drawDigraph();
   136       if(mapwinexists)
   137 	{
   138           mapwin->update(
   139               mapstorage->getArcMapList(NUM),
   140               mapstorage->getArcMapList(STR),
   141               mapstorage->getNodeMapList(NUM),
   142               mapstorage->getNodeMapList(STR));
   143 	}
   144       title_changed(Glib::filename_display_basename(filename));
   145     }
   146   }
   147 }
   148 
   149 void NoteBookTab::saveFile()
   150 {
   151   if (mapstorage->getFileName() == "") {
   152     saveFileAs();
   153   }
   154   else
   155   {
   156     mapstorage->writeToFile(mapstorage->getFileName());
   157     mapstorage->setModified(false);
   158     title_changed(Glib::filename_display_basename(mapstorage->getFileName()));
   159   }
   160 }
   161 
   162 void NoteBookTab::saveFileAs()
   163 {
   164   Gtk::FileChooserDialog fcdialog("Save File", Gtk::FILE_CHOOSER_ACTION_SAVE);
   165   fcdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
   166   fcdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
   167   if (fcdialog.run() == Gtk::RESPONSE_ACCEPT)
   168   {
   169     Glib::ustring filename = fcdialog.get_filename();
   170     mapstorage->setFileName(filename);
   171     mapstorage->writeToFile(filename);
   172     mapstorage->setModified(false);
   173     title_changed(Glib::filename_display_basename(filename));
   174   }
   175 }
   176 
   177 void NoteBookTab::close()
   178 {
   179   if (mapstorage->getModified())
   180   {
   181     Gtk::MessageDialog mdialog("<b>Save changes before closing?</b>", true,
   182         Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);
   183     mdialog.add_button("Close _without Saving", Gtk::RESPONSE_REJECT);
   184     mdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
   185     mdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
   186     switch (mdialog.run())
   187     {
   188       case Gtk::RESPONSE_CANCEL:
   189         return;
   190       case Gtk::RESPONSE_REJECT:
   191         break;
   192       case Gtk::RESPONSE_ACCEPT:
   193         saveFile();
   194         break;
   195     }
   196   }
   197   gd_canvas->clear();
   198   mapstorage->clear();
   199   if(mapwinexists)
   200     {
   201       mapwin->update(
   202           mapstorage->getArcMapList(NUM),
   203           mapstorage->getArcMapList(STR),
   204           mapstorage->getNodeMapList(NUM),
   205           mapstorage->getNodeMapList(STR));
   206     }
   207   title_changed("unsaved file");
   208 }
   209 
   210 void NoteBookTab::propertyChange(bool itisarc, int prop, std::string mapname)
   211 {
   212   mapstorage->changeActiveMap(itisarc, prop, mapname);
   213 }
   214 
   215 sigc::signal<void, NoteBookTab *, bool> NoteBookTab::signal_newmap_needed()
   216 {
   217   return signal_newmap;
   218 }
   219 
   220 void NoteBookTab::popupNewMapWin(bool itisarc)
   221 {
   222   signal_newmap.emit(this, itisarc);
   223 }
   224 
   225 std::string NoteBookTab::getActiveArcMap(int prop)
   226 {
   227   return mapstorage->getActiveArcMap(prop);
   228 }
   229 
   230 std::string NoteBookTab::getActiveNodeMap(int prop)
   231 {
   232   return mapstorage->getActiveNodeMap(prop);
   233 }
   234 
   235 void NoteBookTab::registerNewArcMap(std::string mapname, MapValue::Type type)
   236 {
   237   if(mapwinexists)
   238     {
   239       mapwin->registerNewArcMap(mapname, type);
   240     }
   241 }
   242 
   243 void NoteBookTab::registerNewNodeMap(std::string mapname, MapValue::Type type)
   244 {
   245   if(mapwinexists)
   246     {
   247       mapwin->registerNewNodeMap(mapname, type);
   248     }
   249   if(epswinexists)
   250     {
   251       epswin->registerNewNodeMap(mapname, type);
   252     }
   253 }
   254 
   255 void NoteBookTab::createMapWin(std::string name)
   256 {
   257   if(!mapwinexists)
   258     {
   259       mapwin=new MapWin("Map Setup - "+name,
   260           mapstorage->getArcMapList(NUM),
   261           mapstorage->getArcMapList(STR),
   262           mapstorage->getNodeMapList(NUM),
   263           mapstorage->getNodeMapList(STR),
   264           *this);
   265       mapst2mapwin=mapstorage->signal_map_win_ch().connect(sigc::mem_fun(*mapwin, &MapWin::changeEntry));
   266       mapwin->show();
   267       mapwinexists=true;
   268     }
   269 }
   270 
   271 void NoteBookTab::createExportToEPSWin(std::string name)
   272 {
   273   if(!epswinexists)
   274     {
   275       epswin=new EpsWin("Export to EPS - "+name, mapstorage->getNodeMapList(NUM), mapstorage->getNodeMapList(STR));
   276       epswin->show();
   277       epswinexists=true;
   278       epswin->signal_eps_details_ch().connect(sigc::mem_fun(*this, &NoteBookTab::exportDigraphToEPS));
   279       epswin->signal_eps_close_ch().connect(sigc::mem_fun(*this, &NoteBookTab::closeEpsWin));
   280       epswin->signal_new_map_ch().connect(sigc::mem_fun(*this, &NoteBookTab::popupNewMapWin));
   281     }
   282 }
   283 
   284 
   285 void NoteBookTab::createDesignWin(std::string name)
   286 {
   287   if(!designwinexists)
   288     {
   289       double attraction, propulsation;
   290       int iterations;
   291       mapstorage->get_design_data(attraction, propulsation, iterations);
   292       designwin=new DesignWin("Design Setup - "+name, attraction, propulsation, iterations);
   293 
   294       designwin->signal_attraction().connect(sigc::mem_fun(*mapstorage, &MapStorage::set_attraction));
   295       designwin->signal_propulsation().connect(sigc::mem_fun(*mapstorage, &MapStorage::set_propulsation));
   296       designwin->signal_iteration().connect(sigc::mem_fun(*mapstorage, &MapStorage::set_iteration));
   297       designwin->close_run().connect(sigc::mem_fun(*gd_canvas, &DigraphDisplayerCanvas::reDesignDigraph));
   298 
   299       designwin->signal_delete_event().connect(sigc::mem_fun(*this, &NoteBookTab::closeDesignWin));
   300 
   301       mapst2designwin=mapstorage->signal_design_win_ch().connect(sigc::mem_fun(*designwin, &DesignWin::set_data));
   302 
   303       designwin->show();
   304       designwinexists=true;
   305     }
   306 }
   307 
   308 void NoteBookTab::closeMapWin()
   309 {
   310   mapst2mapwin.disconnect();
   311   mapwinexists=false;
   312   delete mapwin;
   313 }
   314 
   315 void NoteBookTab::closeEpsWin()
   316 {
   317   epswinexists=false;
   318   delete epswin;
   319 }
   320 
   321 bool NoteBookTab::closeDesignWin(GdkEventAny * e)
   322 {
   323   if(e->type==GDK_DELETE)
   324     {
   325       designwinexists=false;
   326       mapst2designwin.disconnect();
   327       delete designwin;
   328     }
   329 }
   330 
   331 sigc::signal<void, std::string> NoteBookTab::signal_title_ch()
   332 {
   333   return signal_title;
   334 }
   335 
   336 void NoteBookTab::setView(bool autoscale, bool zoomtrack, double width, double radius)
   337 {
   338   gd_canvas->setView(autoscale, zoomtrack, width, radius);
   339 }
   340 
   341 void NoteBookTab::getView(bool & autoscale, bool & zoomtrack, double& width, double& radius)
   342 {
   343   gd_canvas->getView(autoscale, zoomtrack, width, radius);
   344 }
   345 
   346 void NoteBookTab::reDesignDigraph()
   347 {
   348   gd_canvas->reDesignDigraph();
   349 }
   350 
   351 void NoteBookTab::active_maps_needed()
   352 {
   353   mapstorage->broadcastActiveMaps();
   354 }
   355 
   356 void NoteBookTab::exportDigraphToEPS(std::vector<bool> options, std::string filename, std::string shapemap)
   357 {
   358   mapstorage->exportDigraphToEPS(options, filename, shapemap);
   359 }
   360 
   361 void NoteBookTab::title_changed(std::string newtitle)
   362 {
   363   signal_title.emit(newtitle);
   364   if(epswinexists)
   365     {
   366       epswin->set_title(newtitle);
   367     }
   368   if(designwinexists)
   369     {
   370       designwin->set_title(newtitle);
   371     }
   372 }