]> Creatis software - bbtk.git/blob - kernel/src/bbtkWxGUITextEditor.cxx
56a5a97d56cfea3d7f7dea82c6b76fc879d99c0d
[bbtk.git] / kernel / src / bbtkWxGUITextEditor.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbtkWxGUITextEditor.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/03/25 15:47:54 $
7   Version:   $Revision: 1.4 $
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 "bbtkWxGUITextEditor.h"
37 #include "bbtkWxBlackBox.h"
38 #include "bbtkConfigurationFile.h"
39
40 #include "icons/cc_new.xpm"
41 #include "icons/cc_open.xpm"
42 #include "icons/cc_stop.xpm"
43 #include "icons/cc_save.xpm"
44 #include "icons/cc_save_as.xpm"
45 #include "icons/cc_run.xpm"
46 #include "icons/cc_exit.xpm"
47
48 #include "../data/icons/wxart_new.xpm"
49 #include "../data/icons/wxart_fileopen.xpm"
50 #include "../data/icons/wxart_filesave.xpm"
51 #include "../data/icons/wxart_filesaveas.xpm"
52 #include "../data/icons/wxart_exefile.xpm"
53 #include "../data/icons/wxart_delete.xpm"
54 #include "../data/icons/wxart_down.xpm"
55 #include "../data/icons/wxart_eldel.xpm"
56
57 namespace bbtk
58 {
59
60
61   //================================================================
62   class WxTextCtrlGettingKeyEvents : public wxTextCtrl
63   {
64   public:
65     WxTextCtrlGettingKeyEvents(wxWindow *parent, wxWindowID id, const wxString &value,
66                                const wxPoint &pos, const wxSize &size, int style = 0)
67       : wxTextCtrl(parent, id, value, pos, size, style)
68     {
69     }
70     
71     void SetWxGUITextEditor(WxGUITextEditor* e) 
72     { mWxGUITextEditor = e; }
73     
74     void OnKeyDown(wxKeyEvent& event);
75     void OnKeyUp(wxKeyEvent& event);
76     void OnChar(wxKeyEvent& event);
77   private :
78     WxGUITextEditor* mWxGUITextEditor;
79     
80     DECLARE_EVENT_TABLE()
81       };
82   
83   BEGIN_EVENT_TABLE(WxTextCtrlGettingKeyEvents, wxTextCtrl)
84     EVT_KEY_DOWN(WxTextCtrlGettingKeyEvents::OnKeyDown)
85     EVT_KEY_UP(WxTextCtrlGettingKeyEvents::OnKeyUp)
86     EVT_CHAR(WxTextCtrlGettingKeyEvents::OnChar)
87     END_EVENT_TABLE()
88     
89     
90     void WxTextCtrlGettingKeyEvents::OnChar(wxKeyEvent& event)
91   {
92     event.Skip();
93   }
94   
95   void WxTextCtrlGettingKeyEvents::OnKeyUp(wxKeyEvent& event)
96   {
97     mWxGUITextEditor->OnKeyUp(event);
98     event.Skip();
99   }
100   
101   void WxTextCtrlGettingKeyEvents::OnKeyDown(wxKeyEvent& event)
102   {
103     mWxGUITextEditor->OnKeyDown(event);
104     event.Skip();
105   }
106   //================================================================
107   
108   
109
110   //================================================================  
111   /*  BEGIN_EVENT_TABLE(WxGUITextEditorPage, wxPanel)
112     EVT_CLOSE(WxGUITextEditorPage::OnClose)
113     END_EVENT_TABLE()
114   */
115  
116   //================================================================
117   WxGUITextEditorPage::WxGUITextEditorPage(wxWindow* parent,
118                                                WxGUITextEditor* editor)
119     : wxPanel(parent,-1),
120       mEditor(editor),
121       mName(""),
122       mAskFilename(true)
123   {  
124     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
125  
126     mwxInputText = 
127       new WxTextCtrlGettingKeyEvents(this,
128                                      -1, //ID_InputText,
129                                      _T(""),
130                                      wxDefaultPosition,
131                                      wxDefaultSize,
132                                      wxTE_MULTILINE 
133                                      //    |wxTE_PROCESS_ENTER
134                                      | wxTE_PROCESS_TAB 
135                                      //             | wxWANTS_CHARS 
136                                      |  wxTAB_TRAVERSAL
137                                      );
138     mwxInputText->SetWxGUITextEditor(mEditor);
139     
140     wxFont* FixedFont = new wxFont(10,
141                                    wxFONTFAMILY_MODERN,
142                                    wxFONTSTYLE_NORMAL,
143                                    wxFONTWEIGHT_NORMAL,
144                                    false);
145     
146     mwxInputTextAttr = new wxTextAttr;
147     mwxInputTextAttr->SetFont(*FixedFont);
148    
149     sizer->Add(mwxInputText,1,wxGROW);
150     SetSizer(sizer);
151     SetAutoLayout(true);
152     Layout();
153   }
154   //================================================================
155
156   //================================================================
157   WxGUITextEditorPage::~WxGUITextEditorPage()
158   {
159   }
160   //================================================================
161
162   bool WxGUITextEditorPage::IsModified()
163    { return mwxInputText->IsModified(); }
164
165   std::string WxGUITextEditorPage::GetText()
166   {
167     return wx2std(GetTextCtrl()->GetValue());
168   }
169
170   //================================================================
171   void WxGUITextEditorPage::Load(const std::string& filename)
172   {
173     std::cout << "-------------- LOAD ---------------"<<std::endl;
174     std::cout << "'" << filename << "'"<<std::endl;
175     //std::string oldFilename = mFilename;
176     mName = filename;
177     mAskFilename = false;
178     mwxInputText->LoadFile(std2wx(mName));
179   }
180   //================================================================
181
182   //================================================================
183   void WxGUITextEditorPage::Save(const std::string& filter)
184   {
185     std::cout << "-------------- SAVE ---------------"<<std::endl;
186     if (mAskFilename)
187       {
188         wxFileDialog* fd = new wxFileDialog(this,_T("Save file"),_T(""),
189                                             _T(""),std2wx(filter),
190                                             wxSAVE | wxOVERWRITE_PROMPT );
191         fd->ShowModal();
192     
193         if (fd->GetReturnCode()==wxID_OK)
194           {
195             mName = wx2std(fd->GetPath());
196             mAskFilename = false;
197           }
198         else 
199           {
200             std::cout << "-------------- CANCELLED ---------------"
201                       <<std::endl;
202             return;
203           } 
204       }
205     std::cout << "file [" << mName << "]" <<std::endl;
206     mwxInputText->SaveFile(mName);
207     mwxInputText->SetModified(false);
208   }
209   //================================================================
210   
211   //================================================================
212   WxGUITextEditor::WxGUITextEditor( wxWindow *parent,
213                                     WxGUITextEditorUser* user )
214     : wxPanel(parent, -1),
215       mUser(user),
216       mFileNameFilter("*.*")
217   {
218     std::cout << "WxGUITextEditor::WxGUITextEditor"<<std::endl;
219     //    mInterpreter = new bbtk::Interpreter();
220     //mInterpreter->SetWxGUITextEditor(this);
221     //  mInterpreter->SetCommandLine(true);
222     m_mgr.SetManagedWindow(this);
223     
224     //==============
225     // Menu
226     wxInitAllImageHandlers();
227     
228     
229     //    wxFlexGridSizer *sizer= new wxFlexGridSizer(2);
230     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
231     
232     mwxNotebook = new wxAuiNotebook(this,  
233                                     -1,
234                                     wxPoint(0, 0),
235                                     wxSize(500,500),
236                                     wxAUI_NB_TAB_SPLIT 
237                                     | wxAUI_NB_TAB_MOVE
238                                     | wxAUI_NB_TAB_EXTERNAL_MOVE
239                                     | wxAUI_NB_WINDOWLIST_BUTTON
240                                     |wxAUI_NB_SCROLL_BUTTONS
241                                     // | wxAUI_NB_CLOSE_BUTTON 
242                                     | wxAUI_NB_CLOSE_ON_ACTIVE_TAB
243                                     //| wxAUI_NB_CLOSE_ON_ALL_TABS
244                                     | wxNO_BORDER);
245     
246     sizer->Add(mwxNotebook,1,wxGROW);
247     
248     // BUTTONS
249     wxPanel *btnsCtrlPanel = new wxPanel(this,-1);
250     wxBoxSizer *btnsSizer  = new wxBoxSizer(wxHORIZONTAL);
251  
252     /*   
253     wxBitmap bmp_new(cc_new_xpm);
254     wxBitmap bmp_open(cc_open_xpm);
255     wxBitmap bmp_close(cc_stop_xpm);
256     wxBitmap bmp_save(cc_save_xpm);
257     wxBitmap bmp_saveas(cc_save_as_xpm);
258     wxBitmap bmp_run(cc_run_xpm);
259     */
260     wxBitmap bmp_new(new_xpm);
261     wxBitmap bmp_open(fileopen_xpm);
262     wxBitmap bmp_close(eldel_xpm);
263     wxBitmap bmp_save(filesave_xpm);
264     wxBitmap bmp_saveas(filesaveas_xpm);
265     wxBitmap bmp_run(down_xpm);
266
267
268     wxSize btn_size(32,32);
269     mwxButtonNew = new wxBitmapButton( btnsCtrlPanel,ID_ButtonNew,bmp_new
270                                        ,wxDefaultPosition, btn_size);
271     btnsSizer->Add( mwxButtonNew );
272
273     mwxButtonOpen = new wxBitmapButton( btnsCtrlPanel,ID_ButtonOpen,bmp_open ,wxDefaultPosition, btn_size);//,_T("Open")  );
274     btnsSizer->Add( mwxButtonOpen );
275
276     mwxButtonClose = new wxBitmapButton( btnsCtrlPanel,ID_ButtonClose,bmp_close ,wxDefaultPosition, btn_size);//,_T("Open")  );
277     btnsSizer->Add( mwxButtonClose );
278
279     mwxButtonSave = new wxBitmapButton( btnsCtrlPanel,ID_ButtonSave,bmp_save ,wxDefaultPosition, btn_size);//_T("Save")  );
280     btnsSizer->Add( mwxButtonSave );
281
282     mwxButtonSaveAs = new wxBitmapButton( btnsCtrlPanel,ID_ButtonSaveAs,bmp_saveas ,wxDefaultPosition, btn_size);//_T("Save")  );
283     btnsSizer->Add( mwxButtonSaveAs );
284
285
286     mwxButtonRun = new wxBitmapButton( btnsCtrlPanel,ID_ButtonRun,bmp_run ,wxDefaultPosition, btn_size);//_T("Run")  );
287     btnsSizer->Add( mwxButtonRun );
288     /*
289     wxBitmap bmp_quit(cc_exit_xpm);
290     mwxButtonQuit = new wxBitmapButton( btnsCtrlPanel,ID_ButtonQuit,bmp_quit);//_T("Quit")  );
291     btnsSizer->Add( mwxButtonQuit );
292     */    
293     
294     mwxPosition = new wxStaticText ( btnsCtrlPanel, -1, _T(""));
295     btnsSizer->Add( mwxPosition );
296     
297     btnsCtrlPanel->SetSizer(btnsSizer);
298     sizer->Add ( btnsCtrlPanel, 0, wxLEFT | wxRIGHT | wxBOTTOM  //| wxGROW
299                  , 10 );
300        
301
302     NewPage("");
303     UpdateInfo();
304     
305     SetSizer(sizer);
306     SetAutoLayout(true);
307     Layout();
308   }
309   //================================================================
310   
311   //================================================================
312   WxGUITextEditor::~WxGUITextEditor()
313   {
314     m_mgr.UnInit();
315
316     //    delete mInterpreter;
317   }
318   //================================================================
319
320   //================================================================
321   void WxGUITextEditor::NewPage(const std::string& filename)
322   {
323    WxGUITextEditorPage* page = 
324       new WxGUITextEditorPage(mwxNotebook,this);
325     std::string name("untitled");
326     if (filename.size()!=0) 
327       {
328         name = filename;
329         page->Load(name);
330       }
331     page->SetPageName(name);
332     mwxNotebook->AddPage(page,name,true);
333     FocusOnCurrentPage();
334   }
335   //================================================================
336
337   //================================================================
338   WxGUITextEditorPage* WxGUITextEditor::GetCurrentPage()
339   {
340     return (WxGUITextEditorPage*)
341       mwxNotebook->GetPage(mwxNotebook->GetSelection());
342   }
343   //================================================================
344
345   //================================================================
346   void WxGUITextEditor::FocusOnCurrentPage()
347   {
348     if (mwxNotebook->GetPageCount()==0) return;
349     GetCurrentPage()->SetFocus();    
350   }
351   //================================================================
352
353   //================================================================  
354   void WxGUITextEditor::OnButtonOpen(wxCommandEvent& event) 
355   { 
356     Open(); 
357     FocusOnCurrentPage();
358   } 
359   void WxGUITextEditor::Open()
360   {
361     std::cout << "-------------- OPEN ---------------"<<std::endl;
362
363     wxFileDialog* fd = new wxFileDialog(this,_T("Open file"),_T(""),
364                                         _T(""),std2wx(mFileNameFilter),
365                                         wxOPEN | wxFILE_MUST_EXIST );
366     fd->ShowModal();
367     
368     if (fd->GetReturnCode()==wxID_OK)
369       {
370         std::string filename = wx2std(fd->GetPath());
371         std::cout << "file [" << filename << "]" <<std::endl;
372         Open(filename);
373       }
374     else 
375       {
376         std::cout << "-------------- CANCELLED ---------------"<<std::endl;
377       }
378   }
379   //================================================================  
380   
381   //================================================================  
382   void WxGUITextEditor::Open(const std::string& filename)
383   {
384     NewPage(filename);
385     UpdateInfo();
386   }
387   //================================================================  
388
389   //================================================================  
390   void WxGUITextEditor::OnButtonClose(wxCommandEvent& event) 
391   { 
392     CloseCurrentPage();
393   } 
394   //================================================================  
395
396   //================================================================  
397   bool WxGUITextEditor::CloseCurrentPage()
398   {
399     std::cout << "-------------- CLOSE ---------------"<<std::endl;
400     if (mwxNotebook->GetPageCount()==0) return true;
401     if (GetCurrentPage()->IsModified()) 
402       {
403         wxString mess = std2wx(GetCurrentPage()->GetPageName());
404         mess += _T(" modified. Save it ?");
405         wxMessageDialog* d = 
406           new wxMessageDialog(this,
407                               mess, 
408                               _T("Save buffer"), 
409                               wxYES_NO | wxCANCEL | wxICON_QUESTION);
410         switch (d->ShowModal())
411           {
412           case wxID_CANCEL : 
413             return false;
414             break;
415           case wxID_YES : 
416             GetCurrentPage()->Save(mFileNameFilter); 
417             break;
418           case wxID_NO : ;
419           }       
420       } 
421     mwxNotebook->DeletePage(mwxNotebook->GetSelection());
422     FocusOnCurrentPage();
423     return true;
424   }
425   //================================================================  
426
427   //================================================================  
428   bool WxGUITextEditor::CloseAllPages()
429   {
430     bool ok = true;
431     while (mwxNotebook->GetPageCount()!=0)
432       {
433         if (!CloseCurrentPage()) 
434           {
435             ok = false;
436             break;
437           }
438       }
439     return ok;
440   }
441   //================================================================  
442
443   //================================================================  
444   void WxGUITextEditor::OnButtonSave(wxCommandEvent& event) 
445   { 
446     SaveCurrentPage();
447   } 
448   void WxGUITextEditor::SaveCurrentPage()
449   {
450     if (mwxNotebook->GetPageCount()==0) return;  
451     GetCurrentPage()->Save(mFileNameFilter);
452     mwxNotebook->SetPageText(mwxNotebook->GetSelection(),
453                              GetCurrentPage()->GetPageName());
454   }
455   //================================================================  
456
457   //================================================================  
458   void WxGUITextEditor::OnButtonSaveAs(wxCommandEvent& event) 
459   { 
460     if (mwxNotebook->GetPageCount()==0) return;  
461     GetCurrentPage()->SetAskFilename(true);
462     SaveCurrentPage();
463   } 
464   //================================================================  
465
466   //================================================================  
467   void WxGUITextEditor::OnPageClose(wxAuiNotebookEvent& evt)
468   {
469     std::cout << "-------------- CLOSE ---------------"<<std::endl;
470     if (!CloseCurrentPage()) evt.Veto();
471
472     /*
473     if (mwxNotebook->GetPageCount()==0) return;
474     if (GetCurrentPage()->IsModified()) 
475       {
476         wxMessageDialog* d = 
477           new wxMessageDialog(this,
478                               _T("Buffer modified. Save it ?"), 
479                               _T("Save buffer"), 
480                               wxYES_NO | wxCANCEL | wxICON_QUESTION);
481         switch (d->ShowModal())
482           {
483           case wxID_CANCEL : 
484             evt.Veto(); 
485             break;
486           case wxID_YES : 
487             GetCurrentPage()->Save(mFileNameFilter); 
488             break;
489           case wxID_NO : ;
490           }       
491       }
492     */
493   }
494   //================================================================
495
496
497
498   /*
499   //================================================================  
500   void WxGUITextEditor::OnButtonQuit(wxCommandEvent& event) 
501   { 
502     Quit(); 
503     FocusOnCurrentPage();
504   }
505   void WxGUITextEditor::Quit()
506   {
507     std::cout << "-------------- QUIT ---------------"<<std::endl;
508     if (AskSave()) GetParent()->Close();
509   }
510   //================================================================  
511   */
512
513   //================================================================  
514   void WxGUITextEditor::OnButtonRun(wxCommandEvent& event) 
515   { 
516     if ((mUser!=0) && (mwxNotebook->GetPageCount()>0)) 
517       mUser->WxGUITextEditorRun();
518     FocusOnCurrentPage();
519   }
520
521   /*
522   void WxGUITextEditor::Run()
523   {
524     std::cout << "-------------- RUN ---------------"<<std::endl;
525
526     if (!mwxSplit->IsSplit()) 
527       {
528         int size = -100;
529         int minsize = - (int)(mwxInputText->GetSize().GetHeight() / 2.);
530         if (size<minsize) size = minsize;
531         mwxSplit->SplitHorizontally( mwxInputText, mwxOutputText, size);
532       }
533
534     std::stringstream* buffer = new std::stringstream(bbtk::wx2std(mwxInputText->GetValue()));
535     mInterpreter->InterpretLine("reset");
536     try 
537       {
538         mInterpreter->InterpretBuffer(buffer);
539       }
540     catch (...)
541       {
542       }
543   } 
544   //================================================================  
545 */
546   
547  
548   
549   //================================================================
550   
551   //================================================================  
552   void WxGUITextEditor::OnButtonNew(wxCommandEvent& event) 
553   { 
554     New(); 
555     FocusOnCurrentPage();
556   }
557   void WxGUITextEditor::New()
558   {
559     std::cout << "-------------- NEW ---------------" << std::endl;
560     NewPage("");
561     UpdateInfo();
562   }
563   //================================================================
564
565   //================================================================
566   void WxGUITextEditor::UpdateInfo()
567   {
568     if (mwxNotebook->GetPageCount()==0) return;
569     WxTextCtrlGettingKeyEvents* text = GetCurrentPage()->GetTextCtrl();
570     
571     long line, column, pos;
572     pos = text->GetInsertionPoint();
573     text->PositionToXY(pos, &column, &line);
574     
575     
576     //                wxLogMessage(_T("Current position: %ld\nCurrent line, column: (%ld, %ld)\nNumber of lines: %ld\nCurrent line length: %ld\nTotal text length: %u (%ld)"),
577     
578     
579     char mess[200];
580     sprintf(mess,"%ld:%ld/%ld:%ld",
581             line+1,column+1,
582             (long)text->GetNumberOfLines(),
583             (long)text->GetLineLength(line)+1);
584     //       pos+1,
585     //       (long)mwxInputText->GetValue().length())+1;
586     
587     mwxPosition->SetLabel(wxString(mess));
588     mwxPosition->Show();
589     
590     if (text->IsModified()) 
591       {
592         std::string title("*");
593         title += GetCurrentPage()->GetPageName();
594         mwxNotebook->SetPageText(mwxNotebook->GetSelection(),title);
595       }
596   }
597   //================================================================
598   //================================================================
599   void WxGUITextEditor::OnKeyUp(wxKeyEvent& event)
600   {
601     //  std::cout << "U" << std::endl;
602     UpdateInfo();
603   }
604   //================================================================
605
606   //================================================================
607   void WxGUITextEditor::OnKeyDown(wxKeyEvent& event)
608   {
609     //    std::cout << "D" << std::endl;
610     // std::cout << "Key="<<event.GetKeyCode()<<std::endl;
611     if ( event.ControlDown() )
612       {
613         switch (event.GetKeyCode())
614           {
615           case 'n': case 'N' : New(); break;
616           case 's': case 'S' : SaveCurrentPage(); break;
617           case 'o': case 'O' : Open(); break;
618             //    case 'r': case 'R' : Run(); break;
619             //    case 'q': case 'Q' : Quit(); break;
620           }
621       }
622   }
623   //================================================================
624   
625   //================================================================  
626   BEGIN_EVENT_TABLE(WxGUITextEditor, wxPanel)
627   //    EVT_CHAR(WxGUITextEditor::OnKeyPress)
628     EVT_BUTTON(WxGUITextEditor::ID_ButtonNew, WxGUITextEditor::OnButtonNew)
629     EVT_BUTTON(WxGUITextEditor::ID_ButtonOpen, WxGUITextEditor::OnButtonOpen)
630     EVT_BUTTON(WxGUITextEditor::ID_ButtonClose, WxGUITextEditor::OnButtonClose)
631     EVT_BUTTON(WxGUITextEditor::ID_ButtonSave, WxGUITextEditor::OnButtonSave)
632     EVT_BUTTON(WxGUITextEditor::ID_ButtonSaveAs, WxGUITextEditor::OnButtonSaveAs)
633     EVT_BUTTON(WxGUITextEditor::ID_ButtonRun, WxGUITextEditor::OnButtonRun)
634   //    EVT_BUTTON(WxGUITextEditor::ID_ButtonQuit, WxGUITextEditor::OnButtonQuit)
635     EVT_AUINOTEBOOK_PAGE_CLOSE(wxID_ANY, WxGUITextEditor::OnPageClose)
636     END_EVENT_TABLE()
637   //================================================================
638     
639
640
641
642   
643   //================================================================
644   WxGUITextEditorWindow::WxGUITextEditorWindow( wxWindow *parent, 
645                                                     wxString title, 
646                                                     wxSize size)
647     : wxFrame((wxFrame *)parent, -1, title, wxDefaultPosition, size)
648   {     
649     
650     
651     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
652
653     mEditor = new WxGUITextEditor(this);
654     sizer->Add(mEditor,1,wxGROW);
655     
656     //    WxGUICommand* com = new WxGUICommand(this,this);
657     //    sizer->Add(com);
658     
659     SetSizer(sizer);
660
661     // Creates and sets the parent window of all bbtk windows
662     wxWindow* top = new wxPanel(this,-1);
663     top->Hide();
664     
665     Wx::SetTopWindow(top);
666    
667     SetAutoLayout(true);
668     Layout();
669   }
670   //================================================================
671
672   //================================================================
673   WxGUITextEditorWindow::~WxGUITextEditorWindow()
674   {
675   }
676   //================================================================
677
678
679 } // namespace bbtk
680
681
682 #endif //_USE_WXWIDGETS_