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