1 /*=========================================================================
4 Module: $RCSfile: bbtkWxGUITextEditor.cxx,v $
6 Date: $Date: 2008/03/25 10:31:18 $
7 Version: $Revision: 1.3 $
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"
53 //================================================================
54 class WxTextCtrlGettingKeyEvents : public wxTextCtrl
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)
63 void SetWxGUITextEditor(WxGUITextEditor* e)
64 { mWxGUITextEditor = e; }
66 void OnKeyDown(wxKeyEvent& event);
67 void OnKeyUp(wxKeyEvent& event);
68 void OnChar(wxKeyEvent& event);
70 WxGUITextEditor* mWxGUITextEditor;
75 BEGIN_EVENT_TABLE(WxTextCtrlGettingKeyEvents, wxTextCtrl)
76 EVT_KEY_DOWN(WxTextCtrlGettingKeyEvents::OnKeyDown)
77 EVT_KEY_UP(WxTextCtrlGettingKeyEvents::OnKeyUp)
78 EVT_CHAR(WxTextCtrlGettingKeyEvents::OnChar)
82 void WxTextCtrlGettingKeyEvents::OnChar(wxKeyEvent& event)
87 void WxTextCtrlGettingKeyEvents::OnKeyUp(wxKeyEvent& event)
89 mWxGUITextEditor->OnKeyUp(event);
93 void WxTextCtrlGettingKeyEvents::OnKeyDown(wxKeyEvent& event)
95 mWxGUITextEditor->OnKeyDown(event);
98 //================================================================
102 //================================================================
103 /* BEGIN_EVENT_TABLE(WxGUITextEditorPage, wxPanel)
104 EVT_CLOSE(WxGUITextEditorPage::OnClose)
108 //================================================================
109 WxGUITextEditorPage::WxGUITextEditorPage(wxWindow* parent,
110 WxGUITextEditor* editor)
111 : wxPanel(parent,-1),
116 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
119 new WxTextCtrlGettingKeyEvents(this,
125 // |wxTE_PROCESS_ENTER
130 mwxInputText->SetWxGUITextEditor(mEditor);
132 wxFont* FixedFont = new wxFont(10,
138 mwxInputTextAttr = new wxTextAttr;
139 mwxInputTextAttr->SetFont(*FixedFont);
141 sizer->Add(mwxInputText,1,wxGROW);
146 //================================================================
148 //================================================================
149 WxGUITextEditorPage::~WxGUITextEditorPage()
152 //================================================================
154 bool WxGUITextEditorPage::IsModified()
155 { return mwxInputText->IsModified(); }
157 std::string WxGUITextEditorPage::GetText()
159 return wx2std(GetTextCtrl()->GetValue());
162 //================================================================
163 void WxGUITextEditorPage::Load(const std::string& filename)
165 std::cout << "-------------- LOAD ---------------"<<std::endl;
166 std::cout << "'" << filename << "'"<<std::endl;
167 //std::string oldFilename = mFilename;
169 mAskFilename = false;
170 mwxInputText->LoadFile(std2wx(mName));
172 //================================================================
174 //================================================================
175 void WxGUITextEditorPage::Save(const std::string& filter)
177 std::cout << "-------------- SAVE ---------------"<<std::endl;
180 wxFileDialog* fd = new wxFileDialog(this,_T("Save file"),_T(""),
181 _T(""),std2wx(filter),
182 wxSAVE | wxOVERWRITE_PROMPT );
185 if (fd->GetReturnCode()==wxID_OK)
187 mName = wx2std(fd->GetPath());
188 mAskFilename = false;
192 std::cout << "-------------- CANCELLED ---------------"
197 std::cout << "file [" << mName << "]" <<std::endl;
198 mwxInputText->SaveFile(mName);
199 mwxInputText->SetModified(false);
201 //================================================================
203 //================================================================
204 WxGUITextEditor::WxGUITextEditor( wxWindow *parent,
205 WxGUITextEditorUser* user )
206 : wxPanel(parent, -1),
208 mFileNameFilter("*.*")
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);
218 wxInitAllImageHandlers();
221 // wxFlexGridSizer *sizer= new wxFlexGridSizer(2);
222 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
224 mwxNotebook = new wxAuiNotebook(this,
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
238 sizer->Add(mwxNotebook,1,wxGROW);
241 wxPanel *btnsCtrlPanel = new wxPanel(this,-1);
242 wxBoxSizer *btnsSizer = new wxBoxSizer(wxHORIZONTAL);
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 );
260 wxBitmap bmp_run(cc_run_xpm);
261 mwxButtonRun = new wxBitmapButton( btnsCtrlPanel,ID_ButtonRun,bmp_run);//_T("Run") );
262 btnsSizer->Add( mwxButtonRun );
264 wxBitmap bmp_quit(cc_exit_xpm);
265 mwxButtonQuit = new wxBitmapButton( btnsCtrlPanel,ID_ButtonQuit,bmp_quit);//_T("Quit") );
266 btnsSizer->Add( mwxButtonQuit );
269 mwxPosition = new wxStaticText ( btnsCtrlPanel, -1, _T(""));
270 btnsSizer->Add( mwxPosition );
272 btnsCtrlPanel->SetSizer(btnsSizer);
273 sizer->Add ( btnsCtrlPanel, 0, wxLEFT | wxRIGHT | wxBOTTOM //| wxGROW
284 //================================================================
286 //================================================================
287 WxGUITextEditor::~WxGUITextEditor()
290 // delete mInterpreter;
292 //================================================================
294 //================================================================
295 void WxGUITextEditor::NewPage(const std::string& filename)
297 WxGUITextEditorPage* page =
298 new WxGUITextEditorPage(mwxNotebook,this);
299 std::string name("untitled");
300 if (filename.size()!=0)
305 page->SetPageName(name);
306 mwxNotebook->AddPage(page,name,true);
307 FocusOnCurrentPage();
309 //================================================================
311 //================================================================
312 WxGUITextEditorPage* WxGUITextEditor::GetCurrentPage()
314 return (WxGUITextEditorPage*)
315 mwxNotebook->GetPage(mwxNotebook->GetSelection());
317 //================================================================
319 //================================================================
320 void WxGUITextEditor::FocusOnCurrentPage()
322 if (mwxNotebook->GetPageCount()==0) return;
323 GetCurrentPage()->SetFocus();
325 //================================================================
327 //================================================================
328 void WxGUITextEditor::OnButtonOpen(wxCommandEvent& event)
331 FocusOnCurrentPage();
333 void WxGUITextEditor::Open()
335 std::cout << "-------------- OPEN ---------------"<<std::endl;
337 wxFileDialog* fd = new wxFileDialog(this,_T("Open file"),_T(""),
338 _T(""),std2wx(mFileNameFilter),
339 wxOPEN | wxFILE_MUST_EXIST );
342 if (fd->GetReturnCode()==wxID_OK)
344 std::string filename = wx2std(fd->GetPath());
345 std::cout << "file [" << filename << "]" <<std::endl;
350 std::cout << "-------------- CANCELLED ---------------"<<std::endl;
353 //================================================================
355 //================================================================
356 void WxGUITextEditor::Open(const std::string& filename)
361 //================================================================
363 //================================================================
364 void WxGUITextEditor::OnButtonClose(wxCommandEvent& event)
366 std::cout << "-------------- CLOSE ---------------"<<std::endl;
367 if (mwxNotebook->GetPageCount()==0) return;
368 if (GetCurrentPage()->IsModified())
371 new wxMessageDialog(this,
372 _T("Buffer modified. Save it ?"),
374 wxYES_NO | wxCANCEL | wxICON_QUESTION);
375 switch (d->ShowModal())
381 GetCurrentPage()->Save(mFileNameFilter);
386 mwxNotebook->DeletePage(mwxNotebook->GetSelection());
387 FocusOnCurrentPage();
389 //================================================================
391 //================================================================
392 void WxGUITextEditor::OnButtonSave(wxCommandEvent& event)
396 void WxGUITextEditor::Save()
398 std::cout << "-------------- SAVE ---------------"<<std::endl;
399 if (mwxNotebook->GetPageCount()==0) return;
400 GetCurrentPage()->Save(mFileNameFilter);
401 mwxNotebook->SetPageText(mwxNotebook->GetSelection(),
402 GetCurrentPage()->GetPageName());
404 //================================================================
406 //================================================================
407 void WxGUITextEditor::OnButtonSaveAs(wxCommandEvent& event)
409 if (mwxNotebook->GetPageCount()==0) return;
410 GetCurrentPage()->SetAskFilename(true);
413 //================================================================
415 //================================================================
416 void WxGUITextEditor::OnPageClose(wxAuiNotebookEvent& evt)
418 std::cout << "-------------- CLOSE ---------------"<<std::endl;
419 if (mwxNotebook->GetPageCount()==0) return;
420 if (GetCurrentPage()->IsModified())
423 new wxMessageDialog(this,
424 _T("Buffer modified. Save it ?"),
426 wxYES_NO | wxCANCEL | wxICON_QUESTION);
427 switch (d->ShowModal())
433 GetCurrentPage()->Save(mFileNameFilter);
440 //================================================================
445 //================================================================
446 void WxGUITextEditor::OnButtonQuit(wxCommandEvent& event)
449 FocusOnCurrentPage();
451 void WxGUITextEditor::Quit()
453 std::cout << "-------------- QUIT ---------------"<<std::endl;
454 if (AskSave()) GetParent()->Close();
456 //================================================================
459 //================================================================
460 void WxGUITextEditor::OnButtonRun(wxCommandEvent& event)
462 if ((mUser!=0) && (mwxNotebook->GetPageCount()>0))
463 mUser->WxGUITextEditorRun();
464 FocusOnCurrentPage();
468 void WxGUITextEditor::Run()
470 std::cout << "-------------- RUN ---------------"<<std::endl;
472 if (!mwxSplit->IsSplit())
475 int minsize = - (int)(mwxInputText->GetSize().GetHeight() / 2.);
476 if (size<minsize) size = minsize;
477 mwxSplit->SplitHorizontally( mwxInputText, mwxOutputText, size);
480 std::stringstream* buffer = new std::stringstream(bbtk::wx2std(mwxInputText->GetValue()));
481 mInterpreter->InterpretLine("reset");
484 mInterpreter->InterpretBuffer(buffer);
490 //================================================================
495 //================================================================
497 //================================================================
498 void WxGUITextEditor::OnButtonNew(wxCommandEvent& event)
501 FocusOnCurrentPage();
503 void WxGUITextEditor::New()
505 std::cout << "-------------- NEW ---------------" << std::endl;
509 //================================================================
511 //================================================================
512 void WxGUITextEditor::UpdateInfo()
514 if (mwxNotebook->GetPageCount()==0) return;
515 WxTextCtrlGettingKeyEvents* text = GetCurrentPage()->GetTextCtrl();
517 long line, column, pos;
518 pos = text->GetInsertionPoint();
519 text->PositionToXY(pos, &column, &line);
522 // wxLogMessage(_T("Current position: %ld\nCurrent line, column: (%ld, %ld)\nNumber of lines: %ld\nCurrent line length: %ld\nTotal text length: %u (%ld)"),
526 sprintf(mess,"%ld:%ld/%ld:%ld",
528 (long)text->GetNumberOfLines(),
529 (long)text->GetLineLength(line)+1);
531 // (long)mwxInputText->GetValue().length())+1;
533 mwxPosition->SetLabel(wxString(mess));
536 if (text->IsModified())
538 std::string title("*");
539 title += GetCurrentPage()->GetPageName();
540 mwxNotebook->SetPageText(mwxNotebook->GetSelection(),title);
543 //================================================================
544 //================================================================
545 void WxGUITextEditor::OnKeyUp(wxKeyEvent& event)
547 // std::cout << "U" << std::endl;
550 //================================================================
552 //================================================================
553 void WxGUITextEditor::OnKeyDown(wxKeyEvent& event)
555 // std::cout << "D" << std::endl;
556 // std::cout << "Key="<<event.GetKeyCode()<<std::endl;
557 if ( event.ControlDown() )
559 switch (event.GetKeyCode())
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;
569 //================================================================
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)
583 //================================================================
589 //================================================================
590 WxGUITextEditorWindow::WxGUITextEditorWindow( wxWindow *parent,
593 : wxFrame((wxFrame *)parent, -1, title, wxDefaultPosition, size)
597 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
599 mEditor = new WxGUITextEditor(this);
600 sizer->Add(mEditor,1,wxGROW);
602 // WxGUICommand* com = new WxGUICommand(this,this);
607 // Creates and sets the parent window of all bbtk windows
608 wxWindow* top = new wxPanel(this,-1);
611 Wx::SetTopWindow(top);
616 //================================================================
618 //================================================================
619 WxGUITextEditorWindow::~WxGUITextEditorWindow()
622 //================================================================
628 #endif //_USE_WXWIDGETS_