]> Creatis software - bbtk.git/blob - kernel/src/bbtkWxGUIPackageBrowser2.cxx
Commented last lines
[bbtk.git] / kernel / src / bbtkWxGUIPackageBrowser2.cxx
1 /*=========================================================================                                                                               
2   Program:   bbtk
3   Module:    $RCSfile: bbtkWxGUIPackageBrowser2.cxx,v $
4   Language:  C++
5   Date:      $Date: 2010/03/29 16:08:24 $
6   Version:   $Revision: 1.18 $
7 =========================================================================*/
8
9 /* ---------------------------------------------------------------------
10
11 * Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
12 * Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
13 *
14 *  This software is governed by the CeCILL-B license under French law and 
15 *  abiding by the rules of distribution of free software. You can  use, 
16 *  modify and/ or redistribute the software under the terms of the CeCILL-B 
17 *  license as circulated by CEA, CNRS and INRIA at the following URL 
18 *  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
19 *  or in the file LICENSE.txt.
20 *
21 *  As a counterpart to the access to the source code and  rights to copy,
22 *  modify and redistribute granted by the license, users are provided only
23 *  with a limited warranty  and the software's author,  the holder of the
24 *  economic rights,  and the successive licensors  have only  limited
25 *  liability. 
26 *
27 *  The fact that you are presently reading this means that you have had
28 *  knowledge of the CeCILL-B license and that you accept its terms.
29 * ------------------------------------------------------------------------ */                                                                         
30
31
32 /* \brief Short description in one line
33  * 
34  * Long description which 
35  * can span multiple lines
36  */
37  
38 /**
39  * \file 
40  * \brief 
41  */
42 /**
43  * \class bbtk::
44  * \brief 
45  */
46
47
48 #ifdef _USE_WXWIDGETS_
49
50 #define CHECKBOXVIEW 1
51
52 #include "bbtkWxGUIPackageBrowser2.h"
53 //#include "ThirdParty/wx/treemultictrl/wxTreeMultiCtrl.h"
54 #include "bbtkInterpreter.h"
55 #include "bbtkBlackBoxInputDescriptor.h"
56 #include "bbtkBlackBoxOutputDescriptor.h"
57 #include "bbtkWxBlackBox.h"
58 //#include "wx/grid.h"
59 //#include <wx/statline.h>
60
61 #define LIST_CTRL 1000
62
63
64 namespace bbtk
65 {
66
67
68   BEGIN_EVENT_TABLE(WxGUIBlackBoxList, wxListCtrl)
69     EVT_LIST_BEGIN_DRAG(LIST_CTRL, WxGUIBlackBoxList::OnBeginDrag)
70     EVT_LIST_BEGIN_RDRAG(LIST_CTRL, WxGUIBlackBoxList::OnBeginRDrag)
71     EVT_LIST_BEGIN_LABEL_EDIT(LIST_CTRL, WxGUIBlackBoxList::OnBeginLabelEdit)
72     EVT_LIST_END_LABEL_EDIT(LIST_CTRL, WxGUIBlackBoxList::OnEndLabelEdit)
73     EVT_LIST_DELETE_ITEM(LIST_CTRL, WxGUIBlackBoxList::OnDeleteItem)
74     EVT_LIST_DELETE_ALL_ITEMS(LIST_CTRL, WxGUIBlackBoxList::OnDeleteAllItems)
75 #if WXWIN_COMPATIBILITY_2_4
76     EVT_LIST_GET_INFO(LIST_CTRL, WxGUIBlackBoxList::OnGetInfo)
77     EVT_LIST_SET_INFO(LIST_CTRL, WxGUIBlackBoxList::OnSetInfo)
78 #endif
79     EVT_LIST_ITEM_SELECTED(LIST_CTRL, WxGUIBlackBoxList::OnSelected)
80     EVT_LIST_ITEM_DESELECTED(LIST_CTRL, WxGUIBlackBoxList::OnDeselected)
81     EVT_LIST_KEY_DOWN(LIST_CTRL, WxGUIBlackBoxList::OnListKeyDown)
82     EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, WxGUIBlackBoxList::OnActivated)
83     EVT_LIST_ITEM_FOCUSED(LIST_CTRL, WxGUIBlackBoxList::OnFocused)
84     
85     EVT_LIST_COL_CLICK(LIST_CTRL, WxGUIBlackBoxList::OnColClick)
86     EVT_LIST_COL_RIGHT_CLICK(LIST_CTRL, WxGUIBlackBoxList::OnColRightClick)
87     EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, WxGUIBlackBoxList::OnColBeginDrag)
88     EVT_LIST_COL_DRAGGING(LIST_CTRL, WxGUIBlackBoxList::OnColDragging)
89     EVT_LIST_COL_END_DRAG(LIST_CTRL, WxGUIBlackBoxList::OnColEndDrag)
90     
91     EVT_LIST_CACHE_HINT(LIST_CTRL, WxGUIBlackBoxList::OnCacheHint)
92     
93 #if USE_CONTEXT_MENU
94     EVT_CONTEXT_MENU(WxGUIBlackBoxList::OnContextMenu)
95 #endif
96     EVT_CHAR(WxGUIBlackBoxList::OnChar)
97     
98     EVT_RIGHT_DOWN(WxGUIBlackBoxList::OnRightClick)
99     END_EVENT_TABLE()
100     
101     int wxCALLBACK MyCompareFunction(long item1, long item2, long WXUNUSED(sortData))
102   {
103     // inverse the order
104     if (item1 < item2)
105       return -1;
106     if (item1 > item2)
107       return 1;
108     
109     return 0;
110   }
111   
112   // WxGUIBlackBoxList
113   WxGUIBlackBoxList::WxGUIBlackBoxList(wxWindow *parent,
114                                  const wxWindowID id,
115                                  const wxPoint& pos,
116                                  const wxSize& size,
117                                  long style)
118     : wxListCtrl(parent, id, pos, size, style),
119       mUser(0),
120       m_attr(*wxBLUE, *wxLIGHT_GREY, wxNullFont)
121   {
122 #ifdef __POCKETPC__
123     EnableContextMenu();
124 #endif
125   }
126   
127   void WxGUIBlackBoxList::Insert(BlackBoxDescriptor::Pointer d)
128   {
129     if (GetColumnCount()!=3)
130       {
131         InsertColumn( 0, _("Package"), 
132                       wxLIST_FORMAT_LEFT, 60  ); 
133         InsertColumn( 1, _("Box"), 
134                       wxLIST_FORMAT_LEFT, 200 ); 
135         InsertColumn( 2, _("Description"), 
136                       wxLIST_FORMAT_LEFT, 500  ); 
137       }
138     
139     wxListItem kNewItem;
140     kNewItem.SetAlign(wxLIST_FORMAT_LEFT);
141     
142     int nID = this->GetItemCount();
143     kNewItem.SetId(nID);
144     kNewItem.SetMask(wxLIST_MASK_DATA);
145     // TO DO : STORE SMART POINTER ?
146     kNewItem.SetData(d.get());  
147     //    BlackBoxDescriptor::Pointer* d2 = (BlackBoxDescriptor::Pointer*)kNewItem.GetData();
148     //    std::cout << "Descr = "<<d<<" = "<<d2<<std::endl;
149     this->InsertItem(kNewItem);
150     this->SetItem(nID, 0, std2wx(d->GetPackage()->GetName()) );
151     this->SetItem(nID, 1, std2wx(d->GetTypeName()) );
152     this->SetItem(nID, 2, std2wx(d->GetDescription()) );
153     
154     /*
155       if (nID % 2)
156       {
157       kNewItem.SetBackgroundColour(wxColour(192,192,192));
158       this->SetItem(kNewItem);
159       }
160     */
161     
162   }
163   
164   
165   void WxGUIBlackBoxList::OnCacheHint(wxListEvent& event)
166   {
167     //wxLogMessage( wxT("OnCacheHint: cache items %ld..%ld"),
168     //                  event.GetCacheFrom(), event.GetCacheTo() );
169   }
170   
171   void WxGUIBlackBoxList::SetColumnImage(int col, int image)
172   {
173     /*
174       wxListItem item;
175       item.SetMask(wxLIST_MASK_IMAGE);
176       item.SetImage(image);
177       SetColumn(col, item);
178     */
179   }
180
181   void WxGUIBlackBoxList::OnColClick(wxListEvent& event)
182   {
183     int col = event.GetColumn();
184
185     // set or unset image
186     static bool x = false;
187     x = !x;
188     SetColumnImage(col, x ? 0 : -1);
189
190     //    wxLogMessage( wxT("OnColumnClick at %d."), col );
191   }
192
193   void WxGUIBlackBoxList::OnColRightClick(wxListEvent& event)
194   {
195     int col = event.GetColumn();
196     if ( col != -1 )
197       {
198         SetColumnImage(col, -1);
199       }
200
201     // Show popupmenu at position
202     wxMenu menu(wxT("Test"));
203     menu.Append(-1, _T("&About"));
204     PopupMenu(&menu, event.GetPoint());
205
206     //wxLogMessage( wxT("OnColumnRightClick at %d."), event.GetColumn() );
207   }
208
209   void WxGUIBlackBoxList::LogColEvent(const wxListEvent& event, const wxChar *name)
210   {
211     //    const int col = event.GetColumn();
212
213     /*
214       wxLogMessage(wxT("%s: column %d (width = %d or %d)."),
215       name,
216       col,
217       event.GetItem().GetWidth(),
218       GetColumnWidth(col));
219     */
220   }
221
222   void WxGUIBlackBoxList::OnColBeginDrag(wxListEvent& event)
223   {
224     LogColEvent( event, wxT("OnColBeginDrag") );
225     /*
226       if ( event.GetColumn() == 0 )
227       {
228       //wxLogMessage(_T("Resizing this column shouldn't work."));
229
230       event.Veto();
231       }
232     */
233   }
234
235   void WxGUIBlackBoxList::OnColDragging(wxListEvent& event)
236   {
237     LogColEvent( event, wxT("OnColDragging") );
238   }
239
240   void WxGUIBlackBoxList::OnColEndDrag(wxListEvent& event)
241   {
242     LogColEvent( event, wxT("OnColEndDrag") );
243   }
244
245   void WxGUIBlackBoxList::OnBeginDrag(wxListEvent& event)
246   {
247           std::cout<<"RaC DRAG TABLE"<<std::endl;
248           /*
249           
250           wxString text(wxT(this->GetItemText(event.GetIndex())));
251           wxListItem info;
252           info.m_itemId = event.m_itemIndex;
253           info.m_col = 0;
254           info.m_mask = wxLIST_MASK_DATA;
255           wxString sendtext(wxT(""));
256           if ( GetItem(info) )
257           {
258                   // TO DO : STORE SMART PTR ?
259                   BlackBoxDescriptor* d = (BlackBoxDescriptor*)(info.GetData());
260                   if (d!=0)
261                   {
262                           sendtext += wxT(d->GetFullTypeName());
263                   }
264           }
265           else
266           {
267                   wxFAIL_MSG(wxT("wxListCtrl::GetItem() failed"));
268           }
269
270         
271           wxTextDataObject tdo(wxT(sendtext));
272           wxDropSource tds(tdo, this);
273           tds.DoDragDrop();
274           
275           */
276
277     //    const wxPoint& pt = event.m_pointDrag;
278
279     //wxLogMessage( wxT("OnBeginDrag at (%d, %d), item %ld."),
280     //          pt.x, pt.y, HitTest(pt, flags) );
281   }
282
283   void WxGUIBlackBoxList::OnBeginRDrag(wxListEvent& event)
284   {
285     //wxLogMessage( wxT("OnBeginRDrag at %d,%d."),
286     //        event.m_pointDrag.x, event.m_pointDrag.y );
287   }
288
289   void WxGUIBlackBoxList::OnBeginLabelEdit(wxListEvent& event)
290   {
291     //wxLogMessage( wxT("OnBeginLabelEdit: %s"), event.m_item.m_text.c_str());
292   }
293
294   void WxGUIBlackBoxList::OnEndLabelEdit(wxListEvent& event)
295   {
296     //wxLogMessage( wxT("OnEndLabelEdit: %s"),
297     //        event.IsEditCancelled() ? _T("[cancelled]")
298     //                                      : event.m_item.m_text.c_str());
299   }
300
301   void WxGUIBlackBoxList::OnDeleteItem(wxListEvent& event)
302   {
303     LogEvent(event, _T("OnDeleteItem"));
304     std::cout << "cannot del"<<std::endl;
305     event.Veto();
306     //wxLogMessage( wxT("Number of items when delete event is sent: %d"), GetItemCount() );
307   }
308
309   void WxGUIBlackBoxList::OnDeleteAllItems(wxListEvent& event)
310   {
311     LogEvent(event, _T("OnDeleteAllItems"));
312     event.Veto();
313   }
314
315 #if WXWIN_COMPATIBILITY_2_4
316   void WxGUIBlackBoxList::OnGetInfo(wxListEvent& event)
317   {
318     wxString msg;
319
320     msg << _T("OnGetInfo (") << event.m_item.m_itemId << _T(", ") << event.m_item.m_col << _T(")");
321     if ( event.m_item.m_mask & wxLIST_MASK_STATE )
322       msg << _T(" wxLIST_MASK_STATE");
323     if ( event.m_item.m_mask & wxLIST_MASK_TEXT )
324       msg << _T(" wxLIST_MASK_TEXT");
325     if ( event.m_item.m_mask & wxLIST_MASK_IMAGE )
326       msg << _T(" wxLIST_MASK_IMAGE");
327     if ( event.m_item.m_mask & wxLIST_MASK_DATA )
328       msg << _T(" wxLIST_MASK_DATA");
329     if ( event.m_item.m_mask & wxLIST_SET_ITEM )
330       msg << _T(" wxLIST_SET_ITEM");
331     if ( event.m_item.m_mask & wxLIST_MASK_WIDTH )
332       msg << _T(" wxLIST_MASK_WIDTH");
333     if ( event.m_item.m_mask & wxLIST_MASK_FORMAT )
334       msg << _T(" wxLIST_MASK_WIDTH");
335
336     if ( event.m_item.m_mask & wxLIST_MASK_TEXT )
337       {
338         event.m_item.m_text = _T("My callback text");
339       }
340
341     //wxLogMessage(msg);
342   }
343
344   void WxGUIBlackBoxList::OnSetInfo(wxListEvent& event)
345   {
346     LogEvent(event, _T("OnSetInfo"));
347   }
348 #endif
349
350   void WxGUIBlackBoxList::OnSelected(wxListEvent& event)
351   {
352     if (mUser==0) return;
353
354     wxListItem info;
355     info.m_itemId = event.m_itemIndex;
356     info.m_col = 0;
357     info.m_mask = wxLIST_MASK_DATA;
358     if ( GetItem(info) )
359       {
360         // TO DO : STORE SMART PTR ?
361         BlackBoxDescriptor* d = (BlackBoxDescriptor*)(info.GetData());
362         if (d!=0) mUser->WxGUIBlackBoxListUserOnSelected(d);
363       }
364     else
365       {
366         wxFAIL_MSG(wxT("wxListCtrl::GetItem() failed"));
367       }
368   }
369
370   void WxGUIBlackBoxList::OnDeselected(wxListEvent& event)
371   {
372     LogEvent(event, _T("OnDeselected"));
373   }
374
375   void WxGUIBlackBoxList::OnActivated(wxListEvent& event)
376   {
377     LogEvent(event, _T("OnActivated"));
378   }
379
380   void WxGUIBlackBoxList::OnFocused(wxListEvent& event)
381   {
382     LogEvent(event, _T("OnFocused"));
383
384     event.Skip();
385   }
386
387   void WxGUIBlackBoxList::OnListKeyDown(wxListEvent& event)
388   {
389     long item;
390
391     switch ( event.GetKeyCode() )
392       {
393       case 'c': // colorize
394       case 'C':
395         {
396           wxListItem info;
397           info.m_itemId = event.GetIndex();
398           if ( info.m_itemId == -1 )
399             {
400               // no item
401               break;
402             }
403
404           GetItem(info);
405
406           wxListItemAttr *attr = info.GetAttributes();
407           if ( !attr || !attr->HasTextColour() )
408             {
409               info.SetTextColour(*wxCYAN);
410
411               SetItem(info);
412
413               RefreshItem(info.m_itemId);
414             }
415         }
416         break;
417
418       case 'n': // next
419       case 'N':
420         item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED);
421         if ( item++ == GetItemCount() - 1 )
422           {
423             item = 0;
424           }
425
426         //wxLogMessage(_T("Focusing item %ld"), item);
427
428         SetItemState(item, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED);
429         EnsureVisible(item);
430         break;
431
432       case 'r': // show bounding Rect
433       case 'R':
434         {
435           item = event.GetIndex();
436           wxRect r;
437           if ( !GetItemRect(item, r) )
438             {
439               //wxLogError(_T("Failed to retrieve rect of item %ld"), item);
440               break;
441             }
442
443           //wxLogMessage(_T("Bounding rect of item %ld is (%d, %d)-(%d, %d)"),
444           //   item, r.x, r.y, r.x + r.width, r.y + r.height);
445         }
446         break;
447
448       case WXK_DELETE:
449         item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
450         /*
451           while ( item != -1 )
452           {
453           DeleteItem(item);
454
455           //wxLogMessage(_T("Item %ld deleted"), item);
456
457           // -1 because the indices were shifted by DeleteItem()
458           item = GetNextItem(item - 1,
459           wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
460           }
461         */
462         break;
463
464       case WXK_INSERT:
465         if ( GetWindowStyle() & wxLC_REPORT )
466           {
467             if ( GetWindowStyle() & wxLC_VIRTUAL )
468               {
469                 SetItemCount(GetItemCount() + 1);
470               }
471             else // !virtual
472               {
473                 //InsertItemInReportView(event.GetIndex());
474               }
475           }
476         //else: fall through
477
478       default:
479         LogEvent(event, _T("OnListKeyDown"));
480
481         event.Skip();
482       }
483   }
484
485   void WxGUIBlackBoxList::OnChar(wxKeyEvent& event)
486   {
487     //wxLogMessage(_T("Got char event."));
488
489     switch ( event.GetKeyCode() )
490       {
491       case 'n':
492       case 'N':
493       case 'c':
494       case 'C':
495         // these are the keys we process ourselves
496         break;
497
498       default:
499         event.Skip();
500       }
501   }
502
503   void WxGUIBlackBoxList::OnRightClick(wxMouseEvent& event)
504   {
505     if ( !event.ControlDown() )
506       {
507         event.Skip();
508         return;
509       }
510
511     int flags;
512     long subitem;
513     //    long item = 
514     HitTest(event.GetPosition(), flags, &subitem);
515
516     wxString where;
517     switch ( flags )
518       {
519       case wxLIST_HITTEST_ABOVE: where = _T("above"); break;
520       case wxLIST_HITTEST_BELOW: where = _T("below"); break;
521       case wxLIST_HITTEST_NOWHERE: where = _T("nowhere near"); break;
522       case wxLIST_HITTEST_ONITEMICON: where = _T("on icon of"); break;
523       case wxLIST_HITTEST_ONITEMLABEL: where = _T("on label of"); break;
524       case wxLIST_HITTEST_ONITEMRIGHT: where = _T("right on"); break;
525       case wxLIST_HITTEST_TOLEFT: where = _T("to the left of"); break;
526       case wxLIST_HITTEST_TORIGHT: where = _T("to the right of"); break;
527       default: where = _T("not clear exactly where on"); break;
528       }
529
530     //wxLogMessage(_T("Right double click %s item %ld, subitem %ld"),
531     //             where.c_str(), item, subitem);
532   }
533
534   void WxGUIBlackBoxList::LogEvent(const wxListEvent& event, const wxChar *eventName)
535   {
536     //wxLogMessage(_T("Item %ld: %s (item text = %s, data = %ld)"),
537     //            event.GetIndex(), eventName,
538     //              event.GetText().c_str(), event.GetData());
539   }
540
541   wxString WxGUIBlackBoxList::OnGetItemText(long item, long column) const
542   {
543     /*
544       if ( GetItemCount() == WXSIZEOF(SMALL_VIRTUAL_VIEW_ITEMS) )
545       {
546       return SMALL_VIRTUAL_VIEW_ITEMS[item][column];
547       }
548       else
549       {
550     */
551     return wxString::Format(_T("Column %ld of item %ld"), column, item);
552     //  }
553   }
554
555   int WxGUIBlackBoxList::OnGetItemColumnImage(long item, long column) const
556   {
557     if (!column)
558       return 0;
559
560     if (!(item %3) && column == 1)
561       return 0;
562
563     return -1;
564   }
565
566   wxListItemAttr *WxGUIBlackBoxList::OnGetItemAttr(long item) const
567   {
568     return item % 2 ? NULL : (wxListItemAttr *)&m_attr;
569   }
570
571
572 #if USE_CONTEXT_MENU
573   void WxGUIBlackBoxList::OnContextMenu(wxContextMenuEvent& event)
574   {
575     wxPoint point = event.GetPosition();
576     // If from keyboard
577     if (point.x == -1 && point.y == -1) {
578       wxSize size = GetSize();
579       point.x = size.x / 2;
580       point.y = size.y / 2;
581     } else {
582       point = ScreenToClient(point);
583     }
584     ShowContextMenu(point);
585   }
586 #endif
587
588   void WxGUIBlackBoxList::ShowContextMenu(const wxPoint& pos)
589   {
590     wxMenu menu;
591   
592     menu.Append(wxID_ABOUT, _T("&About"));
593     menu.AppendSeparator();
594     menu.Append(wxID_EXIT, _T("E&xit"));
595   
596     PopupMenu(&menu, pos.x, pos.y);
597   }
598   //================================================================
599
600
601
602   //================================================================
603   WxGUIBlackBoxInfo::WxGUIBlackBoxInfo(wxWindow* parent)
604     :
605     wxPanel(parent, -1),
606     mDescriptor()
607   {
608     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
609     
610     //    mName = new wxStaticText(this,-1,_T(""));
611     //    sizer->Add(mName,0,wxGROW);
612     mDescription = new wxStaticText(this,-1,_T(""));
613     sizer->Add(mDescription,0,wxGROW);
614     mAuthor = new wxStaticText(this,-1,_T(""));
615     sizer->Add(mAuthor,0,wxGROW);
616     mCategory = new wxStaticText(this,-1,_T(""));
617     sizer->Add(mCategory,0,wxGROW);
618
619
620     wxBoxSizer *inputs = 
621       new wxStaticBoxSizer
622       ( new wxStaticBox(this, wxID_ANY, _T("Inputs")), wxVERTICAL );    
623     mInputList = new wxListCtrl(this, -1,
624                                 wxDefaultPosition,
625                                 wxDefaultSize,
626                                 wxLC_REPORT //wxLC_LIST
627                                 | wxSUNKEN_BORDER);
628     
629     
630     inputs->Add(mInputList,1,wxGROW);
631     sizer->Add(inputs,1,wxGROW);
632
633     wxBoxSizer *outputs = 
634       new wxStaticBoxSizer
635       ( new wxStaticBox(this, wxID_ANY, _T("Outputs")), wxVERTICAL );    
636     mOutputList = new wxListCtrl(this, -1,
637                                  wxDefaultPosition,
638                                  wxDefaultSize,
639                                  wxLC_REPORT //wxLC_LIST
640                                  | wxSUNKEN_BORDER);
641     
642     outputs->Add(mOutputList,1,wxGROW);
643     sizer->Add(outputs,1,wxGROW);
644     
645     
646     SetSizer(sizer);
647     SetAutoLayout(true);
648     Layout();
649   }
650   //================================================================
651
652     
653   //================================================================
654   void WxGUIBlackBoxInfo::UpdateInfo(BlackBoxDescriptor* descr)
655   {
656
657     //    mName->SetLabel(std2wx(descr->GetTypeName()));
658     mDescription->SetLabel(std2wx(descr->GetDescription()));
659     mAuthor->SetLabel(std2wx(descr->GetAuthor()));
660     mCategory->SetLabel(std2wx(descr->GetCategory()));
661     
662     mInputList->ClearAll();
663     mInputList->InsertColumn( 0, _("Name"), 
664                                wxLIST_FORMAT_LEFT, 80  ); 
665     mInputList->InsertColumn( 1, _("Type"), 
666                                wxLIST_FORMAT_LEFT, 100 ); 
667     mInputList->InsertColumn( 2, _("Nature"), 
668                                wxLIST_FORMAT_LEFT, 100  ); 
669     mInputList->InsertColumn( 3, _("Description"), 
670                                wxLIST_FORMAT_LEFT, 500  ); 
671
672     mOutputList->ClearAll();
673     mOutputList->InsertColumn( 0, _("Name"), 
674                                wxLIST_FORMAT_LEFT, 80  ); 
675     mOutputList->InsertColumn( 1, _("Type"), 
676                                wxLIST_FORMAT_LEFT, 100 ); 
677     mOutputList->InsertColumn( 2, _("Nature"), 
678                                wxLIST_FORMAT_LEFT, 100  ); 
679     mOutputList->InsertColumn( 3, _("Description"), 
680                                wxLIST_FORMAT_LEFT, 500  ); 
681     
682
683     std::vector<BlackBoxInputOutputDescriptor*> user_defined;
684     std::vector<BlackBoxInputOutputDescriptor*> ubb_defined;
685     std::vector<BlackBoxInputOutputDescriptor*> wxbb_defined;
686     
687     const BlackBoxDescriptor::InputDescriptorMapType& imap = 
688       descr->GetInputDescriptorMap();
689     BlackBoxDescriptor::InputDescriptorMapType::const_iterator in;
690     for ( in = imap.begin();  in != imap.end(); ++in ) 
691       {
692         int iotype = 0;
693         if (in->second->GetCreatorTypeInfo() == 
694             typeid(AtomicBlackBoxDescriptor))
695           {
696             iotype = 1;
697           }
698         else if (in->second->GetCreatorTypeInfo() == 
699                  typeid(WxBlackBoxDescriptor))
700           {
701             iotype = 2;
702           }
703         if (iotype==0) user_defined.push_back(in->second);
704         else if (iotype==1) ubb_defined.push_back(in->second);
705         else if (iotype==2) wxbb_defined.push_back(in->second);
706         
707       }
708
709     std::vector<BlackBoxInputOutputDescriptor*>::iterator hi;
710     for (hi=user_defined.begin();hi!=user_defined.end();++hi) 
711       {
712         InsertInputOutput(mInputList,*hi);
713       }
714     for (hi=wxbb_defined.begin();hi!=wxbb_defined.end();++hi) 
715       {
716         InsertInputOutput(mInputList,*hi);
717       }
718     for (hi=ubb_defined.begin();hi!=ubb_defined.end();++hi) 
719       {
720         InsertInputOutput(mInputList,*hi);
721       }
722     
723     // Outputs
724     user_defined.clear();
725     ubb_defined.clear();
726     wxbb_defined.clear();
727     const BlackBoxDescriptor::OutputDescriptorMapType& omap = 
728       descr->GetOutputDescriptorMap();
729     BlackBoxDescriptor::OutputDescriptorMapType::const_iterator out;
730     for ( out = omap.begin();  out != omap.end(); ++out ) 
731       {
732         int iotype = 0;
733         if (out->second->GetCreatorTypeInfo() == 
734             typeid(AtomicBlackBoxDescriptor))
735           {
736             iotype = 1;
737           }
738         else if (out->second->GetCreatorTypeInfo() == 
739                  typeid(WxBlackBoxDescriptor))
740           {
741             iotype = 2;
742           }
743        
744         if (iotype==0) user_defined.push_back(out->second);
745         else if (iotype==1) ubb_defined.push_back(out->second);
746         else if (iotype==2) wxbb_defined.push_back(out->second);
747
748       }
749     for (hi=user_defined.begin();hi!=user_defined.end();++hi) 
750       {
751         InsertInputOutput(mOutputList,*hi);
752       }
753     for (hi=wxbb_defined.begin();hi!=wxbb_defined.end();++hi) 
754       {
755         InsertInputOutput(mOutputList,*hi);
756       }
757     for (hi=ubb_defined.begin();hi!=ubb_defined.end();++hi) 
758       {
759         InsertInputOutput(mOutputList,*hi);
760       }
761   }
762   //================================================================
763
764
765   //================================================================
766   void WxGUIBlackBoxInfo::InsertInputOutput(wxListCtrl* l,
767                                             BlackBoxInputOutputDescriptor* d)
768   {
769     wxListItem kNewItem;
770     kNewItem.SetAlign(wxLIST_FORMAT_LEFT);
771     int nID = l->GetItemCount();
772     //    std::cout << nID << std::endl;
773     kNewItem.SetId(nID);
774     //    kNewItem.SetMask(wxLIST_MASK_DATA);
775     //    kNewItem.SetData(d);  
776     l->InsertItem(kNewItem);
777     l->SetItem(nID, 0, std2wx(d->GetName()) );
778     l->SetItem(nID, 1, std2wx(d->GetTypeName()) );
779     l->SetItem(nID, 2, std2wx(d->GetNature()) );
780     l->SetItem(nID, 3, std2wx(d->GetDescription()) );
781   }
782   //================================================================
783
784   //================================================================
785   WxGUIBlackBoxInfo::~WxGUIBlackBoxInfo()
786   {
787   }
788   //================================================================
789
790
791  enum 
792     {
793       id_f1,
794       id_f2,
795       id_f3,
796       id_f4,
797       id_f5,
798       id_f6,
799       id_f7,
800       id_f8,
801       id_fc1,
802       id_fc2,
803       id_fc3
804     };
805
806
807   //================================================================
808   WxGUIPackageBrowser2::WxGUIPackageBrowser2( wxWindow *parent,
809                                               WxGUIPackageBrowser2User* user )
810     : wxPanel(parent, -1),
811       mUser(user),
812       mInterpreter()
813   {
814     m_mgr.SetManagedWindow(this);
815
816     //    wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
817     mBoxList = new WxGUIBlackBoxList(this, LIST_CTRL,
818                                      wxDefaultPosition,
819                                      wxDefaultSize,
820                                      wxLC_REPORT //wxLC_LIST
821                                      | wxSUNKEN_BORDER);
822     mBoxList->SetUser(this);
823     mBoxList->SetBackgroundColour(*wxWHITE);
824
825     m_mgr.AddPane(mBoxList,
826                   wxAuiPaneInfo().Name(wxT("BoxList"))
827                   .Caption(wxT("Black Boxes"))
828                   .MinimizeButton(true)
829                   .MaximizeButton(true)
830                   .Center()
831                   .MinSize(wxSize(100,100))
832                   );     
833     //    sizer->Add(mBoxList,5,wxGROW);
834
835     mBoxInfo = new WxGUIBlackBoxInfo(this);
836     //    sizer->Add(mBoxInfo,3,wxGROW);
837
838     m_mgr.AddPane(mBoxInfo,
839                   wxAuiPaneInfo().Name(wxT("Box"))
840                   .Caption(wxT(""))
841                   .MinimizeButton(true)
842                   .MaximizeButton(true)
843                   .Bottom()
844                   .MinSize(wxSize(100,300))
845                   );     
846     
847
848     wxPanel* filters = new wxPanel(this,-1);
849     wxBoxSizer *fsizer = new wxBoxSizer(wxVERTICAL );    
850     wxBoxSizer *fpack = 
851       new wxStaticBoxSizer
852       ( new wxStaticBox(filters, wxID_ANY, _T("Package")), wxHORIZONTAL );    
853     mPackageFilter = new wxTextCtrl(filters,id_f1,_T(""),
854                                     wxDefaultPosition,
855                                     wxDefaultSize,
856                                     wxTE_PROCESS_ENTER);
857     fpack->Add(mPackageFilter,1,wxGROW);
858     fsizer->Add(fpack,0,wxGROW);
859     wxBoxSizer *fname = 
860       new wxStaticBoxSizer
861       ( new wxStaticBox(filters, wxID_ANY, _T("Name")), wxHORIZONTAL );    
862     mNameFilter = new wxTextCtrl(filters,id_f2,_T(""),
863                                     wxDefaultPosition,
864                                     wxDefaultSize,
865                                     wxTE_PROCESS_ENTER);
866     fname->Add(mNameFilter,1,wxGROW);
867     fsizer->Add(fname,0,wxGROW);
868     wxBoxSizer *fdescr = 
869       new wxStaticBoxSizer
870       ( new wxStaticBox(filters, wxID_ANY, _T("Description")), wxHORIZONTAL );
871     mDescriptionFilter = new wxTextCtrl(filters,id_f3,_T(""),
872                                     wxDefaultPosition,
873                                     wxDefaultSize,
874                                     wxTE_PROCESS_ENTER);
875     fdescr->Add(mDescriptionFilter,1,wxGROW);
876     fsizer->Add(fdescr,0,wxGROW);
877     wxBoxSizer *fcat = 
878       new wxStaticBoxSizer
879       ( new wxStaticBox(filters, wxID_ANY, _T("Category")), wxHORIZONTAL );    
880     mCategoryFilter = new wxTextCtrl(filters,id_f4,_T(""),
881                                     wxDefaultPosition,
882                                     wxDefaultSize,
883                                     wxTE_PROCESS_ENTER);
884     fcat->Add(mCategoryFilter,1,wxGROW);
885     fsizer->Add(fcat,0,wxGROW);
886     wxBoxSizer *fintype = 
887       new wxStaticBoxSizer
888       ( new wxStaticBox(filters, wxID_ANY, _T("Input type")), wxHORIZONTAL );
889     mInputTypeFilter = new wxTextCtrl(filters,id_f5,_T(""),
890                                     wxDefaultPosition,
891                                     wxDefaultSize,
892                                     wxTE_PROCESS_ENTER);
893     fintype->Add(mInputTypeFilter,1,wxGROW);
894     fsizer->Add(fintype,0,wxGROW);
895     wxBoxSizer *fouttype = 
896       new wxStaticBoxSizer
897       ( new wxStaticBox(filters, wxID_ANY, _T("Output type")), wxHORIZONTAL );
898     mOutputTypeFilter = new wxTextCtrl(filters,id_f6,_T(""),
899                                     wxDefaultPosition,
900                                     wxDefaultSize,
901                                     wxTE_PROCESS_ENTER);
902     fouttype->Add(mOutputTypeFilter,1,wxGROW);
903     fsizer->Add(fouttype,0,wxGROW);
904     wxBoxSizer *finnat = 
905       new wxStaticBoxSizer
906       ( new wxStaticBox(filters, wxID_ANY, _T("Input nature")),wxHORIZONTAL ); 
907     mInputNatureFilter = new wxTextCtrl(filters,id_f7,_T(""),
908                                         wxDefaultPosition,
909                                         wxDefaultSize,
910                                         wxTE_PROCESS_ENTER);
911     finnat->Add(mInputNatureFilter,1,wxGROW);
912     fsizer->Add(finnat,0,wxGROW);
913     wxBoxSizer *foutnat = 
914       new wxStaticBoxSizer
915       ( new wxStaticBox(filters, wxID_ANY,_T("Output nature")),wxHORIZONTAL ); 
916     mOutputNatureFilter = new wxTextCtrl(filters,id_f8,_T(""),
917                                         wxDefaultPosition,
918                                         wxDefaultSize,
919                                         wxTE_PROCESS_ENTER);
920     foutnat->Add(mOutputNatureFilter,1,wxGROW);
921     fsizer->Add(foutnat,0,wxGROW);
922
923
924     mShowWidgetsFilter = new wxCheckBox(filters,id_fc1,_T("Show widgets"));
925     mShowWidgetsFilter->SetValue(true);
926     fsizer->Add(mShowWidgetsFilter,0,wxGROW);
927
928     mShowAdaptorsFilter = new wxCheckBox(filters,id_fc2,_T("Show adaptors"));
929     mShowAdaptorsFilter->SetValue(false);
930     fsizer->Add(mShowAdaptorsFilter,0,wxGROW);
931
932     mShowGUIsFilter = new wxCheckBox(filters,id_fc3,_T("Show GUIs"));
933     mShowGUIsFilter->SetValue(false);
934     fsizer->Add(mShowGUIsFilter,0,wxGROW);
935
936     filters->SetSizer(fsizer);
937
938     m_mgr.AddPane(filters,
939                   wxAuiPaneInfo().Name(wxT("Filter"))
940                   .Caption(wxT("Filter"))
941                   .MinimizeButton(true)
942                   .MaximizeButton(true)
943                   .Right()
944                   .MinSize(wxSize(100,100)) );
945
946     
947
948     //    sizer->Add(fsizer,1,wxGROW);
949     m_mgr.Update();
950
951     //    SetSizer(sizer);
952     SetAutoLayout(true);
953     Layout();
954     
955   }
956   //================================================================
957
958   //================================================================
959   void WxGUIPackageBrowser2::OnFilter(wxCommandEvent&)
960   {
961     RebuildList();
962   }
963   //================================================================
964
965   //================================================================
966   // User callback when a box is selected in the list 
967   void WxGUIPackageBrowser2::WxGUIBlackBoxListUserOnSelected
968   ( BlackBoxDescriptor* d)
969   {
970         //RaC
971         _actualSelected=d;
972
973     mBoxInfo->UpdateInfo(d);
974     std::string title = d->GetPackage()->GetName()+"::"+d->GetTypeName();
975     m_mgr.GetPane(mBoxInfo).Caption(std2wx(title));
976     m_mgr.Update();
977   }
978   
979   //================================================================
980
981   //================================================================
982   BlackBoxDescriptor* WxGUIPackageBrowser2::GetActualSelected()
983   {
984           return _actualSelected;
985   }
986
987
988   //================================================================
989
990   //================================================================
991   WxGUIPackageBrowser2::~WxGUIPackageBrowser2()
992   {
993     mFactory.reset();
994     mInterpreter.reset();
995     //    Object::PrintObjectListInfo("");
996     m_mgr.UnInit();
997   }
998   //================================================================
999
1000   //================================================================
1001   void WxGUIPackageBrowser2::IncludeAll()
1002   {
1003     if (!mInterpreter) mInterpreter =bbtk::Interpreter::New();
1004     mInterpreter->SetCommandLine(true);
1005     std::stringstream* buf = new std::stringstream;
1006     *buf << "exec freeze_no_error" << std::endl;
1007     *buf << "message max 0" << std::endl; 
1008     *buf << "include *" << std::endl;
1009     mInterpreter->InterpretBuffer(buf);
1010
1011     Factory::Pointer F = mInterpreter->GetExecuter()->GetFactory();
1012     BuildFromFactory(F);
1013   }
1014   //================================================================
1015
1016   //================================================================
1017   void WxGUIPackageBrowser2::BuildFromFactory(Factory::Pointer F)
1018   {
1019     mFactory = F;
1020     RebuildList();
1021   }  
1022
1023   //================================================================
1024
1025   //================================================================
1026   void WxGUIPackageBrowser2::RebuildList()
1027   {
1028     mBoxList->Hide();
1029     mBoxList->ClearAll();    
1030     
1031     const Factory::PackageMapType& M = mFactory->GetPackageMap();
1032     Factory::PackageMapType::const_iterator i;
1033     for (i=M.begin();i!=M.end();++i)
1034       {
1035         Package::Pointer P = i->second;
1036         if (P->GetName() == "user") continue;
1037         
1038         Package::DescriptorMapType::iterator j;
1039         for (j=P->GetDescriptorMap().begin();
1040              j!=P->GetDescriptorMap().end();
1041              ++j)
1042           {
1043             //      std::cout << "Insert "<<j->second->GetTypeName()<<std::endl;
1044             if (IsVisible(j->second))
1045               mBoxList->Insert(j->second);
1046           }
1047       }
1048     mBoxList->Show();
1049   }
1050   //================================================================
1051
1052   //================================================================
1053   bool WxGUIPackageBrowser2::IsVisible(BlackBoxDescriptor::Pointer d)
1054   {
1055     //    std::cout << "   '" << wx2std(mPackageFilter->GetValue())<<"'"<<std::endl;
1056     //    std::cout << "vs '" << d->GetPackage()->GetName() << "'"<<std::endl;
1057     if ((!mShowAdaptorsFilter->IsChecked())&&
1058         ((d->GetKind()==BlackBoxDescriptor::ADAPTOR)||
1059          (d->GetKind()==BlackBoxDescriptor::DEFAULT_ADAPTOR)))
1060       return false;
1061     if ((!mShowGUIsFilter->IsChecked())&&
1062         ((d->GetKind()==BlackBoxDescriptor::GUI)||
1063          (d->GetKind()==BlackBoxDescriptor::DEFAULT_GUI)))
1064       return false;
1065     if (d->GetPackage()->GetName().find( wx2std(mPackageFilter->GetValue()) ) 
1066         == std::string::npos ) return false;
1067    if (d->GetTypeName().find( wx2std(mNameFilter->GetValue()) ) 
1068         == std::string::npos ) return false;
1069    if (d->GetDescription().find( wx2std(mDescriptionFilter->GetValue()) ) 
1070         == std::string::npos ) return false;
1071    if (d->GetCategory().find( wx2std(mCategoryFilter->GetValue()) ) 
1072         == std::string::npos ) return false;
1073    if (!mShowWidgetsFilter->IsChecked())
1074      {
1075        bool found = false;
1076        const BlackBoxDescriptor::OutputDescriptorMapType& imap = 
1077          d->GetOutputDescriptorMap();
1078        BlackBoxDescriptor::OutputDescriptorMapType::const_iterator in;
1079        for ( in = imap.begin();  in != imap.end(); ++in ) 
1080          {
1081            if (in->second->GetName() == "Widget" )
1082              {
1083                found = true;
1084                break;
1085              }
1086          }
1087        if (found) return false;
1088      }
1089    if (mInputTypeFilter->GetValue().size()>0)
1090      {
1091        std::string s = wx2std(mInputTypeFilter->GetValue());
1092        bool found = false;
1093        const BlackBoxDescriptor::InputDescriptorMapType& imap = 
1094          d->GetInputDescriptorMap();
1095        BlackBoxDescriptor::InputDescriptorMapType::const_iterator in;
1096        for ( in = imap.begin();  in != imap.end(); ++in ) 
1097          {
1098            if (in->second->GetTypeName().find(s)!=std::string::npos)
1099              {
1100                found = true;
1101                break;
1102              }
1103          }
1104        if (!found) return false;
1105      }
1106    if (mOutputTypeFilter->GetValue().size()>0)
1107      {
1108        std::string s = wx2std(mOutputTypeFilter->GetValue());
1109        bool found = false;
1110        const BlackBoxDescriptor::OutputDescriptorMapType& imap = 
1111          d->GetOutputDescriptorMap();
1112        BlackBoxDescriptor::OutputDescriptorMapType::const_iterator in;
1113        for ( in = imap.begin();  in != imap.end(); ++in ) 
1114          {
1115            if (in->second->GetTypeName().find(s)!=std::string::npos)
1116              {
1117                found = true;
1118                break;
1119              }
1120          }
1121        if (!found) return false;
1122      }
1123    if (mInputNatureFilter->GetValue().size()>0)
1124      {
1125        std::string s = wx2std(mInputNatureFilter->GetValue());
1126        bool found = false;
1127        const BlackBoxDescriptor::InputDescriptorMapType& imap = 
1128          d->GetInputDescriptorMap();
1129        BlackBoxDescriptor::InputDescriptorMapType::const_iterator in;
1130        for ( in = imap.begin();  in != imap.end(); ++in ) 
1131          {
1132            if (in->second->GetNature().find(s)!=std::string::npos)
1133              {
1134                found = true;
1135                break;
1136              }
1137          }
1138        if (!found) return false;
1139      }
1140    if (mOutputNatureFilter->GetValue().size()>0)
1141      {
1142        std::string s = wx2std(mOutputNatureFilter->GetValue());
1143        bool found = false;
1144        const BlackBoxDescriptor::OutputDescriptorMapType& imap = 
1145          d->GetOutputDescriptorMap();
1146        BlackBoxDescriptor::OutputDescriptorMapType::const_iterator in;
1147        for ( in = imap.begin();  in != imap.end(); ++in ) 
1148          {
1149            if (in->second->GetNature().find(s)!=std::string::npos)
1150              {
1151                found = true;
1152                break;
1153              }
1154          }
1155        if (!found) return false;
1156      }
1157
1158     return true;
1159   }
1160   //========================================================================
1161
1162   //========================================================================
1163   BEGIN_EVENT_TABLE(WxGUIPackageBrowser2, wxPanel)
1164     EVT_TEXT_ENTER(id_f1, WxGUIPackageBrowser2::OnFilter )
1165     EVT_TEXT_ENTER(id_f2, WxGUIPackageBrowser2::OnFilter )
1166     EVT_TEXT_ENTER(id_f3, WxGUIPackageBrowser2::OnFilter )
1167     EVT_TEXT_ENTER(id_f4, WxGUIPackageBrowser2::OnFilter )
1168     EVT_TEXT_ENTER(id_f5, WxGUIPackageBrowser2::OnFilter )
1169     EVT_TEXT_ENTER(id_f6, WxGUIPackageBrowser2::OnFilter )
1170     EVT_TEXT_ENTER(id_f7, WxGUIPackageBrowser2::OnFilter )
1171     EVT_TEXT_ENTER(id_f8, WxGUIPackageBrowser2::OnFilter )
1172     EVT_CHECKBOX(  id_fc1, WxGUIPackageBrowser2::OnFilter )
1173     EVT_CHECKBOX(  id_fc2, WxGUIPackageBrowser2::OnFilter )
1174     EVT_CHECKBOX(  id_fc3, WxGUIPackageBrowser2::OnFilter )
1175     END_EVENT_TABLE()
1176   //========================================================================
1177
1178
1179
1180   //================================================================
1181   WxGUIPackageBrowser2Window::WxGUIPackageBrowser2Window( wxWindow *parent, 
1182                                                             wxString title, 
1183                                                             wxSize size)
1184       : wxFrame((wxFrame *)parent, -1, title, wxDefaultPosition, size)
1185   {     
1186     
1187     
1188     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
1189
1190     mBrowser = new WxGUIPackageBrowser2(this);
1191     mBrowser->IncludeAll();
1192     sizer->Add(mBrowser,1,wxGROW);
1193     
1194     //    WxGUICommand* com = new WxGUICommand(this,this);
1195     //    sizer->Add(com);
1196     
1197     SetSizer(sizer);
1198
1199      // Creates the parent window of all bbtk windows as a child of this
1200 //    Wx::CreateTopWindow(this);
1201     // Add the method OnWxSignal as a Wx::Signal observer 
1202     //bbtkAddWxSignalObserver(WxGUIPackageBrowser2Window::OnWxSignal);
1203  
1204     SetAutoLayout(true);
1205     Layout();
1206   }
1207   //================================================================
1208
1209   //================================================================
1210   WxGUIPackageBrowser2Window::~WxGUIPackageBrowser2Window()
1211   {
1212   }
1213   //================================================================
1214
1215 } // namespace bbtk
1216
1217
1218 #endif //_USE_WXWIDGETS_