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