]> Creatis software - bbtk.git/blobdiff - kernel/appli/bbfy/bbfy.cpp
New widget pipeline : progressing ...
[bbtk.git] / kernel / appli / bbfy / bbfy.cpp
index 0c7972ae52f72b2348b36408a71bd0f68eacd3ce..c22be3230c127a088389c5f7c3401acecee11f9d 100644 (file)
@@ -3,7 +3,7 @@
 #endif
 
 #include <stdio.h>
-#include "xmlParser.h"
+#include "bbtkXML.h"
 #include <iostream>
 #include <fstream>
 #include <sstream>
@@ -19,11 +19,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 +58,18 @@ private:
       vtkPolyDataAlgorithm,
     }
     BoxType;
+
   BoxType mType;
+  bool mIsWidget;
   std::string mParentBlackBox;
   std::string mItkParent;
   std::string mVtkParent;
   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,6 +77,7 @@ private:
   std::string mTemplateImplementation;
 
   std::vector<std::string> mInclude;
+  std::vector<std::string> mTypedef;
 
   std::string mUserConstructor;
   std::string mUserCopyConstructor;
@@ -77,7 +87,8 @@ private:
   {
     std::string name;
     std::string type;
-    std::string help;
+    std::string nature;
+    std::string descr;
     std::string special;
     std::string generic_type;
   }
@@ -87,6 +98,7 @@ private:
   std::vector<IO> mOutput;
 
   std::string mProcess;
+  std::string mCreateWidget;
 
   //
   std::ofstream mFile;
@@ -100,10 +112,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;
 
@@ -123,27 +141,6 @@ void bbfy::CreateBlackBox()
 //==========================================================================
 
 
-//==========================================================================
-void GetTextOrClear(const XMLNode& node, std::string& var) 
-{
-  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);
-    }
-}
-//==========================================================================
-
 
 //==========================================================================
 void bbfy::ParseXML()
@@ -164,7 +161,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 +170,8 @@ void bbfy::ParseXML()
   // Type 
   mGeneric = false;
   mType = STD;
+
+
   if (BB.isAttributeSet("type")) 
     {
       std::string bbtype = BB.getAttribute("type");
@@ -181,59 +180,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")) 
            {
-             throw bbfyException("Error : blackbox type 'vtkImageAlgorithm' but no <vtkparent> tag found (mandatory)");
+             throw bbfyException("Error : blackbox type '"
+                                 +vtkImageAlgorithmString
+                                 +"' but no <vtkparent> tag found (mandatory)");
            }
-         GetTextOrClear(BB.getChildNode("vtkparent"),mVtkParent);
+         bbtk::GetTextOrClear(BB.getChildNode("vtkparent"),mVtkParent);
          // 
        }
-      else 
+    else if (bbtype == vtkPolyDataAlgorithmString )
+       {
+         mType = vtkPolyDataAlgorithm;
+         // Looks for <vtkparent> tag
+         if (!BB.nChildNode("vtkparent")) 
+           {
+             throw bbfyException("Error : blackbox type '"
+                                 +vtkPolyDataAlgorithmString
+                                 +"' but no <vtkparent> tag found (mandatory)");
+           }
+         bbtk::GetTextOrClear(BB.getChildNode("vtkparent"),mVtkParent);
+         // 
+       }
+     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,32 +258,40 @@ 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"))
     {
-      GetTextOrClear(BB.getChildNode("constructor"),mUserConstructor);
+      bbtk::GetTextOrClear(BB.getChildNode("constructor"),mUserConstructor);
     }
+    
   // UserCopyConstructor body
   if (BB.nChildNode("copyconstructor"))
     {
-      GetTextOrClear(BB.getChildNode("copyconstructor"),mUserCopyConstructor);
+      bbtk::GetTextOrClear(BB.getChildNode("copyconstructor"),mUserCopyConstructor);
     }
+    
   // UserDestructor body
   if (BB.nChildNode("destructor"))
     {
-      GetTextOrClear(BB.getChildNode("destructor"),mUserDestructor);
+      bbtk::GetTextOrClear(BB.getChildNode("destructor"),mUserDestructor);
     }
  
     // Template parameters
