1 /*=========================================================================
4 Module: $RCSfile: bbtkWxGUITextEditor.cxx,v $
6 Date: $Date: 2008/03/25 15:47:54 $
7 Version: $Revision: 1.4 $
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.
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.
17 =========================================================================*//**
18 * \brief Short description in one line
20 * Long description which
21 * can span multiple lines
33 #ifdef _USE_WXWIDGETS_
36 #include "bbtkWxGUITextEditor.h"
37 #include "bbtkWxBlackBox.h"
38 #include "bbtkConfigurationFile.h"
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"
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"
61 //================================================================
62 class WxTextCtrlGettingKeyEvents : public wxTextCtrl
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)
71 void SetWxGUITextEditor(WxGUITextEditor* e)
72 { mWxGUITextEditor = e; }
74 void OnKeyDown(wxKeyEvent& event);
75 void OnKeyUp(wxKeyEvent& event);
76 void OnChar(wxKeyEvent& event);
78 WxGUITextEditor* mWxGUITextEditor;
83 BEGIN_EVENT_TABLE(WxTextCtrlGettingKeyEvents, wxTextCtrl)
84 EVT_KEY_DOWN(WxTextCtrlGettingKeyEvents::OnKeyDown)
85 EVT_KEY_UP(WxTextCtrlGettingKeyEvents::OnKeyUp)
86 EVT_CHAR(WxTextCtrlGettingKeyEvents::OnChar)
90 void WxTextCtrlGettingKeyEvents::OnChar(wxKeyEvent& event)
95 void WxTextCtrlGettingKeyEvents::OnKeyUp(wxKeyEvent& event)
97 mWxGUITextEditor->OnKeyUp(event);
101 void WxTextCtrlGettingKeyEvents::OnKeyDown(wxKeyEvent& event)
103 mWxGUITextEditor->OnKeyDown(event);
106 //================================================================
110 //================================================================
111 /* BEGIN_EVENT_TABLE(WxGUITextEditorPage, wxPanel)
112 EVT_CLOSE(WxGUITextEditorPage::OnClose)
116 //================================================================
117 WxGUITextEditorPage::WxGUITextEditorPage(wxWindow* parent,
118 WxGUITextEditor* editor)
119 : wxPanel(parent,-1),
124 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
127 new WxTextCtrlGettingKeyEvents(this,
133 // |wxTE_PROCESS_ENTER
138 mwxInputText->SetWxGUITextEditor(mEditor);
140 wxFont* FixedFont = new wxFont(10,
146 mwxInputTextAttr = new wxTextAttr;
147 mwxInputTextAttr->SetFont(*FixedFont);
149 sizer->Add(mwxInputText,1,wxGROW);
154 //================================================================
156 //================================================================
157 WxGUITextEditorPage::~WxGUITextEditorPage()
160 //================================================================
162 bool WxGUITextEditorPage::IsModified()
163 { return mwxInputText->IsModified(); }
165 std::string WxGUITextEditorPage::GetText()
167 return wx2std(GetTextCtrl()->GetValue());
170 //================================================================
171 void WxGUITextEditorPage::Load(const std::string& filename)
173 std::cout << "-------------- LOAD ---------------"<<std::endl;
174 std::cout << "'" << filename << "'"<<std::endl;
175 //std::string oldFilename = mFilename;
177 mAskFilename = false;
178 mwxInputText->LoadFile(std2wx(mName));
180 //================================================================
182 //================================================================
183 void WxGUITextEditorPage::Save(const std::string& filter)
185 std::cout << "-------------- SAVE ---------------"<<std::endl;
188 wxFileDialog* fd = new wxFileDialog(this,_T("Save file"),_T(""),
189 _T(""),std2wx(filter),
190 wxSAVE | wxOVERWRITE_PROMPT );
193 if (fd->GetReturnCode()==wxID_OK)
195 mName = wx2std(fd->GetPath());
196 mAskFilename = false;
200 std::cout << "-------------- CANCELLED ---------------"
205 std::cout << "file [" << mName << "]" <<std::endl;
206 mwxInputText->SaveFile(mName);
207 mwxInputText->SetModified(false);
209 //================================================================
211 //================================================================
212 WxGUITextEditor::WxGUITextEditor( wxWindow *parent,
213 WxGUITextEditorUser* user )
214 : wxPanel(parent, -1),
216 mFileNameFilter("*.*")
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);
226 wxInitAllImageHandlers();
229 // wxFlexGridSizer *sizer= new wxFlexGridSizer(2);
230 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
232 mwxNotebook = new wxAuiNotebook(this,
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
246 sizer->Add(mwxNotebook,1,wxGROW);
249 wxPanel *btnsCtrlPanel = new wxPanel(this,-1);
250 wxBoxSizer *btnsSizer = new wxBoxSizer(wxHORIZONTAL);
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);
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);
268 wxSize btn_size(32,32);
269 mwxButtonNew = new wxBitmapButton( btnsCtrlPanel,ID_ButtonNew,bmp_new
270 ,wxDefaultPosition, btn_size);
271 btnsSizer->Add( mwxButtonNew );
273 mwxButtonOpen = new wxBitmapButton( btnsCtrlPanel,ID_ButtonOpen,bmp_open ,wxDefaultPosition, btn_size);//,_T("Open") );
274 btnsSizer->Add( mwxButtonOpen );
276 mwxButtonClose = new wxBitmapButton( btnsCtrlPanel,ID_ButtonClose,bmp_close ,wxDefaultPosition, btn_size);//,_T("Open") );
277 btnsSizer->Add( mwxButtonClose );
279 mwxButtonSave = new wxBitmapButton( btnsCtrlPanel,ID_ButtonSave,bmp_save ,wxDefaultPosition, btn_size);//_T("Save") );
280 btnsSizer->Add( mwxButtonSave );
282 mwxButtonSaveAs = new wxBitmapButton( btnsCtrlPanel,ID_ButtonSaveAs,bmp_saveas ,wxDefaultPosition, btn_size);//_T("Save") );
283 btnsSizer->Add( mwxButtonSaveAs );
286 mwxButtonRun = new wxBitmapButton( btnsCtrlPanel,ID_ButtonRun,bmp_run ,wxDefaultPosition, btn_size);//_T("Run") );
287 btnsSizer->Add( mwxButtonRun );
289 wxBitmap bmp_quit(cc_exit_xpm);
290 mwxButtonQuit = new wxBitmapButton( btnsCtrlPanel,ID_ButtonQuit,bmp_quit);//_T("Quit") );
291 btnsSizer->Add( mwxButtonQuit );
294 mwxPosition = new wxStaticText ( btnsCtrlPanel, -1, _T(""));
295 btnsSizer->Add( mwxPosition );
297 btnsCtrlPanel->SetSizer(btnsSizer);
298 sizer->Add ( btnsCtrlPanel, 0, wxLEFT | wxRIGHT | wxBOTTOM //| wxGROW
309 //================================================================
311 //================================================================
312 WxGUITextEditor::~WxGUITextEditor()
316 // delete mInterpreter;
318 //================================================================
320 //================================================================
321 void WxGUITextEditor::NewPage(const std::string& filename)
323 WxGUITextEditorPage* page =
324 new WxGUITextEditorPage(mwxNotebook,this);
325 std::string name("untitled");
326 if (filename.size()!=0)
331 page->SetPageName(name);
332 mwxNotebook->AddPage(page,name,true);
333 FocusOnCurrentPage();
335 //================================================================
337 //================================================================
338 WxGUITextEditorPage* WxGUITextEditor::GetCurrentPage()
340 return (WxGUITextEditorPage*)
341 mwxNotebook->GetPage(mwxNotebook->GetSelection());
343 //================================================================
345 //================================================================
346 void WxGUITextEditor::FocusOnCurrentPage()
348 if (mwxNotebook->GetPageCount()==0) return;
349 GetCurrentPage()->SetFocus();
351 //================================================================
353 //================================================================
354 void WxGUITextEditor::OnButtonOpen(wxCommandEvent& event)
357 FocusOnCurrentPage();
359 void WxGUITextEditor::Open()
361 std::cout << "-------------- OPEN ---------------"<<std::endl;
363 wxFileDialog* fd = new wxFileDialog(this,_T("Open file"),_T(""),
364 _T(""),std2wx(mFileNameFilter),
365 wxOPEN | wxFILE_MUST_EXIST );
368 if (fd->GetReturnCode()==wxID_OK)
370 std::string filename = wx2std(fd->GetPath());
371 std::cout << "file [" << filename << "]" <<std::endl;
376 std::cout << "-------------- CANCELLED ---------------"<<std::endl;
379 //================================================================
381 //================================================================
382 void WxGUITextEditor::Open(const std::string& filename)
387 //================================================================
389 //================================================================
390 void WxGUITextEditor::OnButtonClose(wxCommandEvent& event)
394 //================================================================
396 //================================================================
397 bool WxGUITextEditor::CloseCurrentPage()
399 std::cout << "-------------- CLOSE ---------------"<<std::endl;
400 if (mwxNotebook->GetPageCount()==0) return true;
401 if (GetCurrentPage()->IsModified())
403 wxString mess = std2wx(GetCurrentPage()->GetPageName());
404 mess += _T(" modified. Save it ?");
406 new wxMessageDialog(this,
409 wxYES_NO | wxCANCEL | wxICON_QUESTION);
410 switch (d->ShowModal())
416 GetCurrentPage()->Save(mFileNameFilter);
421 mwxNotebook->DeletePage(mwxNotebook->GetSelection());
422 FocusOnCurrentPage();
425 //================================================================
427 //================================================================
428 bool WxGUITextEditor::CloseAllPages()
431 while (mwxNotebook->GetPageCount()!=0)
433 if (!CloseCurrentPage())
441 //================================================================
443 //================================================================
444 void WxGUITextEditor::OnButtonSave(wxCommandEvent& event)
448 void WxGUITextEditor::SaveCurrentPage()
450 if (mwxNotebook->GetPageCount()==0) return;
451 GetCurrentPage()->Save(mFileNameFilter);
452 mwxNotebook->SetPageText(mwxNotebook->GetSelection(),
453 GetCurrentPage()->GetPageName());
455 //================================================================
457 //================================================================
458 void WxGUITextEditor::OnButtonSaveAs(wxCommandEvent& event)
460 if (mwxNotebook->GetPageCount()==0) return;
461 GetCurrentPage()->SetAskFilename(true);
464 //================================================================
466 //================================================================
467 void WxGUITextEditor::OnPageClose(wxAuiNotebookEvent& evt)
469 std::cout << "-------------- CLOSE ---------------"<<std::endl;
470 if (!CloseCurrentPage()) evt.Veto();
473 if (mwxNotebook->GetPageCount()==0) return;
474 if (GetCurrentPage()->IsModified())
477 new wxMessageDialog(this,
478 _T("Buffer modified. Save it ?"),
480 wxYES_NO | wxCANCEL | wxICON_QUESTION);
481 switch (d->ShowModal())
487 GetCurrentPage()->Save(mFileNameFilter);
494 //================================================================
499 //================================================================
500 void WxGUITextEditor::OnButtonQuit(wxCommandEvent& event)
503 FocusOnCurrentPage();
505 void WxGUITextEditor::Quit()
507 std::cout << "-------------- QUIT ---------------"<<std::endl;
508 if (AskSave()) GetParent()->Close();
510 //================================================================
513 //================================================================
514 void WxGUITextEditor::OnButtonRun(wxCommandEvent& event)
516 if ((mUser!=0) && (mwxNotebook->GetPageCount()>0))
517 mUser->WxGUITextEditorRun();
518 FocusOnCurrentPage();
522 void WxGUITextEditor::Run()
524 std::cout << "-------------- RUN ---------------"<<std::endl;
526 if (!mwxSplit->IsSplit())
529 int minsize = - (int)(mwxInputText->GetSize().GetHeight() / 2.);
530 if (size<minsize) size = minsize;
531 mwxSplit->SplitHorizontally( mwxInputText, mwxOutputText, size);
534 std::stringstream* buffer = new std::stringstream(bbtk::wx2std(mwxInputText->GetValue()));
535 mInterpreter->InterpretLine("reset");
538 mInterpreter->InterpretBuffer(buffer);
544 //================================================================
549 //================================================================
551 //================================================================
552 void WxGUITextEditor::OnButtonNew(wxCommandEvent& event)
555 FocusOnCurrentPage();
557 void WxGUITextEditor::New()
559 std::cout << "-------------- NEW ---------------" << std::endl;
563 //================================================================
565 //================================================================
566 void WxGUITextEditor::UpdateInfo()
568 if (mwxNotebook->GetPageCount()==0) return;
569 WxTextCtrlGettingKeyEvents* text = GetCurrentPage()->GetTextCtrl();
571 long line, column, pos;
572 pos = text->GetInsertionPoint();
573 text->PositionToXY(pos, &column, &line);
576 // wxLogMessage(_T("Current position: %ld\nCurrent line, column: (%ld, %ld)\nNumber of lines: %ld\nCurrent line length: %ld\nTotal text length: %u (%ld)"),
580 sprintf(mess,"%ld:%ld/%ld:%ld",
582 (long)text->GetNumberOfLines(),
583 (long)text->GetLineLength(line)+1);
585 // (long)mwxInputText->GetValue().length())+1;
587 mwxPosition->SetLabel(wxString(mess));
590 if (text->IsModified())
592 std::string title("*");
593 title += GetCurrentPage()->GetPageName();
594 mwxNotebook->SetPageText(mwxNotebook->GetSelection(),title);
597 //================================================================
598 //================================================================
599 void WxGUITextEditor::OnKeyUp(wxKeyEvent& event)
601 // std::cout << "U" << std::endl;
604 //================================================================
606 //================================================================
607 void WxGUITextEditor::OnKeyDown(wxKeyEvent& event)
609 // std::cout << "D" << std::endl;
610 // std::cout << "Key="<<event.GetKeyCode()<<std::endl;
611 if ( event.ControlDown() )
613 switch (event.GetKeyCode())
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;
623 //================================================================
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)
637 //================================================================
643 //================================================================
644 WxGUITextEditorWindow::WxGUITextEditorWindow( wxWindow *parent,
647 : wxFrame((wxFrame *)parent, -1, title, wxDefaultPosition, size)
651 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
653 mEditor = new WxGUITextEditor(this);
654 sizer->Add(mEditor,1,wxGROW);
656 // WxGUICommand* com = new WxGUICommand(this,this);
661 // Creates and sets the parent window of all bbtk windows
662 wxWindow* top = new wxPanel(this,-1);
665 Wx::SetTopWindow(top);
670 //================================================================
672 //================================================================
673 WxGUITextEditorWindow::~WxGUITextEditorWindow()
676 //================================================================
682 #endif //_USE_WXWIDGETS_