]> Creatis software - creaImageIO.git/blob - src/creaImageIOWxTreeView.cpp
c28e00ae518ab5fe5442e63f68ca85305ab14d84
[creaImageIO.git] / src / creaImageIOWxTreeView.cpp
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 #include <creaImageIOWxTreeView.h>
29 #include <creaImageIOGimmickView.h>
30 #include <wx/splitter.h>
31 #include <wx/gdicmn.h>
32 #include <boost/date_time/gregorian/gregorian.hpp>
33 #include <creaImageIOGimmick.h>
34 #ifdef _DEBUG
35 #define new DEBUG_NEW
36 #endif
37 //=====================================================================
38 namespace creaImageIO
39 {
40
41   //=====================================================================
42 }
43 //=====================================================================
44
45 //=====================================================================
46 ///Comparing function for ordering algorithm. Takes parameters as strings.
47 int wxCALLBACK CompareFunctionStrings(long item1, long item2, long sortData)
48 {       
49   creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
50   creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
51
52   const std::string& s1(*(data1->attr));
53   const std::string& s2(*(data2->attr));
54   if(sortData==1)
55     {
56       // inverse the order
57       if (s1 < s2)
58         return 1;
59       if (s1 > s2)
60         return -1;
61       
62       return 0;
63     }
64   else
65     {
66       if (s1 < s2)
67         return -1;
68       if (s1 > s2)
69         return 1;
70       
71       return 0;
72       
73     }
74 }
75 //=====================================================================
76
77 //=====================================================================
78 ///Comparing function for ordering algorithm. Takes parameters as ints.
79 int wxCALLBACK CompareFunctionInts(long item1, long item2, long sortData)
80 {       
81   creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
82   creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
83
84   const std::string& s1(*(data1->attr));
85   const std::string& s2(*(data2->attr));
86
87   int val1=atoi(s1.c_str());
88   int val2=atoi(s2.c_str());
89
90   if(sortData==1)
91     {
92       // inverse the order
93       if (val1 < val2)
94         return 1;
95       if (val1 > val2)
96         return -1;
97       
98       return 0;
99     }
100   else
101     {
102       if (val1 < val2)
103         return -1;
104       if (val1 > val2)
105         return 1;
106
107       return 0;
108       
109     }
110   
111 }
112
113 //=====================================================================
114
115
116 //=====================================================================
117 namespace creaImageIO
118 {
119   //=====================================================================
120   // CTor
121   WxTreeView::WxTreeView(TreeHandler* handler,
122                          GimmickView* gimmick,
123                          wxWindow* parent,
124                          const wxWindowID id)
125     : wxPanel(parent,id),
126       TreeView(handler, gimmick)
127   {
128     GimmickDebugMessage(1,"WxTreeView::WxTreeView"
129                         <<std::endl);
130
131     
132     // Split part below toolbar into notebook for views and panel
133     // for preview, messages...
134     // TO DO : Splitter
135     //    mSplitter = new wxSplitterWindow( this , -1);
136
137     // Global sizer
138     msizer = new wxBoxSizer(wxHORIZONTAL);
139     
140     int ctrl_style = wxLC_REPORT | wxLC_VRULES;
141     int col_style = wxLIST_FORMAT_LEFT;
142
143     // Creating the ListCtrl for the levels > 0 (not for Root level)
144     for (int i = 0;
145          i < handler->GetTree().GetNumberOfLevels() -1;
146          ++i)
147       {
148         GimmickDebugMessage(5,"Creating view for level "<<i
149                             <<std::endl);
150         LevelType level;
151         level.SelectedUpToDate = true;
152         level.SortColumn = 0;
153
154         // If the first level : parent = this
155         wxWindow* sparent = this;
156         // else parent = last splitter
157         if (i>0) 
158                 sparent = mLevelList[i-1].wxSplitter;
159
160         level.wxSplitter = new wxSplitterWindow( sparent , -1);
161         if(i!=0)
162         {
163         level.wxSplitter->Show(false);
164         }
165         //          level.wxSplitter->SetMinimumPaneSize(100);
166         
167         wxListCtrl* ctrl = new wxListCtrl(level.wxSplitter,
168                                           i,
169                                           wxDefaultPosition, 
170                                           wxDefaultSize,
171                                           ctrl_style);
172         level.wxCtrl = ctrl;
173         level.wxSplitter->Initialize(ctrl);
174    
175         // Create the columns : one for each attribute of the level
176         int col = 0;
177         std::string title;
178
179         tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
180         for (a  = handler->GetTree().GetAttributeDescriptorList(i+1).begin();
181              a != handler->GetTree().GetAttributeDescriptorList(i+1).end();
182              ++a)
183
184 {
185         
186             GimmickDebugMessage(5,"Creating column "<<col<<" : "
187                                 <<a->GetName()
188                                 <<std::endl);
189             
190             if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE)
191               {
192                 
193                 if(a->GetName()=="UNKNOWN")
194                   {
195                     title = "#";
196                     title += handler->GetTree().GetLevelDescriptor(i+1).GetName();
197                     if (title[title.size()-1]!='s')
198                       title += "s";
199                     
200                   }
201                 else
202                   {
203                     title=a->GetName();
204                   }
205                   std::string temp = a->GetKey();
206                   if (temp.compare("ID") != 0)
207                   {
208                 
209                 ctrl->InsertColumn(col, 
210                                    crea::std2wx(title),
211                                    col_style);
212                 col++;
213                   }
214                 level.key.push_back(a->GetKey());
215               }
216                 
217           }
218           
219         mLevelList.push_back(level);
220       }
221     
222 #if wxUSE_MENUS
223
224          // Column Menu
225     menu =new wxMenu;
226         wxMenuItem* m1=menu->Append(wxID_ANY, _T("&Sort ascending"));
227         wxMenuItem* m2=menu->Append(wxID_ANY, _T("&Sort descending"));
228         wxMenuItem* m3=menu->Append(wxID_ANY, _T("&Filter"));
229         mAscendingID=m1->GetId();
230         mDescendingID=m2->GetId();
231         mFilterID=m3->GetId();
232         Connect( mAscendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
233         Connect( mDescendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
234         Connect( mFilterID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupFilter) );
235
236
237         ////SubMenuItem EXPORT
238         subExportMenu = new wxMenu;
239         wxMenuItem *subExp1 = subExportMenu->Append(wxID_ANY, _T("&Export to Storage"));
240         Connect( subExp1->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnExportToStorage) );
241
242         //ItemMenu
243         menuItem =new wxMenu;
244
245
246         wxMenuItem* m2Item=menuItem->Append(wxID_ANY, _T("&Local Copy"));
247         wxMenuItem* m3Item=menuItem->Append(wxID_ANY, _T("&Edit Fields"));
248         wxMenuItem* m4Item=menuItem->Append(wxID_ANY, _T("&Display Dicom Tags"));
249         menuItem->AppendSubMenu(subExportMenu, wxT("&Export"));
250
251
252         wxMenuItem* m1Item=menuItem->Append(wxID_ANY, _T("&Anonymize"));
253         mAnonymizingID=m1Item->GetId();
254         Connect( mAnonymizingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnAnonymizer) );
255
256         mLocalCopyID=m2Item->GetId();
257         mEditFieldID=m3Item->GetId();
258         mDumpID=m4Item->GetId();
259         
260         
261         Connect( mLocalCopyID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnLocalCopy) );
262         Connect( mEditFieldID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnEditField) );
263         Connect( mDumpID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnDumpTags) );
264         
265
266         
267 #endif // wxUSE_MENUS
268         /// Initialize the first level splitter
269           
270         msizer->Add( mLevelList[0].wxSplitter ,1, wxGROW  ,0);
271         //      mColumnSelected=1;
272         mLastSelected=0;
273         mLastLevel=0;
274         //      mDirection=true;
275
276         mIgnoreSelectedChanged = false;
277
278         //CreateColorPalette();
279     UpdateLevel(1);
280
281     SetSizer( msizer );     
282     SetAutoLayout(true);
283     Layout();
284
285   }
286   //=====================================================================
287
288   //=====================================================================
289   /// Destructor
290   WxTreeView::~WxTreeView()
291   {
292     GimmickDebugMessage(1,"WxTreeView::~WxTreeView"
293                         <<std::endl);
294         delete menu;
295         delete menuItem;
296
297   }
298   //=====================================================================
299   
300   
301   
302   //=====================================================================
303   const std::vector<tree::Node*>& WxTreeView::GetSelected(int level)
304   {
305           std::vector<tree::Node*>& sel = mLevelList[0].Selected;
306     //  if (GetSelectedUpToDate(level)) 
307     int l = level - 1;
308     // the selection of upper level
309         if(mLevelList.size() == level -1)
310                  sel = mLevelList.back().Selected;
311         else
312                   sel=  mLevelList[l].Selected;
313         if (sel.size() > 0)
314         {
315                 sel.clear();
316         }
317           if (level == 1) 
318       {
319         sel.push_back(GetTreeHandler()->GetTree().GetTree());
320       }
321           else if (level < mLevelList.size()+2 ) 
322     {
323                 long item = -1;
324                 for ( ;; )
325                 {
326                         item = GetCtrl(l-1)->GetNextItem(item,
327                                                                                  wxLIST_NEXT_ALL,
328                                                                                  wxLIST_STATE_SELECTED);
329                         if ( item == -1 )
330                                 break;
331                         long adr = (long)GetCtrl(l-1)->GetItemData(item);
332                         tree::Node* n = ((ItemData*)adr)->node;
333                         /* FCY 18-04-2011: don't understand the real purpose of these lines,
334                          if uncomment add last frame in first place 
335                                 if(mLastSelected==item)
336                         {
337                                 std::vector<tree::Node*>::iterator it;
338                                 it = sel.begin();
339                                 it = sel.insert ( it , n );
340                         }
341                         else
342                         {*/
343                                 
344                                 sel.push_back(n);
345                         //}                     
346                         
347                 }
348                 /*int n = GetCtrl(l-1)->GetItemCount();
349                 for (int i = 0; i<n; i++)
350                 {
351                         std::cout<<GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED)<<std::endl;
352                         if ( GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED))
353                         {
354                                 long adr = GetCtrl(l-1)->GetItemData(i);
355                                 tree::Node* n = ((ItemData*)adr)->node;
356                                 if(mLastSelected==i)
357                                 {
358                                         std::vector<tree::Node*>::iterator it;
359                                         it = sel.begin();
360                                         it = sel.insert ( it , n );
361                                 }
362                                 else
363                                 {
364                                         
365                                         sel.push_back(n);
366                                 }
367                         }
368               }*/
369           }
370         else
371         {
372                 // NOTHING
373         }   
374          
375     //    return mLevelList[level-1].Selected;
376     return sel;
377   }
378
379   //=====================================================================
380   
381   //=====================================================================
382   ///Removes selected nodes on last selected level
383    // NOT SPECIFIC 
384   void WxTreeView::RemoveSelected(std::string &i_save)
385   {
386          bool erase=false;
387          
388          unsigned int tempLevel = mLastLevel;
389     mLastLevel+=1;
390     const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
391         // if no selection, no remove action.
392     if(sel.size() != 0)
393         {
394         
395             std::stringstream out;
396             std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
397             out<<"Delete ";
398             out<<sel.size();
399             if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
400               {
401                 out<<" "<<levelName;
402                 out<<"s?";
403               }
404             else
405               {
406                 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<"?";
407               }
408             if (wxMessageBox(crea::std2wx(out.str()),
409                              _T("Remove Files"),
410                              wxYES_NO,this ) == wxYES)
411               {
412                 erase = true;
413               }
414             if(erase)
415                   {
416             GetGimmickView()->modifyValidationSignal(false);
417                     bool needRefresh=false;
418                     std::vector<tree::Node*>::const_iterator i;
419                     for (i=sel.begin(); i!=sel.end(); ++i)
420                       {
421                         GimmickMessage(1,"deleting '" << (*i)->GetLabel() << "'" << mLastLevel << std::endl );                  
422                         if((*i)->GetParent()->GetNumberOfChildren()<2)
423                           {
424                             needRefresh=true;
425                           }
426                           //tree::Node* n = new (tree::Node*)(*i);
427                           GetTreeHandler()->LoadChildren((*i),4);
428                           GetGimmickView()->AddIgnoreFile(*i);
429                           GetTreeHandler()->Remove(*i);
430                       }
431                     
432                     if(needRefresh && mLastLevel>1)
433                       {
434                         UpdateLevel(mLastLevel-2);
435                       }
436                     else if(mLastLevel>1)
437                       {
438                         UpdateLevel(mLastLevel-1);
439                       }
440                     else
441                       {
442                         UpdateLevel(mLastLevel);
443                       }
444                   }
445         }
446         else
447         {
448                 // no need to incremente level
449                 mLastLevel = tempLevel;
450         }
451     
452         if (erase && mLastLevel == 1 && i_save == "0")
453         {
454         
455                 RemoveAlertDlg *dial = new RemoveAlertDlg(this,  crea::std2wx("Remove files"), wxSize(370,100));
456                 //dial->ShowModal();
457                 if (dial->ShowModal() == wxID_OK)
458                 {
459                         i_save = dial->isChecked() == false? "0" : "1";
460                 }
461                 
462         }
463   }
464   
465   
466   //=====================================================================
467   /// Updates a level of the view (adds or removes children, etc.)
468   void WxTreeView::UpdateLevel( int level )
469   {
470     GimmickDebugMessage(1,
471                         GetTreeHandler()->GetTree().GetLabel()
472                         <<"WxTreeView::UpdateLevel(level "
473                         <<level
474                         <<")"
475                         <<std::endl);
476     
477     wxBusyCursor busy;
478     RecursiveUpdateLevel(level);
479     int i;
480     for (i=0; i<level-1; i++)
481       {
482         if (!GetSplitter(i)->IsSplit()) 
483           GetSplitter(i)->SplitVertically(  GetCtrl(i), GetSplitter(i+1),
484                                             100 );
485       }
486     if (GetSplitter(i)->IsSplit()) GetSplitter(i)->Unsplit();    
487     
488   }
489   //=====================================================================
490   
491   //=====================================================================
492   /// Recursive method called upon by UpdateLevel to refresh all windows
493   void WxTreeView::RecursiveUpdateLevel( int level )
494   {
495     GimmickDebugMessage(1,
496                         GetTreeHandler()->GetTree().GetLabel()
497                         <<"WxTreeView::RecursiveUpdateLevel(level "
498                         <<level
499                         <<")"<<std::endl);
500     
501     
502     const std::vector<tree::Node*>& sel(GetSelected(level));
503     
504     int l = level - 1;
505     
506     // to speed up inserting we hide the control temporarily
507     GetCtrl(l)->Hide();
508     GetCtrl(l)->DeleteAllItems();
509     
510     std::vector<tree::Node*>::const_iterator i;
511     
512     for (i=sel.begin(); i!=sel.end(); ++i)
513       {
514         GimmickDebugMessage(1,
515                             "adding children of '"
516                             <<(*i)->GetLabel()
517                             <<"'"
518                             <<std::endl);
519         int _id=0;
520         
521         //Adds items and sets their attributes 
522         
523         GetTreeHandler()->LoadChildren(*i,1);
524         tree::Node::ChildrenListType::reverse_iterator j;
525         for (j = (*i)->GetChildrenList().rbegin(); 
526              j!= (*i)->GetChildrenList().rend(); 
527              ++j)
528           {
529             GimmickDebugMessage(1,
530                                 "adding children "
531                                 <<(*j)->GetLabel()
532                                 <<"'"
533                                 <<std::endl);
534             
535             wxListItem item;
536             item.SetMask(wxLIST_MASK_STATE | 
537                          wxLIST_MASK_TEXT |
538                          //                      wxLIST_MASK_IMAGE |
539                          wxLIST_MASK_DATA |
540                          //                      wxLIST_MASK_WIDTH |
541                          wxLIST_MASK_FORMAT
542                          );
543             
544                 ItemData* data = new ItemData();
545             data->node = *j;
546             data->id = _id;
547                 
548             item.SetId(_id);
549             item.SetData(data);
550
551             _id++;
552             GetCtrl(l)->InsertItem(item);
553             
554             //Setting attributes
555             for (int k=0; k<GetCtrl(l)->GetColumnCount(); ++k)                          
556               {
557                 std::string val;
558                 //  Temporary correction : it works but no explanation about the problem FCY
559                 
560                 if(k==0 && level <3)
561                 {
562                   val = (*j)->GetAttribute("NumberOfChildren");
563                 }
564                 else
565                   val = (*j)->GetAttribute(mLevelList[l].key[k]);
566                 if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isDateEntry()) // Date
567                   {
568                     //                                    std::cout << "["<<val<< "]" << std::endl;
569                     std::string valtmp(val);
570                     try
571                       {
572                         boost::gregorian::date d1(boost::gregorian::from_undelimited_string(val));                                 
573                         val = to_iso_extended_string(d1);
574                       }
575                     catch (...)
576                       {
577                         val =  valtmp;
578                       }
579                     //                                    std::cout << "["<<val<< "]" << std::endl;     
580                   }
581                 else if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isTimeEntry()) // Time
582                   {
583                     if ((val.size()>6) && 
584                         (val != "" || val != " "))
585                       val = val.substr(0,2) + " : " 
586                         + val.substr(2,2) + " : " 
587                         + val.substr(4,2);
588                   }
589                 else
590                   {
591                     if (val.size()==0) val = "?";
592                   }
593                 if (val.size()==0) val = "X";
594                 item.SetText( crea::std2wx(val));
595                 item.SetColumn(k);
596                   
597                   GetCtrl(l)->SetItem(item);
598                   }
599                 item.Clear();
600             
601           }
602       }
603     
604     SortLevel(l);
605     GetCtrl(l)->Show();
606   }
607   //=====================================================================
608   
609   
610   //================================================================
611   void WxTreeView::OnItemDeSelected(wxListEvent& event)
612   { 
613     GimmickDebugMessage(1,
614                         GetTreeHandler()->GetTree().GetLabel()
615                         <<" WxTreeView::OnItemDeselected"<<std::endl);
616     // retrieve the level
617     wxObject* obj = event.GetEventObject();   
618     unsigned int level = 0;
619     for (level = 0; level<mLevelList.size(); ++level)
620       {
621         if ( GetCtrl(level) == obj ) break;
622       } 
623     SetSelectedUpToDate(level,false);
624     // to allow a first selection in images TreeView
625     if (level==mLevelList.size()-1) 
626       OnItemSelected(event);
627   }
628   //================================================================
629   
630   //================================================================
631   void WxTreeView::OnItemSelected(wxListEvent& event)
632   { 
633           
634     GimmickDebugMessage(1,
635                         GetTreeHandler()->GetTree().GetLabel()
636                         <<" WxTreeView::OnItemSelected"<<std::endl);
637
638     if (mIgnoreSelectedChanged) 
639       {
640         GimmickDebugMessage(1,
641                             " mIgnoreSelectedChanged true: returning"
642                             <<std::endl);
643         return;
644       }
645     
646
647     
648     wxListItem info;
649     info.m_itemId = event.m_itemIndex;
650     mLastSelected = event.m_itemIndex;
651     // retrieve the level
652     wxObject* obj = event.GetEventObject();   
653     unsigned int level = 0;
654     for (level = 0; level<mLevelList.size(); ++level)
655       {
656         if ( GetCtrl(level) == obj ) break;
657       }
658         mLastLevel=level;
659     GimmickDebugMessage(1,
660                         " Level "<<level+1
661                         <<std::endl);
662     
663     // Update the children level (if selection not at last level)
664     if (level<mLevelList.size()-1) 
665       {
666                 
667         UpdateLevel( level + 2 ); 
668         // Reset the viewer setting the default image
669         GetGimmickView()->ClearSelection();
670       }
671     // Select all images if the selection is at series level
672     if (level==mLevelList.size()-2) 
673                 SelectAll(level+1);
674     // Validate selected images if the selection is at image level
675     if (level==(mLevelList.size()-1)) //&&mProcess) 
676       {
677         if(event.GetEventType()==wxEVT_COMMAND_LIST_ITEM_SELECTED)
678           {
679                   ValidateSelectedImages (true);
680           }
681         else
682           {
683                   ValidateSelectedImages (false);
684           }
685       }
686     
687   }
688   //================================================================
689
690   //================================================================
691   void WxTreeView::SelectAll(int level)
692   {
693     long item = -1;
694     //    int level=mLevelList.size()-1;
695     for ( ;; )
696       {
697         item = GetCtrl(level)->GetNextItem(item,
698                                            wxLIST_NEXT_ALL);
699         if ( item == -1 )
700           break;
701         
702         if(item==(GetCtrl(level)->GetItemCount()-1))
703           {
704             mIgnoreSelectedChanged = false;//mProcess=true;
705           }
706         else
707           {
708             mIgnoreSelectedChanged = true;//    mProcess=false;
709           }
710         GetCtrl(level)->SetItemState(item,wxLIST_STATE_SELECTED, wxLIST_MASK_STATE 
711                                      | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT);
712       }
713   }
714
715   //================================================================
716   //================================================================
717
718   void WxTreeView::OnColClick(wxListEvent& event)
719   { 
720     mColumnSelected = event.m_col;
721     wxPoint clientpt;
722     clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
723     clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
724     senderCtrl = event.GetEventObject(); 
725     unsigned int level = 0;
726     for (level = 0; level<mLevelList.size(); ++level)
727       {
728         if ( GetCtrl(level) == senderCtrl ) break;
729       }
730     PopupMenu(menu, clientpt);
731     
732   }
733
734    //================================================================
735   //================================================================
736
737   void WxTreeView::OnItemMenu(wxListEvent &event)
738   {
739          wxPoint clientpt;
740     clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
741     clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
742     senderCtrl = event.GetEventObject();
743     unsigned int level = 0;
744     for (level = 0; level<mLevelList.size(); ++level)
745       {
746                 if ( GetCtrl(level) == senderCtrl ) break;
747       }
748           long* ptr=0;
749           int flag;
750           mLastRightLevel=level;
751           mLastRightSelected=GetCtrl(level)->HitTest(wxPoint(0,clientpt.y-8),flag,ptr);
752     PopupMenu(menuItem, clientpt);
753     
754   }
755   
756   //================================================================
757   //================================================================
758
759   void WxTreeView::OnPopupFilter(wxCommandEvent& event)
760   {
761     wxBusyCursor busy;
762     GimmickDebugMessage(7,
763                         "WxTreeView::OnEndLabelEdit" 
764                         <<std::endl);
765     unsigned int level = 0;
766     for (level = 0; level<mLevelList.size(); ++level)
767       {
768         if ( GetCtrl(level) == senderCtrl ) break;
769       }
770     std::string filter = crea::wx2std(wxGetTextFromUser(_T("Enter the filter to apply"), _T("Filter On Column")));
771     
772     std::string att;
773     
774     long it = -1;
775     UpdateLevel(level+1);
776     
777     std::vector<long> items;
778     bool in=false;
779     int del=0;
780     for ( ;; )
781       {
782         it = GetCtrl(level)->GetNextItem(it,
783                                          wxLIST_NEXT_ALL);
784         if ( it == -1 )
785           break;
786         
787         long adr = (long)GetCtrl(level)->GetItemData(it);
788         tree::Node* nod = ((ItemData*)adr)->node;
789         att=(*nod).GetAttribute(mLevelList[level].key[mColumnSelected]);
790         
791         
792         if(att.find(filter)>900)
793           {
794             
795             if(!in)
796               {
797                 in=true;
798               }
799             else
800               {
801                 del+=1;
802               }
803             
804             items.push_back(it-del);
805           }
806         
807       }
808     std::vector<long>::iterator iter;
809     for(iter=items.begin();iter!=items.end();++iter)
810       {
811         GetCtrl(level)->DeleteItem(*iter);
812       }
813     GetGimmickView()->ClearSelection();
814   }
815   //================================================================
816   
817   //================================================================
818   void WxTreeView::OnPopupSort(wxCommandEvent& event)
819   {
820     wxBusyCursor busy;
821     unsigned int level = 0;
822     for (level = 0; level<mLevelList.size(); ++level)
823       {
824         if ( GetCtrl(level) == senderCtrl ) break;
825       }
826     mLevelList[level].SortColumn = mColumnSelected;
827
828     if(event.GetId()==mAscendingID)
829       {
830         mLevelList[level].SortAscending = true;
831       }
832     else if(event.GetId()==mDescendingID)
833       {
834         mLevelList[level].SortAscending = false;
835       }
836           
837     SortLevel(level);
838   }
839   //================================================================
840
841   void WxTreeView::OnAnonymizer(wxCommandEvent &event)
842   {
843            wxBusyCursor busy;
844            std::vector<std::string> filesname;
845            std::vector<tree::Node*> nodes;
846            nodes.push_back(((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node);
847            if(nodes.size() != 0)
848            {
849                    GetFilenamesAsString(nodes,filesname);
850                    GetGimmickView()->Anonymize(filesname,0);
851            }
852         
853   }
854
855   //================================================================
856   void WxTreeView::OnLocalCopy(wxCommandEvent& event)
857   {
858     wxBusyCursor busy;
859     
860         unsigned int tempLevel = mLastLevel;
861     mLastLevel+=1;
862     const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
863         
864     if(sel.size() != 0)
865         {
866             bool copy=false;
867             std::stringstream out;
868             std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
869             out<<"Copy ";
870             out<<sel.size();
871             if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
872               {
873                 out<<" "<<levelName;
874                 out<<"s to .creaImageIO?";
875               }
876             else
877               {
878                 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<" to .creaImageIO?";
879               }
880             if (wxMessageBox(crea::std2wx(out.str()),
881                              _T("Remove Files"),
882                              wxYES_NO,this ) == wxYES)
883               {
884                 copy = true;
885               }
886             if(copy)
887                   {
888                         std::vector<std::string> s;
889                         GetFilenamesAsString(sel,s);
890             GetGimmickView()->CopyFiles(s);
891                   }
892         }
893         else
894         {
895                 mLastLevel = tempLevel;
896         }
897     
898     
899   }
900   //================================================================
901
902    //================================================================
903   void WxTreeView::OnEditField(wxCommandEvent& event)
904   {
905         if(mLastRightSelected!=-1)
906         {
907     tree::Node* node=((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node;
908         tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
909         std::vector<std::string> names;
910         std::vector<std::string> keys;
911         for (a  = GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).begin();
912              a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).end();
913              ++a)
914         {
915                 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE)
916             {
917                         names.push_back(a->GetName());
918                         keys.push_back(a->GetKey());
919                 }
920         }
921         GetGimmickView()->CreateEditFieldsDialog(node,names,keys);
922         }
923   }
924
925   //================================================================
926
927   //================================================================
928
929   void WxTreeView::OnExportToStorage(wxCommandEvent &event)
930   {
931         std::vector<std::string> filesname;
932         std::vector<tree::Node*> nodes;
933         nodes.push_back(((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node);
934         GetFilenamesAsString(nodes,filesname);
935         GetGimmickView()->ExportToStorage(filesname);
936   }
937
938   //================================================================
939
940   //================================================================
941
942   void WxTreeView::OnDumpTags(wxCommandEvent &event)
943   {
944           if(mLastRightSelected!=-1)
945         {
946                 tree::Node* node=((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node;
947                 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
948                 std::vector<std::string> names;
949                 std::vector<std::string> keys;
950                 for (a  = GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).begin();
951                          a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).end();
952                          ++a)
953                         {
954                                 if(a->GetKey()=="FullFileName")
955                                 {
956                                         GetGimmickView()->DumpTags(node->GetAttribute("FullFileName"));
957                                         return;
958                                 }
959                         }
960           }
961   }
962   
963
964   //================================================================
965
966   //================================================================
967   void WxTreeView::SortLevel(int level)
968   {       
969     GimmickDebugMessage(1,
970                         "WxTreeView::SortLevel(" 
971                         <<level<<")"
972                         <<std::endl);  
973     //Obtain the column name and the level that needs to be organized
974     
975     //    int l = level - 1;
976     //Sets the data for the items to be sorted
977     //    std::string att;
978     unsigned int ty=0;
979     int nbselected = 0;
980     int n = GetCtrl(level)->GetItemCount();
981     for (int i = 0; i < n; i++)
982       {
983         
984         //Gets current item data
985         ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
986         
987         //Extracts the node and the type of attribute   
988         tree::Node* nod = data->node;
989         if(i==0)
990           {
991             (*nod).GetAttributeDescriptor
992               (mLevelList[level].key[mLevelList[level].SortColumn])
993               .DecodeType( ty );
994           }
995         //Obtains the organizing attribute
996         data->attr = & (*nod).GetAttribute
997           (mLevelList[level].key[mLevelList[level].SortColumn]);
998         //Selected ?
999         data->selected = false;
1000         if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
1001           {
1002             data->selected = true;
1003             nbselected++;
1004           }
1005
1006       } 
1007     GimmickDebugMessage(1,
1008                         "WxTreeView::OnSort : " 
1009                         <<nbselected<<" selected before sorting"
1010                         <<std::endl);  
1011
1012     mIgnoreSelectedChanged = true; 
1013     // 
1014     if (mLevelList[level].SortAscending)
1015       {
1016         
1017         if(ty==1)
1018           {
1019             GetCtrl(level)->SortItems(CompareFunctionInts, 0);
1020           }
1021         else
1022           {
1023             GetCtrl(level)->SortItems(CompareFunctionStrings, 0);
1024           }
1025         
1026       }
1027     else
1028       {
1029         if(ty==1)
1030           {
1031             GetCtrl(level)->SortItems(CompareFunctionInts, 1);
1032           }
1033         else
1034           {
1035             GetCtrl(level)->SortItems(CompareFunctionStrings, 1);
1036           }
1037       }
1038  
1039
1040     // Reselects the unselected 
1041     n = GetCtrl(level)->GetItemCount();
1042     int after = 0;
1043     for (int i = 0; i < n; i++)
1044       {
1045         
1046         //Gets current item data
1047         ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
1048   
1049         //  long item = -1;
1050         //    for ( ;; )
1051         //      {
1052         //      item = GetCtrl(level)->GetNextItem(item,wxLIST_NEXT_ALL);
1053         //      if ( item == -1 ) break;
1054         //Gets current item data
1055         //      ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(item);
1056         // was selected ?
1057         
1058         if (data->selected)
1059           {
1060             nbselected--;
1061             if (nbselected==0)
1062               {
1063                 // if it is the last one we must process the selection
1064                 mIgnoreSelectedChanged = false;
1065               }
1066             GetCtrl(level)->SetItemState(i,
1067                                          wxLIST_STATE_SELECTED, 
1068                                          wxLIST_MASK_STATE 
1069                                          | wxLIST_MASK_TEXT 
1070                                          | wxLIST_MASK_IMAGE 
1071                                          | wxLIST_MASK_DATA 
1072                                          | wxLIST_MASK_WIDTH 
1073                                          | wxLIST_MASK_FORMAT);   
1074           }
1075         if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
1076           {
1077             after++;
1078           }
1079
1080         
1081       }
1082     mIgnoreSelectedChanged = false; 
1083      GimmickDebugMessage(1,
1084                         "WxTreeView::SortLevel : " 
1085                         <<after<<" selected after sorting"
1086                         <<std::endl);  
1087   
1088   }
1089   //================================================================
1090
1091   
1092   //================================================================
1093   void WxTreeView::ValidateSelectedImages(bool isSelection)
1094   {
1095     GimmickDebugMessage(7,
1096                         "WxTreeView::ValidateSelectedImages" 
1097                         <<std::endl);
1098     const std::vector<tree::Node*>& sel(GetSelected((int)mLevelList.size()+1));
1099     GetGimmickView()->OnSelectionChange(sel,
1100                                         isSelection,(mLastSelected-1),
1101                                         !mIgnoreSelectedChanged);
1102  
1103   }
1104   //================================================================
1105
1106
1107   //================================================================
1108   void WxTreeView::GetNodes(std::vector<tree::Node*>& nodes, bool direction)
1109   {
1110         long item = mLastSelected;
1111         int level=(int)mLevelList.size()-1;
1112         //Gets current item data
1113         long adr = (long)GetCtrl(level)->GetItemData(item);
1114         //Extracts the node
1115         tree::Node* nod = ((ItemData*)adr)->node;
1116     for ( ;; )
1117     {
1118                 if(direction)
1119                 {
1120                         item = GetCtrl(level)->GetNextItem(item,
1121                                      wxLIST_NEXT_ABOVE);
1122                 }
1123                 else
1124                 {
1125                         item = GetCtrl(level)->GetNextItem(item,
1126                                      wxLIST_NEXT_BELOW);
1127                 }
1128         if ( item == -1 || item==0  )
1129                 {
1130             break;
1131                 }
1132                 if(GetCtrl(level)->GetItemState(item, wxLIST_STATE_SELECTED)==0 )
1133                 {
1134
1135                         adr = (long)GetCtrl(level)->GetItemData(item);
1136                         nod = ((ItemData*)adr)->node;
1137                         nodes.push_back(nod);
1138                 }
1139     }
1140
1141   }
1142   //================================================================
1143    //=================================================
1144   void WxTreeView::OnKeyDown(wxListEvent &event)
1145   {
1146           if(event.GetKeyCode() == WXK_DELETE)
1147           {
1148                    wxBusyCursor busy;
1149                    std::string temp = "0";
1150                    RemoveSelected(temp);
1151                    GetGimmickView()->ClearSelection();
1152           }
1153                   
1154   }
1155   //================================================================
1156
1157   //================================================================
1158   // Should be in another place : not specific !
1159   void WxTreeView::GetSelectedAsString(std::vector<std::string>&s)
1160   {
1161     int level= (int)mLevelList.size();
1162     const std::vector<tree::Node*>& sel=GetSelected(level+1);
1163     std::vector<tree::Node*>::const_iterator i;
1164     
1165     for (i=sel.begin(); i!=sel.end(); ++i)
1166       {
1167         std::string filename=(*i)->GetAttribute("FullFileName");
1168         s.push_back(filename);
1169       }
1170   }
1171
1172
1173
1174   //================================================================
1175   void WxTreeView::GetFilenamesAsString(const std::vector<tree::Node*>& nodes, std::vector<std::string>&s)
1176   {
1177     std::vector<tree::Node*>::const_iterator i;
1178     
1179     for (i=nodes.begin(); i!=nodes.end(); ++i)
1180       {
1181                   if((*i)->GetLevel()<mLevelList.size())
1182                   {
1183                          GetTreeHandler()->LoadChildren(*i,0);
1184                          GetFilenamesAsString((*i)->GetChildrenList(),s);
1185                   }
1186                   else
1187                   {
1188                         std::string filename=(*i)->GetAttribute("FullFileName");
1189                         s.push_back(filename);
1190                   }
1191       }
1192   }
1193
1194    //================================================================
1195
1196    //================================================================
1197   void WxTreeView::GetAttributes(std::vector<std::string>& areShown, std::vector<std::string>& notShown, int level)
1198   {
1199           areShown.clear();
1200           notShown.clear();
1201         tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1202         for (a  = GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).begin();
1203              a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).end();
1204              ++a)
1205         {
1206                 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE && IsAttributeVisible(a->GetName(),level))
1207             {
1208                         areShown.push_back(a->GetName());
1209                 }
1210         }
1211         notShown=mLevelList[level-1].notShownAtts;
1212   }
1213
1214   //================================================================
1215   void WxTreeView::SetNonVisibleAttributes(const std::vector<std::string>& notShown, int nlevel)
1216   {
1217         mLevelList[nlevel].notShownAtts=notShown;
1218   }
1219
1220   //================================================================
1221    void WxTreeView::CreateCtrl(std::vector<std::string>& notShown, int nlevel)
1222   {
1223         int ctrl_style = wxLC_REPORT | wxLC_VRULES;
1224     int col_style = wxLIST_FORMAT_LEFT;
1225         LevelType level;
1226         mLevelList[nlevel].SelectedUpToDate = true;
1227         mLevelList[nlevel].SortColumn = 0;
1228         mLevelList[nlevel].key.clear();
1229         
1230         mLevelList[nlevel].wxCtrl = new wxListCtrl(mLevelList[nlevel].wxSplitter,
1231                                           nlevel,
1232                                           wxDefaultPosition, 
1233                                           wxDefaultSize,
1234                                           ctrl_style);
1235         wxWindow* oldWin=mLevelList[nlevel].wxSplitter->GetWindow1();
1236         mLevelList[nlevel].wxSplitter->ReplaceWindow(oldWin,mLevelList[nlevel].wxCtrl);
1237         mLevelList[nlevel].wxSplitter->Initialize(mLevelList[nlevel].wxCtrl);
1238    
1239         // Create the columns : one for each attribute of the level
1240         int col = 0;
1241         std::string title;
1242
1243         tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1244         for (a  = GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).begin();
1245              a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).end();
1246              ++a)
1247
1248         {   
1249             if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE && IsAttributeVisible(a->GetName(),nlevel+1))
1250               {
1251                   title=a->GetName();
1252                   std::string temp = a->GetKey();
1253                   if (temp.compare("ID") != 0)
1254                   {
1255                         mLevelList[nlevel].wxCtrl->InsertColumn(col, 
1256                                         crea::std2wx(title),
1257                                         col_style);
1258                         col++;
1259                   }
1260                 mLevelList[nlevel].key.push_back(a->GetKey());
1261               }
1262                 
1263           }
1264         oldWin->Destroy();
1265         UpdateLevel(1);
1266         }
1267
1268    //================================================================
1269   bool WxTreeView::IsAttributeVisible(const std::string& val, int level)
1270   {
1271           std::vector<std::string> ns=mLevelList[level-1].notShownAtts;
1272           std::vector<std::string>::iterator it;
1273           bool found=false;
1274           for(it=ns.begin();it!=ns.end()&&!found;++it)
1275           {
1276                   if(val.compare(*it)==0)
1277                   {
1278                           found=true;
1279                   }
1280           }
1281           return !found;
1282   }
1283  //================================================================
1284   //================================================================
1285
1286         RemoveAlertDlg::RemoveAlertDlg(wxWindow *parent, 
1287                                        wxString title,    
1288                                        const wxSize& size)
1289  :   wxDialog( parent, 
1290                   wxID_ANY, 
1291                   title,
1292                   wxDefaultPosition,
1293                   size,
1294                   wxDEFAULT_DIALOG_STYLE)
1295         {
1296             wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
1297
1298                 //std::string out("To reload deleted patient, you should synchronize your database before.");  // JPR
1299                 //wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY,crea::std2wx(out),wxDefaultPosition, wxSize(500,20));
1300                 wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY,
1301                                         _T("To reload deleted patient, you should synchronize your database before."),
1302                                         wxDefaultPosition, wxSize(650,20));  // 650 vs 500 ? // JPRx
1303                 mcheck = new wxCheckBox(this, 5478, _T("Do not display this warning again!"));
1304                 Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &RemoveAlertDlg::onCheck ); 
1305                 wxSizer* buttonsSizer = this->CreateSeparatedButtonSizer(wxOK|wxCANCEL);
1306                 
1307                 topsizer->Add(text);
1308                 topsizer->Add(mcheck,0,wxGROW);
1309                 topsizer->Add(buttonsSizer,0,wxGROW);
1310                 SetSizer(topsizer, true);
1311                 mSave = false;
1312                 Layout();
1313         }
1314         RemoveAlertDlg::~RemoveAlertDlg(){};
1315         bool RemoveAlertDlg::isChecked()
1316         {
1317                 return mSave;
1318         }
1319         void RemoveAlertDlg::onCheck(wxCommandEvent &Event)
1320         {
1321                 mSave = mcheck->IsChecked();
1322         }
1323         
1324
1325   //================================================================
1326   //================================================================
1327   BEGIN_EVENT_TABLE(WxTreeView, wxPanel)   
1328   /*
1329     EVT_SIZE(MyFrame::OnSize)
1330
1331     EVT_MENU(LIST_QUIT, MyFrame::OnQuit)
1332     EVT_MENU(LIST_ABOUT, MyFrame::OnAbout)
1333     EVT_MENU(LIST_LIST_VIEW, MyFrame::OnListView)
1334     EVT_MENU(LIST_REPORT_VIEW, MyFrame::OnReportView)
1335     EVT_MENU(LIST_ICON_VIEW, MyFrame::OnIconView)
1336     EVT_MENU(LIST_ICON_TEXT_VIEW, MyFrame::OnIconTextView)
1337     EVT_MENU(LIST_SMALL_ICON_VIEW, MyFrame::OnSmallIconView)
1338     EVT_MENU(LIST_SMALL_ICON_TEXT_VIEW, MyFrame::OnSmallIconTextView)
1339     EVT_MENU(LIST_VIRTUAL_VIEW, MyFrame::OnVirtualView)
1340     EVT_MENU(LIST_SMALL_VIRTUAL_VIEW, MyFrame::OnSmallVirtualView)
1341
1342     EVT_MENU(LIST_FOCUS_LAST, MyFrame::OnFocusLast)
1343     EVT_MENU(LIST_TOGGLE_FIRST, MyFrame::OnToggleFirstSel)
1344     EVT_MENU(LIST_DESELECT_ALL, MyFrame::OnDeselectAll)
1345     EVT_MENU(LIST_SELECT_ALL, MyFrame::OnSelectAll)
1346     EVT_MENU(LIST_DELETE, MyFrame::OnDelete)
1347     EVT_MENU(LIST_ADD, MyFrame::OnAdd)
1348     EVT_MENU(LIST_EDIT, MyFrame::OnEdit)
1349     EVT_MENU(LIST_DELETE_ALL, MyFrame::OnDeleteAll)
1350     EVT_MENU(LIST_SORT, MyFrame::OnSort)
1351     EVT_MENU(LIST_SET_FG_COL, MyFrame::OnSetFgColour)
1352     EVT_MENU(LIST_SET_BG_COL, MyFrame::OnSetBgColour)
1353     EVT_MENU(LIST_TOGGLE_MULTI_SEL, MyFrame::OnToggleMultiSel)
1354     EVT_MENU(LIST_SHOW_COL_INFO, MyFrame::OnShowColInfo)
1355     EVT_MENU(LIST_SHOW_SEL_INFO, MyFrame::OnShowSelInfo)
1356     EVT_MENU(LIST_FREEZE, MyFrame::OnFreeze)
1357     EVT_MENU(LIST_THAW, MyFrame::OnThaw)
1358     EVT_MENU(LIST_TOGGLE_LINES, MyFrame::OnToggleLines)
1359     EVT_MENU(LIST_MAC_USE_GENERIC, MyFrame::OnToggleMacUseGeneric)
1360
1361     EVT_UPDATE_UI(LIST_SHOW_COL_INFO, MyFrame::OnUpdateShowColInfo)
1362     EVT_UPDATE_UI(LIST_TOGGLE_MULTI_SEL, MyFrame::OnUpdateToggleMultiSel)
1363 END_EVENT_TABLE()
1364
1365 BEGIN_EVENT_TABLE(MyListCtrl, wxListCtrl)
1366     EVT_LIST_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnBeginDrag)
1367     EVT_LIST_BEGIN_RDRAG(LIST_CTRL, MyListCtrl::OnBeginRDrag)
1368         
1369     EVT_LIST_BEGIN_LABEL_EDIT(-1, WxTreeView::OnBeginLabelEdit)
1370     EVT_LIST_END_LABEL_EDIT(-1, WxTreeView::OnEndLabelEdit)
1371         
1372     EVT_LIST_DELETE_ITEM(LIST_CTRL, MyListCtrl::OnDeleteItem)
1373     EVT_LIST_DELETE_ALL_ITEMS(LIST_CTRL, MyListCtrl::OnDeleteAllItems)
1374 #if WXWIN_COMPATIBILITY_2_4
1375     EVT_LIST_GET_INFO(LIST_CTRL, MyListCtrl::OnGetInfo)
1376     EVT_LIST_SET_INFO(LIST_CTRL, MyListCtrl::OnSetInfo)
1377 #endif
1378   */
1379     EVT_LIST_KEY_DOWN(-1, WxTreeView::OnKeyDown)
1380     EVT_LIST_ITEM_SELECTED(-1, WxTreeView::OnItemSelected)
1381         EVT_LIST_ITEM_RIGHT_CLICK(-1, WxTreeView::OnItemMenu)
1382     EVT_LIST_ITEM_DESELECTED(-1, WxTreeView::OnItemDeSelected)
1383         /*
1384     EVT_LIST_KEY_DOWN(LIST_CTRL, MyListCtrl::OnListKeyDown)
1385     EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, MyListCtrl::OnActivated)
1386     EVT_LIST_ITEM_FOCUSED(LIST_CTRL, MyListCtrl::OnFocused)
1387 */
1388     EVT_LIST_COL_RIGHT_CLICK(-1, WxTreeView::OnColClick)
1389         
1390     EVT_LIST_COL_CLICK(-1, WxTreeView::OnColClick)
1391
1392         //EVT_LEFT_DOWN(WxTreeView::OnMouseClick)
1393         /*
1394     EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnColBeginDrag)
1395     EVT_LIST_COL_DRAGGING(LIST_CTRL, MyListCtrl::OnColDragging)
1396     EVT_LIST_COL_END_DRAG(LIST_CTRL, MyListCtrl::OnColEndDrag)
1397
1398     EVT_LIST_CACHE_HINT(LIST_CTRL, MyListCtrl::OnCacheHint)
1399
1400 #if USE_CONTEXT_MENU
1401     EVT_CONTEXT_MENU(MyListCtrl::OnContextMenu)
1402 #endif
1403     EVT_CHAR(MyListCtrl::OnChar)
1404
1405     EVT_RIGHT_DOWN(MyListCtrl::OnRightClick)
1406   */
1407 END_EVENT_TABLE()
1408   
1409 } // EO namespace creaImageIO
1410