main_win.cc
author hegyi
Thu, 21 Sep 2006 10:29:29 +0000
changeset 150 86273bfe0e4d
parent 140 d300e3153ab1
child 154 65c1b103443d
permissions -rw-r--r--
According to xy->Point changement.
     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 
    10 MainWin::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 
   211 void 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 
   230 void MainWin::readFile(const std::string & filename)
   231 {
   232   newTab();
   233   tabs[active_tab]->readFile(filename);
   234 }
   235 
   236 void 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 
   252 void 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 
   313 void 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 
   321 void MainWin::newFile()
   322 {
   323   if(active_tab!=-1)
   324     {
   325       tabs[active_tab]->newFile();
   326     }
   327 }
   328  
   329 void MainWin::openFile()
   330 {
   331   if(active_tab==-1)
   332     {
   333       newTab();
   334     }
   335   tabs[active_tab]->openFile();
   336 }
   337  
   338 void MainWin::saveFile()
   339 {
   340   if(active_tab!=-1)
   341     {
   342       tabs[active_tab]->saveFile();
   343     }
   344 }
   345  
   346 void MainWin::saveFileAs()
   347 {
   348   if(active_tab!=-1)
   349     {
   350       tabs[active_tab]->saveFileAs();
   351     }
   352 }
   353  
   354 void MainWin::close()
   355 {
   356   if(active_tab!=-1)
   357     {
   358       tabs[active_tab]->close();
   359     }
   360 }
   361 
   362 void MainWin::zoomIn()
   363 {
   364   if(active_tab!=-1)
   365     {
   366       tabs[active_tab]->gd_canvas->zoomIn();
   367     }
   368 }
   369 
   370 void MainWin::zoomOut()
   371 {
   372   if(active_tab!=-1)
   373     {
   374       tabs[active_tab]->gd_canvas->zoomOut();
   375     }
   376 }
   377 
   378 void MainWin::zoomFit()
   379 {
   380   if(active_tab!=-1)
   381     {
   382       tabs[active_tab]->gd_canvas->zoomFit();
   383     }
   384 }
   385 
   386 void MainWin::zoom100()
   387 {
   388   if(active_tab!=-1)
   389     {
   390       tabs[active_tab]->gd_canvas->zoom100();
   391     }
   392 }
   393 
   394 void MainWin::createMapWin()
   395 {
   396   if(active_tab!=-1)
   397     {
   398       tabs[active_tab]->createMapWin(tabnames[active_tab]);
   399     }
   400 }
   401 
   402 void 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 
   412 void 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 
   421 void 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 
   430 void MainWin::deRegisterAlgoWin(AlgoWin * awp)
   431 {
   432   aws.erase(awp);
   433 }
   434 
   435 void 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 
   444 void 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 
   453 void 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 
   462 void 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 }