nbtab.cc
changeset 3 2cc5ed6e6255
equal deleted inserted replaced
-1:000000000000 0:d73ac72b9c80
       
     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 }