]> Creatis software - bbtk.git/blob - kernel/src/bbtkWxConsole.cxx
BUGs CPACK + BUGs CreatePackage CreateBlackBox windows
[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 12:26:07 $
7   Version:   $Revision: 1.17 $
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     try 
292     {
293       bool insideComment = false;
294
295       mInterpreter->InterpretLine( wx2std(line), insideComment );
296     }
297     catch (bbtk::QuitException)
298     {
299        Close(true); 
300     }
301     catch (bbtk::Exception e) 
302     {
303        e.Print();
304     }
305     catch (std::exception& e) 
306     {
307        std::cout << "* ERROR : "<<e.what()<<" (not in bbtk)"<<std::endl;
308     }
309     catch (...)
310     {
311        std::cout << "* UNDEFINED ERROR (not a bbtk nor a std exception)"
312                  << std::endl;
313     }
314     //printf("WxConsole::CommandString 06 \n");
315   }
316   //================================================================
317
318
319   //================================================================
320   void WxConsole::OnMenuQuit(wxCommandEvent& WXUNUSED(event))
321   {
322     Close(true);
323   }
324   //================================================================
325
326
327   //================================================================
328   void WxConsole::OnMenuAbout(wxCommandEvent& WXUNUSED(event))
329   {
330     m_mgr.Update();
331         Refresh();
332     wxMessageBox(_T("  bbi\nThe Black Box Toolkit interpreter\n(c) CREATIS-LRMN 2008"),
333                  _T("About ..."), wxOK | wxICON_INFORMATION,
334                  this);
335   }
336   //================================================================
337
338
339   //================================================================
340   void WxConsole::OnMenuEditConfig(wxCommandEvent& WXUNUSED(event))
341   {
342         std::string commandStr;
343     std::string configFile = ConfigurationFile::GetInstance().Get_config_xml_full_path();
344 #ifdef WIN32
345         commandStr = "notepad.exe ";
346 #else
347         commandStr = "gedit ";
348 #endif 
349         commandStr = commandStr + configFile;
350         std::cout << "system: " << commandStr << std::endl;
351         system ( commandStr.c_str() );
352   }
353   //================================================================
354
355
356   //================================================================
357   void WxConsole::OnMenuCreatePackage(wxCommandEvent& WXUNUSED(event))
358   {
359 printf("EED WxConsole::OnMenuCreatePackage 01 \n");
360     std::string command("toolsbbtk/appli/CreatePackage");
361 printf("EED WxConsole::OnMenuCreatePackage 02 \n");
362
363     bbtkMessage("Debug",1,"Executing : '"<<command<<"'"<<std::endl);
364 printf("EED WxConsole::OnMenuCreatePackage 03 \n");
365     Interpreter* I = new Interpreter;    
366 printf("EED WxConsole::OnMenuCreatePackage 04 \n");
367     I->InterpretFile(command);
368 printf("EED WxConsole::OnMenuCreatePackage 05 \n");
369     delete I;
370 printf("EED WxConsole::OnMenuCreatePackage 06 \n");
371   }
372   //================================================================
373
374
375   //================================================================
376   void WxConsole::OnMenuCreateBlackBox(wxCommandEvent& WXUNUSED(event))
377   {
378     std::string command("toolsbbtk/appli/CreateBlackBox");
379     bbtkMessage("Debug",1,"Executing : '"<<command<<"'"<<std::endl);
380     Interpreter* I = new Interpreter;    
381     I->InterpretFile(command);
382     delete I;
383   }
384   //================================================================
385   
386   //================================================================
387   void WxConsole::OnMenuShowImageGraph(wxCommandEvent& WXUNUSED(event))
388   {
389     std::string default_temp_dir = ConfigurationFile::GetInstance().Get_default_temp_dir();
390
391 #if defined(WIN32)
392     std::string strappli="start ";
393 #else
394     std::string strappli="gnome-open ";
395 #endif
396     std::string strcommand = strappli +default_temp_dir+"/temp_dir/workspace_workspacePrototype.png";
397         std::cout << "system: " << strcommand << std::endl;
398     system ( strcommand.c_str() );
399
400   }
401   //================================================================
402
403
404   //================================================================
405   void WxConsole::OnMenuCreateIndex(wxCommandEvent& WXUNUSED(event))
406   {
407     std::string doc_path = ConfigurationFile::GetInstance().Get_doc_path();
408     std::string filepath = doc_path+"/bbdoc/make-index.bbs";
409     Interpreter* I = new Interpreter;    
410
411 //EED   std::cout << "bbi: include "<<filepath<<std::endl;
412 //EED   I->InterpretFile( filepath );
413
414     bool insideComment = false; // for multiline comment
415         I->InterpretLine( "exec freeze" ,insideComment );
416         I->InterpretLine( "include *" ,insideComment );
417         I->InterpretLine( "index "+doc_path+"/bbdoc/index-alpha.html Initials" ,insideComment );
418         I->InterpretLine( "index "+doc_path+"/bbdoc/index-package.html Packages" ,insideComment );
419         I->InterpretLine( "index "+doc_path+"/bbdoc/index-category.html Categories" ,insideComment );
420         I->InterpretLine( "index "+doc_path+"/bbdoc/index-adaptors.html Adaptors",insideComment  );
421
422     delete I;
423   }
424   //================================================================
425
426
427
428   
429   //================================================================
430   void WxConsole::OnCommandChar(wxCommandEvent& event)
431   {
432     std::cout << "c";
433     /*
434     // Command completion  
435     std::vector<std::string> commands;
436     wxString sline( wx2std ( mwxTextCommand->GetValue() ) );
437     int ind = sline.size();
438     mInterpreter->FindCommandsWithPrefix( sline.c_str(),ind,commands);
439     if (commands.size()==1) 
440       {
441         std::string com = *commands.begin();
442         for (; ind<com.size(); ++ind) 
443           {
444             mwxTextCommand->TextAppend( std2wx ( com[ind]) ); 
445           }
446          mwxTextCommand->TextAppend(_T(" "));
447       }
448     else if (commands.size()>1) 
449       {
450         std::vector<std::string>::iterator i;
451         write(1,"\n",1);
452         for (i=commands.begin();i!=commands.end();++i) 
453           {
454             write(STDOUT_FILENO,(*i).c_str(),strlen((*i).c_str()));
455             PrintChar(' ');
456           }
457         write(STDOUT_FILENO,"\n> ",3);
458         //for (int j=0;j<ind;++j) 
459         //{
460         write(STDOUT_FILENO,line,ind); 
461         //  }
462       }
463     */
464   }
465   //================================================================
466
467   void WxConsole::ShowHtmlPage(std::string& page)
468   {
469     //  std::cout << "WxConsole::ShowHtmlPage('"<<page<<"')"<<std::endl;
470     if (mwxHtmlWindow->GoTo(page)) 
471       {
472 //EED   mwxNotebook->ChangeSelection(1);
473         mwxNotebook->SetSelection(1);
474       }
475     else 
476       {
477          // std::cout << "ERROR html"<<std::endl;
478       }
479   } 
480
481   
482   
483   //================================================================  
484   wxPanel* WxConsole::CreateBtnsCtrlPanel(wxWindow *parent)
485   {
486      wxPanel *btnsCtrlPanel = new wxPanel(parent,-1);
487      wxBoxSizer *btnsSizer      = new wxBoxSizer(wxHORIZONTAL);
488           
489      wxButton *btnInclude  = new wxButton( btnsCtrlPanel,-1,_T("Include")  );
490      wxButton *btnReset    = new wxButton( btnsCtrlPanel,-1,_T("Reset")    );
491      wxButton *btnConfig   = new wxButton( btnsCtrlPanel,-1,_T("Config")   );
492      wxButton *btnGraphS   = new wxButton( btnsCtrlPanel,-1,_T("Graph simple") );
493      wxButton *btnGraphD   = new wxButton( btnsCtrlPanel,-1,_T("Graph detailed") );
494      wxButton *btnHelp     = new wxButton( btnsCtrlPanel,-1,_T("Help")     );
495
496           btnsSizer->Add( btnInclude    );
497           btnsSizer->Add( btnReset              );
498           btnsSizer->Add( btnConfig             );
499           btnsSizer->Add( btnGraphS     );
500           btnsSizer->Add( btnGraphD     );
501           btnsSizer->Add( btnHelp               );
502           btnsCtrlPanel->SetSizer(btnsSizer);
503
504           Connect(btnInclude->GetId()   , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnInclude       );
505           Connect(btnReset->GetId()             , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnReset         );
506           Connect(btnConfig->GetId()    , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnConfig        );
507           Connect(btnGraphS->GetId()    , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnGraphS        );
508           Connect(btnGraphD->GetId()    , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnGraphD        );
509           Connect(btnHelp->GetId()              , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WxConsole::OnBtnHelp          );
510           return btnsCtrlPanel;
511   }
512   //================================================================  
513   
514   
515   //================================================================  
516   void WxConsole::OnBtnInclude(wxCommandEvent& event)
517   {
518      std::string default_doc_dir = ConfigurationFile::GetInstance().Get_default_temp_dir();
519      std::string stdDir = default_doc_dir+"/share/bbtk/bbs";
520      wxString defaultDir(stdDir.c_str(), wxConvUTF8);
521
522      wxFileDialog dialog(this, _T("Choose a file"),defaultDir, _T(""), _T("*.bbs"), wxOPEN );
523      if (dialog.ShowModal() == wxID_OK)
524      {
525         // std::string command(_T("include "));
526         // std::string pathfilename = (const char *)(dialog.GetFilename().mb_str());
527         wxString command(_T("include "));
528         wxString pathfilename = dialog.GetPath();
529         command += pathfilename;
530         CommandString( command );
531      }
532
533   }
534   //================================================================  
535
536   
537   //================================================================  
538   void WxConsole::OnBtnReset(wxCommandEvent& event)
539   {
540      CommandString(_T("reset"));
541   }
542   //================================================================  
543
544   
545   //================================================================  
546   void WxConsole::OnBtnConfig(wxCommandEvent& event)
547   {
548      CommandString(_T("config"));
549   }
550   //================================================================  
551
552   
553   
554   //================================================================  
555   void WxConsole::OnBtnGraphS(wxCommandEvent& event)
556   {
557      CommandString(_T("graph"));
558   }
559   //================================================================  
560
561   //================================================================  
562   void WxConsole::OnBtnGraphD(wxCommandEvent& event)
563   {
564      CommandString(_T("graph . 1"));
565   }
566   //================================================================  
567
568   //================================================================  
569   void WxConsole::OnBtnHelp(wxCommandEvent& event)
570   {
571      CommandString(_T("help"));
572   }
573   //================================================================  
574
575   
576   //================================================================  
577   BEGIN_EVENT_TABLE(WxConsole, wxFrame)
578     EVT_MENU(WxConsole::ID_Menu_Quit, WxConsole::OnMenuQuit)
579     EVT_MENU(WxConsole::ID_Menu_About, WxConsole::OnMenuAbout)
580     EVT_MENU(WxConsole::ID_Menu_EditConfig, WxConsole::OnMenuEditConfig)
581     EVT_MENU(WxConsole::ID_Menu_CreatePackage, WxConsole::OnMenuCreatePackage)
582     EVT_MENU(WxConsole::ID_Menu_CreateBlackBox, WxConsole::OnMenuCreateBlackBox)
583     EVT_MENU(WxConsole::ID_Menu_ShowImageGraph, WxConsole::OnMenuShowImageGraph)
584     EVT_MENU(WxConsole::ID_Menu_CreateIndex, WxConsole::OnMenuCreateIndex)
585     EVT_TEXT_ENTER(WxConsole::ID_Text_Command, WxConsole::OnCommandEnter)
586 //      EVT_CHAR(WxConsole::ID_Text_Command, WxConsole::OnCommandChar)
587     END_EVENT_TABLE()
588   //================================================================
589
590 } // namespace bbtk
591
592
593 #endif //_USE_WXWIDGETS_