]> Creatis software - bbtk.git/blobdiff - kernel/appli/bbfy/bbfy.cpp
Feature #1774
[bbtk.git] / kernel / appli / bbfy / bbfy.cpp
index d5a62730e520254bd47e9f397fb8dd9ab0c813f9..43f89023c53ed59c3d9f223eed78d26fe0347a03 100644 (file)
@@ -1,9 +1,35 @@
+/*
+# ---------------------------------------------------------------------
+#
+# 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.
+# ------------------------------------------------------------------------ */
+
 #ifdef WIN32
 #define _CRT_SECURE_NO_DEPRECATE
 #endif
 
 #include <stdio.h>
-#include "xmlParser.h"
+#include "bbtkXML.h"
 #include <iostream>
 #include <fstream>
 #include <sstream>
@@ -19,11 +45,17 @@ public:
 };
 //==========================================================================
 
+const std::string itkImageToImageFilterString = "ITK_ImageToImageFilter";
+const std::string vtkImageAlgorithmString     = "VTK_ImageAlgorithm";
+const std::string vtkPolyDataAlgorithmString  = "VTK_PolyDataAlgorithm";
+
 //==========================================================================
 class bbfy
 {
 public:
-  bbfy(const std::string& filename, const std::string& output_path = "",
+  bbfy(const std::string& filename, 
+       const std::string& package = "PACKAGE_NAME",
+       const std::string& output_path = "",
        bool verbose = false);
   
   void CreateBlackBox();
@@ -52,15 +84,18 @@ private:
       vtkPolyDataAlgorithm,
     }
     BoxType;
+
   BoxType mType;
+  bool mIsWidget;
   std::string mParentBlackBox;
   std::string mItkParent;
-  std::string mVtkParent;
+  std::string mVtkObject;
   bool mGeneric;
   std::string mAuthor;
   std::string mDescription;
+  std::string mCategory;
   std::string mPackage;
-  bool mIsInNamespace;
+  // bool mIsInNamespace;
   std::string mNamespace;
   // int mNbTemplateParam;
   std::vector<std::string> mTemplateParam;
@@ -68,16 +103,18 @@ private:
   std::string mTemplateImplementation;
 
   std::vector<std::string> mInclude;
+  std::vector<std::string> mTypedef;
 
-  std::string mUserConstructor;
-  std::string mUserCopyConstructor;
-  std::string mUserDestructor;
+  std::string mUserSetDefaultValues;
+  std::string mUserInitializeProcessing;
+  std::string mUserFinalizeProcessing;
 
   typedef struct
   {
     std::string name;
     std::string type;
-    std::string help;
+    std::string nature;
+    std::string descr;
     std::string special;
     std::string generic_type;
   }
@@ -87,12 +124,15 @@ private:
   std::vector<IO> mOutput;
 
   std::string mProcess;
+  std::string mCreateWidget;
 
   //
   std::ofstream mFile;
   std::string mHName;
   std::string mCxxName;
 
+  void AlertString();
+
 };
 //==========================================================================
 
@@ -100,10 +140,16 @@ private:
 
 //==========================================================================
 bbfy::bbfy(const std::string& filename, 
+          const std::string& package,
           const std::string& output_path,
           bool verbose)
 {
+  mIsWidget = false;
+  
   mFilename = filename;
+  mPackage = package;
+  mNamespace = "bb" + mPackage;
+
   mOutputPath = output_path;
   mVerbose = verbose;
 
@@ -122,32 +168,22 @@ void bbfy::CreateBlackBox()
 }
 //==========================================================================
 
-
-//==========================================================================
-void GetTextOrClear(const XMLNode& node, std::string& var) 
+void bbfy::AlertString()
 {
-  if (node.nText()>0) 
-    {
-      var = node.getText();
-    }
-  else if (node.nClear()>0) 
-    {
-      var = node.getClear().lpszValue;
-    }
-  else 
-    {
-      std::string mess("Error : element <");
-      mess += node.getName();
-      mess += "> : no text nor <PRE></PRE> clear tag found";
-      throw bbfyException(mess);
-    }
+       
+      mFile << "//===== \n";
+      mFile << "// Before editing this file, make sure it's a file of your own ";
+      mFile << "(i.e.: it wasn't generated from xml description; if so : your modifications will be lost)\n";
+      mFile << "//===== \n";
+         
 }
