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