COIN-OR::LEMON - Graph Library

source: glemon-0.x/main_win.cc @ 149:930e838ad5b6

Last change on this file since 149:930e838ad5b6 was 149:930e838ad5b6, checked in by Hegyi Péter, 18 years ago

Node and edge editor button are the same furthermore.

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