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
Line 
1#ifdef HAVE_CONFIG_H
2#include <config.h>
3#endif
4
5#include "main_win.h"
6#include "guipixbufs.h"
7
8#include "i18n.h"
9
10MainWin::MainWin()
11{
12  set_title ("no file");
13  set_default_size(WIN_WIDTH,WIN_HEIGHT);
14  add(vbox);
15
16  // custom icons for the toolbar
17  Glib::RefPtr<Gtk::IconFactory> p_icon_factory = Gtk::IconFactory::create();
18 
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);
31
32  Gtk::IconSource move_icon_source;
33  move_icon_source.set_pixbuf(p_move_pixbuf);
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;
39  addnode_icon_source.set_pixbuf(p_addnode_pixbuf);
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;
45  addlink_icon_source.set_pixbuf(p_addlink_pixbuf);
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;
51  delete_icon_source.set_pixbuf(p_delete_pixbuf);
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;
57  editlink_icon_source.set_pixbuf(p_editlink_pixbuf);
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;
63  newmap_icon_source.set_pixbuf(p_newmap_pixbuf);
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 
70  ag=Gtk::ActionGroup::create();
71
72  ag->add( Gtk::Action::create("FileMenu", _("_File")) );
73  ag->add( Gtk::Action::create("FileNew", Gtk::Stock::NEW),
74      sigc::mem_fun(*this, &MainWin::newTab));
75  ag->add( Gtk::Action::create("FileOpen", Gtk::Stock::OPEN),
76      sigc::mem_fun(*this, &MainWin::openFile));
77  ag->add( Gtk::Action::create("FileClearTab", _("Clear Tab")),
78      sigc::mem_fun(*this, &MainWin::newFile));
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));
83  ag->add( Gtk::Action::create("Close", Gtk::Stock::CLOSE),
84      sigc::mem_fun(*this, &MainWin::closeTab));
85  ag->add( Gtk::Action::create("Quit", Gtk::Stock::QUIT),
86      sigc::mem_fun(*this, &MainWin::hide));
87
88  ag->add( Gtk::Action::create("ViewMenu", _("_View")) );
89  ag->add( Gtk::Action::create("ViewZoomIn", Gtk::Stock::ZOOM_IN),
90      sigc::mem_fun(*this, &MainWin::zoomIn));
91  ag->add( Gtk::Action::create("ViewZoomOut", Gtk::Stock::ZOOM_OUT),
92      sigc::mem_fun(*this, &MainWin::zoomOut));
93  ag->add( Gtk::Action::create("ViewZoomFit", Gtk::Stock::ZOOM_FIT),
94      sigc::mem_fun(*this, &MainWin::zoomFit));
95  ag->add( Gtk::Action::create("ViewZoom100", Gtk::Stock::ZOOM_100),
96      sigc::mem_fun(*this, &MainWin::zoom100));
97 
98  ag->add( Gtk::Action::create("ShowMenu", _("_Show")) );
99  ag->add( Gtk::Action::create("ShowMaps", _("_Maps")),
100           sigc::mem_fun(*this, &MainWin::createMapWin));
101
102  ag->add( Gtk::Action::create("AlgoMenu", _("_Algorithms")) );
103  ag->add( Gtk::Action::create("AlgoGeneral", _("_General")),
104           sigc::bind( sigc::mem_fun ( *this, &MainWin::createAlgoWin ), 0) );
105  ag->add( Gtk::Action::create("AlgoKruskal", _("_Kruskal")),
106           sigc::bind( sigc::mem_fun ( *this, &MainWin::createAlgoWin ), 1) );
107
108  Gtk::RadioAction::Group tool_group;
109  ag->add( Gtk::RadioAction::create(tool_group, "MoveItem", Gtk::StockID("gd-move"), _("Move")),
110      sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 0) );
111  ag->add( Gtk::RadioAction::create(tool_group, "CreateNode", Gtk::StockID("gd-addnode"), _("Create node")),
112      sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 1) );
113  ag->add( Gtk::RadioAction::create(tool_group, "CreateEdge", Gtk::StockID("gd-addlink"), _("Create edge")),
114      sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 2) );
115  ag->add( Gtk::RadioAction::create(tool_group, "EraseItem", Gtk::StockID("gd-delete"), _("Delete")),
116      sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 3) );
117
118  ag->add( Gtk::RadioAction::create(tool_group, "EditEdgeMap", Gtk::StockID("gd-editlink"), _("Edit edge map")),
119      sigc::bind( sigc::mem_fun ( *this, &MainWin::changeEditorialTool ), 4) );
120
121  ag->add( Gtk::Action::create("AddMap", Gtk::StockID("gd-newmap")),
122      sigc::mem_fun ( *this , &MainWin::createNewMapWin ) );
123
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'/>"
137      "      <menuitem action='FileClearTab'/>"
138      "      <menuitem action='FileSave'/>"
139      "      <menuitem action='FileSaveAs'/>"
140      "      <menuitem action='Close'/>"
141      "      <menuitem action='Quit'/>"
142      "    </menu>"
143      "    <menu action='ViewMenu'>"
144      "      <menuitem action='ViewZoomIn' />"
145      "      <menuitem action='ViewZoomOut' />"
146      "      <menuitem action='ViewZoom100' />"
147      "      <menuitem action='ViewZoomFit' />"
148      "    </menu>"
149      "    <menu action='ShowMenu'>"
150      "      <menuitem action='ShowMaps'/>"
151      "    </menu>"
152      "    <menu action='AlgoMenu'>"
153      "      <menuitem action='AlgoGeneral'/>"
154      "      <menuitem action='AlgoKruskal'/>"
155      "    </menu>"
156      "  </menubar>"
157      "  <toolbar name='ToolBar'>"
158      "    <toolitem action='FileNew' />"
159      "    <toolitem action='FileOpen' />"
160      "    <toolitem action='FileSave' />"
161      "    <toolitem action='Close' />"
162      "    <separator />"
163      "    <toolitem action='ViewZoomIn' />"
164      "    <toolitem action='ViewZoomOut' />"
165      "    <toolitem action='ViewZoom100' />"
166      "    <toolitem action='ViewZoomFit' />"
167      "    <separator />"
168      "    <toolitem action='MoveItem' />"
169      "    <toolitem action='CreateNode' />"
170      "    <toolitem action='CreateEdge' />"
171      "    <toolitem action='EraseItem' />"
172      "    <toolitem action='EditEdgeMap' />"
173      "    <separator />"
174      "    <toolitem action='AddMap' />"
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
198  tooltips.set_tip(*(uim->get_widget("/ToolBar/CreateNode")),"Create Node");
199  tooltips.enable();
200
201  active_tab=-1;
202  notebook.signal_switch_page().connect(sigc::mem_fun(*this, &MainWin::onChangeTab));
203
204  active_tool = MOVE;
205
206  vbox.pack_start(notebook);
207 
208  show_all_children();
209}
210
211void MainWin::set_tabtitle(std::string name)
212{
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    }
225  set_title(tabnames[active_tab] + " - " + prog_name);
226  notebook.set_tab_label_text((Widget&)*(tabs[active_tab]), tabnames[active_tab]);
227  updateAlgoWinTabs();
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);
248  set_tabtitle(_("unsaved file"));
249  updateAlgoWinTabs();
250}
251
252void MainWin::closeTab()
253{
254  if(active_tab!=-1)
255    {
256      if (tabs[active_tab]->mapstorage.modified)
257        {
258          Gtk::MessageDialog mdialog(_("<b>Save changes before closing?</b>"), true,
259                                     Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);
260          mdialog.add_button(_("Close file _without Saving"), Gtk::RESPONSE_REJECT);
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        }
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            {
280              tabnames[i-1]=tabnames[i];
281              tabs[i-1]=tabs[i];
282            }
283        }
284      //if size==1 resize will delete the only element
285      tabs.resize(size-1);
286      tabnames.resize(size-1);
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.
297      if((old_active_tab==0)&&(size!=1))
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        }
308
309      updateAlgoWinTabs();
310    }
311}
312
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
321void MainWin::newFile()
322{
323  if(active_tab!=-1)
324    {
325      tabs[active_tab]->newFile();
326    }
327}
328 
329void MainWin::openFile()
330{
331  if(active_tab==-1)
332    {
333      newTab();
334    }
335  tabs[active_tab]->openFile();
336}
337 
338void MainWin::saveFile()
339{
340  if(active_tab!=-1)
341    {
342      tabs[active_tab]->saveFile();
343    }
344}
345 
346void MainWin::saveFileAs()
347{
348  if(active_tab!=-1)
349    {
350      tabs[active_tab]->saveFileAs();
351    }
352}
353 
354void MainWin::close()
355{
356  if(active_tab!=-1)
357    {
358      tabs[active_tab]->close();
359    }
360}
361
362void MainWin::zoomIn()
363{
364  if(active_tab!=-1)
365    {
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();
391    }
392}
393
394void MainWin::createMapWin()
395{
396  if(active_tab!=-1)
397    {
398      tabs[active_tab]->createMapWin(tabnames[active_tab]);
399    }
400}
401
402void MainWin::createAlgoWin(int algoid)
403{
404  AlgoWin * aw=new AlgoWin(algoid, tabnames);
405  aw->signal_closing().connect(sigc::mem_fun(*this, &MainWin::deRegisterAlgoWin));
406  aw->signal_maplist_needed().connect(sigc::mem_fun(*this, &MainWin::updateAlgoWinMaps));
407  aw->signal_newmapwin_needed().connect(sigc::mem_fun(*this, &MainWin::createNewMapWinTabString));
408  aws.insert(aw);
409  aw->show();
410}
411
412void MainWin::updateAlgoWinTabs()
413{
414  std::set< AlgoWin* >::iterator awsi=aws.begin();
415  for(;awsi!=aws.end();awsi++)
416    {
417      (*awsi)->update_tablist(tabnames);
418    }
419}
420
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
435void MainWin::changeEditorialTool(int tool)
436{
437  active_tool=tool;
438  if(active_tab!=-1)
439    {
440      tabs[active_tab]->gd_canvas->changeEditorialTool(tool);
441    }
442}
443
444void MainWin::createNewMapWin()
445{
446  if(active_tab!=-1)
447    {
448      NewMapWin * nmw=new NewMapWin(_("Create New Map - ")+tabnames[active_tab], *(tabs[active_tab]));
449      nmw->show();
450    }
451}
452
453void MainWin::createNewMapWinTabString(std::string tabname, bool itisedge)
454{
455  int i=0;
456  for(;((i<(int)tabnames.size())&&(tabnames[i]!=tabname));i++)
457    {
458    }
459  createNewMapWinAfterSignal(tabs[i], itisedge);
460}
461
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    }
477  NewMapWin * nmw=new NewMapWin(_("Create New Map - ")+tabnames[i], *nbt, itisedge, false);
478  nmw->run();
479}
Note: See TracBrowser for help on using the repository browser.