]> Creatis software - bbtk.git/blob - kernel/src/bbtkWxConsole.cxx
dc7dc1d337b33b4e321dee8d4b8814fb5bcda257
[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/19 14:58:13 $
7   Version:   $Revision: 1.18 $
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 #include "bbtkWxStreamRedirector.h"
40
41 namespace bbtk
42 {
43
44
45   
46   //================================================================
47   WxConsole::WxConsole( wxWindow *parent, wxString title, wxSize size)
48     : wxFrame((wxFrame *)parent, -1, title, wxDefaultPosition, size)
49   {     
50 //    m_mgr = new wxAuiManager(this);
51         m_mgr.SetManagedWindow(this);
52    
53     mInterpreter = new bbtk::Interpreter();
54     mInterpreter->SetWxConsole(this);
55     mInterpreter->SetCommandLine(true);
56     //==============
57     // Menu
58     wxInitAllImageHandlers();
59     
60     wxMenu *menuFile = new wxMenu;
61     menuFile->Append( ID_Menu_Quit, _T("&Quit") );
62     
63     wxMenu *menuAbout = new wxMenu;
64     menuAbout->Append( ID_Menu_About, _T("&About...") );
65
66     wxMenu *menuTools = new wxMenu;
67     menuTools->Append( ID_Menu_EditConfig, _T("&Edit bbtk config") );
68     menuTools->Append( ID_Menu_CreatePackage, _T("Create &package") );
69     menuTools->Append( ID_Menu_CreateBlackBox, _T("Create &blackbox") );
70     menuTools->Append( ID_Menu_ShowImageGraph, _T("&Show last image graph") );
71     menuTools->Append( ID_Menu_CreateIndex, _T("&Generate index") );
72     
73     
74     wxMenuBar *menuBar = new wxMenuBar;
75     menuBar->Append( menuFile, _T("&File") );
76     menuBar->Append( menuTools, _T("&Tools") );
77     menuBar->Append( menuAbout, _T("About") );
78     
79     SetMenuBar( menuBar );
80     
81     CreateStatusBar();
82     SetStatusText( _T("Welcome to bbi !") );
83     
84     //==============
85     // Notebook
86     
87     //    wxFlexGridSizer *sizer = new wxFlexGridSizer(1);
88     
89 //EED    wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
90 //    mwxNotebook = new wxNotebook(this,-1,wxDefaultPosition, wxDefaultSize, 0);
91     mwxNotebook = new wxAuiNotebook(this,  
92                                     -1,
93                                     wxPoint(0, 0),
94                                     wxSize(500,500),
95                                     wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_EXTERNAL_MOVE | wxNO_BORDER);
96     
97     mwxPageCommand = new wxPanel(mwxNotebook,-1);        
98     mwxPageHelp = new wxPanel(mwxNotebook,-1);    
99     
100     
101     wxBoxSizer *cmdsizer = new wxBoxSizer(wxVERTICAL);
102     
103     mwxPageCommand->SetAutoLayout(true);    
104     mwxPageCommand->SetSizer(cmdsizer);
105     cmdsizer->Fit(mwxPageCommand);
106     cmdsizer->SetSizeHints(mwxPageCommand);
107
108     wxBoxSizer *helpsizer = new wxBoxSizer(wxVERTICAL);
109     
110     mwxPageHelp->SetAutoLayout(true);    
111     mwxPageHelp->SetSizer(helpsizer);
112     helpsizer->Fit(mwxPageHelp);
113     helpsizer->SetSizeHints(mwxPageHelp);
114    
115     mwxHtmlWindow = new WxBrowser(mwxPageHelp,
116 //EED                             wxSize(1200,0));
117                                           wxSize(200,0));
118
119     //    mwxHtmlWindow->SetSize(wxSize(800,1000));
120     helpsizer->Add (mwxHtmlWindow,1,   wxGROW |wxLEFT | wxRIGHT | wxBOTTOM  );
121 //    helpsizer->Add ( new wxButton(mwxPageHelp,-1,"perro"), 0,  wxEXPAND  );
122   
123     //==============
124     // Command page 
125
126     mwxTextHistory = 
127       new wxTextCtrl(mwxPageCommand,
128                      ID_Text_History,
129                      _T(""),wxDefaultPosition,
130                      wxDefaultSize, //HistorySize,
131                      wxTE_READONLY |
132                      wxTE_MULTILINE );
133  
134     wxFont* FixedFont = new wxFont(10,
135                                    wxFONTFAMILY_MODERN,
136                                    wxFONTSTYLE_NORMAL,
137                                    wxFONTWEIGHT_NORMAL,
138                                    false);
139
140    mwxTextHistoryAttr = new wxTextAttr;
141    mwxTextHistoryAttr->SetFont(*FixedFont);
142   /* 
143    mwxTextCommand = 
144      new wxTextCtrl(mwxPageCommand,
145                     ID_Text_Command,
146                     _T(""),wxDefaultPosition,
147                     wxDefaultSize,
148                     wxTE_PROCESS_ENTER
149                     | wxTE_PROCESS_TAB 
150                     | wxWANTS_CHARS 
151                     //|  wxTAB_TRAVERSAL
152                     );
153     mwxTextCommandAttr = new wxTextAttr;   
154     mwxTextCommandAttr->SetFont(*FixedFont);
155     mwxTextCommand->SetDefaultStyle(*mwxTextCommandAttr);
156    */
157    mwxTextCommand = 
158      new wxComboBox(mwxPageCommand,
159                     ID_Text_Command,
160                     _T(""),
161                     wxDefaultPosition,
162                     wxDefaultSize,
163                         0, NULL,
164                     wxTE_PROCESS_ENTER
165 //                  | wxTE_PROCESS_TAB 
166 //                  | wxWANTS_CHARS 
167 //                  //|  wxTAB_TRAVERSAL
168                     );
169    
170
171     mwxTextCommand->SetFocus();
172
173     wxPanel *btnsCtrlPanel = CreateBtnsCtrlPanel(mwxPageCommand);
174     
175         wxButton *btnGo         = new wxButton( mwxPageCommand,-1,_T("Go")              );        
176         Connect(btnGo->GetId()  , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnGo    );
177     
178     wxFlexGridSizer *sizerCommand= new wxFlexGridSizer(2);
179     sizerCommand->AddGrowableCol(0);
180     sizerCommand->Add(mwxTextCommand,1,wxGROW);
181     sizerCommand->Add(btnGo);
182     
183     cmdsizer->Add ( mwxTextHistory, 1, wxALL | wxGROW, 10);
184 //EED    cmdsizer->Add ( mwxTextCommand, 0, wxLEFT | wxRIGHT | wxBOTTOM | wxGROW, 10 );
185     cmdsizer->Add ( sizerCommand, 0, wxLEFT | wxRIGHT | wxBOTTOM | wxGROW, 10 );
186     cmdsizer->Add ( btnsCtrlPanel, 0, wxLEFT | wxRIGHT | wxBOTTOM  | wxGROW, 10 );
187
188     
189     //  cmdsizer->AddGrowableCol(0);
190     //  cmdsizer->AddGrowableRow(0);
191     // cmdsizer->AddGrowableRow(1);
192     //  cmdsizer->SetFlexibleDirection(wxBOTH);
193
194     //=============================
195     // Events connection
196     // COMMAND
197     // ENTER
198     Connect( mwxTextCommand->GetId(),
199              wxEVT_COMMAND_TEXT_ENTER,
200              (wxObjectEventFunction)& WxConsole::OnCommandEnter );
201     /*
202     Connect( mwxTextCommand->GetId(),
203              wxEVT_CHAR,
204              //wxEVT_COMMAND_TEXT_UPDATED,
205              (wxObjectEventFunction)& WxConsole::OnCommandChar );
206     */
207     // MENU
208     //    Connect ( 
209
210     // Redirection of std::cout to mwxTextHistory and printf
211     mRedirect_cout = 
212       new WxStreamRedirector(std::cout,mwxTextHistory,*wxBLACK,true);
213     mRedirect_cerr = 
214       new WxStreamRedirector(std::cerr,mwxTextHistory,*wxGREEN,true); 
215         
216     // Creates and sets the parent window of all bbtk windows
217     wxWindow* top = new wxPanel(this,-1);//,_T("top"));
218     top->Hide();
219     //new wxFrame(this,-1,_T("bbtk"),
220     //                         wxDefaultPosition,
221     //                         wxSize(0,0),
222     //                         wxFRAME_TOOL_WINDOW) ;//wxMINIMIZE_BOX);
223
224     Wx::SetTopWindow(top);
225
226     //    top->Show();
227     
228
229     // Layout
230 //EED    SetSizer(sizer);
231
232         mwxNotebook->AddPage( mwxPageCommand, _T("Command"));
233     mwxNotebook->AddPage( mwxPageHelp, _T("Help"));
234         m_mgr.AddPane(mwxNotebook, wxAuiPaneInfo().Name(wxT("notebook_content")).CenterPane().PaneBorder(false)); 
235     m_mgr.Update();
236
237         
238         SetAutoLayout(true);
239     Layout();
240 //    Refresh();
241 //    m_mgr.Update();
242   }
243   //================================================================
244
245  //================================================================
246   WxConsole::~WxConsole()
247   {
248         m_mgr.UnInit();
249     delete mRedirect_cout;
250     delete mRedirect_cerr;
251   }
252   //================================================================
253
254
255   //================================================================
256   void WxConsole::OnCommandEnter(wxCommandEvent& event)
257   {
258     wxString line(mwxTextCommand->GetValue());
259     CommandString(line);
260   }
261   //================================================================
262
263   //================================================================  
264   void WxConsole::OnBtnGo(wxCommandEvent& event)
265   {
266         wxString line(mwxTextCommand->GetValue());
267         CommandString(line);
268   } 
269   //================================================================  
270   
271   //================================================================
272   void WxConsole::CommandString(wxString line )
273   {
274     //printf("WxConsole::CommandString 01 \n");
275     wxString s = _T("> ") + line + _T("\n");
276     mwxTextHistoryAttr->SetTextColour(*wxRED);
277     mwxTextHistory->SetDefaultStyle(*mwxTextHistoryAttr);
278     mwxTextHistory->AppendText(s);
279     // send to standard console also 
280     //printf("WxConsole::CommandString 02 \n");
281     //    printf("%s",wx2std(s).c_str());
282 //EED    mwxTextCommand->Clear();
283     mwxTextCommand->SetValue(_T(""));
284         mwxTextCommand->Append(line);
285     
286 //EED    mwxTextCommand->SetDefaultStyle(*mwxTextCommandAttr);
287     mwxTextHistoryAttr->SetTextColour(*wxBLACK);
288     mwxTextHistory->SetDefaultStyle(*mwxTextHistoryAttr);
289
290     //printf("WxConsole::CommandString 03 \n");
291     if (  mInterpreter->InterpretLine( wx2std(line) ) == 
292           Interpreter::QUIT )
293       {
294         Close(true); 
295       }
296
297     //printf("WxConsole::CommandString 06 \n");
298   }
299   //================================================================
300
301   //================================================================
302   /// Runs the interpretation of a file
303   void WxConsole::InterpretFile( const std::string& filename) 
304   { 
305     if ( mInterpreter->InterpretFile(filename) ==
306          Interpreter::ERROR ) 
307       {
308         Show();
309       }
310   }
311   //================================================================
312   
313   //================================================================
314   void WxConsole::OnMenuQuit(wxCommandEvent& WXUNUSED(event))
315   {
316     Close(true);
317   }
318   //================================================================
319
320
321   //================================================================
322   void WxConsole::OnMenuAbout(wxCommandEvent& WXUNUSED(event))
323   {
324     m_mgr.Update();
325         Refresh();
326     wxMessageBox(_T("  bbi\nThe Black Box Toolkit interpreter\n(c) CREATIS-LRMN 2008"),
327                  _T("About ..."), wxOK | wxICON_INFORMATION,
328                  this);
329   }
330   //================================================================
331
332
333   //================================================================
334   void WxConsole::OnMenuEditConfig(wxCommandEvent& WXUNUSED(event))
335   {
336         std::string commandStr;
337     std::string configFile = ConfigurationFile::GetInstance().Get_config_xml_full_path();
338 #ifdef WIN32
339         commandStr = "notepad.exe ";
340 #else
341         commandStr = "gedit ";
342 #endif 
343         commandStr = commandStr + configFile;
344         std::cout << "system: " << commandStr << std::endl;
345         system ( commandStr.c_str() );
346   }
347   //================================================================
348
349
350   //================================================================
351   void WxConsole::OnMenuCreatePackage(wxCommandEvent& WXUNUSED(event))
352   {
353 printf("EED WxConsole::OnMenuCreatePackage 01 \n");
354     std::string command("toolsbbtk/appli/CreatePackage");
355 printf("EED WxConsole::OnMenuCreatePackage 02 \n");
356
357     bbtkMessage("Debug",1,"Executing : '"<<command<<"'"<<std::endl);
358 printf("EED WxConsole::OnMenuCreatePackage 03 \n");
359     Interpreter* I = new Interpreter;    
360 printf("EED WxConsole::OnMenuCreatePackage 04 \n");
361     I->InterpretFile(command);
362 printf("EED WxConsole::OnMenuCreatePackage 05 \n");
363     delete I;
364 printf("EED WxConsole::OnMenuCreatePackage 06 \n");
365   }
366   //================================================================
367
368
369   //================================================================
370   void WxConsole::OnMenuCreateBlackBox(wxCommandEvent& WXUNUSED(event))
371   {
372     std::string command("toolsbbtk/appli/CreateBlackBox");
373     bbtkMessage("Debug",1,"Executing : '"<<command<<"'"<<std::endl);
374     Interpreter* I = new Interpreter;    
375     I->InterpretFile(command);
376     delete I;
377   }
378   //================================================================
379   
380   //================================================================
381   void WxConsole::OnMenuShowImageGraph(wxCommandEvent& WXUNUSED(event))
382   {
383     std::string default_temp_dir = ConfigurationFile::GetInstance().Get_default_temp_dir();
384
385 #if defined(WIN32)
386     std::string strappli="start ";
387 #else
388     std::string strappli="gnome-open ";
389 #endif
390     std::string strcommand = strappli +default_temp_dir+"/temp_dir/workspace_workspacePrototype.png";
391         std::cout << "system: " << strcommand << std::endl;
392     system ( strcommand.c_str() );
393
394   }
395   //================================================================
396
397
398   //================================================================
399   void WxConsole::OnMenuCreateIndex(wxCommandEvent& WXUNUSED(event))
400   {
401     std::string doc_path = ConfigurationFile::GetInstance().Get_doc_path();
402     std::string filepath = doc_path+"/bbdoc/make-index.bbs";
403     Interpreter* I = new Interpreter;    
404
405 //EED   std::cout << "bbi: include "<<filepath<<std::endl;
406 //EED   I->InterpretFile( filepath );
407
408     I->InterpretLine( "exec freeze");
409     I->InterpretLine( "include *");
410     I->InterpretLine( "index "+doc_path+"/bbdoc/index-alpha.html Initials");
411     I->InterpretLine( "index "+doc_path+"/bbdoc/index-package.html Packages");
412     I->InterpretLine( "index "+doc_path+"/bbdoc/index-category.html Categories");
413     I->InterpretLine( "index "+doc_path+"/bbdoc/index-adaptors.html Adaptors");
414     
415     delete I;
416   }
417   //================================================================
418
419
420
421   
422   //================================================================
423   void WxConsole::OnCommandChar(wxCommandEvent& event)
424   {
425     std::cout << "c";
426     /*
427     // Command completion  
428     std::vector<std::string> commands;
429     wxString sline( wx2std ( mwxTextCommand->GetValue() ) );
430     int ind = sline.size();
431     mInterpreter->FindCommandsWithPrefix( sline.c_str(),ind,commands);
432     if (commands.size()==1) 
433       {
434         std::string com = *commands.begin();
435         for (; ind<com.size(); ++ind) 
436           {
437             mwxTextCommand->TextAppend( std2wx ( com[ind]) ); 
438           }
439          mwxTextCommand->TextAppend(_T(" "));
440       }
441     else if (commands.size()>1) 
442       {
443         std::vector<std::string>::iterator i;
444         write(1,"\n",1);
445         for (i=commands.begin();i!=commands.end();++i) 
446           {
447             write(STDOUT_FILENO,(*i).c_str(),strlen((*i).c_str()));
448             PrintChar(' ');
449           }
450         write(STDOUT_FILENO,"\n> ",3);
451         //for (int j=0;j<ind;++j) 
452         //{
453         write(STDOUT_FILENO,line,ind); 
454         //  }
455       }
456     */
457   }
458   //================================================================
459
460   void WxConsole::ShowHtmlPage(std::string& page)
461   {
462     //  std::cout << "WxConsole::ShowHtmlPage('"<<page<<"')"<<std::endl;
463     if (mwxHtmlWindow->GoTo(page)) 
464       {
465 //EED   mwxNotebook->ChangeSelection(1);
466         mwxNotebook->SetSelection(1);
467       }
468     else 
469       {
470          // std::cout << "ERROR html"<<std::endl;
471       }
472   } 
473
474   
475   
476   //================================================================  
477   wxPanel* WxConsole::CreateBtnsCtrlPanel(wxWindow *parent)
478   {
479      wxPanel *btnsCtrlPanel = new wxPanel(parent,-1);
480      wxBoxSizer *btnsSizer      = new wxBoxSizer(wxHORIZONTAL);
481           
482      wxButton *btnInclude  = new wxButton( btnsCtrlPanel,-1,_T("Include")  );
483      wxButton *btnReset    = new wxButton( btnsCtrlPanel,-1,_T("Reset")    );
484      wxButton *btnConfig   = new wxButton( btnsCtrlPanel,-1,_T("Config")   );
485      wxButton *btnGraphS   = new wxButton( btnsCtrlPanel,-1,_T("Graph simple") );
486      wxButton *btnGraphD   = new wxButton( btnsCtrlPanel,-1,_T("Graph detailed") );
487      wxButton *btnHelp     = new wxButton( btnsCtrlPanel,-1,_T("Help")     );
488
489           btnsSizer->Add( btnInclude    );
490           btnsSizer->Add( btnReset              );
491           btnsSizer->Add( btnConfig             );
492           btnsSizer->Add( btnGraphS     );
493           btnsSizer->Add( btnGraphD     );
494           btnsSizer->Add( btnHelp               );
495           btnsCtrlPanel->SetSizer(btnsSizer);
496
497           Connect(btnInclude->GetId()   , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnInclude       );
498           Connect(btnReset->GetId()             , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnReset         );
499           Connect(btnConfig->GetId()    , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnConfig        );
500           Connect(btnGraphS->GetId()    , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnGraphS        );
501           Connect(btnGraphD->GetId()    , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnGraphD        );
502           Connect(btnHelp->GetId()              , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnHelp          );
503           return btnsCtrlPanel;
504   }
505   //================================================================  
506   
507   
508   //================================================================  
509   void WxConsole::OnBtnInclude(wxCommandEvent& event)
510   {
511      std::string default_doc_dir = ConfigurationFile::GetInstance().Get_default_temp_dir();
512      std::string stdDir = default_doc_dir+"/share/bbtk/bbs";
513      wxString defaultDir(stdDir.c_str(), wxConvUTF8);
514
515      wxFileDialog dialog(this, _T("Choose a file"),defaultDir, _T(""), _T("*.bbs"), wxOPEN );
516      if (dialog.ShowModal() == wxID_OK)
517      {
518         // std::string command(_T("include "));
519         // std::string pathfilename = (const char *)(dialog.GetFilename().mb_str());
520         wxString command(_T("include "));
521         wxString pathfilename = dialog.GetPath();
522         command += pathfilename;
523         CommandString( command );
524      }
525
526   }
527   //================================================================  
528
529   
530   //================================================================  
531   void WxConsole::OnBtnReset(wxCommandEvent& event)
532   {
533      CommandString(_T("reset"));
534   }
535   //================================================================  
536
537   
538   //================================================================  
539   void WxConsole::OnBtnConfig(wxCommandEvent& event)
540   {
541      CommandString(_T("config"));
542   }
543   //================================================================  
544
545   
546   
547   //================================================================  
548   void WxConsole::OnBtnGraphS(wxCommandEvent& event)
549   {
550      CommandString(_T("graph"));
551   }
552   //================================================================  
553
554   //================================================================  
555   void WxConsole::OnBtnGraphD(wxCommandEvent& event)
556   {
557      CommandString(_T("graph . 1"));
558   }
559   //================================================================  
560
561   //================================================================  
562   void WxConsole::OnBtnHelp(wxCommandEvent& event)
563   {
564      CommandString(_T("help"));
565   }
566   //================================================================  
567
568   
569   //================================================================  
570   BEGIN_EVENT_TABLE(WxConsole, wxFrame)
571     EVT_MENU(WxConsole::ID_Menu_Quit, WxConsole::OnMenuQuit)
572     EVT_MENU(WxConsole::ID_Menu_About, WxConsole::OnMenuAbout)
573     EVT_MENU(WxConsole::ID_Menu_EditConfig, WxConsole::OnMenuEditConfig)
574     EVT_MENU(WxConsole::ID_Menu_CreatePackage, WxConsole::OnMenuCreatePackage)
575     EVT_MENU(WxConsole::ID_Menu_CreateBlackBox, WxConsole::OnMenuCreateBlackBox)
576     EVT_MENU(WxConsole::ID_Menu_ShowImageGraph, WxConsole::OnMenuShowImageGraph)
577     EVT_MENU(WxConsole::ID_Menu_CreateIndex, WxConsole::OnMenuCreateIndex)
578     EVT_TEXT_ENTER(WxConsole::ID_Text_Command, WxConsole::OnCommandEnter)
579 //      EVT_CHAR(WxConsole::ID_Text_Command, WxConsole::OnCommandChar)
580     END_EVENT_TABLE()
581   //================================================================
582
583 } // namespace bbtk
584
585
586 #endif //_USE_WXWIDGETS_