COIN-OR::LEMON - Graph Library

source: lemon-0.x/gui/main_win.cc @ 1882:2c3f6c7e01b4

Last change on this file since 1882:2c3f6c7e01b4 was 1878:409a31271efd, checked in by Hegyi Péter, 14 years ago

Several changes. \n If new map is added to mapstorage it emits signal with the name of the new map. This was important, because from now on not only tha mapwin should be updated. \n Furthermore algobox gets a pointer to mapstorage instead of only the mapnames from it. This is important because without it it would be complicated to pass all of the required maps to algobox.

File size: 13.8 KB
RevLine 
[1606]1#include "main_win.h"
[1862]2#include "guipixbufs.h"
[1442]3
[1849]4MainWin::MainWin()
[1442]5{
[1849]6  set_title ("no file");
[1442]7  set_default_size(WIN_WIDTH,WIN_HEIGHT);
8  add(vbox);
9
[1634]10  // custom icons for the toolbar
11  Glib::RefPtr<Gtk::IconFactory> p_icon_factory = Gtk::IconFactory::create();
12 
[1635]13  Glib::RefPtr<Gdk::Pixbuf> p_move_pixbuf = Gdk::Pixbuf::create_from_inline(
14      2328, gui_icons_move);
15  Glib::RefPtr<Gdk::Pixbuf> p_addnode_pixbuf = Gdk::Pixbuf::create_from_inline(
16      2328, gui_icons_addnode);
17  Glib::RefPtr<Gdk::Pixbuf> p_addlink_pixbuf = Gdk::Pixbuf::create_from_inline(
18      2328, gui_icons_addlink);
19  Glib::RefPtr<Gdk::Pixbuf> p_delete_pixbuf = Gdk::Pixbuf::create_from_inline(
20      2328, gui_icons_delete);
21  Glib::RefPtr<Gdk::Pixbuf> p_editlink_pixbuf = Gdk::Pixbuf::create_from_inline(
22      2328, gui_icons_editlink);
23  Glib::RefPtr<Gdk::Pixbuf> p_editnode_pixbuf = Gdk::Pixbuf::create_from_inline(
24      2328, gui_icons_editnode);
25  Glib::RefPtr<Gdk::Pixbuf> p_newmap_pixbuf = Gdk::Pixbuf::create_from_inline(
26      2328, gui_icons_newmap);
[1634]27
28  Gtk::IconSource move_icon_source;
[1635]29  move_icon_source.set_pixbuf(p_move_pixbuf);
[1634]30  Gtk::IconSet move_icon_set;
31  move_icon_set.add_source(move_icon_source);
32  p_icon_factory->add(Gtk::StockID("gd-move"), move_icon_set);
33
34  Gtk::IconSource addnode_icon_source;
[1635]35  addnode_icon_source.set_pixbuf(p_addnode_pixbuf);
[1634]36  Gtk::IconSet addnode_icon_set;
37  addnode_icon_set.add_source(addnode_icon_source);
38  p_icon_factory->add(Gtk::StockID("gd-addnode"), addnode_icon_set);
39
40  Gtk::IconSource addlink_icon_source;
[1635]41  addlink_icon_source.set_pixbuf(p_addlink_pixbuf);
[1634]42  Gtk::IconSet addlink_icon_set;
43  addlink_icon_set.add_source(addlink_icon_source);
44  p_icon_factory->add(Gtk::StockID("gd-addlink"), addlink_icon_set);
45
46  Gtk::IconSource delete_icon_source;
[1635]47  delete_icon_source.set_pixbuf(p_delete_pixbuf);
[1634]48  Gtk::IconSet delete_icon_set;
49  delete_icon_set.add_source(delete_icon_source);
50  p_icon_factory->add(Gtk::StockID("gd-delete"), delete_icon_set);
51
52  Gtk::IconSource editlink_icon_source;
[1635]53  editlink_icon_source.set_pixbuf(p_editlink_pixbuf);
[1634]54  Gtk::IconSet editlink_icon_set;
55  editlink_icon_set.add_source(editlink_icon_source);
56  p_icon_factory->add(Gtk::StockID("gd-editlink"), editlink_icon_set);
57
58  Gtk::IconSource editnode_icon_source;
[1635]59  editnode_icon_source.set_pixbuf(p_editnode_pixbuf);
[1634]60  Gtk::IconSet editnode_icon_set;
61  editnode_icon_set.add_source(editnode_icon_source);
62  p_icon_factory->add(Gtk::StockID("gd-editnode"), editnode_icon_set);
63
64  Gtk::IconSource newmap_icon_source;
[1635]65  newmap_icon_source.set_pixbuf(p_newmap_pixbuf);
[1634]66  Gtk::IconSet newmap_icon_set;
67  newmap_icon_set.add_source(newmap_icon_source);
68  p_icon_factory->add(Gtk::StockID("gd-newmap"), newmap_icon_set);
69
70  p_icon_factory->add_default();
71 
[1442]72  ag=Gtk::ActionGroup::create();
73
74  ag->add( Gtk::Action::create("FileMenu", "_File") );
[1869]75  ag->add( Gtk::Action::create("FileNew", Gtk::Stock::NEW),
[1849]76      sigc::mem_fun(*this, &MainWin::newTab));
[1442]77  ag->add( Gtk::Action::create("FileOpen", Gtk::Stock::OPEN),
78      sigc::mem_fun(*this, &MainWin::openFile));
[1869]79  ag->add( Gtk::Action::create("FileClearTab", "Clear Tab"),
80      sigc::mem_fun(*this, &MainWin::newFile));
[1442]81  ag->add( Gtk::Action::create("FileSave", Gtk::Stock::SAVE),
82      sigc::mem_fun(*this, &MainWin::saveFile));
83  ag->add( Gtk::Action::create("FileSaveAs", Gtk::Stock::SAVE_AS),
84      sigc::mem_fun(*this, &MainWin::saveFileAs));
[1606]85  ag->add( Gtk::Action::create("Close", Gtk::Stock::CLOSE),
[1869]86      sigc::mem_fun(*this, &MainWin::closeTab));
[1606]87  ag->add( Gtk::Action::create("Quit", Gtk::Stock::QUIT),
[1598]88      sigc::mem_fun(*this, &MainWin::hide));
[1442]89
90  ag->add( Gtk::Action::create("ViewMenu", "_View") );
91  ag->add( Gtk::Action::create("ViewZoomIn", Gtk::Stock::ZOOM_IN),
[1849]92      sigc::mem_fun(*this, &MainWin::zoomIn));
[1442]93  ag->add( Gtk::Action::create("ViewZoomOut", Gtk::Stock::ZOOM_OUT),
[1849]94      sigc::mem_fun(*this, &MainWin::zoomOut));
[1442]95  ag->add( Gtk::Action::create("ViewZoomFit", Gtk::Stock::ZOOM_FIT),
[1849]96      sigc::mem_fun(*this, &MainWin::zoomFit));
[1442]97  ag->add( Gtk::Action::create("ViewZoom100", Gtk::Stock::ZOOM_100),
[1849]98      sigc::mem_fun(*this, &MainWin::zoom100));
[1442]99 
100  ag->add( Gtk::Action::create("ShowMenu", "_Show") );
101  ag->add( Gtk::Action::create("ShowMaps", "_Maps"),
[1838]102           sigc::mem_fun(*this, &MainWin::createMapWin));
[1442]103
[1871]104  ag->add( Gtk::Action::create("AlgoMenu", "_Algorithms") );
105  ag->add( Gtk::Action::create("AlgoGeneral", "_General"),
106           sigc::bind( sigc::mem_fun ( *this, &MainWin::createAlgoWin ), 0) );
[1876]107  ag->add( Gtk::Action::create("AlgoKruskal", "_Kruskal"),
108           sigc::bind( sigc::mem_fun ( *this, &MainWin::createAlgoWin ), 1) );
[1871]109
[1606]110  Gtk::RadioAction::Group tool_group;
[1634]111  ag->add( Gtk::RadioAction::create(tool_group, "MoveItem", Gtk::StockID("gd-move"), "Move"),
[1849]112      sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 0) );
[1634]113  ag->add( Gtk::RadioAction::create(tool_group, "CreateNode", Gtk::StockID("gd-addnode"), "Create node"),
[1849]114      sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 1) );
[1634]115  ag->add( Gtk::RadioAction::create(tool_group, "CreateEdge", Gtk::StockID("gd-addlink"), "Create edge"),
[1849]116      sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 2) );
[1634]117  ag->add( Gtk::RadioAction::create(tool_group, "EraseItem", Gtk::StockID("gd-delete"), "Delete"),
[1849]118      sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 3) );
[1634]119
120  ag->add( Gtk::RadioAction::create(tool_group, "EditEdgeMap", Gtk::StockID("gd-editlink"), "Edit edge map"),
[1849]121      sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 4) );
[1634]122  ag->add( Gtk::RadioAction::create(tool_group, "EditNodeMap", Gtk::StockID("gd-editnode"), "Edit node map"),
[1849]123      sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 5) );
[1634]124
125  ag->add( Gtk::Action::create("AddMap", Gtk::StockID("gd-newmap")),
[1849]126      sigc::mem_fun ( *this , &MainWin::createNewMapWin ) );
[1502]127
[1442]128  uim=Gtk::UIManager::create();
129  uim->insert_action_group(ag);
130  add_accel_group(uim->get_accel_group());
131
132  try
133  {
134
135    Glib::ustring ui_info =
136      "<ui>"
137      "  <menubar name='MenuBar'>"
138      "    <menu action='FileMenu'>"
139      "      <menuitem action='FileNew'/>"
140      "      <menuitem action='FileOpen'/>"
[1869]141      "      <menuitem action='FileClearTab'/>"
[1442]142      "      <menuitem action='FileSave'/>"
143      "      <menuitem action='FileSaveAs'/>"
[1606]144      "      <menuitem action='Close'/>"
145      "      <menuitem action='Quit'/>"
[1442]146      "    </menu>"
147      "    <menu action='ViewMenu'>"
148      "      <menuitem action='ViewZoomIn' />"
149      "      <menuitem action='ViewZoomOut' />"
150      "      <menuitem action='ViewZoom100' />"
[1777]151      "      <menuitem action='ViewZoomFit' />"
[1442]152      "    </menu>"
153      "    <menu action='ShowMenu'>"
154      "      <menuitem action='ShowMaps'/>"
155      "    </menu>"
[1871]156      "    <menu action='AlgoMenu'>"
157      "      <menuitem action='AlgoGeneral'/>"
[1876]158      "      <menuitem action='AlgoKruskal'/>"
[1871]159      "    </menu>"
[1442]160      "  </menubar>"
161      "  <toolbar name='ToolBar'>"
162      "    <toolitem action='FileNew' />"
163      "    <toolitem action='FileOpen' />"
164      "    <toolitem action='FileSave' />"
[1606]165      "    <toolitem action='Close' />"
[1442]166      "    <separator />"
167      "    <toolitem action='ViewZoomIn' />"
168      "    <toolitem action='ViewZoomOut' />"
169      "    <toolitem action='ViewZoom100' />"
[1777]170      "    <toolitem action='ViewZoomFit' />"
[1502]171      "    <separator />"
[1606]172      "    <toolitem action='MoveItem' />"
[1502]173      "    <toolitem action='CreateNode' />"
174      "    <toolitem action='CreateEdge' />"
175      "    <toolitem action='EraseItem' />"
[1550]176      "    <toolitem action='EditEdgeMap' />"
177      "    <toolitem action='EditNodeMap' />"
[1634]178      "    <separator />"
[1592]179      "    <toolitem action='AddMap' />"
[1442]180      "  </toolbar>"
181      "</ui>";
182
183    uim->add_ui_from_string(ui_info);
184
185  }
186  catch(const Glib::Error& ex)
187  {
188    std::cerr << "building menus failed: " <<  ex.what();
189  }
190
191  Gtk::Widget* menubar = uim->get_widget("/MenuBar");
192  if (menubar){
193    vbox.pack_start(*menubar, Gtk::PACK_SHRINK);
194  }
195
196  Gtk::Widget* toolbar = uim->get_widget("/ToolBar");
197  if (toolbar)
198  {
199    static_cast<Gtk::Toolbar*>(toolbar)->set_toolbar_style(Gtk::TOOLBAR_ICONS);
200    vbox.pack_start(*toolbar, Gtk::PACK_SHRINK);
201  }
202
[1601]203  tooltips.set_tip(*(uim->get_widget("/ToolBar/CreateNode")),"Create Node");
204  tooltips.enable();
[1442]205
[1849]206  active_tab=-1;
207  notebook.signal_switch_page().connect(sigc::mem_fun(*this, &MainWin::onChangeTab));
208
[1877]209  active_tool = MOVE;
210
[1849]211  vbox.pack_start(notebook);
212 
[1442]213  show_all_children();
214}
215
[1849]216void MainWin::set_tabtitle(std::string name)
[1616]217{
[1872]218  if(strinst.find(name)==strinst.end())
219    {
220      tabnames[active_tab]=name;
221      strinst[name]=1;
222    }
223  else
224    {
225      strinst[name]++;
226      std::ostringstream o;
227      o << strinst[name];
228      tabnames[active_tab]=name+" - "+o.str();
229    }
[1849]230  set_title(tabnames[active_tab] + " - " + prog_name);
231  notebook.set_tab_label_text((Widget&)*(tabs[active_tab]), tabnames[active_tab]);
[1876]232  updateAlgoWinTabs();
[1849]233}
234
235void MainWin::readFile(const std::string & filename)
236{
237  newTab();
238  tabs[active_tab]->readFile(filename);
239}
240
241void MainWin::newTab()
242{
243  int size=tabs.size();
244  tabs.resize(size+1);
245  tabnames.resize(size+1);
246  active_tab=size;
247  tabs[active_tab]=new NoteBookTab();
248  tabs[active_tab]->signal_title_ch().connect(sigc::mem_fun(*this, &MainWin::set_tabtitle));
249  tabs[active_tab]->signal_newmap_needed().connect(sigc::mem_fun(*this, &MainWin::createNewMapWinAfterSignal));
250  tabs[active_tab]->gd_canvas->changeEditorialTool(active_tool);
251  notebook.append_page((Gtk::Widget&)(*(tabs[active_tab])));
252  notebook.set_current_page(size);
[1872]253  set_tabtitle("unsaved file");
[1876]254  updateAlgoWinTabs();
[1849]255}
256
[1856]257void MainWin::closeTab()
258{
259  if(active_tab!=-1)
260    {
[1869]261      if (tabs[active_tab]->mapstorage.modified)
262        {
263          Gtk::MessageDialog mdialog("<b>Save changes before closing?</b>", true,
264                                     Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);
265          mdialog.add_button("Close file _without Saving", Gtk::RESPONSE_REJECT);
266          mdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
267          mdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
268          switch (mdialog.run())
269            {
270            case Gtk::RESPONSE_CANCEL:
271              return;
272            case Gtk::RESPONSE_REJECT:
273              break;
274            case Gtk::RESPONSE_ACCEPT:
275              tabs[active_tab]->saveFile();
276              break;
277            }
278        }
[1856]279      //tabs vector will be decreased with the deleted value
280      int size=tabs.size();
281      if(size>1)
282        {
283          for(int i=active_tab+1;i<size;i++)
284            {
[1871]285              tabnames[i-1]=tabnames[i];
[1856]286              tabs[i-1]=tabs[i];
287            }
288        }
289      //if size==1 resize will delete the only element
290      tabs.resize(size-1);
[1871]291      tabnames.resize(size-1);
[1856]292
293      int old_active_tab=active_tab;
294      notebook.remove_page(active_tab);
295
296      //If the first tab was active, upon delete notebook
297      //will first switch one tab upper and not lower like
298      //in the case, when not the first tab was active.
299      //But after deletion it will become the first tab,
300      //and this should be registrated in tabs vector,
301      //as well.
[1871]302      if((old_active_tab==0)&&(size!=1))
[1856]303        {
304          onChangeTab(NULL,0);
305        }
306
307      //if this was the last page in notebook, there is
308      //no active_tab now
309      if(size==1)
310        {
311          active_tab=-1;
312        }
[1871]313
[1876]314      updateAlgoWinTabs();
[1856]315    }
316}
317
[1849]318void MainWin::onChangeTab(GtkNotebookPage* page, guint page_num)
319{
320  page=page;
321  active_tab=page_num;
322  tabs[active_tab]->gd_canvas->changeEditorialTool(active_tool);
323  set_title(tabnames[active_tab]);
324}
325
326void MainWin::onCloseTab()
327{
[1616]328}
329
[1442]330void MainWin::newFile()
331{
[1849]332  if(active_tab!=-1)
[1606]333    {
[1849]334      tabs[active_tab]->newFile();
[1606]335    }
[1442]336}
[1849]337 
[1442]338void MainWin::openFile()
339{
[1849]340  if(active_tab!=-1)
[1606]341    {
[1849]342      tabs[active_tab]->openFile();
[1606]343    }
[1442]344}
[1849]345 
[1442]346void MainWin::saveFile()
347{
[1849]348  if(active_tab!=-1)
349    {
350      tabs[active_tab]->saveFile();
351    }
[1442]352}
[1849]353 
[1442]354void MainWin::saveFileAs()
355{
[1849]356  if(active_tab!=-1)
357    {
358      tabs[active_tab]->saveFileAs();
359    }
[1442]360}
[1849]361 
[1606]362void MainWin::close()
363{
[1849]364  if(active_tab!=-1)
[1606]365    {
[1849]366      tabs[active_tab]->close();
[1838]367    }
[1837]368}
369
[1849]370void MainWin::zoomIn()
[1837]371{
[1849]372  if(active_tab!=-1)
[1838]373    {
[1849]374      tabs[active_tab]->gd_canvas->zoomIn();
375    }
376}
377
378void MainWin::zoomOut()
379{
380  if(active_tab!=-1)
381    {
382      tabs[active_tab]->gd_canvas->zoomOut();
383    }
384}
385
386void MainWin::zoomFit()
387{
388  if(active_tab!=-1)
389    {
390      tabs[active_tab]->gd_canvas->zoomFit();
391    }
392}
393
394void MainWin::zoom100()
395{
396  if(active_tab!=-1)
397    {
398      tabs[active_tab]->gd_canvas->zoom100();
[1838]399    }
[1837]400}
[1838]401
402void MainWin::createMapWin()
403{
[1849]404  if(active_tab!=-1)
[1838]405    {
[1849]406      tabs[active_tab]->createMapWin(tabnames[active_tab]);
[1838]407    }
408}
409
[1871]410void MainWin::createAlgoWin(int algoid)
411{
[1878]412  AlgoWin * aw=new AlgoWin(algoid, tabnames);
[1871]413  aw->signal_closing().connect(sigc::mem_fun(*this, &MainWin::deRegisterAlgoWin));
[1876]414  aw->signal_maplist_needed().connect(sigc::mem_fun(*this, &MainWin::updateAlgoWinMaps));
[1871]415  aws.insert(aw);
416  aw->show();
417}
418
[1876]419void MainWin::updateAlgoWinTabs()
[1871]420{
421  std::set< AlgoWin* >::iterator awsi=aws.begin();
422  for(;awsi!=aws.end();awsi++)
423    {
424      (*awsi)->update_tablist(tabnames);
425    }
426}
427
[1878]428void MainWin::updateAlgoWinMaps(AlgoWin * awp, std::string tabname)
429{
430  int i=0;
431  for(;(i<(int)tabnames.size())&&(tabnames[i]!=tabname);i++)
432    {
433    }
434  //awp->update_maplist(tabs[i]->mapstorage.getNodeMapList(),tabs[i]->mapstorage.getEdgeMapList());
435  awp->update_maplist(&(tabs[i]->mapstorage));
436}
437
438void MainWin::deRegisterAlgoWin(AlgoWin * awp)
439{
440  aws.erase(awp);
441}
442
[1849]443void MainWin::changeEditorialTool(int tool)
[1838]444{
[1849]445  active_tool=tool;
446  if(active_tab!=-1)
447    {
448      tabs[active_tab]->gd_canvas->changeEditorialTool(tool);
449    }
[1838]450}
[1849]451
452void MainWin::createNewMapWin()
453{
454  if(active_tab!=-1)
455    {
456      NewMapWin * nmw=new NewMapWin("Create New Map - "+tabnames[active_tab], *(tabs[active_tab]));
457      nmw->show();
458    }
459}
460
461void MainWin::createNewMapWinAfterSignal(NoteBookTab * nbt, bool itisedge)
462{
463  std::vector<NoteBookTab*>::iterator nbti=tabs.begin();
464  int i=0;
465  for(;nbti!=tabs.end();nbti++)
466    {
467      if(*nbti!=nbt)
468        {
469          i++;
470        }
471      else
472        {
473          continue;
474        }
475    }
476  NewMapWin * nmw=new NewMapWin("Create New Map - "+tabnames[i], *nbt, itisedge, false);
477  nmw->run();
478}
Note: See TracBrowser for help on using the repository browser.