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 // if (GetSelectedUpToDate(level))
264 // the selection of upper level
265 std::vector<tree::Node*>& sel(mLevelList[l].Selected);
272 sel.push_back(GetTreeHandler()->GetTree().GetTree());
274 else if (level < mLevelList.size()+2 )
279 item = GetCtrl(l-1)->GetNextItem(item,
281 wxLIST_STATE_SELECTED);
284 long adr = GetCtrl(l-1)->GetItemData(item);
285 tree::Node* n = ((ItemData*)adr)->node;
286 if(mLastSelected==item)
288 std::vector<tree::Node*>::iterator it;
290 it = sel.insert ( it , n );
299 /*int n = GetCtrl(l-1)->GetItemCount();
300 for (int i = 0; i<n; i++)
302 std::cout<<GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED)<<std::endl;
303 if ( GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED))
305 long adr = GetCtrl(l-1)->GetItemData(i);
306 tree::Node* n = ((ItemData*)adr)->node;
309 std::vector<tree::Node*>::iterator it;
311 it = sel.insert ( it , n );
326 // return mLevelList[level-1].Selected;
330 //=====================================================================
332 //=====================================================================
333 ///Removes selected nodes on last selected level
335 void WxTreeView::RemoveSelected()
337 unsigned int tempLevel = mLastLevel;
339 const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
340 // if no selection, no remove action.
344 std::stringstream out;
345 std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
348 if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
355 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<"?";
357 if (wxMessageBox(crea::std2wx(out.str()),
359 wxYES_NO,this ) == wxYES)
365 GetGimmickView()->modifyValidationSignal(false);
366 bool needRefresh=false;
367 std::vector<tree::Node*>::const_iterator i;
368 for (i=sel.begin(); i!=sel.end(); ++i)
375 if((*i)->GetParent()->GetNumberOfChildren()<2)
379 tree::Node* n= (tree::Node*)(*i);
380 GetTreeHandler()->LoadChildren((*i),4);
381 GetGimmickView()->AddIgnoreFile(n);
382 GetTreeHandler()->Remove(*i);
385 if(needRefresh && mLastLevel>1)
387 UpdateLevel(mLastLevel-2);
389 else if(mLastLevel>1)
391 UpdateLevel(mLastLevel-1);
395 UpdateLevel(mLastLevel);
401 // no need to incremente level
402 mLastLevel = tempLevel;
408 //=====================================================================
409 /// Updates a level of the view (adds or removes children, etc.)
410 void WxTreeView::UpdateLevel( int level )
412 GimmickDebugMessage(1,
413 GetTreeHandler()->GetTree().GetLabel()
414 <<"WxTreeView::UpdateLevel(level "
420 RecursiveUpdateLevel(level);
422 for (i=0; i<level-1; i++)
424 if (!GetSplitter(i)->IsSplit())
425 GetSplitter(i)->SplitVertically( GetCtrl(i), GetSplitter(i+1),
428 if (GetSplitter(i)->IsSplit()) GetSplitter(i)->Unsplit();
431 //=====================================================================
433 //=====================================================================
434 /// Recursive method called upon by UpdateLevel to refresh all windows
435 void WxTreeView::RecursiveUpdateLevel( int level )
437 GimmickDebugMessage(1,
438 GetTreeHandler()->GetTree().GetLabel()
439 <<"WxTreeView::RecursiveUpdateLevel(level "
444 const std::vector<tree::Node*>& sel(GetSelected(level));
448 // to speed up inserting we hide the control temporarily
450 GetCtrl(l)->DeleteAllItems();
452 std::vector<tree::Node*>::const_iterator i;
454 for (i=sel.begin(); i!=sel.end(); ++i)
456 GimmickDebugMessage(1,
457 "adding children of '"
463 //Adds items and sets their attributes
465 GetTreeHandler()->LoadChildren(*i,1);
466 tree::Node::ChildrenListType::reverse_iterator j;
467 for (j = (*i)->GetChildrenList().rbegin();
468 j!= (*i)->GetChildrenList().rend();
471 GimmickDebugMessage(1,
478 item.SetMask(wxLIST_MASK_STATE |
480 // wxLIST_MASK_IMAGE |
482 // wxLIST_MASK_WIDTH |
486 ItemData* data = new ItemData();
494 GetCtrl(l)->InsertItem(item);
497 for (int k=0; k<GetCtrl(l)->GetColumnCount(); ++k)
500 // Temporary correction : it works but no explanation about the problem FCY
504 val = (*j)->GetAttribute("NumberOfChildren");
507 val = (*j)->GetAttribute(mLevelList[l].key[k]);
508 if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isDateEntry()) // Date
510 // std::cout << "["<<val<< "]" << std::endl;
511 std::string valtmp(val);
514 boost::gregorian::date d1(boost::gregorian::from_undelimited_string(val));
515 val = to_iso_extended_string(d1);
521 // std::cout << "["<<val<< "]" << std::endl;
523 else if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isTimeEntry()) // Time
525 if ((val.size()>6) &&
526 (val != "" || val != " "))
527 val = val.substr(0,2) + " : "
528 + val.substr(2,2) + " : "
535 if (val.size()==0) val = "?";
536 item.SetText( crea::std2wx(val));
538 GetCtrl(l)->SetItem(item);
548 //=====================================================================
551 //================================================================
552 void WxTreeView::OnItemDeSelected(wxListEvent& event)
554 GimmickDebugMessage(1,
555 GetTreeHandler()->GetTree().GetLabel()
556 <<" WxTreeView::OnItemDeselected"<<std::endl);
557 // retrieve the level
558 wxObject* obj = event.GetEventObject();
559 unsigned int level = 0;
560 for (level = 0; level<mLevelList.size(); ++level)
562 if ( GetCtrl(level) == obj ) break;
564 SetSelectedUpToDate(level,false);
565 // to allow a first selection in images TreeView
566 if (level==mLevelList.size()-1)
567 OnItemSelected(event);
569 //================================================================
571 //================================================================
572 void WxTreeView::OnItemSelected(wxListEvent& event)
575 GimmickDebugMessage(1,
576 GetTreeHandler()->GetTree().GetLabel()
577 <<" WxTreeView::OnItemSelected"<<std::endl);
579 if (mIgnoreSelectedChanged)
581 GimmickDebugMessage(1,
582 " mIgnoreSelectedChanged true: returning"
590 info.m_itemId = event.m_itemIndex;
591 mLastSelected = event.m_itemIndex;
592 // retrieve the level
593 wxObject* obj = event.GetEventObject();
594 unsigned int level = 0;
595 for (level = 0; level<mLevelList.size(); ++level)
597 if ( GetCtrl(level) == obj ) break;
600 GimmickDebugMessage(1,
604 // Update the children level (if selection not at last level)
605 if (level<mLevelList.size()-1)
608 UpdateLevel( level + 2 );
609 // Reset the viewer setting the default image
610 GetGimmickView()->ClearSelection();
612 // Select all images if the selection is at series level
613 if (level==mLevelList.size()-2) SelectAll(level+1);
614 // Validate selected images if the selection is at image level
615 if (level==(mLevelList.size()-1)) //&&mProcess)
617 if(event.GetEventType()==wxEVT_COMMAND_LIST_ITEM_SELECTED)
619 ValidateSelectedImages (true);
623 ValidateSelectedImages (false);
628 //================================================================
630 //================================================================
631 void WxTreeView::SelectAll(int level)
634 // int level=mLevelList.size()-1;
637 item = GetCtrl(level)->GetNextItem(item,
642 if(item==(GetCtrl(level)->GetItemCount()-1))
644 mIgnoreSelectedChanged = false;//mProcess=true;
648 mIgnoreSelectedChanged = true;// mProcess=false;
650 GetCtrl(level)->SetItemState(item,wxLIST_STATE_SELECTED, wxLIST_MASK_STATE
651 | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT);
655 //================================================================
656 //================================================================
658 void WxTreeView::OnColClick(wxListEvent& event)
660 mColumnSelected = event.m_col;
662 clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
663 clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
664 senderCtrl = event.GetEventObject();
665 unsigned int level = 0;
666 for (level = 0; level<mLevelList.size(); ++level)
668 if ( GetCtrl(level) == senderCtrl ) break;
670 PopupMenu(menu, clientpt);
674 //================================================================
675 //================================================================
677 void WxTreeView::OnItemMenu(wxListEvent &event)
680 clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
681 clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
682 senderCtrl = event.GetEventObject();
683 unsigned int level = 0;
684 for (level = 0; level<mLevelList.size(); ++level)
686 if ( GetCtrl(level) == senderCtrl ) break;
690 mLastRightLevel=level;
691 mLastRightSelected=GetCtrl(level)->HitTest(wxPoint(0,clientpt.y-8),flag,ptr);
692 PopupMenu(menuItem, clientpt);
696 //================================================================
697 //================================================================
699 void WxTreeView::OnPopupFilter(wxCommandEvent& event)
702 GimmickDebugMessage(7,
703 "WxTreeView::OnEndLabelEdit"
705 unsigned int level = 0;
706 for (level = 0; level<mLevelList.size(); ++level)
708 if ( GetCtrl(level) == senderCtrl ) break;
710 std::string filter = crea::wx2std(wxGetTextFromUser(_T("Enter the filter to apply"), _T("Filter On Column")));
715 UpdateLevel(level+1);
717 std::vector<long> items;
722 it = GetCtrl(level)->GetNextItem(it,
727 long adr = GetCtrl(level)->GetItemData(it);
728 tree::Node* nod = ((ItemData*)adr)->node;
729 att=(*nod).GetAttribute(mLevelList[level].key[mColumnSelected]);
732 if(att.find(filter)>900)
744 items.push_back(it-del);
748 std::vector<long>::iterator iter;
749 for(iter=items.begin();iter!=items.end();++iter)
751 GetCtrl(level)->DeleteItem(*iter);
753 GetGimmickView()->ClearSelection();
755 //================================================================
757 //================================================================
758 void WxTreeView::OnPopupSort(wxCommandEvent& event)
761 unsigned int level = 0;
762 for (level = 0; level<mLevelList.size(); ++level)
764 if ( GetCtrl(level) == senderCtrl ) break;
766 mLevelList[level].SortColumn = mColumnSelected;
768 if(event.GetId()==mAscendingID)
770 mLevelList[level].SortAscending = true;
772 else if(event.GetId()==mDescendingID)
774 mLevelList[level].SortAscending = false;
779 //================================================================
781 //================================================================
782 void WxTreeView::OnLocalCopy(wxCommandEvent& event)
786 unsigned int tempLevel = mLastLevel;
788 const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
793 std::stringstream out;
794 std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
797 if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
800 out<<"s to .gimmick?";
804 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<" to .gimmick?";
806 if (wxMessageBox(crea::std2wx(out.str()),
808 wxYES_NO,this ) == wxYES)
814 std::vector<std::string> s;
815 GetFilenamesAsString(sel,s);
816 GetGimmickView()->CopyFiles(s);
821 mLastLevel = tempLevel;
826 //================================================================
828 //================================================================
829 void WxTreeView::OnEditField(wxCommandEvent& event)
831 if(mLastRightSelected!=-1)
833 tree::Node* node=((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node;
834 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
835 std::vector<std::string> names;
836 std::vector<std::string> keys;
837 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).begin();
838 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).end();
841 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE)
843 names.push_back(a->GetName());
844 keys.push_back(a->GetKey());
847 GetGimmickView()->CreateEditFieldsDialog(node,names,keys);
850 //================================================================
852 //================================================================
853 void WxTreeView::SortLevel(int level)
855 GimmickDebugMessage(1,
856 "WxTreeView::SortLevel("
859 //Obtain the column name and the level that needs to be organized
861 // int l = level - 1;
862 //Sets the data for the items to be sorted
866 int n = GetCtrl(level)->GetItemCount();
867 for (int i = 0; i < n; i++)
870 //Gets current item data
871 ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
873 //Extracts the node and the type of attribute
874 tree::Node* nod = data->node;
877 (*nod).GetAttributeDescriptor
878 (mLevelList[level].key[mLevelList[level].SortColumn])
881 //Obtains the organizing attribute
882 data->attr = & (*nod).GetAttribute
883 (mLevelList[level].key[mLevelList[level].SortColumn]);
885 data->selected = false;
886 if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
888 data->selected = true;
893 GimmickDebugMessage(1,
894 "WxTreeView::OnSort : "
895 <<nbselected<<" selected before sorting"
898 mIgnoreSelectedChanged = true;
900 if (mLevelList[level].SortAscending)
905 GetCtrl(level)->SortItems(CompareFunctionInts, 0);
909 GetCtrl(level)->SortItems(CompareFunctionStrings, 0);
917 GetCtrl(level)->SortItems(CompareFunctionInts, 1);
921 GetCtrl(level)->SortItems(CompareFunctionStrings, 1);
926 // Reselects the unselected
927 n = GetCtrl(level)->GetItemCount();
929 for (int i = 0; i < n; i++)
932 //Gets current item data
933 ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
938 // item = GetCtrl(level)->GetNextItem(item,wxLIST_NEXT_ALL);
939 // if ( item == -1 ) break;
940 //Gets current item data
941 // ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(item);
949 // if it is the last one we must process the selection
950 mIgnoreSelectedChanged = false;
952 GetCtrl(level)->SetItemState(i,
953 wxLIST_STATE_SELECTED,
959 | wxLIST_MASK_FORMAT);
961 if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
968 mIgnoreSelectedChanged = false;
969 GimmickDebugMessage(1,
970 "WxTreeView::SortLevel : "
971 <<after<<" selected after sorting"
975 //================================================================
978 //================================================================
979 void WxTreeView::ValidateSelectedImages(bool isSelection)
981 GimmickDebugMessage(7,
982 "WxTreeView::ValidateSelectedImages"
984 const std::vector<tree::Node*>& sel(GetSelected(mLevelList.size()+1));
985 GetGimmickView()->OnSelectionChange(sel,
986 isSelection,(mLastSelected-1),
987 !mIgnoreSelectedChanged);
990 //================================================================
993 //================================================================
994 void WxTreeView::GetNodes(std::vector<tree::Node*>& nodes, bool direction)
996 long item = mLastSelected;
997 int level=mLevelList.size()-1;
998 //Gets current item data
999 long adr = GetCtrl(level)->GetItemData(item);
1001 tree::Node* nod = ((ItemData*)adr)->node;
1006 item = GetCtrl(level)->GetNextItem(item,
1011 item = GetCtrl(level)->GetNextItem(item,
1014 if ( item == -1 || item==0 )
1018 if(GetCtrl(level)->GetItemState(item, wxLIST_STATE_SELECTED)==0 )
1021 adr = GetCtrl(level)->GetItemData(item);
1022 nod = ((ItemData*)adr)->node;
1023 nodes.push_back(nod);
1028 //================================================================
1029 //=================================================
1030 void WxTreeView::OnKeyDown(wxListEvent &event)
1032 if(event.GetKeyCode() == WXK_DELETE)
1037 GetGimmickView()->ClearSelection();
1041 //================================================================
1043 //================================================================
1044 // Should be in another place : not specific !
1045 void WxTreeView::GetSelectedAsString(std::vector<std::string>&s)
1047 int level=mLevelList.size();
1048 const std::vector<tree::Node*>& sel=GetSelected(level+1);
1049 std::vector<tree::Node*>::const_iterator i;
1051 for (i=sel.begin(); i!=sel.end(); ++i)
1053 std::string filename=(*i)->GetAttribute("FullFileName");
1054 s.push_back(filename);
1058 //================================================================
1059 void WxTreeView::GetFilenamesAsString(const std::vector<tree::Node*>& nodes, std::vector<std::string>&s)
1061 std::vector<tree::Node*>::const_iterator i;
1063 for (i=nodes.begin(); i!=nodes.end(); ++i)
1065 if((*i)->GetLevel()<mLevelList.size())
1067 GetTreeHandler()->LoadChildren(*i,0);
1068 GetFilenamesAsString((*i)->GetChildrenList(),s);
1072 std::string filename=(*i)->GetAttribute("FullFileName");
1073 s.push_back(filename);
1078 //================================================================
1080 //================================================================
1081 void WxTreeView::GetAttributes(std::vector<std::string>& areShown, std::vector<std::string>& notShown, int level)
1085 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1086 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).begin();
1087 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).end();
1090 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE && IsAttributeVisible(a->GetName(),level))
1092 areShown.push_back(a->GetName());
1095 notShown=mLevelList[level-1].notShownAtts;
1098 //================================================================
1099 void WxTreeView::SetNonVisibleAttributes(const std::vector<std::string>& notShown, int nlevel)
1101 mLevelList[nlevel].notShownAtts=notShown;
1104 //================================================================
1105 void WxTreeView::CreateCtrl(std::vector<std::string>& notShown, int nlevel)
1107 int ctrl_style = wxLC_REPORT | wxLC_VRULES;
1108 int col_style = wxLIST_FORMAT_LEFT;
1110 mLevelList[nlevel].SelectedUpToDate = true;
1111 mLevelList[nlevel].SortColumn = 0;
1112 mLevelList[nlevel].key.clear();
1114 mLevelList[nlevel].wxCtrl = new wxListCtrl(mLevelList[nlevel].wxSplitter,
1119 wxWindow* oldWin=mLevelList[nlevel].wxSplitter->GetWindow1();
1120 mLevelList[nlevel].wxSplitter->ReplaceWindow(oldWin,mLevelList[nlevel].wxCtrl);
1121 mLevelList[nlevel].wxSplitter->Initialize(mLevelList[nlevel].wxCtrl);
1123 // Create the columns : one for each attribute of the level
1127 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1128 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).begin();
1129 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).end();
1133 if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE && IsAttributeVisible(a->GetName(),nlevel+1))
1136 std::string temp = a->GetKey();
1137 if (temp.compare("ID") != 0)
1139 mLevelList[nlevel].wxCtrl->InsertColumn(col,
1140 crea::std2wx(title),
1144 mLevelList[nlevel].key.push_back(a->GetKey());
1152 //================================================================
1153 bool WxTreeView::IsAttributeVisible(const std::string& val, int level)
1155 std::vector<std::string> ns=mLevelList[level-1].notShownAtts;
1156 std::vector<std::string>::iterator it;
1158 for(it=ns.begin();it!=ns.end()&&!found;++it)
1160 if(val.compare(*it)==0)
1169 //================================================================
1170 //================================================================
1171 BEGIN_EVENT_TABLE(WxTreeView, wxPanel)
1173 EVT_SIZE(MyFrame::OnSize)
1175 EVT_MENU(LIST_QUIT, MyFrame::OnQuit)
1176 EVT_MENU(LIST_ABOUT, MyFrame::OnAbout)
1177 EVT_MENU(LIST_LIST_VIEW, MyFrame::OnListView)
1178 EVT_MENU(LIST_REPORT_VIEW, MyFrame::OnReportView)
1179 EVT_MENU(LIST_ICON_VIEW, MyFrame::OnIconView)
1180 EVT_MENU(LIST_ICON_TEXT_VIEW, MyFrame::OnIconTextView)
1181 EVT_MENU(LIST_SMALL_ICON_VIEW, MyFrame::OnSmallIconView)
1182 EVT_MENU(LIST_SMALL_ICON_TEXT_VIEW, MyFrame::OnSmallIconTextView)
1183 EVT_MENU(LIST_VIRTUAL_VIEW, MyFrame::OnVirtualView)
1184 EVT_MENU(LIST_SMALL_VIRTUAL_VIEW, MyFrame::OnSmallVirtualView)
1186 EVT_MENU(LIST_FOCUS_LAST, MyFrame::OnFocusLast)
1187 EVT_MENU(LIST_TOGGLE_FIRST, MyFrame::OnToggleFirstSel)
1188 EVT_MENU(LIST_DESELECT_ALL, MyFrame::OnDeselectAll)
1189 EVT_MENU(LIST_SELECT_ALL, MyFrame::OnSelectAll)
1190 EVT_MENU(LIST_DELETE, MyFrame::OnDelete)
1191 EVT_MENU(LIST_ADD, MyFrame::OnAdd)
1192 EVT_MENU(LIST_EDIT, MyFrame::OnEdit)
1193 EVT_MENU(LIST_DELETE_ALL, MyFrame::OnDeleteAll)
1194 EVT_MENU(LIST_SORT, MyFrame::OnSort)
1195 EVT_MENU(LIST_SET_FG_COL, MyFrame::OnSetFgColour)
1196 EVT_MENU(LIST_SET_BG_COL, MyFrame::OnSetBgColour)
1197 EVT_MENU(LIST_TOGGLE_MULTI_SEL, MyFrame::OnToggleMultiSel)
1198 EVT_MENU(LIST_SHOW_COL_INFO, MyFrame::OnShowColInfo)
1199 EVT_MENU(LIST_SHOW_SEL_INFO, MyFrame::OnShowSelInfo)
1200 EVT_MENU(LIST_FREEZE, MyFrame::OnFreeze)
1201 EVT_MENU(LIST_THAW, MyFrame::OnThaw)
1202 EVT_MENU(LIST_TOGGLE_LINES, MyFrame::OnToggleLines)
1203 EVT_MENU(LIST_MAC_USE_GENERIC, MyFrame::OnToggleMacUseGeneric)
1205 EVT_UPDATE_UI(LIST_SHOW_COL_INFO, MyFrame::OnUpdateShowColInfo)
1206 EVT_UPDATE_UI(LIST_TOGGLE_MULTI_SEL, MyFrame::OnUpdateToggleMultiSel)
1209 BEGIN_EVENT_TABLE(MyListCtrl, wxListCtrl)
1210 EVT_LIST_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnBeginDrag)
1211 EVT_LIST_BEGIN_RDRAG(LIST_CTRL, MyListCtrl::OnBeginRDrag)
1213 EVT_LIST_BEGIN_LABEL_EDIT(-1, WxTreeView::OnBeginLabelEdit)
1214 EVT_LIST_END_LABEL_EDIT(-1, WxTreeView::OnEndLabelEdit)
1216 EVT_LIST_DELETE_ITEM(LIST_CTRL, MyListCtrl::OnDeleteItem)
1217 EVT_LIST_DELETE_ALL_ITEMS(LIST_CTRL, MyListCtrl::OnDeleteAllItems)
1218 #if WXWIN_COMPATIBILITY_2_4
1219 EVT_LIST_GET_INFO(LIST_CTRL, MyListCtrl::OnGetInfo)
1220 EVT_LIST_SET_INFO(LIST_CTRL, MyListCtrl::OnSetInfo)
1223 EVT_LIST_KEY_DOWN(-1, WxTreeView::OnKeyDown)
1224 EVT_LIST_ITEM_SELECTED(-1, WxTreeView::OnItemSelected)
1225 EVT_LIST_ITEM_RIGHT_CLICK(-1, WxTreeView::OnItemMenu)
1226 EVT_LIST_ITEM_DESELECTED(-1, WxTreeView::OnItemDeSelected)
1228 EVT_LIST_KEY_DOWN(LIST_CTRL, MyListCtrl::OnListKeyDown)
1229 EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, MyListCtrl::OnActivated)
1230 EVT_LIST_ITEM_FOCUSED(LIST_CTRL, MyListCtrl::OnFocused)
1232 EVT_LIST_COL_RIGHT_CLICK(-1, WxTreeView::OnColClick)
1234 EVT_LIST_COL_CLICK(-1, WxTreeView::OnColClick)
1236 //EVT_LEFT_DOWN(WxTreeView::OnMouseClick)
1238 EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnColBeginDrag)
1239 EVT_LIST_COL_DRAGGING(LIST_CTRL, MyListCtrl::OnColDragging)
1240 EVT_LIST_COL_END_DRAG(LIST_CTRL, MyListCtrl::OnColEndDrag)
1242 EVT_LIST_CACHE_HINT(LIST_CTRL, MyListCtrl::OnCacheHint)
1244 #if USE_CONTEXT_MENU
1245 EVT_CONTEXT_MENU(MyListCtrl::OnContextMenu)
1247 EVT_CHAR(MyListCtrl::OnChar)
1249 EVT_RIGHT_DOWN(MyListCtrl::OnRightClick)
1253 } // EO namespace creaImageIO