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