00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "jed_defs.h"
00023
00024 #include <stdio.h>
00025 #include <string.h>
00026 #include <stdlib.h>
00027 #include "framework/gui/jed_menu.h"
00028 #include "lista.cc"
00029
00030 #ifdef GLUT_ENABLED
00031 #include <GL/glut.h>
00032 #endif
00033
00034 #ifdef MOTIF_ENABLED
00035 #include <Xm/Xm.h>
00036 #include <Xm/CascadeB.h>
00037 #include <Xm/MenuShell.h>
00038 #include <Xm/PushB.h>
00039 #include <Xm/RowColumnP.h>
00040 #include <Xm/Separator.h>
00041 #include <Xm/ToggleB.h>
00042 #include <Xm/ToggleBG.h>
00043
00044 #include "framework/gui/_motifcb.h"
00045 #endif
00046
00047 #ifdef WXWINDOWS_ENABLED
00048 #include "framework/gui/_wxwindows.h"
00049 #endif
00050
00051
00052
00053 #define ESPERO(tipo, msg) if ( tipo_token != (tipo) ) { fprintf(stderr,"<GUI_COMANDO> ERROR: Esperaba %s y recibi [%s].\n", (msg), cad); fflush(stderr); return FALSE; }
00054
00055 #define ESPERO_MENU(tipo, msg) if ( tipo_token != (tipo) ) { fprintf(stderr,"<GUI_MENU> ERROR: Esperaba %s y recibi [%s].\n", (msg), cad); fflush(stderr); return FALSE; }
00056
00057 #define CARGAR_CADENA(destino, origen) if ( (destino) ) delete (destino); des_comille((origen)); (destino) = new char[strlen((origen))+1]; if ( !(destino) ) { fprintf(stderr, "<GUI_COMANDO>-ERROR: No hay memoria para una cadenita!"); fflush(stderr); return FALSE; } strcpy((destino), (origen));
00058
00059
00060
00061
00062
00063 GUI_COMANDO::GUI_COMANDO()
00064 {
00065 _id = -666;
00066 _nombre = NULL;
00067 resumen = NULL;
00068 ayuda = NULL;
00069 _archivo_icono = NULL;
00070 }
00071
00072 GUI_COMANDO::~GUI_COMANDO()
00073 {
00074 ;
00075 }
00076
00077 int
00078 GUI_COMANDO::id(void)
00079 {
00080 return _id;
00081 }
00082
00083 char *
00084 GUI_COMANDO::nombre(void)
00085 {
00086 return _nombre;
00087 }
00088
00089 char *
00090 GUI_COMANDO::archivo_icono(void)
00091 {
00092 return _archivo_icono;
00093 }
00094
00095 BOOLEAN
00096 GUI_COMANDO::concatenar_ayuda(char *cola)
00097 {
00098 char *nueva;
00099
00100 des_comille(cola);
00101
00102 if ( ayuda ) {
00103 nueva = new char[strlen(ayuda) + strlen(cola) + 1];
00104 }
00105 else {
00106 nueva = new char[strlen(cola) + 1];
00107 }
00108
00109 if ( !nueva ) return FALSE;
00110
00111 if ( !ayuda ) {
00112 ayuda = nueva;
00113 strcpy(ayuda, cola);
00114 return TRUE;
00115 }
00116
00117 sprintf(nueva, "%s%s", ayuda, cola);
00118 delete ayuda;
00119 ayuda = nueva;
00120
00121 return TRUE;
00122 }
00123
00124 void
00125 GUI_COMANDO::imprimir(void)
00126 {
00127 printf("<GUI_COMANDO> Reporte para \"%s\":\n", _nombre);
00128 printf(" - Identificador: %d\n", _id);
00129 printf(" - Resumen: \"%s\"\n", resumen);
00130 printf(" - Icono: \"%s\"\n", _archivo_icono);
00131 printf(" - AYUDA:\n%s\n-- Fin de comando --\n", ayuda);
00132 }
00133
00134 BOOLEAN
00135 GUI_COMANDO::leer(TOKENIZADOR *Sabiondo, LISTA<GUI_CONSTANTE_ENTERA *> *Tabla_idcs)
00136 {
00137 char cad[1000];
00138 int tipo_token = TK_DESCONOCIDO, pos, i;
00139
00140 pos = 0;
00141 while ( tipo_token != TK_CERRAR) {
00142 tipo_token = Sabiondo->siguiente_token(cad);
00143 switch ( pos ) {
00144 case 0:
00145 ESPERO(TK_IDENTIFICADOR, "una constante textual");
00146
00147 for ( i = 0; i < Tabla_idcs->tam(); i++ ) {
00148 if ( strcmp((*Tabla_idcs)[i]->nombre, cad) == 0 ) {
00149 _id = (*Tabla_idcs)[i]->valor;
00150 break;
00151 }
00152 }
00153
00154 if ( i >= Tabla_idcs->tam() ) {
00155 fprintf(stderr, "<GUI_COMANDO> - Warning: "
00156 "la constante %s no esta definida.\n", cad);
00157 fflush(stderr);
00158 }
00159 pos++;
00160 break;
00161 case 1: ESPERO(TK_ABRIR, "\"{\""); pos++; break;
00162 default:
00163 if ( tipo_token == TK_CERRAR ) break;
00164 ESPERO(TK_IDENTIFICADOR, "un identificador (1)");
00165 if ( strstr(cad, "nombre") ) {
00166 tipo_token = Sabiondo->siguiente_token(cad);
00167 ESPERO(TK_CADENA, "una cadena con un nombre");
00168 CARGAR_CADENA(_nombre, cad);
00169 }
00170 else if ( strstr(cad, "resumen") ) {
00171 tipo_token = Sabiondo->siguiente_token(cad);
00172 ESPERO(TK_CADENA, "una cadena con un resumen");
00173 CARGAR_CADENA(resumen, cad);
00174 }
00175 else if ( strstr(cad, "ayuda") ) {
00176 tipo_token = Sabiondo->siguiente_token(cad);
00177 ESPERO(TK_CADENA, "una cadena con ayuda");
00178 if ( !concatenar_ayuda(cad) ) return FALSE;
00179 }
00180 else if ( strstr(cad, "icono") ) {
00181 tipo_token = Sabiondo->siguiente_token(cad);
00182 ESPERO(TK_CADENA, "una cadena con un archivo de icono");
00183 CARGAR_CADENA(_archivo_icono, cad);
00184 }
00185 else {
00186 fprintf(stderr,
00187 "<GUI_COMANDO> - Warning: Tipo \"%s\" desconocido.\n", cad);
00188 fflush(stderr);
00189 }
00190
00191 ;
00192 break;
00193 }
00194 }
00195
00196 return TRUE;
00197 }
00198
00199
00200
00201
00202
00203 static int nivel = 0;
00204
00205 GUI_ELEMENTO::~GUI_ELEMENTO()
00206 {
00207 ;
00208 }
00209
00210
00211
00212
00213
00214 REFERENCIA_GUI::REFERENCIA_GUI(char *n, JED_INTERFACE *i)
00215 {
00216 nombre = new char[strlen(n) + 1];
00217 if ( !nombre ) {
00218 return;
00219 }
00220 strcpy(nombre, n);
00221
00222 Ref = NULL;
00223 Interface = i;
00224 }
00225
00226 REFERENCIA_GUI::~REFERENCIA_GUI()
00227 {
00228 if ( nombre ) delete nombre;
00229 }
00230
00231 void
00232 REFERENCIA_GUI::imprimir(void)
00233 {
00234 int i;
00235
00236 for ( i = 0; i < nivel+1; i++ ) printf(" ");
00237 printf("{Referencia al menu %s}\n", nombre);
00238 }
00239
00240 #ifdef GLUT_ENABLED
00241 void
00242 REFERENCIA_GUI::crear_glut(int padre)
00243 {
00244 if ( !Ref ) {
00245 Ref = Interface->resolver_menu(nombre);
00246 }
00247
00248 if ( !Ref ) {
00249 glutSetMenu(padre);
00250 glutAddMenuEntry("<Mala Referencia!>", -666);
00251 }
00252 Ref->insertar_glut(padre);
00253 }
00254 #endif
00255
00256 #ifdef MOTIF_ENABLED
00257
00258 Widget
00259 REFERENCIA_GUI::crear_motif(Widget padre, int )
00260 {
00261 if ( !Ref ) {
00262 Ref = Interface->resolver_menu(nombre);
00263 }
00264
00265 if ( !Ref ) {
00266 return XtVaCreateManagedWidget("[INCLUDE MALITO!]",
00267 xmPushButtonWidgetClass, padre, NULL);
00268 }
00269 Ref->insertar_motif(padre);
00270 return padre;
00271 }
00272
00273 Widget
00274 REFERENCIA_GUI::crear_motif(Widget padre)
00275 {
00276 return crear_motif(padre, TM_PULLDOWN);
00277 }
00278
00279 #endif // MOTIF_ENABLED
00280
00281 #if PLATAFORMA == i386_WIN32_VC
00282
00283 BOOLEAN
00284 REFERENCIA_GUI::crear_mswin32sdk(HMENU padre)
00285 {
00286 char cad[200] = "[INCLUDE MALITO!]";
00287 MENUITEMINFO opcion = {
00288 sizeof(MENUITEMINFO),
00289
00290 MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_TYPE,
00291 MFT_STRING,
00292 MFS_ENABLED,
00293 666,
00294 NULL,
00295 NULL,
00296 NULL,
00297 666,
00298 cad,
00299 strlen(cad)
00300 };
00301
00302 if ( !Ref ) Ref = Interface->resolver_menu(nombre);
00303
00304 if ( !Ref ) {
00305 if ( !padre || !InsertMenuItem(padre, 0, TRUE, &opcion) ) {
00306 return FALSE;
00307 }
00308 }
00309 else {
00310 return Ref->insertar_mswin32sdk(padre);
00311 }
00312 return TRUE;
00313 }
00314
00315 #endif // i386_WIN32_VC
00316
00317 #ifdef WXWINDOWS_ENABLED
00318 wxMenu *
00319 REFERENCIA_GUI::crear_wxw(wxMenu *Padre, int )
00320 {
00321 if ( !Ref ) {
00322 Ref = Interface->resolver_menu(nombre);
00323 }
00324
00325 if ( Ref ) {
00326 Ref->crear_wxw(Padre, TM_PULLDOWN);
00327 }
00328
00329 return NULL;
00330 }
00331
00332 #endif
00333
00334
00335
00336
00337
00338 SEPARADOR::~SEPARADOR()
00339 {
00340 ;
00341 }
00342
00343 void
00344 SEPARADOR::imprimir(void)
00345 {
00346 int i;
00347
00348 for ( i = 0; i < nivel+1; i++ ) printf(" ");
00349 printf("------------\n");
00350 }
00351
00352 #ifdef GLUT_ENABLED
00353 void
00354 SEPARADOR::crear_glut(int padre)
00355 {
00356 glutSetMenu(padre);
00357 glutAddMenuEntry("--------", -666);
00358 }
00359 #endif
00360
00361 #ifdef MOTIF_ENABLED
00362 Widget
00363 SEPARADOR::crear_motif(Widget padre)
00364 {
00365 return XtVaCreateManagedWidget("--------", xmSeparatorWidgetClass, padre,
00366 XmNorientation, XmHORIZONTAL,
00367 XmNbottomAttachment, XmATTACH_FORM, XmNbottomOffset, 2,
00368 XmNrightAttachment, XmATTACH_FORM, XmNrightOffset, 2,
00369 XmNleftAttachment, XmATTACH_FORM, XmNleftOffset, 2,
00370 NULL);
00371 }
00372 #endif
00373
00374 #if PLATAFORMA == i386_WIN32_VC
00375
00376 BOOLEAN
00377 SEPARADOR::crear_mswin32sdk(HMENU padre)
00378 {
00379 char cad[200] = "<SEPARADOR>";
00380
00381 MENUITEMINFO opcion = {
00382 sizeof(MENUITEMINFO),
00383
00384 MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_TYPE,
00385 MFT_SEPARATOR,
00386 MFS_ENABLED,
00387 666,
00388 NULL,
00389 NULL,
00390 NULL,
00391 666,
00392 cad,
00393 strlen(cad)
00394 };
00395
00396 if ( !padre || !InsertMenuItem(padre, 0, TRUE, &opcion) ) {
00397 return FALSE;
00398 }
00399 return TRUE;
00400 }
00401
00402 #endif // i386_WIN32_VC
00403
00404 #ifdef WXWINDOWS_ENABLED
00405 wxMenu *
00406 SEPARADOR::crear_wxw(wxMenu *Padre, int )
00407 {
00408 Padre->AppendSeparator();
00409 return NULL;
00410 }
00411
00412 #endif
00413
00414
00415
00416
00417
00418 OPCION::OPCION(char *name, int id)
00419 {
00420 flags = 0x00;
00421 idc = id;
00422 nombre = new char[strlen(name) + 1];
00423 if ( !nombre ) return;
00424 strcpy(nombre, name);
00425 }
00426
00427 OPCION::~OPCION()
00428 {
00429 if ( nombre ) delete nombre;
00430 }
00431
00432 void
00433 OPCION::check(void)
00434 {
00435 flags |= OF_CHECKED;
00436 flags |= OF_BINARY;
00437 }
00438
00439 void
00440 OPCION::uncheck(void)
00441 {
00442 flags &= ~OF_CHECKED;
00443 flags |= OF_BINARY;
00444 }
00445
00446 void
00447 OPCION::enable(void)
00448 {
00449 flags &= ~OF_GRAYED;
00450 }
00451
00452 void
00453 OPCION::disable(void)
00454 {
00455 flags |= OF_GRAYED;
00456 }
00457
00458 void
00459 OPCION::imprimir(void)
00460 {
00461 int i;
00462
00463 for ( i = 0; i < nivel+1; i++ ) printf(" ");
00464 printf("- %s, IDC = %d ", nombre, idc);
00465
00466
00467 if ( flags & OF_CHECKED ) {
00468 printf("<C> ");
00469 }
00470 else {
00471 printf("<UC> ");
00472 }
00473
00474
00475 if ( flags & OF_GRAYED ) {
00476 printf("<G> ");
00477 }
00478 else {
00479 printf("<UG> ");
00480 }
00481 printf("\n");
00482 }
00483
00484 int
00485 OPCION::id(void)
00486 {
00487 return idc;
00488 }
00489
00490 #ifdef GLUT_ENABLED
00491
00492 void
00493 procesar_nombre_glut(char *nuevo_nombre, char *nombre)
00494 {
00495 char *ptr;
00496
00497 strcpy(nuevo_nombre, nombre);
00498
00499
00500 ptr = strchr(nuevo_nombre, '\\');
00501 if ( ptr && ptr[1] == 't' ) ptr[0] = '\0';
00502 for ( ptr = strchr(nuevo_nombre, '\\'); ptr;
00503 ptr = strchr(nuevo_nombre, '\\') ) {
00504 for ( ; ptr != NULL && ptr[2]; ptr++ ) ptr[0] = ptr[2];
00505 ptr[0] = '\0';
00506 }
00507
00508 ptr = strchr(nuevo_nombre, '&');
00509 if ( ptr ) {
00510 for ( ; ptr != NULL && ptr[1]; ptr++ ) ptr[0] = ptr[1];
00511 ptr[0] = '\0';
00512 }
00513 }
00514
00515 void
00516 OPCION::crear_glut(int padre)
00517 {
00518 char *nuevo_nombre = new char[strlen(nombre)+1];
00519
00520 if ( !nuevo_nombre ) {
00521 glutSetMenu(padre);
00522 glutAddMenuEntry("<ERROR!>", idc);
00523 return;
00524 }
00525
00526 procesar_nombre_glut(nuevo_nombre, nombre);
00527
00528 glutSetMenu(padre);
00529 glutAddMenuEntry(nuevo_nombre, idc);
00530 }
00531 #endif
00532
00533 #ifdef MOTIF_ENABLED
00534
00535 char ACCEL_x[20] = "";
00536 char ACCEL_name[20] = "<Alt>-C";
00537 BOOLEAN SOY_ayuda = FALSE;
00538
00539 void
00540 procesar_acelerador_Xt(char *cad)
00547 {
00548 char tecla[2] = "\0";
00549 BOOLEAN p = FALSE;
00550 char *ptr;
00551
00552 strcpy(ACCEL_name, cad);
00553
00554 if ( strstr(cad, "ESC") ) {
00555 sprintf(ACCEL_x, "<Key>Escape");
00556 return;
00557 }
00558
00559 if ( strlen(cad) <= 1 ) {
00560 tecla[0] = cad[0];
00561 }
00562 else {
00563 ptr = strchr(cad, '+');
00564 if ( ptr ) tecla[0] = *(ptr+1);
00565 }
00566
00567 ACCEL_x[0] = '\0';
00568 if ( strstr(cad, "Alt ") ) { strcat(ACCEL_x, "Alt"); p = TRUE; }
00569 if ( strstr(cad, "Ctrl ") ) {
00570 if ( p ) strcat(ACCEL_x, " + ");
00571 strcat(ACCEL_x, "Ctrl");
00572 p = TRUE;
00573 }
00574
00575 strcat(ACCEL_x, "<Key> ");
00576 strcat(ACCEL_x, tecla);
00577 }
00578
00579 BOOLEAN
00580 procese_nombre_gui(char *nombre, char *Mnemonico, char *nuevo_nombre)
00589 {
00590 unsigned i;
00591 char *ptr;
00592 BOOLEAN r = FALSE;
00593
00594 strcpy(nuevo_nombre, nombre);
00595
00596
00597 ptr = strchr(nuevo_nombre, '\\');
00598 if ( ptr && ptr[1] == 'a' ) {
00599 (*Mnemonico) = ptr[1];
00600
00601 for ( i = 0; i < strlen(nuevo_nombre) && ptr != NULL; i++,ptr++ ) {
00602 ptr[0] = ptr[2];
00603 }
00604 SOY_ayuda = TRUE;
00605 }
00606 else if ( ptr && ptr[1] == 't' ) {
00607
00608 ptr[0] = '\0';
00609 r = TRUE;
00610 procesar_acelerador_Xt(&ptr[2]);
00611 }
00612
00613
00614 ptr = strchr(nuevo_nombre, '&');
00615 if ( ptr ) {
00616 (*Mnemonico) = ptr[1];
00617
00618 for ( i = 0; i < strlen(nuevo_nombre) && ptr != NULL; i++,ptr++ ) {
00619 ptr[0] = ptr[1];
00620 }
00621 }
00622 else {
00623 (*Mnemonico) = '\0';
00624 }
00625
00626 return r;
00627 }
00628
00629 Widget
00630 OPCION::crear_motif(Widget padre)
00631 {
00632 Widget opcion;
00633 char mnemonico = '\0';
00634 char nombre_motif[80];
00635 BOOLEAN tengo_acelerador = FALSE;
00636 XmString xmstr;
00637
00638 tengo_acelerador = procese_nombre_gui(nombre, &mnemonico, nombre_motif);
00639
00640 if ( !(flags & OF_BINARY) ) {
00641 opcion = XtVaCreateManagedWidget(nombre_motif,xmPushButtonWidgetClass,
00642 padre, XmNshadowThickness, 2, XmNmnemonic, mnemonico, NULL);
00643 XtAddCallback(opcion, XmNactivateCallback,
00644 motif_ejecutor, (void *)&(this->idc));
00645 }
00646 else {
00647
00648 opcion = XtVaCreateManagedWidget(nombre_motif,
00649 xmToggleButtonGadgetClass, padre, XmNmnemonic, mnemonico,
00650
00651 XmNvisibleWhenOff, True, NULL);
00652 XtAddCallback(opcion, XmNvalueChangedCallback,
00653 motif_ejecutor, (void *)&(this->idc));
00654 XtManageChild(opcion);
00655 if ( flags & OF_CHECKED ) {
00656 XmToggleButtonSetState(opcion, True, False);
00657 }
00658 else {
00659 XmToggleButtonSetState(opcion, False, False);
00660 }
00661 }
00662
00663 if ( tengo_acelerador ) {
00664 if ( strlen(ACCEL_x) > 0 ) {
00665 printf("<OPCION::crear_motif> Acelerador \"%s\"\n", ACCEL_x);
00666 fflush(stdout);
00667 xmstr = XmStringCreateLocalized(ACCEL_x);
00668
00669
00670 XmStringFree(xmstr);
00671 ACCEL_x[0] = '\0';
00672 }
00673 xmstr = XmStringCreateLocalized(ACCEL_name);
00674 XtVaSetValues(opcion, XmNacceleratorText, xmstr, NULL);
00675 XmStringFree(xmstr);
00676 }
00677
00678 return opcion;
00679 }
00680
00681 #endif // MOTIF_ENABLED
00682
00683 #if PLATAFORMA == i386_WIN32_VC
00684
00685 BOOLEAN
00686 OPCION::crear_mswin32sdk(HMENU padre)
00687 {
00688 char cad[200];
00689
00690 strcpy(cad, nombre);
00691
00692
00693 int i, j;
00694 for ( i = 0; cad[i]; i++ ) {
00695 if ( cad[i] == '\\' && cad[i+1] == 't' ) {
00696 cad[i] = '\t';
00697 i++;
00698 for ( j = i; cad[j]; j++ ) {
00699 cad[j] = cad[j+1];
00700 }
00701 }
00702 if ( cad[i] == '\\' && cad[i+1] == 'a' ) {
00703 cad[i] = '\a';
00704 i++;
00705 for ( j = i; cad[j]; j++ ) {
00706 cad[j] = cad[j+1];
00707 }
00708 }
00709 }
00710
00711 MENUITEMINFO opcion = {
00712 sizeof(MENUITEMINFO),
00713
00714 MIIM_TYPE | MIIM_STATE | MIIM_ID | MIIM_DATA,
00715 MFT_STRING,
00716 MFS_ENABLED,
00717 idc,
00718 NULL,
00719 NULL,
00720 NULL,
00721 666,
00722 cad,
00723 strlen(cad)
00724 };
00725
00726 if ( !padre || !InsertMenuItem(padre, 0, TRUE, &opcion) ) {
00727 return FALSE;
00728 }
00729 return TRUE;
00730 }
00731
00732 #endif // i386_WIN32_VC
00733
00734 #ifdef WXWINDOWS_ENABLED
00735 wxMenu *
00736 OPCION::crear_wxw(wxMenu *Padre, int tipo_menu)
00737 {
00738 char cad[200];
00739
00740 strcpy(cad, nombre);
00741
00742
00743 int i, j;
00744 for ( i = 0; cad[i]; i++ ) {
00745 if ( cad[i] == '\\' && cad[i+1] == 't' ) {
00746 cad[i] = '\t';
00747 i++;
00748 for ( j = i; cad[j]; j++ ) {
00749 cad[j] = cad[j+1];
00750 }
00751 }
00752 if ( cad[i] == '\\' && cad[i+1] == 'a' ) {
00753 cad[i] = '\a';
00754 i++;
00755 for ( j = i; cad[j]; j++ ) {
00756 cad[j] = cad[j+1];
00757 }
00758 }
00759 }
00760
00761 Padre->Append(idc, cad);
00762
00763 return NULL;
00764 }
00765
00766 #endif
00767
00768
00769
00770
00771
00772 GUI_MENU::GUI_MENU(LISTA<GUI_CONSTANTE_ENTERA *> *tabla_constantes)
00773 {
00774 Tabla_idcs = tabla_constantes;
00775 _nombre = NULL;
00776 }
00777
00778 GUI_MENU::~GUI_MENU()
00779 {
00780 if ( _nombre ) delete _nombre;
00781 }
00782
00783 char *
00784 GUI_MENU::nombre(void)
00785 {
00786 return _nombre;
00787 }
00788
00789 void
00790 GUI_MENU::imprimir(void)
00791 {
00792 int i;
00793
00794 for ( i = 0; i < nivel+1; i++ ) printf(" ");
00795 printf("[%s]:\n", _nombre);
00796
00797 nivel++;
00798 for ( i = 0; i < lista_hijos.tam(); i++ ) {
00799 lista_hijos[i]->imprimir();
00800 }
00801 nivel--;
00802 }
00803
00804 BOOLEAN
00805 GUI_MENU::leer(TOKENIZADOR *Sabiondo, JED_INTERFACE *I)
00806 {
00807 char cad[1000], nombre_opcion[1000];
00808 int tipo_token = TK_DESCONOCIDO, pos, i, idc = -666;
00809 OPCION *Opcion = NULL;
00810 GUI_MENU *Menu;
00811 SEPARADOR *Separador;
00812 REFERENCIA_GUI *Referencia;
00813
00814 pos = 1;
00815 while ( tipo_token != TK_CERRAR) {
00816 tipo_token = Sabiondo->siguiente_token(cad);
00817 switch ( pos ) {
00818 case 1:
00819 ESPERO_MENU(TK_CADENA, "Un nombre de menu"); pos++;
00820 des_comille(cad);
00821 _nombre = new char[strlen(cad) + 1];
00822 if ( !_nombre ) {
00823 fprintf(stderr, "<GUI_MENU> - ERROR: No hay memoria para "
00824 "crear una cadenita!\n");
00825 fflush(stderr);
00826 return FALSE;
00827 }
00828 strcpy(_nombre, cad);
00829 break;
00830 case 2: ESPERO(TK_ABRIR, "\"{\""); pos++; break;
00831 default:
00832 if ( tipo_token == TK_CERRAR ) break;
00833 ESPERO_MENU(TK_IDENTIFICADOR, "un submenu, opcion o separador");
00834 if ( strcmp(cad, "MENU") == 0 || strcmp(cad, "POPUP") == 0 ) {
00835 Menu = new GUI_MENU(Tabla_idcs);
00836 if ( !Menu ) {
00837 fprintf(stderr, "<GUI_MENU> - ERROR: No hay memoria para "
00838 "crear un sub-menu!\n");
00839 fflush(stderr);
00840 return FALSE;
00841 }
00842 Menu->leer(Sabiondo, I);
00843 lista_hijos.anx(Menu);
00844 }
00845 else if ( strcmp(cad, "MENUITEM") == 0 ) {
00846 tipo_token = Sabiondo->siguiente_token(cad);
00847 if ( strcmp(cad, "SEPARATOR") == 0 ) {
00848 Separador = new SEPARADOR;
00849 if ( !Separador ) {
00850 fprintf(stderr, "<GUI_MENU> - ERROR: No hay memoria para "
00851 "crear un separadorcito!\n");
00852 fflush(stderr);
00853 return FALSE;
00854 }
00855 lista_hijos.anx(Separador);
00856 }
00857 else {
00858 ESPERO_MENU(TK_CADENA, "un nombre de opcion");
00859 strcpy(nombre_opcion, cad);
00860 des_comille(nombre_opcion);
00861
00862 tipo_token = Sabiondo->siguiente_token(cad);
00863 ESPERO_MENU(TK_IDENTIFICADOR, "una constante");
00864
00865 for ( i = 0; i < Tabla_idcs->tam(); i++ ) {
00866 if ( strcmp(cad, (*Tabla_idcs)[i]->nombre) == 0 ) {
00867 idc = (*Tabla_idcs)[i]->valor;
00868 break;
00869 }
00870 }
00871 if ( i >= Tabla_idcs->tam() ) {
00872
00873
00874
00875
00876 idc = 666;
00877 }
00878
00879 Opcion = new OPCION(nombre_opcion, idc);
00880
00881 if ( !Opcion ) {
00882 fprintf(stderr, "<GUI_MENU> - ERROR: No hay memoria para "
00883 "crear una opcion!\n");
00884 fflush(stderr);
00885 return FALSE;
00886 }
00887
00888 lista_hijos.anx(Opcion);
00889
00890
00891
00892 }
00893 }
00894 else if ( strcmp(cad, "CHECKED") == 0 ) {
00895 Opcion->check();
00896 }
00897 else if ( strcmp(cad, "UNCHECKED") == 0 ) {
00898 Opcion->uncheck();
00899 }
00900 else if ( strcmp(cad, "GRAYED") == 0 ) {
00901 Opcion->disable();
00902 }
00903 else if ( strcmp(cad, "INCLUDE") == 0 ) {
00904 tipo_token = Sabiondo->siguiente_token(cad);
00905 ESPERO_MENU(TK_CADENA, "una referencia a sub-menu");
00906 des_comille(cad);
00907 Referencia = new REFERENCIA_GUI(cad, I);
00908 if ( !Referencia ) {
00909 fprintf(stderr, "<GUI_MENU> - ERROR: No hay memoria para "
00910 "crear una referencia!\n");
00911 fflush(stderr);
00912 return FALSE;
00913 }
00914 lista_hijos.anx(Referencia);
00915 }
00916 else {
00917 fprintf(stderr,
00918 "<GUI_MENU> - Error de sintaxis leyendo %s\n",cad);
00919 fflush(stderr);
00920 return FALSE;
00921 }
00922 }
00923 }
00924
00925 return TRUE;
00926 }
00927
00928 #ifdef GLUT_ENABLED
00929
00930 void (*LAST_callback)(int);
00931
00932 int
00933 GUI_MENU::crear_glut( void (*menu_callback)(int param) )
00934 {
00935 int menu;
00936 int i;
00937
00938 LAST_callback = menu_callback;
00939
00940 menu = glutCreateMenu(menu_callback);
00941 glutSetMenu(menu);
00942
00943 for ( i = 0; i < lista_hijos.tam(); i++ ) {
00944 lista_hijos[i]->crear_glut(menu);
00945 }
00946
00947 return menu;
00948 }
00949
00950 void
00951 GUI_MENU::crear_glut(int padre)
00952 {
00953 char *nuevo_nombre = new char[strlen(_nombre)+1];
00954 int popup;
00955
00956 if ( !nuevo_nombre ) return;
00957 procesar_nombre_glut(nuevo_nombre, _nombre);
00958
00959 popup = glutCreateMenu(LAST_callback);
00960 insertar_glut(popup);
00961 glutSetMenu(padre);
00962 glutAddSubMenu(nuevo_nombre, popup);
00963 }
00964
00965 void
00966 GUI_MENU::insertar_glut(int padre)
00967 {
00968 int i;
00969
00970 for ( i = 0; i < lista_hijos.tam(); i++ ) lista_hijos[i]->crear_glut(padre);
00971 }
00972
00973 #endif
00974
00975 #ifdef MOTIF_ENABLED
00976
00977 Widget
00978 GUI_MENU::crear_motif(Widget padre)
00979 {
00980 return crear_motif(padre, TM_PULLDOWN);
00981 }
00982
00983 void
00984 GUI_MENU::insertar_motif(Widget padre)
00989 {
00990 int i;
00991
00992 for ( i = 0; i < lista_hijos.tam(); i++ ) lista_hijos[i]->crear_motif(padre);
00993 }
00994
00995 Widget
00996 GUI_MENU::crear_motif(Widget padre, int tipo_menu)
00997 {
00998 Widget menu = NULL, opcion = NULL;
00999 Arg arg_arr[10];
01000 int arg_tam;
01001 char nombre_motif[80], mnemonico;
01002
01003 if ( lista_hijos.tam() < 1 ) {
01004 return XtVaCreateManagedWidget("<no tengo hijos!>",
01005 xmPushButtonWidgetClass, padre,
01006 NULL);
01007 }
01008
01009 switch ( tipo_menu ) {
01010 case TM_MENUBAR:
01011 menu = XmCreateMenuBar(padre, "[MENUBAR]", NULL, 0);
01012 XtManageChild(menu);
01013 insertar_motif(menu);
01014 break;
01015 case TM_PULLDOWN: default:
01016 arg_tam = 0;
01017 XtSetArg(arg_arr[arg_tam], XmNtearOffModel, XmTEAR_OFF_ENABLED);
01018 arg_tam++;
01019 menu = XmCreatePulldownMenu(padre, "[PD_MENU]", arg_arr, arg_tam);
01020 XtManageChild(menu);
01021 insertar_motif(menu);
01022 procese_nombre_gui(_nombre, &mnemonico, nombre_motif);
01023 opcion=XtVaCreateManagedWidget(nombre_motif,xmCascadeButtonWidgetClass,
01024 padre, XmNsubMenuId, menu, XmNmnemonic, mnemonico, NULL);
01025 if ( SOY_ayuda ) {
01026 XtVaSetValues(padre, XmNmenuHelpWidget, opcion, NULL);
01027 SOY_ayuda = FALSE;
01028 }
01029 break;
01030 }
01031
01032 return menu;
01033 }
01034
01035 #endif // MOTIF_ENABLED
01036
01037 #if PLATAFORMA == i386_WIN32_VC
01038
01039 BOOLEAN
01040 GUI_MENU::crear_mswin32sdk(HMENU padre)
01041 {
01042 return crear_mswin32sdk(padre, TM_PULLDOWN);
01043 }
01044
01045 BOOLEAN
01046 GUI_MENU::insertar_mswin32sdk(HMENU padre)
01051 {
01052 int i;
01053
01054 for ( i = lista_hijos.tam() - 1; i >= 0; i-- ) {
01055 if ( !lista_hijos[i]->crear_mswin32sdk(padre) ) return FALSE;
01056 }
01057 return TRUE;
01058 }
01059
01060 BOOLEAN
01061 GUI_MENU::crear_mswin32sdk(HMENU padre, int tipo_menu)
01062 {
01063 char cad[200];
01064
01065 popup_id = CreatePopupMenu();
01066 strcpy(cad, _nombre);
01067
01068
01069 int i, j;
01070 for ( i = 0; cad[i]; i++ ) {
01071 if ( cad[i] == '\\' && cad[i+1] == 't' ) {
01072 cad[i] = '\t';
01073 i++;
01074 for ( j = i; cad[j]; j++ ) {
01075 cad[j] = cad[j+1];
01076 }
01077 }
01078
01079
01080 if ( cad[i] == '\\' && cad[i+1] == 'a' ) {
01081 for ( j = i; cad[j]; j++ ) {
01082 cad[j] = cad[j+2];
01083 }
01084 i+=2;
01085 }
01086 }
01087
01088 if ( tipo_menu == TM_PULLDOWN ) {
01089 MENUITEMINFO menucito = {
01090 sizeof(MENUITEMINFO),
01091
01092 MIIM_SUBMENU | MIIM_DATA | MIIM_STATE | MIIM_TYPE,
01093 MFT_STRING,
01094 MFS_ENABLED,
01095 666,
01096 popup_id,
01097 NULL,
01098 NULL,
01099 666,
01100 cad,
01101 strlen(cad)
01102 };
01103
01104 if ( !padre || !InsertMenuItem(padre, 0, TRUE, &menucito) ) {
01105 return FALSE;
01106 }
01107
01108 if ( !insertar_mswin32sdk(popup_id) ) return FALSE;
01109 }
01110 else {
01111 if ( !insertar_mswin32sdk(padre) ) return FALSE;
01112 }
01113
01114 return TRUE;
01115 }
01116
01117 #endif // i386_WIN32_VC
01118
01119 #ifdef WXWINDOWS_ENABLED
01120 wxMenuBar *
01121 GUI_MENU::crear_wxw_barra(_WXWINDOWS_WINDOW *Ventana)
01122 {
01123 wxMenuBar *Menubar = NULL;
01124
01125 Menubar = Ventana->GetMenuBar();
01126 if ( !Menubar ) {
01127 Menubar = new wxMenuBar;
01128 }
01129
01130 int i;
01131
01132 for ( i = 0; i < lista_hijos.tam(); i++ ) {
01133 lista_hijos[i]->crear_wxw((wxMenu *)Menubar, TM_MENUBAR);
01134 }
01135
01136 return Menubar;
01137 }
01138
01139 wxMenu *
01140 GUI_MENU::crear_wxw(wxMenu *Padre, int tipo_menu)
01141 {
01142 wxMenu *Popup;
01143 char cad[200];
01144
01145 if ( tipo_menu != TM_PULLDOWN ) {
01146 Popup = new wxMenu("", wxMENU_TEAROFF);
01147
01148 strcpy(cad, _nombre);
01149
01150
01151 int i, j;
01152 for ( i = 0; cad[i]; i++ ) {
01153 if ( cad[i] == '\\' && cad[i+1] == 't' ) {
01154 cad[i] = '\t';
01155 i++;
01156 for ( j = i; cad[j]; j++ ) {
01157 cad[j] = cad[j+1];
01158 }
01159 }
01160
01161
01162 if ( cad[i] == '\\' && cad[i+1] == 'a' ) {
01163 for ( j = i; cad[j]; j++ ) {
01164 cad[j] = cad[j+2];
01165 }
01166 i+=2;
01167 }
01168 }
01169
01170 }
01171 else {
01172 Popup = Padre;
01173 }
01174
01175 if ( tipo_menu == TM_MENUBAR ) {
01176 ((wxMenuBar *)Padre)->Append(Popup, cad);
01177 }
01178 else if ( tipo_menu == TM_POPUP ) {
01179 Padre->Append(1, cad, Popup);
01180 }
01181
01182 int i;
01183
01184 for ( i = 0; i < lista_hijos.tam(); i++ ) {
01185 lista_hijos[i]->crear_wxw(Popup, TM_POPUP);
01186 }
01187
01188 return Popup;
01189 }
01190
01191 #endif
01192
01193
01194
01195
01196