Página principal | Jerarquía de la clase | Lista alfabética | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

jed_menu.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= jed_menu.h                                              Octubre de 1998 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definiciones de las clases de administracion de GUI_MENU's y GUI_COMANDO's      =
00005 //=-------------------------------------------------------------------------=
00006 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00007 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00008 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00009 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00010 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00011 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00012 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00013 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00014 //=-------------------------------------------------------------------------=
00015 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00016 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00017 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00018 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00019 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
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 // OJO: Si estas macros se organizan ya no compila!
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 //= CLASE GUI_COMANDO                                                           =
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               //- Ya que tengo nombre, sabre quien soy! ------------------
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 //= CLASE GUI_ELEMENTO                                                      =
00201 //===========================================================================
00202 
00203 static int nivel = 0;
00204 
00205 GUI_ELEMENTO::~GUI_ELEMENTO()
00206 {
00207     ;
00208 }
00209 
00210 //===========================================================================
00211 //= CLASE REFERENCIA_GUI                                                    =
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 /*tipo_menu*/)
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), // Siempre es esto!
00289             // Identifica los valores a cuadrar aqui
00290             MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_TYPE, 
00291             MFT_STRING, // Tipo de opcion
00292             MFS_ENABLED, // Atributos de la opcion
00293             666, // Identificador de comando 
00294             NULL, // HMENU   hSubMenu; 
00295             NULL, // HBITMAP hbmpChecked; 
00296             NULL, // HBITMAP hbmpUnchecked; 
00297             666, // DWORD   dwItemData; (puede ser usado por la aplicacion)
00298             cad, // Datos de opcion (dependiente de su tipo)
00299             strlen(cad) // Datos de opcion (dependiente de su tipo)
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 /*tipo_menu*/)
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 //= CLASE SEPARADOR                                                         =
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), // Siempre es esto!
00383         // Identifica los valores a cuadrar aqui
00384         MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_TYPE, 
00385         MFT_SEPARATOR, // Tipo de opcion
00386         MFS_ENABLED, // Atributos de la opcion
00387         666, // Identificador de comando 
00388         NULL, // HMENU   hSubMenu; 
00389         NULL, // HBITMAP hbmpChecked; 
00390         NULL, // HBITMAP hbmpUnchecked; 
00391         666, // DWORD   dwItemData; (puede ser usado por la aplicacion)
00392         cad, // Datos de opcion (dependiente de su tipo)
00393         strlen(cad) // Datos de opcion (dependiente de su tipo)
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 /*tipo_menu*/)
00407 {
00408     Padre->AppendSeparator();
00409     return NULL;
00410 }
00411 
00412 #endif
00413 
00414 //===========================================================================
00415 //= CLASE OPCION                                                            =
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     // OJO: Esta condicion es siempre constante?
00467     if ( flags & OF_CHECKED ) {
00468         printf("<C> ");
00469       }
00470       else {
00471         printf("<UC> ");
00472     }
00473 
00474     // OJO: Esta condicion es siempre constante?
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     //- Busqueda del identificador de menu ayuda o acelerador ---------------
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; // Ya estaba el primero
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     //- Busqueda del identificador de menu ayuda o acelerador ---------------
00597     ptr = strchr(nuevo_nombre, '\\');
00598     if ( ptr && ptr[1] == 'a' ) {
00599         (*Mnemonico) = ptr[1];
00600         // Equivalente a quite(nuevo_nombre, "\\a"), que no se hizo
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         // Separe la informacion de acelerador
00608         ptr[0] = '\0';
00609         r = TRUE;
00610         procesar_acelerador_Xt(&ptr[2]);
00611     }
00612 
00613     //- Busqueda del Mnemonico ----------------------------------------------
00614     ptr = strchr(nuevo_nombre, '&');
00615     if ( ptr ) {
00616         (*Mnemonico) = ptr[1];
00617         // Equivalente a quite_caracter(nuevo_nombre, '&'), que no se hizo
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         //XtVaSetValues(padre, XmNradioBehavior, True, NULL);
00648         opcion = XtVaCreateManagedWidget(nombre_motif, 
00649             xmToggleButtonGadgetClass, padre, XmNmnemonic, mnemonico, 
00650             /*XmNshadowThickness,2,XmNfillOnArm,True,*/
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             // OJO: Aqui se esta produciendo un Warning Xt/Motif!
00669             //XtVaSetValues(opcion, XmNaccelerator, xmstr, NULL);
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     //- Procesamiento del nombre de opcion para formato WINDOWS
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), // Siempre es esto!
00713         // Identifica los valores a cuadrar aqui
00714         MIIM_TYPE | MIIM_STATE | MIIM_ID | MIIM_DATA, 
00715         MFT_STRING, // Tipo de opcion
00716         MFS_ENABLED, // Atributos de la opcion
00717         idc, // Identificador de comando 
00718         NULL, // HMENU   hSubMenu; 
00719         NULL, // HBITMAP hbmpChecked; 
00720         NULL, // HBITMAP hbmpUnchecked; 
00721         666, // DWORD   dwItemData; (puede ser usado por la aplicacion)
00722         cad, // Datos de opcion (dependiente de su tipo)
00723         strlen(cad) // Datos de opcion (dependiente de su tipo)
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     //- Procesamiento del nombre de opcion para formato WINDOWS
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 //= CLASE GUI_MENU                                                              =
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                     //printf(", %s\n", cad);
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                         fprintf(stderr, "<GUI_MENU> - Warning: la constante %s no "
00874                                         "esta definida!\n", cad);
00875                         fflush(stderr);*/
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                     // OJO: Si hay tokens adicionales para esta opcion, tendran
00891                     // que procesarse a posteriori y aplicarse a ESTA opcion.
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     //- Procesamiento del nombre de opcion para formato WINDOWS
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         // OJO: No hay alguna manera de decirle a Windows que este item
01079         //      es el de ayuda?
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), // Siempre es esto!
01091             // Identifica los valores a cuadrar aqui
01092             MIIM_SUBMENU | MIIM_DATA | MIIM_STATE | MIIM_TYPE, 
01093             MFT_STRING, // Tipo de opcion
01094             MFS_ENABLED, // Atributos de la opcion
01095             666, // Identificador de comando 
01096             popup_id, // HMENU   SubMenu; 
01097             NULL,  // HBITMAP bmpChecked; 
01098             NULL,  // HBITMAP bmpUnchecked; 
01099             666,   // DWORD   Data; (puede ser usado por la aplicacion)
01100             cad, // Datos de opcion (dependiente de su tipo)
01101             strlen(cad) // Datos de opcion (dependiente de su tipo)
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         //- Procesamiento del nombre de opcion para formato WINDOWS
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             // OJO: No hay alguna manera de decirle a WXWindows que este item
01161             //      es el de ayuda?
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 //= EOF                                                                     =
01195 //===========================================================================
01196 

Este archivo HTML ha sido generado automáticamente a partir del código fuente AQUYNZA. NO LO EDITE. Para mayor información contacte al autor.