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