1 /*=========================================================================
4 Module: $RCSfile: bbtkWxGUITextEditor.cxx,v $
6 Date: $Date: 2008/04/24 12:56:40 $
7 Version: $Revision: 1.11 $
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"
39 #include "bbtkUtilities.h"
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"
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"
62 //================================================================
63 class WxTextCtrlGettingKeyEvents : public wxTextCtrl
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)
72 void SetWxGUITextEditor(WxGUITextEditor* e)
73 { mWxGUITextEditor = e; }
75 void OnKeyDown(wxKeyEvent& event);
76 void OnKeyUp(wxKeyEvent& event);
77 void OnChar(wxKeyEvent& event);
79 WxGUITextEditor* mWxGUITextEditor;
84 BEGIN_EVENT_TABLE(WxTextCtrlGettingKeyEvents, wxTextCtrl)
85 EVT_KEY_DOWN(WxTextCtrlGettingKeyEvents::OnKeyDown)
86 EVT_KEY_UP(WxTextCtrlGettingKeyEvents::OnKeyUp)
87 EVT_CHAR(WxTextCtrlGettingKeyEvents::OnChar)
91 void WxTextCtrlGettingKeyEvents::OnChar(wxKeyEvent& event)
96 void WxTextCtrlGettingKeyEvents::OnKeyUp(wxKeyEvent& event)
98 mWxGUITextEditor->OnKeyUp(event);
102 void WxTextCtrlGettingKeyEvents::OnKeyDown(wxKeyEvent& event)
104 mWxGUITextEditor->OnKeyDown(event);
107 //================================================================
111 //================================================================
112 /* BEGIN_EVENT_TABLE(WxGUITextEditorPage, wxPanel)
113 EVT_CLOSE(WxGUITextEditorPage::OnClose)
117 //================================================================
118 WxGUITextEditorPage::WxGUITextEditorPage(wxWindow* parent,
119 WxGUITextEditor* editor)
120 : wxPanel(parent,-1),
125 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
128 new WxTextCtrlGettingKeyEvents(this,
134 // |wxTE_PROCESS_ENTER
139 mwxInputText->SetWxGUITextEditor(mEditor);
141 wxFont* FixedFont = new wxFont(10,
147 mwxInputTextAttr = new wxTextAttr;
148 mwxInputTextAttr->SetFont(*FixedFont);
150 sizer->Add(mwxInputText,1,wxGROW);
155 //================================================================
157 //================================================================
158 WxGUITextEditorPage::~WxGUITextEditorPage()
161 //================================================================
163 bool WxGUITextEditorPage::IsModified()
164 { return mwxInputText->IsModified(); }
166 std::string WxGUITextEditorPage::GetText()
168 return wx2std(GetTextCtrl()->GetValue());
171 //================================================================
172 void WxGUITextEditorPage::Load(const std::string& filename)
174 // std::cout << "-------------- LOAD ---------------"<<std::endl;
175 // std::cout << "'" << filename << "'"<<std::endl;
176 //std::string oldFilename = mFilename;
178 mAskFilename = false;
179 mwxInputText->LoadFile(std2wx(mName));
181 //================================================================
183 //================================================================
184 void WxGUITextEditorPage::Save(const std::string& filter)
186 // std::cout << "-------------- SAVE ---------------"<<std::endl;
189 wxFileDialog* fd = new wxFileDialog(this,_T("Save file"),_T(""),
190 _T(""),std2wx(filter),
191 wxSAVE | wxOVERWRITE_PROMPT );
194 if (fd->GetReturnCode()==wxID_OK)
196 mName = wx2std(fd->GetPath());
197 mAskFilename = false;
201 // std::cout << "-------------- CANCELLED ---------------"
206 // std::cout << "file [" << mName << "]" <<std::endl;
207 mwxInputText->SaveFile(std2wx(mName));
208 mwxInputText->SetModified(false);
210 //================================================================
212 //================================================================
213 WxGUITextEditor::WxGUITextEditor( wxWindow *parent,
214 WxGUITextEditorUser* user )
215 : wxPanel(parent, -1),
217 mFileNameFilter("*.*")
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);
227 wxInitAllImageHandlers();
230 // wxFlexGridSizer *sizer= new wxFlexGridSizer(2);
231 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
233 mwxNotebook = new wxAuiNotebook(this,
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
247 sizer->Add(mwxNotebook,1,wxGROW);
251 wxPanel *btnsCtrlPanel = new wxPanel(this,-1);
252 wxBoxSizer *btnsSizer = new wxBoxSizer(wxHORIZONTAL);
255 wxBitmap bmp_new(cc_new_xpm);
256 wxBitmap bmp_open(cc_open_xpm);
257 wxBitmap bmp_close(cc_stop_xpm);
258 wxBitmap bmp_save(cc_save_xpm);
259 wxBitmap bmp_saveas(cc_save_as_xpm);
260 wxBitmap bmp_run(cc_run_xpm);
262 wxBitmap bmp_new(new_xpm);
263 wxBitmap bmp_open(fileopen_xpm);
264 wxBitmap bmp_close(eldel_xpm);
265 wxBitmap bmp_save(filesave_xpm);
266 wxBitmap bmp_saveas(filesaveas_xpm);
267 wxBitmap bmp_run(down_xpm);
270 wxSize btn_size(32,32);
271 mwxButtonNew = new wxBitmapButton( btnsCtrlPanel,ID_ButtonNew,bmp_new
272 ,wxDefaultPosition, btn_size);
273 btnsSizer->Add( mwxButtonNew );
275 mwxButtonOpen = new wxBitmapButton( btnsCtrlPanel,ID_ButtonOpen,bmp_open ,wxDefaultPosition, btn_size);//,_T("Open") );
276 btnsSizer->Add( mwxButtonOpen );
278 mwxButtonClose = new wxBitmapButton( btnsCtrlPanel,ID_ButtonClose,bmp_close ,wxDefaultPosition, btn_size);//,_T("Open") );
279 btnsSizer->Add( mwxButtonClose );
281 mwxButtonSave = new wxBitmapButton( btnsCtrlPanel,ID_ButtonSave,bmp_save ,wxDefaultPosition, btn_size);//_T("Save") );
282 btnsSizer->Add( mwxButtonSave );
284 mwxButtonSaveAs = new wxBitmapButton( btnsCtrlPanel,ID_ButtonSaveAs,bmp_saveas ,wxDefaultPosition, btn_size);//_T("Save") );
285 btnsSizer->Add( mwxButtonSaveAs );
288 mwxButtonRun = new wxBitmapButton( btnsCtrlPanel,ID_ButtonRun,bmp_run ,wxDefaultPosition, btn_size);//_T("Run") );
289 btnsSizer->Add( mwxButtonRun );
291 wxBitmap bmp_quit(cc_exit_xpm);
292 mwxButtonQuit = new wxBitmapButton( btnsCtrlPanel,ID_ButtonQuit,bmp_quit);//_T("Quit") );
293 btnsSizer->Add( mwxButtonQuit );
296 mwxPosition = new wxStaticText ( btnsCtrlPanel, -1, _T(""));
297 btnsSizer->Add( mwxPosition );
299 btnsCtrlPanel->SetSizer(btnsSizer);
300 btnsCtrlPanel->SetAutoLayout(true);
301 btnsCtrlPanel->Layout();
303 sizer->Add ( btnsCtrlPanel, 0, wxLEFT | wxRIGHT | wxBOTTOM //| wxGROW
314 //================================================================
316 //================================================================
317 WxGUITextEditor::~WxGUITextEditor()
321 // delete mInterpreter;
323 //================================================================
325 //================================================================
326 void WxGUITextEditor::NewPage(const std::string& filename)
328 WxGUITextEditorPage* page =
329 new WxGUITextEditorPage(mwxNotebook,this);
330 std::string name("untitled");
331 if (filename.size()!=0)
336 page->SetPageName(name);
337 std::string fname = Utilities::get_file_name(name);
338 mwxNotebook->AddPage(page,std2wx(fname),true);
339 FocusOnCurrentPage();
341 //================================================================
343 //================================================================
344 WxGUITextEditorPage* WxGUITextEditor::GetCurrentPage()
346 return (WxGUITextEditorPage*)
347 mwxNotebook->GetPage(mwxNotebook->GetSelection());
349 //================================================================
351 //================================================================
352 void WxGUITextEditor::FocusOnCurrentPage()
354 if (mwxNotebook->GetPageCount()==0) return;
355 GetCurrentPage()->SetFocus();
357 //================================================================
359 //================================================================
360 void WxGUITextEditor::OnButtonOpen(wxCommandEvent& event)
363 FocusOnCurrentPage();
365 void WxGUITextEditor::Open()
367 // std::cout << "-------------- OPEN ---------------"<<std::endl;
369 wxFileDialog* fd = new wxFileDialog(this,_T("Open file"),_T(""),
370 _T(""),std2wx(mFileNameFilter),
371 wxOPEN | wxFILE_MUST_EXIST );
374 if (fd->GetReturnCode()==wxID_OK)
376 std::string filename = wx2std(fd->GetPath());
377 std::cout << "file [" << filename << "]" <<std::endl;
382 // std::cout << "-------------- CANCELLED ---------------"<<std::endl;
385 //================================================================
387 //================================================================
388 void WxGUITextEditor::Open(const std::string& filename)
393 //================================================================
395 //================================================================
396 void WxGUITextEditor::OnButtonClose(wxCommandEvent& event)
400 //================================================================
402 //================================================================
403 bool WxGUITextEditor::CloseCurrentPage()
405 // std::cout << "-------------- CLOSE ---------------"<<std::endl;
406 if (mwxNotebook->GetPageCount()==0) return true;
407 if (GetCurrentPage()->IsModified())
409 wxString mess = std2wx(GetCurrentPage()->GetPageName());
410 mess += _T(" modified. Save it ?");
412 new wxMessageDialog(this,
415 wxYES_NO | wxCANCEL | wxICON_QUESTION);
416 switch (d->ShowModal())
422 GetCurrentPage()->Save(mFileNameFilter);
427 mwxNotebook->DeletePage(mwxNotebook->GetSelection());
428 FocusOnCurrentPage();
431 //================================================================
433 //================================================================
434 bool WxGUITextEditor::CloseAllPages()
437 while (mwxNotebook->GetPageCount()!=0)
439 if (!CloseCurrentPage())
447 //================================================================
449 //================================================================
450 void WxGUITextEditor::OnButtonSave(wxCommandEvent& event)
454 void WxGUITextEditor::SaveCurrentPage()
456 if (mwxNotebook->GetPageCount()==0) return;
457 GetCurrentPage()->Save(mFileNameFilter);
458 mwxNotebook->SetPageText(mwxNotebook->GetSelection(),
459 std2wx(GetCurrentPage()->GetPageName()));
461 //================================================================
463 //================================================================
464 void WxGUITextEditor::OnButtonSaveAs(wxCommandEvent& event)
466 if (mwxNotebook->GetPageCount()==0) return;
467 GetCurrentPage()->SetAskFilename(true);
470 //================================================================
472 //================================================================
473 void WxGUITextEditor::OnPageClose(wxAuiNotebookEvent& evt)
475 // std::cout << "-------------- CLOSE ---------------"<<std::endl;
476 if (!CloseCurrentPage()) evt.Veto();
479 if (mwxNotebook->GetPageCount()==0) return;
480 if (GetCurrentPage()->IsModified())
483 new wxMessageDialog(this,
484 _T("Buffer modified. Save it ?"),
486 wxYES_NO | wxCANCEL | wxICON_QUESTION);
487 switch (d->ShowModal())
493 GetCurrentPage()->Save(mFileNameFilter);
500 //================================================================
505 //================================================================
506 void WxGUITextEditor::OnButtonQuit(wxCommandEvent& event)
509 FocusOnCurrentPage();
511 void WxGUITextEditor::Quit()
513 std::cout << "-------------- QUIT ---------------"<<std::endl;
514 if (AskSave()) GetParent()->Close();
516 //================================================================
519 //================================================================
520 void WxGUITextEditor::OnButtonRun(wxCommandEvent& event)
522 if ((mUser!=0) && (mwxNotebook->GetPageCount()>0))
523 mUser->WxGUITextEditorRun();
524 FocusOnCurrentPage();
528 void WxGUITextEditor::Run()
530 std::cout << "-------------- RUN ---------------"<<std::endl;
532 if (!mwxSplit->IsSplit())
535 int minsize = - (int)(mwxInputText->GetSize().GetHeight() / 2.);
536 if (size<minsize) size = minsize;
537 mwxSplit->SplitHorizontally( mwxInputText, mwxOutputText, size);
540 std::stringstream* buffer = new std::stringstream(bbtk::wx2std(mwxInputText->GetValue()));
541 mInterpreter->InterpretLine("reset");
544 mInterpreter->InterpretBuffer(buffer);
550 //================================================================
555 //================================================================
557 //================================================================
558 void WxGUITextEditor::OnButtonNew(wxCommandEvent& event)
561 FocusOnCurrentPage();
563 void WxGUITextEditor::New()
565 /// std::cout << "-------------- NEW ---------------" << std::endl;
569 //================================================================
571 //================================================================
572 void WxGUITextEditor::UpdateInfo()
574 if (mwxNotebook->GetPageCount()==0) return;
575 WxTextCtrlGettingKeyEvents* text = GetCurrentPage()->GetTextCtrl();
577 long line, column, pos;
578 pos = text->GetInsertionPoint();
579 text->PositionToXY(pos, &column, &line);
582 // wxLogMessage(_T("Current position: %ld\nCurrent line, column: (%ld, %ld)\nNumber of lines: %ld\nCurrent line length: %ld\nTotal text length: %u (%ld)"),
586 sprintf(mess,"%ld:%ld/%ld:%ld",
588 (long)text->GetNumberOfLines(),
589 (long)text->GetLineLength(line)+1);
591 // (long)mwxInputText->GetValue().length())+1;
593 // mwxPosition->SetLabel(wxString(mess));
594 mwxPosition->SetLabel(std2wx(mess));
597 if (text->IsModified())
599 std::string title("*");
600 title += GetCurrentPage()->GetPageName();
601 mwxNotebook->SetPageText(mwxNotebook->GetSelection(),std2wx(title));
604 //================================================================
605 //================================================================
606 void WxGUITextEditor::OnKeyUp(wxKeyEvent& event)
608 // std::cout << "U" << std::endl;
611 //================================================================
613 //================================================================
614 void WxGUITextEditor::OnKeyDown(wxKeyEvent& event)
616 // std::cout << "D" << std::endl;
617 // std::cout << "Key="<<event.GetKeyCode()<<std::endl;
618 if ( event.ControlDown() )
620 switch (event.GetKeyCode())
622 case 'n': case 'N' : New(); break;
623 case 's': case 'S' : SaveCurrentPage(); break;
624 case 'o': case 'O' : Open(); break;
625 // case 'r': case 'R' : Run(); break;
626 // case 'q': case 'Q' : Quit(); break;
630 //================================================================
632 //================================================================
633 BEGIN_EVENT_TABLE(WxGUITextEditor, wxPanel)
634 // EVT_CHAR(WxGUITextEditor::OnKeyPress)
635 EVT_BUTTON(WxGUITextEditor::ID_ButtonNew, WxGUITextEditor::OnButtonNew)
636 EVT_BUTTON(WxGUITextEditor::ID_ButtonOpen, WxGUITextEditor::OnButtonOpen)
637 EVT_BUTTON(WxGUITextEditor::ID_ButtonClose, WxGUITextEditor::OnButtonClose)
638 EVT_BUTTON(WxGUITextEditor::ID_ButtonSave, WxGUITextEditor::OnButtonSave)
639 EVT_BUTTON(WxGUITextEditor::ID_ButtonSaveAs, WxGUITextEditor::OnButtonSaveAs)
640 EVT_BUTTON(WxGUITextEditor::ID_ButtonRun, WxGUITextEditor::OnButtonRun)
641 // EVT_BUTTON(WxGUITextEditor::ID_ButtonQuit, WxGUITextEditor::OnButtonQuit)
642 EVT_AUINOTEBOOK_PAGE_CLOSE(wxID_ANY, WxGUITextEditor::OnPageClose)
644 //================================================================
650 //================================================================
651 WxGUITextEditorWindow::WxGUITextEditorWindow( wxWindow *parent,
654 : wxFrame((wxFrame *)parent, -1, title, wxDefaultPosition, size)
658 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
660 mEditor = new WxGUITextEditor(this);
661 sizer->Add(mEditor,1,wxGROW);
663 // WxGUICommand* com = new WxGUICommand(this,this);
668 // Creates the parent window of all bbtk windows as a child of this
669 Wx::CreateTopWindow(this);
670 // Add the method OnWxSignal as a Wx::Signal observer
671 //bbtkAddWxSignalObserver(WxGUITextEditorWindow::OnWxSignal);
677 //================================================================
679 //================================================================
680 WxGUITextEditorWindow::~WxGUITextEditorWindow()
683 //================================================================
689 #endif //_USE_WXWIDGETS_