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