00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "framework/gui/control_gui.h"
00023 #include <stdio.h>
00024 #include <string.h>
00025 #include <stdlib.h>
00026
00027 #ifdef MOTIF_ENABLED
00028 #include <Xm/Form.h>
00029 #include <Xm/Frame.h>
00030 #include <Xm/LabelG.h>
00031 #include <Xm/RowColumnP.h>
00032 #endif
00033
00034 #include "lista.cc"
00035
00036
00037
00038
00039
00040 #define ESPERO_G(tipo, msg) \
00041 if ( tipo_token != (tipo) ) { \
00042 fprintf(stderr, "<CONTROL_GUI_GRUPO> " \
00043 "ERROR: Esperaba %s y recibi [%s].\n", \
00044 (msg), cad); fflush(stderr); return FALSE; \
00045 }
00046
00047 #define VERIFICAR_G(c) \
00048 if ( !(c) ) {\
00049 fprintf(stderr, \
00050 "<CONTROL_GUI_GRUPO> ERROR: No se pudo crear un objeto " \
00051 "dinamico!\n");\
00052 fflush(stderr);\
00053 exit(1);\
00054 }
00055
00056
00057
00058
00059
00060 CONTROL_GUI::CONTROL_GUI(JED_INTERFACE **p)
00061 {
00062 _nombre_etiqueta = NULL;
00063 _Padre = p;
00064 }
00065
00066 CONTROL_GUI::~CONTROL_GUI()
00067 {
00068 ;
00069 }
00070
00071
00072
00073
00074
00075 CONTROL_GUI_GRUPO::CONTROL_GUI_GRUPO(JED_INTERFACE **p) : CONTROL_GUI(p)
00076 {
00077 orientacion_vertical = TRUE;
00078 con_marco = TRUE;
00079 estilo_borde = 1;
00080 }
00081
00082 CONTROL_GUI_GRUPO::~CONTROL_GUI_GRUPO()
00083 {
00084 ;
00085 }
00086
00087 BOOLEAN
00088 CONTROL_GUI_GRUPO::leer(TOKENIZADOR *Sabiondo)
00089 {
00090 char cad[1000];
00091 int tipo_token = TK_DESCONOCIDO, pos;
00092 CONTROL_GUI *Hijo;
00093
00094
00095 pos = 2;
00096 while ( tipo_token != TK_CERRAR) {
00097 tipo_token = Sabiondo->siguiente_token(cad);
00098 switch ( pos ) {
00099 case 2: ESPERO_G(TK_ABRIR, "\"{\""); pos++; break;
00100 default:
00101 if ( tipo_token == TK_CERRAR ) break;
00102 ESPERO_G(TK_IDENTIFICADOR, "un identificador (3)");
00103 if ( strcmp(cad, "etiqueta") == 0 ) {
00104 tipo_token = Sabiondo->siguiente_token(cad);
00105 ESPERO_G(TK_CADENA, "una cadena");
00106 des_comille(cad);
00107 _nombre_etiqueta = new char[strlen(cad)+3];
00108 VERIFICAR_G(_nombre_etiqueta);
00109 sprintf(_nombre_etiqueta, " %s ", cad);
00110 }
00111 else if ( strcmp(cad, "control_gui_float") == 0 ) {
00112 Hijo = new CONTROL_GUI_FLOAT(_Padre);
00113 VERIFICAR_G(Hijo);
00114 if ( !Hijo->leer(Sabiondo) ) return FALSE;
00115 lista_hijos.anx(Hijo);
00116 }
00117 else if ( strcmp(cad, "control_gui_grupo") == 0 ) {
00118 Hijo = new CONTROL_GUI_GRUPO(_Padre);
00119 VERIFICAR_G(Hijo);
00120 if ( !Hijo->leer(Sabiondo) ) return FALSE;
00121 lista_hijos.anx(Hijo);
00122 }
00123 else if ( strcmp(cad, "estilo_borde") == 0 ) {
00124 tipo_token = Sabiondo->siguiente_token(cad);
00125 ESPERO_G(TK_NUMERO, "un numero");
00126 estilo_borde = atoi(cad);
00127 }
00128 else if ( strcmp(cad, "VERTICAL") == 0 ||
00129 strcmp(cad, "vertical") == 0) {
00130 orientacion_vertical = TRUE;
00131 }
00132 else if ( strcmp(cad, "HORIZONTAL") == 0 ||
00133 strcmp(cad, "horizontal") == 0) {
00134 orientacion_vertical = FALSE;
00135 }
00136 else if ( strcmp(cad, "CON_MARCO") == 0 ||
00137 strcmp(cad, "con_marco") == 0) {
00138 con_marco = TRUE;
00139 }
00140 else if ( strcmp(cad, "SIN_MARCO") == 0 ||
00141 strcmp(cad, "sin_marco") == 0) {
00142 con_marco = FALSE;
00143 }
00144 ;
00145 break;
00146 }
00147 }
00148
00149 return TRUE;
00150 }
00151
00152 void
00153 CONTROL_GUI_GRUPO::actualizar(ENTIDAD * )
00154 {
00155 ;
00156 }
00157
00158 #ifdef MOTIF_ENABLED
00159 Widget
00160 CONTROL_GUI_GRUPO::crear_motif(REPOSITORIO_DE_ENTIDADES *Repositorio,
00161 Widget padre)
00162 {
00163 Widget rc, tio, contenedor = NULL;
00164 int margen = 5;
00165 int sep = 3;
00166 XmString motif_cad;
00167
00168 tio = padre;
00169 if ( con_marco ) {
00170 contenedor = XtVaCreateManagedWidget("[Fr]", xmFrameWidgetClass, padre,
00171 XmNshadowType, XmSHADOW_IN, XmNshadowThickness, 1,
00172 XmNresizeHeight, True, XmNresizeWidth, True, NULL);
00173
00174 estilo_borde = 3;
00175
00176 printf("<CONTROL_GUI_GRUPO::crear_motif> Creo un borde %d\n",
00177 estilo_borde);
00178 fflush(stdout);
00179 switch ( estilo_borde ) {
00180 case 1:
00181 XtVaSetValues(contenedor, XmNshadowType, XmSHADOW_IN, NULL);
00182 break;
00183 case 2:
00184 XtVaSetValues(contenedor, XmNshadowType, XmSHADOW_OUT, NULL);
00185 break;
00186 case 3:
00187 XtVaSetValues(contenedor, XmNshadowType, XmSHADOW_ETCHED_IN, NULL);
00188 break;
00189 case 0: default:
00190 XtVaSetValues(contenedor, XmNshadowType, XmSHADOW_ETCHED_OUT,NULL);
00191 break;
00192 }
00193
00194 if ( _nombre_etiqueta ) {
00195 motif_cad = XmStringCreateLocalized(_nombre_etiqueta);
00196 XtVaCreateManagedWidget("[FrLabel]", xmLabelGadgetClass,
00197 contenedor, XmNchildType, XmFRAME_TITLE_CHILD,
00198 XmNchildVerticalAlignment, XmALIGNMENT_CENTER,
00199 XmNchildHorizontalAlignment, XmALIGNMENT_BEGINNING,
00200 XmNlabelString, motif_cad,
00201 NULL);
00202 XmStringFree(motif_cad);
00203 }
00204
00205 tio = contenedor;
00206 }
00207
00208 if ( orientacion_vertical ) {
00209 rc = XtVaCreateManagedWidget("[RC]", xmRowColumnWidgetClass, tio,
00210 XmNmarginHeight, margen, XmNmarginWidth, margen, XmNspacing, sep,
00211 XmNpacking, XmPACK_TIGHT, XmNorientation, XmVERTICAL,
00212 XmNresizeHeight, True, XmNresizeWidth, True,
00213 NULL);
00214 }
00215 else {
00216 rc = XtVaCreateManagedWidget("[RC]", xmRowColumnWidgetClass, tio,
00217 XmNmarginHeight, margen, XmNmarginWidth, margen, XmNspacing, sep,
00218 XmNpacking, XmPACK_TIGHT, XmNorientation, XmHORIZONTAL,
00219 XmNresizeHeight, True, XmNresizeWidth, True,
00220 NULL);
00221 }
00222 if ( !con_marco ) contenedor = rc;
00223
00224
00225 int i;
00226 Dimension xt, yt, xs = 0, ys = 0;
00227 Widget h;
00228
00229 for ( i = 0; i < lista_hijos.tam(); i++ ) {
00230 h = lista_hijos[i]->crear_motif(Repositorio, rc);
00231 XtVaGetValues(h, XmNwidth,&xt, XmNheight,&yt, NULL);
00232 if ( orientacion_vertical ) {
00233 if ( xt > xs ) xs = xt;
00234 ys += (yt * 5) / 4;
00235 }
00236 else {
00237 if ( yt > ys ) ys = yt;
00238 xs += (xt * 5) / 4;
00239 }
00240 }
00241
00242 if ( orientacion_vertical ) {
00243 ys += sep * (lista_hijos.tam()-1);
00244 }
00245 else {
00246 xs += sep * (lista_hijos.tam()-1);
00247 }
00248
00249 XtResizeWidget(rc, xs + 2*margen, ys+2*margen, 0 );
00250 XtManageChild(rc);
00251
00252 if ( con_marco ) {
00253 XtResizeWidget(contenedor, xs + 4*margen, ys+3*margen, 0 );
00254 XtManageChild(contenedor);
00255 }
00256
00257
00258 return contenedor;
00259 }
00260 #endif // MOTIF_ENABLED
00261
00262 #ifdef WXWINDOWS_ENABLED
00263 void
00264 CONTROL_GUI_GRUPO::crear_wxwindows(REPOSITORIO_DE_ENTIDADES *Repositorio,
00265 wxPanel *padre)
00266 {
00267
00268 wxStaticBox *marco;
00269 wxSizer *ordenador_marco;
00270 wxPanel *papito = padre;
00271
00272 if ( con_marco ) {
00273 if ( _nombre_etiqueta ) {
00274 marco = new wxStaticBox(padre, -1, wxString(_nombre_etiqueta));
00275 }
00276 else {
00277 marco = new wxStaticBox(padre, -1, wxString(""));
00278 }
00279 papito = new wxPanel(padre);
00280 ordenador_marco = new wxStaticBoxSizer(marco, wxVERTICAL);
00281 ordenador_marco->Add(papito, 1, wxGROW, 1);
00282 ordenador_marco->Fit(padre);
00283 }
00284
00285
00286 wxPanel *contenido;
00287 wxSizer *ordenador_contenido;
00288 int i;
00289
00290 if ( orientacion_vertical ) {
00291 ordenador_contenido = new wxBoxSizer(wxVERTICAL);
00292 }
00293 else {
00294 ordenador_contenido = new wxBoxSizer(wxHORIZONTAL);
00295 }
00296 for ( i = 0; i < lista_hijos.tam(); i++ ) {
00297 contenido = new wxPanel(papito);
00298 lista_hijos[i]->crear_wxwindows(Repositorio, contenido);
00299 ordenador_contenido->Add(contenido, 1, wxGROW | wxALL, 1);
00300 }
00301 ordenador_contenido->Fit(papito);
00302
00303
00304 if ( con_marco ) {
00305 papito->SetSizer(ordenador_contenido);
00306 padre->SetSizer(ordenador_marco);
00307 }
00308 else {
00309 padre->SetSizer(ordenador_contenido);
00310 }
00311 }
00312 #endif // WXWINDOWS_ENABLED
00313
00314
00315
00316
00317