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 #include <stdio.h>
00024 #include <stdlib.h>
00025 #include <string.h>
00026
00027 #include "framework/gui/jed_gui.h"
00028 #include "toolkits/util/parsero.h"
00029 #include "lista.cc"
00030
00031 #define ESPERO(tipo, msg) \
00032 if ( tipo_token != (tipo) ) { \
00033 fprintf(stderr,"<JED_INTERFACE> ERROR: Esperaba %s y recibi [%s].\n", \
00034 (msg), cad); fflush(stderr); return FALSE; \
00035 }
00036
00037 #define ESPERO_KTE(tipo, msg) \
00038 if ( tipo_token != (tipo) ) { \
00039 return; \
00040 }
00041
00042 #define CARGAR_CADENAV(destino, origen)\
00043 if ( (destino) ) delete (destino);\
00044 des_comille((origen));\
00045 (destino) = new char[strlen((origen))+1];\
00046 if ( !(destino) ) {\
00047 fprintf(stderr, "<GUI_COMANDO>-ERROR: No hay memoria para una cadenita!");\
00048 fflush(stderr);\
00049 return;\
00050 }\
00051 strcpy((destino), (origen));
00052
00053
00054
00055
00056
00057 void
00058 GUI_CONSTANTE_ENTERA::leer(TOKENIZADOR *Sabiondo)
00059 {
00060 char cad[1000];
00061 int tipo_token = TK_DESCONOCIDO;
00062
00063 nombre = NULL;
00064 valor = 666;
00065
00066 tipo_token = Sabiondo->siguiente_token(cad);
00067 ESPERO_KTE(TK_IDENTIFICADOR, "un identificador de constante");
00068 CARGAR_CADENAV(nombre, cad);
00069 tipo_token = Sabiondo->siguiente_token(cad);
00070 ESPERO_KTE(TK_NUMERO, "un numero");
00071 valor = atoi(cad);
00072
00073
00074 }
00075
00076 void
00077 GUI_CONSTANTE_ENTERA::imprimir(void)
00078 {
00079 printf(" - %s = %d\n", nombre, valor);
00080 }
00081
00082
00083
00084
00085
00086 JED_INTERFACE::~JED_INTERFACE()
00087 {
00088 ;
00089 }
00090
00091 BOOLEAN
00092 JED_INTERFACE::leer_gui(char *archivo)
00093 {
00094 PARSERO preprocesador;
00095 LISTA<char *> *Bloque_de_datos;
00096 TOKENIZADOR sabiondo;
00097 char cad[1000];
00098 int status, tipo_token, i;
00099 GUI_COMANDO *Comando;
00100 GUI_CONSTANTE_ENTERA *Idc;
00101 GUI_MENU *Menu;
00102 GUI_BOTONERA *Botonera;
00103
00104 if ( !preprocesador.init(archivo) ) return FALSE;
00105
00106
00107
00108
00109 do {
00110
00111 status = preprocesador.siguiente_segmento(&Bloque_de_datos);
00112 if ( status < 0 ) {
00113 fprintf(stderr, "<JED_INTERFACE> - ERROR DE SINTAXIS!\n");
00114 fflush(stderr);
00115 break;
00116 }
00117 if ( status == 0 ) break;
00118
00119
00120 sabiondo.cambiar_lista(Bloque_de_datos);
00121 tipo_token = TK_DESCONOCIDO;
00122 while ( Bloque_de_datos->tam() > 0 && tipo_token != TK_FIN ) {
00123 tipo_token = sabiondo.siguiente_token(cad);
00124 switch( tipo_token ) {
00125
00126 case TK_IDENTIFICADOR:
00127 if ( strcmp(cad, "COMANDO") == 0 ) {
00128 Comando = new GUI_COMANDO();
00129 if ( !Comando ||
00130 !Comando->leer(&sabiondo, &lista_idcs) ) return FALSE;
00131
00132 lista_comandos.anx(Comando);
00133 }
00134 else if ( strcmp(cad, "MENU") == 0 ||
00135 strcmp(cad, "POPUP") == 0 ) {
00136 Menu = new GUI_MENU(&lista_idcs);
00137 if ( !Menu || !Menu->leer(&sabiondo, this) ) return FALSE;
00138
00139 lista_menus.anx(Menu);
00140 }
00141 else if ( strcmp(cad, "BOTONERA") == 0 ) {
00142 Botonera = new GUI_BOTONERA(&lista_idcs, &lista_comandos);
00143 if ( !Botonera || !Botonera->leer(&sabiondo) ) {
00144 return FALSE;
00145 }
00146
00147 lista_botoneras.anx(Botonera);
00148 }
00149 else if ( strcmp(cad, "#define") == 0 ) {
00150 Idc = new GUI_CONSTANTE_ENTERA;
00151 if ( !Idc ) return FALSE;
00152 Idc->leer(&sabiondo);
00153 lista_idcs.anx(Idc);
00154 }
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164 ;
00165 break;
00166
00167 case TK_ERROR_SINTACTICO: return FALSE;
00168 default: case TK_DESCONOCIDO: break;
00169 }
00170 }
00171
00172
00173 for ( i = 0; i < Bloque_de_datos->tam(); i++ ) {
00174 delete (*Bloque_de_datos)[i];
00175 }
00176 delete Bloque_de_datos;
00177 Bloque_de_datos = NULL;
00178 } while( status != 0 );
00179
00180 return TRUE;
00181 }
00182
00183 GUI_MENU *
00184 JED_INTERFACE::resolver_menu(char *llave)
00185 {
00186 int i;
00187 GUI_MENU *menu = NULL;
00188
00189 for ( i = 0; i < lista_menus.tam(); i++ ) {
00190 if ( strcmp(llave, lista_menus[i]->nombre()) == 0 ) {
00191 menu = lista_menus[i];
00192 break;
00193 }
00194 }
00195
00196 return menu;
00197 }
00198
00199 GUI_BOTONERA *
00200 JED_INTERFACE::resolver_botonera(char *llave)
00201 {
00202 int i;
00203 GUI_BOTONERA *botonera = NULL;
00204
00205 for ( i = 0; i < lista_botoneras.tam(); i++ ) {
00206 if ( strcmp(llave, lista_botoneras[i]->nombre()) == 0 ) {
00207 botonera = lista_botoneras[i];
00208 break;
00209 }
00210 }
00211
00212 return botonera;
00213 }
00214
00215 BOOLEAN
00216 JED_INTERFACE::leer(TOKENIZADOR *Sabiondo)
00217 {
00218 int tipo_token = TK_DESCONOCIDO, pos = 1;
00219 char cad[1000];
00220
00221 while ( tipo_token != TK_CERRAR ) {
00222
00223 tipo_token = Sabiondo->siguiente_token(cad);
00224
00225
00226 if ( tipo_token == TK_CERRAR ) break;
00227 if ( tipo_token == TK_FIN ) {
00228 fprintf(stderr,
00229 "<JED_INTERFACE> ERROR: Fin de archivo inesperado!\n");
00230 fflush(stderr);
00231 return FALSE;
00232 }
00233
00234
00235 if ( pos == 1 ) {
00236 ESPERO(TK_ABRIR, "'{'"); pos ++; continue;
00237 }
00238 else {
00239 ESPERO(TK_IDENTIFICADOR, "un identificador");
00240 }
00241
00242
00243
00244
00245 if ( strcmp(cad, "vista") == 0 ) {
00246 tipo_token = Sabiondo->siguiente_token(cad);
00247 ESPERO(TK_CADENA, "el nombre de una vista");
00248 printf("<JED_INTERFACE> Dejo en remojo la vista %s\n", cad);
00249 }
00250 ;
00251 }
00252
00253 return TRUE;
00254 }
00255
00256 void
00257 JED_INTERFACE::finalizar(void)
00258 {
00259 #if PLATAFORMA != PALM_PALMOS_CODEWARRIOR
00260 printf("<JED_INTERFACE> : Finalizacion por defecto Ok.\n");
00261 #endif
00262 exit(0);
00263 }
00264
00265 void
00266 JED_INTERFACE::desktop_size(int *x_tam, int *y_tam)
00267 {
00268 #if (PLATAFORMA != i386_WIN32_VC) && (PLATAFORMA != PALM_PALMOS_CODEWARRIOR)
00269 printf("<JED_INTERFACE> - Warning : \n"
00270 " Resolucion desconocida, retornando 640x480.\n");
00271 fflush(stdout);
00272 #endif
00273 (*x_tam) = 640;
00274 (*y_tam) = 480;
00275 }
00276
00277 void
00278 JED_INTERFACE::solicitar_nueva_ventana(void)
00279 {
00280 #if (PLATAFORMA != i386_WIN32_VC) && (PLATAFORMA != PALM_PALMOS_CODEWARRIOR)
00281 printf("<JED_INTERFACE> - Warning : \n"
00282 " Solicitud de ventana no implementada, ignorada.\n");
00283 fflush(stdout);
00284 #endif
00285 }
00286
00287 BOOLEAN
00288 JED_INTERFACE::anexar_controles(LISTA <CONTROL_GUI *> * ,
00289 REPOSITORIO_DE_ENTIDADES * )
00290 {
00291 fprintf(stderr, "<JED_INTERFACE> ERROR: Los controles GUI no estan\n"
00292 " implemetados en la interface actual. Intente Motif.\n");
00293 fflush(stderr);
00294 return FALSE;
00295 }
00296
00297
00298
00299
00300