]> Creatis software - bbtkGEditor.git/blobdiff - lib/EditorGraphicBBS/bbsWxGUIEditorGraphic/wxGEditorTabPanel.cxx
2058 Feature File drag and drop
[bbtkGEditor.git] / lib / EditorGraphicBBS / bbsWxGUIEditorGraphic / wxGEditorTabPanel.cxx
index 0fba89580e3036470a7aaf962e3a5a36cb6f57f1..a941a94c79c9df46ca330810107895c0653a31e8 100644 (file)
@@ -1,4 +1,29 @@
-/*=========================================================================                                                                               
+/*
+# ---------------------------------------------------------------------
+#
+# Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image 
+#                        pour la Santé)
+# Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+#
+#  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$
 Language:  C++
@@ -11,26 +36,26 @@ Version:   $Revision$
 * Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
 * Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
 *
-*  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 
+*  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. 
+*  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.
-* ------------------------------------------------------------------------ */                                                                         
+* ------------------------------------------------------------------------ */
 
 /**
-*  \file 
-*  \brief Class bbtk::wxGEditorTabPanel . 
+*  \file
+*  \brief Class bbtk::wxGEditorTabPanel .
 */
 
 
@@ -39,36 +64,55 @@ Version:   $Revision$
 
 namespace bbtk
 {
+
        //=========================================================================
        wxGEditorTabPanel::wxGEditorTabPanel()
        {
+               printf ("EED %p wxGEditorTabPanel 1 ()\n" , this );
        }
 
        //=========================================================================
-       wxGEditorTabPanel::wxGEditorTabPanel(wxWindow *parent,int id):wxPanel(parent),wxTextDropTarget()
+       wxGEditorTabPanel::wxGEditorTabPanel(wxWindow *parent,int id, Factory::Pointer bbtkfactory)
+        : wxPanel(parent),wxTextDropTarget()
        {
                _id=id;
-               _panelAUIMgr = new wxAuiManager(this);
-               _sceneManager = NULL;
-
+               _panelAUIMgr    = new wxAuiManager(this);
+               _sceneManager   = NULL;
+               _actualdo               = states.begin();
+               _sactualdo              = sstates.begin();
+               _bbtkfactory    = bbtkfactory;
                initWxVtkCanvas();
        }
 
        //=========================================================================
        wxGEditorTabPanel::~wxGEditorTabPanel()
        {
-               _sceneManager->disconnectDrop();
+//ED02JUIN2010         _sceneManager->disconnectDrop();
+
+        _panelsManager->VerifyLastTabPanel();
+               //FCY memory leaks
+               delete _panelAUIMgr;
+               delete _sceneManager;
        }
-       
+
        //=========================================================================
        void wxGEditorTabPanel::initWxVtkCanvas()
        {
                wxVtk3DBaseView *baseview = new wxVtk3DBaseView(this);
                baseview->Configure();
+//EED 07 juin 2013
+               baseview->GetCamera()->SetViewUp (0, 1, 0);
+               baseview->GetCamera()->SetPosition (0, 0, 1);
+               baseview->GetCamera()->SetFocalPoint (0, 0, 0);
 
-               _sceneManager=new wxVtkSceneManager(this,baseview,_id);
+//EED 15 oct 2012              _sceneManager=new wxVtkSceneManager(this,baseview,_id);
+               _sceneManager=new wxVtkSceneManager(this,baseview,_id, _bbtkfactory);
 
+
+//EED02JUIN2010
+               printf("RaC-EED 21-06-2010 wxGEditorTabPanel::initWxVtkCanvas Remove the panelAUIMgr, and change to a normal sizer inside the wxGEditorTabPanel\n");
                _panelAUIMgr->AddPane((wxWindow*)baseview->GetWxVTKRenderWindowInteractor(),wxAuiPaneInfo().Fixed().CenterPane());
+
                _panelAUIMgr->Update();
        }
 
@@ -76,26 +120,112 @@ namespace bbtk
 
        bool wxGEditorTabPanel::OnDropText(wxCoord x, wxCoord y, const wxString& data)
        {
-               std::string packageName="";
-               std::string boxName="";
 
-               wxString foo( (data) );
-               char str[150];
-               strcpy( str, (const char*)foo.mb_str(wxConvUTF8) );
-
-               char delims[] = ":";
-                char *result = NULL;
-                result = strtok( str, delims );
-                packageName += result;
-                
-                result = strtok( NULL, delims );
-                boxName += result;
-                
-               _sceneManager->createGBlackBox(x,y,packageName, boxName);
+         /*
+          * DFGO
+          * To handle bbs and bbg:
+          * handle data parameter to detect if incoming string is file or bbs or
+          * bbg or blackbox.
+          *
+          * For a drag and drop tutorial read:
+          * http://zetcode.com/gui/wxwidgets/dragdrop/
+          */
+
+          //wxMessageBox(data);
+
+         std::string stdData = crea::wx2std(data);
+
+         //std::cout << "Text drop: '" << stdData << "'" << std::endl;
+
+         if(stdData.substr(0,4) == "box:")
+           {
+             int posT = stdData.find_first_of(':', 4);
+             std::string packageName = stdData.substr(4, posT-4);
+             posT = stdData.find_first_not_of(':', posT);
+             std::string boxType = stdData.substr(posT);
+
+             //std::cout << "box: Package='" << packageName << "' BoxType='" << boxType << "'" <<std::endl;
+             /*
+                    wxString foo( (data) );
+                    char str[150];
+                    strcpy( str, (const char*)foo.mb_str(wxConvUTF8) );
+
+                    char delims[] = ":";
+                     char *result = NULL;
+                     result = strtok( str, delims );
+                     packageName += result;
+
+                     result = strtok( NULL, delims );
+                     boxType += result;
+              */
+             if ( _panelsManager->TryToOpenScriptApplication(packageName,boxType) == false )
+               {
+                 _sceneManager->createGBlackBox(x,y,packageName, boxType);
+                 saveTempandUpdate("drop box");
+               }
+           }
+         // DFGO: file for linux
+         else if(stdData.substr(0,5) == "file:")
+           {
+             stdData=stdData.substr(0,stdData.size()-1);
+             std::cout << "Dropped file: " << stdData << std::endl;
+             std::stringstream ss(stdData);
+             std::getline(ss, stdData, (char)13);
+             while(!ss.eof())
+               {
+                 std::string filePath = stdData.substr(7);
+                 std::cout << filePath << ": ";
+
+                         FILE *ff=fopen(filePath.c_str(),"r");
+                 if(
+//                               wxFile::Exists( crea::std2wx(filePath)) 
+                                 ff!=NULL
+                                 )
+                   {
+                                 fclose(ff);
+                     std::cout << "File Exists." << std::endl;
+                     wxFileName fileToOpen(crea::std2wx(filePath));
+
+                     std::string filetype = crea::wx2std(fileToOpen.GetExt());
+                      std::string filename = crea::wx2std(fileToOpen.GetFullName());
+                      std::string filepath = crea::wx2std(fileToOpen.GetFullPath());
+
+
+                      if(filetype == "bbs")
+                        {
+                          std::cout << "Importing bbs file." << std::endl;
+                          wxMessageBox(crea::std2wx("You are opening a bbs file, "
+                              "make sure not to overwrite an existing bbg file "
+                              "when saving the pipeline."),
+                              crea::std2wx("Opening File Warning"), wxICON_INFORMATION);
+                          this->_panelsManager->GetParentGUIEditorGraphicBBS()->OpenBBS(filepath, filename);
+                        }
+                      else if(filetype == "bbg")
+                        {
+                          std::cout << "Opening bbg file." << std::endl;
+                          this->_panelsManager->GetParentGUIEditorGraphicBBS()->OpenDiagram(filepath, filename);
+                        }
+                      else
+                        {
+                          std::cout << "Unknown file type: Can't open this kind of file: " << filetype << std::endl;
+                        }
+                   }
+                 else
+                   {
+                     std::cout << "File Doesn't Exists. The given path is invalid: " << filePath << std::endl;
+                   }
+                 std::getline(ss, stdData, (char)13);
+               }
+           }
 
          return true;
        }
 
+       //=========================================================================
+       void wxGEditorTabPanel::saveTempandUpdate(const std::string &action)
+       {
+               _panelsManager->saveTempandUpdate(action);
+       }
        //=========================================================================
 
        void wxGEditorTabPanel::setPanelsManager(wxTabPanelsManager* panelsManager)
@@ -119,23 +249,23 @@ namespace bbtk
 
        //=========================================================================
 
-       std::string wxGEditorTabPanel::getDiagramScript()
+       std::string wxGEditorTabPanel::getDiagramBBS(bool wln)
        {
-               return _sceneManager->getDiagramScript();
+               return _sceneManager->getDiagramBBS(wln);
        }
 
        //=========================================================================
 
-       void wxGEditorTabPanel::editBlackBox(GBlackBoxModel *bbmodel)
+       std::string wxGEditorTabPanel::saveComplexBoxBBS()
        {
-               _panelsManager->editBlackBox(bbmodel);
+               return _sceneManager->saveComplexBoxBBS();
        }
 
        //=========================================================================
-       
-       void wxGEditorTabPanel::editDiagramParameters(wxVtkSceneManager* scene)
+
+       void wxGEditorTabPanel::editBlackBox(GBlackBoxModel *bbmodel)
        {
-               _panelsManager->editDiagramParameters(scene);
+               _panelsManager->editBlackBox(bbmodel);
        }
 
        //=========================================================================
@@ -149,25 +279,309 @@ namespace bbtk
 
        void wxGEditorTabPanel::centerView()
        {
-               _sceneManager->centerView();
+               if(_sceneManager)
+               {
+                       _sceneManager->centerView();
+               }
        }
 
        //=========================================================================
-       
-       void wxGEditorTabPanel::saveDiagram(std::string &content)
+
+       void wxGEditorTabPanel::saveDiagram(std::string &content, const std::string &path) //DFCH
        {
+               this->SetFullPath(path);
                _sceneManager->saveDiagram(content);
        }
 
        //=========================================================================
 
-       void wxGEditorTabPanel::loadDiagram(ifstream &inputStream)
+       void wxGEditorTabPanel::saveTempDiagram(const std::string &action) //FCY
+       {
+               std::string content = "";
+               // writing file header
+               content += "# ----------------------------------\n";
+               content += "# - BBTKGEditor v 1.3 BBG BlackBox Diagram file\n";
+               content += "# - ";
+               content += "temp";
+               content += "\n";
+               content += "# ----------------------------------\n";
+               content += "\n";
+               content += "APP_START\n";
+               _sceneManager->saveDiagram(content);
+               content += "APP_END\n"; //put here to avoid mistakes
+               if(_actualdo == states.end() ) // same size, write to the end
+               {
+                       states.push_back (content);
+                       saveStringAction(action);
+               }
+               else
+               {
+                       std::vector<std::string>::iterator it = _actualdo+1;
+                       states.erase(it, states.end());
+                       states.push_back(content);
+
+                       std::vector<std::string>::iterator sit = _sactualdo+1;
+                       sstates.erase(sit, sstates.end());
+                       saveStringAction(action);
+               }
+               _actualdo = states.end();
+               _sactualdo = sstates.end();
+                       
+       }
+
+       //=========================================================================
+
+       void wxGEditorTabPanel::loadDiagram(ifstream &inputStream, const std::string &path) //DFCH
+       {
+               this->SetFullPath(path);
+               stringstream ss;
+               ss << inputStream.rdbuf() ;
+               _sceneManager->loadDiagram(ss);
+       }
+
+       //=========================================================================
+       unsigned short wxGEditorTabPanel::getUndoState( std::string &stun)
+       {
+               stun = "Undo";
+               if(states.size()>0)
+               {
+                       if(_actualdo == states.begin() )
+                       {
+                               
+                               return 0;
+                       }
+                       else
+                       {
+                               stun +=" - ";
+                               stun += _sactualdo->substr(0,(--_sactualdo)->find_last_of("."));
+                               _sactualdo++;
+                               return 1;
+                       }
+               }
+       }
+
+       unsigned short wxGEditorTabPanel::getRedoState( std::string &stre)
+       {
+               stre = "Redo";
+               if(states.size()>0)
+               {
+                       if(_actualdo == --states.end() || states.size() == 1 || _actualdo == states.end())
+                               return 0;
+                       else
+                       {
+                               stre +=" - ";
+                               stre += _sactualdo->substr(0,(++_sactualdo)->find_last_of("."));
+                               --_sactualdo;
+                               return 1;
+                       }
+               }
+       }
+
+       //=========================================================================
+       void wxGEditorTabPanel::loadTempDiagram(unsigned short un) //FCY
+       {
+               unsigned short res = 1;
+               deleteAllBoxes();
+               std::stringstream ss;
+               if (un == 0) //undo
+               {
+                       if(_actualdo == states.end() ) // same size, write to the end
+                       {
+                               (_actualdo--);
+                               (_sactualdo--);
+                       }
+                       if(_actualdo != states.begin() )
+                       {
+                               ss << *(--_actualdo);
+                               _sactualdo--;
+                       }
+                       else
+                       {
+                               ss << *_actualdo;
+                               res = 0;
+                       }
+               }
+               else //redo
+               {
+                       _actualdo++;
+                       _sactualdo++;
+                       if(_actualdo != states.end())
+                       {
+                               ss << *_actualdo;
+                       }
+                       else
+                       {
+                               res = 0;
+                       }
+               }
+               _sceneManager->loadDiagram(ss);
+       
+       }
+
+       void wxGEditorTabPanel::saveStringAction(const std::string &action)
+       {
+               char temp[50];
+               sprintf(temp,".%d", sstates.size());
+               sstates.push_back(action + temp);
+       }
+
+       //=========================================================================
+
+       int wxGEditorTabPanel::getPanelId()
+       {
+               return _id;
+       }
+       
+
+
+       //=========================================================================
+
+       bool wxGEditorTabPanel::isComplexBox()
        {
-               _sceneManager->loadDiagram(inputStream);
+               return _sceneManager->isComplexBox();
        }
 
        //=========================================================================
 
+       void wxGEditorTabPanel::setComplexBox(bool val)
+       {
+               _sceneManager->setComplexBox(val);
+       }
+
+       //=========================================================================
+
+       void wxGEditorTabPanel::addComplexInputPort(std::string portName)
+       {
+               _sceneManager->createGComplexBoxInputPort(portName);
+       }
+
+       //=========================================================================
+
+       void wxGEditorTabPanel::addComplexOutputPort(std::string portName)
+       {
+               _sceneManager->createGComplexBoxOutputPort(portName);
+       }
+
+       //=========================================================================
+
+       std::map<int,GObjectController*> wxGEditorTabPanel::getSelectedObjects()
+       {
+               return _sceneManager->getSelectedObjects();
+       }
+
+       //=========================================================================
+
+       void wxGEditorTabPanel::addObjects(std::map<int,GObjectController*> objectsMap)
+       {
+               _sceneManager->addObjects(objectsMap);
+       }
+
+       //=========================================================================
+
+       int wxGEditorTabPanel::getNumSelectedObjects()
+       {
+               return _sceneManager->getNumSelectedObjects();
+       }
+
+       //=========================================================================
+
+
+       wxVtkSceneManager* wxGEditorTabPanel::getSceneManager()
+       {
+               return _sceneManager;
+       }
+
+       //=========================================================================
+    std::string wxGEditorTabPanel::GetCbName()
+       {
+           return _sceneManager->GetCbName();
+       }
+
+
+       //=========================================================================
+    std::string wxGEditorTabPanel::GetCbPackageName()
+       {
+           return _sceneManager->GetCbPackageName();
+       }
+
+       //=========================================================================
+    std::string wxGEditorTabPanel::GetAuthor()
+       {
+           return _sceneManager->GetAuthor();
+       }
+
+       //=========================================================================
+    std::string wxGEditorTabPanel::GetDescription()
+       {
+           return _sceneManager->GetDescription();
+       }
+
+       //=========================================================================
+    std::string wxGEditorTabPanel::GetCategory()
+       {
+           return _sceneManager->GetCategory();
+       }
+
+       //=========================================================================
+    void wxGEditorTabPanel::SetCbName(std::string cbName)
+    {
+        _sceneManager->SetCbName( cbName );
+    }
+
+       //=========================================================================
+    void wxGEditorTabPanel::SetCbPackageName(std::string packagename)
+    {
+        _sceneManager->SetCbPackageName( packagename );
+    }
+
+
+       //=========================================================================
+    void wxGEditorTabPanel::SetAuthor(std::string author)
+    {
+        _sceneManager->SetAuthor( author );
+    }
+
+
+       //=========================================================================
+    void wxGEditorTabPanel::SetCategory(std::string category)
+    {
+        _sceneManager->SetCategory( category );
+    }
+
+
+       //=========================================================================
+    void wxGEditorTabPanel::SetDescription(std::string description)
+    {
+        _sceneManager->SetDescription( description );
+    }
+    //=========================================================================
+       //DFCH
+       void wxGEditorTabPanel::SetFullPath( const std::string& fullpath )
+       {
+               this->_fullPath = fullpath;
+       }
+       //=========================================================================
+       //DFCH
+       void wxGEditorTabPanel::SetFileName( const std::string& filename )
+       {
+               this->_fileName = filename;
+       }
+       //=========================================================================
+       //DFCH
+       std::string wxGEditorTabPanel::GetFullPath( )
+       {
+               return( this->_fullPath );
+       }
+       //=========================================================================
+       //DFCH
+    std::string wxGEditorTabPanel::GetFileName( )
+    {
+               return( this->_fileName );
+       }
+
+
+
+
 }  // EO namespace bbtk
 
 // EOF