graph_displayer_canvas-event.cc
changeset 149 930e838ad5b6
parent 148 5adf29662354
child 150 86273bfe0e4d
equal deleted inserted replaced
39:c2320c08b6af 40:b6e8346732f8
    25 	    generated->type=GDK_BUTTON_RELEASE;
    25 	    generated->type=GDK_BUTTON_RELEASE;
    26 	    generated->button.button=3;
    26 	    generated->button.button=3;
    27 	    createEdgeEventHandler(generated);      
    27 	    createEdgeEventHandler(generated);      
    28 	    break;
    28 	    break;
    29 	  }
    29 	  }
    30 	case EDGE_MAP_EDIT:
    30 	case MAP_EDIT:
    31 	  //has to do the same thing as in the case of NODE_MAP_EDIT
       
    32 	case NODE_MAP_EDIT:
       
    33 	  {
    31 	  {
    34 	    break;
    32 	    break;
    35 	  }
    33 	  }
    36 	default:
    34 	default:
    37 	  break;
    35 	  break;
    61 
    59 
    62 	case ERASER:
    60 	case ERASER:
    63 	  actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::eraserEventHandler), false);
    61 	  actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::eraserEventHandler), false);
    64 	  break;
    62 	  break;
    65 
    63 
    66 	case EDGE_MAP_EDIT:
    64 	case MAP_EDIT:
    67 	  grab_focus();
    65 	  grab_focus();
    68 	  actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::edgeMapEditEventHandler), false);
    66 	  actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::mapEditEventHandler), false);
    69 	  break;
       
    70 
       
    71 	case NODE_MAP_EDIT:
       
    72 	  actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::nodeMapEditEventHandler), false);
       
    73 	  break;
    67 	  break;
    74 
    68 
    75 	default:
    69 	default:
    76 	  break;
    70 	  break;
    77 	}
    71 	}
   620       break;
   614       break;
   621     }
   615     }
   622   return false;
   616   return false;
   623 }
   617 }
   624 
   618 
   625 bool GraphDisplayerCanvas::edgeMapEditEventHandler(GdkEvent* e)
   619 bool GraphDisplayerCanvas::mapEditEventHandler(GdkEvent* e)
   626 {
   620 {
   627   if(actual_tool==EDGE_MAP_EDIT)
   621   if(actual_tool==MAP_EDIT)
   628   {
       
   629     switch(e->type)
       
   630     {
   622     {
   631       case GDK_BUTTON_PRESS:
   623       switch(e->type)
   632         {
   624 	{
   633           //for determine, whether it was an edge
   625 	case GDK_BUTTON_PRESS:
   634           Edge clicked_edge=INVALID;
   626 	  {
   635 
   627 	    //for determine, whether it was an edge
   636           window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
   628 	    Edge clicked_edge=INVALID;
   637           active_item=(get_item_at(clicked_x, clicked_y));
   629 	    //for determine, whether it was a node
   638 
   630 	    Node clicked_node=INVALID;
   639           //find the activated item between texts
   631 
   640           for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
   632 	    window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
   641           {
   633 	    active_item=(get_item_at(clicked_x, clicked_y));
   642             //at the same time only one can be active
   634 
   643             if(edgetextmap[i]==active_item)
   635 	    //find the activated item between text of nodes
   644             {
   636 	    for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
   645               clicked_edge=i;
   637 	      {
   646             }
   638 		//at the same time only one can be active
   647           }
   639 		if(nodetextmap[i]==active_item)
   648 
   640 		  {
   649           //if it was not between texts, search for it between edges
   641 		    clicked_node=i;
   650           if(clicked_edge==INVALID)
   642 		  }
   651           {
   643 	      }
   652             for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
   644 
   653             {
   645 	    //if there was not, search for it between nodes
   654               //at the same time only one can be active
   646 	    if(clicked_node==INVALID)
   655               if((edgesmap[i]==active_item)||(edgetextmap[i]==active_item))
   647 	      {
   656               {
   648 		for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
   657                 clicked_edge=i;
   649 		  {
   658               }
   650 		    //at the same time only one can be active
   659             }
   651 		    if(nodesmap[i]==active_item)
   660           }
   652 		      {
   661  
   653 			clicked_node=i;
   662           //if it was really an edge...
   654 		      }
   663           if(clicked_edge!=INVALID)
   655 		  }
   664           {
   656 	      }
   665             // the id map is not editable
   657 
   666             if (edgemap_to_edit == "label") return 0;
   658 	    if(clicked_node==INVALID)
   667 
   659 	      {
   668             //and there is activated map
   660 		//find the activated item between texts
   669             if(edgetextmap[clicked_edge]->property_text().get_value()!="")
   661 		for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
   670             {
   662 		  {
   671               //activate the general variable for it
   663 		    //at the same time only one can be active
   672               active_edge=clicked_edge;
   664 		    if(edgetextmap[i]==active_item)
   673 
   665 		      {
   674               //create a dialog
   666 			clicked_edge=i;
   675               Gtk::Dialog dialog("Edit value", true);
   667 		      }
   676               dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
   668 		  }
   677               dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_ACCEPT);
   669 
   678               Gtk::VBox* vbox = dialog.get_vbox();
   670 		//if it was not between texts, search for it between edges
   679               Gtk::SpinButton spin(0.0, 4);
   671 		if(clicked_edge==INVALID)
   680               spin.set_increments(1.0, 10.0);
   672 		  {
   681               spin.set_range(-1000000.0, 1000000.0);
   673 		    for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
   682               spin.set_numeric(true);
   674 		      {
   683               vbox->add(spin);
   675 			//at the same time only one can be active
   684               spin.show();
   676 			if((edgesmap[i]->getLine())==active_item)
   685               switch (dialog.run())
   677 			  {
   686               {
   678 			    clicked_edge=i;
   687                 case Gtk::RESPONSE_NONE:
   679 			  }
   688                 case Gtk::RESPONSE_CANCEL:
   680 		      }
   689                   break;
   681 		  }
   690                 case Gtk::RESPONSE_ACCEPT:
   682 	      }
   691                   double new_value = spin.get_value();
   683 
   692                   (*(mytab.mapstorage).edgemap_storage[edgemap_to_edit])[active_edge] =
   684 	    //if it was really a node...
   693                     new_value;
   685 	    if(clicked_node!=INVALID)
   694                   std::ostringstream ostr;
   686 	      {
   695                   ostr << new_value;
   687 		// the id map is not editable
   696                   edgetextmap[active_edge]->property_text().set_value(
   688 		if (nodemap_to_edit == "label") return 0;
   697                       ostr.str());
   689 
   698                   //mapwin.updateEdge(active_edge);
   690 		//and there is activated map
   699 //                   mapwin.updateEdge(Edge(INVALID));
   691 		if(nodetextmap[clicked_node]->property_text().get_value()!="")
   700                   propertyUpdate(Edge(INVALID));
   692 		  {
   701               }
   693 		    //activate the general variable for it
   702             }
   694 		    active_node=clicked_node;
   703           }
   695 
   704           break;
   696 		    //create a dialog
   705         }
   697 		    Gtk::Dialog dialog("Edit value", true);
   706       default:
   698 		    dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
   707         break;
   699 		    dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_ACCEPT);
       
   700 		    Gtk::VBox* vbox = dialog.get_vbox();
       
   701 		    Gtk::SpinButton spin(0.0, 4);
       
   702 		    spin.set_increments(1.0, 10.0);
       
   703 		    spin.set_range(-1000000.0, 1000000.0);
       
   704 		    spin.set_numeric(true);
       
   705 		    spin.set_value(atof(nodetextmap[active_node]->property_text().get_value().c_str()));
       
   706 		    vbox->add(spin);
       
   707 		    spin.show();
       
   708 		    switch (dialog.run())
       
   709 		      {
       
   710 		      case Gtk::RESPONSE_NONE:
       
   711 		      case Gtk::RESPONSE_CANCEL:
       
   712 			break;
       
   713 		      case Gtk::RESPONSE_ACCEPT:
       
   714 			double new_value = spin.get_value();
       
   715 			(*(mytab.mapstorage).nodemap_storage[nodemap_to_edit])[active_node] =
       
   716 			  new_value;
       
   717 			std::ostringstream ostr;
       
   718 			ostr << new_value;
       
   719 			nodetextmap[active_node]->property_text().set_value(ostr.str());
       
   720 			//mapwin.updateNode(active_node);
       
   721 			//mapwin.updateNode(Node(INVALID));
       
   722 			propertyUpdate(Node(INVALID));
       
   723 		      }
       
   724 		  }
       
   725 	      }
       
   726 	    else
       
   727 	      //if it was really an edge...
       
   728 	      if(clicked_edge!=INVALID)
       
   729 		{
       
   730 		  // the id map is not editable
       
   731 		  if (edgemap_to_edit == "label") return 0;
       
   732 
       
   733 		  //and there is activated map
       
   734 		  if(edgetextmap[clicked_edge]->property_text().get_value()!="")
       
   735 		    {
       
   736 		      //activate the general variable for it
       
   737 		      active_edge=clicked_edge;
       
   738 
       
   739 		      //create a dialog
       
   740 		      Gtk::Dialog dialog("Edit value", true);
       
   741 		      dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
       
   742 		      dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_ACCEPT);
       
   743 		      Gtk::VBox* vbox = dialog.get_vbox();
       
   744 		      Gtk::SpinButton spin(0.0, 4);
       
   745 		      spin.set_increments(1.0, 10.0);
       
   746 		      spin.set_range(-1000000.0, 1000000.0);
       
   747 		      spin.set_numeric(true);
       
   748 		      spin.set_value(atof(edgetextmap[active_edge]->property_text().get_value().c_str()));
       
   749 		      vbox->add(spin);
       
   750 		      spin.show();
       
   751 		      switch (dialog.run())
       
   752 			{
       
   753 			case Gtk::RESPONSE_NONE:
       
   754 			case Gtk::RESPONSE_CANCEL:
       
   755 			  break;
       
   756 			case Gtk::RESPONSE_ACCEPT:
       
   757 			  double new_value = spin.get_value();
       
   758 			  (*(mytab.mapstorage).edgemap_storage[edgemap_to_edit])[active_edge] =
       
   759 			    new_value;
       
   760 			  std::ostringstream ostr;
       
   761 			  ostr << new_value;
       
   762 			  edgetextmap[active_edge]->property_text().set_value(
       
   763 									      ostr.str());
       
   764 			  //mapwin.updateEdge(active_edge);
       
   765 			  //                   mapwin.updateEdge(Edge(INVALID));
       
   766 			  propertyUpdate(Edge(INVALID));
       
   767 			}
       
   768 		    }
       
   769 		}
       
   770 	    break;
       
   771 	  }
       
   772 	default:
       
   773 	  break;
       
   774 	}
   708     }
   775     }
   709   }
       
   710   return false;  
       
   711 }
       
   712 
       
   713 bool GraphDisplayerCanvas::nodeMapEditEventHandler(GdkEvent* e)
       
   714 {
       
   715   if(actual_tool==NODE_MAP_EDIT)
       
   716   {
       
   717     switch(e->type)
       
   718     {
       
   719       case GDK_BUTTON_PRESS:
       
   720         {
       
   721           //for determine, whether it was a node
       
   722           Node clicked_node=INVALID;
       
   723 
       
   724           window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
       
   725           active_item=(get_item_at(clicked_x, clicked_y));
       
   726 
       
   727           //find the activated item between texts
       
   728           for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
       
   729           {
       
   730             //at the same time only one can be active
       
   731             if(nodetextmap[i]==active_item)
       
   732             {
       
   733               clicked_node=i;
       
   734             }
       
   735           }
       
   736 
       
   737           //if there was not, search for it between nodes
       
   738           if(clicked_node==INVALID)
       
   739           {
       
   740             for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
       
   741             {
       
   742               //at the same time only one can be active
       
   743               if(nodesmap[i]==active_item)
       
   744               {
       
   745                 clicked_node=i;
       
   746               }
       
   747             }
       
   748           }
       
   749 
       
   750           //if it was really a node...
       
   751           if(clicked_node!=INVALID)
       
   752           {
       
   753             // the id map is not editable
       
   754             if (nodemap_to_edit == "label") return 0;
       
   755 
       
   756             //and there is activated map
       
   757             if(nodetextmap[clicked_node]->property_text().get_value()!="")
       
   758             {
       
   759               //activate the general variable for it
       
   760               active_node=clicked_node;
       
   761 
       
   762               //create a dialog
       
   763               Gtk::Dialog dialog("Edit value", true);
       
   764               dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
       
   765               dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_ACCEPT);
       
   766               Gtk::VBox* vbox = dialog.get_vbox();
       
   767               Gtk::SpinButton spin(0.0, 4);
       
   768               spin.set_increments(1.0, 10.0);
       
   769               spin.set_range(-1000000.0, 1000000.0);
       
   770               spin.set_numeric(true);
       
   771               vbox->add(spin);
       
   772               spin.show();
       
   773               switch (dialog.run())
       
   774               {
       
   775                 case Gtk::RESPONSE_NONE:
       
   776                 case Gtk::RESPONSE_CANCEL:
       
   777                   break;
       
   778                 case Gtk::RESPONSE_ACCEPT:
       
   779                   double new_value = spin.get_value();
       
   780                   (*(mytab.mapstorage).nodemap_storage[nodemap_to_edit])[active_node] =
       
   781                     new_value;
       
   782                   std::ostringstream ostr;
       
   783                   ostr << new_value;
       
   784                   nodetextmap[active_node]->property_text().set_value(
       
   785                       ostr.str());
       
   786                   //mapwin.updateNode(active_node);
       
   787 //                   mapwin.updateNode(Node(INVALID));
       
   788                   propertyUpdate(Node(INVALID));
       
   789               }
       
   790             }
       
   791           }
       
   792           break;
       
   793         }
       
   794       default:
       
   795         break;
       
   796     }
       
   797   }
       
   798   return false;  
   776   return false;  
   799 }
   777 }
   800 
   778 
   801 void GraphDisplayerCanvas::deleteItem(Node node_to_delete)
   779 void GraphDisplayerCanvas::deleteItem(Node node_to_delete)
   802 {
   780 {