1 #include <creaImageIOWxTreeView.h>
2 #include <creaImageIOGimmickView.h>
3 #include <creaImageIOSystem.h>
4 #include <wx/splitter.h>
6 #include <boost/date_time/gregorian/gregorian.hpp>
9 //=====================================================================
13 //=====================================================================
15 //=====================================================================
17 //=====================================================================
18 ///Comparing function for ordering algorithm. Takes parameters as strings.
19 int wxCALLBACK CompareFunctionStrings(long item1, long item2, long sortData)
21 creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
22 creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
24 const std::string& s1(*(data1->attr));
25 const std::string& s2(*(data2->attr));
47 //=====================================================================
49 //=====================================================================
50 ///Comparing function for ordering algorithm. Takes parameters as ints.
51 int wxCALLBACK CompareFunctionInts(long item1, long item2, long sortData)
53 creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
54 creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
56 const std::string& s1(*(data1->attr));
57 const std::string& s2(*(data2->attr));
59 int val1=atoi(s1.c_str());
60 int val2=atoi(s2.c_str());
85 //=====================================================================
88 //=====================================================================
91 //=====================================================================
93 WxTreeView::WxTreeView(TreeHandler* handler,
98 TreeView(handler, gimmick)
100 GimmickDebugMessage(1,"WxTreeView::WxTreeView"
104 // Split part below toolbar into notebook for views and panel
105 // for preview, messages...
107 // mSplitter = new wxSplitterWindow( this , -1);
110 wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
112 int ctrl_style = wxLC_REPORT | wxLC_VRULES;
113 int col_style = wxLIST_FORMAT_LEFT;
115 // Creating the ListCtrl for the levels > 0 (not for Root level)
117 i < handler->GetTree().GetNumberOfLevels() -1;
120 GimmickDebugMessage(5,"Creating view for level "<<i
123 level.SelectedUpToDate = true;
124 level.SortColumn = 0;
126 // If the first level : parent = this
127 wxWindow* sparent = this;
128 // else parent = last splitter
130 sparent = mLevelList[i-1].wxSplitter;
132 level.wxSplitter = new wxSplitterWindow( sparent , -1);
135 level.wxSplitter->Show(false);
137 // level.wxSplitter->SetMinimumPaneSize(100);
139 wxListCtrl* ctrl = new wxListCtrl(level.wxSplitter,
145 level.wxSplitter->Initialize(ctrl);
147 // Create the columns : one for each attribute of the level
151 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
152 for (a = handler->GetTree().GetAttributeDescriptorList(i+1).begin();
153 a != handler->GetTree().GetAttributeDescriptorList(i+1).end();
158 GimmickDebugMessage(5,"Creating column "<<col<<" : "
162 if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE)
165 if(a->GetName()=="UNKNOWN")
168 title += handler->GetTree().GetLevelDescriptor(i+1).GetName();
169 if (title[title.size()-1]!='s')
177 std::string temp = a->GetKey();
178 if (temp.compare("ID") != 0)
181 ctrl->InsertColumn(col,
186 level.key.push_back(a->GetKey());
191 mLevelList.push_back(level);
198 wxMenuItem* m1=menu->Append(wxID_ANY, _T("&Sort ascending"));
199 wxMenuItem* m2=menu->Append(wxID_ANY, _T("&Sort descending"));
200 wxMenuItem* m3=menu->Append(wxID_ANY, _T("&Filter"));
201 mAscendingID=m1->GetId();
202 mDescendingID=m2->GetId();
203 mFilterID=m3->GetId();
204 Connect( mAscendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
205 Connect( mDescendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
206 Connect( mFilterID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupFilter) );
211 menuItem =new wxMenu;
212 wxMenuItem* m1Item=menuItem->Append(wxID_ANY, _T("&Anonymize"));
213 wxMenuItem* m2Item=menuItem->Append(wxID_ANY, _T("&Local Copy"));
214 wxMenuItem* m3Item=menuItem->Append(wxID_ANY, _T("&Edit Fields"));
216 mAnonymizingID=m1Item->GetId();
217 mLocalCopyID=m2Item->GetId();
218 mEditFieldID=m3Item->GetId();
219 //Connect( mAnonymizingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnAnonymize) );
220 Connect( mLocalCopyID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnLocalCopy) );
221 Connect( mEditFieldID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnEditField) );
224 #endif // wxUSE_MENUS
225 /// Initialize the first level splitter
227 sizer->Add( mLevelList[0].wxSplitter ,1, wxGROW ,0);
228 // mColumnSelected=1;
233 mIgnoreSelectedChanged = false;
235 //CreateColorPalette();
243 //=====================================================================
245 //=====================================================================
247 WxTreeView::~WxTreeView()
249 GimmickDebugMessage(1,"WxTreeView::~WxTreeView"
255 //=====================================================================
259 //=====================================================================
260 const std::vector<tree::Node*>& WxTreeView::GetSelected(int level)
262 std::vector<tree::Node*>& sel = mLevelList[0].Selected;
263 // if (GetSelectedUpToDate(level))
265 // the selection of upper level
266 if(mLevelList.size() == level -1)
267 sel = mLevelList.back().Selected;
269 sel= mLevelList[l].Selected;
276 sel.push_back(GetTreeHandler()->GetTree().GetTree());
278 else if (level < mLevelList.size()+2 )
283 item = GetCtrl(l-1)->GetNextItem(item,
285 wxLIST_STATE_SELECTED);
288 long adr = GetCtrl(l-1)->GetItemData(item);
289 tree::Node* n = ((ItemData*)adr)->node;
290 if(mLastSelected==item)
292 std::vector<tree::Node*>::iterator it;
294 it = sel.insert ( it , n );
303 /*int n = GetCtrl(l-1)->GetItemCount();
304 for (int i = 0; i<n; i++)
306 std::cout<<GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED)<<std::endl;
307 if ( GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED))
309 long adr = GetCtrl(l-1)->GetItemData(i);
310 tree::Node* n = ((ItemData*)adr)->node;
313 std::vector<tree::Node*>::iterator it;
315 it = sel.insert ( it , n );
330 // return mLevelList[level-1].Selected;
334 //=====================================================================
336 //=====================================================================
337 ///Removes selected nodes on last selected level
339 void WxTreeView::RemoveSelected()
341 unsigned int tempLevel = mLastLevel;
343 const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
344 // if no selection, no remove action.
348 std::stringstream out;
349 std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
352 if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
359 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<"?";
361 if (wxMessageBox(crea::std2wx(out.str()),
363 wxYES_NO,this ) == wxYES)
369 GetGimmickView()->modifyValidationSignal(false);
370 bool needRefresh=false;
371 std::vector<tree::Node*>::const_iterator i;
372 for (i=sel.begin(); i!=sel.end(); ++i)
379 if((*i)->GetParent()->GetNumberOfChildren()<2)
383 tree::Node* n= (tree::Node*)(*i);
384 GetTreeHandler()->LoadChildren((*i),4);
385 GetGimmickView()->AddIgnoreFile(n);
386 GetTreeHandler()->Remove(*i);
389 if(needRefresh && mLastLevel>1)
391 UpdateLevel(mLastLevel-2);
393 else if(mLastLevel>1)
395 UpdateLevel(mLastLevel-1);
399 UpdateLevel(mLastLevel);
405 // no need to incremente level
406 mLastLevel = tempLevel;
412 //=====================================================================
413 /// Updates a level of the view (adds or removes children, etc.)
414 void WxTreeView::UpdateLevel( int level )
416 GimmickDebugMessage(1,
417 GetTreeHandler()->GetTree().GetLabel()
418 <<"WxTreeView::UpdateLevel(level "
424 RecursiveUpdateLevel(level);
426 for (i=0; i<level-1; i++)
428 if (!GetSplitter(i)->IsSplit())
429 GetSplitter(i)->SplitVertically( GetCtrl(i), GetSplitter(i+1),
432 if (GetSplitter(i)->IsSplit()) GetSplitter(i)->Unsplit();
435 //=====================================================================
437 //=====================================================================
438 /// Recursive method called upon by UpdateLevel to refresh all windows
439 void WxTreeView::RecursiveUpdateLevel( int level )
441 GimmickDebugMessage(1,
442 GetTreeHandler()->GetTree().GetLabel()
443 <<"WxTreeView::RecursiveUpdateLevel(level "
448 const std::vector<tree::Node*>& sel(GetSelected(level));
452 // to speed up inserting we hide the control temporarily
454 GetCtrl(l)->DeleteAllItems();
456 std::vector<tree::Node*>::const_iterator i;
458 for (i=sel.begin(); i!=sel.end(); ++i)
460 GimmickDebugMessage(1,
461 "adding children of '"
467 //Adds items and sets their attributes
469 GetTreeHandler()->LoadChildren(*i,1);
470 tree::Node::ChildrenListType::reverse_iterator j;
471 for (j = (*i)->GetChildrenList().rbegin();
472 j!= (*i)->GetChildrenList().rend();
475 GimmickDebugMessage(1,
482 item.SetMask(wxLIST_MASK_STATE |
484 // wxLIST_MASK_IMAGE |
486 // wxLIST_MASK_WIDTH |
490 ItemData* data = new ItemData();
498 GetCtrl(l)->InsertItem(item);
501 for (int k=0; k<GetCtrl(l)->GetColumnCount(); ++k)
504 // Temporary correction : it works but no explanation about the problem FCY
508 val = (*j)->GetAttribute("NumberOfChildren");
511 val = (*j)->GetAttribute(mLevelList[l].key[k]);
512 if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isDateEntry()) // Date
514 // std::cout << "["<<val<< "]" << std::endl;
515 std::string valtmp(val);
518 boost::gregorian::date d1(boost::gregorian::from_undelimited_string(val));
519 val = to_iso_extended_string(d1);
525 // std::cout << "["<<val<< "]" << std::endl;
527 else if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isTimeEntry()) // Time
529 if ((val.size()>6) &&
530 (val != "" || val != " "))
531 val = val.substr(0,2) + " : "
532 + val.substr(2,2) + " : "
537 if (val.size()==0) val = "?";
539 if (val.size()==0) val = "X";
540 item.SetText( crea::std2wx(val));
543 GetCtrl(l)->SetItem(item);
553 //=====================================================================
556 //================================================================
557 void WxTreeView::OnItemDeSelected(wxListEvent& event)
559 GimmickDebugMessage(1,
560 GetTreeHandler()->GetTree().GetLabel()
561 <<" WxTreeView::OnItemDeselected"<<std::endl);
562 // retrieve the level
563 wxObject* obj = event.GetEventObject();
564 unsigned int level = 0;
565 for (level = 0; level<mLevelList.size(); ++level)
567 if ( GetCtrl(level) == obj ) break;
569 SetSelectedUpToDate(level,false);
570 // to allow a first selection in images TreeView
571 if (level==mLevelList.size()-1)
572 OnItemSelected(event);
574 //================================================================
576 //================================================================
577 void WxTreeView::OnItemSelected(wxListEvent& event)
580 GimmickDebugMessage(1,
581 GetTreeHandler()->GetTree().GetLabel()
582 <<" WxTreeView::OnItemSelected"<<std::endl);
584 if (mIgnoreSelectedChanged)
586 GimmickDebugMessage(1,
587 " mIgnoreSelectedChanged true: returning"
595 info.m_itemId = event.m_itemIndex;
596 mLastSelected = event.m_itemIndex;
597 // retrieve the level
598 wxObject* obj = event.GetEventObject();
599 unsigned int level = 0;
600 for (level = 0; level<mLevelList.size(); ++level)
602 if ( GetCtrl(level) == obj ) break;
605 GimmickDebugMessage(1,
609 // Update the children level (if selection not at last level)
610 if (level<mLevelList.size()-1)
613 UpdateLevel( level + 2 );
614 // Reset the viewer setting the default image
615 GetGimmickView()->ClearSelection();
617 // Select all images if the selection is at series level
618 if (level==mLevelList.size()-2)
620 // Validate selected images if the selection is at image level
621 if (level==(mLevelList.size()-1)) //&&mProcess)
623 if(event.GetEventType()==wxEVT_COMMAND_LIST_ITEM_SELECTED)
625 ValidateSelectedImages (true);
629 ValidateSelectedImages (false);
634 //================================================================
636 //================================================================
637 void WxTreeView::SelectAll(int level)
640 // int level=mLevelList.size()-1;
643 item = GetCtrl(level)->GetNextItem(item,
648 if(item==(GetCtrl(level)->GetItemCount()-1))
650 mIgnoreSelectedChanged = false;//mProcess=true;
654 mIgnoreSelectedChanged = true;// mProcess=false;
656 GetCtrl(level)->SetItemState(item,wxLIST_STATE_SELECTED, wxLIST_MASK_STATE
657 | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT);
661 //================================================================
662 //================================================================
664 void WxTreeView::OnColClick(wxListEvent& event)
666 mColumnSelected = event.m_col;
668 clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
669 clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
670 senderCtrl = event.GetEventObject();
671 unsigned int level = 0;
672 for (level = 0; level<mLevelList.size(); ++level)
674 if ( GetCtrl(level) == senderCtrl ) break;
676 PopupMenu(menu, clientpt);
680 //================================================================
681 //================================================================
683 void WxTreeView::OnItemMenu(wxListEvent &event)
686 clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
687 clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
688 senderCtrl = event.GetEventObject();
689 unsigned int level = 0;
690 for (level = 0; level<mLevelList.size(); ++level)
692 if ( GetCtrl(level) == senderCtrl ) break;
696 mLastRightLevel=level;
697 mLastRightSelected=GetCtrl(level)->HitTest(wxPoint(0,clientpt.y-8),flag,ptr);
698 PopupMenu(menuItem, clientpt);
702 //================================================================
703 //================================================================
705 void WxTreeView::OnPopupFilter(wxCommandEvent& event)
708 GimmickDebugMessage(7,
709 "WxTreeView::OnEndLabelEdit"
711 unsigned int level = 0;
712 for (level = 0; level<mLevelList.size(); ++level)
714 if ( GetCtrl(level) == senderCtrl ) break;
716 std::string filter = crea::wx2std(wxGetTextFromUser(_T("Enter the filter to apply"), _T("Filter On Column")));
721 UpdateLevel(level+1);
723 std::vector<long> items;
728 it = GetCtrl(level)->GetNextItem(it,
733 long adr = GetCtrl(level)->GetItemData(it);
734 tree::Node* nod = ((ItemData*)adr)->node;
735 att=(*nod).GetAttribute(mLevelList[level].key[mColumnSelected]);
738 if(att.find(filter)>900)
750 items.push_back(it-del);
754 std::vector<long>::iterator iter;
755 for(iter=items.begin();iter!=items.end();++iter)
757 GetCtrl(level)->DeleteItem(*iter);
759 GetGimmickView()->ClearSelection();
761 //================================================================
763 //================================================================
764 void WxTreeView::OnPopupSort(wxCommandEvent& event)
767 unsigned int level = 0;
768 for (level = 0; level<mLevelList.size(); ++level)
770 if ( GetCtrl(level) == senderCtrl ) break;
772 mLevelList[level].SortColumn = mColumnSelected;
774 if(event.GetId()==mAscendingID)
776 mLevelList[level].SortAscending = true;
778 else if(event.GetId()==mDescendingID)
780 mLevelList[level].SortAscending = false;
785 //================================================================
787 //================================================================
788 void WxTreeView::OnLocalCopy(wxCommandEvent& event)
792 unsigned int tempLevel = mLastLevel;
794 const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
799 std::stringstream out;
800 std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
803 if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
806 out<<"s to .gimmick?";
810 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<" to .gimmick?";
812 if (wxMessageBox(crea::std2wx(out.str()),
814 wxYES_NO,this ) == wxYES)
820 std::vector<std::string> s;
821 GetFilenamesAsString(sel,s);
822 GetGimmickView()->CopyFiles(s);
827 mLastLevel = tempLevel;
832 //================================================================
834 //================================================================
835 void WxTreeView::OnEditField(wxCommandEvent& event)
837 if(mLastRightSelected!=-1)
839 tree::Node* node=((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node;
840 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
841 std::vector<std::string> names;
842 std::vector<std::string> keys;
843 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).begin();
844 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).end();
847 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE)
849 names.push_back(a->GetName());
850 keys.push_back(a->GetKey());
853 GetGimmickView()->CreateEditFieldsDialog(node,names,keys);
856 //================================================================
858 //================================================================
859 void WxTreeView::SortLevel(int level)
861 GimmickDebugMessage(1,
862 "WxTreeView::SortLevel("
865 //Obtain the column name and the level that needs to be organized
867 // int l = level - 1;
868 //Sets the data for the items to be sorted
872 int n = GetCtrl(level)->GetItemCount();
873 for (int i = 0; i < n; i++)
876 //Gets current item data
877 ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
879 //Extracts the node and the type of attribute
880 tree::Node* nod = data->node;
883 (*nod).GetAttributeDescriptor
884 (mLevelList[level].key[mLevelList[level].SortColumn])
887 //Obtains the organizing attribute
888 data->attr = & (*nod).GetAttribute
889 (mLevelList[level].key[mLevelList[level].SortColumn]);
891 data->selected = false;
892 if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
894 data->selected = true;
899 GimmickDebugMessage(1,
900 "WxTreeView::OnSort : "
901 <<nbselected<<" selected before sorting"
904 mIgnoreSelectedChanged = true;
906 if (mLevelList[level].SortAscending)
911 GetCtrl(level)->SortItems(CompareFunctionInts, 0);
915 GetCtrl(level)->SortItems(CompareFunctionStrings, 0);
923 GetCtrl(level)->SortItems(CompareFunctionInts, 1);
927 GetCtrl(level)->SortItems(CompareFunctionStrings, 1);
932 // Reselects the unselected
933 n = GetCtrl(level)->GetItemCount();
935 for (int i = 0; i < n; i++)
938 //Gets current item data
939 ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
944 // item = GetCtrl(level)->GetNextItem(item,wxLIST_NEXT_ALL);
945 // if ( item == -1 ) break;
946 //Gets current item data
947 // ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(item);
955 // if it is the last one we must process the selection
956 mIgnoreSelectedChanged = false;
958 GetCtrl(level)->SetItemState(i,
959 wxLIST_STATE_SELECTED,
965 | wxLIST_MASK_FORMAT);
967 if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
974 mIgnoreSelectedChanged = false;
975 GimmickDebugMessage(1,
976 "WxTreeView::SortLevel : "
977 <<after<<" selected after sorting"
981 //================================================================
984 //================================================================
985 void WxTreeView::ValidateSelectedImages(bool isSelection)
987 GimmickDebugMessage(7,
988 "WxTreeView::ValidateSelectedImages"
990 const std::vector<tree::Node*>& sel(GetSelected(mLevelList.size()+1));
991 GetGimmickView()->OnSelectionChange(sel,
992 isSelection,(mLastSelected-1),
993 !mIgnoreSelectedChanged);
996 //================================================================
999 //================================================================
1000 void WxTreeView::GetNodes(std::vector<tree::Node*>& nodes, bool direction)
1002 long item = mLastSelected;
1003 int level=mLevelList.size()-1;
1004 //Gets current item data
1005 long adr = GetCtrl(level)->GetItemData(item);
1007 tree::Node* nod = ((ItemData*)adr)->node;
1012 item = GetCtrl(level)->GetNextItem(item,
1017 item = GetCtrl(level)->GetNextItem(item,
1020 if ( item == -1 || item==0 )
1024 if(GetCtrl(level)->GetItemState(item, wxLIST_STATE_SELECTED)==0 )
1027 adr = GetCtrl(level)->GetItemData(item);
1028 nod = ((ItemData*)adr)->node;
1029 nodes.push_back(nod);
1034 //================================================================
1035 //=================================================
1036 void WxTreeView::OnKeyDown(wxListEvent &event)
1038 if(event.GetKeyCode() == WXK_DELETE)
1043 GetGimmickView()->ClearSelection();
1047 //================================================================
1049 //================================================================
1050 // Should be in another place : not specific !
1051 void WxTreeView::GetSelectedAsString(std::vector<std::string>&s)
1053 int level=mLevelList.size();
1054 const std::vector<tree::Node*>& sel=GetSelected(level+1);
1055 std::vector<tree::Node*>::const_iterator i;
1057 for (i=sel.begin(); i!=sel.end(); ++i)
1059 std::string filename=(*i)->GetAttribute("FullFileName");
1060 s.push_back(filename);
1064 //================================================================
1065 void WxTreeView::GetFilenamesAsString(const std::vector<tree::Node*>& nodes, std::vector<std::string>&s)
1067 std::vector<tree::Node*>::const_iterator i;
1069 for (i=nodes.begin(); i!=nodes.end(); ++i)
1071 if((*i)->GetLevel()<mLevelList.size())
1073 GetTreeHandler()->LoadChildren(*i,0);
1074 GetFilenamesAsString((*i)->GetChildrenList(),s);
1078 std::string filename=(*i)->GetAttribute("FullFileName");
1079 s.push_back(filename);
1084 //================================================================
1086 //================================================================
1087 void WxTreeView::GetAttributes(std::vector<std::string>& areShown, std::vector<std::string>& notShown, int level)
1091 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1092 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).begin();
1093 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).end();
1096 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE && IsAttributeVisible(a->GetName(),level))
1098 areShown.push_back(a->GetName());
1101 notShown=mLevelList[level-1].notShownAtts;
1104 //================================================================
1105 void WxTreeView::SetNonVisibleAttributes(const std::vector<std::string>& notShown, int nlevel)
1107 mLevelList[nlevel].notShownAtts=notShown;
1110 //================================================================
1111 void WxTreeView::CreateCtrl(std::vector<std::string>& notShown, int nlevel)
1113 int ctrl_style = wxLC_REPORT | wxLC_VRULES;
1114 int col_style = wxLIST_FORMAT_LEFT;
1116 mLevelList[nlevel].SelectedUpToDate = true;
1117 mLevelList[nlevel].SortColumn = 0;
1118 mLevelList[nlevel].key.clear();
1120 mLevelList[nlevel].wxCtrl = new wxListCtrl(mLevelList[nlevel].wxSplitter,
1125 wxWindow* oldWin=mLevelList[nlevel].wxSplitter->GetWindow1();
1126 mLevelList[nlevel].wxSplitter->ReplaceWindow(oldWin,mLevelList[nlevel].wxCtrl);
1127 mLevelList[nlevel].wxSplitter->Initialize(mLevelList[nlevel].wxCtrl);
1129 // Create the columns : one for each attribute of the level
1133 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1134 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).begin();
1135 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).end();
1139 if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE && IsAttributeVisible(a->GetName(),nlevel+1))
1142 std::string temp = a->GetKey();
1143 if (temp.compare("ID") != 0)
1145 mLevelList[nlevel].wxCtrl->InsertColumn(col,
1146 crea::std2wx(title),
1150 mLevelList[nlevel].key.push_back(a->GetKey());
1158 //================================================================
1159 bool WxTreeView::IsAttributeVisible(const std::string& val, int level)
1161 std::vector<std::string> ns=mLevelList[level-1].notShownAtts;
1162 std::vector<std::string>::iterator it;
1164 for(it=ns.begin();it!=ns.end()&&!found;++it)
1166 if(val.compare(*it)==0)
1175 //================================================================
1176 //================================================================
1177 BEGIN_EVENT_TABLE(WxTreeView, wxPanel)
1179 EVT_SIZE(MyFrame::OnSize)
1181 EVT_MENU(LIST_QUIT, MyFrame::OnQuit)
1182 EVT_MENU(LIST_ABOUT, MyFrame::OnAbout)
1183 EVT_MENU(LIST_LIST_VIEW, MyFrame::OnListView)
1184 EVT_MENU(LIST_REPORT_VIEW, MyFrame::OnReportView)
1185 EVT_MENU(LIST_ICON_VIEW, MyFrame::OnIconView)
1186 EVT_MENU(LIST_ICON_TEXT_VIEW, MyFrame::OnIconTextView)
1187 EVT_MENU(LIST_SMALL_ICON_VIEW, MyFrame::OnSmallIconView)
1188 EVT_MENU(LIST_SMALL_ICON_TEXT_VIEW, MyFrame::OnSmallIconTextView)
1189 EVT_MENU(LIST_VIRTUAL_VIEW, MyFrame::OnVirtualView)
1190 EVT_MENU(LIST_SMALL_VIRTUAL_VIEW, MyFrame::OnSmallVirtualView)
1192 EVT_MENU(LIST_FOCUS_LAST, MyFrame::OnFocusLast)
1193 EVT_MENU(LIST_TOGGLE_FIRST, MyFrame::OnToggleFirstSel)
1194 EVT_MENU(LIST_DESELECT_ALL, MyFrame::OnDeselectAll)
1195 EVT_MENU(LIST_SELECT_ALL, MyFrame::OnSelectAll)
1196 EVT_MENU(LIST_DELETE, MyFrame::OnDelete)
1197 EVT_MENU(LIST_ADD, MyFrame::OnAdd)
1198 EVT_MENU(LIST_EDIT, MyFrame::OnEdit)
1199 EVT_MENU(LIST_DELETE_ALL, MyFrame::OnDeleteAll)
1200 EVT_MENU(LIST_SORT, MyFrame::OnSort)
1201 EVT_MENU(LIST_SET_FG_COL, MyFrame::OnSetFgColour)
1202 EVT_MENU(LIST_SET_BG_COL, MyFrame::OnSetBgColour)
1203 EVT_MENU(LIST_TOGGLE_MULTI_SEL, MyFrame::OnToggleMultiSel)
1204 EVT_MENU(LIST_SHOW_COL_INFO, MyFrame::OnShowColInfo)
1205 EVT_MENU(LIST_SHOW_SEL_INFO, MyFrame::OnShowSelInfo)
1206 EVT_MENU(LIST_FREEZE, MyFrame::OnFreeze)
1207 EVT_MENU(LIST_THAW, MyFrame::OnThaw)
1208 EVT_MENU(LIST_TOGGLE_LINES, MyFrame::OnToggleLines)
1209 EVT_MENU(LIST_MAC_USE_GENERIC, MyFrame::OnToggleMacUseGeneric)
1211 EVT_UPDATE_UI(LIST_SHOW_COL_INFO, MyFrame::OnUpdateShowColInfo)
1212 EVT_UPDATE_UI(LIST_TOGGLE_MULTI_SEL, MyFrame::OnUpdateToggleMultiSel)
1215 BEGIN_EVENT_TABLE(MyListCtrl, wxListCtrl)
1216 EVT_LIST_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnBeginDrag)
1217 EVT_LIST_BEGIN_RDRAG(LIST_CTRL, MyListCtrl::OnBeginRDrag)
1219 EVT_LIST_BEGIN_LABEL_EDIT(-1, WxTreeView::OnBeginLabelEdit)
1220 EVT_LIST_END_LABEL_EDIT(-1, WxTreeView::OnEndLabelEdit)
1222 EVT_LIST_DELETE_ITEM(LIST_CTRL, MyListCtrl::OnDeleteItem)
1223 EVT_LIST_DELETE_ALL_ITEMS(LIST_CTRL, MyListCtrl::OnDeleteAllItems)
1224 #if WXWIN_COMPATIBILITY_2_4
1225 EVT_LIST_GET_INFO(LIST_CTRL, MyListCtrl::OnGetInfo)
1226 EVT_LIST_SET_INFO(LIST_CTRL, MyListCtrl::OnSetInfo)
1229 EVT_LIST_KEY_DOWN(-1, WxTreeView::OnKeyDown)
1230 EVT_LIST_ITEM_SELECTED(-1, WxTreeView::OnItemSelected)
1231 EVT_LIST_ITEM_RIGHT_CLICK(-1, WxTreeView::OnItemMenu)
1232 EVT_LIST_ITEM_DESELECTED(-1, WxTreeView::OnItemDeSelected)
1234 EVT_LIST_KEY_DOWN(LIST_CTRL, MyListCtrl::OnListKeyDown)
1235 EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, MyListCtrl::OnActivated)
1236 EVT_LIST_ITEM_FOCUSED(LIST_CTRL, MyListCtrl::OnFocused)
1238 EVT_LIST_COL_RIGHT_CLICK(-1, WxTreeView::OnColClick)
1240 EVT_LIST_COL_CLICK(-1, WxTreeView::OnColClick)
1242 //EVT_LEFT_DOWN(WxTreeView::OnMouseClick)
1244 EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnColBeginDrag)
1245 EVT_LIST_COL_DRAGGING(LIST_CTRL, MyListCtrl::OnColDragging)
1246 EVT_LIST_COL_END_DRAG(LIST_CTRL, MyListCtrl::OnColEndDrag)
1248 EVT_LIST_CACHE_HINT(LIST_CTRL, MyListCtrl::OnCacheHint)
1250 #if USE_CONTEXT_MENU
1251 EVT_CONTEXT_MENU(MyListCtrl::OnContextMenu)
1253 EVT_CHAR(MyListCtrl::OnChar)
1255 EVT_RIGHT_DOWN(MyListCtrl::OnRightClick)
1259 } // EO namespace creaImageIO