-//==========================================================================
-
 
 //==========================================================================
 void bbfy::ParseXML()
 {
+
+
+
   XMLResults* res = new XMLResults;
   XMLNode BB = XMLNode::parseFile(mFilename.c_str(),"blackbox",res);
 
@@ -164,7 +200,7 @@ void bbfy::ParseXML()
   // Name
   if (!BB.isAttributeSet("name")) 
     {
-      throw bbfyException("Error : no 'name' attribute found (mandatory)");
+      throw bbfyException("Error : <blackbox> tag : no 'name' attribute found (mandatory)");
     }
   mName = BB.getAttribute("name");
 
@@ -173,6 +209,8 @@ void bbfy::ParseXML()
   // Type 
   mGeneric = false;
   mType = STD;
+
+
   if (BB.isAttributeSet("type")) 
     {
       std::string bbtype = BB.getAttribute("type");
@@ -181,59 +219,77 @@ void bbfy::ParseXML()
          mGeneric = false;
          mType = STD;
        }
-      else if (bbtype=="itkImageToImageFilter")
+      else if (bbtype==itkImageToImageFilterString)
        {
          mType = itkImageToImageFilter;
          // Looks for <itkparent> tag
          if (!BB.nChildNode("itkparent")) 
            {
-             throw bbfyException("Error : blackbox type 'itkImageToImageFilter' but no <itkparent> tag found (mandatory)");
+             throw bbfyException("Error : blackbox type '"+itkImageToImageFilterString+"' but no <itkparent> tag found (mandatory)");
            }
-         GetTextOrClear(BB.getChildNode("itkparent"),mItkParent);
+         bbtk::GetTextOrClear(BB.getChildNode("itkparent"),mItkParent);
          // 
          mGeneric = false;
          if (BB.isAttributeSet("generic")) mGeneric=true;
        }
-      else if ((bbtype=="vtkImageAlgorithm") || (bbtype=="vtkPolyDataAlgorithm"))
+      else if (bbtype == vtkImageAlgorithmString)
        {
          mType = vtkImageAlgorithm;
-         // Looks for <vtkparent> tag
-         if (!BB.nChildNode("vtkparent")) 
+         // Looks for <vtkobject> tag
+         if (!BB.nChildNode("vtkobject")) 
            {
-             throw bbfyException("Error : blackbox type 'vtkImageAlgorithm' but no <vtkparent> tag found (mandatory)");
+             throw bbfyException("Error : blackbox type '"
+                                 +vtkImageAlgorithmString
+                                 +"' but no <vtkobject> tag found (mandatory)");
            }
-         GetTextOrClear(BB.getChildNode("vtkparent"),mVtkParent);
+         bbtk::GetTextOrClear(BB.getChildNode("vtkobject"),mVtkObject);
          // 
        }
-      else 
+    else if (bbtype == vtkPolyDataAlgorithmString )
+       {
+         mType = vtkPolyDataAlgorithm;
+         // Looks for <vtkobject> tag
+         if (!BB.nChildNode("vtkobject")) 
+           {
+             throw bbfyException("Error : blackbox type '"
+                                 +vtkPolyDataAlgorithmString
+                                 +"' but no <vtkobject> tag found (mandatory)");
+           }
+         bbtk::GetTextOrClear(BB.getChildNode("vtkobject"),mVtkObject);
+         // 
+       }
+     else 
        {
          std::string mess("Error : blackbox type '");
          mess += bbtype;
-         mess += "' unknown (types are 'standard','itkfilter')";
+         mess += "' unknown. Known types :";
+         mess += "'" + itkImageToImageFilterString + "' ";
+         mess += "'" + vtkImageAlgorithmString + "' ";
+         mess += "'" + vtkPolyDataAlgorithmString + "' ";
          throw bbfyException(mess);
        }
     }
 
-  // Parent black box
-  if (!BB.nChildNode("parentblackbox")) 
+  // Is a widget box ?
+  if (BB.isAttributeSet("widget")) 
     {
-      throw bbfyException("Error : no <parentblackbox> tag found (mandatory)");
-   }
-  GetTextOrClear(BB.getChildNode("parentblackbox"),mParentBlackBox);
-
-  // Package
-  if (!BB.nChildNode("package")) 
+      mIsWidget = true;
+      mParentBlackBox = "bbtk::WxBlackBox";
+      mInclude.push_back("bbtkWxBlackBox.h");
+    }
+  else 
     {
-      throw bbfyException("Error : no <package> tag found (mandatory)");
-   }
-  GetTextOrClear(BB.getChildNode("package"),mPackage);
+      mIsWidget = false;
+      mParentBlackBox = "bbtk::AtomicBlackBox";
+      mInclude.push_back("bbtkAtomicBlackBox.h");
+    }
 
   // Author
   int i,j;
   for (i=0,j=0; i<BB.nChildNode("author"); i++) 
     {
       std::string val;
-      GetTextOrClear(BB.getChildNode("author",&j),val);
+      bbtk::GetTextOrClear(BB.getChildNode("author",&j),val);
       mAuthor += val;
     }
 
