]> Creatis software - creaImageIO.git/blob - src2/creaImageIOWxTreeView.cpp
*** empty log message ***
[creaImageIO.git] / src2 / 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
7 const std::string void_string("");
8
9 //=====================================================================
10 namespace creaImageIO
11 {
12   //=====================================================================
13   /// Data stored by the list items
14   struct ItemData
15   {
16     ItemData() : node(0), id(-1), attr(&void_string) {}
17     // The corresponding Node
18     tree::Node* node;
19     // The id ?
20     int id;
21     // The pointer on the current attribute string to sort on
22     const std::string* attr;
23     // Was the item previously selected ?
24     // Useful for reselecting the item after sort
25     bool selected;
26   };
27   //=====================================================================
28 }
29 //=====================================================================
30
31 //=====================================================================
32 ///Comparing function for ordering algorithm. Takes parameters as strings.
33 int wxCALLBACK CompareFunctionStrings(long item1, long item2, long sortData)
34 {       
35   creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
36   creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
37
38   const std::string& s1(*(data1->attr));
39   const std::string& s2(*(data2->attr));
40   if(sortData==1)
41     {
42       // inverse the order
43       if (s1 < s2)
44         return 1;
45       if (s1 > s2)
46         return -1;
47       
48       return 0;
49     }
50   else
51     {
52       if (s1 < s2)
53         return -1;
54       if (s1 > s2)
55         return 1;
56       
57       return 0;
58       
59     }
60 }
61 //=====================================================================
62
63 //=====================================================================
64 ///Comparing function for ordering algorithm. Takes parameters as ints.
65 int wxCALLBACK CompareFunctionInts(long item1, long item2, long sortData)
66 {       
67   creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
68   creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
69
70   const std::string& s1(*(data1->attr));
71   const std::string& s2(*(data2->attr));
72
73   int val1=atoi(s1.c_str());
74   int val2=atoi(s2.c_str());
75
76   if(sortData==1)
77     {
78       // inverse the order
79       if (val1 < val2)
80         return 1;
81       if (val1 > val2)
82         return -1;
83       
84       return 0;
85     }
86   else
87     {
88       if (val1 < val2)
89         return -1;
90       if (val1 > val2)
91         return 1;
92
93       return 0;
94       
95     }
96   
97 }
98
99 //=====================================================================
100
101
102 //=====================================================================
103 namespace creaImageIO
104 {
105   //=====================================================================
106   // CTor
107   WxTreeView::WxTreeView(TreeHandler* handler,
108                          GimmickView* gimmick,
109                          wxWindow* parent,
110                          const wxWindowID id)
111     : wxPanel(parent,id),
112       TreeView(handler,gimmick)
113   {
114     GimmickDebugMessage(1,"WxTreeView::WxTreeView"
115                         <<std::endl);
116
117     
118     // Split part below toolbar into notebook for views and panel
119     // for preview, messages...
120     // TO DO : Splitter
121     //    mSplitter = new wxSplitterWindow( this , -1);
122
123     // Global sizer
124     wxBoxSizer  *sizer = new wxBoxSizer(wxHORIZONTAL);
125     
126     int ctrl_style = wxLC_REPORT | wxLC_VRULES;
127     int col_style = wxLIST_FORMAT_LEFT;
128
129     // Creating the ListCtrl for the levels > 0 (not for Root level)
130     for (int i = 1;
131          i < handler->GetTree().GetNumberOfLevels();
132          ++i)
133       {
134
135         GimmickDebugMessage(5,"Creating view for level "<<i
136                             <<std::endl);
137         LevelType level;
138         level.SelectedUpToDate = true;
139         level.SortColumn = 0;
140
141         // If the first level : parent = this
142         wxWindow* sparent = this;
143         // else parent = last splitter
144         if (i>1) sparent = mLevelList[i-2].wxSplitter;
145
146         level.wxSplitter = new wxSplitterWindow( sparent , -1);
147         if(i!=1)
148         {
149         level.wxSplitter->Show(false);
150         }
151         //          level.wxSplitter->SetMinimumPaneSize(100);
152         
153         wxListCtrl* ctrl = new wxListCtrl(level.wxSplitter,
154                                           i,
155                                           wxDefaultPosition, 
156                                           wxDefaultSize,
157                                           ctrl_style);
158         level.wxCtrl = ctrl;
159         level.wxSplitter->Initialize(ctrl);
160
161
162         // Create the columns : one for each attribute of the level
163         int col = 0;
164         std::string title;
165         tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
166         for (a  = handler->GetTree().GetAttributeDescriptorList(i).begin();
167              a != handler->GetTree().GetAttributeDescriptorList(i).end();
168              ++a)
169           {
170         
171             GimmickDebugMessage(5,"Creating column "<<col<<" : "
172                                 <<a->GetName()
173                                 <<std::endl);
174             
175             if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE)
176               {
177                 
178                 if(a->GetName()=="UNKNOWN")
179                   {
180                     title = "#";
181                     title += handler->GetTree().GetLevelDescriptor(i+1).GetName();
182                     if (title[title.size()-1]!='s')
183                       title += "s";
184                     
185                   }
186                 else
187                   {
188                     title=a->GetName();
189                   }
190                 
191                 ctrl->InsertColumn(col, 
192                                    crea::std2wx(title),
193                                    col_style);
194                 level.key.push_back(a->GetKey());
195
196                 //          ctrl->SetColumnWidth(col, wxLIST_AUTOSIZE );
197
198                 col++;
199               }
200                 
201           }
202           
203         mLevelList.push_back(level);
204       }
205     
206 #if wxUSE_MENUS
207
208     menu =new wxMenu;
209         wxMenuItem* m1=menu->Append(wxID_ANY, _T("&Sort ascending"));
210         wxMenuItem* m2=menu->Append(wxID_ANY, _T("&Sort descending"));
211         wxMenuItem* m3=menu->Append(wxID_ANY, _T("&Filter"));
212         mAscendingID=m1->GetId();
213         mDescendingID=m2->GetId();
214         mFilterID=m3->GetId();
215         Connect( mAscendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
216         Connect( mDescendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
217         Connect( mFilterID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupFilter) );
218         
219 #endif // wxUSE_MENUS
220
221
222         /// Initialize the first level splitter
223           
224         sizer->Add( mLevelList[0].wxSplitter ,1, wxGROW  ,0);
225         //      mColumnSelected=1;
226         mLastSelected=0;
227         mLastLevel=0;
228         //      mDirection=true;
229
230         mIgnoreSelectedChanged = false;
231
232         //CreateColorPalette();
233     UpdateLevel(1);
234
235     SetSizer( sizer );     
236     SetAutoLayout(true);
237     Layout();
238
239   }
240   //=====================================================================
241
242   //=====================================================================
243   /// Destructor
244   WxTreeView::~WxTreeView()
245   {
246     GimmickDebugMessage(1,"WxTreeView::~WxTreeView"
247                         <<std::endl);
248   }
249   //=====================================================================
250   
251   
252   
253   //=====================================================================
254    const std::vector<tree::Node*>& WxTreeView::GetSelected(int level)
255   {
256     //  if (GetSelectedUpToDate(level)) 
257     
258     int l = level - 1;
259     // the selection of upper level
260     std::vector<tree::Node*>& sel(mLevelList[level-1].Selected);
261     sel.clear();
262
263     if (level == 1) 
264       {
265         sel.push_back(GetTreeHandler()->GetTree().GetTree());
266       }
267     else 
268       {
269         int n = GetCtrl(l-1)->GetItemCount();
270         for (int i = 0; i < n; i++)
271           {
272             if ( GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED))
273               {
274                 long adr = GetCtrl(l-1)->GetItemData(i);
275                 tree::Node* n = ((ItemData*)adr)->node;
276                         if(mLastSelected==i)
277                         {
278                                 std::vector<tree::Node*>::iterator it;
279                                 it = sel.begin();
280                                 it = sel.insert ( it , n );
281                         }
282                         else
283                         {
284                                 sel.push_back(n);
285                         }
286               }
287           }     
288       }
289          
290     //    return mLevelList[level-1].Selected;
291     return sel;
292   }
293
294   //=====================================================================
295   
296   //=====================================================================
297   ///Removes selected nodes on last selected level
298    // NOT SPECIFIC 
299   void WxTreeView::RemoveSelected()
300   {
301     mLastLevel+=1;
302     const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
303     bool erase=false;
304     std::stringstream out;
305     std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
306     out<<"Delete ";
307     out<<sel.size();
308     if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
309       {
310         out<<" "<<levelName;
311         out<<"s?";
312       }
313     else
314       {
315         out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<"?";
316       }
317     if (wxMessageBox(crea::std2wx(out.str()),
318                      _T("Remove Files"),
319                      wxYES_NO,this ) == wxYES)
320       {
321         erase = true;
322       }
323     if(erase)
324           {
325             bool needRefresh=false;
326             std::vector<tree::Node*>::const_iterator i;
327             for (i=sel.begin(); i!=sel.end(); ++i)
328               {
329                 GimmickMessage(1,
330                                "deleting '"
331                                <<(*i)->GetLabel()
332                                <<"'"<<mLastLevel
333                                <<std::endl);
334                 if((*i)->GetParent()->GetNumberOfChildren()<2)
335                   {
336                     needRefresh=true;
337                   }
338                 GetTreeHandler()->Remove(*i);
339               }
340             
341             if(needRefresh && mLastLevel>1)
342               {
343                 UpdateLevel(mLastLevel-2);
344               }
345             else if(mLastLevel>1)
346               {
347                 UpdateLevel(mLastLevel-1);
348               }
349             else
350               {
351                 UpdateLevel(mLastLevel);
352               }
353           }
354     
355   }
356   
357   
358   //=====================================================================
359
360  
361   //=====================================================================
362   /// Updates a level of the view (adds or removes children, etc.)
363   void WxTreeView::UpdateLevel( int level )
364   {
365     GimmickDebugMessage(1,
366                         GetTreeHandler()->GetTree().GetLabel()
367                         <<"WxTreeView::UpdateLevel(level "
368                         <<level
369                         <<")"
370                         <<std::endl);
371     
372     wxBusyCursor busy;
373     RecursiveUpdateLevel(level);
374     int i;
375     for (i=0; i<level-1; i++)
376       {
377         if (!GetSplitter(i)->IsSplit()) 
378           GetSplitter(i)->SplitVertically(  GetCtrl(i), GetSplitter(i+1),
379                                             100 );
380       }
381     if (GetSplitter(i)->IsSplit()) GetSplitter(i)->Unsplit();    
382     
383   }
384   //=====================================================================
385   
386  //=====================================================================
387   /// Recursive method called upon by UpdateLevel to refresh all windows
388   void WxTreeView::RecursiveUpdateLevel( int level )
389   {
390     GimmickDebugMessage(1,
391                         GetTreeHandler()->GetTree().GetLabel()
392                         <<"WxTreeView::RecursiveUpdateLevel(level "
393                         <<level
394                         <<")"<<std::endl);
395     
396
397     const std::vector<tree::Node*>& sel(GetSelected(level));
398
399     int l = level - 1;
400  
401     // to speed up inserting we hide the control temporarily
402     GetCtrl(l)->Hide();
403     GetCtrl(l)->DeleteAllItems();
404     
405     std::vector<tree::Node*>::const_iterator i;
406     
407     for (i=sel.begin(); i!=sel.end(); ++i)
408       {
409         GimmickDebugMessage(2,
410                             "adding children of '"
411                             <<(*i)->GetLabel()
412                             <<"'"
413                             <<std::endl);
414         int _id=1;
415         
416         //Adds items and sets their attributes 
417         //GetCtrl(l)->InsertItem(0, _T(""));
418         GetTreeHandler()->LoadChildren(*i,1);
419         tree::Node::ChildrenListType::reverse_iterator j;
420         for (j = (*i)->GetChildrenList().rbegin(); 
421              j!= (*i)->GetChildrenList().rend(); 
422              ++j)
423           {
424             wxListItem* item= new wxListItem;
425             item->SetMask(wxLIST_MASK_STATE | 
426                           wxLIST_MASK_TEXT |
427                           //                     wxLIST_MASK_IMAGE |
428                           wxLIST_MASK_DATA |
429                          //                      wxLIST_MASK_WIDTH |
430                           wxLIST_MASK_FORMAT
431                           );
432             
433             ItemData* data = new ItemData;
434             
435             data->node = *j;
436             item->SetId(_id);
437             
438             data->id = _id;
439             item->SetData(data);
440             
441             _id++;
442             GetCtrl(l)->InsertItem(*item);
443             
444             //Setting attributes
445             
446             for (int k=0; k<GetCtrl(l)->GetColumnCount(); k++)
447               {
448                 std::string val = (*j)->GetAttribute(mLevelList[l].key[k]);
449                 if (val.size()==0) val = "?";
450                 item->SetText( crea::std2wx(val));
451                 item->SetColumn(k);
452                 GetCtrl(l)->SetItem(*item);
453               } 
454             
455           }
456         //GetCtrl(l)->DeleteItem(0);
457       }
458     
459
460     SortLevel(l);
461     GetCtrl(l)->Show();
462
463
464     
465  }
466   //=====================================================================
467
468
469   //================================================================
470   void WxTreeView::OnItemDeSelected(wxListEvent& event)
471   { 
472     GimmickDebugMessage(1,
473                         GetTreeHandler()->GetTree().GetLabel()
474                         <<" WxTreeView::OnItemDeselected"<<std::endl);
475     // retrieve the level
476     wxObject* obj = event.GetEventObject();   
477     unsigned int level = 0;
478     for (level = 0; level<mLevelList.size(); ++level)
479       {
480         if ( GetCtrl(level) == obj ) break;
481       } 
482     SetSelectedUpToDate(level,false);
483   }
484   //================================================================
485
486   //================================================================
487   void WxTreeView::OnItemSelected(wxListEvent& event)
488   { 
489     GimmickDebugMessage(1,
490                         GetTreeHandler()->GetTree().GetLabel()
491                         <<" WxTreeView::OnItemSelected"<<std::endl);
492
493     if (mIgnoreSelectedChanged) 
494       {
495         GimmickDebugMessage(1,
496                             " mIgnoreSelectedChanged true: returning"
497                             <<std::endl);
498         return;
499       }
500     
501
502     
503     wxListItem info;
504     info.m_itemId = event.m_itemIndex;
505     mLastSelected = event.m_itemIndex;
506     // retrieve the level
507     wxObject* obj = event.GetEventObject();   
508     unsigned int level = 0;
509     for (level = 0; level<mLevelList.size(); ++level)
510       {
511         if ( GetCtrl(level) == obj ) break;
512       }
513         mLastLevel=level;
514     GimmickDebugMessage(1,
515                         " Level "<<level+1
516                         <<std::endl);
517     
518     // Update the children level (if selection not at last level)
519     if (level<mLevelList.size()-1) 
520       {
521                 
522         UpdateLevel( level + 2 ); 
523         // Reset the viewer setting the default image
524         GetGimmickView()->ClearSelection();
525       }
526     // Select all images if the selection is at series level
527     if (level==mLevelList.size()-2) SelectAll(level+1);
528     // Validate selected images if the selection is at image level
529     if (level==(mLevelList.size()-1)) //&&mProcess) 
530       {
531         if(event.GetEventType()==10145)
532           {
533             ValidateSelectedImages (true);
534           }
535         else
536           {
537             ValidateSelectedImages (false);
538           }
539       }
540     
541   }
542   //================================================================
543
544   //================================================================
545   void WxTreeView::SelectAll(int level)
546   {
547     long item = -1;
548     //    int level=mLevelList.size()-1;
549     for ( ;; )
550       {
551         item = GetCtrl(level)->GetNextItem(item,
552                                            wxLIST_NEXT_ALL);
553         if ( item == -1 )
554           break;
555         
556         if(item==(GetCtrl(level)->GetItemCount()-1))
557           {
558             mIgnoreSelectedChanged = false;//mProcess=true;
559           }
560         else
561           {
562             mIgnoreSelectedChanged = true;//    mProcess=false;
563           }
564         GetCtrl(level)->SetItemState(item,wxLIST_STATE_SELECTED, wxLIST_MASK_STATE 
565                                      | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT);
566       }
567   }
568
569   //================================================================
570   //================================================================
571
572   void WxTreeView::OnColClick(wxListEvent& event)
573   { 
574     mColumnSelected = event.m_col;
575     wxPoint clientpt;
576     clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
577     clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
578     senderCtrl = event.GetEventObject(); 
579     unsigned int level = 0;
580     for (level = 0; level<mLevelList.size(); ++level)
581       {
582         if ( GetCtrl(level) == senderCtrl ) break;
583       }
584     PopupMenu(menu, clientpt);
585     
586   }
587     
588   //================================================================
589   //================================================================
590
591   void WxTreeView::OnPopupFilter(wxCommandEvent& event)
592   {
593     wxBusyCursor busy;
594     GimmickDebugMessage(7,
595                         "WxTreeView::OnEndLabelEdit" 
596                         <<std::endl);
597     wxObject* ctrl = event.GetEventObject(); 
598     unsigned int level = 0;
599     for (level = 0; level<mLevelList.size(); ++level)
600       {
601         if ( GetCtrl(level) == senderCtrl ) break;
602       }
603     std::string filter = crea::wx2std(wxGetTextFromUser(_T("Enter the filter to apply"), _T("Filter On Column")));
604     
605     std::string att;
606     
607     long it = -1;
608     UpdateLevel(level+1);
609     
610     std::vector<long> items;
611     bool in=false;
612     int del=0;
613     for ( ;; )
614       {
615         it = GetCtrl(level)->GetNextItem(it,
616                                          wxLIST_NEXT_ALL);
617         if ( it == -1 )
618           break;
619         
620         long adr = GetCtrl(level)->GetItemData(it);
621         tree::Node* nod = ((ItemData*)adr)->node;
622         att=(*nod).GetAttribute(mLevelList[level].key[mColumnSelected]);
623         
624         
625         if(att.find(filter)>900)
626           {
627             
628             if(!in)
629               {
630                 in=true;
631               }
632             else
633               {
634                 del+=1;
635               }
636             
637             items.push_back(it-del);
638           }
639         
640       }
641     std::vector<long>::iterator iter;
642     for(iter=items.begin();iter!=items.end();++iter)
643       {
644         GetCtrl(level)->DeleteItem(*iter);
645       }
646     GetGimmickView()->ClearSelection();
647   }
648   //================================================================
649   
650   //================================================================
651   void WxTreeView::OnPopupSort(wxCommandEvent& event)
652   {
653     wxBusyCursor busy;
654     unsigned int level = 0;
655     for (level = 0; level<mLevelList.size(); ++level)
656       {
657         if ( GetCtrl(level) == senderCtrl ) break;
658       }
659     mLevelList[level].SortColumn = mColumnSelected;
660
661     if(event.GetId()==mAscendingID)
662       {
663         mLevelList[level].SortAscending = true;
664       }
665     else if(event.GetId()==mDescendingID)
666       {
667         mLevelList[level].SortAscending = false;
668       }
669     
670     SortLevel(level);
671   }
672   //================================================================
673
674   //================================================================
675   void WxTreeView::SortLevel(int level)
676   {       
677     GimmickDebugMessage(1,
678                         "WxTreeView::SortLevel(" 
679                         <<level<<")"
680                         <<std::endl);  
681     //Obtain the column name and the level that needs to be organized
682     
683     //    int l = level - 1;
684     //Sets the data for the items to be sorted
685     //    std::string att;
686     unsigned int ty=0;
687     int nbselected = 0;
688     int n = GetCtrl(level)->GetItemCount();
689     for (int i = 0; i < n; i++)
690       {
691         
692         //Gets current item data
693         ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
694         
695         //Extracts the node and the type of attribute   
696         tree::Node* nod = data->node;
697         if(i==0)
698           {
699             (*nod).GetAttributeDescriptor
700               (mLevelList[level].key[mLevelList[level].SortColumn])
701               .DecodeType( ty );
702           }
703         //Obtains the organizing attribute
704         data->attr = & (*nod).GetAttribute
705           (mLevelList[level].key[mLevelList[level].SortColumn]);
706         //Selected ?
707         data->selected = false;
708         if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
709           {
710             data->selected = true;
711             nbselected++;
712           }
713
714       } 
715     GimmickDebugMessage(1,
716                         "WxTreeView::OnSort : " 
717                         <<nbselected<<" selected before sorting"
718                         <<std::endl);  
719
720     mIgnoreSelectedChanged = true; 
721     // 
722     if (mLevelList[level].SortAscending)
723       {
724         
725         if(ty==1)
726           {
727             GetCtrl(level)->SortItems(CompareFunctionInts, 0);
728           }
729         else
730           {
731             GetCtrl(level)->SortItems(CompareFunctionStrings, 0);
732           }
733         
734       }
735     else
736       {
737         if(ty==1)
738           {
739             GetCtrl(level)->SortItems(CompareFunctionInts, 1);
740           }
741         else
742           {
743             GetCtrl(level)->SortItems(CompareFunctionStrings, 1);
744           }
745       }
746  
747
748     // Reselects the unselected 
749     n = GetCtrl(level)->GetItemCount();
750     int after = 0;
751     for (int i = 0; i < n; i++)
752       {
753         
754         //Gets current item data
755         ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
756   
757         //  long item = -1;
758         //    for ( ;; )
759         //      {
760         //      item = GetCtrl(level)->GetNextItem(item,wxLIST_NEXT_ALL);
761         //      if ( item == -1 ) break;
762         //Gets current item data
763         //      ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(item);
764         // was selected ?
765         
766         if (data->selected)
767           {
768             nbselected--;
769             if (nbselected==0)
770               {
771                 // if it is the last one we must process the selection
772                 mIgnoreSelectedChanged = false;
773               }
774             GetCtrl(level)->SetItemState(i,
775                                          wxLIST_STATE_SELECTED, 
776                                          wxLIST_MASK_STATE 
777                                          | wxLIST_MASK_TEXT 
778                                          | wxLIST_MASK_IMAGE 
779                                          | wxLIST_MASK_DATA 
780                                          | wxLIST_MASK_WIDTH 
781                                          | wxLIST_MASK_FORMAT);   
782           }
783         if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
784           {
785             after++;
786           }
787
788         
789       }
790     mIgnoreSelectedChanged = false; 
791      GimmickDebugMessage(1,
792                         "WxTreeView::SortLevel : " 
793                         <<after<<" selected after sorting"
794                         <<std::endl);  
795   
796   }
797   //================================================================
798
799   
800   //================================================================
801   void WxTreeView::ValidateSelectedImages(bool isSelection)
802   {
803     GimmickDebugMessage(7,
804                         "WxTreeView::ValidateSelectedImages" 
805                         <<std::endl);
806     const std::vector<tree::Node*>& sel(GetSelected(mLevelList.size()+1));
807     GetGimmickView()->OnSelectionChange(sel,
808                                         isSelection,(mLastSelected-1),
809                                         !mIgnoreSelectedChanged);
810  
811   }
812   //================================================================
813
814
815   //================================================================
816   void WxTreeView::GetNodes(std::vector<tree::Node*>& nodes, bool direction)
817   {
818         long item = mLastSelected;
819         int level=mLevelList.size()-1;
820         //Gets current item data
821         long adr = GetCtrl(level)->GetItemData(item);
822         //Extracts the node
823         tree::Node* nod = ((ItemData*)adr)->node;
824     for ( ;; )
825     {
826                 if(direction)
827                 {
828                         item = GetCtrl(level)->GetNextItem(item,
829                                      wxLIST_NEXT_ABOVE);
830                 }
831                 else
832                 {
833                         item = GetCtrl(level)->GetNextItem(item,
834                                      wxLIST_NEXT_BELOW);
835                 }
836         if ( item == -1 || item==0  )
837                 {
838             break;
839                 }
840                 if(GetCtrl(level)->GetItemState(item, wxLIST_STATE_SELECTED)==0 )
841                 {
842                         adr = GetCtrl(level)->GetItemData(item);
843                         nod = ((ItemData*)adr)->node;
844                         nodes.push_back(nod);
845                 }
846     }
847
848   }
849   //================================================================
850
851   //================================================================
852   // Should be in another place : not specific !
853   void WxTreeView::GetSelectedAsString(std::vector<std::string>&s)
854   {
855     int level=mLevelList.size();
856     const std::vector<tree::Node*>& sel=GetSelected(level+1);
857     std::vector<tree::Node*>::const_iterator i;
858     
859     for (i=sel.begin(); i!=sel.end(); ++i)
860       {
861         std::string filename=(*i)->GetAttribute("FullFileName");
862         s.push_back(filename);
863       }
864   }
865
866    //================================================================
867   void WxTreeView::SetColor(int l, int item)
868   {
869           int colorId=12;
870           GetCtrl(l)->SetItemTextColour(item, wxColourDatabase().Find
871                    (crea::std2wx(mColorPalette[colorId])));
872           GetCtrl(l)->SetItemState(item,wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED, wxLIST_STATE_SELECTED);  /*
873           int colorId=0;
874           //Setting the color according to the parent
875                 if(l==0)
876                 {
877                 item.SetBackgroundColour
878                   (wxColourDatabase().Find
879                    (crea::std2wx(mColorPalette[colorId]))); 
880                 mColorMap.insert
881                   (NodeColorPair
882                    (*j,wxColourDatabase().Find
883                     (crea::std2wx(mColorPalette[colorId]))));
884                 if(colorId<64)
885                   {
886                     colorId++;
887                   }
888                 else
889                         {
890                           colorId=0;
891                         }
892                 }
893                 else if(l!=mLevelList.size()-1)
894                   {
895                     item.SetBackgroundColour(mColorMap[*i]); 
896                         mColorMap.insert(NodeColorPair(*j,mColorMap[*i]));
897                 }
898                 else
899                 {
900                         item.SetBackgroundColour(mColorMap[*i]); 
901                 }*/
902   }
903   //================================================================
904   void WxTreeView::CreateColorPalette()
905   {
906   GimmickDebugMessage(6,"WxTreeView::CreateColorPalette");
907   mColorPalette.push_back("WHITE");
908   mColorPalette.push_back("LIGHT GREY");
909   mColorPalette.push_back("AQUAMARINE");
910   mColorPalette.push_back("MEDIUM FOREST GREEN");
911   mColorPalette.push_back("INDIAN RED");
912   mColorPalette.push_back("KHAKI");
913   mColorPalette.push_back("ORANGE");
914   mColorPalette.push_back("LIGHT BLUE");
915   mColorPalette.push_back("LIGHT STEEL BLUE");
916   mColorPalette.push_back("PINK");
917   mColorPalette.push_back("PLUM");
918   mColorPalette.push_back("PURPLE");
919   mColorPalette.push_back("RED");
920   mColorPalette.push_back("SEA GREEN");
921   mColorPalette.push_back("SIENNA");
922   mColorPalette.push_back("SKY BLUE");
923   mColorPalette.push_back("SLATE BLUE");
924   mColorPalette.push_back("SPRING GREEN");
925   mColorPalette.push_back("TAN");
926   mColorPalette.push_back("THISTLE");
927   mColorPalette.push_back("TURQUOISE");
928   mColorPalette.push_back("VIOLET");
929   mColorPalette.push_back("VIOLET RED");
930   mColorPalette.push_back("WHEAT");
931   mColorPalette.push_back("YELLOW");
932   mColorPalette.push_back("YELLOW GREEN");
933   mColorPalette.push_back("BLUE");
934   mColorPalette.push_back("BLUE VIOLET");
935   mColorPalette.push_back("BROWN");
936   mColorPalette.push_back("CADET BLUE");
937   mColorPalette.push_back("CORAL");
938   mColorPalette.push_back("CORNFLOWER BLUE");
939   mColorPalette.push_back("CYAN");
940   mColorPalette.push_back("DARK GREY");
941   mColorPalette.push_back("DARK GREEN");
942   mColorPalette.push_back("DARK OLIVE GREEN");
943   mColorPalette.push_back("DARK ORCHID");
944   mColorPalette.push_back("DARK SLATE BLUE");
945   mColorPalette.push_back("DARK SLATE GREY");
946   mColorPalette.push_back("DARK TURQUOISE");
947   mColorPalette.push_back("FIREBRICK");
948   mColorPalette.push_back("FOREST GREEN");
949   mColorPalette.push_back("GOLD");
950   mColorPalette.push_back("GOLDENROD");
951   mColorPalette.push_back("GREY");
952   mColorPalette.push_back("GREEN");
953   mColorPalette.push_back("GREEN YELLOW");
954   mColorPalette.push_back("LIME GREEN");
955   mColorPalette.push_back("MAGENTA");
956   mColorPalette.push_back("MAROON");
957   mColorPalette.push_back("MEDIUM AQUAMARINE");
958   mColorPalette.push_back("MEDIUM BLUE");
959   mColorPalette.push_back("MEDIUM GOLDENROD");
960   mColorPalette.push_back("MEDIUM ORCHID");
961   mColorPalette.push_back("MEDIUM SEA GREEN");
962   mColorPalette.push_back("MEDIUM SLATE BLUE");
963   mColorPalette.push_back("MEDIUM SPRING GREEN");
964   mColorPalette.push_back("MEDIUM TURQUOISE");
965   mColorPalette.push_back("MEDIUM VIOLET RED");
966   mColorPalette.push_back("MIDNIGHT BLUE");
967   mColorPalette.push_back("NAVY");
968   mColorPalette.push_back("ORANGE RED");
969   mColorPalette.push_back("ORCHID, PALE GREEN");
970   mColorPalette.push_back("STEEL BLUE");
971   mColorPalette.push_back("BLACK");
972
973
974   }
975   //================================================================
976   BEGIN_EVENT_TABLE(WxTreeView, wxPanel)   
977   /*
978     EVT_SIZE(MyFrame::OnSize)
979
980     EVT_MENU(LIST_QUIT, MyFrame::OnQuit)
981     EVT_MENU(LIST_ABOUT, MyFrame::OnAbout)
982     EVT_MENU(LIST_LIST_VIEW, MyFrame::OnListView)
983     EVT_MENU(LIST_REPORT_VIEW, MyFrame::OnReportView)
984     EVT_MENU(LIST_ICON_VIEW, MyFrame::OnIconView)
985     EVT_MENU(LIST_ICON_TEXT_VIEW, MyFrame::OnIconTextView)
986     EVT_MENU(LIST_SMALL_ICON_VIEW, MyFrame::OnSmallIconView)
987     EVT_MENU(LIST_SMALL_ICON_TEXT_VIEW, MyFrame::OnSmallIconTextView)
988     EVT_MENU(LIST_VIRTUAL_VIEW, MyFrame::OnVirtualView)
989     EVT_MENU(LIST_SMALL_VIRTUAL_VIEW, MyFrame::OnSmallVirtualView)
990
991     EVT_MENU(LIST_FOCUS_LAST, MyFrame::OnFocusLast)
992     EVT_MENU(LIST_TOGGLE_FIRST, MyFrame::OnToggleFirstSel)
993     EVT_MENU(LIST_DESELECT_ALL, MyFrame::OnDeselectAll)
994     EVT_MENU(LIST_SELECT_ALL, MyFrame::OnSelectAll)
995     EVT_MENU(LIST_DELETE, MyFrame::OnDelete)
996     EVT_MENU(LIST_ADD, MyFrame::OnAdd)
997     EVT_MENU(LIST_EDIT, MyFrame::OnEdit)
998     EVT_MENU(LIST_DELETE_ALL, MyFrame::OnDeleteAll)
999     EVT_MENU(LIST_SORT, MyFrame::OnSort)
1000     EVT_MENU(LIST_SET_FG_COL, MyFrame::OnSetFgColour)
1001     EVT_MENU(LIST_SET_BG_COL, MyFrame::OnSetBgColour)
1002     EVT_MENU(LIST_TOGGLE_MULTI_SEL, MyFrame::OnToggleMultiSel)
1003     EVT_MENU(LIST_SHOW_COL_INFO, MyFrame::OnShowColInfo)
1004     EVT_MENU(LIST_SHOW_SEL_INFO, MyFrame::OnShowSelInfo)
1005     EVT_MENU(LIST_FREEZE, MyFrame::OnFreeze)
1006     EVT_MENU(LIST_THAW, MyFrame::OnThaw)
1007     EVT_MENU(LIST_TOGGLE_LINES, MyFrame::OnToggleLines)
1008     EVT_MENU(LIST_MAC_USE_GENERIC, MyFrame::OnToggleMacUseGeneric)
1009
1010     EVT_UPDATE_UI(LIST_SHOW_COL_INFO, MyFrame::OnUpdateShowColInfo)
1011     EVT_UPDATE_UI(LIST_TOGGLE_MULTI_SEL, MyFrame::OnUpdateToggleMultiSel)
1012 END_EVENT_TABLE()
1013
1014 BEGIN_EVENT_TABLE(MyListCtrl, wxListCtrl)
1015     EVT_LIST_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnBeginDrag)
1016     EVT_LIST_BEGIN_RDRAG(LIST_CTRL, MyListCtrl::OnBeginRDrag)
1017         
1018     EVT_LIST_BEGIN_LABEL_EDIT(-1, WxTreeView::OnBeginLabelEdit)
1019     EVT_LIST_END_LABEL_EDIT(-1, WxTreeView::OnEndLabelEdit)
1020         
1021     EVT_LIST_DELETE_ITEM(LIST_CTRL, MyListCtrl::OnDeleteItem)
1022     EVT_LIST_DELETE_ALL_ITEMS(LIST_CTRL, MyListCtrl::OnDeleteAllItems)
1023 #if WXWIN_COMPATIBILITY_2_4
1024     EVT_LIST_GET_INFO(LIST_CTRL, MyListCtrl::OnGetInfo)
1025     EVT_LIST_SET_INFO(LIST_CTRL, MyListCtrl::OnSetInfo)
1026 #endif
1027   */
1028     EVT_LIST_ITEM_SELECTED(-1, WxTreeView::OnItemSelected)
1029   
1030     EVT_LIST_ITEM_DESELECTED(-1, WxTreeView::OnItemDeSelected)
1031         /*
1032     EVT_LIST_KEY_DOWN(LIST_CTRL, MyListCtrl::OnListKeyDown)
1033     EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, MyListCtrl::OnActivated)
1034     EVT_LIST_ITEM_FOCUSED(LIST_CTRL, MyListCtrl::OnFocused)
1035 */
1036     EVT_LIST_COL_RIGHT_CLICK(-1, WxTreeView::OnColClick)
1037         
1038     EVT_LIST_COL_CLICK(-1, WxTreeView::OnColClick)
1039
1040         //EVT_LEFT_DOWN(WxTreeView::OnMouseClick)
1041         /*
1042     EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnColBeginDrag)
1043     EVT_LIST_COL_DRAGGING(LIST_CTRL, MyListCtrl::OnColDragging)
1044     EVT_LIST_COL_END_DRAG(LIST_CTRL, MyListCtrl::OnColEndDrag)
1045
1046     EVT_LIST_CACHE_HINT(LIST_CTRL, MyListCtrl::OnCacheHint)
1047
1048 #if USE_CONTEXT_MENU
1049     EVT_CONTEXT_MENU(MyListCtrl::OnContextMenu)
1050 #endif
1051     EVT_CHAR(MyListCtrl::OnChar)
1052
1053     EVT_RIGHT_DOWN(MyListCtrl::OnRightClick)
1054   */
1055 END_EVENT_TABLE()
1056   
1057 } // EO namespace creaImageIO
1058