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