@@ -241,35 +297,48 @@ void bbfy::ParseXML()
   for (i=0,j=0; i<BB.nChildNode("description"); i++) 
     {
       std::string val;
-      GetTextOrClear(BB.getChildNode("description",&j),val);
+      bbtk::GetTextOrClear(BB.getChildNode("description",&j),val);
       mDescription += val;
     }
   
+  // Category
+  for (i=0,j=0; i<BB.nChildNode("category"); i++) 
+    {
+      std::string val;
+      bbtk::GetTextOrClear(BB.getChildNode("category",&j),val);
+      mCategory += val;
+    }
+
   // Namespace
-  mIsInNamespace = false;
   if (BB.nChildNode("namespace"))
     {
-      mIsInNamespace = true;
-      GetTextOrClear(BB.getChildNode("namespace"),mNamespace);
+      bbtk::GetTextOrClear(BB.getChildNode("namespace"),mNamespace);
     }
-  // UserConstructor body
-  if (BB.nChildNode("constructor"))
+
+  // UserSetDefaultValues body
+  if (BB.nChildNode("defaultValues"))
     {
-      GetTextOrClear(BB.getChildNode("constructor"),mUserConstructor);
+      bbtk::GetTextOrClear(BB.getChildNode("defaultValues"),
+                          mUserSetDefaultValues);
     }
-  // UserCopyConstructor body
-  if (BB.nChildNode("copyconstructor"))
+    
+  // UserInitializeProcessing body
+  if (BB.nChildNode("initializeProcessing"))
     {
-      GetTextOrClear(BB.getChildNode("copyconstructor"),mUserCopyConstructor);
+      bbtk::GetTextOrClear(BB.getChildNode("initializeProcessing"),
+                          mUserInitializeProcessing);
     }
-  // UserDestructor body
-  if (BB.nChildNode("destructor"))
+    
+ // UserFinalizeProcessing body
+  if (BB.nChildNode("finalizeProcessing"))
     {
-      GetTextOrClear(BB.getChildNode("destructor"),mUserDestructor);
+      bbtk::GetTextOrClear(BB.getChildNode("finalizeProcessing"),
+                          mUserFinalizeProcessing);
     }
-    // Template parameters
+
+
+
+     // Template parameters
   //  mNbTemplateParam = BB.nChildNode("template");
 
   if ( BB.nChildNode("template") > 0)
@@ -281,7 +350,7 @@ void bbfy::ParseXML()
        {
          mTemplateDeclaration += "class ";
          std::string val;
-         GetTextOrClear(BB.getChildNode("template",&j),val);
+         bbtk::GetTextOrClear(BB.getChildNode("template",&j),val);
          mTemplateDeclaration += val;
          mTemplateDeclaration +=  ",";
          mTemplateImplementation += val;
@@ -290,7 +359,7 @@ void bbfy::ParseXML()
        }
       mTemplateDeclaration += "class ";
       std::string val;
-      GetTextOrClear(BB.getChildNode("template",&j),val);
+      bbtk::GetTextOrClear(BB.getChildNode("template",&j),val);
       mTemplateDeclaration += val;
       mTemplateDeclaration +=  ">";
       mTemplateImplementation += val;
@@ -302,33 +371,48 @@ void bbfy::ParseXML()
   for (i=0,j=0; i<BB.nChildNode("include"); i++) 
     {
       std::string val;
-      GetTextOrClear(BB.getChildNode("include",&j),val);
+      bbtk::GetTextOrClear(BB.getChildNode("include",&j),val);
       mInclude.push_back(val);
     }
