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>
8 //=====================================================================
12 //=====================================================================
14 //=====================================================================
16 //=====================================================================
17 ///Comparing function for ordering algorithm. Takes parameters as strings.
18 int wxCALLBACK CompareFunctionStrings(long item1, long item2, long sortData)
20 creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
21 creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
23 const std::string& s1(*(data1->attr));
24 const std::string& s2(*(data2->attr));
46 //=====================================================================
48 //=====================================================================
49 ///Comparing function for ordering algorithm. Takes parameters as ints.
50 int wxCALLBACK CompareFunctionInts(long item1, long item2, long sortData)
52 creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
53 creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
55 const std::string& s1(*(data1->attr));
56 const std::string& s2(*(data2->attr));
58 int val1=atoi(s1.c_str());
59 int val2=atoi(s2.c_str());
84 //=====================================================================
87 //=====================================================================
90 //=====================================================================
92 WxTreeView::WxTreeView(TreeHandler* handler,
97 TreeView(handler, gimmick)
99 GimmickDebugMessage(1,"WxTreeView::WxTreeView"
103 // Split part below toolbar into notebook for views and panel
104 // for preview, messages...
106 // mSplitter = new wxSplitterWindow( this , -1);
109 wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
111 int ctrl_style = wxLC_REPORT | wxLC_VRULES;
112 int col_style = wxLIST_FORMAT_LEFT;
114 // Creating the ListCtrl for the levels > 0 (not for Root level)
116 i < handler->GetTree().GetNumberOfLevels() -1;
119 GimmickDebugMessage(5,"Creating view for level "<<i
122 level.SelectedUpToDate = true;
123 level.SortColumn = 0;
125 // If the first level : parent = this
126 wxWindow* sparent = this;
127 // else parent = last splitter
129 sparent = mLevelList[i-1].wxSplitter;
131 level.wxSplitter = new wxSplitterWindow( sparent , -1);
134 level.wxSplitter->Show(false);
136 // level.wxSplitter->SetMinimumPaneSize(100);
138 wxListCtrl* ctrl = new wxListCtrl(level.wxSplitter,
144 level.wxSplitter->Initialize(ctrl);
146 // Create the columns : one for each attribute of the level
150 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
151 for (a = handler->GetTree().GetAttributeDescriptorList(i+1).begin();
152 a != handler->GetTree().GetAttributeDescriptorList(i+1).end();
157 GimmickDebugMessage(5,"Creating column "<<col<<" : "
161 if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE)
164 if(a->GetName()=="UNKNOWN")
167 title += handler->GetTree().GetLevelDescriptor(i+1).GetName();
168 if (title[title.size()-1]!='s')
176 std::string temp = a->GetKey();
177 if (temp.compare("ID") != 0)
180 ctrl->InsertColumn(col,
185 level.key.push_back(a->GetKey());
190 mLevelList.push_back(level);
197 wxMenuItem* m1=menu->Append(wxID_ANY, _T("&Sort ascending"));
198 wxMenuItem* m2=menu->Append(wxID_ANY, _T("&Sort descending"));
199 wxMenuItem* m3=menu->Append(wxID_ANY, _T("&Filter"));
200 mAscendingID=m1->GetId();
201 mDescendingID=m2->GetId();
202 mFilterID=m3->GetId();
203 Connect( mAscendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
204 Connect( mDescendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
205 Connect( mFilterID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupFilter) );
210 menuItem =new wxMenu;
211 wxMenuItem* m1Item=menuItem->Append(wxID_ANY, _T("&Anonymize"));
212 wxMenuItem* m2Item=menuItem->Append(wxID_ANY, _T("&Local Copy"));
213 wxMenuItem* m3Item=menuItem->Append(wxID_ANY, _T("&Edit Fields"));
215 mAnonymizingID=m1Item->GetId();
216 mLocalCopyID=m2Item->GetId();
217 mEditFieldID=m3Item->GetId();
218 //Connect( mAnonymizingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnAnonymize) );
219 Connect( mLocalCopyID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnLocalCopy) );
220 Connect( mEditFieldID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnEditField) );
223 #endif // wxUSE_MENUS
224 /// Initialize the first level splitter
226 sizer->Add( mLevelList[0].wxSplitter ,1, wxGROW ,0);
227 // mColumnSelected=1;
232 mIgnoreSelectedChanged = false;
234 //CreateColorPalette();
242 //=====================================================================
244 //=====================================================================
246 WxTreeView::~WxTreeView()
248 GimmickDebugMessage(1,"WxTreeView::~WxTreeView"
254 //=====================================================================
258 //=====================================================================
259 const std::vector<tree::Node*>& WxTreeView::GetSelected(int level)
261 std::vector<tree::Node*>& sel = mLevelList[0].Selected;
262 // if (GetSelectedUpToDate(level))
264 // the selection of upper level
265 if(mLevelList.size() == level -1)
266 sel = mLevelList.back().Selected;
268 sel= mLevelList[l].Selected;
275 sel.push_back(GetTreeHandler()->GetTree().GetTree());
277 else if (level < mLevelList.size()+2 )
282 item = GetCtrl(l-1)->GetNextItem(item,
284 wxLIST_STATE_SELECTED);
287 long adr = GetCtrl(l-1)->GetItemData(item);
288 tree::Node* n = ((ItemData*)adr)->node;
289 if(mLastSelected==item)
291 std::vector<tree::Node*>::iterator it;
293 it = sel.insert ( it , n );
302 /*int n = GetCtrl(l-1)->GetItemCount();
303 for (int i = 0; i<n; i++)
305 std::cout<<GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED)<<std::endl;
306 if ( GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED))
308 long adr = GetCtrl(l-1)->GetItemData(i);
309 tree::Node* n = ((ItemData*)adr)->node;
312 std::vector<tree::Node*>::iterator it;
314 it = sel.insert ( it , n );
329 // return mLevelList[level-1].Selected;
333 //=====================================================================
335 //=====================================================================
336 ///Removes selected nodes on last selected level
338 void WxTreeView::RemoveSelected(std::string &i_save)
342 unsigned int tempLevel = mLastLevel;
344 const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
345 // if no selection, no remove action.
349 std::stringstream out;
350 std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
353 if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
360 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<"?";
362 if (wxMessageBox(crea::std2wx(out.str()),
364 wxYES_NO,this ) == wxYES)
370 GetGimmickView()->modifyValidationSignal(false);
371 bool needRefresh=false;
372 std::vector<tree::Node*>::const_iterator i;
373 for (i=sel.begin(); i!=sel.end(); ++i)
380 if((*i)->GetParent()->GetNumberOfChildren()<2)
384 //tree::Node* n = new (tree::Node*)(*i);
385 GetTreeHandler()->LoadChildren((*i),4);
386 GetGimmickView()->AddIgnoreFile(*i);
387 GetTreeHandler()->Remove(*i);
390 if(needRefresh && mLastLevel>1)
392 UpdateLevel(mLastLevel-2);
394 else if(mLastLevel>1)
396 UpdateLevel(mLastLevel-1);
400 UpdateLevel(mLastLevel);
406 // no need to incremente level
407 mLastLevel = tempLevel;
410 if (erase && mLastLevel == 1 && i_save == "0")
413 RemoveAlertDlg *dial = new RemoveAlertDlg(this, crea::std2wx("Remove files"), wxSize(370,100));
415 if (dial->ShowModal() == wxID_OK)
417 i_save = dial->isChecked() == false? "0" : "1";
424 //=====================================================================
425 /// Updates a level of the view (adds or removes children, etc.)
426 void WxTreeView::UpdateLevel( int level )
428 GimmickDebugMessage(1,
429 GetTreeHandler()->GetTree().GetLabel()
430 <<"WxTreeView::UpdateLevel(level "
436 RecursiveUpdateLevel(level);
438 for (i=0; i<level-1; i++)
440 if (!GetSplitter(i)->IsSplit())
441 GetSplitter(i)->SplitVertically( GetCtrl(i), GetSplitter(i+1),
444 if (GetSplitter(i)->IsSplit()) GetSplitter(i)->Unsplit();
447 //=====================================================================
449 //=====================================================================
450 /// Recursive method called upon by UpdateLevel to refresh all windows
451 void WxTreeView::RecursiveUpdateLevel( int level )
453 GimmickDebugMessage(1,
454 GetTreeHandler()->GetTree().GetLabel()
455 <<"WxTreeView::RecursiveUpdateLevel(level "
460 const std::vector<tree::Node*>& sel(GetSelected(level));
464 // to speed up inserting we hide the control temporarily
466 GetCtrl(l)->DeleteAllItems();
468 std::vector<tree::Node*>::const_iterator i;
470 for (i=sel.begin(); i!=sel.end(); ++i)
472 GimmickDebugMessage(1,
473 "adding children of '"
479 //Adds items and sets their attributes
481 GetTreeHandler()->LoadChildren(*i,1);
482 tree::Node::ChildrenListType::reverse_iterator j;
483 for (j = (*i)->GetChildrenList().rbegin();
484 j!= (*i)->GetChildrenList().rend();
487 GimmickDebugMessage(1,
494 item.SetMask(wxLIST_MASK_STATE |
496 // wxLIST_MASK_IMAGE |
498 // wxLIST_MASK_WIDTH |
502 ItemData* data = new ItemData();
510 GetCtrl(l)->InsertItem(item);
513 for (int k=0; k<GetCtrl(l)->GetColumnCount(); ++k)
516 // Temporary correction : it works but no explanation about the problem FCY
520 val = (*j)->GetAttribute("NumberOfChildren");
523 val = (*j)->GetAttribute(mLevelList[l].key[k]);
524 if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isDateEntry()) // Date
526 // std::cout << "["<<val<< "]" << std::endl;
527 std::string valtmp(val);
530 boost::gregorian::date d1(boost::gregorian::from_undelimited_string(val));
531 val = to_iso_extended_string(d1);
537 // std::cout << "["<<val<< "]" << std::endl;
539 else if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isTimeEntry()) // Time
541 if ((val.size()>6) &&
542 (val != "" || val != " "))
543 val = val.substr(0,2) + " : "
544 + val.substr(2,2) + " : "
549 if (val.size()==0) val = "?";
551 if (val.size()==0) val = "X";
552 item.SetText( crea::std2wx(val));
555 GetCtrl(l)->SetItem(item);
565 //=====================================================================
568 //================================================================
569 void WxTreeView::OnItemDeSelected(wxListEvent& event)
571 GimmickDebugMessage(1,
572 GetTreeHandler()->GetTree().GetLabel()
573 <<" WxTreeView::OnItemDeselected"<<std::endl);
574 // retrieve the level
575 wxObject* obj = event.GetEventObject();
576 unsigned int level = 0;
577 for (level = 0; level<mLevelList.size(); ++level)
579 if ( GetCtrl(level) == obj ) break;
581 SetSelectedUpToDate(level,false);
582 // to allow a first selection in images TreeView
583 if (level==mLevelList.size()-1)
584 OnItemSelected(event);
586 //================================================================
588 //================================================================
589 void WxTreeView::OnItemSelected(wxListEvent& event)
592 GimmickDebugMessage(1,
593 GetTreeHandler()->GetTree().GetLabel()
594 <<" WxTreeView::OnItemSelected"<<std::endl);
596 if (mIgnoreSelectedChanged)
598 GimmickDebugMessage(1,
599 " mIgnoreSelectedChanged true: returning"
607 info.m_itemId = event.m_itemIndex;
608 mLastSelected = event.m_itemIndex;
609 // retrieve the level
610 wxObject* obj = event.GetEventObject();
611 unsigned int level = 0;
612 for (level = 0; level<mLevelList.size(); ++level)
614 if ( GetCtrl(level) == obj ) break;
617 GimmickDebugMessage(1,
621 // Update the children level (if selection not at last level)
622 if (level<mLevelList.size()-1)
625 UpdateLevel( level + 2 );
626 // Reset the viewer setting the default image
627 GetGimmickView()->ClearSelection();
629 // Select all images if the selection is at series level
630 if (level==mLevelList.size()-2)
632 // Validate selected images if the selection is at image level
633 if (level==(mLevelList.size()-1)) //&&mProcess)
635 if(event.GetEventType()==wxEVT_COMMAND_LIST_ITEM_SELECTED)
637 ValidateSelectedImages (true);
641 ValidateSelectedImages (false);
646 //================================================================
648 //================================================================
649 void WxTreeView::SelectAll(int level)
652 // int level=mLevelList.size()-1;
655 item = GetCtrl(level)->GetNextItem(item,
660 if(item==(GetCtrl(level)->GetItemCount()-1))
662 mIgnoreSelectedChanged = false;//mProcess=true;
666 mIgnoreSelectedChanged = true;// mProcess=false;
668 GetCtrl(level)->SetItemState(item,wxLIST_STATE_SELECTED, wxLIST_MASK_STATE
669 | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT);
673 //================================================================
674 //================================================================
676 void WxTreeView::OnColClick(wxListEvent& event)
678 mColumnSelected = event.m_col;
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;
688 PopupMenu(menu, clientpt);
692 //================================================================
693 //================================================================
695 void WxTreeView::OnItemMenu(wxListEvent &event)
698 clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
699 clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
700 senderCtrl = event.GetEventObject();
701 unsigned int level = 0;
702 for (level = 0; level<mLevelList.size(); ++level)
704 if ( GetCtrl(level) == senderCtrl ) break;
708 mLastRightLevel=level;
709 mLastRightSelected=GetCtrl(level)->HitTest(wxPoint(0,clientpt.y-8),flag,ptr);
710 PopupMenu(menuItem, clientpt);
714 //================================================================
715 //================================================================
717 void WxTreeView::OnPopupFilter(wxCommandEvent& event)
720 GimmickDebugMessage(7,
721 "WxTreeView::OnEndLabelEdit"
723 unsigned int level = 0;
724 for (level = 0; level<mLevelList.size(); ++level)
726 if ( GetCtrl(level) == senderCtrl ) break;
728 std::string filter = crea::wx2std(wxGetTextFromUser(_T("Enter the filter to apply"), _T("Filter On Column")));
733 UpdateLevel(level+1);
735 std::vector<long> items;
740 it = GetCtrl(level)->GetNextItem(it,
745 long adr = GetCtrl(level)->GetItemData(it);
746 tree::Node* nod = ((ItemData*)adr)->node;
747 att=(*nod).GetAttribute(mLevelList[level].key[mColumnSelected]);
750 if(att.find(filter)>900)
762 items.push_back(it-del);
766 std::vector<long>::iterator iter;
767 for(iter=items.begin();iter!=items.end();++iter)
769 GetCtrl(level)->DeleteItem(*iter);
771 GetGimmickView()->ClearSelection();
773 //================================================================
775 //================================================================
776 void WxTreeView::OnPopupSort(wxCommandEvent& event)
779 unsigned int level = 0;
780 for (level = 0; level<mLevelList.size(); ++level)
782 if ( GetCtrl(level) == senderCtrl ) break;
784 mLevelList[level].SortColumn = mColumnSelected;
786 if(event.GetId()==mAscendingID)
788 mLevelList[level].SortAscending = true;
790 else if(event.GetId()==mDescendingID)
792 mLevelList[level].SortAscending = false;
797 //================================================================
799 //================================================================
800 void WxTreeView::OnLocalCopy(wxCommandEvent& event)
804 unsigned int tempLevel = mLastLevel;
806 const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
811 std::stringstream out;
812 std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
815 if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
818 out<<"s to .gimmick?";
822 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<" to .gimmick?";
824 if (wxMessageBox(crea::std2wx(out.str()),
826 wxYES_NO,this ) == wxYES)
832 std::vector<std::string> s;
833 GetFilenamesAsString(sel,s);
834 GetGimmickView()->CopyFiles(s);
839 mLastLevel = tempLevel;
844 //================================================================
846 //================================================================
847 void WxTreeView::OnEditField(wxCommandEvent& event)
849 if(mLastRightSelected!=-1)
851 tree::Node* node=((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node;
852 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
853 std::vector<std::string> names;
854 std::vector<std::string> keys;
855 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).begin();
856 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).end();
859 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE)
861 names.push_back(a->GetName());
862 keys.push_back(a->GetKey());
865 GetGimmickView()->CreateEditFieldsDialog(node,names,keys);
868 //================================================================
870 //================================================================
871 void WxTreeView::SortLevel(int level)
873 GimmickDebugMessage(1,
874 "WxTreeView::SortLevel("
877 //Obtain the column name and the level that needs to be organized
879 // int l = level - 1;
880 //Sets the data for the items to be sorted
884 int n = GetCtrl(level)->GetItemCount();
885 for (int i = 0; i < n; i++)
888 //Gets current item data
889 ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
891 //Extracts the node and the type of attribute
892 tree::Node* nod = data->node;
895 (*nod).GetAttributeDescriptor
896 (mLevelList[level].key[mLevelList[level].SortColumn])
899 //Obtains the organizing attribute
900 data->attr = & (*nod).GetAttribute
901 (mLevelList[level].key[mLevelList[level].SortColumn]);
903 data->selected = false;
904 if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
906 data->selected = true;
911 GimmickDebugMessage(1,
912 "WxTreeView::OnSort : "
913 <<nbselected<<" selected before sorting"
916 mIgnoreSelectedChanged = true;
918 if (mLevelList[level].SortAscending)
923 GetCtrl(level)->SortItems(CompareFunctionInts, 0);
927 GetCtrl(level)->SortItems(CompareFunctionStrings, 0);
935 GetCtrl(level)->SortItems(CompareFunctionInts, 1);
939 GetCtrl(level)->SortItems(CompareFunctionStrings, 1);
944 // Reselects the unselected
945 n = GetCtrl(level)->GetItemCount();
947 for (int i = 0; i < n; i++)
950 //Gets current item data
951 ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
956 // item = GetCtrl(level)->GetNextItem(item,wxLIST_NEXT_ALL);
957 // if ( item == -1 ) break;
958 //Gets current item data
959 // ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(item);
967 // if it is the last one we must process the selection
968 mIgnoreSelectedChanged = false;
970 GetCtrl(level)->SetItemState(i,
971 wxLIST_STATE_SELECTED,
977 | wxLIST_MASK_FORMAT);
979 if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
986 mIgnoreSelectedChanged = false;
987 GimmickDebugMessage(1,
988 "WxTreeView::SortLevel : "
989 <<after<<" selected after sorting"
993 //================================================================
996 //================================================================
997 void WxTreeView::ValidateSelectedImages(bool isSelection)
999 GimmickDebugMessage(7,
1000 "WxTreeView::ValidateSelectedImages"
1002 const std::vector<tree::Node*>& sel(GetSelected(mLevelList.size()+1));
1003 GetGimmickView()->OnSelectionChange(sel,
1004 isSelection,(mLastSelected-1),
1005 !mIgnoreSelectedChanged);
1008 //================================================================
1011 //================================================================
1012 void WxTreeView::GetNodes(std::vector<tree::Node*>& nodes, bool direction)
1014 long item = mLastSelected;
1015 int level=mLevelList.size()-1;
1016 //Gets current item data
1017 long adr = GetCtrl(level)->GetItemData(item);
1019 tree::Node* nod = ((ItemData*)adr)->node;
1024 item = GetCtrl(level)->GetNextItem(item,
1029 item = GetCtrl(level)->GetNextItem(item,
1032 if ( item == -1 || item==0 )
1036 if(GetCtrl(level)->GetItemState(item, wxLIST_STATE_SELECTED)==0 )
1039 adr = GetCtrl(level)->GetItemData(item);
1040 nod = ((ItemData*)adr)->node;
1041 nodes.push_back(nod);
1046 //================================================================
1047 //=================================================
1048 void WxTreeView::OnKeyDown(wxListEvent &event)
1050 if(event.GetKeyCode() == WXK_DELETE)
1053 std::string temp = "0";
1054 RemoveSelected(temp);
1055 GetGimmickView()->ClearSelection();
1059 //================================================================
1061 //================================================================
1062 // Should be in another place : not specific !
1063 void WxTreeView::GetSelectedAsString(std::vector<std::string>&s)
1065 int level=mLevelList.size();
1066 const std::vector<tree::Node*>& sel=GetSelected(level+1);
1067 std::vector<tree::Node*>::const_iterator i;
1069 for (i=sel.begin(); i!=sel.end(); ++i)
1071 std::string filename=(*i)->GetAttribute("FullFileName");
1072 s.push_back(filename);
1076 //================================================================
1077 void WxTreeView::GetFilenamesAsString(const std::vector<tree::Node*>& nodes, std::vector<std::string>&s)
1079 std::vector<tree::Node*>::const_iterator i;
1081 for (i=nodes.begin(); i!=nodes.end(); ++i)
1083 if((*i)->GetLevel()<mLevelList.size())
1085 GetTreeHandler()->LoadChildren(*i,0);
1086 GetFilenamesAsString((*i)->GetChildrenList(),s);
1090 std::string filename=(*i)->GetAttribute("FullFileName");
1091 s.push_back(filename);
1096 //================================================================
1098 //================================================================
1099 void WxTreeView::GetAttributes(std::vector<std::string>& areShown, std::vector<std::string>& notShown, int level)
1103 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1104 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).begin();
1105 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).end();
1108 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE && IsAttributeVisible(a->GetName(),level))
1110 areShown.push_back(a->GetName());
1113 notShown=mLevelList[level-1].notShownAtts;
1116 //================================================================
1117 void WxTreeView::SetNonVisibleAttributes(const std::vector<std::string>& notShown, int nlevel)
1119 mLevelList[nlevel].notShownAtts=notShown;
1122 //================================================================
1123 void WxTreeView::CreateCtrl(std::vector<std::string>& notShown, int nlevel)
1125 int ctrl_style = wxLC_REPORT | wxLC_VRULES;
1126 int col_style = wxLIST_FORMAT_LEFT;
1128 mLevelList[nlevel].SelectedUpToDate = true;
1129 mLevelList[nlevel].SortColumn = 0;
1130 mLevelList[nlevel].key.clear();
1132 mLevelList[nlevel].wxCtrl = new wxListCtrl(mLevelList[nlevel].wxSplitter,
1137 wxWindow* oldWin=mLevelList[nlevel].wxSplitter->GetWindow1();
1138 mLevelList[nlevel].wxSplitter->ReplaceWindow(oldWin,mLevelList[nlevel].wxCtrl);
1139 mLevelList[nlevel].wxSplitter->Initialize(mLevelList[nlevel].wxCtrl);
1141 // Create the columns : one for each attribute of the level
1145 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1146 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).begin();
1147 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).end();
1151 if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE && IsAttributeVisible(a->GetName(),nlevel+1))
1154 std::string temp = a->GetKey();
1155 if (temp.compare("ID") != 0)
1157 mLevelList[nlevel].wxCtrl->InsertColumn(col,
1158 crea::std2wx(title),
1162 mLevelList[nlevel].key.push_back(a->GetKey());
1170 //================================================================
1171 bool WxTreeView::IsAttributeVisible(const std::string& val, int level)
1173 std::vector<std::string> ns=mLevelList[level-1].notShownAtts;
1174 std::vector<std::string>::iterator it;
1176 for(it=ns.begin();it!=ns.end()&&!found;++it)
1178 if(val.compare(*it)==0)
1186 //================================================================
1187 //================================================================
1189 RemoveAlertDlg::RemoveAlertDlg(wxWindow *parent,
1197 wxDEFAULT_DIALOG_STYLE)
1199 wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
1201 //std::string out("To reload deleted patient, you should synchronize your database before."); // JPR
1202 //wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY,crea::std2wx(out),wxDefaultPosition, wxSize(500,20));
1203 wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY,
1204 _T("To reload deleted patient, you should synchronize your database before."),
1205 wxDefaultPosition, wxSize(500,20));
1206 mcheck = new wxCheckBox(this, 5478, _T("Do not display this warning again!"));
1207 Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &RemoveAlertDlg::onCheck );
1208 wxSizer* buttonsSizer = this->CreateSeparatedButtonSizer(wxOK|wxCANCEL);
1210 topsizer->Add(text);
1211 topsizer->Add(mcheck,0,wxGROW);
1212 topsizer->Add(buttonsSizer,0,wxGROW);
1213 SetSizer(topsizer, true);
1217 RemoveAlertDlg::~RemoveAlertDlg(){};
1218 bool RemoveAlertDlg::isChecked()
1222 void RemoveAlertDlg::onCheck(wxCommandEvent &Event)
1224 mSave = mcheck->IsChecked();
1228 //================================================================
1229 //================================================================
1230 BEGIN_EVENT_TABLE(WxTreeView, wxPanel)
1232 EVT_SIZE(MyFrame::OnSize)
1234 EVT_MENU(LIST_QUIT, MyFrame::OnQuit)
1235 EVT_MENU(LIST_ABOUT, MyFrame::OnAbout)
1236 EVT_MENU(LIST_LIST_VIEW, MyFrame::OnListView)
1237 EVT_MENU(LIST_REPORT_VIEW, MyFrame::OnReportView)
1238 EVT_MENU(LIST_ICON_VIEW, MyFrame::OnIconView)
1239 EVT_MENU(LIST_ICON_TEXT_VIEW, MyFrame::OnIconTextView)
1240 EVT_MENU(LIST_SMALL_ICON_VIEW, MyFrame::OnSmallIconView)
1241 EVT_MENU(LIST_SMALL_ICON_TEXT_VIEW, MyFrame::OnSmallIconTextView)
1242 EVT_MENU(LIST_VIRTUAL_VIEW, MyFrame::OnVirtualView)
1243 EVT_MENU(LIST_SMALL_VIRTUAL_VIEW, MyFrame::OnSmallVirtualView)
1245 EVT_MENU(LIST_FOCUS_LAST, MyFrame::OnFocusLast)
1246 EVT_MENU(LIST_TOGGLE_FIRST, MyFrame::OnToggleFirstSel)
1247 EVT_MENU(LIST_DESELECT_ALL, MyFrame::OnDeselectAll)
1248 EVT_MENU(LIST_SELECT_ALL, MyFrame::OnSelectAll)
1249 EVT_MENU(LIST_DELETE, MyFrame::OnDelete)
1250 EVT_MENU(LIST_ADD, MyFrame::OnAdd)
1251 EVT_MENU(LIST_EDIT, MyFrame::OnEdit)
1252 EVT_MENU(LIST_DELETE_ALL, MyFrame::OnDeleteAll)
1253 EVT_MENU(LIST_SORT, MyFrame::OnSort)
1254 EVT_MENU(LIST_SET_FG_COL, MyFrame::OnSetFgColour)
1255 EVT_MENU(LIST_SET_BG_COL, MyFrame::OnSetBgColour)
1256 EVT_MENU(LIST_TOGGLE_MULTI_SEL, MyFrame::OnToggleMultiSel)
1257 EVT_MENU(LIST_SHOW_COL_INFO, MyFrame::OnShowColInfo)
1258 EVT_MENU(LIST_SHOW_SEL_INFO, MyFrame::OnShowSelInfo)
1259 EVT_MENU(LIST_FREEZE, MyFrame::OnFreeze)
1260 EVT_MENU(LIST_THAW, MyFrame::OnThaw)
1261 EVT_MENU(LIST_TOGGLE_LINES, MyFrame::OnToggleLines)
1262 EVT_MENU(LIST_MAC_USE_GENERIC, MyFrame::OnToggleMacUseGeneric)
1264 EVT_UPDATE_UI(LIST_SHOW_COL_INFO, MyFrame::OnUpdateShowColInfo)
1265 EVT_UPDATE_UI(LIST_TOGGLE_MULTI_SEL, MyFrame::OnUpdateToggleMultiSel)
1268 BEGIN_EVENT_TABLE(MyListCtrl, wxListCtrl)
1269 EVT_LIST_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnBeginDrag)
1270 EVT_LIST_BEGIN_RDRAG(LIST_CTRL, MyListCtrl::OnBeginRDrag)
1272 EVT_LIST_BEGIN_LABEL_EDIT(-1, WxTreeView::OnBeginLabelEdit)
1273 EVT_LIST_END_LABEL_EDIT(-1, WxTreeView::OnEndLabelEdit)
1275 EVT_LIST_DELETE_ITEM(LIST_CTRL, MyListCtrl::OnDeleteItem)
1276 EVT_LIST_DELETE_ALL_ITEMS(LIST_CTRL, MyListCtrl::OnDeleteAllItems)
1277 #if WXWIN_COMPATIBILITY_2_4
1278 EVT_LIST_GET_INFO(LIST_CTRL, MyListCtrl::OnGetInfo)
1279 EVT_LIST_SET_INFO(LIST_CTRL, MyListCtrl::OnSetInfo)
1282 EVT_LIST_KEY_DOWN(-1, WxTreeView::OnKeyDown)
1283 EVT_LIST_ITEM_SELECTED(-1, WxTreeView::OnItemSelected)
1284 EVT_LIST_ITEM_RIGHT_CLICK(-1, WxTreeView::OnItemMenu)
1285 EVT_LIST_ITEM_DESELECTED(-1, WxTreeView::OnItemDeSelected)
1287 EVT_LIST_KEY_DOWN(LIST_CTRL, MyListCtrl::OnListKeyDown)
1288 EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, MyListCtrl::OnActivated)
1289 EVT_LIST_ITEM_FOCUSED(LIST_CTRL, MyListCtrl::OnFocused)
1291 EVT_LIST_COL_RIGHT_CLICK(-1, WxTreeView::OnColClick)
1293 EVT_LIST_COL_CLICK(-1, WxTreeView::OnColClick)
1295 //EVT_LEFT_DOWN(WxTreeView::OnMouseClick)
1297 EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnColBeginDrag)
1298 EVT_LIST_COL_DRAGGING(LIST_CTRL, MyListCtrl::OnColDragging)
1299 EVT_LIST_COL_END_DRAG(LIST_CTRL, MyListCtrl::OnColEndDrag)
1301 EVT_LIST_CACHE_HINT(LIST_CTRL, MyListCtrl::OnCacheHint)
1303 #if USE_CONTEXT_MENU
1304 EVT_CONTEXT_MENU(MyListCtrl::OnContextMenu)
1306 EVT_CHAR(MyListCtrl::OnChar)
1308 EVT_RIGHT_DOWN(MyListCtrl::OnRightClick)
1312 } // EO namespace creaImageIO