]> Creatis software - bbtk.git/blob - kernel/src/bbtkWxConsole.cxx
Global factory in course of removal... does not compile but have to commit to continu...
[bbtk.git] / kernel / src / bbtkWxConsole.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbtkWxConsole.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/03/07 08:40:14 $
7   Version:   $Revision: 1.7 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*//**
18  * \brief Short description in one line
19  * 
20  * Long description which 
21  * can span multiple lines
22  */
23 /**
24  * \file 
25  * \brief 
26  */
27 /**
28  * \class bbtk::
29  * \brief 
30  */
31
32
33 #ifdef _USE_WXWIDGETS_
34
35 #include <iostream>     
36 #include "bbtkWxConsole.h"
37 #include "bbtkWxBlackBox.h"
38 #include "bbtkConfigurationFile.h"
39
40 namespace bbtk
41 {
42
43   WxConsole* WxConsole::mInstance = 0;
44 // On Windows when compiling a dll, wx prevents the compilation
45 // of the class wxStreamToTextRedirector (why ? it is a nightmare...)
46 // The blocking symbol is wxHAS_TEXT_WINDOW_STREAM.
47 // Note also that wxStreamToTextRedirector use the fact that wx is 
48 // compiled with the option WX_USE_STD_STREAMS in which case 
49 // wxTextCtrl inherits from std::streambuf and the redirection 
50 // can be done simply by setting the std::cout buffer to the 
51 // one of the wxTextCtrl. 
52 // So on windows, we have to redirect manually std::cout to mwxTextHistory.  
53 // Finally, on all systems we made our redirection class to redirect both to
54 // the WxConsole and to printf in order to get a console trace when 
55 // the appli crashes (we could also imagine to log in a file...)
56 // This is why we finally wrote our own redirection which is crossplatform
57 // (drawback : not optimal on Unix platform; we could think of 
58 // a particular implementation...).
59
60   //================================================================
61   /// Redirects std::cout to a wxTextCtrl and optionally to printf also
62   class WxTextCtrlStreamRedirector   : public std::streambuf
63   {       
64     
65   public:
66     
67  
68     WxTextCtrlStreamRedirector(std::ostream& redirect,
69                                  wxTextCtrl *text, 
70                                  const wxColour& colour = *wxBLACK,
71                                  bool doprintf=true,
72                                  int bufferSize=1000)
73       : mText(text),
74         mPrintf(doprintf),
75         m_ostr(redirect),
76         mColour(colour)
77     {
78       if (bufferSize)
79         {
80           char *ptr = new char[bufferSize];
81           setp(ptr, ptr + bufferSize);
82         }
83       else
84         setp(0, 0);
85       
86       m_sbufOld = m_ostr.rdbuf();
87       m_ostr.rdbuf(this);
88     }
89     
90     ~WxTextCtrlStreamRedirector()
91     {
92       sync();
93       delete[] pbase();
94       m_ostr.rdbuf(m_sbufOld);
95     }
96   
97    virtual void writeString(const std::string &str) 
98     {
99       const wxTextAttr& style = mText->GetDefaultStyle();
100       mText->SetDefaultStyle(mColour);
101       mText->AppendText(std2wx(str));
102       mText->SetDefaultStyle(style);
103      
104       if (mPrintf) 
105         {
106           printf("%s",str.c_str());
107         }
108     }
109     
110   
111   private:
112     wxTextCtrl* mText;
113     // 
114     bool mPrintf;
115     // the stream we're redirecting
116     std::ostream&   m_ostr;
117     // the old streambuf (before we changed it)
118     std::streambuf *m_sbufOld;
119     //
120     wxColour mColour;
121     
122   private:
123     int overflow(int c)
124     {
125       sync();
126       
127       if (c != EOF)
128         {
129           if (pbase() == epptr())
130             {
131               std::string temp;
132               temp += char(c);
133               writeString(temp);
134             }
135           else
136             sputc(c);
137         }
138       
139       return 0;
140     }
141     
142     int sync()
143     {
144       if (pbase() != pptr())
145         {
146           int len = int(pptr() - pbase());
147           std::string temp(pbase(), len);
148           writeString(temp);
149           setp(pbase(), epptr());
150         }
151       return 0;
152     }
153   };
154   //================================================================
155
156   
157   
158   //================================================================
159   WxConsole::WxConsole( wxWindow *parent, wxString title, wxSize size)
160     : wxFrame((wxFrame *)parent, -1, title, wxDefaultPosition, size)
161   {     
162     mInstance = this;
163     mInterpreter = new bbtk::Interpreter();
164     mInterpreter->SetWxConsole(this);
165     mInterpreter->SetCommandLine(true);
166     //==============
167     // Menu
168     wxInitAllImageHandlers();
169     
170     wxMenu *menuFile = new wxMenu;
171     menuFile->Append( ID_Menu_Quit, _T("&Quit") );
172     
173     wxMenu *menuAbout = new wxMenu;
174     menuAbout->Append( ID_Menu_About, _T("&About...") );
175
176     wxMenu *menuTools = new wxMenu;
177     menuTools->Append( ID_Menu_CreatePackage, _T("&Create package") );
178     menuTools->Append( ID_Menu_CreateBlackBox, _T("&Create blackbox") );
179     menuTools->Append( ID_Menu_ShowImageGraph, _T("&Show last image graph") );
180     
181     
182     wxMenuBar *menuBar = new wxMenuBar;
183     menuBar->Append( menuFile, _T("&File") );
184     menuBar->Append( menuTools, _T("&Tools") );
185     menuBar->Append( menuAbout, _T("About") );
186     
187     SetMenuBar( menuBar );
188     
189     CreateStatusBar();
190     SetStatusText( _T("Welcome to bbi !") );
191     
192     //==============
193     // Notebook
194     
195     //    wxFlexGridSizer *sizer = new wxFlexGridSizer(1);
196     
197 //EED    wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
198 //    mwxNotebook = new wxNotebook(this,-1,wxDefaultPosition, wxDefaultSize, 0);
199     mwxNotebook = new wxAuiNotebook(this,  
200                                                                 -1, 
201                                                                 wxPoint(0, 0), 
202                                                                 wxSize(500,500),
203                                                                 wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_EXTERNAL_MOVE | wxNO_BORDER);
204     
205     mwxPageCommand = new wxPanel(mwxNotebook,-1);    
206     mwxNotebook->AddPage( mwxPageCommand, _T("Command"));
207     
208     mwxPageHelp = new wxPanel(mwxNotebook,-1);    
209     mwxNotebook->AddPage( mwxPageHelp, _T("Help"));
210     
211
212
213 //EED    sizer->Add ( mwxNotebook, 1, wxEXPAND /*| wxALIGN_BOTTOM*/ );
214     wxAuiManager *m_mgr = new wxAuiManager(this);
215         m_mgr->AddPane(mwxNotebook, wxAuiPaneInfo().Name(wxT("notebook_content")).CenterPane().PaneBorder(false)); 
216     m_mgr->Update();
217     
218     wxBoxSizer *cmdsizer = new wxBoxSizer(wxVERTICAL);
219     
220     mwxPageCommand->SetAutoLayout(true);    
221     mwxPageCommand->SetSizer(cmdsizer);
222     cmdsizer->Fit(mwxPageCommand);
223     cmdsizer->SetSizeHints(mwxPageCommand);
224
225     wxBoxSizer *helpsizer = new wxBoxSizer(wxVERTICAL);
226     
227     mwxPageHelp->SetAutoLayout(true);    
228     mwxPageHelp->SetSizer(helpsizer);
229     helpsizer->Fit(mwxPageHelp);
230     helpsizer->SetSizeHints(mwxPageHelp);
231    
232     mwxHtmlWindow = new WxBrowser(mwxPageHelp,
233 //EED                             wxSize(1200,0));
234                                           wxSize(200,0));
235
236     //    mwxHtmlWindow->SetSize(wxSize(800,1000));
237     helpsizer->Add (mwxHtmlWindow,1,   wxGROW |wxLEFT | wxRIGHT | wxBOTTOM  );
238 //    helpsizer->Add ( new wxButton(mwxPageHelp,-1,"perro"), 0,  wxEXPAND  );
239   
240     //==============
241     // Command page 
242
243     mwxTextHistory = 
244       new wxTextCtrl(mwxPageCommand,
245                      ID_Text_History,
246                      _T(""),wxDefaultPosition,
247                      wxDefaultSize, //HistorySize,
248                      wxTE_READONLY |
249                      wxTE_MULTILINE );
250  
251     wxFont* FixedFont = new wxFont(10,
252                                    wxFONTFAMILY_MODERN,
253                                    wxFONTSTYLE_NORMAL,
254                                    wxFONTWEIGHT_NORMAL,
255                                    false);
256
257    mwxTextHistoryAttr = new wxTextAttr;
258    mwxTextHistoryAttr->SetFont(*FixedFont);
259   /* 
260    mwxTextCommand = 
261      new wxTextCtrl(mwxPageCommand,
262                     ID_Text_Command,
263                     _T(""),wxDefaultPosition,
264                     wxDefaultSize,
265                     wxTE_PROCESS_ENTER
266                     | wxTE_PROCESS_TAB 
267                     | wxWANTS_CHARS 
268                     //|  wxTAB_TRAVERSAL
269                     );
270     mwxTextCommandAttr = new wxTextAttr;   
271     mwxTextCommandAttr->SetFont(*FixedFont);
272     mwxTextCommand->SetDefaultStyle(*mwxTextCommandAttr);
273    */
274    mwxTextCommand = 
275      new wxComboBox(mwxPageCommand,
276                     ID_Text_Command,
277                     _T("")
278 //                  wxDefaultPosition,
279 //                  wxDefaultSize,
280 //                  wxTE_PROCESS_ENTER
281 //                  | wxTE_PROCESS_TAB 
282 //                  | wxWANTS_CHARS 
283 //                  //|  wxTAB_TRAVERSAL
284                     );
285    
286
287     mwxTextCommand->SetFocus();
288
289     wxPanel *btnsCtrlPanel = CreateBtnsCtrlPanel(mwxPageCommand);
290     
291         wxButton *btnGo         = new wxButton( mwxPageCommand,-1,_T("Go")              );        
292         Connect(btnGo->GetId()  , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnGo    );
293     
294     wxFlexGridSizer *sizerCommand= new wxFlexGridSizer(2);
295     sizerCommand->AddGrowableCol(0);
296     sizerCommand->Add(mwxTextCommand,1,wxGROW);
297     sizerCommand->Add(btnGo);
298     
299     cmdsizer->Add ( mwxTextHistory, 1, wxALL | wxGROW, 10);
300 //EED    cmdsizer->Add ( mwxTextCommand, 0, wxLEFT | wxRIGHT | wxBOTTOM | wxGROW, 10 );
301     cmdsizer->Add ( sizerCommand, 0, wxLEFT | wxRIGHT | wxBOTTOM | wxGROW, 10 );
302     cmdsizer->Add ( btnsCtrlPanel, 0, wxLEFT | wxRIGHT | wxBOTTOM  | wxGROW, 10 );
303
304     
305     //  cmdsizer->AddGrowableCol(0);
306     //  cmdsizer->AddGrowableRow(0);
307     // cmdsizer->AddGrowableRow(1);
308     //  cmdsizer->SetFlexibleDirection(wxBOTH);
309
310     //=============================
311     // Events connection
312     // COMMAND
313     // ENTER
314     /*
315     Connect( mwxTextCommand->GetId(),
316              wxEVT_COMMAND_TEXT_ENTER,
317              (wxObjectEventFunction)& WxConsole::OnCommandEnter );
318     Connect( mwxTextCommand->GetId(),
319              wxEVT_CHAR,
320              //wxEVT_COMMAND_TEXT_UPDATED,
321              (wxObjectEventFunction)& WxConsole::OnCommandChar );
322     */
323     // MENU
324     //    Connect ( 
325
326     // Redirection of std::cout to mwxTextHistory and printf
327     mRedirect_cout = 
328       new WxTextCtrlStreamRedirector(std::cout,mwxTextHistory,*wxBLACK,true);
329     mRedirect_cerr = 
330       new WxTextCtrlStreamRedirector(std::cerr,mwxTextHistory,*wxGREEN,true); 
331         
332     // Sets the console as the parent window of all bbtk windows
333     Wx::SetTopWindow(this);
334
335
336     // Layout
337 //EED    SetSizer(sizer);
338     SetAutoLayout(true);
339     Layout();
340
341   }
342   //================================================================
343
344  //================================================================
345   WxConsole::~WxConsole()
346   {
347     delete mRedirect_cout;
348     delete mRedirect_cerr;
349   }
350   //================================================================
351
352
353   //================================================================
354   void WxConsole::OnCommandEnter(wxCommandEvent& event)
355   {
356     wxString line(mwxTextCommand->GetValue());
357     CommandString(line);
358   }
359   //================================================================
360
361   //================================================================  
362   void WxConsole::OnBtnGo(wxCommandEvent& event)
363   {
364         wxString line(mwxTextCommand->GetValue());
365         CommandString(line);
366   } 
367   //================================================================  
368   
369   //================================================================
370   void WxConsole::CommandString(wxString line )
371   {
372 printf("WxConsole::CommandString 01 \n");
373     wxString s = _T("> ") + line + _T("\n");
374     mwxTextHistoryAttr->SetTextColour(*wxRED);
375     mwxTextHistory->SetDefaultStyle(*mwxTextHistoryAttr);
376     mwxTextHistory->AppendText(s);
377     // send to standard console also 
378 printf("WxConsole::CommandString 02 \n");
379     printf("%s",wx2std(s).c_str());
380 //EED    mwxTextCommand->Clear();
381     mwxTextCommand->SetValue(_T(""));
382         mwxTextCommand->Append(line);
383     
384 //EED    mwxTextCommand->SetDefaultStyle(*mwxTextCommandAttr);
385     mwxTextHistoryAttr->SetTextColour(*wxBLACK);
386     mwxTextHistory->SetDefaultStyle(*mwxTextHistoryAttr);
387
388 printf("WxConsole::CommandString 03 \n");
389     try 
390     {
391       bool insideComment = false;
392 printf("WxConsole::CommandString 04 \n");
393            mInterpreter->InterpretLine( wx2std(line), insideComment );
394 printf("WxConsole::CommandString 05 \n");
395     }
396     catch (bbtk::QuitException)
397     {
398            Close(true); 
399     }
400     catch (bbtk::Exception e) 
401     {
402            e.Print();
403     }
404     catch (std::exception& e) 
405     {
406            std::cout << "* ERROR : "<<e.what()<<" (not in bbtk)"<<std::endl;
407     }
408     catch (...)
409     {
410            std::cout << "* UNDEFINED ERROR (not a bbtk nor a std exception)"
411                           << std::endl;
412     }
413 printf("WxConsole::CommandString 06 \n");
414   }
415   //================================================================
416
417
418   //================================================================
419   void WxConsole::OnMenuQuit(wxCommandEvent& WXUNUSED(event))
420   {
421     Close(true);
422   }
423   //================================================================
424
425
426   //================================================================
427   void WxConsole::OnMenuAbout(wxCommandEvent& WXUNUSED(event))
428   {
429     
430     wxMessageBox(_T("  bbi\nThe Black Box Toolkit interpreter\n(c) CREATIS-LRMN 2007"),
431                  _T("About ..."), wxOK | wxICON_INFORMATION, 
432                  this);
433   }
434   //================================================================
435
436   
437   //================================================================
438   void WxConsole::OnMenuCreatePackage(wxCommandEvent& WXUNUSED(event))
439   {
440     
441     wxMessageBox(_T("  Creating Package"),
442                  _T("Creating Package ..."), wxOK | wxICON_INFORMATION, 
443                  this);
444   }
445   //================================================================
446
447
448   //================================================================
449   void WxConsole::OnMenuCreateBlackBox(wxCommandEvent& WXUNUSED(event))
450   {
451     
452     wxMessageBox(_T("  Creating blackbox"),
453                  _T("Creating blackbox ..."), wxOK | wxICON_INFORMATION, 
454                  this);
455   }
456   //================================================================
457   
458   //================================================================
459   void WxConsole::OnMenuShowImageGraph(wxCommandEvent& WXUNUSED(event))
460   {
461     std::string default_doc_dir = ConfigurationFile::GetInstance().Get_default_temp_dir();
462
463 #if defined(WIN32)
464     std::string strappli="start ";
465 #else
466     std::string strappli="gnome-open ";
467 #endif
468     std::string strcommand = strappli +default_doc_dir+"/temp_dir/workspace_workspacePrototype.png";
469     system ( strcommand.c_str() );
470   }
471   //================================================================
472
473   
474   
475   //================================================================
476   void WxConsole::OnCommandChar(wxCommandEvent& event)
477   {
478     std::cout << "c";
479     /*
480     // Command completion  
481     std::vector<std::string> commands;
482     wxString sline( wx2std ( mwxTextCommand->GetValue() ) );
483     int ind = sline.size();
484     mInterpreter->FindCommandsWithPrefix( sline.c_str(),ind,commands);
485     if (commands.size()==1) 
486       {
487         std::string com = *commands.begin();
488         for (; ind<com.size(); ++ind) 
489           {
490             mwxTextCommand->TextAppend( std2wx ( com[ind]) ); 
491           }
492          mwxTextCommand->TextAppend(_T(" "));
493       }
494     else if (commands.size()>1) 
495       {
496         std::vector<std::string>::iterator i;
497         write(1,"\n",1);
498         for (i=commands.begin();i!=commands.end();++i) 
499           {
500             write(STDOUT_FILENO,(*i).c_str(),strlen((*i).c_str()));
501             PrintChar(' ');
502           }
503         write(STDOUT_FILENO,"\n> ",3);
504         //for (int j=0;j<ind;++j) 
505         //{
506         write(STDOUT_FILENO,line,ind); 
507         //  }
508       }
509     */
510   }
511   //================================================================
512
513   void WxConsole::ShowHtmlPage(std::string& page)
514   {
515     //  std::cout << "WxConsole::ShowHtmlPage('"<<page<<"')"<<std::endl;
516     if (mwxHtmlWindow->GoTo(page)) 
517       {
518 //EED   mwxNotebook->ChangeSelection(1);
519         mwxNotebook->SetSelection(1);
520       }
521     else 
522       {
523         //      std::cout << "ERROR html"<<std::endl;
524       }
525   } 
526
527   
528   
529   //================================================================  
530   wxPanel* WxConsole::CreateBtnsCtrlPanel(wxWindow *parent)
531   {
532           wxPanel *btnsCtrlPanel        = new wxPanel(parent,-1);
533           wxBoxSizer *btnsSizer         = new wxBoxSizer(wxHORIZONTAL);
534           
535           wxButton *btnInclude  = new wxButton( btnsCtrlPanel,-1,_T("Include")  );
536           wxButton *btnReset    = new wxButton( btnsCtrlPanel,-1,_T("Reset")            );
537           wxButton *btnConfig   = new wxButton( btnsCtrlPanel,-1,_T("Config")           );
538           wxButton *btnGraphS   = new wxButton( btnsCtrlPanel,-1,_T("Graph S.") );
539           wxButton *btnGraphD   = new wxButton( btnsCtrlPanel,-1,_T("Graph D.") );
540           wxButton *btnHelp     = new wxButton( btnsCtrlPanel,-1,_T("Help")             );
541           
542           btnsSizer->Add( btnInclude    );
543           btnsSizer->Add( btnReset              );
544           btnsSizer->Add( btnConfig             );
545           btnsSizer->Add( btnGraphS     );
546           btnsSizer->Add( btnGraphD     );
547           btnsSizer->Add( btnHelp               );
548           btnsCtrlPanel->SetSizer(btnsSizer);
549
550           Connect(btnInclude->GetId()   , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnInclude       );
551           Connect(btnReset->GetId()             , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnReset         );
552           Connect(btnConfig->GetId()    , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnConfig        );
553           Connect(btnGraphS->GetId()    , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnGraphS        );
554           Connect(btnGraphD->GetId()    , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnGraphD        );
555           Connect(btnHelp->GetId()              , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnHelp          );
556           return btnsCtrlPanel;
557   }
558   //================================================================  
559   
560   
561   //================================================================  
562   void WxConsole::OnBtnInclude(wxCommandEvent& event)
563   {
564             std::string default_doc_dir = ConfigurationFile::GetInstance().Get_default_temp_dir();
565             std::string stdDir = default_doc_dir+"/share/bbtk/bbs";
566             wxString defaultDir(stdDir.c_str(), wxConvUTF8);
567             
568                 wxFileDialog dialog(this, _T("Choose a file"),defaultDir, _T(""), _T("*.bbs"), wxOPEN );
569                 if (dialog.ShowModal() == wxID_OK)
570                 {
571 //                      std::string command(_T("include "));
572 //                      std::string pathfilename                = (const char *)(dialog.GetFilename().mb_str());
573                         wxString command(_T("include "));
574                         wxString pathfilename = dialog.GetPath();
575                         command += pathfilename;
576                         CommandString( command );
577                 }
578
579   }
580   //================================================================  
581
582   
583   //================================================================  
584   void WxConsole::OnBtnReset(wxCommandEvent& event)
585   {
586 printf("WxConsole::OnBtnReset 01 \n");
587           CommandString(_T("reset"));
588 printf("WxConsole::OnBtnReset 02 \n");
589   }
590   //================================================================  
591
592   
593   //================================================================  
594   void WxConsole::OnBtnConfig(wxCommandEvent& event)
595   {
596           CommandString(_T("config"));
597   }
598   //================================================================  
599
600   
601   
602   //================================================================  
603   void WxConsole::OnBtnGraphS(wxCommandEvent& event)
604   {
605           CommandString(_T("graph"));
606   }
607   //================================================================  
608
609   //================================================================  
610   void WxConsole::OnBtnGraphD(wxCommandEvent& event)
611   {
612           CommandString(_T("graph . 1"));
613   }
614   //================================================================  
615
616   //================================================================  
617   void WxConsole::OnBtnHelp(wxCommandEvent& event)
618   {
619           CommandString(_T("help"));
620   }
621   //================================================================  
622
623   
624   //================================================================  
625   BEGIN_EVENT_TABLE(WxConsole, wxFrame)
626     EVT_MENU(WxConsole::ID_Menu_Quit, WxConsole::OnMenuQuit)
627     EVT_MENU(WxConsole::ID_Menu_About, WxConsole::OnMenuAbout)
628     EVT_MENU(WxConsole::ID_Menu_CreatePackage, WxConsole::OnMenuCreatePackage)
629     EVT_MENU(WxConsole::ID_Menu_CreateBlackBox, WxConsole::OnMenuCreateBlackBox)
630     EVT_MENU(WxConsole::ID_Menu_ShowImageGraph, WxConsole::OnMenuShowImageGraph)
631     EVT_TEXT_ENTER(WxConsole::ID_Text_Command, WxConsole::OnCommandEnter)
632   //    EVT_CHAR(WxConsole::ID_Text_Command, WxConsole::OnCommandChar)
633     END_EVENT_TABLE()
634   //================================================================
635
636 } // namespace bbtk
637
638
639 #endif //_USE_WXWIDGETS_