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 "jed_gl.h"
00028 #include "framework/gui/_wxwindows.h"
00029 #include "lista.cc"
00030 #include "toolkits/entorno/jed_evnt.h"
00031
00032
00033
00034
00035
00036 #ifndef WXWINDOWS_ENABLED
00037
00038 JED_GUI_CLASE_NULA(JED_WXWINDOWS_INTERFACE, "JED_WXWINDOWS_INTERFACE",
00039 "WXWINDOWS", "wxwindows", "WXWINDOWS_ENABLED");
00040
00041 #endif
00042
00043 #ifdef WXWINDOWS_ENABLED
00044
00045
00046 #define TIMER_ID 1
00047
00048
00049
00050
00051
00052 #define ID_NEW_WINDOW 10000
00053
00054
00055
00056
00057
00058 static JED_WXWINDOWS_INTERFACE *LA_Gui = NULL;
00059 static int GLOBAL_glwidget_id = 1;
00060 static int GLOBAL_widget_id = 1;
00061 static int X_mouse = 320;
00062 static int Y_mouse = 240;
00063 static int QUIERO_pintarme = 0;
00064
00065
00066
00067 BEGIN_EVENT_TABLE(_WXWINDOWS_GLWIDGET, wxGLCanvas)
00068 EVT_SIZE(_WXWINDOWS_GLWIDGET::OnSize)
00069 EVT_PAINT(_WXWINDOWS_GLWIDGET::OnPaint)
00070 EVT_ERASE_BACKGROUND(_WXWINDOWS_GLWIDGET::OnEraseBackground)
00071 EVT_CHAR(_WXWINDOWS_GLWIDGET::OnChar)
00072 EVT_KEY_DOWN(_WXWINDOWS_GLWIDGET::OnKeyDown )
00073 EVT_KEY_UP(_WXWINDOWS_GLWIDGET::OnKeyUp )
00074 EVT_MOTION(_WXWINDOWS_GLWIDGET::OnMotion )
00075 EVT_LEFT_DOWN(_WXWINDOWS_GLWIDGET::OnButton )
00076 EVT_MIDDLE_DOWN(_WXWINDOWS_GLWIDGET::OnButton )
00077 EVT_RIGHT_DOWN(_WXWINDOWS_GLWIDGET::OnButton )
00078 EVT_LEFT_UP(_WXWINDOWS_GLWIDGET::OnButton )
00079 EVT_MIDDLE_UP(_WXWINDOWS_GLWIDGET::OnButton )
00080 EVT_RIGHT_UP(_WXWINDOWS_GLWIDGET::OnButton )
00081 EVT_ENTER_WINDOW(_WXWINDOWS_GLWIDGET::OnEnterWindow )
00082 END_EVENT_TABLE();
00083
00084 BEGIN_EVENT_TABLE(_WXWINDOWS_WINDOW, wxFrame)
00085 EVT_MENU(wxID_EXIT, _WXWINDOWS_WINDOW::OnExit)
00086 EVT_MENU(ID_NEW_WINDOW, _WXWINDOWS_WINDOW::OnNewWindow)
00087 EVT_TIMER(-1, _WXWINDOWS_WINDOW::OnTimer)
00088 EVT_MENU(-1, _WXWINDOWS_WINDOW::OnMenu)
00089 END_EVENT_TABLE();
00090
00091
00092
00093
00094 static int (*WXWINDOWSGUI_ejecutor_callback)(int idc, int context_id);
00095 static void (*WXWINDOWSGUI_draw_callback)(int);
00096 static int (*WXWINDOWSGUI_tick_callback)(int);
00097 static void (*WXWINDOWSGUI_resize_callback)(int x_tam, int y_tam, int);
00098 static int (*WXWINDOWSGUI_keyboard_callback)(EVENTO_GUI *e, int);
00099 static int (*WXWINDOWSGUI_mouse_callback)(EVENTO_GUI *e, int);
00100 static void (*WXWINDOWSGUI_multiview_callback)(int operacion, int id_vista,
00101 char *detalles, char *menu, char *botonera);
00102 static void wxwindows_idle_callback(_WXWINDOWS_GLWIDGET *w);
00103
00104
00105
00106
00107
00108 _WXWINDOWS_GLWIDGET::_WXWINDOWS_GLWIDGET(wxWindow *parent, wxWindowID id,
00109 const wxPoint& pos, const wxSize& size,
00110 long style, const wxString& name) :
00111 wxGLCanvas(parent, (wxGLCanvas*) NULL, id, pos, size, style, name)
00114 {
00115 id_vista = GLOBAL_glwidget_id;
00116 GLOBAL_glwidget_id++;
00117
00118 #ifdef DEBUG_WXWINDOWS
00119 printf("<_WXWINDOWS_GLWIDGET> Creo la nueva ventana %d\n", id_vista);
00120 fflush(stdout);
00121 #endif
00122
00123 char menu[1024] = "1";
00124 char botonera[1024] = "2";
00125 if ( WXWINDOWSGUI_multiview_callback ) {
00126 WXWINDOWSGUI_multiview_callback(GUI_CREAR_VISTA, id_vista,
00127 "default", menu, botonera);
00128 }
00129 }
00130
00131 _WXWINDOWS_GLWIDGET::_WXWINDOWS_GLWIDGET(wxWindow *parent, const _WXWINDOWS_GLWIDGET &other,
00132 wxWindowID id, const wxPoint& pos,
00133 const wxSize& size, long style,
00134 const wxString& name ) :
00135 wxGLCanvas(parent, other.GetContext(), id, pos, size, style, name )
00138 {
00139 id_vista = GLOBAL_glwidget_id;
00140 GLOBAL_glwidget_id++;
00141
00142 #ifdef DEBUG_WXWINDOWS
00143 printf("<_WXWINDOWS_GLWIDGET> Creo la nueva ventana %d\n", id_vista);
00144 fflush(stdout);
00145 #endif
00146
00147 char menu[1024];
00148 char botonera[1024];
00149 if ( WXWINDOWSGUI_multiview_callback ) {
00150 WXWINDOWSGUI_multiview_callback(GUI_CREAR_VISTA, id_vista,
00151 "default", menu, botonera);
00152 }
00153 }
00154
00155 _WXWINDOWS_GLWIDGET::~_WXWINDOWS_GLWIDGET()
00158 {
00159 ;
00160 }
00161
00162 void
00163 _WXWINDOWS_GLWIDGET::OnEraseBackground(wxEraseEvent& event)
00166 {
00167
00168 }
00169
00170 void
00171 _WXWINDOWS_GLWIDGET::OnEnterWindow( wxMouseEvent& event )
00174 {
00175 SetFocus();
00176
00177 }
00178
00179 void
00180 _WXWINDOWS_GLWIDGET::OnMotion( wxMouseEvent& event )
00183 {
00184 int x, y;
00185
00186 event.GetPosition(&x, &y);
00187
00188 EVNT_EVENTO_GUI->mouse_old_x = EVNT_EVENTO_GUI->mouse_x;
00189 EVNT_EVENTO_GUI->mouse_old_y = EVNT_EVENTO_GUI->mouse_y;
00190 EVNT_EVENTO_GUI->mouse_x = X_mouse = x;
00191 EVNT_EVENTO_GUI->mouse_y = Y_mouse = y;
00192 EVNT_EVENTO_GUI->mouse_delta_x=x-EVNT_EVENTO_GUI->mouse_old_x;
00193 EVNT_EVENTO_GUI->mouse_delta_y=y-EVNT_EVENTO_GUI->mouse_old_y;
00194
00195 EVNT_EVENTO_GUI->tipo_de_evento = ETYPE_MOUSE_MOVE;
00196
00197 QUIERO_pintarme = WXWINDOWSGUI_mouse_callback(EVNT_EVENTO_GUI, id_vista);
00198 }
00199
00200 void
00201 _WXWINDOWS_GLWIDGET::OnButton(wxMouseEvent& event)
00204 {
00205 int x, y;
00206
00207 event.GetPosition(&x, &y);
00208
00209 EVNT_EVENTO_GUI->mouse_old_x = EVNT_EVENTO_GUI->mouse_x;
00210 EVNT_EVENTO_GUI->mouse_old_y = EVNT_EVENTO_GUI->mouse_y;
00211 EVNT_EVENTO_GUI->mouse_x = X_mouse = x;
00212 EVNT_EVENTO_GUI->mouse_y = Y_mouse = y;
00213 EVNT_EVENTO_GUI->mouse_delta_x=x-EVNT_EVENTO_GUI->mouse_old_x;
00214 EVNT_EVENTO_GUI->mouse_delta_y=y-EVNT_EVENTO_GUI->mouse_old_y;
00215
00216 if ( event.ButtonDown(1) ) {
00217 EVNT_EVENTO_GUI->tipo_de_evento = ETYPE_BUTTON_DOWN;
00218 EVNT_EVENTO_GUI->mouse_button_mask |= 0x01;
00219 }
00220 else if ( event.ButtonDown(2) ) {
00221 EVNT_EVENTO_GUI->tipo_de_evento = ETYPE_BUTTON_DOWN;
00222 EVNT_EVENTO_GUI->mouse_button_mask |= 0x02;
00223 }
00224 else if ( event.ButtonDown(3) ) {
00225 EVNT_EVENTO_GUI->tipo_de_evento = ETYPE_BUTTON_DOWN;
00226 EVNT_EVENTO_GUI->mouse_button_mask |= 0x04;
00227 }
00228 else if ( event.ButtonUp(1) ) {
00229 EVNT_EVENTO_GUI->tipo_de_evento = ETYPE_BUTTON_UP;
00230 EVNT_EVENTO_GUI->mouse_button_mask &= ~0x01;
00231 }
00232 else if ( event.ButtonUp(2) ) {
00233 EVNT_EVENTO_GUI->tipo_de_evento = ETYPE_BUTTON_UP;
00234 EVNT_EVENTO_GUI->mouse_button_mask &= ~0x02;
00235 }
00236 else if ( event.ButtonUp(3) ) {
00237 EVNT_EVENTO_GUI->tipo_de_evento = ETYPE_BUTTON_UP;
00238 EVNT_EVENTO_GUI->mouse_button_mask &= ~0x04;
00239 }
00240 ;
00241
00242 QUIERO_pintarme = WXWINDOWSGUI_mouse_callback(EVNT_EVENTO_GUI, id_vista);
00243 }
00244
00245 void
00246 _WXWINDOWS_GLWIDGET::OnPaint(wxPaintEvent& event)
00249 {
00250
00251 wxPaintDC dc(this);
00252 #ifndef __WXMOTIF__
00253 if (!GetContext()) return;
00254 #endif
00255 SetCurrent();
00256
00257
00258 WXWINDOWSGUI_draw_callback(id_vista);
00259
00260
00261 glFlush();
00262 SwapBuffers();
00263 }
00264
00265 void
00266 _WXWINDOWS_GLWIDGET::OnSize(wxSizeEvent& event)
00269 {
00270
00271
00272
00273 int width, height;
00274 GetClientSize(& width, & height);
00275
00276 #ifndef __WXMOTIF__
00277 if (GetContext())
00278 #endif
00279 SetCurrent();
00280
00281
00282 WXWINDOWSGUI_resize_callback(width, height, id_vista);
00283 }
00284
00285 void
00286 _WXWINDOWS_GLWIDGET::OnKeyDown(wxKeyEvent& event)
00290 {
00291 #ifdef NONONO_DESCONTINUADO
00292 long evkey = event.KeyCode();
00293 if ( evkey == 0 ) return;
00294
00295 EVNT_EVENTO_GUI->tipo_de_evento = ETYPE_KEY_DOWN;
00296 EVNT_EVENTO_GUI->key_mask = 0x00;
00297 WXWkeycode2JEDkeycode(EVNT_EVENTO_GUI, (int)evkey);
00298 QUIERO_pintarme = WXWINDOWSGUI_keyboard_callback(EVNT_EVENTO_GUI,id_vista);
00299
00300 if ( QUIERO_pintarme != 0 ) {
00301 Refresh(FALSE);
00302 Update();
00303 }
00304 #endif
00305
00306 event.Skip();
00307 }
00308
00309 void
00310 _WXWINDOWS_GLWIDGET::OnChar(wxKeyEvent& event)
00316 {
00317 long evkey = event.KeyCode();
00318 if ( evkey == 0 ) return;
00319
00320 EVNT_EVENTO_GUI->tipo_de_evento = ETYPE_KEY_DOWN;
00321 EVNT_EVENTO_GUI->key_mask = 0x00;
00322 WXWkeycode2JEDkeycode(EVNT_EVENTO_GUI, (int)evkey);
00323 QUIERO_pintarme = WXWINDOWSGUI_keyboard_callback(EVNT_EVENTO_GUI,id_vista);
00324
00325 if ( QUIERO_pintarme != 0 ) {
00326 Refresh(FALSE);
00327 Update();
00328 }
00329
00330 event.Skip();
00331 }
00332
00333 void
00334 _WXWINDOWS_GLWIDGET::OnKeyUp( wxKeyEvent& event )
00337 {
00338 event.Skip();
00339 }
00340
00341
00342
00343
00344
00345 _WXWINDOWS_NOTEBOOK::_WXWINDOWS_NOTEBOOK(wxWindow *parent, wxWindowID id,
00346 const wxPoint& pos, const wxSize& size, long style)
00347 : wxNotebook(parent, id, pos, size, style)
00348 {
00349 ;
00350 }
00351
00352 wxPanel *
00353 _WXWINDOWS_NOTEBOOK::crear_pagina(void)
00354 {
00355 static int contador = 1;
00356 char num[5];
00357
00358 wxPanel *panel = new wxPanel(this);
00359 sprintf(num, "%d", contador);
00360 AddPage(panel, wxT(num), FALSE, -1);
00361 contador++;
00362 return panel;
00363 }
00364
00365
00366
00367
00368
00369 _WXWINDOWS_WINDOW::_WXWINDOWS_WINDOW(wxFrame *frame, const wxString& title,
00370 const wxPoint& pos, const wxSize& size, long style)
00371 : wxFrame(frame, -1, title, pos, size, style), tick_timer(this, TIMER_ID)
00374 {
00375 drawing_area = NULL;
00376
00377 _id = GLOBAL_widget_id;
00378 GLOBAL_widget_id++;
00379
00380 tick_timer.Start(1000/24);
00381 area2 = NULL;
00382 }
00383
00384 void
00385 _WXWINDOWS_WINDOW::OnTimer(wxTimerEvent& event)
00388 {
00389 tick_timer.Stop();
00390 wxwindows_idle_callback(drawing_area);
00391 tick_timer.Start(1000/24);
00392 }
00393
00394 void
00395 _WXWINDOWS_WINDOW::OnExit(wxCommandEvent& event)
00398 {
00399 Destroy();
00400 }
00401
00402 void
00403 _WXWINDOWS_WINDOW::OnNewWindow(wxCommandEvent& event)
00406 {
00407 _WXWINDOWS_WINDOW *frame = new _WXWINDOWS_WINDOW(NULL,
00408 "AQUYNZA WXWINDOWS TEST",
00409 wxPoint(50, 50), wxSize(400, 300));
00410
00411
00412
00413
00414
00415
00416
00417 wxMenu *popup;
00418 wxMenuBar *menubar;
00419
00420 menubar = new wxMenuBar;
00421
00422 popup = new wxMenu;
00423 popup->Append(wxID_EXIT, "&Cerrar2");
00424 popup->Append(ID_NEW_WINDOW, "&Nuevo2" );
00425
00426 menubar->Append(popup, "&Archivo2");
00427 frame->SetMenuBar(menubar);
00428 frame->drawing_area = new _WXWINDOWS_GLWIDGET( frame, *drawing_area, -1,
00429 wxDefaultPosition, wxDefaultSize );
00430
00431 #if !wxUSE_STATUSBAR
00432 #error "Active el soporte de barras de estatus en WXWINDOWS!"
00433 #endif
00434
00435 #if wxUSE_STATUSBAR
00436
00437 CreateStatusBar(2);
00438 SetStatusText("http://www.aquynza.org");
00439 #endif
00440
00441 frame->Show(TRUE);
00442 }
00443
00444 void
00445 _WXWINDOWS_WINDOW::OnMenu(wxCommandEvent& evento)
00448 {
00449
00450
00451
00452
00453 if ( !WXWINDOWSGUI_ejecutor_callback ) return;
00454
00455 int cod = WXWINDOWSGUI_ejecutor_callback(evento.GetId(), _id);
00456 if ( cod != 0 ) QUIERO_pintarme = cod;
00457 }
00458
00459 wxPanel *
00460 _WXWINDOWS_WINDOW::crear_area_adicional(void)
00461 {
00462 wxPanel *nuevo;
00463
00464 if ( !area2 ) {
00465 area2 = new _WXWINDOWS_NOTEBOOK(panel, -1,
00466 wxDefaultPosition, wxSize(240, 240));
00467 nuevo = area2->crear_pagina();
00468 panel_sizer->Remove(drawing_area);
00469 panel_sizer->Add(drawing_area, 1, wxGROW | wxALL, 5);
00470 panel_sizer->Add(area2, 0, wxGROW);
00471 panel_sizer->Fit(this);
00472
00473 this->Refresh();
00474 this->Update();
00475 }
00476 else {
00477 nuevo = area2->crear_pagina();
00478 }
00479
00480 return nuevo;
00481 }
00482
00483
00484
00485
00486
00487 void
00488 _WXWINDOWS_APLICACION::set_gui(JED_WXWINDOWS_INTERFACE *Gui)
00489 {
00490 _Gui = Gui;
00491 }
00492
00493 bool
00494 _WXWINDOWS_APLICACION::OnInit(void)
00497 {
00498
00499 int x_tam = 320;
00500 int y_tam = 240;
00501 char defaultname[] = "AQUYNZA Program";
00502 char *cad = defaultname;
00503
00504
00505 if ( LA_Gui ) {
00506 x_tam = LA_Gui->_xtam;
00507 y_tam = LA_Gui->_ytam;
00508 if ( LA_Gui->_nombre ) {
00509 cad = new char[strlen(LA_Gui->_nombre)+1];
00510 strcpy(cad, LA_Gui->_nombre);
00511 }
00512 }
00513
00514
00515 _WXWINDOWS_WINDOW *marco;
00516
00517 marco = new _WXWINDOWS_WINDOW(NULL, cad,
00518 wxPoint(0, 0),
00519 wxSize(x_tam, y_tam));
00520
00521
00522
00523
00524
00525
00526 GUI_MENU *Global = _Gui->resolver_menu("GLOBAL");
00527 wxMenuBar *menubar;
00528 wxMenu *popup;
00529
00530 if ( _Gui->lista_menus.tam() > 0 && Global ) {
00531
00532 menubar = Global->crear_wxw_barra(marco);
00533 }
00534 else {
00535
00536 menubar = new wxMenuBar;
00537 popup = new wxMenu;
00538 popup->Append(wxID_EXIT, "&Cerrar1");
00539 popup->Append(ID_NEW_WINDOW, "&Nuevo1" );
00540 menubar->Append(popup, "&Archivo1");
00541 }
00542
00543 marco->SetMenuBar(menubar);
00544
00545
00546 wxPanel *panelcito;
00547 long int i;
00548
00549 marco->panel = new wxPanel(marco, -1, wxDefaultPosition, wxDefaultSize, 0);
00550 marco->drawing_area = new _WXWINDOWS_GLWIDGET(marco->panel, -1,
00551 wxDefaultPosition, wxSize(x_tam, y_tam));
00552 marco->area2 = NULL;
00553 marco->panel_sizer = new wxBoxSizer(wxHORIZONTAL);
00554 marco->panel_sizer->Add(marco->drawing_area, 1, wxGROW | wxALL, 1);
00555 marco->panel_sizer->Fit(marco);
00556
00557 marco->panel->SetAutoLayout(TRUE);
00558 marco->panel->SetSizer(marco->panel_sizer);
00559
00560 for ( i = 0;
00561 _Gui->Controles_pendientes && i < _Gui->Controles_pendientes->tam();
00562 i++ ) {
00563 panelcito = marco->crear_area_adicional();
00564 (*_Gui->Controles_pendientes)[i]->crear_wxwindows(
00565 _Gui->Repositorio_pendiente, panelcito);
00566 }
00567 marco->drawing_area->SetFocus();
00568
00569 #if !wxUSE_STATUSBAR
00570 #error "Active el soporte de barras de estatus en WXWINDOWS!"
00571 #endif
00572
00573 #if wxUSE_STATUSBAR
00574
00575 marco->CreateStatusBar(2);
00576 marco->SetStatusText("http://www.aquynza.org");
00577 #endif
00578
00579 marco->Show(TRUE);
00580 return TRUE;
00581 }
00582
00583
00584
00585
00586
00587 #if PLATAFORMA == i386_LINUX_GCC
00588 extern int wxEntry( int argc, char *argv[] );
00589 #endif
00590
00591 static JED_WXWINDOWS_INTERFACE *MACHETE_gui = NULL;
00592
00593 wxApp *
00594 crear_aplicacion_wxwindows(void)
00601 {
00602 _WXWINDOWS_APLICACION *app = new _WXWINDOWS_APLICACION;
00603
00604 if ( !MACHETE_gui ) {
00605 fprintf(stderr, "<WXWINDOWS> - ERROR: No hay GUI!\n");
00606 fflush(stderr);
00607 }
00608
00609 app->set_gui(MACHETE_gui);
00610
00611 return (wxApp *)app;
00612 }
00613
00614 wxAppInitializer
00615 wxTheAppInitializer((wxAppInitializerFunction)crear_aplicacion_wxwindows);
00616
00617
00618
00619
00620
00621 class VENTANA_WXWINDOWS {
00622 private:
00623 int id;
00624 int status;
00625 BOOLEAN por_pintar;
00626 public:
00627 VENTANA_WXWINDOWS();
00628
00629 friend class JED_WXWINDOWS_INTERFACE;
00630 friend void wxwindows_draw_callback(void);
00631 friend void wxwindows_wstatus_callback(int wstatus);
00632 };
00633
00634 VENTANA_WXWINDOWS::VENTANA_WXWINDOWS()
00635 {
00636 status = -1;
00637 id = -1;
00638 por_pintar = FALSE;
00639 }
00640
00641
00642
00643
00644
00645 static EVENTO_GUI EVENTO_wxwindows;
00646 static int PETICIONES_pendientes = 0;
00647 static BOOLEAN GUI_creada = FALSE;
00648 static LISTA<VENTANA_WXWINDOWS *> LAS_ventanas;
00649
00650
00651
00652
00653
00654 #ifdef NONONO
00655 static void quit_callback(int ) { exit(1); }
00656 #endif
00657 static void pintar_nulo(int ) { ; }
00658 static void resize_nulo(int , int , int ) { ; }
00659 static int evento_nulo(EVENTO_GUI * , int ) { return 0; }
00660
00661
00662
00663
00664
00665 static void
00666 wxwindows_idle_callback(_WXWINDOWS_GLWIDGET *w)
00667 {
00668 static BOOLEAN ocupado = FALSE;
00669
00670 if ( ocupado ) return;
00671 ocupado = TRUE;
00672
00673 if ( WXWINDOWSGUI_tick_callback ) {
00674 int cod = WXWINDOWSGUI_tick_callback(1);
00675 if ( cod != 0 && QUIERO_pintarme >= 0) {
00676 QUIERO_pintarme = cod;
00677 }
00678 }
00679
00680 if ( QUIERO_pintarme != 0 ) {
00681
00682 QUIERO_pintarme = 0;
00683 w->Refresh(FALSE);
00684 w->Update();
00685 }
00686
00687 ocupado = FALSE;
00688 }
00689
00690 void
00691 wxwindows_draw_callback(void)
00697 {
00698 int i, b;
00699
00700
00701 switch ( QUIERO_pintarme ) {
00702 case -1:
00703 for ( i = 0; i < LAS_ventanas.tam(); i++ ) {
00704
00705 WXWINDOWSGUI_draw_callback(LAS_ventanas[i]->id);
00706 glFlush(); glFinish();
00707 }
00708 for ( i = 0; BUFFER_doble && i < LAS_ventanas.tam(); i++ ) {
00709
00710
00711 }
00712
00713 break;
00714 case 1:
00715 for ( i = 0; i < LAS_ventanas.tam(); i++ ) {
00716 if ( LAS_ventanas[i]->por_pintar ||
00717 LAS_ventanas[i]->id == b ) {
00718
00719 WXWINDOWSGUI_draw_callback(LAS_ventanas[i]->id);
00720 glFlush(); glFinish();
00721 }
00722 }
00723 for ( i = 0; BUFFER_doble && i < LAS_ventanas.tam(); i++ ) {
00724 if ( LAS_ventanas[i]->por_pintar ||
00725 LAS_ventanas[i]->id == b ) {
00726
00727
00728 LAS_ventanas[i]->por_pintar = FALSE;
00729 }
00730 }
00731
00732 break;
00733 case 0: default:
00734 break;
00735 }
00736
00737 QUIERO_pintarme = 0;
00738 }
00739
00740
00741
00742
00743
00744 JED_WXWINDOWS_INTERFACE::JED_WXWINDOWS_INTERFACE()
00745 {
00746 BUFFER_doble = TRUE;
00747
00748 MACHETE_gui = this;
00749 WXWINDOWSGUI_draw_callback = pintar_nulo;
00750 WXWINDOWSGUI_tick_callback = NULL;
00751 WXWINDOWSGUI_mouse_callback = evento_nulo;
00752 WXWINDOWSGUI_keyboard_callback = evento_nulo;
00753 WXWINDOWSGUI_resize_callback = resize_nulo;
00754 WXWINDOWSGUI_multiview_callback = NULL;
00755 WXWINDOWSGUI_ejecutor_callback = NULL;
00756 Controles_pendientes = NULL;
00757 Repositorio_pendiente = NULL;
00758
00759 _xtam = 320;
00760 _ytam = 240;
00761 _nombre = NULL;
00762 _Argc = 0;
00763 _ARgv = NULL;
00764 LA_Gui = this;
00765 }
00766
00767 JED_WXWINDOWS_INTERFACE::~JED_WXWINDOWS_INTERFACE()
00768 {
00769 ;
00770 }
00771
00772 void
00773 JED_WXWINDOWS_INTERFACE::solicitar_repintado(void)
00774 {
00775 QUIERO_pintarme = -1;
00776 }
00777
00778 void JED_WXWINDOWS_INTERFACE::set_draw_callback( void (*p)(int context_id) )
00779 { WXWINDOWSGUI_draw_callback = p; }
00780
00781 void JED_WXWINDOWS_INTERFACE::set_tick_callback( int (*p)(int context_id) )
00782 { WXWINDOWSGUI_tick_callback = p; }
00783
00784 void JED_WXWINDOWS_INTERFACE::set_keyboard_callback(
00785 int (*p)(EVENTO_GUI *e, int context_id) )
00786 { WXWINDOWSGUI_keyboard_callback = p; }
00787
00788 void JED_WXWINDOWS_INTERFACE::set_mouse_callback(
00789 int (*p)(EVENTO_GUI *e, int context_id) )
00790 { WXWINDOWSGUI_mouse_callback = p; }
00791
00792 void JED_WXWINDOWS_INTERFACE::set_resize_callback(
00793 void (*p)(int x_tam, int y_tam, int context_id) )
00794 { WXWINDOWSGUI_resize_callback = p; }
00795
00796 void JED_WXWINDOWS_INTERFACE::set_ejecutor( int (*p)(int idc, int context_id) )
00797 { WXWINDOWSGUI_ejecutor_callback = p; }
00798
00799 void JED_WXWINDOWS_INTERFACE::set_multiview_callback(void (*p)(int operacion,
00800 int id_vista, char *detalles, char *menu, char *botonera) )
00801 { WXWINDOWSGUI_multiview_callback = p; }
00802
00803 BOOLEAN
00804 JED_WXWINDOWS_INTERFACE::crear(int *Argc, char *argv[], int x_tam, int y_tam, char *nombre)
00805 {
00806 EVNT_EVENTO_GUI = &EVENTO_wxwindows;
00807
00808
00809
00810 _xtam = x_tam;
00811 _ytam = y_tam;
00812 _nombre = new char [strlen(nombre) + 1];
00813 strcpy(_nombre, nombre);
00814 _Argc = Argc;
00815 _ARgv = argv;
00816
00817 #ifdef DEBUG_WXWINDOWS
00818 printf("<JED_WXWINDOWS_INTERFACE> Creo una interfaz inicial de %d x %d "
00819 "llamada \"%s\".\n", _xtam, _ytam, _nombre);
00820 fflush(stdout);
00821 #endif
00822
00823
00824 leer_gui("etc/spanish.gui");
00825
00826 return TRUE;
00827 }
00828
00829 void
00830 wxwindows_wstatus_callback(int wstatus)
00831 {
00832 int i, id;
00833 VENTANA_WXWINDOWS *V = NULL;
00834
00835
00836
00837 for ( i = 0; i < LAS_ventanas.tam(); i++ ) {
00838 if ( LAS_ventanas[i]->id == id ) {
00839 V = LAS_ventanas[i];
00840 break;
00841 }
00842 }
00843 if ( !V ) return;
00844
00845
00846 if ( V->status >= 0 && wstatus != V->status && wstatus > 0 ) {
00847 if ( !QUIERO_pintarme ) QUIERO_pintarme = 1;
00848 V->por_pintar = TRUE;
00849 }
00850 else QUIERO_pintarme = 0;
00851 V->status = wstatus;
00852 }
00853
00854 void
00855 wxwindows_draw1_callback(void)
00856 {
00857 WXWINDOWSGUI_draw_callback(1);
00858 glFlush(); glFinish();
00859
00860
00861 }
00862
00863 #ifdef NONONO
00864 void
00865 JED_WXWINDOWS_INTERFACE::crear_ventana_wxwindows(void)
00866 {
00867
00868 GUI_MENU *Global = resolver_menu(menu);
00869 int menu_wxwindows;
00870
00871 if ( lista_menus.tam() > 0 && Global ) {
00872
00873 }
00874 else {
00875
00876
00877
00878 }
00879
00880
00881
00882
00883
00884
00885 LAS_ventanas.anx(Nueva_ventana);
00886
00887 }
00888 #endif
00889
00890 void
00891 JED_WXWINDOWS_INTERFACE::ejecutar(void)
00892 {
00893
00894 #ifdef DEBUG_WXWINDOWS
00895 printf("<JED_WXWINDOWS_INTERFACE> Ejecutando interface...\n");
00896 fflush(stdout);
00897 #endif
00898
00899 #if PLATAFORMA == i386_LINUX_GCC
00900 wxEntry(*_Argc, _ARgv);
00901 #endif
00902 #if PLATAFORMA == i386_WIN32_VC
00903 wxEntry(i386_WIN32_VC_instancia_actual, i386_WIN32_VC_instancia_previa,
00904 i386_WIN32_VC_linea_de_comandos, i386_WIN32_VC_modo_visual);
00905 #endif
00906 }
00907
00908 void
00909 JED_WXWINDOWS_INTERFACE::finalizar(void)
00910 {
00911 exit(1);
00912 }
00913
00914 void
00915 JED_WXWINDOWS_INTERFACE::solicitar_nueva_ventana(void)
00918 {
00919 if ( GUI_creada ) {
00920
00921 }
00922 else {
00923 PETICIONES_pendientes++;
00924 }
00925 }
00926
00927 BOOLEAN
00928 JED_WXWINDOWS_INTERFACE::anexar_controles(
00929 #ifndef WXWINDOWS_ENABLED
00930 LISTA <CONTROL_GUI *> * ,
00931 REPOSITORIO_DE_ENTIDADES *
00932 #endif
00933 #ifdef WXWINDOWS_ENABLED
00934 LISTA <CONTROL_GUI *> *Controles, REPOSITORIO_DE_ENTIDADES *Repositorio
00935 #endif
00936 )
00937 {
00938 #ifndef WXWINDOWS_ENABLED
00939 return FALSE;
00940 #endif
00941 #ifdef WXWINDOWS_ENABLED
00942 Controles_pendientes = Controles;
00943 Repositorio_pendiente = Repositorio;
00944
00945 return TRUE;
00946 #endif
00947 }
00948
00949 #endif // WXWINDOWS_ENABLED
00950
00951
00952
00953
00954