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