]> Creatis software - bbtk.git/blob - kernel/src/bbtkWxGUIPackageBrowser2.cxx
c471f371839bb0d78a2aa177fb644696cd12d701
[bbtk.git] / kernel / src / bbtkWxGUIPackageBrowser2.cxx
1 /*=========================================================================                                                                               
2   Program:   bbtk
3   Module:    $RCSfile: bbtkWxGUIPackageBrowser2.cxx,v $
4   Language:  C++
5   Date:      $Date: 2010/03/26 14:03:32 $
6   Version:   $Revision: 1.16 $
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           wxString text = this->GetItemText(event.GetIndex());
249           wxListItem info;
250           info.m_itemId = event.m_itemIndex;
251           info.m_col = 0;
252           info.m_mask = wxLIST_MASK_DATA;
253           if ( GetItem(info) )
254           {
255                   // TO DO : STORE SMART PTR ?
256                   BlackBoxDescriptor* d = (BlackBoxDescriptor*)(info.GetData());
257                   if (d!=0)
258                   {
259                           //mUser->WxGUIBlackBoxListUserOnSelected(d);
260                           //text = d->GetAuthor();
261                   }
262           }
263           else
264           {
265                   wxFAIL_MSG(wxT("wxListCtrl::GetItem() failed"));
266           }
267
268
269           //wxTextDataObject tdo(wxString::Format("%s %d",text,123456));
270           //wxDropSource tds(tdo, this);
271           //tds.DoDragDrop();
272     //    const wxPoint& pt = event.m_pointDrag;
273
274     //wxLogMessage( wxT("OnBeginDrag at (%d, %d), item %ld."),
275     //          pt.x, pt.y, HitTest(pt, flags) );
276   }
277
278   void WxGUIBlackBoxList::OnBeginRDrag(wxListEvent& event)
279   {
280     //wxLogMessage( wxT("OnBeginRDrag at %d,%d."),
281     //        event.m_pointDrag.x, event.m_pointDrag.y );
282   }
283
284   void WxGUIBlackBoxList::OnBeginLabelEdit(wxListEvent& event)
285   {
286     //wxLogMessage( wxT("OnBeginLabelEdit: %s"), event.m_item.m_text.c_str());
287   }
288
289   void WxGUIBlackBoxList::OnEndLabelEdit(wxListEvent& event)
290   {
291     //wxLogMessage( wxT("OnEndLabelEdit: %s"),
292     //        event.IsEditCancelled() ? _T("[cancelled]")
293     //                                      : event.m_item.m_text.c_str());
294   }
295
296   void WxGUIBlackBoxList::OnDeleteItem(wxListEvent& event)
297   {
298     LogEvent(event, _T("OnDeleteItem"));
299     std::cout << "cannot del"<<std::endl;
300     event.Veto();
301     //wxLogMessage( wxT("Number of items when delete event is sent: %d"), GetItemCount() );
302   }
303
304   void WxGUIBlackBoxList::OnDeleteAllItems(wxListEvent& event)
305   {
306     LogEvent(event, _T("OnDeleteAllItems"));
307     event.Veto();
308   }
309
310 #if WXWIN_COMPATIBILITY_2_4
311   void WxGUIBlackBoxList::OnGetInfo(wxListEvent& event)
312   {
313     wxString msg;
314
315     msg << _T("OnGetInfo (") << event.m_item.m_itemId << _T(", ") << event.m_item.m_col << _T(")");
316     if ( event.m_item.m_mask & wxLIST_MASK_STATE )
317       msg << _T(" wxLIST_MASK_STATE");
318     if ( event.m_item.m_mask & wxLIST_MASK_TEXT )
319       msg << _T(" wxLIST_MASK_TEXT");
320     if ( event.m_item.m_mask & wxLIST_MASK_IMAGE )
321       msg << _T(" wxLIST_MASK_IMAGE");
322     if ( event.m_item.m_mask & wxLIST_MASK_DATA )
323       msg << _T(" wxLIST_MASK_DATA");
324     if ( event.m_item.m_mask & wxLIST_SET_ITEM )
325       msg << _T(" wxLIST_SET_ITEM");
326     if ( event.m_item.m_mask & wxLIST_MASK_WIDTH )
327       msg << _T(" wxLIST_MASK_WIDTH");
328     if ( event.m_item.m_mask & wxLIST_MASK_FORMAT )
329       msg << _T(" wxLIST_MASK_WIDTH");
330
331     if ( event.m_item.m_mask & wxLIST_MASK_TEXT )
332       {
333         event.m_item.m_text = _T("My callback text");
334       }
335
336     //wxLogMessage(msg);
337   }
338
339   void WxGUIBlackBoxList::OnSetInfo(wxListEvent& event)
340   {
341     LogEvent(event, _T("OnSetInfo"));
342   }
343 #endif
344
345   void WxGUIBlackBoxList::OnSelected(wxListEvent& event)
346   {
347     if (mUser==0) return;
348
349     wxListItem info;
350     info.m_itemId = event.m_itemIndex;
351     info.m_col = 0;
352     info.m_mask = wxLIST_MASK_DATA;
353     if ( GetItem(info) )
354       {
355         // TO DO : STORE SMART PTR ?
356         BlackBoxDescriptor* d = (BlackBoxDescriptor*)(info.GetData());
357         if (d!=0) mUser->WxGUIBlackBoxListUserOnSelected(d);
358       }
359     else
360       {
361         wxFAIL_MSG(wxT("wxListCtrl::GetItem() failed"));
362       }
363   }
364
365   void WxGUIBlackBoxList::OnDeselected(wxListEvent& event)
366   {
367     LogEvent(event, _T("OnDeselected"));
368   }
369
370   void WxGUIBlackBoxList::OnActivated(wxListEvent& event)
371   {
372     LogEvent(event, _T("OnActivated"));
373   }
374
375   void WxGUIBlackBoxList::OnFocused(wxListEvent& event)
376   {
377     LogEvent(event, _T("OnFocused"));
378
379     event.Skip();
380   }
381
382   void WxGUIBlackBoxList::OnListKeyDown(wxListEvent& event)
383   {
384     long item;
385
386     switch ( event.GetKeyCode() )
387       {
388       case 'c': // colorize
389       case 'C':
390         {
391           wxListItem info;
392           info.m_itemId = event.GetIndex();
393           if ( info.m_itemId == -1 )
394             {
395               // no item
396               break;
397             }
398
399           GetItem(info);
400
401           wxListItemAttr *attr = info.GetAttributes();
402           if ( !attr || !attr->HasTextColour() )
403             {
404               info.SetTextColour(*wxCYAN);
405
406               SetItem(info);
407
408               RefreshItem(info.m_itemId);
409             }
410         }
411         break;
412
413       case 'n': // next
414       case 'N':
415         item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED);
416         if ( item++ == GetItemCount() - 1 )
417           {
418             item = 0;
419           }
420
421         //wxLogMessage(_T("Focusing item %ld"), item);
422
423         SetItemState(item, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED);
424         EnsureVisible(item);
425         break;
426
427       case 'r': // show bounding Rect
428       case 'R':
429         {
430           item = event.GetIndex();
431           wxRect r;
432           if ( !GetItemRect(item, r) )
433             {
434               //wxLogError(_T("Failed to retrieve rect of item %ld"), item);
435               break;
436             }
437
438           //wxLogMessage(_T("Bounding rect of item %ld is (%d, %d)-(%d, %d)"),
439           //   item, r.x, r.y, r.x + r.width, r.y + r.height);
440         }
441         break;
442
443       case WXK_DELETE:
444         item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
445         /*
446           while ( item != -1 )
447           {
448           DeleteItem(item);
449
450           //wxLogMessage(_T("Item %ld deleted"), item);
451
452           // -1 because the indices were shifted by DeleteItem()
453           item = GetNextItem(item - 1,
454           wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
455           }
456         */
457         break;
458
459       case WXK_INSERT:
460         if ( GetWindowStyle() & wxLC_REPORT )
461           {
462             if ( GetWindowStyle() & wxLC_VIRTUAL )
463               {
464                 SetItemCount(GetItemCount() + 1);
465               }
466             else // !virtual
467               {
468                 //InsertItemInReportView(event.GetIndex());
469               }
470           }
471         //else: fall through
472
473       default:
474         LogEvent(event, _T("OnListKeyDown"));
475
476         event.Skip();
477       }
478   }
479
480   void WxGUIBlackBoxList::OnChar(wxKeyEvent& event)
481   {
482     //wxLogMessage(_T("Got char event."));
483
484     switch ( event.GetKeyCode() )
485       {
486       case 'n':
487       case 'N':
488       case 'c':
489       case 'C':
490         // these are the keys we process ourselves
491         break;
492
493       default:
494         event.Skip();
495       }
496   }
497
498   void WxGUIBlackBoxList::OnRightClick(wxMouseEvent& event)
499   {
500     if ( !event.ControlDown() )
501       {
502         event.Skip();
503         return;
504       }
505
506     int flags;
507     long subitem;
508     //    long item = 
509     HitTest(event.GetPosition(), flags, &subitem);
510
511     wxString where;
512     switch ( flags )
513       {
514       case wxLIST_HITTEST_ABOVE: where = _T("above"); break;
515       case wxLIST_HITTEST_BELOW: where = _T("below"); break;
516       case wxLIST_HITTEST_NOWHERE: where = _T("nowhere near"); break;
517       case wxLIST_HITTEST_ONITEMICON: where = _T("on icon of"); break;
518       case wxLIST_HITTEST_ONITEMLABEL: where = _T("on label of"); break;
519       case wxLIST_HITTEST_ONITEMRIGHT: where = _T("right on"); break;
520       case wxLIST_HITTEST_TOLEFT: where = _T("to the left of"); break;
521       case wxLIST_HITTEST_TORIGHT: where = _T("to the right of"); break;
522       default: where = _T("not clear exactly where on"); break;
523       }
524
525     //wxLogMessage(_T("Right double click %s item %ld, subitem %ld"),
526     //             where.c_str(), item, subitem);
527   }
528
529   void WxGUIBlackBoxList::LogEvent(const wxListEvent& event, const wxChar *eventName)
530   {
531     //wxLogMessage(_T("Item %ld: %s (item text = %s, data = %ld)"),
532     //            event.GetIndex(), eventName,
533     //              event.GetText().c_str(), event.GetData());
534   }
535
536   wxString WxGUIBlackBoxList::OnGetItemText(long item, long column) const
537   {
538     /*
539       if ( GetItemCount() == WXSIZEOF(SMALL_VIRTUAL_VIEW_ITEMS) )
540       {
541       return SMALL_VIRTUAL_VIEW_ITEMS[item][column];
542       }
543       else
544       {
545     */
546     return wxString::Format(_T("Column %ld of item %ld"), column, item);
547     //  }
548   }
549
550   int WxGUIBlackBoxList::OnGetItemColumnImage(long item, long column) const
551   {
552     if (!column)
553       return 0;
554
555     if (!(item %3) && column == 1)
556       return 0;
557
558     return -1;
559   }
560
561   wxListItemAttr *WxGUIBlackBoxList::OnGetItemAttr(long item) const
562   {
563     return item % 2 ? NULL : (wxListItemAttr *)&m_attr;
564   }
565
566
567 #if USE_CONTEXT_MENU
568   void WxGUIBlackBoxList::OnContextMenu(wxContextMenuEvent& event)
569   {
570     wxPoint point = event.GetPosition();
571     // If from keyboard
572     if (point.x == -1 && point.y == -1) {
573       wxSize size = GetSize();
574       point.x = size.x / 2;
575       point.y = size.y / 2;
576     } else {
577       point = ScreenToClient(point);
578     }
579     ShowContextMenu(point);
580   }
581 #endif
582
583   void WxGUIBlackBoxList::ShowContextMenu(const wxPoint& pos)
584   {
585     wxMenu menu;
586   
587     menu.Append(wxID_ABOUT, _T("&About"));
588     menu.AppendSeparator();
589     menu.Append(wxID_EXIT, _T("E&xit"));
590   
591     PopupMenu(&menu, pos.x, pos.y);
592   }
593   //================================================================
594
595
596
597   //================================================================
598   WxGUIBlackBoxInfo::WxGUIBlackBoxInfo(wxWindow* parent)
599     :
600     wxPanel(parent, -1),
601     mDescriptor()
602   {
603     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
604     
605     //    mName = new wxStaticText(this,-1,_T(""));
606     //    sizer->Add(mName,0,wxGROW);
607     mDescription = new wxStaticText(this,-1,_T(""));
608     sizer->Add(mDescription,0,wxGROW);
609     mAuthor = new wxStaticText(this,-1,_T(""));
610     sizer->Add(mAuthor,0,wxGROW);
611     mCategory = new wxStaticText(this,-1,_T(""));
612     sizer->Add(mCategory,0,wxGROW);
613
614
615     wxBoxSizer *inputs = 
616       new wxStaticBoxSizer
617       ( new wxStaticBox(this, wxID_ANY, _T("Inputs")), wxVERTICAL );    
618     mInputList = new wxListCtrl(this, -1,
619                                 wxDefaultPosition,
620                                 wxDefaultSize,
621                                 wxLC_REPORT //wxLC_LIST
622                                 | wxSUNKEN_BORDER);
623     
624     
625     inputs->Add(mInputList,1,wxGROW);
626     sizer->Add(inputs,1,wxGROW);
627
628     wxBoxSizer *outputs = 
629       new wxStaticBoxSizer
630       ( new wxStaticBox(this, wxID_ANY, _T("Outputs")), wxVERTICAL );    
631     mOutputList = new wxListCtrl(this, -1,
632                                  wxDefaultPosition,
633                                  wxDefaultSize,
634                                  wxLC_REPORT //wxLC_LIST
635                                  | wxSUNKEN_BORDER);
636     
637     outputs->Add(mOutputList,1,wxGROW);
638     sizer->Add(outputs,1,wxGROW);
639     
640     
641     SetSizer(sizer);
642     SetAutoLayout(true);
643     Layout();
644   }
645   //================================================================
646
647     
648   //================================================================
649   void WxGUIBlackBoxInfo::UpdateInfo(BlackBoxDescriptor* descr)
650   {
651
652     //    mName->SetLabel(std2wx(descr->GetTypeName()));
653     mDescription->SetLabel(std2wx(descr->GetDescription()));
654     mAuthor->SetLabel(std2wx(descr->GetAuthor()));
655     mCategory->SetLabel(std2wx(descr->GetCategory()));
656     
657     mInputList->ClearAll();
658     mInputList->InsertColumn( 0, _("Name"), 
659                                wxLIST_FORMAT_LEFT, 80  ); 
660     mInputList->InsertColumn( 1, _("Type"), 
661                                wxLIST_FORMAT_LEFT, 100 ); 
662     mInputList->InsertColumn( 2, _("Nature"), 
663                                wxLIST_FORMAT_LEFT, 100  ); 
664     mInputList->InsertColumn( 3, _("Description"), 
665                                wxLIST_FORMAT_LEFT, 500  ); 
666
667     mOutputList->ClearAll();
668     mOutputList->InsertColumn( 0, _("Name"), 
669                                wxLIST_FORMAT_LEFT, 80  ); 
670     mOutputList->InsertColumn( 1, _("Type"), 
671                                wxLIST_FORMAT_LEFT, 100 ); 
672     mOutputList->InsertColumn( 2, _("Nature"), 
673                                wxLIST_FORMAT_LEFT, 100  ); 
674     mOutputList->InsertColumn( 3, _("Description"), 
675                                wxLIST_FORMAT_LEFT, 500  ); 
676     
677
678     std::vector<BlackBoxInputOutputDescriptor*> user_defined;
679     std::vector<BlackBoxInputOutputDescriptor*> ubb_defined;
680     std::vector<BlackBoxInputOutputDescriptor*> wxbb_defined;
681     
682     const BlackBoxDescriptor::InputDescriptorMapType& imap = 
683       descr->GetInputDescriptorMap();
684     BlackBoxDescriptor::InputDescriptorMapType::const_iterator in;
685     for ( in = imap.begin();  in != imap.end(); ++in ) 
686       {
687         int iotype = 0;
688         if (in->second->GetCreatorTypeInfo() == 
689             typeid(AtomicBlackBoxDescriptor))
690           {
691             iotype = 1;
692           }
693         else if (in->second->GetCreatorTypeInfo() == 
694                  typeid(WxBlackBoxDescriptor))
695           {
696             iotype = 2;
697           }
698         if (iotype==0) user_defined.push_back(in->second);
699         else if (iotype==1) ubb_defined.push_back(in->second);
700         else if (iotype==2) wxbb_defined.push_back(in->second);
701         
702       }
703
704     std::vector<BlackBoxInputOutputDescriptor*>::iterator hi;
705     for (hi=user_defined.begin();hi!=user_defined.end();++hi) 
706       {
707         InsertInputOutput(mInputList,*hi);
708       }
709     for (hi=wxbb_defined.begin();hi!=wxbb_defined.end();++hi) 
710       {
711         InsertInputOutput(mInputList,*hi);
712       }
713     for (hi=ubb_defined.begin();hi!=ubb_defined.end();++hi) 
714       {
715         InsertInputOutput(mInputList,*hi);
716       }
717     
718     // Outputs
719     user_defined.clear();
720     ubb_defined.clear();
721     wxbb_defined.clear();
722     const BlackBoxDescriptor::OutputDescriptorMapType& omap = 
723       descr->GetOutputDescriptorMap();
724     BlackBoxDescriptor::OutputDescriptorMapType::const_iterator out;
725     for ( out = omap.begin();  out != omap.end(); ++out ) 
726       {
727         int iotype = 0;
728         if (out->second->GetCreatorTypeInfo() == 
729             typeid(AtomicBlackBoxDescriptor))
730           {
731             iotype = 1;
732           }
733         else if (out->second->GetCreatorTypeInfo() == 
734                  typeid(WxBlackBoxDescriptor))
735           {
736             iotype = 2;
737           }
738        
739         if (iotype==0) user_defined.push_back(out->second);
740         else if (iotype==1) ubb_defined.push_back(out->second);
741         else if (iotype==2) wxbb_defined.push_back(out->second);
742
743       }
744     for (hi=user_defined.begin();hi!=user_defined.end();++hi) 
745       {
746         InsertInputOutput(mOutputList,*hi);
747       }
748     for (hi=wxbb_defined.begin();hi!=wxbb_defined.end();++hi) 
749       {
750         InsertInputOutput(mOutputList,*hi);
751       }
752     for (hi=ubb_defined.begin();hi!=ubb_defined.end();++hi) 
753       {
754         InsertInputOutput(mOutputList,*hi);
755       }
756   }
757   //================================================================
758
759
760   //================================================================
761   void WxGUIBlackBoxInfo::InsertInputOutput(wxListCtrl* l,
762                                             BlackBoxInputOutputDescriptor* d)
763   {
764     wxListItem kNewItem;
765     kNewItem.SetAlign(wxLIST_FORMAT_LEFT);
766     int nID = l->GetItemCount();
767     //    std::cout << nID << std::endl;
768     kNewItem.SetId(nID);
769     //    kNewItem.SetMask(wxLIST_MASK_DATA);
770     //    kNewItem.SetData(d);  
771     l->InsertItem(kNewItem);
772     l->SetItem(nID, 0, std2wx(d->GetName()) );
773     l->SetItem(nID, 1, std2wx(d->GetTypeName()) );
774     l->SetItem(nID, 2, std2wx(d->GetNature()) );
775     l->SetItem(nID, 3, std2wx(d->GetDescription()) );
776   }
777   //================================================================
778
779   //================================================================
780   WxGUIBlackBoxInfo::~WxGUIBlackBoxInfo()
781   {
782   }
783   //================================================================
784
785
786  enum 
787     {
788       id_f1,
789       id_f2,
790       id_f3,
791       id_f4,
792       id_f5,
793       id_f6,
794       id_f7,
795       id_f8,
796       id_fc1,
797       id_fc2,
798       id_fc3
799     };
800
801
802   //================================================================
803   WxGUIPackageBrowser2::WxGUIPackageBrowser2( wxWindow *parent,
804                                               WxGUIPackageBrowser2User* user )
805     : wxPanel(parent, -1),
806       mUser(user),
807       mInterpreter()
808   {
809     m_mgr.SetManagedWindow(this);
810
811     //    wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
812     mBoxList = new WxGUIBlackBoxList(this, LIST_CTRL,
813                                      wxDefaultPosition,
814                                      wxDefaultSize,
815                                      wxLC_REPORT //wxLC_LIST
816                                      | wxSUNKEN_BORDER);
817     mBoxList->SetUser(this);
818     mBoxList->SetBackgroundColour(*wxWHITE);
819
820     m_mgr.AddPane(mBoxList,
821                   wxAuiPaneInfo().Name(wxT("BoxList"))
822                   .Caption(wxT("Black Boxes"))
823                   .MinimizeButton(true)
824                   .MaximizeButton(true)
825                   .Center()
826                   .MinSize(wxSize(100,100))
827                   );     
828     //    sizer->Add(mBoxList,5,wxGROW);
829
830     mBoxInfo = new WxGUIBlackBoxInfo(this);
831     //    sizer->Add(mBoxInfo,3,wxGROW);
832
833     m_mgr.AddPane(mBoxInfo,
834                   wxAuiPaneInfo().Name(wxT("Box"))
835                   .Caption(wxT(""))
836                   .MinimizeButton(true)
837                   .MaximizeButton(true)
838                   .Bottom()
839                   .MinSize(wxSize(100,300))
840                   );     
841     
842
843     wxPanel* filters = new wxPanel(this,-1);
844     wxBoxSizer *fsizer = new wxBoxSizer(wxVERTICAL );    
845     wxBoxSizer *fpack = 
846       new wxStaticBoxSizer
847       ( new wxStaticBox(filters, wxID_ANY, _T("Package")), wxHORIZONTAL );    
848     mPackageFilter = new wxTextCtrl(filters,id_f1,_T(""),
849                                     wxDefaultPosition,
850                                     wxDefaultSize,
851                                     wxTE_PROCESS_ENTER);
852     fpack->Add(mPackageFilter,1,wxGROW);
853     fsizer->Add(fpack,0,wxGROW);
854     wxBoxSizer *fname = 
855       new wxStaticBoxSizer
856       ( new wxStaticBox(filters, wxID_ANY, _T("Name")), wxHORIZONTAL );    
857     mNameFilter = new wxTextCtrl(filters,id_f2,_T(""),
858                                     wxDefaultPosition,
859                                     wxDefaultSize,
860                                     wxTE_PROCESS_ENTER);
861     fname->Add(mNameFilter,1,wxGROW);
862     fsizer->Add(fname,0,wxGROW);
863     wxBoxSizer *fdescr = 
864       new wxStaticBoxSizer
865       ( new wxStaticBox(filters, wxID_ANY, _T("Description")), wxHORIZONTAL );
866     mDescriptionFilter = new wxTextCtrl(filters,id_f3,_T(""),
867                                     wxDefaultPosition,
868                                     wxDefaultSize,
869                                     wxTE_PROCESS_ENTER);
870     fdescr->Add(mDescriptionFilter,1,wxGROW);
871     fsizer->Add(fdescr,0,wxGROW);
872     wxBoxSizer *fcat = 
873       new wxStaticBoxSizer
874       ( new wxStaticBox(filters, wxID_ANY, _T("Category")), wxHORIZONTAL );    
875     mCategoryFilter = new wxTextCtrl(filters,id_f4,_T(""),
876                                     wxDefaultPosition,
877                                     wxDefaultSize,
878                                     wxTE_PROCESS_ENTER);
879     fcat->Add(mCategoryFilter,1,wxGROW);
880     fsizer->Add(fcat,0,wxGROW);
881     wxBoxSizer *fintype = 
882       new wxStaticBoxSizer
883       ( new wxStaticBox(filters, wxID_ANY, _T("Input type")), wxHORIZONTAL );
884     mInputTypeFilter = new wxTextCtrl(filters,id_f5,_T(""),
885                                     wxDefaultPosition,
886                                     wxDefaultSize,
887                                     wxTE_PROCESS_ENTER);
888     fintype->Add(mInputTypeFilter,1,wxGROW);
889     fsizer->Add(fintype,0,wxGROW);
890     wxBoxSizer *fouttype = 
891       new wxStaticBoxSizer
892       ( new wxStaticBox(filters, wxID_ANY, _T("Output type")), wxHORIZONTAL );
893     mOutputTypeFilter = new wxTextCtrl(filters,id_f6,_T(""),
894                                     wxDefaultPosition,
895                                     wxDefaultSize,
896                                     wxTE_PROCESS_ENTER);
897     fouttype->Add(mOutputTypeFilter,1,wxGROW);
898     fsizer->Add(fouttype,0,wxGROW);
899     wxBoxSizer *finnat = 
900       new wxStaticBoxSizer
901       ( new wxStaticBox(filters, wxID_ANY, _T("Input nature")),wxHORIZONTAL ); 
902     mInputNatureFilter = new wxTextCtrl(filters,id_f7,_T(""),
903                                         wxDefaultPosition,
904                                         wxDefaultSize,
905                                         wxTE_PROCESS_ENTER);
906     finnat->Add(mInputNatureFilter,1,wxGROW);
907     fsizer->Add(finnat,0,wxGROW);
908     wxBoxSizer *foutnat = 
909       new wxStaticBoxSizer
910       ( new wxStaticBox(filters, wxID_ANY,_T("Output nature")),wxHORIZONTAL ); 
911     mOutputNatureFilter = new wxTextCtrl(filters,id_f8,_T(""),
912                                         wxDefaultPosition,
913                                         wxDefaultSize,
914                                         wxTE_PROCESS_ENTER);
915     foutnat->Add(mOutputNatureFilter,1,wxGROW);
916     fsizer->Add(foutnat,0,wxGROW);
917
918
919     mShowWidgetsFilter = new wxCheckBox(filters,id_fc1,_T("Show widgets"));
920     mShowWidgetsFilter->SetValue(true);
921     fsizer->Add(mShowWidgetsFilter,0,wxGROW);
922
923     mShowAdaptorsFilter = new wxCheckBox(filters,id_fc2,_T("Show adaptors"));
924     mShowAdaptorsFilter->SetValue(false);
925     fsizer->Add(mShowAdaptorsFilter,0,wxGROW);
926
927     mShowGUIsFilter = new wxCheckBox(filters,id_fc3,_T("Show GUIs"));
928     mShowGUIsFilter->SetValue(false);
929     fsizer->Add(mShowGUIsFilter,0,wxGROW);
930
931     filters->SetSizer(fsizer);
932
933     m_mgr.AddPane(filters,
934                   wxAuiPaneInfo().Name(wxT("Filter"))
935                   .Caption(wxT("Filter"))
936                   .MinimizeButton(true)
937                   .MaximizeButton(true)
938                   .Right()
939                   .MinSize(wxSize(100,100)) );
940
941     
942
943     //    sizer->Add(fsizer,1,wxGROW);
944     m_mgr.Update();
945
946     //    SetSizer(sizer);
947     SetAutoLayout(true);
948     Layout();
949     
950   }
951   //================================================================
952
953   //================================================================
954   void WxGUIPackageBrowser2::OnFilter(wxCommandEvent&)
955   {
956     RebuildList();
957   }
958   //================================================================
959
960   //================================================================
961   // User callback when a box is selected in the list 
962   void WxGUIPackageBrowser2::WxGUIBlackBoxListUserOnSelected
963   ( BlackBoxDescriptor* d)
964   {
965         //RaC
966         _actualSelected=d;
967
968     mBoxInfo->UpdateInfo(d);
969     std::string title = d->GetPackage()->GetName()+"::"+d->GetTypeName();
970     m_mgr.GetPane(mBoxInfo).Caption(std2wx(title));
971     m_mgr.Update();
972   }
973   
974   //================================================================
975
976   //================================================================
977   BlackBoxDescriptor* WxGUIPackageBrowser2::GetActualSelected()
978   {
979           return _actualSelected;
980   }
981
982
983   //================================================================
984
985   //================================================================
986   WxGUIPackageBrowser2::~WxGUIPackageBrowser2()
987   {
988     mFactory.reset();
989     mInterpreter.reset();
990     //    Object::PrintObjectListInfo("");
991     m_mgr.UnInit();
992   }
993   //================================================================
994
995   //================================================================
996   void WxGUIPackageBrowser2::IncludeAll()
997   {
998     if (!mInterpreter) mInterpreter =bbtk::Interpreter::New();
999     mInterpreter->SetCommandLine(true);
1000     std::stringstream* buf = new std::stringstream;
1001     *buf << "exec freeze_no_error" << std::endl;
1002     *buf << "message max 0" << std::endl; 
1003     *buf << "include *" << std::endl;
1004     mInterpreter->InterpretBuffer(buf);
1005
1006     Factory::Pointer F = mInterpreter->GetExecuter()->GetFactory();
1007     BuildFromFactory(F);
1008   }
1009   //================================================================
1010
1011   //================================================================
1012   void WxGUIPackageBrowser2::BuildFromFactory(Factory::Pointer F)
1013   {
1014     mFactory = F;
1015     RebuildList();
1016   }  
1017
1018   //================================================================
1019
1020   //================================================================
1021   void WxGUIPackageBrowser2::RebuildList()
1022   {
1023     mBoxList->Hide();
1024     mBoxList->ClearAll();    
1025     
1026     const Factory::PackageMapType& M = mFactory->GetPackageMap();
1027     Factory::PackageMapType::const_iterator i;
1028     for (i=M.begin();i!=M.end();++i)
1029       {
1030         Package::Pointer P = i->second;
1031         if (P->GetName() == "user") continue;
1032         
1033         Package::DescriptorMapType::iterator j;
1034         for (j=P->GetDescriptorMap().begin();
1035              j!=P->GetDescriptorMap().end();
1036              ++j)
1037           {
1038             //      std::cout << "Insert "<<j->second->GetTypeName()<<std::endl;
1039             if (IsVisible(j->second))
1040               mBoxList->Insert(j->second);
1041           }
1042       }
1043     mBoxList->Show();
1044   }
1045   //================================================================
1046
1047   //================================================================
1048   bool WxGUIPackageBrowser2::IsVisible(BlackBoxDescriptor::Pointer d)
1049   {
1050     //    std::cout << "   '" << wx2std(mPackageFilter->GetValue())<<"'"<<std::endl;
1051     //    std::cout << "vs '" << d->GetPackage()->GetName() << "'"<<std::endl;
1052     if ((!mShowAdaptorsFilter->IsChecked())&&
1053         ((d->GetKind()==BlackBoxDescriptor::ADAPTOR)||
1054          (d->GetKind()==BlackBoxDescriptor::DEFAULT_ADAPTOR)))
1055       return false;
1056     if ((!mShowGUIsFilter->IsChecked())&&
1057         ((d->GetKind()==BlackBoxDescriptor::GUI)||
1058          (d->GetKind()==BlackBoxDescriptor::DEFAULT_GUI)))
1059       return false;
1060     if (d->GetPackage()->GetName().find( wx2std(mPackageFilter->GetValue()) ) 
1061         == std::string::npos ) return false;
1062    if (d->GetTypeName().find( wx2std(mNameFilter->GetValue()) ) 
1063         == std::string::npos ) return false;
1064    if (d->GetDescription().find( wx2std(mDescriptionFilter->GetValue()) ) 
1065         == std::string::npos ) return false;
1066    if (d->GetCategory().find( wx2std(mCategoryFilter->GetValue()) ) 
1067         == std::string::npos ) return false;
1068    if (!mShowWidgetsFilter->IsChecked())
1069      {
1070        bool found = false;
1071        const BlackBoxDescriptor::OutputDescriptorMapType& imap = 
1072          d->GetOutputDescriptorMap();
1073        BlackBoxDescriptor::OutputDescriptorMapType::const_iterator in;
1074        for ( in = imap.begin();  in != imap.end(); ++in ) 
1075          {
1076            if (in->second->GetName() == "Widget" )
1077              {
1078                found = true;
1079                break;
1080              }
1081          }
1082        if (found) return false;
1083      }
1084    if (mInputTypeFilter->GetValue().size()>0)
1085      {
1086        std::string s = wx2std(mInputTypeFilter->GetValue());
1087        bool found = false;
1088        const BlackBoxDescriptor::InputDescriptorMapType& imap = 
1089          d->GetInputDescriptorMap();
1090        BlackBoxDescriptor::InputDescriptorMapType::const_iterator in;
1091        for ( in = imap.begin();  in != imap.end(); ++in ) 
1092          {
1093            if (in->second->GetTypeName().find(s)!=std::string::npos)
1094              {
1095                found = true;
1096                break;
1097              }
1098          }
1099        if (!found) return false;
1100      }
1101    if (mOutputTypeFilter->GetValue().size()>0)
1102      {
1103        std::string s = wx2std(mOutputTypeFilter->GetValue());
1104        bool found = false;
1105        const BlackBoxDescriptor::OutputDescriptorMapType& imap = 
1106          d->GetOutputDescriptorMap();
1107        BlackBoxDescriptor::OutputDescriptorMapType::const_iterator in;
1108        for ( in = imap.begin();  in != imap.end(); ++in ) 
1109          {
1110            if (in->second->GetTypeName().find(s)!=std::string::npos)
1111              {
1112                found = true;
1113                break;
1114              }
1115          }
1116        if (!found) return false;
1117      }
1118    if (mInputNatureFilter->GetValue().size()>0)
1119      {
1120        std::string s = wx2std(mInputNatureFilter->GetValue());
1121        bool found = false;
1122        const BlackBoxDescriptor::InputDescriptorMapType& imap = 
1123          d->GetInputDescriptorMap();
1124        BlackBoxDescriptor::InputDescriptorMapType::const_iterator in;
1125        for ( in = imap.begin();  in != imap.end(); ++in ) 
1126          {
1127            if (in->second->GetNature().find(s)!=std::string::npos)
1128              {
1129                found = true;
1130                break;
1131              }
1132          }
1133        if (!found) return false;
1134      }
1135    if (mOutputNatureFilter->GetValue().size()>0)
1136      {
1137        std::string s = wx2std(mOutputNatureFilter->GetValue());
1138        bool found = false;
1139        const BlackBoxDescriptor::OutputDescriptorMapType& imap = 
1140          d->GetOutputDescriptorMap();
1141        BlackBoxDescriptor::OutputDescriptorMapType::const_iterator in;
1142        for ( in = imap.begin();  in != imap.end(); ++in ) 
1143          {
1144            if (in->second->GetNature().find(s)!=std::string::npos)
1145              {
1146                found = true;
1147                break;
1148              }
1149          }
1150        if (!found) return false;
1151      }
1152
1153     return true;
1154   }
1155   //========================================================================
1156
1157   //========================================================================
1158   BEGIN_EVENT_TABLE(WxGUIPackageBrowser2, wxPanel)
1159     EVT_TEXT_ENTER(id_f1, WxGUIPackageBrowser2::OnFilter )
1160     EVT_TEXT_ENTER(id_f2, WxGUIPackageBrowser2::OnFilter )
1161     EVT_TEXT_ENTER(id_f3, WxGUIPackageBrowser2::OnFilter )
1162     EVT_TEXT_ENTER(id_f4, WxGUIPackageBrowser2::OnFilter )
1163     EVT_TEXT_ENTER(id_f5, WxGUIPackageBrowser2::OnFilter )
1164     EVT_TEXT_ENTER(id_f6, WxGUIPackageBrowser2::OnFilter )
1165     EVT_TEXT_ENTER(id_f7, WxGUIPackageBrowser2::OnFilter )
1166     EVT_TEXT_ENTER(id_f8, WxGUIPackageBrowser2::OnFilter )
1167     EVT_CHECKBOX(  id_fc1, WxGUIPackageBrowser2::OnFilter )
1168     EVT_CHECKBOX(  id_fc2, WxGUIPackageBrowser2::OnFilter )
1169     EVT_CHECKBOX(  id_fc3, WxGUIPackageBrowser2::OnFilter )
1170     END_EVENT_TABLE()
1171   //========================================================================
1172
1173
1174
1175   //================================================================
1176   WxGUIPackageBrowser2Window::WxGUIPackageBrowser2Window( wxWindow *parent, 
1177                                                             wxString title, 
1178                                                             wxSize size)
1179       : wxFrame((wxFrame *)parent, -1, title, wxDefaultPosition, size)
1180   {     
1181     
1182     
1183     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
1184
1185     mBrowser = new WxGUIPackageBrowser2(this);
1186     mBrowser->IncludeAll();
1187     sizer->Add(mBrowser,1,wxGROW);
1188     
1189     //    WxGUICommand* com = new WxGUICommand(this,this);
1190     //    sizer->Add(com);
1191     
1192     SetSizer(sizer);
1193
1194      // Creates the parent window of all bbtk windows as a child of this
1195 //    Wx::CreateTopWindow(this);
1196     // Add the method OnWxSignal as a Wx::Signal observer 
1197     //bbtkAddWxSignalObserver(WxGUIPackageBrowser2Window::OnWxSignal);
1198  
1199     SetAutoLayout(true);
1200     Layout();
1201   }
1202   //================================================================
1203
1204   //================================================================
1205   WxGUIPackageBrowser2Window::~WxGUIPackageBrowser2Window()
1206   {
1207   }
1208   //================================================================
1209
1210 } // namespace bbtk
1211
1212
1213 #endif //_USE_WXWIDGETS_