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