X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=kernel%2Fsrc%2FbbtkWxGUIScriptingInterface.cxx;h=9e8e57dbe5732772b25494f9ad15dfa167bccf49;hb=cfad95b6e08e6e53846ffcda7fbc5932065f2c47;hp=8a6ebfb17d9db41fe99340f809f351a58763f7af;hpb=a09174b82cb36ffd30bdbaed12c6ebd936a0e8f7;p=bbtk.git diff --git a/kernel/src/bbtkWxGUIScriptingInterface.cxx b/kernel/src/bbtkWxGUIScriptingInterface.cxx index 8a6ebfb..9e8e57d 100644 --- a/kernel/src/bbtkWxGUIScriptingInterface.cxx +++ b/kernel/src/bbtkWxGUIScriptingInterface.cxx @@ -1,20 +1,42 @@ +/* + # --------------------------------------------------------------------- + # + # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image + # pour la SantÈ) + # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton + # Previous Authors : Laurent Guigues, Jean-Pierre Roux + # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil + # + # This software is governed by the CeCILL-B license under French law and + # abiding by the rules of distribution of free software. You can use, + # modify and/ or redistribute the software under the terms of the CeCILL-B + # license as circulated by CEA, CNRS and INRIA at the following URL + # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html + # or in the file LICENSE.txt. + # + # As a counterpart to the access to the source code and rights to copy, + # modify and redistribute granted by the license, users are provided only + # with a limited warranty and the software's author, the holder of the + # economic rights, and the successive licensors have only limited + # liability. + # + # The fact that you are presently reading this means that you have had + # knowledge of the CeCILL-B license and that you accept its terms. + # ------------------------------------------------------------------------ */ + + /*========================================================================= - Program: bbtk Module: $RCSfile: bbtkWxGUIScriptingInterface.cxx,v $ Language: C++ - Date: $Date: 2008/07/23 11:46:11 $ - Version: $Revision: 1.14 $ - - Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de - l'Image). All rights reserved. See Doc/License.txt or - http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details. - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the above copyright notices for more information. - -=========================================================================*//** + Date: $Date: 2012/11/16 08:49:01 $ + Version: $Revision: 1.49 $ +=========================================================================*/ + + + + +/** * \brief Short description in one line * * Long description which @@ -37,7 +59,13 @@ #include "bbtkWxBlackBox.h" #include "bbtkConfigurationFile.h" #include "bbtkWxStreamRedirector.h" - +#include "bbtkUtilities.h" + +#include "creaWx.h" + +#include +#include + //#include "icons/cc_run.xpm" @@ -52,7 +80,10 @@ namespace bbtk ID_Menu_CreatePackage, ID_Menu_CreateBlackBox, ID_Menu_ShowImageGraph, - ID_Menu_CreateIndex, + ID_Menu_RegeneratePackageDoc, + ID_Menu_RegenerateBoxesLists, + ID_Menu_RegenerateAll, + ID_Menu_PlugPackage, ID_Menu_Windows_Files, ID_Menu_Windows_Help, ID_Menu_Windows_Messages, @@ -64,32 +95,39 @@ namespace bbtk //================================================================ - WxGUIScriptingInterface::WxGUIScriptingInterface( wxWindow *parent, wxString title, wxSize size) - : wxFrame((wxFrame *)parent, -1, title, wxDefaultPosition, size) + WxGUIScriptingInterface::WxGUIScriptingInterface( wxWindow *parent ) + : wxFrame((wxFrame *)parent, -1, _T("bbStudio"), + wxDefaultPosition, wxSize(1200,800) ) { -// m_mgr = new wxAuiManager(this); - m_mgr.SetManagedWindow(this); - - mInterpreter = bbtk::Interpreter::New(); + m_mgr.SetManagedWindow(this); + + mInterpreter = bbtk::Interpreter::New(); mInterpreter->SetUser(this); - mInterpreter->SetCommandLine(true); + mInterpreter->SetCommandLine(true); mInterpreter->SetThrow(true); + // mInterpreter->AddBreakObserver + //boost::bind( &WxGUIScriptingInterface::InterpreterUserOnBreak, this )); //============== // Menu wxInitAllImageHandlers(); wxMenu *menuFile = new wxMenu; + menuFile->Append( ID_Menu_EditConfig, _T("Open bbtk &Config file") ); menuFile->Append( ID_Menu_Quit, _T("&Quit") ); wxMenu *menuAbout = new wxMenu; menuAbout->Append( ID_Menu_About, _T("&About...") ); wxMenu *menuTools = new wxMenu; - menuTools->Append( ID_Menu_EditConfig, _T("&Edit bbtk config") ); - menuTools->Append( ID_Menu_CreatePackage, _T("Create &package") ); - menuTools->Append( ID_Menu_CreateBlackBox, _T("Create &blackbox") ); - menuTools->Append( ID_Menu_ShowImageGraph, _T("&Show last image graph") ); - menuTools->Append( ID_Menu_CreateIndex, _T("&Generate index") ); + menuTools->Append( ID_Menu_CreatePackage, _T("Create &package") ); + menuTools->Append( ID_Menu_CreateBlackBox, _T("Create &black box") ); + menuTools->Append( ID_Menu_PlugPackage, _T("&Plug package") ); + menuTools->AppendSeparator(); + menuTools->Append( ID_Menu_RegeneratePackageDoc,_T("Regenerate package &doc") ); + menuTools->Append( ID_Menu_RegenerateBoxesLists,_T("Regenerate boxes &lists") ); + menuTools->Append( ID_Menu_RegenerateAll, _T("Regenerate &all") ); + menuTools->AppendSeparator(); + menuTools->Append( ID_Menu_ShowImageGraph, _T("&Show last graph") ); wxMenu *menuWindows = new wxMenu; menuWindows->AppendCheckItem(ID_Menu_Windows_Files, @@ -101,10 +139,10 @@ namespace bbtk menuWindows->AppendCheckItem(ID_Menu_Windows_Command, _T("Show 'command' panel") )->Check(); menuWindows->AppendSeparator(); - menuWindows->Append( ID_Menu_Windows_PackageBrowser, _T("Show Package &Browser") ); + menuWindows->Append( ID_Menu_Windows_PackageBrowser, _T("Start Package &Browser") ); - menuWindows->AppendSeparator(); - menuWindows->Append ( ID_Menu_Windows_Save, _T("Save interface configuration")); + // menuWindows->AppendSeparator(); + // menuWindows->Append ( ID_Menu_Windows_Save, _T("Save interface configuration")); wxMenu *menuOptions = new wxMenu; mwxMenuItemReset = menuOptions->AppendCheckItem(-1, @@ -120,21 +158,18 @@ namespace bbtk SetMenuBar( menuBar ); + //=== + // Status bar CreateStatusBar(); SetStatusText( _T("Welcome to bbStudio !") ); - // + //=== + // Panes (Files, Messages, Help, Command) mWxGUITextEditor = new WxGUITextEditor(this,this); mWxGUITextEditor->SetFileNameFilter("*.bbs"); - mWxGUIHtmlBrowser = new WxGUIHtmlBrowser(this,wxSize(200,0),this); + mWxGUIHtmlBrowser = new WxGUIHtmlBrowser(this,wxSize(200,0),this); - - /* - wxBitmap bmp_run(cc_run_xpm); - mwxButtonRun = new wxBitmapButton( this, ID_Button_Run,bmp_run);//_T("Run") ); - */ - mWxGUIOutputMessages = new WxGUIOutputMessages(this); mWxGUICommand = new WxGUICommand(this,this); @@ -142,6 +177,7 @@ namespace bbtk mWxGUICommand->SetFocus(); +#if NOTEBOOK mwxNotebook = new wxAuiNotebook(this, -1, @@ -174,8 +210,8 @@ namespace bbtk .Center() // .MinSize(wxSize(100,100)) ); +#else - /* // m_mgr.AddPane(mWxGUITextEditor, wxAuiPaneInfo().Name(wxT("editor_content")) @@ -192,7 +228,8 @@ namespace bbtk .MinimizeButton(true) .MaximizeButton(true) .Right() - .MinSize(wxSize(200,100)) + .Layer(2) + .MinSize(wxSize(400,100)) ); m_mgr.AddPane(mWxGUIOutputMessages, @@ -203,67 +240,155 @@ namespace bbtk .Bottom() .MinSize(wxSize(100,100)) ); + m_mgr.AddPane(mWxGUICommand, wxAuiPaneInfo().Name(wxT("command_content")) .Caption(wxT("Command")) .MinimizeButton(true) .MaximizeButton(true) .Bottom() - .Position(1) + .Layer(1) .MinSize(wxSize(100,100)) ); - */ - // m_mgr.AddPane(mwxButtonRun, - // wxAuiPaneInfo().Name(wxT("button_run_content"))); +#endif - // Creates the parent window of all bbtk windows as a child of this - Wx::CreateTopWindow(this); - // Add the method OnWxSignal as a Wx::Signal observer + // parent window of all bbtk windows will be a child of this + // Wx::SetTopWindowParent(this); + Wx::SetTopWindow(this); + // Wx::SetAutoDestroyTopWindow(false); + // Add the method OnWxSignal as a Wx::Signal observer //bbtkAddWxSignalObserver(WxGUIPackageBrowser2Window::OnWxSignal); -//.PaneBorder(false)); - m_mgr.Update(); + //.PaneBorder(false)); + // Load the interface appearance saved on last closing + LoadPerspective(); + + // Done in LoadPerspective + // m_mgr.Update(); SetAutoLayout(true); Layout(); - mwxNotebook->SetSelection(1); + // mwxNotebook->SetSelection(1); mWxGUIHtmlBrowser->GoHome(); // Refresh(); -// m_mgr.Update(); + m_mgr.Update(); + // LoadPerspective(); + + mBreaked = false; + + wxBitmap bitmap; + wxSplashScreen* splash; + long style = wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_TIMEOUT; + if (ConfigurationFile::GetInstance().DotBbtkIsNew()) + style = wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_NO_TIMEOUT; + std::string splash_file = ConfigurationFile::GetInstance().Get_data_path(); + splash_file += "/kernel/icons/bbStudioSplashScreen.png"; + + if (bitmap.LoadFile(std2wx(splash_file),wxBITMAP_TYPE_PNG)) + splash = + new wxSplashScreen(bitmap, + style, + 1000, 0, -1, wxDefaultPosition, wxDefaultSize, + wxSIMPLE_BORDER|wxSTAY_ON_TOP); + + if (ConfigurationFile::GetInstance().DotBbtkIsNew()) + { + + DoRegeneratePackageDoc("-a"); + DoRegenerateBoxesLists(); + + /* + wxTipWindow* tip = new wxTipWindow(this, + _T("\n Welcome to bbStudio !\n\n To run a demo or example:\n 1. click on the 'Demos' or 'Examples' link\n 2. select a demo or example\n 3. click on the '[source]' link : the source file is loaded in bbStudio\n 4. click on the 'Run' button (the arrow at the bottom right of the source file) \n"),1000); + tip->CenterOnParent(); + tip->Show(); + */ + if (splash) splash->Destroy(); + } + } //================================================================ //================================================================ WxGUIScriptingInterface::~WxGUIScriptingInterface() { + bbtkDebugMessage("widget",9,"bbStudio::~bbStudio()"<Close(); + } + this->Destroy(); + } + //================================================================ + + //================================================================ void WxGUIScriptingInterface::Open(const std::string& filename) { mWxGUITextEditor->Open(filename); } //================================================================ - -#define CATCH_MACRO \ - catch (QuitException e) \ + /* + catch (BreakException e) \ { \ - std::cout << "* quit exception caught"< 0) { \ - std::cerr << "* Exception thrown : "< 0) { \ + std::cerr << "* Exception thrown : "<GetCurrentPage()->SaveFile(filename); + + std::string command = "\""; + +#ifdef WIN32 + command += "\""; +#endif + + command += ConfigurationFile::GetInstance().Get_bin_path(); +#ifdef MACOSX + command += separator + "bbi.app/Contents/MacOS/bbi\" "; +#else + command += separator + "bbi\" "; +#endif + command += "\""+filename + "\""; + +#ifdef WIN32 + command += "\""; +#endif + + command += " & "; + + printf ("EED WxGUIScriptingInterface::WxGUITextEditorRunBBI %s \n" , command.c_str() ); + system( command.c_str() ); + } + //================================================================ + + //================================================================ void WxGUIScriptingInterface::WxGUITextEditorRun() { @@ -302,9 +483,16 @@ namespace bbtk (*buf) << mWxGUITextEditor->GetCurrentPage()->GetText(); try { - // std::cout << "RUN"<IsChecked()) WxGUICommandEnter("reset"); - mInterpreter->InterpretBuffer(buf); + if (!mBreaked) + { + if (mwxMenuItemReset->IsChecked()) WxGUICommandEnter("reset"); + mInterpreter->InterpretBuffer(buf); + } + else + { + mBreaked = false; + mInterpreter->InterpretCurrentStreams(); + } // std::cout << "EO RUN"<IncludeAll(); - mwxNotebook->AddPage(browser,_T("Package Browser"),true); + wxBusyCursor wait; + WxGUIPackageBrowser2Window *helpbrowser = new + WxGUIPackageBrowser2Window(this,_T("Package Browser"), wxSize(600,600) ); + helpbrowser->Show(); + + /* + wxBusyCursor wait; + WxGUIPackageBrowser2 *browser = new WxGUIPackageBrowser2(this); + browser->IncludeAll(); + */ +#if NOTEBOOK + // mwxNotebook->AddPage(browser,_T("Package Browser"),true); +#else + /* + m_mgr.AddPane(browser, + wxAuiPaneInfo().Name(wxT("package_brower")) + .Caption(wxT("Package browser")) + .MinimizeButton(true) + .MaximizeButton(true) + .Bottom() + .Position(1) + .MinSize(wxSize(100,100)) + ); + */ +#endif } //================================================================ @@ -364,13 +569,18 @@ namespace bbtk //================================================================ void WxGUIScriptingInterface::OnMenuCreatePackage(wxCommandEvent& WXUNUSED(event)) { - +/* std::string command("toolsbbtk/appli/GUICreatePackage"); bbtkMessage("Debug",1,"Executing : '"<InterpretFile(command); - +*/ + std::string command("reset"); + mWxGUICommand->SendCommand(command); + command = "include toolsbbtk/appli/GUICreatePackage"; + bbtkMessage("Debug",1,"Executing : '"<SendCommand(command); } //================================================================ @@ -378,50 +588,224 @@ namespace bbtk //================================================================ void WxGUIScriptingInterface::OnMenuCreateBlackBox(wxCommandEvent& WXUNUSED(event)) { + /* std::string command("toolsbbtk/appli/GUICreateBlackBox"); bbtkMessage("Debug",1,"Executing : '"<InterpretFile(command); +*/ + std::string command("reset"); + mWxGUICommand->SendCommand(command); + command = "include toolsbbtk/appli/GUICreateBlackBox"; + bbtkMessage("Debug",1,"Executing : '"<SendCommand(command); } //================================================================ //================================================================ void WxGUIScriptingInterface::OnMenuShowImageGraph(wxCommandEvent& WXUNUSED(event)) { - std::string default_temp_dir = ConfigurationFile::GetInstance().Get_default_temp_dir(); + std::string doc_path = bbtk::ConfigurationFile::GetInstance().Get_doc_path(); + doc_path += bbtk::ConfigurationFile::GetInstance().Get_file_separator(); + doc_path += "bbdoc"; + doc_path += bbtk::ConfigurationFile::GetInstance().Get_file_separator(); + + std::string pack_name("User"); + std::string pack_path = doc_path + pack_name; + #if defined(WIN32) std::string strappli="start "; #else - std::string strappli="gnome-open "; -#endif - std::string strcommand = strappli +default_temp_dir+"/temp_dir/workspace_workspacePrototype.png"; + #if defined(MACOSX) + std::string strappli="open "; + #else + std::string strappli="gnome-open "; + #endif +#endif + std::string strcommand = strappli +pack_path+"/workspace_workspacePrototype.png"; // std::cout << "system: " << strcommand << std::endl; system ( strcommand.c_str() ); } //================================================================ + void WxGUIScriptingInterface::DoRegeneratePackageDoc( const std::string& pack ) + { + std::string mess("Regenerating doc for package '"); + if (pack!="-a") + mess += pack + "'"; + else + mess = "Regenerating doc for all packages"; + mess += " ... please wait"; + + SetStatusText( std2wx(mess) ); + + BBTK_BUSY_CURSOR; + + std::string command; +#if defined(WIN32) + command = "\""; +#endif + command += ConfigurationFile::GetInstance().Get_bin_path(); + command += ConfigurationFile::GetInstance().Get_file_separator(); + command += "bbRegeneratePackageDoc"; +#if defined(WIN32) + command += "\""; +#endif + command += " " + pack + " -q"; + bbtkMessage("debug",1,"Executing system command '"<InterpretLine( "exec freeze"); - I->InterpretLine( "include *"); - I->InterpretLine( "index "+doc_path+"/bbdoc/index-alpha.html Initials"); - I->InterpretLine( "index "+doc_path+"/bbdoc/index-package.html Packages"); - I->InterpretLine( "index "+doc_path+"/bbdoc/index-category.html Categories"); - I->InterpretLine( "index "+doc_path+"/bbdoc/index-adaptors.html Adaptors"); - +std::cout << "==========================================================================================================" << command.c_str() << std::endl; + if ( ! system ( command.c_str() ) ) + { + SetStatusText( _T("Done !")); + /* + wxMessageBox(_T("Done !"),_T("Regenerate boxes lists"), + wxOK | wxICON_INFORMATION); + */ + } + else + { + SetStatusText( _T("Done !")); + wxString err(_T("An error occured while running '")); + err += bbtk::std2wx(command) + _T("'"); + wxMessageBox(err,_T("Regenerate boxes lists"),wxOK | wxICON_ERROR); + } + } + //================================================================ + + + //================================================================ + void WxGUIScriptingInterface::OnMenuRegenerateBoxesLists(wxCommandEvent& WXUNUSED(event)) + { + DoRegenerateBoxesLists(); } //================================================================ + //================================================================ + void WxGUIScriptingInterface::OnMenuRegenerateAll(wxCommandEvent& WXUNUSED(event)) + { + + DoRegeneratePackageDoc("-a"); + DoRegenerateBoxesLists(); + } + //================================================================ + + + //================================================================ + /** + * Event Handler for the plug package menu. + * This method prompts the user for the directory where the bbtkPackage file is + * located and associates the related package with the configuration file. + * @param event event not used. + */ + + //DFGO - 8/10/2012 + void WxGUIScriptingInterface::OnMenuPlugPackage(wxCommandEvent& WXUNUSED(event)) + { + long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST; + wxDirDialog* FD = + new wxDirDialog( 0, + _T("Select package directory"), + _T(""), + style); + long userResponse; + do + { + userResponse = FD->ShowModal(); + if(userResponse==wxID_OK) + { + std::string path = wx2std (FD->GetPath()) ; + std::string fname = path + "/bbtkPackage"; + std::cout << "Path chosen = \"" << FD->GetPath() << "\"" << std::endl; + if ( Utilities::FileExists( fname ) ) + { + std::ifstream f; + f.open(fname.c_str()); + std::string pname; + f >> pname; + f.close(); + + bbtk::ConfigurationFile::GetInstance().AddPackagePathsAndWrite( path ); + + DoRegeneratePackageDoc(pname); + DoRegenerateBoxesLists(); + + wxMessageBox(_T("Package successfully plugged"),_T("Plug package"),wxOK | wxICON_INFORMATION); + + userResponse = wxID_CANCEL; + } + else + { + std::string err = "The directory \"" + path + "\" does not contain a 'bbtkPackage' file."; + #ifndef WIN32 + #ifndef MACOSX + err += "\nNote: If you are on Linux please select the folder and click \"Open\", don't enter in it."; + #endif + #endif + + + wxMessageBox(crea::std2wx(err),_T("Plug package"),wxOK | wxICON_ERROR); + } + } + }while(userResponse != wxID_CANCEL); + } + //================================================================ //================================================================ void WxGUIScriptingInterface::InterpreterUserViewHtmlPage(const std::string& page) @@ -440,20 +824,64 @@ namespace bbtk } //================================================================ + /* + //================================================================ + void WxGUIScriptingInterface::InterpreterUserOnBreak() + { + // std::cout << "Break" << std::endl; + + } + //================================================================ + */ + //================================================================ bool WxGUIScriptingInterface::WxGUIHtmlBrowserUserOnLinkClicked(const std::string& target) { size_t s = target.length(); if ((s>3) && (target[s-1]=='s') - && (target[s-2]=='b') - && (target[s-3]=='b') - && (target[s-4]=='.')) - { - mWxGUITextEditor->Open(target); - mwxNotebook->SetSelection(0); - mWxGUITextEditor->SetFocus(); - return false; - } + && (target[s-2]=='b') + && (target[s-3]=='b') + && (target[s-4]=='.')) + { + mWxGUITextEditor->Open(target); + #if NOTEBOOK + mwxNotebook->SetSelection(0); + #endif + mWxGUITextEditor->SetFocus(); + return false; + } + + if ((s>3) && (target[s-1]=='f') + && (target[s-2]=='d') + && (target[s-3]=='p') + && (target[s-4]=='.')) + { + + // Open pdf in linux + // gnome-open target + + // Open pdf in macOS + + // Open pdf in windows + int size=target.size(); + int pos=target.rfind("\\"); + std::string commandStart("start "); + std::string commandPath("/D \""+target.substr(0,pos) +"\""); + std::string commandPDF( target.substr(pos+1,size-pos+1) ); + + printf("EED WxGUIScriptingInterface::WxGUIHtmlBrowserUserOnLinkClicked cc %s \n",commandPath.c_str() ); + // cleanning path + while (commandPath.rfind("\\\\")!=-1 ) + { + commandPath.erase( commandPath.rfind("\\\\") , 1 ); + printf("EED WxGUIScriptingInterface::WxGUIHtmlBrowserUserOnLinkClicked cc %s \n",commandPath.c_str() ); + } + + std::string command = commandStart+commandPath+" "+commandPDF; + printf("EED WxGUIScriptingInterface::WxGUIHtmlBrowserUserOnLinkClicked BB %s \n",command.c_str() ); + system( command.c_str() ); + return false; + } return true; } //================================================================ @@ -471,7 +899,6 @@ namespace bbtk } } - //================================================================ void WxGUIScriptingInterface::OnMenuWindowsFiles(wxCommandEvent& event) { @@ -503,34 +930,97 @@ namespace bbtk //================================================================ void WxGUIScriptingInterface::OnMenuWindowsSave( wxCommandEvent& WXUNUSED(event)) { - // TO DO : Save it into ConfigurationFile - // m_mgr.SavePerspective(); + SavePerspective(); } //================================================================ + //================================================================ + void WxGUIScriptingInterface::SavePerspective() + { + // std::cout << "Saving configuration..."<> conf; + + // int x,y; + // f >> x >> y ; + + int w,h; + f >> w >> h ; + + f.close(); + + // std::cout << conf << std::endl; + + // Move(x,y); + SetSize(w,h); + m_mgr.LoadPerspective(std2wx(conf)); + } + else + { + m_mgr.Update(); + } + } + //================================================================ //================================================================ void WxGUIScriptingInterface::OnPaneClose(wxAuiManagerEvent& evt) { std::cout << "Closing panel '"<name<<"'"<