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