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