core/vgui/vgui_shell_tableau.cxx
Go to the documentation of this file.
00001 // \author fsm
00002 
00003 #include "vgui_shell_tableau.h"
00004 
00005 #include <vgui/vgui.h>
00006 #include <vgui/vgui_adaptor.h>
00007 #include <vgui/vgui_event.h>
00008 #include <vgui/vgui_menu.h>
00009 #include <vgui/vgui_clear_tableau.h>
00010 #include <vgui/vgui_tview_launcher_tableau.h>
00011 #include <vcl_iostream.h>
00012 
00013 vgui_event_condition vgui_shell_tableau_bindings::default_quit  = vgui_event_condition( vgui_key('q'), vgui_ALT );
00014 vgui_event_condition vgui_shell_tableau_bindings::default_close = vgui_event_condition( vgui_key('w'), vgui_ALT );
00015 vgui_event_condition vgui_shell_tableau_bindings::default_graph = vgui_event_condition( vgui_key('g'), vgui_SHIFT );
00016 
00017 
00018 vgui_shell_tableau::vgui_shell_tableau(vgui_tableau_sptr const &t0)
00019 {
00020   init();
00021   vgui_composite_tableau::add(t0);
00022 }
00023 
00024 vgui_shell_tableau::vgui_shell_tableau(vgui_tableau_sptr const &t0,
00025                                        vgui_tableau_sptr const &t1)
00026 {
00027   init();
00028   vgui_composite_tableau::add(t0);
00029   vgui_composite_tableau::add(t1);
00030 }
00031 
00032 vgui_shell_tableau::vgui_shell_tableau(vgui_tableau_sptr const &t0,
00033                                        vgui_tableau_sptr const &t1,
00034                                        vgui_tableau_sptr const &t2)
00035 {
00036   init();
00037   vgui_composite_tableau::add(t0);
00038   vgui_composite_tableau::add(t1);
00039   vgui_composite_tableau::add(t2);
00040 }
00041 
00042 vgui_shell_tableau::vgui_shell_tableau(vgui_tableau_sptr const &t0,
00043                                        vgui_tableau_sptr const &t1,
00044                                        vgui_tableau_sptr const &t2,
00045                                        vgui_tableau_sptr const &t3)
00046 {
00047   init();
00048   vgui_composite_tableau::add(t0);
00049   vgui_composite_tableau::add(t1);
00050   vgui_composite_tableau::add(t2);
00051   vgui_composite_tableau::add(t3);
00052 }
00053 
00054 void vgui_shell_tableau::init()
00055 {
00056   clear = vgui_clear_tableau_new();
00057   graph = vgui_tview_launcher_tableau_new();
00058 
00059   vgui_composite_tableau::add(clear);
00060   vgui_composite_tableau::add(graph);
00061 
00062   set_quit( true );
00063   set_enable_key_bindings( false );
00064 }
00065 
00066 vgui_shell_tableau::~vgui_shell_tableau()
00067 {
00068   vgui_composite_tableau::remove(graph);
00069   vgui_composite_tableau::remove(clear);
00070 }
00071 
00072 //--------------------------------------------------------------------------------
00073 
00074 #include <vgui/vgui_text_graph.h>
00075 
00076 bool vgui_shell_tableau::handle(vgui_event const &e)
00077 {
00078   if ( bindings.quit(e) ) {
00079     e.origin->post_destroy();
00080     vgui::quit();
00081   }
00082 
00083   if ( bindings.close(e) ) {
00084     e.origin->post_destroy();
00085   }
00086 
00087   if ( bindings.graph(e) ) {
00088     vgui_text_graph(vcl_cerr);
00089   }
00090 
00091   // "draw" event : return true unless some child returns false.
00092   if ( e.type==vgui_DRAW || e.type==vgui_DRAW_OVERLAY ) {
00093     bool retv = true;
00094 
00095     for ( unsigned i=0; i<children.size(); ++i ) {
00096       //PM.restore();
00097 #ifdef DEBUG
00098       vcl_cerr << "DRAW";
00099 #endif
00100       if ( active[i] && children[i] )
00101         if ( !children[i]->handle(e) )
00102           retv=false;
00103     }
00104     return retv;
00105   }
00106 
00107   // "normal" event : pass it on till handled.
00108   for ( unsigned i=0; i < children.size(); ++i ) {
00109     if (active[i] && children[i])
00110       if ( children[i]->handle(e) )
00111         return true;
00112   }
00113 
00114   // Noone was interested....
00115   return false;
00116 }
00117 
00118 void vgui_shell_tableau::get_popup(vgui_popup_params const &params, vgui_menu &menu)
00119 {
00120   // add clear tableau
00121   clear->get_popup(params, menu);
00122 
00123   // add graph launcher
00124   graph->get_popup(params, menu);
00125 
00126   menu.separator();
00127 
00128   // we skip the first two children.
00129   for (unsigned i=2; i<children.size(); ++i)
00130     children[i]->get_popup(params, menu);
00131 }
00132 
00133 // mimic the old behaviour. The old behaviour is: the graph condition
00134 // is checked iff enable_key_bindings==true; close and quit conditions
00135 // are checked iff enable_key_bindings==true \b and do_quit==true.
00136 //
00137 void vgui_shell_tableau::set_quit(bool on)
00138 {
00139   do_quit = on;
00140   if ( do_quit ) {
00141     bindings.set_quit( key_bindings_type::default_quit );
00142     bindings.set_close( key_bindings_type::default_close );
00143   }
00144   else {
00145     bindings.set_quit( vgui_event_condition() );
00146     bindings.set_close( vgui_event_condition() );
00147   }
00148 }
00149 
00150 // mimic the old behaviour. See comment above.
00151 void vgui_shell_tableau::set_enable_key_bindings(bool on)
00152 {
00153   enable_key_bindings = on;
00154   if ( enable_key_bindings ) {
00155     bindings.set_graph( key_bindings_type::default_graph );
00156     // enable quit and close bindings depending on current value of do_quit.
00157     this->set_quit( do_quit );
00158   }
00159   else {
00160     // disable all bindings
00161     bindings.set_quit( vgui_event_condition() );
00162     bindings.set_close( vgui_event_condition() );
00163     bindings.set_graph( vgui_event_condition() );
00164   }
00165 }