[Jderobot-admin] jderobot-r1066 - trunk/src/stable/components/visualHFSM
bmenendez en jderobot.org
bmenendez en jderobot.org
Vie Oct 18 21:29:33 CEST 2013
Author: bmenendez
Date: 2013-10-18 21:29:33 +0200 (Fri, 18 Oct 2013)
New Revision: 1066
Removed:
trunk/src/stable/components/visualHFSM/interfaz.cpp
trunk/src/stable/components/visualHFSM/reemplazar.cpp
Modified:
trunk/src/stable/components/visualHFSM/CMakeLists.txt
Log:
CMakeLists.txt changed (I forgot it).
Modified: trunk/src/stable/components/visualHFSM/CMakeLists.txt
===================================================================
--- trunk/src/stable/components/visualHFSM/CMakeLists.txt 2013-10-18 17:52:43 UTC (rev 1065)
+++ trunk/src/stable/components/visualHFSM/CMakeLists.txt 2013-10-18 19:29:33 UTC (rev 1066)
@@ -1,26 +1,74 @@
-IF (goocanvasmm_INCLUDE_DIRS)
+cmake_minimum_required(VERSION 2.8)
+include(FindPkgConfig)
-SET( SOURCE_FILES_VISUALHFSM point.cpp node.cpp transition.cpp guinode.cpp subautomata.cpp guitransition.cpp guisubautomata.cpp generate.cpp popups/editnodedialog.cpp popups/edittransitiondialog.cpp popups/funvardialog.cpp popups/importdialog.cpp popups/loadfiledialog.cpp popups/renamedialog.cpp popups/renametransitiondialog.cpp popups/savefiledialog.cpp popups/timerdialog.cpp savefile.cpp xmlparser.cpp visualhfsm.cpp main.cpp )
+# SET( SOURCE_FILES_GENERATE reemplazar.cpp generate.cpp )
+# SET( SOURCE_FILES_VISUALHFSM int2string.cpp recta.cpp nodo.cpp transicion.cpp ventanas.cpp xml.cpp interfaz.cpp )
-#SET( CMAKE_CXX_FLAGS "-g -Wall -fpermissive" ) # Opciones para el compilador
+SET( SOURCE_FILES_VISUALHFSM point.cpp node.cpp transition.cpp guinode.cpp subautomata.cpp guitransition.cpp guisubautomata.cpp generate.cpp popups/configfiledialog.cpp popups/editnodedialog.cpp popups/edittransitiondialog.cpp popups/funvardialog.cpp popups/importdialog.cpp popups/loadfiledialog.cpp popups/renamedialog.cpp popups/renametransitiondialog.cpp popups/savefiledialog.cpp popups/timerdialog.cpp savefile.cpp xmlparser.cpp visualhfsm.cpp main.cpp )
+SET( INTERFACES_CPP_DIR /usr/local/lib )
+SET( LIBS_DIR /usr/include )
+
+SET( CMAKE_CXX_FLAGS "-g -Wall -fpermissive" ) # Opciones para el compilador
+
include_directories (
+ /usr/include/gtksourceview-3.0
${INTERFACES_CPP_DIR}
${LIBS_DIR}
- ${CMAKE_CURRENT_SOURCE_DIR}
- ${gtkmm3_INCLUDE_DIRS}
- ${goocanvasmm_INCLUDE_DIRS}
- ${gtk3_INCLUDE_DIRS}
- ${libxmlpp_INCLUDE_DIRS}
)
-add_executable (visualHFSM ${SOURCE_FILES_VISUALHFSM})
+PKG_CHECK_MODULES(gtk30 REQUIRED gtk+-3.0)
+include_directories(${gtk30_INCLUDE_DIRS})
+link_directories(${gtk30_LIBRARY_DIRS})
-TARGET_LINK_LIBRARIES ( visualHFSM
- ${gtkmm3_LIBRARIES}
+PKG_CHECK_MODULES(gtkmm REQUIRED gtkmm-3.0)
+include_directories(${gtkmm_INCLUDE_DIRS})
+link_directories(${gtkmm_LIBRARY_DIRS})
+
+PKG_CHECK_MODULES(goocanvasmm REQUIRED goocanvasmm-2.0)
+include_directories(${goocanvasmm_INCLUDE_DIRS})
+link_directories(${goocanvasmm_LIBRARY_DIRS})
+
+# PKG_CHECK_MODULES(libglade REQUIRED libglade-2.0)
+# include_directories(${libglade_INCLUDE_DIRS})
+# link_directories(${libglade_LIBRARY_DIRS})
+
+# PKG_CHECK_MODULES(libgnomecanvas REQUIRED libgnomecanvas-2.0)
+# include_directories(${libgnomecanvas_INCLUDE_DIRS})
+# link_directories(${libgnomecanvas_LIBRARY_DIRS})
+
+# PKG_CHECK_MODULES(libgnomecanvasmm REQUIRED libgnomecanvasmm-2.6)
+# include_directories(${libgnomecanvasmm_INCLUDE_DIRS})
+# link_directories(${libgnomecanvasmm_LIBRARY_DIRS})
+
+# PKG_CHECK_MODULES(libxml REQUIRED libxml-2.0)
+# include_directories(${libxml_INCLUDE_DIRS})
+# link_directories(${libxml_LIBRARY_DIRS})
+
+# find_package(LibXML++ REQUIRED)
+# include_directories(${LibXML++_INCLUDE_DIRS})
+# set(LIBS ${LIBS} ${LibXML++_LIBRARIES})
+
+PKG_CHECK_MODULES(LibXML++ REQUIRED libxml++-2.6)
+include_directories(${LibXML++_INCLUDE_DIRS})
+link_directories(${LibXML++_LIBRARY_DIRS})
+
+# PKG_CHECK_MODULES(gtk+-unix-print REQUIRED gtk+-unix-print-2.0)
+# include_directories(${gtk+-unix-print_INCLUDE_DIRS})
+# link_directories(${gtk+-unix-print_LIBRARY_DIRS})
+
+# add_executable (generate ${SOURCE_FILES_GENERATE})
+
+# TARGET_LINK_LIBRARIES ( generate
+# ${libxml_LIBRARIES}
+# )
+
+add_executable (../visualHFSM ${SOURCE_FILES_VISUALHFSM})
+
+TARGET_LINK_LIBRARIES ( ../visualHFSM
+ ${gtkmm_LIBRARIES}
${goocanvasmm_LIBRARIES}
- ${gtk3_LIBRARIES}
- ${libxmlpp_LIBRARIES}
+ ${gtk30_LIBRARIES}
+ ${LibXML++_LIBRARIES}
+ /usr/lib/libgtksourceview-3.0.so
)
-
-ENDIF()
Deleted: trunk/src/stable/components/visualHFSM/interfaz.cpp
===================================================================
--- trunk/src/stable/components/visualHFSM/interfaz.cpp 2013-10-18 17:52:43 UTC (rev 1065)
+++ trunk/src/stable/components/visualHFSM/interfaz.cpp 2013-10-18 19:29:33 UTC (rev 1066)
@@ -1,3953 +0,0 @@
-#include "interfaz.h"
-
-//#include <gtkmm.h>
-//#include <gtkmm/main.h>
-
-#define FICH_GLADE "insercion.glade"
-
-GladeXML *prog = NULL;
-
-
-
-#define CANVAS_SIZE 1500
-
-using namespace std;
-
-//------------AÑADIDO ESTRUCTURA SUBAUTOMATA
-
-
-
-tSubAut reg_sub;
-list <tSubAut> ListaSubAutomatas;
-int idSubGlobal = 1; //Id máximo de subautomata en el esquema abierto, se usa para ir asignando id's correlativos en la creacion de nuevos niveles
-
-int subautomata_mostrado = 1; //Id del subautomata que se esta mostrando en el canvas
-
-GtkWidget* menu_estado;
-GtkWidget* menu_transicion;
-GtkWidget* menu_pegar;
-
-GtkWidget* nombrar_estado;
-GtkWidget* editar_estado;
-GtkWidget* marcar_inicial_estado;
-GtkWidget* copiar_estado;
-GtkWidget* eliminar_estado;
-GtkWidget* nombrar_transicion;
-GtkWidget* editar_transicion;
-GtkWidget* eliminar_transicion;
-GtkWidget* pegar_estado;
-
-GnomeCanvasItem *item_menu_estado;
-GnomeCanvasItem *item_group_menu_estado;
-GnomeCanvasItem *item_menu_transicion;
-GnomeCanvasItem *item_menu_pegar;
-
-GtkWidget *tree_view;
-
-enum
-{
- COLUMN = 0,
- NUM_COLS
-} ;
-
-GtkTreePath * arbolPath;
-
-bool estado_clipboard = FALSE;
-string estado_clipboard_codigo;
-int estado_clipboard_idHijo;
-
-bool estado_nombrado = FALSE;
-
-//------------FIN AÑADIDO ESTRUCTURA SUBAUTOMATA
-
-
-typedef struct reg {
- GnomeCanvasGroup *root;
- char *figura;
-} reg;
-
-typedef struct aux {
-
- GnomeCanvasItem * origen;
- GnomeCanvasItem * destino;
- string codigo;
- int tiempo;
-} aux;
-
-
-typedef enum TYPE_WIDGET {
- TEXT_VIEW,
- ENTRY,
- SOURCE_VIEW
-}Estado;
-
-const string ayuda[5] = {"Para mover un estado (item), seleccionar el boton mover,\ny posteriormente arrastrar el estado. Para copiar, pulse el boton copiar y selecciona un estado.\nSe copiara automaticamenteen una posicion cercana al estado pulasado.\nPara eliminar un estado, seleccionar el boton y posteriormente pulsar con el boton izquierdo sobre el item.","Boton Estado: pinta un estado en el canvas. Selecionar y pinchar en el lugar donde se quiera posicionar\nBoton Transicion: pinta una transicion entre dos estados. Selecionar boton y selecionar los estados que conecta.","Guarda/Carga el automata en/desde un fichero xml.\nEstado inicial: marca que estado es el inicial.","Estado inicial: marca que estado es el inicial.\nNombrar: nombra el estado.\nEditar: inserta codigo en el estado/transicion.", "Generar C: genera fichero .c\nCompilar: genera ejecutable"};
-
-string codigo = "";
-
-string variables = "";
-string funciones = "";
-
-int tiempo = -1;
-
-int id = 0;
-
-list <tNodo> ListaElementos;
-
-list <tTransicion> ListaTransiciones;
-
-list <transicion_aux> ListaTransicionesTemporales; // Lista de transiciones temporales. Usadas para pintar las transiciones despues de cargar un fichero.
-
-list <GtkWidget *> ListaBotones;
-
-//string fichero = "";
-
-string directorio = ""; // directorio donde se guarda el esquema
-
-string nombreEsquema = ""; //nombre del esquema guardado
-
-int tiempoIteracion = 100;
-
-importar imp;
-
-//tNodo *TListaFiguras;
-
-tNodo registro;
-
-static GtkWidget *window; //ventana principal
-
-GtkWidget *canvas; // canvas principal
-
-GnomeCanvasGroup *root;
-
-GnomeCanvasGroup* new_group;
-
-//Movemos estos dos botones aqui para poder acceder a su estado desde todo el programa
-GtkWidget *botonLinea;
-GtkWidget *botonEstado;
-
-string botonPulsado = "Nada"; //Boton pulsado. Para diferenciar operaciones.
-
-GnomeCanvasPoints* points; /* 2 puntos */
-
-GnomeCanvasPoints* points2; /* 2 puntos */
-
-GnomeCanvasItem *item_guardado; // item guardado para operaciones
-
-GnomeCanvasItem *item_transicion_saved; // item guardado para operaciones
-
-int origenX, origenY; // Puntos (x,y) del canvas
-
-int pinta_linea;
-
-int color; // Guarda Color de la figura editada
-
-const char * compile_file;
-
-char* probar;
-
-double zoom = 1.0;
-
-extern int cont_transiciones;
-
-
-/* Prototipo de la funciónes que capturan las señales de los item */
-gint
-item_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data);
-
-
-void
-cuadro_informacion (char *szMessage)
-{
- GtkWidget *label;
- GtkWidget *dialog;
-
- dialog = gtk_dialog_new_with_buttons ("Information",
- GTK_WINDOW (window),
- GTK_DIALOG_MODAL,
- GTK_STOCK_OK,
- GTK_RESPONSE_ACCEPT,
- NULL);
- gtk_window_set_title (GTK_WINDOW (dialog),"Information");
- gtk_container_border_width(GTK_CONTAINER (dialog),5);
-
- //Creamos el mensaje
- label = gtk_label_new(szMessage);
- gtk_misc_set_padding(GTK_MISC(label), 10, 10);
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)-> vbox), label, TRUE, TRUE, 0);
- gtk_widget_show (label);
-
- if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
- gtk_widget_destroy (dialog);
-}
-
-
-
-void
-compilar (GtkWindow *window, gpointer data){
-
- pid_t pid;
-
- if (nombreEsquema ==""){
-
- cuadro_informacion ((char*)"You must generate the code before you could compile it.");
-
- }else {
- if ((pid = fork()) == -1) {
- printf("Error al crear proceso hijo\n");
- exit(1);
- }
- else {
- if (pid == 0){
- printf("Compiling..\n");
- execl("/usr/bin/cmake", "cmake", (const char*)strcat ((char*)directorio.c_str(), "src/build"));
- execl("/usr/bin/make", "make", (const char*)strcat ((char*)directorio.c_str(), "src/build"));
-// execl("/usr/bin/make", "make", "-C", (const char*)strcat ((char*)directorio.c_str(), "src/"), "-f", "Makefile-mycomponent", NULL);
- }
- }
- }
-}
-
-void
-generar_c (GtkWindow *windows, gpointer data){
-
- pid_t pid;
-
- const char *filename = "";
-
-
- if (nombreEsquema ==""){
-
- cuadro_informacion ((char*)"You must save the project before you could generate the code.");
-
- }
-
- else {
- filename = (directorio + nombreEsquema + ".c").c_str();
-
-
- if ((pid = fork()) == -1) {
- printf("Error al crear proceso hijo\n");
- exit(1);
- }
-
- if (pid == 0){
- printf("Generando Codigo.. %s\n", filename);
- execl("./generate", "generate",(directorio + nombreEsquema + ".xml").c_str(), (directorio + nombreEsquema + ".c").c_str(), NULL);
-
- }
-
- }
-}
-
-void
-marcar_estado_inicial (GnomeCanvasItem *item)
-{
- list<tNodo>::iterator pos;
- GnomeCanvasItem *estado_inicial;
- tNodo n;
-
- pos = ListaElementos.begin();
-
- if (pos->estado_inicial != NULL){
- gtk_object_destroy(GTK_OBJECT(pos->estado_inicial));
- pos->estado_inicial = NULL;
- }
-
- while (pos->item != item){
- pos++;
- }
-
-
- estado_inicial = pinta_estado_inicial (GNOME_CANVAS_GROUP(item->parent), item);
- pos->estado_inicial=estado_inicial;
-
- n = *pos;
-
- ListaElementos.erase(pos);
- ListaElementos.push_front (n);
-}
-
-void cargar_transiciones ()
-{
- GList * list_items;
- GnomeCanvasGroup *group, *group_parent ;
- GnomeCanvasItem *box, *item_nombre;
- double x1, x2, y1, y2;
- list<transicion_aux>::iterator pos;
- list<tTransicion>::iterator pos2;
- list<tNodo>::iterator posNodos;
-
- pos = ListaTransicionesTemporales.begin();
-
-
- while (pos != ListaTransicionesTemporales.end())
- {
- if (pos->origen == pos->destino){
- gtk_object_destroy (GTK_OBJECT (pos->item));
- group = GNOME_CANVAS_GROUP (pinta_autotransicion (pos->origen));
- goto NOMBRE;
- }
-
- group_parent = GNOME_CANVAS_GROUP(pos->item);
-
- list_items = group_parent->item_list;
-
- box = (GnomeCanvasItem *) g_list_nth_data (list_items, 0);
-
- get_bounds (box, &x1, &y1, &x2, &y2);
-
- group = repintar_transicion (GNOME_CANVAS_GROUP (root), pos->origen, pos->destino, (x1+x2)/2, (y1+y2)/2);
-
- gnome_canvas_item_reparent (box, group);
-
- NOMBRE:
- /* Nombre Transicion */
- if (pos->nombre.empty())
- item_nombre = NULL;
-
- else
- item_nombre = gnome_canvas_item_new (root,
- gnome_canvas_text_get_type (),
- "text", pos->nombre.c_str(),
- "x", (x2+x1)/2,
- "y", (y2+y1)/2 + 5,
- "font", "Sans 28",
- "anchor", GTK_ANCHOR_N,
- "fill_color", "black",
- NULL);
-
-
- add_transicion_lista (GNOME_CANVAS_ITEM(group),pos->origen, pos->destino, item_nombre, pos->codigo, pos->tiempo);
-
- posNodos = ListaElementos.begin();
-
- while( (posNodos != ListaElementos.end()) && (posNodos->item != pos->origen) )
- posNodos++;
-
- posNodos->listaAdyacentes.push_back(GNOME_CANVAS_ITEM(group));
-
- if (pos->origen != pos->destino){
- posNodos = ListaElementos.begin();
-
- while( (posNodos != ListaElementos.end()) && (posNodos->item != pos->destino) )
- posNodos++;
-
- posNodos->listaAdyacentes.push_back(GNOME_CANVAS_ITEM(group));
- }
-
- pos++;
- }
-
-}
-
-
-
-bool ventana_timer (GtkWindow *window, GdkEventMotion *event, gpointer data){
-
- GtkWidget *ventana;
-
- ventana = comprobar_ventana_abierta (NULL, TIMER);
-
- if (ventana != NULL)
- gtk_window_present (GTK_WINDOW(ventana));
- else{
- ventana = tiempo_iteracion();
- add_ventana (ventana, NULL, TIMER);
- }
-
- return TRUE;
-
-}
-
-
-bool ventana_importar (GtkWindow *window, GdkEventMotion *event, gpointer data){
-
- GtkWidget *ventana;
-
- ventana = comprobar_ventana_abierta (NULL, LIBRERIAS);
-
- if (ventana != NULL)
- gtk_window_present (GTK_WINDOW(ventana));
- else{
- ventana = importar_librerias();
- add_ventana (ventana, NULL, LIBRERIAS);
- }
-
- return TRUE;
-
-}
-
-
-
-bool codigo_esquema (GtkWindow *window, GdkEventMotion *event, gpointer data)
-{
- GtkWidget *ventana;
-
- ventana = comprobar_ventana_abierta (NULL, CODIGO);
-
- if (ventana != NULL)
- gtk_window_present (GTK_WINDOW(ventana));
- else{
- ventana = new_code_windows ();
- add_ventana (ventana, NULL, CODIGO);
- }
-
- return TRUE;
-
-}
-
-
-
-void new_windows (GtkWindow *window, GdkEventMotion *event, gpointer data)
-{
-
- static GtkWidget *window2;
- GtkWidget *label;
-
-
-
- /*Creamos Ventana*/
- window2 = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
- /*Situamos la ventana en el medio*/
- gtk_window_set_position(GTK_WINDOW(window2), GTK_WIN_POS_CENTER);
-
- /*Ponemos borde a la ventana*/
- gtk_container_set_border_width (GTK_CONTAINER (window2), 50);
-
- /*Ponemos el titulo*/
- gtk_window_set_title(GTK_WINDOW(window2), "Ayuda");
-
- /* An option menu to change the position of the value */
- label = gtk_label_new ((const char*)data);
-
- gtk_container_add (GTK_CONTAINER(window2), label);
-
- gtk_widget_show_all(window2);
-
-}
-
-
-
-/* Crea una Caja de Botones con los parámetros específicos */
-GtkWidget *create_bbox( gint horizontal,
- char *title,
- gint espacio,
- gint child_w,
- gint child_h,
- gint layout,
- gpointer data,
- gpointer text)
-{
- GtkWidget *frame;
- GtkWidget *bbox;
- GtkWidget *button;
-
- frame = gtk_frame_new (title);
- gtk_container_set_border_width (GTK_CONTAINER (frame), 0);
-
- if (horizontal)
- bbox = gtk_hbutton_box_new ();
- else
- bbox = gtk_vbutton_box_new ();
-
- gtk_container_set_border_width (GTK_CONTAINER (bbox), 0);
- gtk_container_add (GTK_CONTAINER (frame), bbox);
-
- /* Establece la apariencia de la Caja de Botones */
-
- gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GtkButtonBoxStyle(layout));
-
- gtk_box_set_spacing (GTK_BOX (bbox), espacio);
-
- list <GtkWidget *> ::iterator pos;
-
- pos = ListaBotones.begin();
- while (pos!=ListaBotones.end()){
- gtk_container_add (GTK_CONTAINER (bbox), *pos);
- pos++;
- }
-
- button = gtk_button_new_from_stock (GTK_STOCK_HELP);
- gtk_signal_connect(GTK_OBJECT(button), "button_release_event", GTK_SIGNAL_FUNC(new_windows), text);
-
- return frame;
-}
-
-
-void frame_callback(GtkWindow *window,
- GdkEvent *event, gpointer data)
-{
- int x, y;
- char buf[10];
- x = event->configure.x;
- y = event->configure.y;
- sprintf(buf, "%d, %d", x, y);
- printf("Mover %d, %d\n", x, y);
- gtk_window_set_title(window, buf);
-}
-
-void guardar(GtkWindow *windows, gpointer data)
-{
- xmlDocPtr doc;
-
- GtkWidget *dialog;
- GtkFileFilter *filter;
-
- cout << directorio << endl;
- cout << (int)data << endl;
-
- if ( (((int)data ==0) && (directorio == "")) || ((int)data == 1) ){
- dialog = gtk_file_chooser_dialog_new ("Save File", NULL,
- GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
-
- gtk_window_set_title(GTK_WINDOW(dialog), "Save File");
-
- gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER(dialog), TRUE);
-
- filter = gtk_file_filter_new();
- gtk_file_filter_set_name (filter, "xml");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
- gtk_file_filter_add_pattern (filter, "*.[x][m][l]");
-
- filter = gtk_file_filter_new();
- gtk_file_filter_set_name (filter, "All files");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
- gtk_file_filter_add_pattern (filter, "*");
-
- }
- if (((int)data ==0) & (directorio != "")){
-
- doc = xml_new_doc ("VisualHFSM");
-
- //**************************************************Antes de llamar a guardar ponemos en las variables del nodo del nivel en el que nos
- //**************************************************encontremos las variables globales que estuviesemos usando en ese momento.
- list<tSubAut>::iterator posNodoSub;
- posNodoSub = ListaSubAutomatas.begin();
-
- while (posNodoSub->idSub != subautomata_mostrado and posNodoSub != ListaSubAutomatas.end())
- posNodoSub++;
-
- posNodoSub->ListaElementosSub = ListaElementos;
- posNodoSub->ListaTransicionesSub = ListaTransiciones;
- posNodoSub->tiempoIteracionSub = tiempoIteracion;
- posNodoSub->variablesSub = variables;
- posNodoSub->funcionesSub = funciones;
- posNodoSub->impSub = imp;
- //**************************************************************************************************************************************
-
- xml_new_entry (doc);
-
- xmlSaveFile ((directorio + nombreEsquema + ".xml").c_str(), doc);
- }
- else if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
- char *filename;
-
- filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
-
- printf("File open: %s\n",filename);
-
- compile_file = filename;
-
- // Nombre y directorio fichero
-
- string fich = filename;
- int i;
- size_t pos;
- for (i=0; i < (signed)fich.length(); i++)
- {
- if (fich.at(i) == '/')
- pos = i;
- }
- string fichero = fich.substr (++pos);
-
- directorio = fich.substr (0,pos);
-
- string nombre;
-
- for (i=0; i < (signed)fichero.length(); i++)
- {
- if (fichero.at(i) == '.')
- pos = i;
- }
-
- nombre = fichero.substr (0,pos);
-
- nombreEsquema = nombre;
-
- /*Ponemos el titulo*/
- gtk_window_set_title(GTK_WINDOW(window), nombre.c_str());
-
- doc = xml_new_doc ("VisualHFSM");
-
- //**************************************************Antes de llamar a guardar ponemos en las variables del nodo del nivel en el que nos
- //**************************************************encontremos las variables globales que estuviesemos usando en ese momento.
- list<tSubAut>::iterator posNodoSub;
- posNodoSub = ListaSubAutomatas.begin();
-
- while (posNodoSub->idSub != subautomata_mostrado and posNodoSub != ListaSubAutomatas.end())
- posNodoSub++;
-
- posNodoSub->ListaElementosSub = ListaElementos;
- posNodoSub->ListaTransicionesSub = ListaTransiciones;
- posNodoSub->tiempoIteracionSub = tiempoIteracion;
- posNodoSub->variablesSub = variables;
- posNodoSub->funcionesSub = funciones;
- posNodoSub->impSub = imp;
- //**************************************************************************************************************************************
-
- xml_new_entry (doc);
-
- xmlSaveFile (filename, doc);
-
- g_free (filename);
-
- gtk_widget_destroy (dialog);
-
- }
- else
- gtk_widget_destroy (dialog);
-
-}
-
-void remarcar_boton (GtkFileChooser *window, gpointer data)
- {
- gtk_widget_grab_focus ((GtkWidget *)data);
- }
-
-void borrar_canvas ()
-{
-
- list<tTransicion>::iterator posTransiciones;
-
- posTransiciones = ListaTransiciones.begin();
-
- while (posTransiciones != ListaTransiciones.end())
- {
- gtk_object_destroy (GTK_OBJECT ((posTransiciones->item_nombre)));
- gtk_object_destroy (GTK_OBJECT ((posTransiciones->item)));
- posTransiciones++;
- }
-
- ListaTransiciones.clear();
-
- list<tNodo>::iterator posNodos;
-
- posNodos = ListaElementos.begin();
-
- while (posNodos != ListaElementos.end())
- {
- gtk_object_destroy (GTK_OBJECT ((posNodos->item->parent)));
- posNodos++;
- }
-
- ListaElementos.clear();
-
- gnome_canvas_update_now (GNOME_CANVAS(canvas));
-
-}
-
-
-void cargar(GtkWindow *windows, gpointer data)
-{
- xmlDocPtr doc;
-
- xmlNodePtr root;
-
- xmlNodePtr nodeSub;
-
- xmlNodePtr node;
-
- list<tSubAut>::iterator posSub;//Añadido para luego poder cargar en las variables globales la primera posicion de la lista de subAut.
-
- GtkFileFilter *filter;
-
- GtkWidget *dialog;
-
- dialog = gtk_file_chooser_dialog_new ("Open File",
- NULL,
- GTK_FILE_CHOOSER_ACTION_OPEN,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
- NULL);
-
- filter = gtk_file_filter_new();
- gtk_file_filter_set_name (filter, "xml");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
- gtk_file_filter_add_pattern (filter, "*.[x][m][l]");
-
- filter = gtk_file_filter_new();
- gtk_file_filter_set_name (filter, "All files");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
- gtk_file_filter_add_pattern (filter, "*");
-
- gtk_window_set_title(GTK_WINDOW(dialog), "Open File");
-
- if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
- {
- /* Dirección del fichero */
- char *filename;
-
- filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
-
- printf("Fichero abierto: %s\n",filename);
-
- /* Abrir XML */
-
- doc = xmlParseFile (filename);
-
- if (!doc) {
- g_print("Error al cargar documento XML\n");
- }
- else{
- item_guardado = NULL;
- root = xmlDocGetRootElement (doc);
- nodeSub = root->xmlChildrenNode;
- //node = nodeSub->xmlChildrenNode;
-
-
- /* Borrar Canvas */
-
- if (!ListaSubAutomatas.empty()){
-
- posSub = ListaSubAutomatas.begin();
-
- while (posSub != ListaSubAutomatas.end()){
-
- ListaElementos = posSub->ListaElementosSub;
- ListaTransiciones = posSub->ListaTransicionesSub;
-
- borrar_canvas();
- printf("Borrado nivel \n");
-
- posSub++;
-
- }
-
- }
- else
- borrar_canvas();
-
- ListaSubAutomatas.clear();
-
- /* Recuperamos los datos */
-
- while (nodeSub != NULL){
- g_print("Encontrado Sub: %s\n", nodeSub->name);//*****************************************************************
-
- node = nodeSub->xmlChildrenNode;
-
- if (strcmp((const char *)nodeSub->name, "nombreEsquema")==0){
-
- string fich = (const char*)xmlNodeGetContent (nodeSub);
- if (fich != ""){
- size_t pos;
-
- pos = fich.rfind('/');
- printf("fich: %s\n",fich.c_str());//**********************************************************************
- nombreEsquema = fich.substr (++pos);
-
- printf("nombreEsquema: %s\n",nombreEsquema.c_str());//****************************************************
-
-
- directorio = filename;
- pos = directorio.rfind('/');
- directorio = directorio.substr (0,++pos);
-
- /*Ponemos el titulo*/
- gtk_window_set_title(GTK_WINDOW(window), nombreEsquema.c_str());
- }else{
- /*Ponemos el titulo*/
- gtk_window_set_title(GTK_WINDOW(window),"Default");
- }
-
- }else if (strcmp((const char *)nodeSub->name, "SubAutomata")==0){
-
- g_print("Entra por subautomata\n");//**************************************************************
-
- while (node != NULL) {
-
- g_print("Encontrado nodo %s\n", node->name);
-
- if (strcmp((const char *)node->name, "idSub")==0){
- reg_sub.idSub = atoi((const char*)xmlNodeGetContent (node));
- if (reg_sub.idSub > idSubGlobal){
- idSubGlobal = reg_sub.idSub;
- }
- }
- else if (strcmp((const char *)node->name, "idPadre")==0)
- reg_sub.idPadre = atoi((const char*)xmlNodeGetContent (node));
- else if (strcmp((const char *)node->name, "tiempoIteracion")==0)
- reg_sub.tiempoIteracionSub = atoi((const char*)xmlNodeGetContent (node));
- else if (strcmp((const char *)node->name, "variables_aux")==0)
- reg_sub.variablesSub = (const char*)xmlNodeGetContent (node);
- else if (strcmp((const char *)node->name, "funciones_aux")==0)
- reg_sub.funcionesSub = (const char*)xmlNodeGetContent (node);
- else if (strcmp((const char *)node->name, "Librerias")==0){
- xmlNodePtr child = node->xmlChildrenNode;
- string lib;
- while (child != NULL){
- lib = (const char*)xmlNodeGetContent (child);
- if (lib == "laser")
- reg_sub.impSub.laser = true;
- if (lib == "motor")
- reg_sub.impSub.motor = true;
- if (lib == "radar")
- reg_sub.impSub.radar = true;
- if (lib == "encoders")
- reg_sub.impSub.encoders = true;
- if (lib == "lat_lon")
- reg_sub.impSub.lat_lon = true;
- if (lib == "camara")
- reg_sub.impSub.camara = true;
- if (lib == "ptencoders")
- reg_sub.impSub.ptencoders = true;
-
- child = child->next;
- }
- }else//Aqui se extraen los datos de cada estado concreto
- xml_get_entry (node);
-
- node = node->next;
-
- }//While node
-
-
- /* Pintado de Transiciones */
-
- list<transicion_aux>::iterator pos, pos2;
-
- pos = ListaTransicionesTemporales.begin();
-
- while (pos != ListaTransicionesTemporales.end())
- {
- if (pos->destino == NULL)
- {
- pos2 = ListaTransicionesTemporales.begin();
- while (pos2 != ListaTransicionesTemporales.end()){
- if (pos->destino_id == pos2->origen_xml)
- pos->destino = pos2->origen;
- pos2++;
- }
- }
- pos++;
- }
-
- gnome_canvas_update_now (GNOME_CANVAS(canvas));
-
- cout << "item_guardado " << item_guardado << endl;
-
- item_guardado = NULL;
-
- cargar_transiciones ();
-
- ListaTransicionesTemporales.clear();
-
- reg_sub.ListaElementosSub = ListaElementos;
- reg_sub.ListaTransicionesSub = ListaTransiciones;
-
- //Borramos el canvas a cada iteracion para que no se pinte todo a la vez, la información para poder
- //restaurar cada nivel en el canvas ya la tenemos guardada en cada nodo de la lista de subAutómatas
- //borrar_canvas();
-
- ListaElementos.clear();
- ListaTransiciones.clear();
-
- ListaSubAutomatas.push_back(reg_sub);
-
- //Borramos el subautomata que acabamos de pintar para al final de la carga pintar solo el primer nivel.
- ocultar_subautomata(reg_sub.idSub);
-
-
- }//else de SubAutomata
-
- nodeSub = nodeSub->next;
-
- }//While nodeSub
-
- }
-
- g_free (filename);
-
- }
-
- gtk_widget_destroy (dialog);
-
- //Pintamos el canvas con los elementos del subautomata 1, la raiz.
- printf("Antes de pintar sub\n");
- mostrar_subautomata(1);
- printf("Despues de pintar sub\n");
-
- //Cargamos en las variables "globales" las correspondientes al primer nodo de la lista de subautómatas.
- posSub = ListaSubAutomatas.begin();
-
- imp = posSub->impSub;
- funciones = posSub->funcionesSub;
- variables = posSub->variablesSub;
- tiempoIteracion = posSub->tiempoIteracionSub;
-
- ListaElementos = posSub->ListaElementosSub;
- ListaTransiciones = posSub->ListaTransicionesSub;
-
- //Dejamos preparada la variable idSubGlobal con un numero correlativo mayor al máximo cargado.
- idSubGlobal++;
-
- //Recargamos el tree view con los nuevos datos cargados
- actualizar_tree_view();
-
-}
-
-
-void mostrar_subautomata(int pidSub)
-{
-
- list<tSubAut>::iterator posSub;
-
- list <tNodo>::iterator Elem;
- list <tTransicion>::iterator Trans;
-
-
- posSub = ListaSubAutomatas.begin();
-
- while(posSub->idSub != pidSub){
- posSub++;
- }
-
- Elem = posSub->ListaElementosSub.begin();
- Trans = posSub->ListaTransicionesSub.begin();
-
- /*group = GNOME_CANVAS_GROUP (gnome_canvas_item_new (root,
- gnome_canvas_group_get_type (),
- "x", 0,
- "y", 0,
- NULL));*/
- if (!posSub->ListaElementosSub.empty()){
- while(Elem != posSub->ListaElementosSub.end()){
-
- if (Elem->item != NULL)
- gnome_canvas_item_show(Elem->item);
-
- if (Elem->estado_inicial != NULL)
- gnome_canvas_item_show(Elem->estado_inicial);
-
- if (Elem->item_nombre != NULL)
- gnome_canvas_item_show(Elem->item_nombre);
-
- printf("Pintado nodo en el canvas\n");
-
- Elem++;
-
- }
-
- while (Trans != posSub->ListaTransicionesSub.end()){
-
- if(Trans->item != NULL)
- gnome_canvas_item_show(Trans->item);
-
- if(Trans->item_nombre != NULL)
- gnome_canvas_item_show(Trans->item_nombre);
-
- Trans++;
-
- }
- }
-
-
- printf("Antes de update en el mostrar\n");
- //gnome_canvas_update_now (GNOME_CANVAS(canvas));
- printf("Despues de update en el mostrar\n");
- subautomata_mostrado = pidSub;
-
-}
-
-
-void ocultar_subautomata(int pidSub)
-{
-
- list<tSubAut>::iterator posSub;
-
- list <tNodo>::iterator Elem;
- list <tTransicion>::iterator Trans;
-
-
- posSub = ListaSubAutomatas.begin();
-
- while(posSub->idSub != pidSub){
- posSub++;
- }
-
- Elem = posSub->ListaElementosSub.begin();
- Trans = posSub->ListaTransicionesSub.begin();
-
- /*group = GNOME_CANVAS_GROUP (gnome_canvas_item_new (root,
- gnome_canvas_group_get_type (),
- "x", 0,
- "y", 0,
- NULL));*/
-
- while(Elem != posSub->ListaElementosSub.end()){
-
- if (Elem->item != NULL)
- gnome_canvas_item_hide(Elem->item);
-
- if (Elem->estado_inicial != NULL)
- gnome_canvas_item_hide(Elem->estado_inicial);
-
- if (Elem->item_nombre != NULL)
- gnome_canvas_item_hide(Elem->item_nombre);
-
- Elem++;
-
- }
-
- while (Trans != posSub->ListaTransicionesSub.end()){
-
- if(Trans->item != NULL)
- gnome_canvas_item_hide(Trans->item);
-
- if(Trans->item_nombre != NULL)
- gnome_canvas_item_hide(Trans->item_nombre);
-
- Trans++;
-
- }
-
- gnome_canvas_update_now (GNOME_CANVAS(canvas));
-
-
-}
-
-
-void coordenadas(GtkWindow *window, GdkEvent *event, gpointer data)
-{
-
- origenX = event->button.x;
- origenY = event->button.y;
- printf("Click Press %d, %d\n", origenX, origenY);
-
- if (event->button.button == 3){
-
- gtk_menu_popup(GTK_MENU(menu_pegar),NULL,NULL,NULL,NULL,event->button.button,event->button.time);
-
- }
-
-}
-
-
-void pinta_nodo(GtkWindow *window, GdkEventMotion *event, gpointer data)
-{
- int x, y;
-
- GnomeCanvasItem *item;
- GnomeCanvasGroup *group;
-
- list<tSubAut>::iterator posSub; //Añadido para poder iterar en la lista de subautomatas y actulizar el treeview con cada nuevo estado
-
- //GtkWidget *button;
-
- x = event->x;
- y = event->y;
-
- points = gnome_canvas_points_new(2); /* 2 puntos */
- points->coords[0] = origenX;
- points->coords[1] = origenY;
- points->coords[2] = x;
- points->coords[3] = y;
-
- printf("Click %d, %d\n", x, y);
- //printf("Pintamos Nodo \n");
-
- if ((strcmp(botonPulsado.c_str(), "Cuadrado")==0) and (event->state & GDK_BUTTON1_MASK))
- {
-
- group = GNOME_CANVAS_GROUP (gnome_canvas_item_new (root,
- gnome_canvas_group_get_type (),
- "x", 0,
- "y", 0,
- NULL));
-
- item = gnome_canvas_item_new(group,
- gnome_canvas_ellipse_get_type(),
- "x1", (double) origenX-20,
- "y1", (double) origenY-20,
- "x2", (double) (origenX + 20),
- "y2", (double) (origenY + 20),
- "fill_color_rgba", 0x00ffffff,
- "outline_color", "black",
- "width_units", 1.0,
- NULL);
-
-
- registro.item = item;
- registro.item_nombre = NULL;
- registro.estado_inicial = NULL;
- registro.nombre = "";
- registro.codigo = "";
- registro.idHijo = 0;//***********Por defecto un estado no tiene hijos
- id ++;
-
- ListaElementos.push_back(registro);
-
- /*Añadimos control (señal) al item creado*/
- g_signal_connect (group, "event",
- (GtkSignalFunc) item_event,
- NULL);
-
- //Actualizamos datos necesarios para mostrar cambios en el tree view
- posSub = ListaSubAutomatas.begin();
-
- while(posSub->idSub != subautomata_mostrado)
- {
- posSub++;
- }
-
- //guardamos el estado de la lista de elementos en el nodo del subautomata para poder recargar bien el tree view
- posSub->ListaElementosSub = ListaElementos;
-
- actualizar_tree_view();
-
- gtk_tree_view_expand_to_path(GTK_TREE_VIEW(tree_view), arbolPath);
-
- }
-
-}
-
-static gint nodo(GtkWindow *window, GdkEventMotion *event, gpointer data)
-{
- int x, y;
-
- x = event->x;
- y = event->y;
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(botonLinea),FALSE);
-
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(botonEstado))){
-
- botonPulsado="Nada";
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(botonEstado),FALSE);
-
- }
- else{
- botonPulsado="Cuadrado";
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(botonEstado),TRUE);
- }
-
-
- /*if ((int)data == 1)
- {
- botonPulsado="EstadoInicial";
- }
- else{
- printf("Click %d, %d\n", x, y);
-
- botonPulsado="Cuadrado";
-
- }*/
-
- return TRUE;
-}
-
-
-static gint motion_notify_event(GtkWindow *window, GdkEventMotion *event, gpointer data)
-{
- int x, y;
-
- x = event->x;
- y = event->y;
-
- printf("Click %d, %d\n", x, y);
-
- return TRUE;
-}
-
-void transicion(GtkWindow *window, GdkEventMotion *event, gpointer data)
-{
- item_transicion_saved = NULL;
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(botonEstado),FALSE);
-
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(botonLinea))){
-
- botonPulsado="Nada";
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(botonLinea),FALSE);
-
- }
- else{
- botonPulsado="Linea";
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(botonLinea),TRUE);
- }
-
-}
-
-
-void mover(GtkWindow *window, GdkEventMotion *event, gpointer data)
-{
- botonPulsado = "Mover";
-}
-
-void eliminar(GtkWindow *window, GdkEventMotion *event, gpointer data)
-{
- botonPulsado = "Eliminar";
-}
-
-void copiar(GtkWindow *window, GdkEventMotion *event, gpointer data)
-{
- botonPulsado = "Copiar";
-}
-
-void editar(GtkWindow *window, GdkEventMotion *event, gpointer data)
-{
- botonPulsado = "Editar";
-}
-
-void nombrar(GtkWindow *window, GdkEventMotion *event, gpointer data)
-{
- botonPulsado = "Nombrar";
-}
-
-void set_zoom (GtkWidget *window, GdkEvent *event, gpointer data){
-
- double incremento = 0.1;
-
- cout << gdk_keyval_name (event->key.keyval) << endl;
- cout << event->key.keyval << endl;
-
- if (event->key.keyval == GDK_Up)
- zoom += incremento;
- if (event->key.keyval == GDK_Down)
- zoom -= incremento;
- if (event->key.keyval == GDK_KP_0)
- zoom = 1.0;
-
- gnome_canvas_set_pixels_per_unit ((GnomeCanvas*)canvas, zoom);
-
-}
-
-
-//------------Funcion arriba añadida para navegacion entre niveles jerarquicos
-void arriba(GtkWindow *window, GdkEventMotion *event, gpointer data)
-{
-
- list<tSubAut>::iterator posSub;
-
- list <tNodo>::iterator posNodo;
- //list <tTransicion>::iterator Trans;
-
- int idPadre;
-
- printf("Entra ARRIBA\n");
-
- botonPulsado = "Nada";//Para evitar interferencias con los eventos detectados en el canvas
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(botonEstado),FALSE);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(botonLinea),FALSE);
-
- posSub = ListaSubAutomatas.begin();
-
- while(posSub->idSub != subautomata_mostrado){
- posSub++;
- }
-
- idPadre = posSub->idPadre;
-
- if (idPadre != 0){
- printf("idPadre distinto de 0\n");
- if (!ListaElementos.empty()){
-
- printf("La lista NO esta vacia\n");
-
- //Guardamos el nivel actual
- posSub->ListaElementosSub = ListaElementos;
- posSub->ListaTransicionesSub = ListaTransiciones;
- posSub->tiempoIteracionSub = tiempoIteracion;
- posSub->variablesSub = variables;
- posSub->funcionesSub = funciones;
- posSub->impSub = imp;
-
- ocultar_subautomata(subautomata_mostrado);
-
- posSub = ListaSubAutomatas.begin();
-
- while (posSub->idSub != idPadre and posSub != ListaSubAutomatas.end())
- posSub++;
-
- mostrar_subautomata(idPadre);
-
- ListaElementos.clear();
- ListaTransiciones.clear();
-
- //Cargamos el nivel que vamos a mostrar
- ListaElementos = posSub->ListaElementosSub;
- ListaTransiciones = posSub->ListaTransicionesSub;
- tiempoIteracion = posSub->tiempoIteracionSub;
- variables = posSub->variablesSub;
- funciones = posSub->funcionesSub;
- imp = posSub->impSub;
-
- }
- else
- {
- printf("La lista esta vacia\n");
-
- posSub = ListaSubAutomatas.begin();
-
- while (posSub->idSub != subautomata_mostrado and posSub != ListaSubAutomatas.end())
- posSub++;
-
- //Borramos el nodo que se había creado
- ListaSubAutomatas.erase(posSub);
-
- posSub = ListaSubAutomatas.begin();
-
- while (posSub->idSub != idPadre and posSub != ListaSubAutomatas.end())
- posSub++;
-
- posNodo = posSub->ListaElementosSub.begin();
-
- while (posNodo->idHijo != subautomata_mostrado and posNodo != posSub->ListaElementosSub.end())
- posNodo++;
-
- //Ponemos a 0 el hijo del estado que tenia como hijo al subautomata que se ha borrado.
- posNodo->idHijo = 0;
-
- change_item_color(posNodo->item, 3);
-
- mostrar_subautomata(idPadre);
-
- ListaElementos.clear();
- ListaTransiciones.clear();
-
- //Cargamos el nivel que vamos a mostrar
- ListaElementos = posSub->ListaElementosSub;
- ListaTransiciones = posSub->ListaTransicionesSub;
- tiempoIteracion = posSub->tiempoIteracionSub;
- variables = posSub->variablesSub;
- funciones = posSub->funcionesSub;
- imp = posSub->impSub;
-
- }
-
- actualizar_tree_view();
-
- gtk_tree_path_up (arbolPath);
-
- gtk_tree_view_expand_to_path(GTK_TREE_VIEW(tree_view), arbolPath);
-
- }
- else{
-
- printf("idPadre igual a 0\n");
-
- actualizar_tree_view();
-
- gtk_tree_view_expand_to_path(GTK_TREE_VIEW(tree_view), arbolPath);
-
- }
-
- printf("Se ejecuta ARRIBA\n");
-
-
-}
-//------------FIN Funcion arriba añadida para navegacion entre niveles jerarquicos
-
-void actualizar_tree_view()
-{
-
- list<tSubAut>::iterator posNodoSub;
-
- //Guardamos los datos del nivel en el que estamos
- posNodoSub = ListaSubAutomatas.begin();
-
- while (posNodoSub->idSub != subautomata_mostrado and posNodoSub != ListaSubAutomatas.end())
- posNodoSub++;
-
- //Guardamos el nivel actual
- posNodoSub->ListaElementosSub = ListaElementos;
- posNodoSub->ListaTransicionesSub = ListaTransiciones;
- posNodoSub->tiempoIteracionSub = tiempoIteracion;
- posNodoSub->variablesSub = variables;
- posNodoSub->funcionesSub = funciones;
- posNodoSub->impSub = imp;
-
- //actualizamos los datos del modelo del tree_view
- gtk_tree_view_set_model(GTK_TREE_VIEW(tree_view), create_and_fill_model());
-
-}
-
-
-void rellenar_arbol_recursivo(GtkTreeStore *treestore, GtkTreeIter toplevel, int idSubautomata)
-{
- GtkTreeIter child;
- list<tSubAut>::iterator posNodoSub;
- list<tNodo>::iterator posEst;
-
- string cadena = "";
-
- int contSinNombre = 1;
-
- posNodoSub = ListaSubAutomatas.begin();
-
- while (posNodoSub->idSub != idSubautomata and posNodoSub != ListaSubAutomatas.end())
- {
- posNodoSub++;
- }
-
- if (!posNodoSub->ListaElementosSub.empty())
- {
-
- posEst = posNodoSub->ListaElementosSub.begin();
-
- while (posEst != posNodoSub->ListaElementosSub.end())
- {
-
- if (posEst->nombre != "")
- {
- cadena = posEst->nombre;
- }
- else
- {
- cadena = "NoName_"+int2string(contSinNombre);
- contSinNombre++;
- }
-
- gtk_tree_store_append(treestore, &child, &toplevel);
- gtk_tree_store_set(treestore, &child, COLUMN, cadena.c_str(),-1);
-
- if (posEst->idHijo != 0)
- {
- //Con esta función recorreremos la lista de subautomatas recursivamente para ir añadiendo los datos correspondientes
- //en el treeview
- rellenar_arbol_recursivo(treestore, child, posEst->idHijo);
-
- }
-
- posEst++;
-
- }
-
- }
-
-}
-
-static GtkTreeModel *
-create_and_fill_model (void)
-{
- GtkTreeStore *treestore;
- GtkTreeIter toplevel;
-
- list<tSubAut>::iterator posNodoSub;
- list<tNodo>::iterator posEst;
-
- string cadena = "";
-
- int contSinNombre = 1;
-
- treestore = gtk_tree_store_new(NUM_COLS, G_TYPE_STRING);
-
- if (!ListaSubAutomatas.empty())
- {
- posNodoSub = ListaSubAutomatas.begin();
-
- if (!posNodoSub->ListaElementosSub.empty())
- {
- posEst = posNodoSub->ListaElementosSub.begin();
-
- while (posEst != posNodoSub->ListaElementosSub.end())
- {
-
- if (posEst->nombre != "")
- {
- cadena = posEst->nombre;
- }
- else
- {
- cadena = "NoName_"+int2string(contSinNombre);
- contSinNombre++;
- }
-
- gtk_tree_store_append(treestore, &toplevel, NULL);
- gtk_tree_store_set(treestore, &toplevel,
- COLUMN, cadena.c_str(),
- -1);
-
- if (posEst->idHijo != 0)
- {
- //Con esta función recorreremos la lista de subautomatas recursivamente para ir añadiendo los datos correspondientes
- //en el treeview
- rellenar_arbol_recursivo(treestore, toplevel, posEst->idHijo);
-
- }
-
- posEst++;
-
- }
-
- }
-
- }
-
- return GTK_TREE_MODEL(treestore);
-}
-
-void treeview_onRowActivated(GtkTreeView *treeview,
- GtkTreePath *path,
- GtkTreeViewColumn *col,
- gpointer userdata){
-
- list<tSubAut>::iterator posSub;
-
- list<tNodo>::iterator posNodo;
-
- gint* indices;
-
- int prof_path;
-
- int niveles_restantes=0;
- int i=0;
-
- int sub_a_buscar = 1;
- int sub_a_mostrar = 1;
-
- int indice_leido = 0;
- int contNodo = 0;
-
- bool expandir = FALSE;
-
-
- botonPulsado = "Nada";//Para evitar interferencias con los eventos detectados en el canvas
-
- prof_path = gtk_tree_path_get_depth(path);
-
-
-
- if (prof_path == 1) {//hemos seleccionado el primer nivel con lo cual mostramos la raiz
-
- sub_a_mostrar = 1;
-
- printf("Selecionado el raiz*********\n");
-
- arbolPath = gtk_tree_path_new_first();
- expandir = FALSE;
-
- }
- else{
-
- //Quitamos el ultimo elemento del path porque queremos mostrar el subautomata con el ID que nos indique su padre
- //con lo cual solo necesitaremos recorrer la lista de subautomatas hasta su padre.
- gtk_tree_path_up (path);
-
- arbolPath = gtk_tree_path_copy(path);
-
- printf("path del doble click: %s\n", gtk_tree_path_to_string(path));
-
- //Obtenemos sus indices en un array
- indices = gtk_tree_path_get_indices(path);
-
- //Obtenemos su profundidad para saber hasta cuando iterar al recorrer la lista de subautomatas
- prof_path = gtk_tree_path_get_depth(path);
-
- niveles_restantes = prof_path;
-
- while (niveles_restantes != 0) {
-
- printf("Niveles restantes: %d\n", niveles_restantes);
- indice_leido = indices[i];
-
- printf("Indice leido: %d\n", indice_leido);
-
- posSub = ListaSubAutomatas.begin();
-
- printf("Se busca por: %d\n", sub_a_buscar);
-
- while(posSub->idSub != sub_a_buscar){
- posSub++;
- }
-
- posNodo = posSub->ListaElementosSub.begin();
-
- while(contNodo != indice_leido){
- posNodo++;
- contNodo++;
-
- printf("Contador: %d\n", contNodo);
- }
-
- sub_a_buscar = posNodo->idHijo;
-
- printf("Proxima busqueda: %d\n", sub_a_buscar);
-
- contNodo = 0;
- i++;
- niveles_restantes--;
-
- }
-
- sub_a_mostrar = sub_a_buscar;
-
- sub_a_buscar = 1;
-
- printf("Sub a mostrar: %d\n", sub_a_mostrar);
-
- expandir = TRUE;
-
- }
-
-
- //Ahora viene una gestion equivalente a la de el boton "UP"
- int idPadre;
-
- posSub = ListaSubAutomatas.begin();
-
- while(posSub->idSub != subautomata_mostrado){
- posSub++;
- }
-
- idPadre = posSub->idPadre;
-
- if (!ListaElementos.empty()){
-
- //Guardamos el nivel actual
- posSub->ListaElementosSub = ListaElementos;
- posSub->ListaTransicionesSub = ListaTransiciones;
- posSub->tiempoIteracionSub = tiempoIteracion;
- posSub->variablesSub = variables;
- posSub->funcionesSub = funciones;
- posSub->impSub = imp;
-
- ocultar_subautomata(subautomata_mostrado);
-
- posSub = ListaSubAutomatas.begin();
-
- while (posSub->idSub != sub_a_mostrar and posSub != ListaSubAutomatas.end())
- posSub++;
-
- mostrar_subautomata(sub_a_mostrar);
-
- ListaElementos.clear();
- ListaTransiciones.clear();
-
- //Cargamos el nivel que vamos a mostrar
- ListaElementos = posSub->ListaElementosSub;
- ListaTransiciones = posSub->ListaTransicionesSub;
- tiempoIteracion = posSub->tiempoIteracionSub;
- variables = posSub->variablesSub;
- funciones = posSub->funcionesSub;
- imp = posSub->impSub;
-
- }
- else
- {
-
- posSub = ListaSubAutomatas.begin();
-
- while (posSub->idSub != subautomata_mostrado and posSub != ListaSubAutomatas.end())
- posSub++;
-
- //Borramos el nodo que se había creado
- ListaSubAutomatas.erase(posSub);
-
- posSub = ListaSubAutomatas.begin();
-
- while (posSub->idSub != idPadre and posSub != ListaSubAutomatas.end())
- posSub++;
-
- posNodo = posSub->ListaElementosSub.begin();
-
- while (posNodo->idHijo != subautomata_mostrado and posNodo != posSub->ListaElementosSub.end())
- posNodo++;
-
- //Ponemos a 0 el hijo del estado que tenia como hijo al subautomata que se ha borrado.
- posNodo->idHijo = 0;
-
- change_item_color(posNodo->item, 3);
-
- posSub = ListaSubAutomatas.begin();
-
- while (posSub->idSub != sub_a_mostrar and posSub != ListaSubAutomatas.end())
- posSub++;
-
- mostrar_subautomata(sub_a_mostrar);
-
- ListaElementos.clear();
- ListaTransiciones.clear();
-
- //Cargamos el nivel que vamos a mostrar
- ListaElementos = posSub->ListaElementosSub;
- ListaTransiciones = posSub->ListaTransicionesSub;
- tiempoIteracion = posSub->tiempoIteracionSub;
- variables = posSub->variablesSub;
- funciones = posSub->funcionesSub;
- imp = posSub->impSub;
-
- }
-
- actualizar_tree_view();
-
- if (expandir){ //Solo hacemos la expansion si no hemos hecho doble click en el raiz
-
- gtk_tree_view_expand_to_path(GTK_TREE_VIEW(tree_view), arbolPath);
- }
-
-}
-
-static GtkWidget *
-create_view_and_model (void)
-{
- GtkTreeViewColumn *col;
- GtkCellRenderer *renderer;
- GtkWidget *view;
- GtkTreeModel *model;
-
- view = gtk_tree_view_new();
-
- col = gtk_tree_view_column_new();
- //gtk_tree_view_column_set_title(col, (const gchar *)nombreEsquema);
- gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
-
- renderer = gtk_cell_renderer_text_new();
- gtk_tree_view_column_pack_start(col, renderer, TRUE);
- gtk_tree_view_column_add_attribute(col, renderer,
- "text", COLUMN);
-
- model = create_and_fill_model();
- gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);
- g_object_unref(model);
-
- g_signal_connect(view,"row-activated", (GCallback) treeview_onRowActivated, NULL);
-
- return view;
-}
-
-void borrar_subautomata_recursivo(int sub_a_borrar){
-
- list<tSubAut>::iterator posNodoSub;
- list<tNodo>::iterator posEst;
-
- posNodoSub = ListaSubAutomatas.begin();
-
- while (posNodoSub->idSub != sub_a_borrar and posNodoSub != ListaSubAutomatas.end())
- {
- posNodoSub++;
- }
-
- posEst = posNodoSub->ListaElementosSub.begin();
-
- while (posEst != posNodoSub->ListaElementosSub.end())
- {
-
- if (posEst->idHijo != 0){
- borrar_subautomata_recursivo(posEst->idHijo);
- }
-
- posEst++;
-
- }
-
- ListaSubAutomatas.erase(posNodoSub);
-
-}
-
-
-
-int main( int argc, char *argv[])
-{
-
- GtkWidget *boton;
- //GtkWidget *botonLinea;
- //GtkWidget *botonEstado;
- GtkWidget *botonGuardar;
- GtkWidget *botonCargar;
- GtkWidget *caja1;
- GtkWidget *scrolled;
- GtkWidget *scrolled_tree;
- GtkWidget *separator;
-
- GtkWidget *frame_horz;
- GtkWidget *vbox;
- const char * text = "Spread (espacio 40)";
-
- /*Inicializar parametros*/
- gtk_init(&argc, &argv);
-
- /*######################### Creacion de menus desplegables #############################*/
-
- menu_estado = gtk_menu_new();
-
- nombrar_estado = gtk_menu_item_new_with_label("Rename");
- editar_estado = gtk_menu_item_new_with_label("Edit");
- marcar_inicial_estado = gtk_menu_item_new_with_label("Mark as initial");
- copiar_estado = gtk_menu_item_new_with_label("Copy");
- eliminar_estado = gtk_menu_item_new_with_label("Delete");
-
- gtk_menu_shell_append(GTK_MENU_SHELL(menu_estado), nombrar_estado);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu_estado), editar_estado);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu_estado), marcar_inicial_estado);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu_estado), copiar_estado);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu_estado), eliminar_estado);
-
- g_signal_connect_swapped (nombrar_estado, "activate", G_CALLBACK (on_menu_estado_nombrar), menu_estado);//Movido desde handler
- g_signal_connect_swapped (editar_estado, "activate", G_CALLBACK (on_menu_estado_editar), menu_estado);
- g_signal_connect_swapped (marcar_inicial_estado, "activate", G_CALLBACK (on_menu_estado_marcar_inicial), menu_estado);
- g_signal_connect_swapped (copiar_estado, "activate", G_CALLBACK (on_menu_estado_copiar), menu_estado);
- g_signal_connect_swapped (eliminar_estado, "activate", G_CALLBACK (on_menu_estado_eliminar), menu_estado);
-
- gtk_widget_show (nombrar_estado);
- gtk_widget_show (editar_estado);
- gtk_widget_show (marcar_inicial_estado);
- gtk_widget_show (copiar_estado);
- gtk_widget_show (eliminar_estado);
-
-
- menu_transicion = gtk_menu_new();
-
- nombrar_transicion = gtk_menu_item_new_with_label("Rename");
- editar_transicion = gtk_menu_item_new_with_label("Edit");
- eliminar_transicion = gtk_menu_item_new_with_label("Delete");
-
- gtk_menu_shell_append(GTK_MENU_SHELL(menu_transicion), nombrar_transicion);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu_transicion), editar_transicion);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu_transicion), eliminar_transicion);
-
- g_signal_connect_swapped (nombrar_transicion, "activate", G_CALLBACK (on_menu_transicion_nombrar), menu_transicion);//Movido desde handler
- g_signal_connect_swapped (editar_transicion, "activate", G_CALLBACK (on_menu_transicion_editar), menu_transicion);
- g_signal_connect_swapped (eliminar_transicion, "activate", G_CALLBACK (on_menu_transicion_eliminar), menu_transicion);
-
- gtk_widget_show (nombrar_transicion);
- gtk_widget_show (editar_transicion);
- gtk_widget_show (eliminar_transicion);
-
-
- menu_pegar = gtk_menu_new();
-
- pegar_estado = gtk_menu_item_new_with_label("Paste");
-
- gtk_menu_shell_append(GTK_MENU_SHELL(menu_pegar), pegar_estado);
-
- g_signal_connect_swapped (pegar_estado, "activate", G_CALLBACK (on_menu_pegar), menu_pegar);
-
- gtk_widget_show (pegar_estado);
-
- /*####################### FIN Creacion de menus desplegables ############################*/
-
-
- /*Creamos Ventana*/
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
- /*Situamos la ventana en el medio*/
- gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_NONE);
-
- /*Ponemos tamaño a la ventana*/
- gtk_window_set_default_size(GTK_WINDOW(window), 1024, 768);
- gtk_window_maximize (GTK_WINDOW(window));
-
- /*Ponemos el titulo*/
- gtk_window_set_title(GTK_WINDOW(window), "Default");
-
- /* gtk_window_set_decorated(GTK_WINDOW (window), FALSE);*/
- gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK);
-
- /*Accion (motion_notify_event) asignada al pulsar el boton*/
- gtk_signal_connect(GTK_OBJECT(window), "button_press_event", GTK_SIGNAL_FUNC(coordenadas), (gpointer)botonPulsado.c_str());
- gtk_signal_connect(GTK_OBJECT(window), "button_release_event", GTK_SIGNAL_FUNC(pinta_nodo), (gpointer)botonPulsado.c_str());
- //gtk_signal_connect(GTK_OBJECT(window), "2button_press_event", GTK_SIGNAL_FUNC(pegar), NULL);
- gtk_signal_connect(GTK_OBJECT(window), "key-press-event", GTK_SIGNAL_FUNC(set_zoom), (gpointer)canvas);
-
- /*Accion (gtk_main_quit) asignada al pulsar el boton X (salir)*/
- gtk_signal_connect_object(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(gtk_main_quit), GTK_OBJECT(window));
-
- /*Creamos el boton*/
- botonLinea = gtk_toggle_button_new_with_label ("Transition");
- botonEstado = gtk_toggle_button_new_with_label ("Estate");
- botonGuardar = gtk_button_new_with_label ("Save");
- botonCargar = gtk_button_new_with_label ("Open");
-// botonGuardar = gtk_button_new_from_stock (GTK_STOCK_SAVE);
-// botonCargar = gtk_button_new_from_stock (GTK_STOCK_OPEN);
-
- /*Al pulsar el boton, muestra las coordenadas x,y por pantalla*/
-
- gtk_signal_connect(GTK_OBJECT(botonLinea), "button_release_event", GTK_SIGNAL_FUNC(transicion), (gpointer)botonPulsado.c_str());
- gtk_signal_connect(GTK_OBJECT(botonEstado), "button_release_event", GTK_SIGNAL_FUNC(nodo), (gpointer)0);
-
- gtk_signal_connect(GTK_OBJECT(botonGuardar), "released", GTK_SIGNAL_FUNC(guardar), (gpointer)0);
- gtk_signal_connect(GTK_OBJECT(botonCargar), "button_release_event", GTK_SIGNAL_FUNC(cargar), NULL);
-
-
- gtk_container_border_width (GTK_CONTAINER (window), 25);
-
-
- /* ventana para tener barras de desplazamiento */
- scrolled = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS);
-
-
- /* canvas en modo RGB */
- canvas = gnome_canvas_new_aa();
-
- gtk_container_add(GTK_CONTAINER(scrolled), canvas);
-
- gnome_canvas_set_scroll_region(GNOME_CANVAS(canvas),
- 0, 0, CANVAS_SIZE, CANVAS_SIZE);
-
- root = gnome_canvas_root(GNOME_CANVAS(canvas));
-
- /*######################################################### AÑADIENDO TREE VIEW ##########################################################*/
-
- /* ventana para tener barras de desplazamiento */
- scrolled_tree = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_tree), GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS);
-
- tree_view = create_view_and_model();
-
- gtk_container_add(GTK_CONTAINER(scrolled_tree), tree_view);
-
- arbolPath = gtk_tree_path_new_first();
-
- printf("*********************************** Profundidad del path: %d \n", gtk_tree_path_get_depth (arbolPath));
-
- //gtk_tree_view_expand_all(GTK_TREE_VIEW(tree_view));
-
- /*######################################################FIN DE AÑADIENDO TREE VIEW#######################################################*/
-
-
- /*Creamos una caja, contenemos el botons y la imagen en la caja y la caja en la ventana*/
-
-
- caja1 = gtk_hbox_new(FALSE, 0);
-
- separator = gtk_vseparator_new ();
-
-
- /*Cambiar color canvas*/
-
- GtkWidget *frame = gtk_frame_new (NULL);
-
- gtk_widget_set_size_request (frame, 650, 300);//el 150 era 300
-
- gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
-
- gtk_container_add(GTK_CONTAINER(frame), scrolled);
-
- GtkWidget *frame_tree = gtk_frame_new (NULL);
-
- gtk_widget_set_size_request (frame_tree, 150, 300);
-
- gtk_container_add(GTK_CONTAINER(frame_tree), scrolled_tree);
-
-
- gtk_container_add(GTK_CONTAINER(caja1), frame_tree);
-
- gtk_container_add(GTK_CONTAINER(caja1), frame);
-
-
- frame_horz = gtk_frame_new ("Options");
-
-
- /* Redimensionar Frame */
- gtk_widget_set_size_request (frame_horz,300, -1);
-
- gtk_box_pack_start (GTK_BOX (caja1), frame_horz, TRUE, TRUE, 10);
-
-
- vbox = gtk_vbox_new (FALSE, 0);
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
- gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
-
-
- text = "Navigation";
-
- string textAyuda = "Esto es una prueba";
-
- /*boton = gtk_button_new_with_label ("Mover");
- gtk_signal_connect(GTK_OBJECT(boton), "button_release_event", GTK_SIGNAL_FUNC(mover), 0);
- ListaBotones.push_back(boton);
-
- boton = gtk_button_new_from_stock (GTK_STOCK_DELETE);
- gtk_signal_connect(GTK_OBJECT(boton), "button_release_event", GTK_SIGNAL_FUNC(eliminar), 0);
- ListaBotones.push_back(boton);*/
-
-
- //###################Añadido boton Arriba
- boton = gtk_button_new_with_label ("UP");
- gtk_signal_connect(GTK_OBJECT(boton), "button_release_event", GTK_SIGNAL_FUNC(arriba), NULL);
- ListaBotones.push_back(boton);
-
-
- gtk_box_pack_start (GTK_BOX (vbox),
- create_bbox (TRUE, (char *)text, 40, 85, 20, GTK_BUTTONBOX_SPREAD,(gpointer)botonLinea , (gpointer)ayuda[0].c_str()), TRUE, TRUE, 0);
-
- ListaBotones.erase( ListaBotones.begin(), ListaBotones.end());
-
-
- text = "Figures";
-
- ListaBotones.push_back(botonLinea);
- ListaBotones.push_back(botonEstado);
-// boton = gtk_button_new_with_label ("Copy");
-// boton = gtk_button_new_from_stock (GTK_STOCK_COPY);
-// gtk_signal_connect(GTK_OBJECT(boton), "button_release_event", GTK_SIGNAL_FUNC(copiar), 0);
-// ListaBotones.push_back(boton);
-
- textAyuda = "aa";
- gtk_box_pack_start (GTK_BOX (vbox),
- create_bbox (TRUE, (char *)text, 40, 85, 20, GTK_BUTTONBOX_SPREAD,(gpointer)botonLinea, (gpointer)ayuda[1].c_str()), TRUE, TRUE, 0);
-
- ListaBotones.erase( ListaBotones.begin(), ListaBotones.end());
-
- text = "Save/Open";
-
- ListaBotones.push_back(botonGuardar);
-
- boton = gtk_button_new_with_label ("Save as");
-// boton = gtk_button_new_from_stock (GTK_STOCK_SAVE_AS);
- gtk_signal_connect(GTK_OBJECT(boton), "released", GTK_SIGNAL_FUNC(guardar), (gpointer)1);
-
- ListaBotones.push_back(boton);
-
- ListaBotones.push_back(botonCargar);
-
- gtk_box_pack_start (GTK_BOX (vbox),
- create_bbox (TRUE, (char *)text, 40, 85, 20, GTK_BUTTONBOX_SPREAD,(gpointer)botonLinea, (gpointer)ayuda[2].c_str()), TRUE, TRUE, 0);
-
- ListaBotones.erase( ListaBotones.begin(), ListaBotones.end());
-
-/* text = "Edicion Estados";
-
- //Creamos el boton
-
- boton = gtk_button_new_with_label ("EstadoInicial");
- gtk_signal_connect(GTK_OBJECT(boton), "button_release_event", GTK_SIGNAL_FUNC(nodo), (gpointer)1);
- ListaBotones.push_back(boton);
-
- boton = gtk_button_new_with_label ("Nombrar");
- gtk_signal_connect(GTK_OBJECT(boton), "button_release_event", GTK_SIGNAL_FUNC(nombrar), NULL);
- ListaBotones.push_back(boton);
-
- boton = gtk_button_new_from_stock (GTK_STOCK_EDIT);
- gtk_signal_connect(GTK_OBJECT(boton), "button_release_event", GTK_SIGNAL_FUNC(editar), NULL);
- ListaBotones.push_back(boton);
-
- gtk_box_pack_start (GTK_BOX (vbox),
- create_bbox (TRUE, (char *)text, 40, 85, 20, GTK_BUTTONBOX_SPREAD,(gpointer)botonLinea, (gpointer)ayuda[3].c_str()), TRUE, TRUE, 0);
-
- ListaBotones.erase( ListaBotones.begin(), ListaBotones.end());
-*/
- text = "Subautomata data";
-
- boton = gtk_button_new_with_label ("Intefaces");
- ListaBotones.push_back(boton);
- gtk_signal_connect(GTK_OBJECT(boton), "button_release_event", GTK_SIGNAL_FUNC(ventana_importar), NULL);
-
- boton = gtk_button_new_with_label ("Timer");
- ListaBotones.push_back(boton);
- gtk_signal_connect(GTK_OBJECT(boton), "button_release_event", GTK_SIGNAL_FUNC(ventana_timer), NULL);
-
- boton = gtk_button_new_with_label ("Variables");
- ListaBotones.push_back(boton);
- gtk_signal_connect(GTK_OBJECT(boton), "button_release_event", GTK_SIGNAL_FUNC(codigo_esquema), NULL);
-
-
- gtk_box_pack_start (GTK_BOX (vbox),
- create_bbox (TRUE, (char *)text, 40, 85, 20, GTK_BUTTONBOX_SPREAD,(gpointer)botonLinea, (gpointer)ayuda[4].c_str()), TRUE, TRUE, 0);
-
- ListaBotones.erase( ListaBotones.begin(), ListaBotones.end());
-
- text = "Code and Compile";
-
- GtkWidget* img1= gtk_image_new_from_file("./imagenes/compilar.jpg");
- boton = gtk_button_new_with_label ("Generate code");
- gtk_button_set_image((GtkButton*)boton,img1);
- ListaBotones.push_back(boton);
- gtk_signal_connect(GTK_OBJECT(boton), "button_release_event", GTK_SIGNAL_FUNC(generar_c), NULL);
-
- boton = gtk_button_new_with_label ("Compile"); // Compilar
- ListaBotones.push_back(boton);
- gtk_signal_connect(GTK_OBJECT(boton), "button_release_event", GTK_SIGNAL_FUNC(compilar), NULL);
-
- gtk_box_pack_start (GTK_BOX (vbox),
- create_bbox (TRUE, (char *)text, 40, 85, 20, GTK_BUTTONBOX_SPREAD,(gpointer)botonLinea, (gpointer)ayuda[4].c_str()), TRUE, TRUE, 0);
-
- ListaBotones.erase( ListaBotones.begin(), ListaBotones.end());
-
- gtk_container_add(GTK_CONTAINER(window), caja1);
-
- gtk_widget_show_all(window);
-
- //**********************************************************************Creamos el primer nodo en la lista de subautomatas
- //**********************************************************************Habra que eliminarlo, hacer este guardado en cambios
- //**********************************************************************de nivel o cuando se guarde el esquema.
- reg_sub.ListaElementosSub = ListaElementos;
- reg_sub.ListaTransicionesSub = ListaTransiciones;
- reg_sub.idSub = idSubGlobal;
- reg_sub.idPadre = 0;
-
- ListaSubAutomatas.push_back(reg_sub);
-
- idSubGlobal++;
- //************************************************************************************************************************
-
-
- /*Bucle*/
- gtk_main();
-
- return 0;
-}
-
-
-void desconectarLinea (GnomeCanvasItem *transicion, GnomeCanvasItem *estado)
-{
- list<tNodo>::iterator pos;
-
- list<GnomeCanvasItem *>::iterator pos2;
-
-
-
- pos = ListaElementos.begin();
-
- while(pos->item != estado)
- {
- pos++;
- }
-
- pos2 = pos->listaAdyacentes.begin();
-
- while((*pos2) != transicion)
- {
- pos2++;
- }
- pos->listaAdyacentes.erase(pos2);
-
-}
-
-
-void eliminarLinea (GnomeCanvasItem *item, gpointer data)
-{
- if ((botonPulsado == "Eliminar") || (botonPulsado == "Mover")) {
- list<tTransicion>::iterator pos;
-
- pos = ListaTransiciones.begin();
-
-
-
- while(pos != ListaTransiciones.end())
- {
- pos++;
- }
-
- pos = ListaTransiciones.begin();
-
- while(pos->item != item)
- {
- pos++;
- }
- GnomeCanvasItem * origen = pos->origen;
-
- GnomeCanvasItem * destino = pos->destino;
-
- desconectarLinea (item,origen);
-
- desconectarLinea (item,destino);
-
- ListaTransiciones.erase(pos);
-
- gtk_object_destroy (GTK_OBJECT (item));
-
- }
-}
-void
-change_item_width (gpointer data, gpointer user_data)
-{
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (data),
- "width_units", (double)(int)user_data,
- NULL);
-}
-
-static gint
-item_event_linea (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
-{
- GList * list_items;
-
- switch (event->type) {
- case GDK_2BUTTON_PRESS:
- if ((event->button.button == 1) & (botonPulsado == "Editar")){
- /* Cambia el color del item */
- cout << "Cambiar color: " << endl;
- id = (int)item;
- change_item_color (item,0);
- new_text_windows (item,(gchar*)"transicion");
- return TRUE;
- }
- break;
- case GDK_BUTTON_PRESS:
- if ((event->button.button == 3) & (botonPulsado == "Eliminar")){
- eliminarLinea(item, NULL);
- cout << "Eliminado: " << endl;
- return TRUE;
- }
- break;
- case GDK_ENTER_NOTIFY:
- /* Establece la linea ancha */
- if (botonPulsado != "Nombrar"){
- list_items = GNOME_CANVAS_GROUP (item)->item_list;
- g_list_foreach (list_items, change_item_width, (gpointer) 3);
- }
- return TRUE;
-
- case GDK_LEAVE_NOTIFY:
- /* Establece la linea estrecha */
- if (botonPulsado != "Nombrar"){
- list_items = GNOME_CANVAS_GROUP (item)->item_list;
- g_list_foreach (list_items, change_item_width, (gpointer) 1);
- }
- return TRUE;
-
- default:
- break;
- }
-
- return FALSE;
-
-}
-
-
-
-gint
-highlight_box (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
-{
- GdkCursor *fleur;
- static double x, y; /* used to keep track of motion coordinates */
- double new_x, new_y;
- double x1,x2,y1,y2;
- list<tTransicion>::iterator posLinea;
- GnomeCanvasItem *origen, *destino, *arrow, *box;
- GnomeCanvasGroup *group, *group_parent;
- GList * list_items;
- GtkWidget *ventana;
- bool b;
-
- switch (event->type) {
- case GDK_ENTER_NOTIFY:
- gnome_canvas_item_set (item,
- "fill_color", "red",
- NULL);
-
- break;
-
- case GDK_LEAVE_NOTIFY:
- if (!(event->crossing.state & GDK_BUTTON1_MASK))
- gnome_canvas_item_set (item,
- "fill_color_rgba", NULL,
- NULL);
- break;
-
- case GDK_BUTTON_PRESS:
-
- if ((event->button.button == 1) && (botonPulsado == "Nombrar")) {
-
- change_item_color (item,0);
-
- ventana = comprobar_ventana_abierta (item->parent, NOMBRAR);
-
- if (ventana != NULL)
- gtk_window_present (GTK_WINDOW(ventana));
- else{
- ventana = new_name_windows (item->parent);
- add_ventana (ventana, item->parent, NOMBRAR);
- }
-
- }else if (event->button.button == 1) {
- /* Recuerda la posición inicial */
- x = event->button.x;
- y = event->button.y;
-
- }else if (event->button.button == 3) { //*******************************añadido menu contextual con boton derecho.
-
- printf("Entra con boton derecho transicion\n");
-
- gtk_menu_popup(GTK_MENU(menu_transicion),NULL,NULL,NULL,NULL,event->button.button,event->button.time);
-
- item_menu_transicion = item;
-
- return TRUE;
- }
- break;
-
- case GDK_MOTION_NOTIFY:
- //if (botonPulsado == "Mover"){
-
- if (event->motion.state & GDK_BUTTON1_MASK) { // Si está pulsado el botón 1
-
- botonPulsado = "Nada";
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(botonEstado),FALSE);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(botonLinea),FALSE);
-
- fleur = gdk_cursor_new (GDK_FLEUR);
- gnome_canvas_item_grab (item,
- GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
- fleur,
- event->button.time);
- gdk_cursor_unref (fleur);
-
- new_x = event->motion.x;
- new_y = event->motion.y;
-
- group_parent = GNOME_CANVAS_GROUP(item->parent);
-
- list_items = group_parent->item_list;
-
- box = (GnomeCanvasItem *) g_list_nth_data (list_items, g_list_length (list_items)-1);
-
- g_object_get (G_OBJECT (box), "x1", &x1, NULL);
- g_object_get (G_OBJECT (box), "y1", &y1, NULL);
- g_object_get (G_OBJECT (box), "x2", &x2, NULL);
- g_object_get (G_OBJECT (box), "y2", &y2, NULL);
-
- cout << "Puntos item: " << x1 << "," << y1 << "," << x2 << "," << y2 <<endl;
-
- gnome_canvas_item_set (box,
- "x1", x1 + (new_x - x),
- "y1", y1 + (new_y - y),
- "x2", x2 + (new_x - x),
- "y2", y2 + (new_y - y),
- NULL);
-
-
-
- posLinea = ListaTransiciones.begin();
-
- while((posLinea->item != GNOME_CANVAS_ITEM(group_parent) )) //cogemos el padre (grupo) del item (box)
- {
- posLinea++;
- }
-
- origen = posLinea->origen;
- destino = posLinea->destino;
-
- /* Mover Item_Nombre Estado */
- if ( posLinea->item_nombre != NULL )
- gnome_canvas_item_move ((posLinea->item_nombre), new_x - x, new_y - y);
-
- /* Actualizar Posición */
- x = new_x;
- y = new_y;
-
-
- /* Eliminamos Lineas de la Transicion Previa */
-
- while (g_list_length (list_items) > 1){
-
- arrow = (GnomeCanvasItem *) g_list_nth_data (list_items, 0);
- list_items=g_list_next(list_items);
- gtk_object_destroy (GTK_OBJECT (arrow));
-
- }
-
-
- group = repintar_transicion (GNOME_CANVAS_GROUP (item->canvas->root), origen, destino, (x1+x2)/2, (y1+y2)/2);
-
- gnome_canvas_item_reparent (box, group);
-
- b = cambiar_item_transicion (GNOME_CANVAS_ITEM (group_parent), GNOME_CANVAS_ITEM (group));
-
- cambiar_item_adyacentes (origen, GNOME_CANVAS_ITEM (group_parent), GNOME_CANVAS_ITEM (group));
-
- cambiar_item_adyacentes (destino, GNOME_CANVAS_ITEM (group_parent), GNOME_CANVAS_ITEM (group));
- }
-
- //}
- break;
- case GDK_BUTTON_RELEASE:
- gnome_canvas_item_ungrab (item, event->button.time);
-
- if ((event->button.button == 1) & (botonPulsado == "Eliminar"))
- {
- group_parent = GNOME_CANVAS_GROUP(item->parent);
-
- eliminar_nombre(GNOME_CANVAS_ITEM(group_parent));
-
- t_eliminar_transicion_lista (GNOME_CANVAS_ITEM(group_parent));
-
- gtk_object_destroy (GTK_OBJECT (group_parent));
-
- }
- else if ((event->button.button == 1) & (botonPulsado == "Mover"))
- gnome_canvas_item_ungrab (item, event->button.time);
- break;
- case GDK_2BUTTON_PRESS:
- if ((event->button.button == 1) & (botonPulsado == "Editar")){
-
- /* Cambia el color del item */
- change_item_color (item,0);
-
- ventana = comprobar_ventana_abierta (item->parent, EDITAR);
-
- if (ventana != NULL)
- gtk_window_present (GTK_WINDOW(ventana));
- else{
- ventana = new_text_windows (item->parent ,(gchar*)"transicion");
- add_ventana (ventana, item->parent, EDITAR);
- }
- }
- break;
-
- default:
- break;
- }
-
- return FALSE;
-}
-
-gint
-highlight_box_edit (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
-{
- static double x, y; /* used to keep track of motion coordinates */
- list<tTransicion>::iterator posLinea;
- GnomeCanvasGroup *group_parent;
- GtkWidget *ventana;
-
- switch (event->type) {
- case GDK_ENTER_NOTIFY:
- gnome_canvas_item_set (item,
- "fill_color", "red",
- NULL);
-
- break;
-
- case GDK_LEAVE_NOTIFY:
- if (!(event->crossing.state & GDK_BUTTON1_MASK))
- gnome_canvas_item_set (item,
- "fill_color_rgba", NULL,
- NULL);
- break;
-
- case GDK_BUTTON_PRESS:
-
- if ((event->button.button == 1) && (botonPulsado == "Nombrar")) {
-
- change_item_color (item,0);
-
- ventana = comprobar_ventana_abierta (item->parent, NOMBRAR);
-
- if (ventana != NULL)
- gtk_window_present (GTK_WINDOW(ventana));
- else{
- ventana = new_name_windows (item->parent);
- add_ventana (ventana, item->parent, NOMBRAR);
- }
-
- }else if (event->button.button == 1) {
- /* Recuerda la posición inicial */
- x = event->button.x;
- y = event->button.y;
-
- }else if (event->button.button == 3) { //*******************************añadido menu contextual con boton derecho.
-
- printf("Entra con boton derecho autotransicion\n");
-
- gtk_menu_popup(GTK_MENU(menu_transicion),NULL,NULL,NULL,NULL,event->button.button,event->button.time);
-
- item_menu_transicion = item;
-
- return TRUE;
- }
- break;
- case GDK_MOTION_NOTIFY:
-
- break;
- case GDK_BUTTON_RELEASE:
- gnome_canvas_item_ungrab (item, event->button.time);
-
- if ((event->button.button == 1) & (botonPulsado == "Eliminar"))
- {
- group_parent = GNOME_CANVAS_GROUP(item->parent);
-
- eliminar_nombre(GNOME_CANVAS_ITEM(group_parent));
-
- t_eliminar_transicion_lista (GNOME_CANVAS_ITEM(group_parent));
-
- gtk_object_destroy (GTK_OBJECT (group_parent));
-
- }
-
- break;
- case GDK_2BUTTON_PRESS:
- if ((event->button.button == 1) & (botonPulsado == "Editar")){
-
- /* Cambia el color del item */
- change_item_color (item,0);
-
- ventana = comprobar_ventana_abierta (item->parent, EDITAR);
-
- if (ventana != NULL)
- gtk_window_present (GTK_WINDOW(ventana));
- else{
- ventana = new_text_windows (item->parent ,(gchar*)"transicion");
- add_ventana (ventana, item->parent, EDITAR);
- }
- }
- break;
-
- default:
- break;
- }
-
- return FALSE;
-}
-
-static gint
-box_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
-{
-
- if ((event->type != GDK_MOTION_NOTIFY) || !(event->motion.state & GDK_BUTTON1_MASK))
- return FALSE;
-
- return FALSE;
-}
-
-void
-create_drag_box (GnomeCanvasGroup *group, char *box_name, double x1, double y1, GCallback callback)
-{
- GnomeCanvasItem *box;
-
- box = gnome_canvas_item_new (group,
- gnome_canvas_rect_get_type (),
- "fill_color", NULL,
- "outline_color", "black",
- "width_pixels", 0,
- NULL);
-
- gnome_canvas_item_set (box,
- "x1", x1 - 3,
- "y1", y1 - 3,
- "x2", x1 + 3,
- "y2", y1 + 3,
- NULL);
-
- g_signal_connect (box, "event",
- callback,
- NULL);
-
- g_object_set_data (G_OBJECT (group), box_name, box);
-}
-
-/***** Pintar Transicion *****/
-/* modo indica si la transición existe y se repinta la transicion o no existe y se pinta una transición nueva */
-GnomeCanvasItem *
-pinta_transicion (GnomeCanvasItem *origen, GnomeCanvasItem *destino)
-{
-
- GnomeCanvasPoints *pointsPoligono = gnome_canvas_points_new (2);
- GnomeCanvasGroup *group;
- GnomeCanvasItem *item1, *item2;
-
-
- // Puntos del orgien
- double I1x1;
- double I1x2;
- double I1y1;
- double I1y2;
-
-// gnome_canvas_item_get_bounds (origen,&I1x1,&I1y1,&I1x2,&I1y2);
- g_object_get (G_OBJECT (origen), "x1", &I1x1, NULL);
- g_object_get (G_OBJECT (origen), "y1", &I1y1, NULL);
- g_object_get (G_OBJECT (origen), "x2", &I1x2, NULL);
- g_object_get (G_OBJECT (origen), "y2", &I1y2, NULL);
-
- printf("origen, x1: %f, y1: %f, x2: %f, y2: %f \n", I1x1, I1y1, I1x2, I1y2);
-
- // Resolver desequilibrio //
-
- I1x1 += 1.5;
- I1y1 += 1.5;
- I1x2 -= 1.5;
- I1y2 -= 1.5;
-
- // Puntos del destino
- double I2x1;
- double I2x2;
- double I2y1;
- double I2y2;
-
-// gnome_canvas_item_get_bounds (destino,&I2x1,&I2y1,&I2x2,&I2y2);
- g_object_get (G_OBJECT (destino), "x1", &I2x1, NULL);
- g_object_get (G_OBJECT (destino), "y1", &I2y1, NULL);
- g_object_get (G_OBJECT (destino), "x2", &I2x2, NULL);
- g_object_get (G_OBJECT (destino), "y2", &I2y2, NULL);
- printf("destino, x1: %f, y1: %f, x2: %f, y2: %f \n", I2x1, I2y1, I2x2, I2y2);
-
- // Resolver desequilibrio //
-
- I2x1 += 1.5;
- I2y1 += 1.5;
- I2x2 -= 1.5;
- I2y2 -= 1.5;
-
- //Punto medio circulo origen
- double Xm1 = ((I1x2 + I1x1) / 2);
- double Ym1 = ((I1y2 + I1y1) / 2);
- punto pCirculoOrigen = crear_punto (Xm1, Ym1);
-
- //Punto medio circulo destino
- double Xm2 = ((I2x2 + I2x1) / 2);
- double Ym2 = ((I2y2 + I2y1) / 2);
- punto pCirculoDestino = crear_punto (Xm2, Ym2);
-
- // Ecuacion Recta Ax + By + C =0
- recta recta_origen_destino = crear_recta (pCirculoOrigen, pCirculoDestino);
-
- // Ecuacion Recta Perpendicular que pasa por el punto medio del circulo origen
- recta recta_perpendicular_circulo_origen = recta_perpendicular (recta_origen_destino, pCirculoOrigen);
-
-
- // Ecuacion Recta Paralela1 d=(ax+by+c)/(a^2 + b^2)^1/2
- recta recta_paralela1 = recta_paralela (recta_perpendicular_circulo_origen, pCirculoOrigen, -20);
-
- // Intersecciones 1 entre recta perpendicular y paralela
- double YI1;
- double XI1;
-
- punto pInterseccion = interseccion_rectas (recta_origen_destino, recta_paralela1);
- punto_get_values (pInterseccion, &XI1, &YI1);
-
- // Ecuacion Recta Perpendicular que pasa por el punto medio del circulo destino
- recta recta_perpendicular_circulo_destino = recta_perpendicular (recta_origen_destino, pCirculoDestino);
-
- // Ecuacion Recta Paralela2
- recta_paralela1 = recta_paralela (recta_perpendicular_circulo_origen, pCirculoDestino, 20);
-
- // Intersecciones 2
- double YI2;
- double XI2;
- pInterseccion = interseccion_rectas (recta_origen_destino, recta_paralela1);
- punto_get_values (pInterseccion, &XI2, &YI2);
-
- GnomeCanvas *canvas = origen->canvas;
-
- group = GNOME_CANVAS_GROUP (gnome_canvas_item_new (GNOME_CANVAS_GROUP(canvas->root),
- gnome_canvas_group_get_type (),
- "x", 0,
- "y", 0,
- NULL));
- double pMedioX, pMedioY;
- // Punto medio de la recta que uno los estados
- punto pMedioRecta = punto_medio (pCirculoOrigen, pCirculoDestino);
- punto_get_values (pMedioRecta, &pMedioX, &pMedioY);
-
- pointsPoligono->coords[0] = XI1;
- pointsPoligono->coords[1] = YI1;
- pointsPoligono->coords[2] = pMedioX;
- pointsPoligono->coords[3] = pMedioY;
-
- item1 = gnome_canvas_item_new(group, gnome_canvas_line_get_type (),
- "points", pointsPoligono,
- "fill_color", "orange",
- "width_units", 1.0,
- NULL);
-
- pointsPoligono->coords[0] = pMedioX;
- pointsPoligono->coords[1] = pMedioY;
- pointsPoligono->coords[2] = XI2;
- pointsPoligono->coords[3] = YI2;
-
-
- item2 = gnome_canvas_item_new(group, gnome_canvas_line_get_type (),
- "points", pointsPoligono,
- "fill_color", "orange",
- "width_units", 1.0,
- "last_arrowhead", TRUE,
- "arrow_shape_a", 8.0,
- "arrow_shape_b", 8.0,
- "arrow_shape_c", 8.0,
- NULL);
-
- gnome_canvas_points_free (pointsPoligono);
-
- printf("pMedioX: %f, pMedioY: %f \n", pMedioX, pMedioY);
-
- create_drag_box (group, (char *)"box", pMedioX, pMedioY, G_CALLBACK (highlight_box));
-
- return GNOME_CANVAS_ITEM(group);
-
-
-}
-
-
-/* Llamada para la señales de eventos de los items del canvas. Si el
- * usuario arrastra el item con el botón 1, esté se moverá en consecuencia.
- * Si el usuario hace doble click sobre el item, su color cambiará
- * aleatoriamente. Si el usuario pulsa el botón 3 sobre un item, entoces
- * el item será destruido.
- * Cuando el puntero del ratón entra en un item, su ancho de linea se
- * establece a 3 unidades.
- * Cuando el puntero del ratón abandona un item, su ancho de linea se
- * reestablece a 1 unidad.
- */
-
-
-gint
-item_event (GnomeCanvasItem *item_group, GdkEvent *event, gpointer data)
-{
- //static double x, y; /* used to keep track of motion coordinates */
- //double new_x, new_y;
-
- GdkCursor *fleur; /* Usado para cambiar el dibujo del cursor */
-
- GnomeCanvasItem *item, *item2, *item_transicion;
- GnomeCanvasGroup *group;
- GtkWidget *ventana;
-
- list<tTransicion>::iterator posLinea;
- list<tNodo>::iterator posNodo;
- list<tSubAut>::iterator posNodoSub;
- list<GnomeCanvasItem *>::iterator posAdy;
- list<GnomeCanvasItem *>::iterator posAux;
-
- int idHijo_aux;
-
- static gboolean dragging = FALSE;
- double event_x = event->button.x;
- double event_y = event->button.y;
- static double previous_x, previous_y;
-
- int idPath=0;
-
- aux ln;
-
- list <aux> ListaAux;
-
- list<aux>::iterator posRec;
-
- item = (GnomeCanvasItem *)g_list_nth_data (GNOME_CANVAS_GROUP(item_group)->item_list, 0);
-
- switch (event->type) {
-
- case GDK_2BUTTON_PRESS:
- /*if ((event->button.button == 1) & (botonPulsado == "Editar")){
-
- // Cambia el color del item
- change_item_color (item,0);
-
- ventana = comprobar_ventana_abierta (item, EDITAR);
-
- if (ventana != NULL)
- gtk_window_present (GTK_WINDOW(ventana));
- else{
- ventana = new_text_windows (item ,(gchar*)"estado");
- add_ventana (ventana, item, EDITAR);
- }
-
- return TRUE;
- }*/
- printf("Doble click en item.\n");
-
- posNodo = ListaElementos.begin();
-
- while (posNodo->item != item and posNodo != ListaElementos.end())
- {
- posNodo++;
- idPath++;
- }
-
- idHijo_aux = posNodo->idHijo;
-
-
- posNodoSub = ListaSubAutomatas.begin();
-
- while (posNodoSub->idSub != subautomata_mostrado and posNodoSub != ListaSubAutomatas.end())
- posNodoSub++;
-
- /* Gestion para navegacion en el tree view */
-
- if (posNodoSub->idPadre == 0){
- printf("idPath: %d \n", idPath);
- gtk_tree_path_free (arbolPath);
- arbolPath = gtk_tree_path_new_from_string ((const char*)int2string(idPath).c_str());
- printf("Path con padre = 0 -- %s \n", gtk_tree_path_to_string (arbolPath));
- }
- else{
- gtk_tree_path_append_index (arbolPath, idPath);
- printf("Path con padre <> 0 -- %s \n", gtk_tree_path_to_string (arbolPath));
- }
-
- /* FIN Gestion para navegacion en el tree view */
-
- if (idHijo_aux != 0){
-
- gnome_canvas_item_set (item,
- "fill_color", "green", // 0x00ff66ff,
- NULL);
- gnome_canvas_update_now (GNOME_CANVAS(canvas));
-
- posNodoSub = ListaSubAutomatas.begin();
-
- while (posNodoSub->idSub != subautomata_mostrado and posNodoSub != ListaSubAutomatas.end())
- posNodoSub++;
-
- //Guardamos el nivel actual
- posNodoSub->ListaElementosSub = ListaElementos;
- posNodoSub->ListaTransicionesSub = ListaTransiciones;
- posNodoSub->tiempoIteracionSub = tiempoIteracion;
- posNodoSub->variablesSub = variables;
- posNodoSub->funcionesSub = funciones;
- posNodoSub->impSub = imp;
-
- ocultar_subautomata(subautomata_mostrado);
-
- posNodoSub = ListaSubAutomatas.begin();
-
- while (posNodoSub->idSub != idHijo_aux and posNodoSub != ListaSubAutomatas.end())
- posNodoSub++;
-
- mostrar_subautomata(posNodo->idHijo);
-
- ListaElementos.clear();
- ListaTransiciones.clear();
-
- //Cargamos el nivel que vamos a mostrar
- ListaElementos = posNodoSub->ListaElementosSub;
- ListaTransiciones = posNodoSub->ListaTransicionesSub;
- tiempoIteracion = posNodoSub->tiempoIteracionSub;
- variables = posNodoSub->variablesSub;
- funciones = posNodoSub->funcionesSub;
- imp = posNodoSub->impSub;
-
- }
- else{
-
- posNodo->idHijo = idSubGlobal;
- printf("id del hijo creado : %d \n", posNodo->idHijo);
-
- gnome_canvas_item_set (item,
- "fill_color", "green", // 0x00ff66ff,
- NULL);
- gnome_canvas_update_now (GNOME_CANVAS(canvas));
-
- posNodoSub = ListaSubAutomatas.begin();
-
- while (posNodoSub->idSub != subautomata_mostrado and posNodoSub != ListaSubAutomatas.end())
- posNodoSub++;
-
- //Guardamos el nivel actual
- posNodoSub->ListaElementosSub = ListaElementos;
- posNodoSub->ListaTransicionesSub = ListaTransiciones;
- posNodoSub->tiempoIteracionSub = tiempoIteracion;
- posNodoSub->variablesSub = variables;
- posNodoSub->funcionesSub = funciones;
- posNodoSub->impSub = imp;
- ocultar_subautomata(subautomata_mostrado);
-
- ListaElementos.clear();
- ListaTransiciones.clear();
-
- tSubAut sub_aux;
-
- sub_aux.ListaElementosSub = ListaElementos;
- sub_aux.ListaTransicionesSub = ListaTransiciones;
- sub_aux.tiempoIteracionSub = 100;
- sub_aux.variablesSub = "";
- sub_aux.funcionesSub = "";
- sub_aux.impSub.laser= FALSE;
- sub_aux.impSub.motor= FALSE;
- sub_aux.impSub.radar= FALSE;
- sub_aux.impSub.encoders= FALSE;
- sub_aux.impSub.lat_lon= FALSE;
- sub_aux.impSub.camara= FALSE;
- sub_aux.impSub.ptencoders= FALSE;
- sub_aux.idSub = idSubGlobal;
- sub_aux.idPadre = subautomata_mostrado;
-
- ListaSubAutomatas.push_back(sub_aux);
-
- posNodoSub = ListaSubAutomatas.begin();
-
- while (posNodoSub->idSub != idSubGlobal and posNodoSub != ListaSubAutomatas.end())
- posNodoSub++;
-
- //Cargamos el nivel que vamos a mostrar
- ListaElementos = posNodoSub->ListaElementosSub;
- ListaTransiciones = posNodoSub->ListaTransicionesSub;
- tiempoIteracion = posNodoSub->tiempoIteracionSub;
- variables = posNodoSub->variablesSub;
- funciones = posNodoSub->funcionesSub;
- imp = posNodoSub->impSub;
- //mostrar_subautomata(idSubGlobal);
- subautomata_mostrado = idSubGlobal;
-
- idSubGlobal++;
- }
-
- actualizar_tree_view();
- gtk_tree_view_expand_to_path(GTK_TREE_VIEW(tree_view), arbolPath);
-
- break;
-
- case GDK_BUTTON_RELEASE:
-
- //if ((event->button.button == 1) && dragging /*&& (botonPulsado == "Mover")*/)
- gnome_canvas_item_ungrab (item, event->button.time);
- dragging = FALSE;
-
- break;
-
- case GDK_BUTTON_PRESS:
-
- dragging = TRUE;
- previous_x = event_x;
- previous_y = event_y;
-
- if ((event->button.button == 1) && (botonPulsado == "EstadoInicial")) {
-
- marcar_estado_inicial (item);
- }
- /*Pintamos Linea*/
- else if ((event->button.button == 1) && (botonPulsado == "Linea")) {
-
- if (item_transicion_saved == NULL){
-
- item_transicion_saved=item; //Si es en el primer item que pulsamos lo guardamos
-
- break;
- }
- else if(item != item_transicion_saved) //Si es en el segundo item que pulsamos y es distinto que el primero
- {
- /* Cogemos los dos item pulsados, congemos sus puntos (coordenadas)
- miranos que puntos tienen menor distancia.
- pintamos una recta con esos puntos
- */
-
- item2 = pinta_transicion (item_transicion_saved, item);
-
- }else if(item == item_transicion_saved){
-
- item2 = pinta_autotransicion (item);
-
- }
- gnome_canvas_update_now (GNOME_CANVAS(canvas));
-
- g_object_set_data (G_OBJECT (item2), "id", (void*)(int)item2);
-
- // Guardamos que elementos conecta la linea
- tTransicion l;
- l.item = item2;
- l.origen = item_transicion_saved;
- l.destino = item;
- l.codigo = codigo;
- l.tiempo = tiempo;
- l.item_nombre = NULL;
- l.nombre = "";
- ListaTransiciones.push_back(l);
-
-
- // Guardamos en los elementos, las lineas que tienen conectadas.
- list<tNodo>::iterator pos;
-
- pos = ListaElementos.begin();
-
- while(pos->item != item_transicion_saved)
- pos++;
- pos->listaAdyacentes.push_back(item2);
-
- if(item != item_transicion_saved){
- pos = ListaElementos.begin();
-
- while(pos->item != item)
- pos++;
-
- pos->listaAdyacentes.push_back(item2);
- }
-
- item_transicion_saved = NULL;
-
- }
- else if ((event->button.button == 1) && (botonPulsado == "Nombrar")) {
-
-
- change_item_color (item,0);
-
- ventana = comprobar_ventana_abierta (item, NOMBRAR);
-
- if (ventana != NULL)
- gtk_window_present (GTK_WINDOW(ventana));
- else{
- ventana = new_name_windows (item);
- add_ventana (ventana, item, NOMBRAR);
- }
-
- return TRUE;
-
- }else if ((event->button.button == 1) && (botonPulsado == "Copiar")) {
-
-
- cout << "Copiando: " << endl;
-
- double x1,x2,y1,y2;
-
- g_object_get (G_OBJECT (item), "x1", &x1, NULL);
- g_object_get (G_OBJECT (item), "y1", &y1, NULL);
- g_object_get (G_OBJECT (item), "x2", &x2, NULL);
- g_object_get (G_OBJECT (item), "y2", &y2, NULL);
-
- group = GNOME_CANVAS_GROUP (gnome_canvas_item_new (root,
- gnome_canvas_group_get_type (),
- "x", 0,
- "y", 0,
- NULL));
-
- item2 = gnome_canvas_item_new(group,
- gnome_canvas_ellipse_get_type(),
- "x1", x1+50,
- "x2", x2+50,
- "y1", y1,
- "y2", y2,
- "fill_color_rgba", 0x00ffffff,
- "outline_color", "black",
- "width_units", 1.0,
- NULL);
-
- copiar_nodo (item, item2);
-
- g_signal_connect (group, "event",
- (GtkSignalFunc) item_event,
- NULL);
-
-
- return TRUE;
-
- } else if ((event->button.button == 3) & (botonPulsado == "Eliminar")){
-
- /* Destruye el item */
-
- // Eliminar Transiciones
- posNodo = ListaElementos.begin();
-
- while((posNodo->item != item) & ( posNodo != ListaElementos.end() ))
- posNodo++;
-
-
- if (posNodo != ListaElementos.end()) {
-
- posAdy = posNodo->listaAdyacentes.begin();
-
- while(posAdy != (posNodo->listaAdyacentes.end()))
- {
-
- posAux = posAdy;
-
- posAdy++;
-
- eliminar_nombre(*posAux);
- t_eliminar_transicion_lista (*posAux);
-
- gtk_object_destroy (GTK_OBJECT (*posAux));
-
- }
-
- ListaElementos.erase(posNodo);
-
- cout << (int)*(posNodo->listaAdyacentes.begin()) << endl;
-
- gtk_object_destroy (GTK_OBJECT (item_group));
- }
-
-
-
- cout << "Eliminado: " << endl;
- return TRUE;
- }
-
- else if ((event->button.button == 1) & (botonPulsado == "Editar")){//********************añadido evento editar con click simple
-
- // Cambia el color del item
- change_item_color (item,0);
-
- ventana = comprobar_ventana_abierta (item, EDITAR);
-
- if (ventana != NULL)
- gtk_window_present (GTK_WINDOW(ventana));
- else{
- ventana = new_text_windows (item ,(gchar*)"estado");
- add_ventana (ventana, item, EDITAR);
- }
-
- return TRUE;
- }
-
- else if (event->button.button == 3) { //*******************************añadido menu contextual con boton derecho.
-
- printf("Entra con boton derecho estado\n");
-
- gtk_menu_popup(GTK_MENU(menu_estado),NULL,NULL,NULL,NULL,event->button.button,event->button.time);
-
- item_menu_estado = item;
- item_group_menu_estado = item_group;
-
- return TRUE;
- }
- break;
-
-
- case GDK_MOTION_NOTIFY:
-
- //if (botonPulsado == "Mover"){
- if (estado_nombrado){
-
- actualizar_tree_view();
-
- if (subautomata_mostrado != 1)
- gtk_tree_view_expand_to_path(GTK_TREE_VIEW(tree_view), arbolPath);
-
- estado_nombrado=FALSE;
- }
-
- if ((event->motion.state & GDK_BUTTON1_MASK) && dragging) { // Si está pulsado el botón 1
- //Para eliminar el efecto de cualquier posible boton puslado
-
- botonPulsado = "Nada";
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(botonEstado),FALSE);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(botonLinea),FALSE);
-
- /* cambiar la imagen del cursor*/
- fleur = gdk_cursor_new (GDK_FLEUR);
- /*gnome_canvas_item_grab (item,
- GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
- fleur,
- event->button.time);*/
- gnome_canvas_item_grab(item,GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, fleur, event->button.time);
- gdk_cursor_unref (fleur);
-
-
-
- /*gnome_canvas_item_move(item, event_x - previous_x,
- event_y - previous_y);*/
-
- /* Obten la nueva posición y muevete por la
- * diferencia */
-
- /*new_x = event->motion.x;
- new_y = event->motion.y;*/
-
- double x1,x2,y1,y2;
- g_object_get (G_OBJECT (item), "x1", &x1, NULL);
- g_object_get (G_OBJECT (item), "y1", &y1, NULL);
- g_object_get (G_OBJECT (item), "x2", &x2, NULL);
- g_object_get (G_OBJECT (item), "y2", &y2, NULL);
-
- /*cout << "Puntos item: " << x1 << "," << y1 << "," << x2 << "," << y2 <<endl;
-
- gnome_canvas_item_set (item,
- "x1", x1 + (new_x - x),
- "y1", y1 + (new_y - y),
- "x2", x2 + (new_x - x),
- "y2", y2 + (new_y - y),
- NULL);*/
-
- gnome_canvas_item_set (item,
- "x1", x1 + (event_x - previous_x),
- "y1", y1 + (event_y - previous_y),
- "x2", x2 + (event_x- previous_x),
- "y2", y2 + (event_y- previous_y),
- NULL);
-
-
- /* Mover Item_Nombre Estado */
- posNodo = ListaElementos.begin();
-
- while((posNodo->item != item))
- {
- posNodo++;
- }
-
- if ( posNodo->item_nombre != NULL )
- gnome_canvas_item_move ((posNodo->item_nombre), event_x - previous_x, event_y - previous_y);
-
- if ( posNodo->estado_inicial != NULL )
- gnome_canvas_item_move ((posNodo->estado_inicial), event_x - previous_x, event_y - previous_y);
-
-
- /* Repintar Transiciones */
- posAdy = posNodo->listaAdyacentes.begin();
-
-
- while(posAdy != (posNodo->listaAdyacentes.end()))
- {
-
- posLinea = ListaTransiciones.begin();
-
- while(posLinea->item != (*posAdy))
- posLinea++;
-
-
- posAdy++;
-
- GnomeCanvasItem * origen;
-
- GnomeCanvasItem * destino;
-
- if ( posLinea->origen == posLinea->destino ){
- gnome_canvas_item_move ((posLinea->item), event_x - previous_x, event_y - previous_y);
- if (posLinea->nombre.compare("") != 0)
- gnome_canvas_item_move ((posLinea->item_nombre), event_x - previous_x, event_y - previous_y);
- }
- else if ( posLinea->origen == item)
- {
-
- origen = item;
- destino = posLinea->destino;
-
- item_transicion = (GnomeCanvasItem *) repintar_transicion_nodo (root, posLinea->item, item, (char *)"origen");
-
- }
- else
- {
- origen = posLinea->origen;
- destino = item;
- item_transicion = (GnomeCanvasItem *) repintar_transicion_nodo (root, posLinea->item, item, (char *)"destino");
- }
-
- }
-
- /* Actualizar Posición */
- //x = new_x;
- //y = new_y;
-
- previous_x = event_x;
- previous_y = event_y;
-
- return TRUE;
- }
-
- //}
- break;
-
- case GDK_ENTER_NOTIFY:
- /* Establece la linea ancha */
- gnome_canvas_item_set (item,
- "width_units", 3.0,
- NULL);
- return TRUE;
-
- case GDK_LEAVE_NOTIFY:
- /* Establece la linea estrecha */
- gnome_canvas_item_set (item,
- "width_units", 1.0,
- NULL);
- return TRUE;
-
- default:
- break;
- }
-
- return FALSE;
-}
-
-
-void on_menu_estado_nombrar(){
-
- GtkWidget *ventana;
-
- change_item_color (item_menu_estado,0);
-
- ventana = comprobar_ventana_abierta (item_menu_estado, NOMBRAR);
-
- if (ventana != NULL)
- {
- gtk_window_present (GTK_WINDOW(ventana));
- }
- else{
- ventana = new_name_windows (item_menu_estado);
- add_ventana (ventana, item_menu_estado, NOMBRAR);
- }
-
- estado_nombrado = TRUE;
-
-}
-
-void
-on_menu_estado_editar(){
-
- GtkWidget *ventana;
-
- change_item_color (item_menu_estado,0);
-
- ventana = comprobar_ventana_abierta (item_menu_estado, EDITAR);
-
- if (ventana != NULL)
- gtk_window_present (GTK_WINDOW(ventana));
- else{
- ventana = new_text_windows (item_menu_estado ,(gchar*)"estado");
- add_ventana (ventana, item_menu_estado, EDITAR);
- }
-
-}
-
-void
-on_menu_estado_marcar_inicial(){
-
- marcar_estado_inicial (item_menu_estado);
-
-}
-
-void
-on_menu_estado_copiar(){
-
- list<tNodo>::iterator posNodo;
-
- posNodo = ListaElementos.begin();
-
- while((posNodo->item != item_menu_estado) & ( posNodo != ListaElementos.end() ))
- posNodo++;
-
- estado_clipboard = TRUE;
- estado_clipboard_codigo = posNodo->codigo;
- estado_clipboard_idHijo = posNodo->idHijo;
-
-}
-
-void
-on_menu_estado_eliminar(){
-
- list<tNodo>::iterator posNodo;
- list<GnomeCanvasItem *>::iterator posAdy;
- list<GnomeCanvasItem *>::iterator posAux;
-
-
- /* Destruye el item */
-
- // Eliminar Transiciones
- posNodo = ListaElementos.begin();
-
- while((posNodo->item != item_menu_estado) & ( posNodo != ListaElementos.end() ))
- posNodo++;
-
-
- if (posNodo != ListaElementos.end()) {
-
- posAdy = posNodo->listaAdyacentes.begin();
-
- while(posAdy != (posNodo->listaAdyacentes.end()))
- {
-
- posAux = posAdy;
-
- posAdy++;
-
- eliminar_nombre(*posAux);
- t_eliminar_transicion_lista (*posAux);
-
- gtk_object_destroy (GTK_OBJECT (*posAux));
-
- }
-
- if (posNodo->idHijo != 0){
- borrar_subautomata_recursivo(posNodo->idHijo);
- }
-
- ListaElementos.erase(posNodo);
-
- cout << (int)*(posNodo->listaAdyacentes.begin()) << endl;
-
- gtk_object_destroy (GTK_OBJECT (item_group_menu_estado));
- }
-
-
-
- cout << "Eliminado: " << endl;
-
- actualizar_tree_view();
-
- gtk_tree_view_expand_to_path(GTK_TREE_VIEW(tree_view), arbolPath);
-
-}
-
-
-void
-on_menu_transicion_nombrar(){
-
- GtkWidget *ventana;
-
- change_item_color (item_menu_transicion,0);
-
- ventana = comprobar_ventana_abierta (item_menu_transicion->parent, NOMBRAR);
-
- if (ventana != NULL)
- gtk_window_present (GTK_WINDOW(ventana));
- else{
- ventana = new_name_windows (item_menu_transicion->parent);
- add_ventana (ventana, item_menu_transicion->parent, NOMBRAR);
- }
-
-}
-
-
-void
-on_menu_transicion_editar(){
-
- GtkWidget *ventana;
-
- change_item_color (item_menu_transicion,0);
-
- ventana = comprobar_ventana_abierta (item_menu_transicion->parent, EDITAR);
-
- if (ventana != NULL)
- gtk_window_present (GTK_WINDOW(ventana));
- else{
- ventana = new_text_windows (item_menu_transicion->parent ,(gchar*)"transicion");
- add_ventana (ventana, item_menu_transicion->parent, EDITAR);
- }
-
-}
-
-
-void
-on_menu_transicion_eliminar(){
-
- GnomeCanvasGroup *group_parent;
-
- group_parent = GNOME_CANVAS_GROUP(item_menu_transicion->parent);
-
- eliminar_nombre(GNOME_CANVAS_ITEM(group_parent));
-
- t_eliminar_transicion_lista (GNOME_CANVAS_ITEM(group_parent));
-
- gtk_object_destroy (GTK_OBJECT (group_parent));
-
-}
-
-
-void
-reemplazar_nodo_subautomata(int idSub, GnomeCanvasItem *item_buscar, GnomeCanvasItem* item_nuevo){
-
- list<tSubAut>::iterator posNodoSub;
- list<tNodo>::iterator posNodo;
- list<tTransicion>::iterator posTrans;
-
-
- posNodoSub = ListaSubAutomatas.begin();
-
- //Nos posicionamos en el subautomata en el que queremos hacer el cambio
- while(posNodoSub->idSub != idSub)
- {
- posNodoSub++;
- }
-
- posNodo = posNodoSub->ListaElementosSub.begin();
-
- while(posNodo!= posNodoSub->ListaElementosSub.end())
- {
- if(posNodo->item == item_buscar){
- posNodo->item = item_nuevo;
- }
-
- posNodo++;
-
- }
-
- posTrans = posNodoSub->ListaTransicionesSub.begin();
-
- while(posTrans!= posNodoSub->ListaTransicionesSub.end())
- {
- if(posTrans->origen == item_buscar){
- posTrans->origen = item_nuevo;
- }
-
- if(posTrans->destino == item_buscar){
- posTrans->destino = item_nuevo;
- }
-
- posTrans++;
- }
-}
-
-
-void
-reemplazar_nombre_nodo_subautomata(int idSub, GnomeCanvasItem* nombre_buscar, GnomeCanvasItem* nombre_nuevo){
-
- list<tSubAut>::iterator posNodoSub;
- list<tNodo>::iterator posNodo;
-
- posNodoSub = ListaSubAutomatas.begin();
-
- //Nos posicionamos en el subautomata en el que queremos hacer el cambio
- while(posNodoSub->idSub != idSub)
- {
- posNodoSub++;
- }
-
- posNodo = posNodoSub->ListaElementosSub.begin();
-
- while(posNodo!= posNodoSub->ListaElementosSub.end())
- {
- if(posNodo->item_nombre == nombre_buscar){
- posNodo->item_nombre = nombre_nuevo;
- }
- posNodo++;
- }
-}
-
-
-void
-reemplazar_estado_inicial_subautomata(int idSub, GnomeCanvasItem* inicial_buscar, GnomeCanvasItem* inicial_nuevo){
-
- list<tSubAut>::iterator posNodoSub;
- list<tNodo>::iterator posNodo;
-
- posNodoSub = ListaSubAutomatas.begin();
-
- //Nos posicionamos en el subautomata en el que queremos hacer el cambio
- while(posNodoSub->idSub != idSub)
- {
- posNodoSub++;
- }
-
- posNodo = posNodoSub->ListaElementosSub.begin();
-
- while(posNodo!= posNodoSub->ListaElementosSub.end())
- {
- if(posNodo->estado_inicial == inicial_buscar){
- posNodo->estado_inicial = inicial_nuevo;
- }
- posNodo++;
- }
-}
-
-
-void
-reemplazar_transicion_subautomata(int idSub, GnomeCanvasItem* trans_buscar, GnomeCanvasItem* trans_nueva){
-
- list<tSubAut>::iterator posNodoSub;
- list<tNodo>::iterator posNodo;
- list<tTransicion>::iterator posTrans;
- list<GnomeCanvasItem*>::iterator posAdy;
-
- posNodoSub = ListaSubAutomatas.begin();
-
- //Nos posicionamos en el subautomata en el que queremos hacer el cambio
- while(posNodoSub->idSub != idSub)
- {
- posNodoSub++;
- }
-
- //Sustituimos la transicion en las listas de adyacentes de los estados
- posNodo = posNodoSub->ListaElementosSub.begin();
-
- while(posNodo != posNodoSub->ListaElementosSub.end()){
-
- posAdy = posNodo->listaAdyacentes.begin();
- while(posAdy != posNodo->listaAdyacentes.end()){
-
- if(*posAdy == trans_buscar){
- *posAdy = trans_nueva;
- }
- posAdy++;
- }
-
- posNodo++;
- }
-
- //Sustituimos la transicion en la lista de transiciones del subautomata
- posTrans = posNodoSub->ListaTransicionesSub.begin();
-
- while(posTrans != posNodoSub->ListaTransicionesSub.end()){
-
- if(posTrans->item == trans_buscar){
- posTrans->item = trans_nueva;
- }
- posTrans++;
- }
-}
-
-
-void
-reemplazar_nombre_trans_subautomata(int idSub, GnomeCanvasItem* nombre_buscar, GnomeCanvasItem* nombre_nuevo){
-
- list<tSubAut>::iterator posNodoSub;
- list<tTransicion>::iterator posTrans;
-
- posNodoSub = ListaSubAutomatas.begin();
-
- //Nos posicionamos en el subautomata en el que queremos hacer el cambio
- while(posNodoSub->idSub != idSub)
- {
- posNodoSub++;
- }
-
- posTrans = posNodoSub->ListaTransicionesSub.begin();
-
- while(posTrans != posNodoSub->ListaTransicionesSub.end()){
-
- if(posTrans->item_nombre == nombre_buscar){
- posTrans->item_nombre = nombre_nuevo;
- }
-
- posTrans++;
-
- }
-
-}
-
-
-void pegado_recursivo(int sub_a_copiar, int sub_padre){
-
- tSubAut nuevo_sub;
- list<tSubAut>::iterator posNodoSub;
- list<tNodo>::iterator posNodo;
- list<tTransicion>::iterator posTrans;
-
- GnomeCanvasItem *item, *item_nombre, *inicial;
- GnomeCanvasGroup *group;
-
- //Para obtener el box de una transicion y poder copiar el nombre en caso de haberlo
- GnomeCanvasItem *box;
- GList * list_items;
-
- //estas variables son necesarias si tenemos que llamar a pegado_recursivo mas veces
- int padre = 0;
- int hijo = 0;
-
- double x1, y1, x2, y2;
-
- posNodoSub = ListaSubAutomatas.begin();
-
- while(posNodoSub->idSub != sub_a_copiar)
- {
- posNodoSub++;
- }
-
- //Asi copiamos las listas
- list <tNodo> listE (posNodoSub->ListaElementosSub);
- list <tTransicion> listT( posNodoSub->ListaTransicionesSub);
-
- nuevo_sub.ListaElementosSub = listE;
- nuevo_sub.ListaTransicionesSub = listT;
- nuevo_sub.tiempoIteracionSub = posNodoSub->tiempoIteracionSub;
- nuevo_sub.variablesSub = posNodoSub->variablesSub;
- nuevo_sub.funcionesSub = posNodoSub->funcionesSub;
- nuevo_sub.impSub = posNodoSub->impSub;
- nuevo_sub.idSub = idSubGlobal;
- nuevo_sub.idPadre = sub_padre;
-
- ListaSubAutomatas.push_back(nuevo_sub);
-
- posNodoSub = ListaSubAutomatas.begin();
-
- while(posNodoSub->idSub != idSubGlobal)
- {
- posNodoSub++;
- }
-
- posNodo = posNodoSub->ListaElementosSub.begin();
-
- //Recorremos la lista de elementos para duplicar todos los nodos y asi tener la copia
- //hacemos lo mismo con el item de estado inicial y con el item del nombre si fuera necesario
- while(posNodo != posNodoSub->ListaElementosSub.end())
- {
- get_bounds (posNodo->item, &x1, &y1, &x2, &y2);
-
- group = GNOME_CANVAS_GROUP (gnome_canvas_item_new (root,
- gnome_canvas_group_get_type (),
- "x", 0,
- "y", 0,
- NULL));
-
- if (posNodo->idHijo == 0){
-
- item = gnome_canvas_item_new(group,
- gnome_canvas_ellipse_get_type(),
- "x1", x1,
- "y1", y1,
- "x2", x2,
- "y2", y2,
- "fill_color_rgba", 0x00ffffff,
- "outline_color", "black",
- "width_units", 1.0,
- NULL);
- }else{
-
- item = gnome_canvas_item_new(group,
- gnome_canvas_ellipse_get_type(),
- "x1", x1,
- "y1", y1,
- "x2", x2,
- "y2", y2,
- "fill_color_rgba", 0x00ff66ff,
- "outline_color", "black",
- "width_units", 1.0,
- NULL);
- }
-
- /*Añadimos control (señal) al item creado*/
- g_signal_connect (group, "event",
- (GtkSignalFunc) item_event,
- NULL);
-
- //Lo ocultamos
- gnome_canvas_item_hide(item);
-
- //Sustituimos el item copiado por el recien creado en todas las referencias que haya
- //dentro de su subautomata
- reemplazar_nodo_subautomata(posNodoSub->idSub, posNodo->item, item);
-
- //Repetimos el proceso para el item_nombre y para el estado_inicial
- if (posNodo->item_nombre != NULL){
- item_nombre = gnome_canvas_item_new (group,
- gnome_canvas_text_get_type (),
- "text", posNodo->nombre.c_str(),
- "x", (x2+x1)/2,
- "y", (y2+y1)/2,
- "font", "Sans 28",
- "anchor", GTK_ANCHOR_CENTER,
- "fill_color", "black",
- NULL);
-
- gnome_canvas_item_raise_to_top (item_nombre);
-
- gnome_canvas_item_hide(item_nombre);
-
- reemplazar_nombre_nodo_subautomata(posNodoSub->idSub, posNodo->item_nombre, item_nombre);
- }
-
- if (posNodo->estado_inicial != NULL){
- inicial = gnome_canvas_item_new(group,
- gnome_canvas_ellipse_get_type(),
- "x1", x1 + 5,
- "y1", y1 + 5,
- "x2", x2 - 5,
- "y2", y2 - 5,
- "fill_color_rgba", NULL,
- "outline_color", "black",
- "width_units", 1.0,
- NULL);
-
- gnome_canvas_item_hide(inicial);
-
- reemplazar_estado_inicial_subautomata(posNodoSub->idSub, posNodo->estado_inicial, inicial);
- }
-
- posNodo++;
- }//Terminamos de recorrer la lista de elementos
-
-
- posNodoSub = ListaSubAutomatas.begin();
-
- while(posNodoSub->idSub != idSubGlobal)
- {
- posNodoSub++;
- }
-
- //Ahora tenemos que hacer un proceso de sustitucion equivalente para las transiciones
- posTrans = posNodoSub->ListaTransicionesSub.begin();
-
- while(posTrans != posNodoSub->ListaTransicionesSub.end())
- {
- if(posTrans->origen == posTrans->destino){
-
- item = pinta_autotransicion(posTrans->destino);
- //La ocultamos
- gnome_canvas_item_hide(item);
-
- }else{
-
- item = pinta_transicion(posTrans->origen,posTrans->destino);
- //La ocultamos
- gnome_canvas_item_hide(item);
-
- }
-
- reemplazar_transicion_subautomata(posNodoSub->idSub, posTrans->item, item);
-
- //Repetimos el proceso para el item_nombre
- if (posTrans->item_nombre != NULL){
-
- list_items = GNOME_CANVAS_GROUP(item)->item_list;
- box = (GnomeCanvasItem *) g_list_nth_data (list_items, g_list_length (list_items)-1);
-
- get_bounds (box, &x1, &y1, &x2, &y2);
-
- item_nombre = gnome_canvas_item_new (root,
- gnome_canvas_text_get_type (),
- "text", posTrans->nombre.c_str(),
- "x", (x2+x1)/2,
- "y", (y2+y1)/2 + 5 ,
- "font", "Sans 28",
- "anchor", GTK_ANCHOR_N,
- "fill_color", "black",
- NULL);
-
- gnome_canvas_item_raise_to_top (item_nombre);
- gnome_canvas_item_hide(item_nombre);
-
- reemplazar_nombre_trans_subautomata(posNodoSub->idSub, posTrans->item_nombre, item_nombre);
- }
-
- posTrans++;
- }//Terminamos de recorrer la lista de transiciones
-
- //Terminadas las gestiones en el nivel hay que comprobar si hay más subautómatas hijos que se
- //desplieguen a partir de este nivel
- posNodo = posNodoSub->ListaElementosSub.begin();
-
- while(posNodo != posNodoSub->ListaElementosSub.end()){
-
- if (posNodo->idHijo != 0){
-
- padre = idSubGlobal;
-
- hijo = posNodo->idHijo;
-
- idSubGlobal++;
-
- printf("Entra por pegado recursivo, idsubglobal: %d\n",idSubGlobal);
-
- //El hijo es este porque ahora llamaremos al proceso de pegado recursivo que creará un
- //subautomata con esta ID
- posNodo->idHijo = idSubGlobal;
-
- pegado_recursivo(hijo, padre);
-
- //posNodo->idHijo = padre;
- printf("Entra por pegado recursivo, posNodo->idHijo: %d\n",posNodo->idHijo);
-
- }
-
- posNodo++;
- }
-
- //Aumentamos la variable idSubGlobal por si no se desplegaron hijos en la llamada
- //para que quede con un valor válido
- idSubGlobal++;
-
- printf("termina un pegado recursivo, idsubglobal: %d\n",idSubGlobal);
-
-}
-
-void
-on_menu_pegar(){
-
- GnomeCanvasItem *item;
- GnomeCanvasGroup *group;
-
- tNodo reg;
-
- list<tSubAut>::iterator posSub; //Añadido para poder iterar en la lista de subautomatas y actulizar el treeview con cada nuevo estado
-
- points = gnome_canvas_points_new(2); /* 2 puntos */
-
-
- printf("menu pegar\n");
- printf("codigo: %s \n", estado_clipboard_codigo.c_str());
- printf("idHijo: %d \n", estado_clipboard_idHijo);
-
-
- points->coords[0] = origenX;
- points->coords[1] = origenY;
- points->coords[2] = origenX;
- points->coords[3] = origenY;
-
- printf("Click %d, %d\n", origenX, origenY);
- //printf("Pintamos Nodo \n");
-
- if (estado_clipboard)
- {
-
- printf("Antes de group\n");
- group = GNOME_CANVAS_GROUP (gnome_canvas_item_new (root,
- gnome_canvas_group_get_type (),
- "x", 0,
- "y", 0,
- NULL));
- printf("despues de group\n");
- if (estado_clipboard_idHijo == 0){
-
- printf("entra por el if\n");
-
- item = gnome_canvas_item_new(group,
- gnome_canvas_ellipse_get_type(),
- "x1", (double) origenX-20,
- "y1", (double) origenY-20,
- "x2", (double) (origenX + 20),
- "y2", (double) (origenY + 20),
- "fill_color_rgba", 0x00ffffff,
- "outline_color", "black",
- "width_units", 1.0,
- NULL);
- printf("despues de crear item\n");
-
- reg.idHijo = estado_clipboard_idHijo;
- printf("despues de reg.idHijo\n");
-
- }else{
-
- printf("entra por el else\n");
-
- item = gnome_canvas_item_new(group,
- gnome_canvas_ellipse_get_type(),
- "x1", (double) origenX-20,
- "y1", (double) origenY-20,
- "x2", (double) (origenX + 20),
- "y2", (double) (origenY + 20),
- "fill_color_rgba", 0x00ff66ff,
- "outline_color", "black",
- "width_units", 1.0,
- NULL);
-
- //Si el estado que habiamos copiado tenia hijos hay que hacer copia de toda la estructura que enlazase por debajo
- //Asignamos como hijo al nodo copiado la variable idSubGlobal porque ahora llamaremos a una funcion recursiva que empezará
- //creando un nuevo nodo en la lista de subautomatas y lo hará con esa idSubGlobal
- reg.idHijo = idSubGlobal;
-
-
- printf("Antes de llamar a pegado recursivo\n");
- //Las dos variables que el procedimiento necesita son el subautomata a buscar en la lista para poder copiartlo y cual será su padre
- pegado_recursivo(estado_clipboard_idHijo, subautomata_mostrado);
- printf("Despues de llamar a pegado recursivo\n");
-
- }
-
-
-
- reg.item = item;
- reg.item_nombre = NULL;
- reg.estado_inicial = NULL;
- reg.nombre = "";
- reg.codigo = estado_clipboard_codigo;
- id ++;
-
- ListaElementos.push_back(reg);
-
- printf("Despues de añadir nuevo nodo en el nivel \n");
-
- /*Añadimos control (señal) al item creado*/
- g_signal_connect (group, "event",
- (GtkSignalFunc) item_event,
- NULL);
-
- estado_clipboard = FALSE;
- estado_clipboard_codigo = "";
- estado_clipboard_idHijo = 0;
-
-
- //Actualizamos datos necesarios para mostrar cambios en el tree view
- posSub = ListaSubAutomatas.begin();
-
- while(posSub->idSub != subautomata_mostrado)
- {
- posSub++;
- }
-
- //guardamos el estado de la lista de elementos en el nodo del subautomata para poder recargar bien el tree view
- posSub->ListaElementosSub = ListaElementos;
-
- actualizar_tree_view();
-
- gtk_tree_view_expand_to_path(GTK_TREE_VIEW(tree_view), arbolPath);
-
- }
-
- printf("Pasa del if\n");
-
- estado_clipboard = FALSE;
- estado_clipboard_codigo = "";
- estado_clipboard_idHijo = 0;
-
-}
-
Deleted: trunk/src/stable/components/visualHFSM/reemplazar.cpp
===================================================================
--- trunk/src/stable/components/visualHFSM/reemplazar.cpp 2013-10-18 17:52:43 UTC (rev 1065)
+++ trunk/src/stable/components/visualHFSM/reemplazar.cpp 2013-10-18 19:29:33 UTC (rev 1066)
@@ -1,96 +0,0 @@
-
-
-#include "reemplazar.h"
-
-
-
-/* Halla la longitud de una cadena, hace las veces de strlen */
-int longitud(char *cadena)
-{
- int i;
- for(i=0; ;i++)
- if(cadena[i]=='\0')
- break;
- return i;
-}
-
-/* Halla la posicion de aparicion de una subcadena en una cadena */
-int posicion(char *cadena, char *subcadena)
-{
- int i, j;
-
- for(i=0; i<longitud(cadena); i++)
- {
- if(cadena[i]==subcadena[0])
- {
- //if(longitud(cadena)-i < longitud(subcadena))
- // return -1;
-
- for(j=0; j<longitud(subcadena); j++)
- {
- if(cadena[i+j]!=subcadena[j])
- break;
- }
- if(j==longitud(subcadena))
- return i;
- }
- }
-
- return -1;
-}
-
-/*
- Busca una subcadena en una cadena, y la reemplaza por otra;
- retorna el numero de veces que se hizo el reemplazo
-*/
-int reemplazar2(char *cadena, char *subcadena, char *reemplazo)
-{
- int ocurrencias = 0;
- int i, indice, posiciones, temp, l_cadena, l_subcadena, l_reemplazo;
- int tam;
- char * cadena_aux;
-
- l_cadena = longitud(cadena);
- l_reemplazo = longitud(reemplazo);
- l_subcadena = longitud(subcadena);
-
- for(;;)
- {
- indice = posicion(cadena, subcadena);
- if(indice==-1)
- break;
- else
- {
- printf("NO -1");
- tam = l_subcadena-l_reemplazo;
- if (tam < 0)
- {
- printf("0");
- for(i=indice; i<indice+l_subcadena; i++)
- cadena_aux[i-indice] = cadena[i];
- cadena_aux[i] = '\0';
- printf("1");
- for(i=indice; i<indice+l_reemplazo; i++)
- cadena[i]=reemplazo[i-indice];
- printf("2");
- for(i=indice+l_reemplazo; i<longitud(cadena_aux); i++)
- cadena[i]=cadena_aux[i-indice-l_reemplazo];
- }else
- {
- for(i=indice; i<indice+l_reemplazo; i++)
- cadena[i]=reemplazo[i-indice];
-
- /* Si la longitud del reemplazo es menor que la de la subcadena,
- recorre caracteres siguientes, posiciones a la izquierda */
- posiciones=l_subcadena-l_reemplazo;
- if(posiciones>0)
- for(temp=i; temp<=l_cadena; temp++)
- cadena[temp]=cadena[temp+posiciones];
- }
- ocurrencias++;
- }
- }
-
- return ocurrencias;
-}
-
More information about the Jderobot-admin
mailing list