]> Creatis software - bbtk.git/blob - kernel/src/bbtkBlackBoxDescriptor.cxx
Renamed UserBlackBox into AtomicBlackBox which is a better name (versus ComplexBlackB...
[bbtk.git] / kernel / src / bbtkBlackBoxDescriptor.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbtkBlackBoxDescriptor.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/02/07 07:58:53 $
7   Version:   $Revision: 1.10 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18
19 /**
20  *  \file 
21  *  \brief Class bbtk::BlackBoxDescriptor : (abstract) describes a BlackBox (name, description, author) and is able to create an instance of it.
22  */
23 #include "bbtkBlackBoxDescriptor.h"
24 #include "bbtkMessageManager.h"
25 #include "bbtkPackage.h"
26 #include "bbtkUtilities.h"
27 #include "bbtkAtomicBlackBoxDescriptor.h"
28 #include "bbtkWxBlackBox.h"
29
30 namespace bbtk
31 {
32   
33   //=========================================================================
34   /// Default ctor
35   BlackBoxDescriptor::BlackBoxDescriptor()  
36     : mTypeName("Unknown"), 
37       mDescription(""), 
38       mAuthor(""),
39       mCategory(""),
40       mKind(STANDARD),
41       mPackage(NULL)
42   {
43     bbtkDebugMessage("Kernel",9,
44                      "BlackBoxDescriptor::BlackBoxDescriptor()"<<std::endl);
45   }
46   //=========================================================================
47
48   //=========================================================================
49   /// Dtor
50   BlackBoxDescriptor::~BlackBoxDescriptor()
51   {
52     bbtkDebugMessageInc("Kernel",9,
53                         "BlackBoxDescriptor::~BlackBoxDescriptor() ["
54                         <<mTypeName<<"]"<<std::endl);
55
56     // deletes all I/O descriptors
57     InputDescriptorMapType::iterator i;
58     for (i=mInput.begin(); i!=mInput.end(); ++i) delete i->second;
59     OutputDescriptorMapType::iterator o;
60     for (o=mOutput.begin(); o!=mOutput.end(); ++o) delete o->second;
61
62     bbtkDebugDecTab("Kernel",9);
63   }
64   //=========================================================================
65
66   //=========================================================================
67   /// Adds the string to the BlackBox description
68   void BlackBoxDescriptor::AddToDescription( const std::string& s, bool clear)
69   {
70     bbtkDebugMessage("Kernel",9,"BlackBoxDescriptor::AddToDescription(\""<<s<<
71                      "\") ["<<GetTypeName()<<"]"<<std::endl);
72     if (clear) mDescription = s; 
73     else mDescription += s;
74    }
75   //=========================================================================
76
77   //=========================================================================   
78   /// Adds the string to the BlackBox author list
79   void BlackBoxDescriptor::AddToAuthor( const std::string& s, bool clear)
80   {
81     bbtkDebugMessage("Kernel",9,"BlackBoxDescriptor::AddToAuthor(\""<<s<<"\") ["
82                      <<GetTypeName()<<"]"<<std::endl);
83     if (clear) mAuthor = s;
84     else mAuthor += s;
85   }
86   //=========================================================================
87
88   //=========================================================================  
89   /// Adds the string to the BlackBox category list
90   void BlackBoxDescriptor::AddToCategory( const std::string& s, bool clear)
91   {
92     bbtkDebugMessage("Kernel",9,"BlackBoxDescriptor::AddToCategory(\""<<s<<"\") ["
93                      <<GetTypeName()<<"]"<<std::endl);  
94     if (clear) mCategory = s;
95     else mCategory += s;
96     mCategory += ";";
97   }  
98   //=========================================================================
99   
100   //=========================================================================
101   const BlackBoxDescriptor::InputDescriptor* 
102   BlackBoxDescriptor::GetInputDescriptor(const std::string & name) const
103   {
104     bbtkDebugMessageInc("Kernel",9,"BlackBoxDescriptor::GetInputDescriptor('"
105                         <<name<<"') ["<<GetTypeName()<<"]"<<std::endl);
106
107     InputDescriptorMapType::const_iterator i;
108     i = mInput.find(name);
109     if ( i == mInput.end() ) 
110     {
111             bbtkError("input '"<<name<<"' does not exist");
112     }
113     bbtkDebugDecTab("Kernel",9);
114     return i->second;
115   }
116   //=========================================================================
117
118   //=========================================================================
119   const BlackBoxDescriptor::OutputDescriptor* 
120   BlackBoxDescriptor::GetOutputDescriptor(const std::string & name) const
121   {
122     bbtkDebugMessageInc("Kernel",9,"BlackBoxDescriptor::GetOutputDescriptor('"
123                         <<name<<"') ["<<GetTypeName()<<"]"<<std::endl);
124
125     OutputDescriptorMapType::const_iterator i;
126     i = mOutput.find(name);
127     if ( i == mOutput.end() ) 
128     {
129             bbtkError("output '"<<name<<"' does not exist");
130     }
131     bbtkDebugDecTab("Kernel",9);
132     return i->second;
133   }
134   //=========================================================================
135
136   //=========================================================================
137   void BlackBoxDescriptor::GetHelp(bool full) const
138   {
139     bbtkDebugMessageInc("Kernel",9,"BlackBoxDescriptor::GetHelp() ["<<GetTypeName()<<"]"<<std::endl);
140     if (GetPackage()) 
141          {
142        bbtkMessage("Help",1,"Black Box <"<<
143                      GetPackage()->GetName()<<"::"<<GetTypeName()<<">"<<std::endl);
144     }
145     else 
146     {
147            bbtkMessage("Help",1,"Black Box <::"<<GetTypeName()<<">"<<std::endl);
148          }
149     bbtkMessage("Help",1," "              <<GetDescription()<<std::endl);
150     bbtkMessage("Help",1," By : "         <<GetAuthor()     <<std::endl);
151     bbtkMessage("Help",1," Categories : " <<GetCategory()    <<std::endl);
152     if (mInput.size()) 
153       bbtkMessage("Help",1," * Inputs : "<<std::endl);
154     else 
155       bbtkMessage("Help",1," * No inputs"<<std::endl);
156     InputDescriptorMapType::const_iterator i;
157     unsigned int namelmax = 0;
158     unsigned int typelmax = 0;
159     for ( i = mInput.begin();  i != mInput.end(); ++i ) 
160     {
161            if (i->second->GetName().size()>namelmax) 
162              namelmax = i->second->GetName().size();
163            if (i->second->GetHumanTypeName().size()>typelmax) 
164              typelmax = i->second->GetHumanTypeName().size();
165     }
166     OutputDescriptorMapType::const_iterator o;
167     for ( o = mOutput.begin();  o != mOutput.end(); ++o ) 
168     {
169            if (o->second->GetName().size()>namelmax) 
170              namelmax = o->second->GetName().size();
171            if (o->second->GetHumanTypeName().size()>typelmax) 
172              typelmax = o->second->GetHumanTypeName().size();
173     }
174     //
175     for ( i = mInput.begin();  i != mInput.end(); ++i ) 
176     {
177            std::string name(i->second->GetName());
178            name += "'";
179            name.append(1+namelmax-name.size(),' ');
180            std::string type(i->second->GetHumanTypeName());
181            type += ">";
182            type.append(1+typelmax-type.size(),' ');
183            bbtkMessage("Help",1,
184                     "    '"<<name
185                     <<" <"<<type
186                     <<" : "<<i->second->GetDescription()<<std::endl);
187     }
188     if (mOutput.size()) 
189       bbtkMessage("Help",1," * Outputs : "<<std::endl);
190     else 
191       bbtkMessage("Help",1," * No outputs"<<std::endl);
192     for ( o = mOutput.begin();  o != mOutput.end(); ++o ) 
193     {
194            std::string name(o->second->GetName());
195            name += "'";
196            name.append(1+namelmax-name.size(),' ');
197            std::string type(o->second->GetHumanTypeName());
198            type += ">";
199            type.append(1+typelmax-type.size(),' ');
200            bbtkMessage("Help",1,
201                     "    '"<<name
202                     <<" <"<<type
203                     <<" : "<<o->second->GetDescription()<<std::endl);
204       }
205    
206      bbtkDebugDecTab("Kernel",9);
207   
208
209   }
210   //=========================================================================
211
212   //=========================================================================
213   void BlackBoxDescriptor::InsertHtmlHelp ( std::ofstream& s, 
214                                             int detail, int level,
215                                             const std::string& output_dir,
216                                             bool relative_link )
217   {
218     bbtkDebugMessageInc("Kernel",9,"BlackBoxDescriptor::InsertHtmlHelp() ["<<GetTypeName()<<"]"<<std::endl);
219     
220     //-------------
221     // General info 
222     std::string name = GetTypeName();
223     Utilities::html_format(name);
224
225     (s) << "<p><hr>\n";
226     (s) << "<a name=\""<<name<<"\"></a>\n";
227     (s) << //"Top:&nbsp;
228       "<a rel=\"top\" accesskey=\"t\" href=\"#Top\">Top</a>\n";
229     // (s) << "Previous:&nbsp;<a rel="previous" accesskey="p" href="#dir">(dir)</a>,
230     // (s) << "Up:&nbsp;<a rel="up" accesskey="u" href="#dir">(dir)</a>
231     (s) << "<h2 class=\"section\">"<<name<<"</h2>\n";
232
233
234     std::string descr = GetDescription();
235     //Utilities::html_format(descr);
236     std::string author = GetAuthor();
237     Utilities::html_format(author);
238
239     std::string category = GetCategory();
240     Utilities::html_format(category);    
241     
242     (s) << "<p><TABLE cellspacing=0  cellpadding=3>\n";
243     (s) << "<TR><TD style='vertical-align: top;'><b> Description </b></TD><TD style='vertical-align: top;'> : </TD><TD style='vertical-align: top;'> " 
244       << descr << "</TD></TR>\n";
245     (s) << "<TR><TD style='vertical-align: top;'><b> Author(s) </b></TD><TD style='vertical-align: top;'> : </TD><TD style='vertical-align: top;'>  " 
246       << author << "</TD></TR>\n";
247     (s) << "<TR><TD style='vertical-align: top;'><b> Category(s) </b></TD><TD style='vertical-align: top;'> : </TD><TD style='vertical-align: top;'>  " 
248       << category << "</TD></TR>\n";
249     (s) << "<TR><TD style='vertical-align: top;'><b> To use it </b></TD><TD style='vertical-align: top;'> : </TD><TD style='vertical-align: top;'>  include " 
250         << GetPackage()->GetName() << "</TD></TR>\n";
251     (s) << "</TABLE>\n";
252
253     //-------------
254     // Graph
255     //i->second->InsertHTMLGraph( &s , detail,level,dir);
256     
257     //-------------
258     // Inputs
259     std::string titlecol("#BBBBFF");
260     std::string usercol("#FFFFFF");
261     std::string ubbcol("#DDFFFF");
262     std::string wxbbcol("#EEFFFF");
263
264
265     //  (s) << "<h3 class=\"subsection\">Inputs</h3>\n";
266     (s) << "<p><TABLE border=1 cellspacing=0 cellpadding=3>\n";
267     (s) << "<TR><TD colspan=3 align=center bgcolor=\""<<titlecol
268       <<"\">Inputs</TD></TR>\n";
269
270     std::vector<std::string> user_defined;
271     std::vector<std::string> ubb_defined;
272     std::vector<std::string> wxbb_defined;
273
274     const BlackBoxDescriptor::InputDescriptorMapType& imap = 
275       GetInputDescriptorMap();
276     InputDescriptorMapType::const_iterator in;
277     for ( in = imap.begin();  in != imap.end(); ++in ) 
278     {
279       // Skips system-defined inputs
280       std::string col(usercol);
281       int iotype = 0;
282       if (in->second->GetCreatorTypeInfo() == 
283           typeid(AtomicBlackBoxDescriptor))
284         {
285           col = ubbcol; 
286           iotype = 1;
287         }
288       else if (in->second->GetCreatorTypeInfo() == 
289                typeid(WxBlackBoxDescriptor))
290         {
291           col = wxbbcol; 
292           iotype = 2;
293         }
294
295       std::string name(in->second->GetName());
296       Utilities::html_format(name);
297       
298       std::string type("<");
299       type += in->second->GetTypeName();    
300       type += ">";
301       Utilities::html_format(type);
302       
303       std::string descr(in->second->GetDescription());
304       //Utilities::html_format(descr);
305       
306       std::string out = 
307         "<TR><TD style='vertical-align: top;' bgcolor=\"" + col
308         +"\"><B><PRE> "+name+" </PRE></B></TD>"
309         + "<TD style='vertical-align: top;' bgcolor=\""+col
310         +"\"><I><PRE> "+type+" </PRE></I></TD>"
311         + "<TD style='vertical-align: top;' bgcolor=\""+col
312         +"\">"+descr+"</TD></TR>\n";
313       
314       if (iotype==0) user_defined.push_back(out);
315       else if (iotype==1) ubb_defined.push_back(out);
316       else if (iotype==2) wxbb_defined.push_back(out);
317       
318     }
319
320     std::vector<std::string>::iterator hi;
321     for (hi=user_defined.begin();hi!=user_defined.end();++hi) s << *hi;
322     for (hi=wxbb_defined.begin();hi!=wxbb_defined.end();++hi) s << *hi;
323     for (hi=ubb_defined.begin();hi!=ubb_defined.end();++hi) s << *hi;
324
325     user_defined.clear();
326     ubb_defined.clear();
327     wxbb_defined.clear();
328
329     //-------------
330     // Outputs
331     //  (s) << "<h3 class=\"subsection\">Outputs</h3>\n";
332     //  (s) << "<TABLE border=1 cellspacing=0>\n";
333     (s) << "<TR><TD colspan=3 align=center bgcolor=\""<<titlecol
334       <<"\">Outputs</TD></TR>\n";
335     
336     const BlackBoxDescriptor::OutputDescriptorMapType& omap = 
337       GetOutputDescriptorMap();
338     
339     BlackBoxDescriptor::OutputDescriptorMapType::const_iterator o;
340     
341     for ( o = omap.begin();  o != omap.end(); ++o ) 
342       {
343         std::string col(usercol);
344         int iotype = 0;
345         if (o->second->GetCreatorTypeInfo() == 
346             typeid(AtomicBlackBoxDescriptor))
347           {
348             col = ubbcol; 
349             iotype = 1;
350           }
351         else if (o->second->GetCreatorTypeInfo() == 
352                  typeid(WxBlackBoxDescriptor))
353           {
354             col = wxbbcol; 
355             iotype = 2;
356           }
357         
358         std::string name(o->second->GetName());
359         Utilities::html_format(name);
360         
361         std::string type("<");
362         type += o->second->GetTypeName();    
363         type += ">";
364         Utilities::html_format(type);
365         
366         std::string descr(o->second->GetDescription());
367         //Utilities::html_format(descr);
368         
369         std::string out = 
370           "<TR><TD style='vertical-align: top;' bgcolor=\"" + col
371           +"\"><B><PRE> "+name+" </PRE></B></TD>"
372           + "<TD style='vertical-align: top;' bgcolor=\""+col
373           +"\"><I><PRE> "+type+" </PRE></I></TD>"
374           + "<TD style='vertical-align: top;' bgcolor=\""+col
375           +"\">"+descr+"</TD></TR>\n";
376         
377         if (iotype==0) user_defined.push_back(out);
378         else if (iotype==1) ubb_defined.push_back(out);
379         else if (iotype==2) wxbb_defined.push_back(out);
380         
381       }
382     
383     for (hi=user_defined.begin();hi!=user_defined.end();++hi) s << *hi;
384     for (hi=wxbb_defined.begin();hi!=wxbb_defined.end();++hi) s << *hi;
385     for (hi=ubb_defined.begin();hi!=ubb_defined.end();++hi) s << *hi;
386
387     (s) << "</TABLE>\n";
388     
389     //------------
390     // End
391
392     bbtkDebugDecTab("Kernel",9);
393    }
394   //=========================================================================
395  
396 }