+  // Typedef
+  for (i=0,j=0; i<BB.nChildNode("typedef"); i++) 
+    {
+      std::string val;
+      bbtk::GetTextOrClear(BB.getChildNode("typedef",&j),val);
+      mTypedef.push_back(val);
+    }
   
   // Inputs
   for (i=0,j=0; i<BB.nChildNode("input"); i++) 
     {
+      IO io;
       XMLNode n = BB.getChildNode("input",&j); 
       if (!n.isAttributeSet("name"))
        {
          throw bbfyException("Error : <input> attribute 'name' not found (mandatory)");
        }
+      io.name = n.getAttribute("name");
       if (!n.isAttributeSet("type"))
        {
-         throw bbfyException("Error : <input> attribute 'type' not found (mandatory)");
+         throw bbfyException("Error : <input name=\""+io.name+"\"> attribute 'type' not found (mandatory)");
        }
-
-      IO io;
-      io.name = n.getAttribute("name");
       io.type = n.getAttribute("type"); 
-      GetTextOrClear(n,io.help);
+      if (!n.isAttributeSet("description"))
+       {
+         throw bbfyException("Error : <input name=\""+io.name+"\"> attribute 'description' not found (mandatory)");
+       }
+      io.descr = n.getAttribute("description"); 
 
       if (n.isAttributeSet("special")) 
        {
          io.special =  n.getAttribute("special");  
        }
 
+      if (n.isAttributeSet("nature")) 
+       {
+         io.nature =  n.getAttribute("nature");  
+       }
+
       if (n.isAttributeSet("generic_type")) 
        {
          io.generic_type =  n.getAttribute("generic_type");  
@@ -340,26 +424,34 @@ void bbfy::ParseXML()
   // Outputs
   for (i=0,j=0; i<BB.nChildNode("output"); i++) 
     {
+      IO io;
       XMLNode n = BB.getChildNode("output",&j); 
       if (!n.isAttributeSet("name"))
        {
          throw bbfyException("Error : <output> attribute 'name' not found (mandatory)");
        }
+      io.name = n.getAttribute("name"); 
       if (!n.isAttributeSet("type"))
        {
-         throw bbfyException("Error : <output> attribute 'type' not found (mandatory)");
+         throw bbfyException("Error : <output name=\""+io.name+"\"> attribute 'type' not found (mandatory)");
        }
-
-      IO io;
-      io.name = n.getAttribute("name"); 
       io.type = n.getAttribute("type"); 
-      GetTextOrClear(n,io.help);
+      if (!n.isAttributeSet("description"))
+       {
+         throw bbfyException("Error : <output name=\""+io.name+"\"> attribute 'description' not found (mandatory)");
+       }
+      io.descr = n.getAttribute("description"); 
 
       if (n.isAttributeSet("special")) 
        {
          io.special =  n.getAttribute("special");  
        }
 
+      if (n.isAttributeSet("nature")) 
+       {
+         io.nature =  n.getAttribute("nature");  
+       }
+
       if (n.isAttributeSet("generic_type")) 
        {
          io.generic_type =  n.getAttribute("generic_type");  
@@ -370,11 +462,42 @@ void bbfy::ParseXML()
 
 
   // Process
-  // Process tag given ?
+  // process tag given ?
    if (BB.nChildNode("process"))
      {
-       GetTextOrClear(BB.getChildNode("process"),mProcess);
+                bbtk::GetTextOrClear(BB.getChildNode("process"),mProcess);
      }
+     
+  // CreateWidget
+  // createwidget tag given ?
+   if (BB.nChildNode("createwidget"))
+     {
+       bbtk::GetTextOrClear(BB.getChildNode("createwidget"),mCreateWidget);
+     }
+
+
+
+
+
+
+
+   // OBSOLETE/UNSUPPORTED TAGS
+  // WARN IF OBSOLETE TAGS PROVIDED
+  if (BB.nChildNode("constructor"))
+    {
+      std::cout << "WARNING !!! The tag <constructor> is obsolete !!"<<std::endl;
+    }
+  if (BB.nChildNode("destructor"))
+    {
+      std::cout << "WARNING !!! The tag <destructor> is obsolete !!"<<std::endl;
+    }
+  if (BB.nChildNode("copy_constructor"))
+    {
+      std::cout << "WARNING !!! The tag <copy_constructor> is obsolete !!"<<std::endl;
+    }
+
+
+
 }
 //==========================================================================
 
@@ -382,20 +505,20 @@ void bbfy::ParseXML()
 //==========================================================================
 void bbfy::BeginNamespace()
 {
-  if (mIsInNamespace)
-    {
-      mFile << "namespace "<<mNamespace <<"\n{\n\n";
-    }
+  //  if (mIsInNamespace)
+  // {
+  mFile << "namespace "<<mNamespace <<"\n{\n\n";
+  //  }
 }
 //==========================================================================
 
 //==========================================================================
 void bbfy::EndNamespace()
 {
-  if (mIsInNamespace)
-    {
-      mFile << "}\n// EO namespace "<<mNamespace<<"\n\n";
-    }
+  // if (mIsInNamespace)
+  //  {
+  mFile << "}\n// EO namespace "<<mNamespace<<"\n\n";
+  //  }
 }
 //==========================================================================
 
@@ -417,10 +540,23 @@ void bbfy::CreateHeader()
       mess += fullname + "\"";
       throw bbfyException(mess);
     }
-  
+
+       AlertString();
+
+  // If is widget 
+  if (mIsWidget)
+    {
+      mFile << "#ifdef _USE_WXWIDGETS_\n";
+    }
+
+  // Prevent multiple inclusions
+  std::string included("__bb");
+  included += mPackage + mName + "_h_INCLUDED__";
+  mFile << "#ifndef " << included <<"\n";
+  mFile << "#define " << included <<"\n";
 
   // Includes 
-  mFile << "#include \"bbtkUserBlackBox.h\"\n";
+  mFile << "#include \"bb" << mPackage << "_EXPORT.h\"\n";
   std::vector<std::string>::iterator i;
   for (i=mInclude.begin(); i!=mInclude.end(); ++i) 
     {
@@ -429,6 +565,15 @@ void bbfy::CreateHeader()
   if (mGeneric) mFile << "#include \"bbitkImage.h\"\n";
   mFile << "\n";
 
+  if (mType == itkImageToImageFilter )
+    {
+      mFile << "#include \"bbtkItkBlackBoxMacros.h\"\n";
+    }
+  else if ( (mType == vtkImageAlgorithm) ||
+           (mType == vtkPolyDataAlgorithm) )
+    {
+      mFile << "#include \"bbtkVtkBlackBoxMacros.h\"\n";
+    }
   // Namespace
   BeginNamespace();
 
@@ -441,9 +586,8 @@ void bbfy::CreateHeader()
     }
   
   // Class declaration and parents
-  mFile << "class /*BBTK_EXPORT*/ "<<mName<<"\n";
+  mFile << "class bb"<<mPackage<<"_EXPORT "<<mName<<"\n";
   mFile << " : \n";
-  mFile << "   public "<<mParentBlackBox;
 
   /*
   if (mBB.nChildNode("inherits"))
@@ -463,51 +607,50 @@ void bbfy::CreateHeader()
 
   if (mType == itkImageToImageFilter )
     {
-      mFile << ",\n   public " << mItkParent <<"\n";
-    }
-  else if ( (mType == vtkImageAlgorithm) ||
-           (mType == vtkPolyDataAlgorithm) )
-    {
-      mFile << ",\n   public " << mVtkParent <<"\n";
-    }
-  else 
-    {
-      mFile << "\n";
+      mFile << "   public " << mItkParent <<",\n";
     }
 
+  mFile << "   public "<<mParentBlackBox << "\n";
+
   mFile << "{\n";
 
   // Interface
-  mFile << "  BBTK_USER_BLACK_BOX_INTERFACE("
-       << mName << ","
-       << mParentBlackBox << ");\n";
 
-  // typedef on itkfilter
+  // ITK 
   if (mType == itkImageToImageFilter)
     {
-      mFile << "  typedef " <<mItkParent <<" itkParent;"<<std::endl;
-      mFile << "  void bbDelete() { itkParent::UnRegister(); }"<<std::endl;
+      mFile << "  BBTK_ITK_BLACK_BOX_INTERFACE("
+           << mName << ","
+           << mParentBlackBox << ","
+           << mItkParent 
+           << ");\n";
     }
-  // typedef on itkfilter
-  if ( (mType == vtkImageAlgorithm) ||
+  // VTK
+  else if ( (mType == vtkImageAlgorithm) ||
        (mType == vtkPolyDataAlgorithm) )
     {
-      mFile << "  typedef " <<mVtkParent <<" vtkParent;"<<std::endl;
-      mFile << "  void bbDelete() { vtkParent::Delete(); }"<<std::endl;
+      mFile << "  BBTK_VTK_BLACK_BOX_INTERFACE("
+           << mName << ","
+           << mParentBlackBox << ","
+           << mVtkObject
+           << ");\n";
+    }
+       
+  // Default
+  else 
+    {
+      mFile << "  BBTK_BLACK_BOX_INTERFACE("
+           << mName << ","
+           << mParentBlackBox << ");\n";
     }
 
-  // Declare user constructor / copy cons /destr 
-  mFile << "//=================================================================="<<std::endl;
-  mFile << "/// User callback called in the box contructor"<<std::endl;
-
-  mFile << "virtual void bbUserConstructor();"<<std::endl;
-  mFile << "/// User callback called in the box copy constructor"<<std::endl;
-  mFile << "virtual void bbUserCopyConstructor();"<<std::endl;
-  mFile << "/// User callback called in the box destructor"<<std::endl;
-  mFile << "virtual void bbUserDestructor();"<<std::endl;
-  mFile << "//=================================================================="<<std::endl; 
+  for (i=mTypedef.begin(); i!=mTypedef.end(); ++i) 
+    {
+      mFile << *i <<"\n";
+    }
 
 
+       AlertString();
 
   // Inputs
   std::vector<IO>::iterator ioi;
@@ -524,7 +667,6 @@ void bbfy::CreateHeader()
       else if (ioi->special=="itk input")
        {
          mFile << "  BBTK_DECLARE_ITK_INPUT(" 
-               << "itkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -534,7 +676,6 @@ void bbfy::CreateHeader()
        {
          if (mType == vtkImageAlgorithm) {
          mFile << "  BBTK_DECLARE_VTK_IMAGE_ALGORITHM_INPUT(" 
-               << "vtkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -542,7 +683,6 @@ void bbfy::CreateHeader()
          } 
          else if (mType == vtkPolyDataAlgorithm) {
          mFile << "  BBTK_DECLARE_POLY_DATA_ALGORITHM_INPUT(" 
-               << "vtkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -552,7 +692,6 @@ void bbfy::CreateHeader()
       else if (ioi->special=="itk parameter")
        {
          mFile << "  BBTK_DECLARE_ITK_PARAM(" 
-               << "itkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -561,7 +700,6 @@ void bbfy::CreateHeader()
       else if (ioi->special=="vtk parameter")
        {
          mFile << "  BBTK_DECLARE_VTK_PARAM(" 
-               << "vtkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -577,6 +715,7 @@ void bbfy::CreateHeader()
          throw bbfyException(mess);
        }
     }
+
   
   // Outputs
   for (ioi=mOutput.begin(); ioi!=mOutput.end(); ++ioi) 
@@ -592,7 +731,6 @@ void bbfy::CreateHeader()
       else if (ioi->special=="itk output")
        {
          mFile << "  BBTK_DECLARE_ITK_OUTPUT(" 
-               << "itkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -601,7 +739,6 @@ void bbfy::CreateHeader()
       else if (ioi->special=="vtk output")
        {
          mFile << "  BBTK_DECLARE_VTK_OUTPUT(" 
-               << "vtkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -618,28 +755,34 @@ void bbfy::CreateHeader()
        }
     }
   
-
   // Process
   if ((mType == STD)||(mProcess.size()))
     {
-      mFile << "  BBTK_PROCESS(DoProcess);\n" ;
-      mFile << "  void DoProcess();\n";
+      mFile << "  BBTK_PROCESS(Process);\n" ;
+      mFile << "  void Process();\n";
     }
   else if (mType == itkImageToImageFilter)
     {   
-      mFile << "  BBTK_PROCESS(itkParent::Update);\n" ;
+      mFile << "  BBTK_ITK_PROCESS();\n" ;
     }
   else if ((mType == vtkImageAlgorithm) ||
           (mType == vtkPolyDataAlgorithm) )
 
     {   
-      mFile << "  BBTK_PROCESS(vtkParent::Update);\n" ;
+      mFile << "  BBTK_VTK_PROCESS();\n" ;
     }
 
-  // EO black box declaration
-  mFile << "};\n\n";
+  // CreateWidget
+  if (mIsWidget) 
+    {
+       mFile << "  BBTK_CREATE_WIDGET(CreateWidget);\n" ;
+       mFile << "  void CreateWidget(wxWindow*);\n";
+    }
 
+       AlertString();
 
+  // EO black box declaration
+  mFile << "};\n\n";
 
   // BO black box description
   if (mTemplateParam.size()==0)
@@ -664,13 +807,22 @@ void bbfy::CreateHeader()
     {
       throw bbfyException("template bb with more than 1 templ param not impl");
     } 
-  
+
+
   // Author
   mFile << "BBTK_AUTHOR(\""<<mAuthor<< "\");\n";
 
   // Description
   mFile << "BBTK_DESCRIPTION(\""<<mDescription<< "\");\n"; 
   
+  // Category
+  mFile << "BBTK_CATEGORY(\""<<mCategory<< "\");\n"; 
+
+  for (i=mTypedef.begin(); i!=mTypedef.end(); ++i) 
+    {
+      mFile << *i <<"\n";
+    }
+  
   // Inputs
   for (ioi=mInput.begin(); ioi!=mInput.end(); ++ioi) 
     {
@@ -683,7 +835,8 @@ void bbfy::CreateHeader()
          mFile << "BBTK_INPUT(";
        } 
       mFile << mName << "," << ioi->name << ",\""
-           << ioi->help << "\"," <<  ioi->type <<");\n";
+           << ioi->descr << "\"," <<  ioi->type << ",\"" 
+           << ioi->nature<<"\");\n";
     }
   
   // Outputs
@@ -698,7 +851,8 @@ void bbfy::CreateHeader()
          mFile << "BBTK_OUTPUT(";
        } 
       mFile << mName << "," << ioi->name << ",\""
-           << ioi->help << "\"," <<  ioi->type <<");\n";
+           << ioi->descr << "\"," <<  ioi->type << ",\"" 
+           << ioi->nature<<"\");\n";
     }
   
   // EO black box description
@@ -726,9 +880,18 @@ void bbfy::CreateHeader()
       WriteGenericITKFilterHeader();
     }
 
+       AlertString();
 
   // EO namespace
   EndNamespace();
+  
+  // Prevent multiple inclusions
+  mFile << "#endif // " << included <<"\n";
+  // If is widget 
+  if (mIsWidget)
+    {
+      mFile << "#endif // _USE_WXWIDGETS_\n";
+    }
 
   // EOF
   mFile << "\n";
@@ -749,12 +912,12 @@ void bbfy::WriteGenericITKFilterHeader()
   // Class declaration and parents
   mFile << "class /*BBTK_EXPORT*/ "<<mName<<"Generic\n";
   mFile << " : \n";
-  mFile << "   public bbtk::UserBlackBox\n";
+  mFile << "   public bbtk::AtomicBlackBox\n";
   mFile << "{\n";
 
   // Interface
-  mFile << "  BBTK_USER_BLACK_BOX_INTERFACE("
-       << mName << "Generic,bbtk::UserBlackBox);\n";
+  mFile << "  BBTK_BLACK_BOX_INTERFACE("
+       << mName << "Generic,bbtk::AtomicBlackBox);\n";
 
   // Inputs
   std::vector<IO>::iterator ioi;
@@ -789,7 +952,7 @@ void bbfy::WriteGenericITKFilterHeader()
 
   // BO black box description
   mFile << "BBTK_BEGIN_DESCRIBE_BLACK_BOX("
-       << mName << "Generic,bbtk::UserBlackBox);\n";
+       << mName << "Generic,bbtk::AtomicBlackBox);\n";
   mFile << "BBTK_NAME(\"" << mName <<"\");\n";
 
   // Author
@@ -803,7 +966,7 @@ void bbfy::WriteGenericITKFilterHeader()
     {
       mFile << "BBTK_INPUT(";
       mFile << mName << "Generic," << ioi->name << ",\""
-           << ioi->help << "\"," <<  ioi->generic_type <<");\n";
+           << ioi->descr << "\"," <<  ioi->generic_type <<");\n";
     }
   
   // Outputs
@@ -811,7 +974,7 @@ void bbfy::WriteGenericITKFilterHeader()
     {
       mFile << "BBTK_OUTPUT(";
       mFile << mName << "Generic," << ioi->name << ",\""
-           << ioi->help << "\"," <<  ioi->generic_type <<");\n";
+           << ioi->descr << "\"," <<  ioi->generic_type <<");\n";
     }
   
   // EO black box description
@@ -882,7 +1045,10 @@ void bbfy::CreateCode()
       mess += "\"";
       throw bbfyException(mess);
     }
-  
+
+       AlertString();
+
+
   // Includes
   // Header of the class
   mFile << "#include \"" << mHName << "\"\n";
@@ -898,15 +1064,15 @@ void bbfy::CreateCode()
   if (mTemplateParam.size()>0) 
     {
       // Implementation
-      mFile << "BBTK_USER_BLACK_BOX_TEMPLATE_IMPLEMENTATION("
+      mFile << "BBTK_BLACK_BOX_TEMPLATE_IMPLEMENTATION("
            << mName << ","  
            << mParentBlackBox << ");\n";
      
       if (mGeneric) 
        {       
          // Implementation
-         mFile << "BBTK_USER_BLACK_BOX_IMPLEMENTATION("
-               << mName << "Generic,bbtk::UserBlackBox);\n";
+         mFile << "BBTK_BLACK_BOX_IMPLEMENTATION("
+               << mName << "Generic,bbtk::AtomicBlackBox);\n";
          // Package
          mFile << "BBTK_ADD_BLACK_BOX_TO_PACKAGE("
                << mPackage << ","
@@ -922,36 +1088,60 @@ void bbfy::CreateCode()
            << mName << ")\n";
 
       // Implementation
-      mFile << "BBTK_USER_BLACK_BOX_IMPLEMENTATION("
+      mFile << "BBTK_BLACK_BOX_IMPLEMENTATION("
            << mName << ","  
-           << mParentBlackBox << ");\n";
-      // Process
-      if ((mType == STD)||(mProcess.size()))
+           << mParentBlackBox << ");\n"; 
+    }
+  // Process
+  if ((mType == STD)||(mProcess.size()))
+    {
+       AlertString();
+      mFile << "void "<<mName<<"::Process()\n{\n";
+      mFile << mProcess << "\n";
+      mFile << "}\n";
+    }
+  // CreateWidget
+  if (mIsWidget)
+    {
+       AlertString();
+      mFile << "void "<<mName<<"::CreateWidget(wxWindow* parent)\n{\n";
+      mFile << mCreateWidget << "\n";
+      mFile << "}\n";
+    }
+
+               
+  // User Set Default Values  
+       AlertString();
+  mFile <<"void "<<mName<<"::bbUserSetDefaultValues()"<<std::endl;
+  mFile << "{"<<std::endl;  
+       if ( (mType == vtkImageAlgorithm) || (mType == vtkPolyDataAlgorithm) )
        {
-         mFile << "void "<<mName<<"::DoProcess()\n{\n";
-         mFile << mProcess << "\n";
-         mFile << "}\n";
+               mFile << "   BBTK_VTK_SET_DEFAULT_VALUES();\n";
        }
-    }
-  
-  // User constr / copy constr / destr implementation
-  mFile <<"void "<<mName<<"::bbUserConstructor()"<<std::endl;
-  mFile << "{"<<std::endl;
-  //mFile<<"bbtkDebugMessage(\"Kernel\",9,\""<<mName<<::bbUserConstructor()"<<std::endl);"<<std::endl;
-  mFile << mUserConstructor << std::endl;
+       mFile << mUserSetDefaultValues << std::endl;
   mFile << "}" << std::endl;
 
-  mFile <<"void "<<mName<<"::bbUserCopyConstructor()"<<std::endl;
+  // User Initialize Processing
+       AlertString();
+  mFile <<"void "<<mName<<"::bbUserInitializeProcessing()"
+       <<std::endl;
   mFile << "{"<<std::endl;
-  //mFile<<"bbtkDebugMessage(\"Kernel\",9,\""<<mName<<::bbUserCopyConstructor()"<<std::endl);"<<std::endl;
-  mFile << mUserCopyConstructor << std::endl;
+       if ( (mType == vtkImageAlgorithm) || (mType == vtkPolyDataAlgorithm) )
+       {
+               mFile <<  "  BBTK_VTK_INITIALIZE_PROCESSING();\n";
+       }
+       mFile << mUserInitializeProcessing << std::endl;
   mFile << "}" << std::endl;
 
-  mFile <<"void "<<mName<<"::bbUserDestructor()"<<std::endl;
+       // User Finalize Processing
+       AlertString();
+  mFile <<"void "<<mName<<"::bbUserFinalizeProcessing()"<<std::endl;
   mFile << "{"<<std::endl;
-  //mFile<<"bbtkDebugMessage(\"Kernel\",9,\""<<mName<<::bbUserDestructor()"<<std::endl);"<<std::endl;
-  mFile << mUserDestructor << std::endl;
+       if ( (mType == vtkImageAlgorithm) || (mType == vtkPolyDataAlgorithm) )
+       {
+               mFile << "   BBTK_VTK_FINALIZE_PROCESSING();\n";
+       }
+       mFile << mUserFinalizeProcessing << std::endl;
   mFile << "}" << std::endl;
 
 
@@ -974,24 +1164,27 @@ void bbfy::CreateCode()
 int main(int argc, char **argv)
 {
   
-  if (argc<2 || argc>4
+  if (argc<2 || argc>5
     {
-      std::cerr << "usage : "<< argv[0] <<" xml_file [output_path] [-q]" << std::endl;
+      std::cerr << "usage : "<< argv[0] <<" xml_file [package_name] [output_path] [-q]" << std::endl;
       return 1;
     }
 
   try 
     {
+      std::string package("PACKAGE_NAME");
       std::string output_path("");
       bool verbose = true;
-      if (argc>2) output_path = argv[2];
-      if (argc>3) verbose = false;
+      if (argc>2) package = argv[2];
+      if (argc>3) output_path = argv[3];
+      if (argc>4) verbose = false;
       
-      bbfy B(argv[1],output_path,verbose);
+      bbfy B(argv[1],package,output_path,verbose);
     }
   catch (bbfyException e)
     {
-      std::cerr << e.mMessage << std::endl;
+      std::cerr << argv[0] << "  " << argv[1] << std::endl
+               << e.mMessage << std::endl;
       return 1;
     }
   return 0;