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