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

_wxwindows.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= _wxwindows.C                                               Mayo de 2002 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definicion de elementos GUI especificos a WXWINDOWS                     =
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 "jed_gl.h"
00028 #include "framework/gui/_wxwindows.h"
00029 #include "lista.cc"
00030 #include "toolkits/entorno/jed_evnt.h"
00031 
00032 //===========================================================================
00033 //= Chequeo de activacion de esta interfaz                                  =
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 //#define DEBUG_WXWINDOWS 1
00045 
00046 #define TIMER_ID 1
00047 
00048 //===========================================================================
00049 //= CONSTANTES Y MACROS                                                     =
00050 //===========================================================================
00051 
00052 #define ID_NEW_WINDOW 10000
00053 
00054 //===========================================================================
00055 //= VARIABLES GLOBALES (INCLUYE LA INICIALIZACION DE ATRIBUTOS ESTATICOS)   =
00056 //===========================================================================
00057 
00058 static JED_WXWINDOWS_INTERFACE *LA_Gui = NULL;
00059 static int GLOBAL_glwidget_id = 1; // Estos dos deben ser iguales!
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;      // EL SUPER-CANDADO!
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 // Manejadores de las funciones callback de aplicacion (apuntadores a funcion)
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 //= Clase _WXWINDOWS_GLWIDGET                                                =
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     // Do nothing, to avoid flashing.
00168 }
00169 
00170 void
00171 _WXWINDOWS_GLWIDGET::OnEnterWindow( wxMouseEvent& event )
00174 {
00175     SetFocus();
00176 //    OnMotion(event);
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     // this is also necessary to update the context on some platforms
00271 //    wxGLCanvas::OnSize(event);
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 //= Clase _WXWINDOWS_NOTEBOOK                                                =
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 //= Clase _WXWINDOWS_WINDOW                                                  =
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     // Give it an icon
00412 //  #ifdef __WXMSW__
00413 //    frame->SetIcon(wxIcon("mondrian"));
00414 //  #endif
00415 
00416     // Make a menubar
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     // Barra de estado
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     //wxString s;
00450     //s.Printf("Se eligio la opcion #%d", evento.GetId());
00451     //wxMessageBox(s, "Opcion de menu ejecutada!", wxICON_INFORMATION);
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 //        panel_sizer->SetSizeHints(this); // Con tamano minimo...
00473         this->Refresh();
00474         this->Update();
00475       }
00476       else {
00477         nuevo = area2->crear_pagina();
00478     }
00479 
00480     return nuevo;
00481 }
00482 
00483 //===========================================================================
00484 //= Clase _WXWINDOWS_APLICACION                                              =
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 //    wxLog::SetTraceMask(wxTraceMessages);
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     // Give it an icon
00521 //  #ifdef wx_msw
00522 //    marco->SetIcon(wxIcon("mondrian"));
00523 //  #endif
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         // Ingresa a la GUI WXWINDOWS los items del menu
00532         menubar = Global->crear_wxw_barra(marco);
00533       }
00534       else {
00535         // Ingresa a la GUI WXWINDOWS algunos items por defecto
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 //    marco->panel_sizer->SetSizeHints(marco); // Con tamano minimo...
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     // Barra de estado
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 //= PROGRAMA DE ENTRADA                                                     =
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 //= CLASES UTILITARIAS WXWINDOWS                                            =
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 //= Variables globales                                                      =
00643 //===========================================================================
00644 
00645 static EVENTO_GUI EVENTO_wxwindows;     // Esto es para que funcione EVNT_EVENTO_GUI
00646 static int PETICIONES_pendientes = 0; // # de ventanas con que inicia esta GUI
00647 static BOOLEAN GUI_creada = FALSE;    // TRUE cuando ya esta lista la GUI
00648 static LISTA<VENTANA_WXWINDOWS *> LAS_ventanas;
00649 
00650 //===========================================================================
00651 //= Funciones que definen el comportamiento por defecto                     =
00652 //===========================================================================
00653 
00654 #ifdef NONONO
00655 static void quit_callback(int /*param*/) { exit(1); }
00656 #endif
00657 static void pintar_nulo(int /*context_id*/) { ; }
00658 static void resize_nulo(int /*x*/, int /*y*/, int /*context_id*/) { ; }
00659 static int  evento_nulo(EVENTO_GUI * /*e*/, int /*context_id*/) { return 0; }
00660 
00661 //===========================================================================
00662 //= Funciones callback para WXWINDOWS                                       =
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         //wxwindows_draw_callback();
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 //    b = wxwindowsGetWindow();
00701     switch ( QUIERO_pintarme ) {
00702       case -1:
00703         for ( i = 0; i < LAS_ventanas.tam(); i++ ) {
00704 //            wxwindowsSetWindow(LAS_ventanas[i]->id);
00705             WXWINDOWSGUI_draw_callback(LAS_ventanas[i]->id);
00706             glFlush(); glFinish();
00707         }
00708         for ( i = 0; BUFFER_doble && i < LAS_ventanas.tam(); i++ ) {
00709 //            wxwindowsSetWindow(LAS_ventanas[i]->id);
00710 //            wxwindowsSwapBuffers();
00711         }
00712 //        wxwindowsSetWindow(b);
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 //                wxwindowsSetWindow(LAS_ventanas[i]->id);
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 //                wxwindowsSetWindow(LAS_ventanas[i]->id);
00727 //                wxwindowsSwapBuffers();
00728                 LAS_ventanas[i]->por_pintar = FALSE;
00729             }
00730         }
00731 //        wxwindowsSetWindow(b);
00732         break;
00733       case 0: default:
00734         break;
00735     }
00736 
00737     QUIERO_pintarme = 0;
00738 }
00739 
00740 //===========================================================================
00741 //= Clase JED_WXWINDOWS_INTERFACE                                           =
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     //- Inicializacion wxwindows -------------------------------------------
00809 //    wxwindowsInit(Argc, argv);
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 //    id = wxwindowsGetWindow();
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 //    wxwindowsSwapBuffers();
00860 //    wxwindowsPostRedisplay();
00861 }
00862 
00863 #ifdef NONONO
00864 void
00865 JED_WXWINDOWS_INTERFACE::crear_ventana_wxwindows(void)
00866 {
00867     //- Arma y asocia un menu para la ventana -------------------------------
00868     GUI_MENU *Global = resolver_menu(menu);
00869     int menu_wxwindows;
00870 
00871     if ( lista_menus.tam() > 0 && Global ) {
00872         //menu_wxwindows = Global->crear_wxwindows(wxwindows_menu_callback);
00873       }
00874       else {
00875         //menu_wxwindows = wxwindowsCreateMenu(quit_callback);
00876         //wxwindowsSetMenu(menu_wxwindows);
00877         //wxwindowsAddMenuEntry("Salir", 666);
00878     }
00879 
00880     //wxwindowsSetMenu(menu_wxwindows);
00881     //wxwindowsSetWindow(Nueva_ventana->id);
00882     //wxwindowsAttachMenu(WXWINDOWS_RIGHT_BUTTON);
00883 
00884     //- Anexa la ventana a la lista de ventanas ----------------------------
00885     LAS_ventanas.anx(Nueva_ventana);
00886 //    wxwindowsSetWindow(Nueva_ventana->id);
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 //        crear_ventana_wxwindows();
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 *> * /*Controles*/,
00931     REPOSITORIO_DE_ENTIDADES * /*Repositorio*/
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 //= EOF                                                                     =
00953 //===========================================================================
00954 

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.