COIN-OR::LEMON - Graph Library

source: lemon-0.x/gui/main_win.cc @ 1650:422906271d22

Last change on this file since 1650:422906271d22 was 1650:422906271d22, checked in by Akos Ladanyi, 14 years ago

display file name in window title

File size: 11.7 KB
Line 
1#include "main_win.h"
2#include "guipixbufs.h"
3
4MainWin::MainWin() :
5  mapwin("Map Setup", mapstorage, gd_canvas),
6  newmapwin("Creating new map", gd_canvas), gd_canvas(mapstorage, mapwin, (Gtk::Window *)this)
7{
8  set_title ("unsaved file - " + prog_name);
9  set_default_size(WIN_WIDTH,WIN_HEIGHT);
10  add(vbox);
11
12
13  // custom icons for the toolbar
14
15  Glib::RefPtr<Gtk::IconFactory> p_icon_factory = Gtk::IconFactory::create();
16 
17  Glib::RefPtr<Gdk::Pixbuf> p_move_pixbuf = Gdk::Pixbuf::create_from_inline(
18      2328, gui_icons_move);
19  Glib::RefPtr<Gdk::Pixbuf> p_addnode_pixbuf = Gdk::Pixbuf::create_from_inline(
20      2328, gui_icons_addnode);
21  Glib::RefPtr<Gdk::Pixbuf> p_addlink_pixbuf = Gdk::Pixbuf::create_from_inline(
22      2328, gui_icons_addlink);
23  Glib::RefPtr<Gdk::Pixbuf> p_delete_pixbuf = Gdk::Pixbuf::create_from_inline(
24      2328, gui_icons_delete);
25  Glib::RefPtr<Gdk::Pixbuf> p_editlink_pixbuf = Gdk::Pixbuf::create_from_inline(
26      2328, gui_icons_editlink);
27  Glib::RefPtr<Gdk::Pixbuf> p_editnode_pixbuf = Gdk::Pixbuf::create_from_inline(
28      2328, gui_icons_editnode);
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 editnode_icon_source;
63  editnode_icon_source.set_pixbuf(p_editnode_pixbuf);
64  Gtk::IconSet editnode_icon_set;
65  editnode_icon_set.add_source(editnode_icon_source);
66  p_icon_factory->add(Gtk::StockID("gd-editnode"), editnode_icon_set);
67
68  Gtk::IconSource newmap_icon_source;
69  newmap_icon_source.set_pixbuf(p_newmap_pixbuf);
70  Gtk::IconSet newmap_icon_set;
71  newmap_icon_set.add_source(newmap_icon_source);
72  p_icon_factory->add(Gtk::StockID("gd-newmap"), newmap_icon_set);
73
74  p_icon_factory->add_default();
75 
76
77  ag=Gtk::ActionGroup::create();
78
79  ag->add( Gtk::Action::create("FileMenu", "_File") );
80  ag->add( Gtk::Action::create("FileNew", Gtk::Stock::NEW),
81      sigc::mem_fun(*this, &MainWin::newFile));
82  ag->add( Gtk::Action::create("FileOpen", Gtk::Stock::OPEN),
83      sigc::mem_fun(*this, &MainWin::openFile));
84  ag->add( Gtk::Action::create("FileSave", Gtk::Stock::SAVE),
85      sigc::mem_fun(*this, &MainWin::saveFile));
86  ag->add( Gtk::Action::create("FileSaveAs", Gtk::Stock::SAVE_AS),
87      sigc::mem_fun(*this, &MainWin::saveFileAs));
88  ag->add( Gtk::Action::create("Close", Gtk::Stock::CLOSE),
89      sigc::mem_fun(*this, &MainWin::close));
90  ag->add( Gtk::Action::create("Quit", Gtk::Stock::QUIT),
91      sigc::mem_fun(*this, &MainWin::hide));
92
93  ag->add( Gtk::Action::create("ViewMenu", "_View") );
94  ag->add( Gtk::Action::create("ViewZoomIn", Gtk::Stock::ZOOM_IN),
95      sigc::mem_fun(this->gd_canvas, &GraphDisplayerCanvas::zoomIn));
96  ag->add( Gtk::Action::create("ViewZoomOut", Gtk::Stock::ZOOM_OUT),
97      sigc::mem_fun(this->gd_canvas, &GraphDisplayerCanvas::zoomOut));
98  ag->add( Gtk::Action::create("ViewZoomFit", Gtk::Stock::ZOOM_FIT),
99      sigc::mem_fun(this->gd_canvas, &GraphDisplayerCanvas::zoomFit));
100  ag->add( Gtk::Action::create("ViewZoom100", Gtk::Stock::ZOOM_100),
101      sigc::mem_fun(this->gd_canvas, &GraphDisplayerCanvas::zoom100));
102 
103  ag->add( Gtk::Action::create("ShowMenu", "_Show") );
104  ag->add( Gtk::Action::create("ShowMaps", "_Maps"),
105      sigc::mem_fun(this->mapwin, &MapWin::show));
106
107  Gtk::RadioAction::Group tool_group;
108  ag->add( Gtk::RadioAction::create(tool_group, "MoveItem", Gtk::StockID("gd-move"), "Move"),
109      sigc::bind( sigc::mem_fun ( this->gd_canvas, &GraphDisplayerCanvas::changeEditorialTool ), 0) );
110  ag->add( Gtk::RadioAction::create(tool_group, "CreateNode", Gtk::StockID("gd-addnode"), "Create node"),
111      sigc::bind( sigc::mem_fun ( this->gd_canvas, &GraphDisplayerCanvas::changeEditorialTool ), 1) );
112  ag->add( Gtk::RadioAction::create(tool_group, "CreateEdge", Gtk::StockID("gd-addlink"), "Create edge"),
113      sigc::bind( sigc::mem_fun ( this->gd_canvas, &GraphDisplayerCanvas::changeEditorialTool ), 2) );
114  ag->add( Gtk::RadioAction::create(tool_group, "EraseItem", Gtk::StockID("gd-delete"), "Delete"),
115      sigc::bind( sigc::mem_fun ( this->gd_canvas, &GraphDisplayerCanvas::changeEditorialTool ), 3) );
116
117  ag->add( Gtk::RadioAction::create(tool_group, "EditEdgeMap", Gtk::StockID("gd-editlink"), "Edit edge map"),
118      sigc::bind( sigc::mem_fun ( this->gd_canvas, &GraphDisplayerCanvas::changeEditorialTool ), 4) );
119  ag->add( Gtk::RadioAction::create(tool_group, "EditNodeMap", Gtk::StockID("gd-editnode"), "Edit node map"),
120      sigc::bind( sigc::mem_fun ( this->gd_canvas, &GraphDisplayerCanvas::changeEditorialTool ), 5) );
121
122  ag->add( Gtk::Action::create("AddMap", Gtk::StockID("gd-newmap")),
123      sigc::mem_fun ( this->newmapwin, &NewMapWin::show ) );
124
125  uim=Gtk::UIManager::create();
126  uim->insert_action_group(ag);
127  add_accel_group(uim->get_accel_group());
128
129  try
130  {
131
132    Glib::ustring ui_info =
133      "<ui>"
134      "  <menubar name='MenuBar'>"
135      "    <menu action='FileMenu'>"
136      "      <menuitem action='FileNew'/>"
137      "      <menuitem action='FileOpen'/>"
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='ViewZoomFit' />"
147      "      <menuitem action='ViewZoom100' />"
148      "    </menu>"
149      "    <menu action='ShowMenu'>"
150      "      <menuitem action='ShowMaps'/>"
151      "    </menu>"
152      "  </menubar>"
153      "  <toolbar name='ToolBar'>"
154      "    <toolitem action='FileNew' />"
155      "    <toolitem action='FileOpen' />"
156      "    <toolitem action='FileSave' />"
157      "    <toolitem action='Close' />"
158      "    <separator />"
159      "    <toolitem action='ViewZoomIn' />"
160      "    <toolitem action='ViewZoomOut' />"
161      "    <toolitem action='ViewZoomFit' />"
162      "    <toolitem action='ViewZoom100' />"
163      "    <separator />"
164      "    <toolitem action='MoveItem' />"
165      "    <toolitem action='CreateNode' />"
166      "    <toolitem action='CreateEdge' />"
167      "    <toolitem action='EraseItem' />"
168      "    <toolitem action='EditEdgeMap' />"
169      "    <toolitem action='EditNodeMap' />"
170      "    <separator />"
171      "    <toolitem action='AddMap' />"
172      "  </toolbar>"
173      "</ui>";
174
175    uim->add_ui_from_string(ui_info);
176
177  }
178  catch(const Glib::Error& ex)
179  {
180    std::cerr << "building menus failed: " <<  ex.what();
181  }
182
183  Gtk::Widget* menubar = uim->get_widget("/MenuBar");
184  if (menubar){
185    vbox.pack_start(*menubar, Gtk::PACK_SHRINK);
186  }
187
188  Gtk::Widget* toolbar = uim->get_widget("/ToolBar");
189  if (toolbar)
190  {
191    static_cast<Gtk::Toolbar*>(toolbar)->set_toolbar_style(Gtk::TOOLBAR_ICONS);
192    vbox.pack_start(*toolbar, Gtk::PACK_SHRINK);
193  }
194
195  Gtk::ScrolledWindow* pScrolledWindow = manage(new Gtk::ScrolledWindow());
196  pScrolledWindow->add(gd_canvas);
197  vbox.pack_start(*pScrolledWindow);
198
199  tooltips.set_tip(*(uim->get_widget("/ToolBar/CreateNode")),"Create Node");
200  tooltips.enable();
201
202  show_all_children();
203}
204
205void MainWin::readFile(const std::string &file)
206{
207  mapstorage.readFromFile(file);
208  mapstorage.file_name = file;
209  mapstorage.modified = false;
210  gd_canvas.drawGraph();
211  mapwin.update();
212  set_title(Glib::filename_display_basename(file) + " - " + prog_name);
213}
214
215void MainWin::newFile()
216{
217  if (mapstorage.modified)
218  {
219    Gtk::MessageDialog mdialog("<b>Save changes before closing?</b>", true,
220        Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);
221    mdialog.add_button("Close _without Saving", Gtk::RESPONSE_REJECT);
222    mdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
223    mdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
224    switch (mdialog.run())
225    {
226      case Gtk::RESPONSE_CANCEL:
227        return;
228      case Gtk::RESPONSE_REJECT:
229        break;
230      case Gtk::RESPONSE_ACCEPT:
231        saveFile();
232        break;
233    }
234  }
235  gd_canvas.clear();
236  mapstorage.clear();
237  mapwin.update();
238  set_title("unsaved file - " + prog_name);
239}
240
241void MainWin::openFile()
242{
243  if (mapstorage.modified)
244  {
245    Gtk::MessageDialog mdialog("<b>Save changes before closing?</b>", true,
246        Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);
247    mdialog.add_button("Close _without Saving", Gtk::RESPONSE_REJECT);
248    mdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
249    mdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
250    switch (mdialog.run())
251    {
252      case Gtk::RESPONSE_CANCEL:
253        return;
254      case Gtk::RESPONSE_REJECT:
255        break;
256      case Gtk::RESPONSE_ACCEPT:
257        saveFile();
258        break;
259    }
260  }
261  Gtk::FileChooserDialog fcdialog("Open File");
262  fcdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
263  fcdialog.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
264  if (fcdialog.run() == Gtk::RESPONSE_ACCEPT)
265  {
266    gd_canvas.clear();
267    mapstorage.clear();
268    Glib::ustring filename = fcdialog.get_filename();
269    if (!mapstorage.readFromFile(filename))
270    {
271      mapstorage.file_name = filename;
272      mapstorage.modified = false;
273      gd_canvas.drawGraph();
274      mapwin.update();
275      set_title(Glib::filename_display_basename(filename) + " - " + prog_name);
276    }
277  }
278}
279
280void MainWin::saveFile()
281{
282  if (mapstorage.file_name == "") {
283    saveFileAs();
284  }
285  else
286  {
287    mapstorage.writeToFile(mapstorage.file_name);
288    mapstorage.modified = false;
289    set_title(Glib::filename_display_basename(mapstorage.file_name) + " - " +
290        prog_name);
291  }
292}
293
294void MainWin::saveFileAs()
295{
296  Gtk::FileChooserDialog fcdialog("Save File", Gtk::FILE_CHOOSER_ACTION_SAVE);
297  fcdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
298  fcdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
299  if (fcdialog.run() == Gtk::RESPONSE_ACCEPT)
300  {
301    Glib::ustring filename = fcdialog.get_filename();
302    mapstorage.file_name = filename;
303    mapstorage.writeToFile(filename);
304    mapstorage.modified = false;
305    set_title(Glib::filename_display_basename(filename) + " - " + prog_name);
306  }
307}
308
309void MainWin::close()
310{
311  if (mapstorage.modified)
312  {
313    Gtk::MessageDialog mdialog("<b>Save changes before closing?</b>", true,
314        Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE);
315    mdialog.add_button("Close _without Saving", Gtk::RESPONSE_REJECT);
316    mdialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
317    mdialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
318    switch (mdialog.run())
319    {
320      case Gtk::RESPONSE_CANCEL:
321        return;
322      case Gtk::RESPONSE_REJECT:
323        break;
324      case Gtk::RESPONSE_ACCEPT:
325        saveFile();
326        break;
327    }
328  }
329  gd_canvas.clear();
330  mapstorage.clear();
331  mapwin.update();
332  set_title("unsaved file - " + prog_name);
333}
Note: See TracBrowser for help on using the repository browser.