]> Creatis software - creaImageIO.git/blob - src2/creaImageIOWxTreeView.cpp
cba942fd9286fe1c7484a32bd42bd6ba0e51ece6
[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
512   void WxTreeView::OnMouseClick(wxMouseEvent& event)
513   { 
514            if (event.ButtonDown())
515            {
516            }
517           std::cout<<"HELLO WORLD"<<std::endl;
518   }
519   //================================================================
520   //================================================================
521
522   void WxTreeView::OnColClick(wxListEvent& event)
523   { 
524         mColumnSelected=event.m_col;
525         wxPoint clientpt;
526         clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
527         clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
528         senderCtrl = event.GetEventObject(); 
529         unsigned int level = 0;
530         for (level = 0; level<mLevelList.size(); ++level)
531         {
532         if ( GetCtrl(level) == senderCtrl ) break;
533         }
534         /*for(int i=0;i<mColumnSelected;i++)
535         {
536                 clientpt.x+=GetCtrl(level)->GetColumnWidth(i);
537         }
538         for(int i=0;i<level;i++)
539         {
540                 clientpt.x+=GetSplitter(i)->GetSashPosition();
541         }
542         clientpt.y+=level*2;    */
543         if(level==mLevelList.size()-1)
544         {
545                 mColumnSelected+=1;
546                 PopupMenu(menu, clientpt);
547         }
548         else if(mColumnSelected!=0)
549         {
550                 PopupMenu(menu, clientpt);
551         }
552
553   }
554     //================================================================
555   void WxTreeView::OnPopupFilter(wxCommandEvent& event)
556   {
557                 wxBusyCursor busy;
558                  GimmickDebugMessage(7,
559                         "WxTreeView::OnEndLabelEdit" 
560                         <<std::endl);
561           wxObject* ctrl = event.GetEventObject(); 
562                 unsigned int level = 0;
563                 for (level = 0; level<mLevelList.size(); ++level)
564                 {
565                 if ( GetCtrl(level) == senderCtrl ) break;
566                 }
567                 std::string filter = crea::wx2std(wxGetTextFromUser(_T("Enter the filter to apply"), _T("Filter On Column")));
568                 
569                 std::string att;
570                 
571                 long it = -1;
572                 UpdateLevel(level+1);
573                 
574                 std::vector<long> items;
575                 bool in=false;
576                 int del=0;
577                 for ( ;; )
578                 {
579                         it = GetCtrl(level)->GetNextItem(it,
580                                                                                 wxLIST_NEXT_ALL);
581                         if ( it == -1 )
582                                 break;
583                         
584                         long adr = GetCtrl(level)->GetItemData(it);
585                         tree::Node* nod = ((ItemData*)adr)->node;
586                         att=(*nod).GetAttribute(mLevelList[level].key[mColumnSelected-1]);
587                         
588                         
589                         if(att.find(filter)>900)
590                         {
591                                 
592                                 if(!in)
593                                 {
594                                         in=true;
595                                 }
596                                 else
597                                 {
598                                         del+=1;
599                                 }
600                                 
601                                 items.push_back(it-del);
602                         }
603                         
604                 }
605                 std::vector<long>::iterator iter;
606                 for(iter=items.begin();iter!=items.end();++iter)
607                 {
608                         GetCtrl(level)->DeleteItem(*iter);
609                 }
610                 GetGimmickView()->ClearSelection();
611   }
612   //================================================================
613
614   //================================================================
615   void WxTreeView::OnPopupSort(wxCommandEvent& event)
616   {
617                 wxBusyCursor busy;
618                 unsigned int level = 0;
619                 for (level = 0; level<mLevelList.size(); ++level)
620                 {
621                 if ( GetCtrl(level) == senderCtrl ) break;
622                 }
623                 if(event.GetId()==mAscendingID)
624                 {
625                         mDirection=true;
626                 }
627                 else if(event.GetId()==mDescendingID)
628                 {
629                         mDirection=false;
630                 }
631
632         OnSort(level);
633   }
634   //================================================================
635   void WxTreeView::OnSort(int level)
636   {       
637         //Obtain the column name and the level that needs to be organized
638
639         if(level==mLevelList.size()-1||mColumnSelected!=0)
640         {        
641                 int l = level - 1;
642                 //GetCtrl(level)->DeleteItem(0);
643                 //Sets the data for the items to be sorted
644                 std::string att;
645                 unsigned int ty=0;
646                 int n = GetCtrl(level)->GetItemCount();
647                 for (int i = 0; i < n; i++)
648                 {
649                           
650                         //Gets current item data
651                         long adr = GetCtrl(level)->GetItemData(i);
652                         
653                         //Extracts the node and the type of attribute
654                         tree::Node* nod = ((ItemData*)adr)->node;
655                         if(i==0)
656                         {
657                                 (*nod).GetAttributeDescriptor(mLevelList[level].key[mColumnSelected-1]).DecodeType(ty);
658                         }
659                         //Obtains the organizing attribute
660                         att=(*nod).GetAttribute(mLevelList[level].key[mColumnSelected-1]);
661                         
662                         char* d= new char [att.size()+1];
663                         strcpy (d, att.c_str());
664
665                         //Creates array
666                         long* lp= new long[2];
667                         lp[0]=adr;
668                         lp[1]=(long)d;
669                          
670                         //Sets it as the data
671                         GetCtrl(level)->SetItemData(i,(long)lp);
672                 }       
673                   
674                 if(mDirection)
675                 {
676                         if(ty==1)
677                         {
678                                 GetCtrl(level)->SortItems(CompareFunctionInts, 0);
679                         }
680                         else
681                         {
682                                 GetCtrl(level)->SortItems(CompareFunctionStrings, 0);
683                         }
684                         
685                 }
686                 else
687                 {
688                         if(ty==1)
689                         {
690                                 GetCtrl(level)->SortItems(CompareFunctionInts, 1);
691                         }
692                         else
693                         {
694                                 GetCtrl(level)->SortItems(CompareFunctionStrings, 1);
695                         }
696                 }
697
698                 //Resets original data
699                 std::vector<tree::Node*>::iterator selection;
700                 std::vector<long> change;
701                 long it = -1;
702                 for ( ;; )
703                 {
704                         it = GetCtrl(level)->GetNextItem(it,
705                                                                                 wxLIST_NEXT_ALL);
706                         if ( it == -1 )
707                                 break;
708                         
709                         //Gets current item data, extracts the node and resets it
710                         long item = GetCtrl(level)->GetItemData(it);
711                         GetCtrl(level)->SetItemData(it,((long*)item)[0]);
712                         tree::Node* n= ((ItemData*)((long*)item)[0])->node;
713                         if(level<mLevelList.size()-1)
714                         {
715                                 for(selection=mSelected.begin();selection!=mSelected.end();++selection)
716                                 {
717                                         if((*selection)->GetAttribute("ID").compare(n->GetAttribute("ID"))==0)
718                                         {
719                                                 change.push_back(it);   
720                                         }
721                                 }
722                         }
723                         else
724                         {
725                                 for(selection=mLastLevelSelected.begin();selection!=mLastLevelSelected.end();++selection)
726                                 {
727                                         if((*selection)->GetAttribute("ID").compare(n->GetAttribute("ID"))==0)
728                                         {
729                                                 change.push_back(it);   
730                                         }
731                                 }
732                         }
733                         
734                         
735                 }
736                 //Resets the selected items
737                 std::vector<long>::iterator selectedIts;
738                 for(selectedIts=change.begin();selectedIts!=change.end();++selectedIts)
739                 {
740                         GetCtrl(level)->SetItemState(*selectedIts,wxLIST_STATE_SELECTED, wxLIST_MASK_STATE 
741                 | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT);
742                         
743                 }
744                 //GetCtrl(level)->InsertItem(0,_T("Filter:"));
745         }
746         
747    }
748  
749   //================================================================
750   void WxTreeView::ValidateSelectedImages(bool isSelection)
751   {
752     GimmickDebugMessage(7,
753                         "WxTreeView::ValidateSelectedImages" 
754                         <<std::endl);
755     std::vector<tree::Node*> sel(GetSelected(mLevelList.size()+1));
756         GetGimmickView()->OnSelectionChange(sel,isSelection,(mLastSelected-1), mProcess);
757  
758   }
759   //================================================================
760
761
762   //================================================================
763   void WxTreeView::GetNodes(std::vector<tree::Node*>& nodes, bool direction)
764   {
765         long item = mLastSelected;
766         int level=mLevelList.size()-1;
767         //Gets current item data
768         long adr = GetCtrl(level)->GetItemData(item);
769         //Extracts the node
770         tree::Node* nod = ((ItemData*)adr)->node;
771     for ( ;; )
772     {
773                 if(direction)
774                 {
775                         item = GetCtrl(level)->GetNextItem(item,
776                                      wxLIST_NEXT_ABOVE);
777                 }
778                 else
779                 {
780                         item = GetCtrl(level)->GetNextItem(item,
781                                      wxLIST_NEXT_BELOW);
782                 }
783         if ( item == -1  )
784                 {
785             break;
786                 }
787                 if(GetCtrl(level)->GetItemState(item, wxLIST_STATE_SELECTED)==0 && item!=0)
788                 {
789                         adr = GetCtrl(level)->GetItemData(item);
790                         nod = ((ItemData*)adr)->node;
791                         nodes.push_back(nod);
792                 }
793     }
794
795   }
796
797   //================================================================
798   void WxTreeView::GetSelectedAsString(std::vector<std::string>&s)
799   {
800           int level=mLevelList.size();
801         std::vector<tree::Node*> sel=GetSelected(level+1);
802         std::vector<tree::Node*>::iterator i;
803         
804     for (i=sel.begin(); i!=sel.end(); ++i)
805       {
806                   std::string filename=(*i)->GetAttribute("FullFileName");
807                   s.push_back(filename);
808           }
809   }
810
811    //================================================================
812   void WxTreeView::SetColor(int l, int item)
813   {
814           int colorId=12;
815           GetCtrl(l)->SetItemTextColour(item, wxColourDatabase().Find
816                    (crea::std2wx(mColorPalette[colorId])));
817           GetCtrl(l)->SetItemState(item,wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED, wxLIST_STATE_SELECTED);  /*
818           int colorId=0;
819           //Setting the color according to the parent
820                 if(l==0)
821                 {
822                 item.SetBackgroundColour
823                   (wxColourDatabase().Find
824                    (crea::std2wx(mColorPalette[colorId]))); 
825                 mColorMap.insert
826                   (NodeColorPair
827                    (*j,wxColourDatabase().Find
828                     (crea::std2wx(mColorPalette[colorId]))));
829                 if(colorId<64)
830                   {
831                     colorId++;
832                   }
833                 else
834                         {
835                           colorId=0;
836                         }
837                 }
838                 else if(l!=mLevelList.size()-1)
839                   {
840                     item.SetBackgroundColour(mColorMap[*i]); 
841                         mColorMap.insert(NodeColorPair(*j,mColorMap[*i]));
842                 }
843                 else
844                 {
845                         item.SetBackgroundColour(mColorMap[*i]); 
846                 }*/
847   }
848   //================================================================
849   void WxTreeView::CreateColorPalette()
850   {
851   GimmickDebugMessage(6,"WxTreeView::CreateColorPalette");
852   mColorPalette.push_back("WHITE");
853   mColorPalette.push_back("LIGHT GREY");
854   mColorPalette.push_back("AQUAMARINE");
855   mColorPalette.push_back("MEDIUM FOREST GREEN");
856   mColorPalette.push_back("INDIAN RED");
857   mColorPalette.push_back("KHAKI");
858   mColorPalette.push_back("ORANGE");
859   mColorPalette.push_back("LIGHT BLUE");
860   mColorPalette.push_back("LIGHT STEEL BLUE");
861   mColorPalette.push_back("PINK");
862   mColorPalette.push_back("PLUM");
863   mColorPalette.push_back("PURPLE");
864   mColorPalette.push_back("RED");
865   mColorPalette.push_back("SEA GREEN");
866   mColorPalette.push_back("SIENNA");
867   mColorPalette.push_back("SKY BLUE");
868   mColorPalette.push_back("SLATE BLUE");
869   mColorPalette.push_back("SPRING GREEN");
870   mColorPalette.push_back("TAN");
871   mColorPalette.push_back("THISTLE");
872   mColorPalette.push_back("TURQUOISE");
873   mColorPalette.push_back("VIOLET");
874   mColorPalette.push_back("VIOLET RED");
875   mColorPalette.push_back("WHEAT");
876   mColorPalette.push_back("YELLOW");
877   mColorPalette.push_back("YELLOW GREEN");
878   mColorPalette.push_back("BLUE");
879   mColorPalette.push_back("BLUE VIOLET");
880   mColorPalette.push_back("BROWN");
881   mColorPalette.push_back("CADET BLUE");
882   mColorPalette.push_back("CORAL");
883   mColorPalette.push_back("CORNFLOWER BLUE");
884   mColorPalette.push_back("CYAN");
885   mColorPalette.push_back("DARK GREY");
886   mColorPalette.push_back("DARK GREEN");
887   mColorPalette.push_back("DARK OLIVE GREEN");
888   mColorPalette.push_back("DARK ORCHID");
889   mColorPalette.push_back("DARK SLATE BLUE");
890   mColorPalette.push_back("DARK SLATE GREY");
891   mColorPalette.push_back("DARK TURQUOISE");
892   mColorPalette.push_back("FIREBRICK");
893   mColorPalette.push_back("FOREST GREEN");
894   mColorPalette.push_back("GOLD");
895   mColorPalette.push_back("GOLDENROD");
896   mColorPalette.push_back("GREY");
897   mColorPalette.push_back("GREEN");
898   mColorPalette.push_back("GREEN YELLOW");
899   mColorPalette.push_back("LIME GREEN");
900   mColorPalette.push_back("MAGENTA");
901   mColorPalette.push_back("MAROON");
902   mColorPalette.push_back("MEDIUM AQUAMARINE");
903   mColorPalette.push_back("MEDIUM BLUE");
904   mColorPalette.push_back("MEDIUM GOLDENROD");
905   mColorPalette.push_back("MEDIUM ORCHID");
906   mColorPalette.push_back("MEDIUM SEA GREEN");
907   mColorPalette.push_back("MEDIUM SLATE BLUE");
908   mColorPalette.push_back("MEDIUM SPRING GREEN");
909   mColorPalette.push_back("MEDIUM TURQUOISE");
910   mColorPalette.push_back("MEDIUM VIOLET RED");
911   mColorPalette.push_back("MIDNIGHT BLUE");
912   mColorPalette.push_back("NAVY");
913   mColorPalette.push_back("ORANGE RED");
914   mColorPalette.push_back("ORCHID, PALE GREEN");
915   mColorPalette.push_back("STEEL BLUE");
916   mColorPalette.push_back("BLACK");
917
918
919   }
920   //================================================================
921   BEGIN_EVENT_TABLE(WxTreeView, wxPanel)   
922   /*
923     EVT_SIZE(MyFrame::OnSize)
924
925     EVT_MENU(LIST_QUIT, MyFrame::OnQuit)
926     EVT_MENU(LIST_ABOUT, MyFrame::OnAbout)
927     EVT_MENU(LIST_LIST_VIEW, MyFrame::OnListView)
928     EVT_MENU(LIST_REPORT_VIEW, MyFrame::OnReportView)
929     EVT_MENU(LIST_ICON_VIEW, MyFrame::OnIconView)
930     EVT_MENU(LIST_ICON_TEXT_VIEW, MyFrame::OnIconTextView)
931     EVT_MENU(LIST_SMALL_ICON_VIEW, MyFrame::OnSmallIconView)
932     EVT_MENU(LIST_SMALL_ICON_TEXT_VIEW, MyFrame::OnSmallIconTextView)
933     EVT_MENU(LIST_VIRTUAL_VIEW, MyFrame::OnVirtualView)
934     EVT_MENU(LIST_SMALL_VIRTUAL_VIEW, MyFrame::OnSmallVirtualView)
935
936     EVT_MENU(LIST_FOCUS_LAST, MyFrame::OnFocusLast)
937     EVT_MENU(LIST_TOGGLE_FIRST, MyFrame::OnToggleFirstSel)
938     EVT_MENU(LIST_DESELECT_ALL, MyFrame::OnDeselectAll)
939     EVT_MENU(LIST_SELECT_ALL, MyFrame::OnSelectAll)
940     EVT_MENU(LIST_DELETE, MyFrame::OnDelete)
941     EVT_MENU(LIST_ADD, MyFrame::OnAdd)
942     EVT_MENU(LIST_EDIT, MyFrame::OnEdit)
943     EVT_MENU(LIST_DELETE_ALL, MyFrame::OnDeleteAll)
944     EVT_MENU(LIST_SORT, MyFrame::OnSort)
945     EVT_MENU(LIST_SET_FG_COL, MyFrame::OnSetFgColour)
946     EVT_MENU(LIST_SET_BG_COL, MyFrame::OnSetBgColour)
947     EVT_MENU(LIST_TOGGLE_MULTI_SEL, MyFrame::OnToggleMultiSel)
948     EVT_MENU(LIST_SHOW_COL_INFO, MyFrame::OnShowColInfo)
949     EVT_MENU(LIST_SHOW_SEL_INFO, MyFrame::OnShowSelInfo)
950     EVT_MENU(LIST_FREEZE, MyFrame::OnFreeze)
951     EVT_MENU(LIST_THAW, MyFrame::OnThaw)
952     EVT_MENU(LIST_TOGGLE_LINES, MyFrame::OnToggleLines)
953     EVT_MENU(LIST_MAC_USE_GENERIC, MyFrame::OnToggleMacUseGeneric)
954
955     EVT_UPDATE_UI(LIST_SHOW_COL_INFO, MyFrame::OnUpdateShowColInfo)
956     EVT_UPDATE_UI(LIST_TOGGLE_MULTI_SEL, MyFrame::OnUpdateToggleMultiSel)
957 END_EVENT_TABLE()
958
959 BEGIN_EVENT_TABLE(MyListCtrl, wxListCtrl)
960     EVT_LIST_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnBeginDrag)
961     EVT_LIST_BEGIN_RDRAG(LIST_CTRL, MyListCtrl::OnBeginRDrag)
962         
963     EVT_LIST_BEGIN_LABEL_EDIT(-1, WxTreeView::OnBeginLabelEdit)
964     EVT_LIST_END_LABEL_EDIT(-1, WxTreeView::OnEndLabelEdit)
965         
966     EVT_LIST_DELETE_ITEM(LIST_CTRL, MyListCtrl::OnDeleteItem)
967     EVT_LIST_DELETE_ALL_ITEMS(LIST_CTRL, MyListCtrl::OnDeleteAllItems)
968 #if WXWIN_COMPATIBILITY_2_4
969     EVT_LIST_GET_INFO(LIST_CTRL, MyListCtrl::OnGetInfo)
970     EVT_LIST_SET_INFO(LIST_CTRL, MyListCtrl::OnSetInfo)
971 #endif
972   */
973     EVT_LIST_ITEM_SELECTED(-1, WxTreeView::OnSelectedChanged)
974   
975     EVT_LIST_ITEM_DESELECTED(-1, WxTreeView::OnSelectedChanged)
976         /*
977     EVT_LIST_KEY_DOWN(LIST_CTRL, MyListCtrl::OnListKeyDown)
978     EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, MyListCtrl::OnActivated)
979     EVT_LIST_ITEM_FOCUSED(LIST_CTRL, MyListCtrl::OnFocused)
980 */
981     EVT_LIST_COL_RIGHT_CLICK(-1, WxTreeView::OnColClick)
982         
983     EVT_LIST_COL_CLICK(-1, WxTreeView::OnColClick)
984
985         //EVT_LEFT_DOWN(WxTreeView::OnMouseClick)
986         /*
987     EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnColBeginDrag)
988     EVT_LIST_COL_DRAGGING(LIST_CTRL, MyListCtrl::OnColDragging)
989     EVT_LIST_COL_END_DRAG(LIST_CTRL, MyListCtrl::OnColEndDrag)
990
991     EVT_LIST_CACHE_HINT(LIST_CTRL, MyListCtrl::OnCacheHint)
992
993 #if USE_CONTEXT_MENU
994     EVT_CONTEXT_MENU(MyListCtrl::OnContextMenu)
995 #endif
996     EVT_CHAR(MyListCtrl::OnChar)
997
998     EVT_RIGHT_DOWN(MyListCtrl::OnRightClick)
999   */
1000 END_EVENT_TABLE()
1001   
1002 } // EO namespace creaImageIO
1003