@@ -281,7 +306,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 +315,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 +327,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 +380,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,10 +418,17 @@ 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);
      }
 }
 //==========================================================================
@@ -382,20 +437,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";
+  //  }
 }
 //==========================================================================
 
@@ -418,9 +473,20 @@ void bbfy::CreateHeader()
       throw bbfyException(mess);
     }
   
+  // 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 \"bbtkAtomicBlackBox.h\"\n";
   std::vector<std::string>::iterator i;
   for (i=mInclude.begin(); i!=mInclude.end(); ++i) 
     {
@@ -429,6 +495,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();
 
@@ -443,7 +518,6 @@ void bbfy::CreateHeader()
   // Class declaration and parents
   mFile << "class /*BBTK_EXPORT*/ "<<mName<<"\n";
   mFile << " : \n";
-  mFile << "   public "<<mParentBlackBox;
 
   /*
   if (mBB.nChildNode("inherits"))
@@ -463,37 +537,50 @@ void bbfy::CreateHeader()
 
   if (mType == itkImageToImageFilter )
     {
-      mFile << ",\n   public " << mItkParent <<"\n";
+      mFile << "   public " << mItkParent <<",\n";
     }
   else if ( (mType == vtkImageAlgorithm) ||
            (mType == vtkPolyDataAlgorithm) )
     {
-      mFile << ",\n   public " << mVtkParent <<"\n";
-    }
-  else 
-    {
-      mFile << "\n";
+      mFile << "   public " << mVtkParent <<",\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 << ","
+           << mVtkParent 
+           << ");\n";
+    }
+  // Default
+  else 
+    {
+      mFile << "  BBTK_BLACK_BOX_INTERFACE("
+           << mName << ","
+           << mParentBlackBox << ");\n";
+    }
+
+  for (i=mTypedef.begin(); i!=mTypedef.end(); ++i) 
+    {
+      mFile << *i <<"\n";
     }
 
   // Declare user constructor / copy cons /destr 
@@ -502,7 +589,7 @@ void bbfy::CreateHeader()
 
   mFile << "virtual void bbUserConstructor();"<<std::endl;
   mFile << "/// User callback called in the box copy constructor"<<std::endl;
-  mFile << "virtual void bbUserCopyConstructor();"<<std::endl;
+  mFile << "virtual void bbUserCopyConstructor(bbtk::BlackBox::Pointer);"<<std::endl;
   mFile << "/// User callback called in the box destructor"<<std::endl;
   mFile << "virtual void bbUserDestructor();"<<std::endl;
   mFile << "//=================================================================="<<std::endl; 
@@ -524,7 +611,6 @@ void bbfy::CreateHeader()
       else if (ioi->special=="itk input")
        {
          mFile << "  BBTK_DECLARE_ITK_INPUT(" 
-               << "itkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -534,7 +620,6 @@ void bbfy::CreateHeader()
        {
          if (mType == vtkImageAlgorithm) {
          mFile << "  BBTK_DECLARE_VTK_IMAGE_ALGORITHM_INPUT(" 
-               << "vtkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -542,7 +627,6 @@ void bbfy::CreateHeader()
          } 
          else if (mType == vtkPolyDataAlgorithm) {
          mFile << "  BBTK_DECLARE_POLY_DATA_ALGORITHM_INPUT(" 
-               << "vtkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -552,7 +636,6 @@ void bbfy::CreateHeader()
       else if (ioi->special=="itk parameter")
        {
          mFile << "  BBTK_DECLARE_ITK_PARAM(" 
-               << "itkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -561,7 +644,6 @@ void bbfy::CreateHeader()
       else if (ioi->special=="vtk parameter")
        {
          mFile << "  BBTK_DECLARE_VTK_PARAM(" 
-               << "vtkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -592,7 +674,6 @@ void bbfy::CreateHeader()
       else if (ioi->special=="itk output")
        {
          mFile << "  BBTK_DECLARE_ITK_OUTPUT(" 
-               << "itkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -601,7 +682,6 @@ void bbfy::CreateHeader()
       else if (ioi->special=="vtk output")
        {
          mFile << "  BBTK_DECLARE_VTK_OUTPUT(" 
-               << "vtkParent,"
                << ioi->name
                << ","
                << ioi->type
@@ -618,28 +698,33 @@ 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";
+    }
 
 
+  // EO black box declaration
+  mFile << "};\n\n";
 
   // BO black box description
   if (mTemplateParam.size()==0)
@@ -671,6 +756,14 @@ void bbfy::CreateHeader()
   // 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 +776,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 +792,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
@@ -729,6 +824,14 @@ void bbfy::CreateHeader()
 
   // 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 +852,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 +892,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 +906,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 +914,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
@@ -835,7 +938,7 @@ void bbfy::WriteGenericITKFilterHeader()
   mFile << "template <class T, unsigned int D>\n"
        << "void "<<mName<<"Generic::Process()\n"
        << "{\n"
-       << "  bbtkDebugMessageInc(\"Core\",9,\n"
+       << "  bbtkDebugMessageInc(\"Kernel\",9,\n"
        << "      \""<<mName 
        << "Generic::Process<\"<<TypeName<T>()<<\",\"<<D<<\">()\"<<std::endl);\n"
     
@@ -856,7 +959,7 @@ void bbfy::WriteGenericITKFilterHeader()
   mFile << "  f->bbUpdate();\n"
        << "  this->bbSetOutputOut( new itkImage( f->bbGetOutputOut() ) );\n"
        << "  f->UnRegister();\n"
-       << "  bbtkDebugDecTab(\"Core\",9);\n"
+       << "  bbtkDebugDecTab(\"Kernel\",9);\n"
        << "}\n\n";
   //=================================================================
 
@@ -898,15 +1001,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,35 +1025,43 @@ 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()))
-       {
-         mFile << "void "<<mName<<"::DoProcess()\n{\n";
-         mFile << mProcess << "\n";
-         mFile << "}\n";
-       }
+           << mParentBlackBox << ");\n"; 
     }
-  
+  // Process
+  if ((mType == STD)||(mProcess.size()))
+    {
+      mFile << "void "<<mName<<"::Process()\n{\n";
+      mFile << mProcess << "\n";
+      mFile << "}\n";
+    }
+  // CreateWidget
+  if (mIsWidget)
+    {
+      mFile << "void "<<mName<<"::CreateWidget(wxWindow* parent)\n{\n";
+      mFile << mCreateWidget << "\n";
+      mFile << "}\n";
+    }
+
   // User constr / copy constr / destr implementation
   mFile <<"void "<<mName<<"::bbUserConstructor()"<<std::endl;
   mFile << "{"<<std::endl;
-  //mFile<<"bbtkDebugMessage(\"Core\",9,\""<<mName<<::bbUserConstructor()"<<std::endl);"<<std::endl;
+  //mFile<<"bbtkDebugMessage(\"Kernel\",9,\""<<mName<<::bbUserConstructor()"<<std::endl);"<<std::endl;
+  
   mFile << mUserConstructor << std::endl;
   mFile << "}" << std::endl;
 
-  mFile <<"void "<<mName<<"::bbUserCopyConstructor()"<<std::endl;
+  mFile <<"void "<<mName<<"::bbUserCopyConstructor(bbtk::BlackBox::Pointer)"
+       <<std::endl;
   mFile << "{"<<std::endl;
-  //mFile<<"bbtkDebugMessage(\"Core\",9,\""<<mName<<::bbUserCopyConstructor()"<<std::endl);"<<std::endl;
+  //mFile<<"bbtkDebugMessage(\"Kernel\",9,\""<<mName<<::bbUserCopyConstructor()"<<std::endl);"<<std::endl;
   mFile << mUserCopyConstructor << std::endl;
   mFile << "}" << std::endl;
 
   mFile <<"void "<<mName<<"::bbUserDestructor()"<<std::endl;
   mFile << "{"<<std::endl;
-  //mFile<<"bbtkDebugMessage(\"Core\",9,\""<<mName<<::bbUserDestructor()"<<std::endl);"<<std::endl;
+  //mFile<<"bbtkDebugMessage(\"Kernel\",9,\""<<mName<<::bbUserDestructor()"<<std::endl);"<<std::endl;
   mFile << mUserDestructor << std::endl;
   mFile << "}" << std::endl;
 
@@ -974,24 +1085,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;