2 # ---------------------------------------------------------------------
4 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
6 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
10 # This software is governed by the CeCILL-B license under French law and
11 # abiding by the rules of distribution of free software. You can use,
12 # modify and/ or redistribute the software under the terms of the CeCILL-B
13 # license as circulated by CEA, CNRS and INRIA at the following URL
14 # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
15 # or in the file LICENSE.txt.
17 # As a counterpart to the access to the source code and rights to copy,
18 # modify and redistribute granted by the license, users are provided only
19 # with a limited warranty and the software's author, the holder of the
20 # economic rights, and the successive licensors have only limited
23 # The fact that you are presently reading this means that you have had
24 # knowledge of the CeCILL-B license and that you accept its terms.
25 # ------------------------------------------------------------------------
28 #include <creaImageIOWxTreeView.h>
29 #include <creaImageIOGimmickView.h>
30 #include <creaImageIOSystem.h>
31 #include <wx/splitter.h>
32 #include <wx/gdicmn.h>
33 #include <boost/date_time/gregorian/gregorian.hpp>
34 #include <creaImageIOGimmick.h>
38 //=====================================================================
42 //=====================================================================
44 //=====================================================================
46 //=====================================================================
47 ///Comparing function for ordering algorithm. Takes parameters as strings.
48 int wxCALLBACK CompareFunctionStrings(long item1, long item2, long sortData)
50 creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
51 creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
53 const std::string& s1(*(data1->attr));
54 const std::string& s2(*(data2->attr));
76 //=====================================================================
78 //=====================================================================
79 ///Comparing function for ordering algorithm. Takes parameters as ints.
80 int wxCALLBACK CompareFunctionInts(long item1, long item2, long sortData)
82 creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
83 creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
85 const std::string& s1(*(data1->attr));
86 const std::string& s2(*(data2->attr));
88 int val1=atoi(s1.c_str());
89 int val2=atoi(s2.c_str());
114 //=====================================================================
117 //=====================================================================
118 namespace creaImageIO
120 //=====================================================================
122 WxTreeView::WxTreeView(TreeHandler* handler,
123 GimmickView* gimmick,
126 : wxPanel(parent,id),
127 TreeView(handler, gimmick)
129 GimmickDebugMessage(1,"WxTreeView::WxTreeView"
133 // Split part below toolbar into notebook for views and panel
134 // for preview, messages...
136 // mSplitter = new wxSplitterWindow( this , -1);
139 msizer = new wxBoxSizer(wxHORIZONTAL);
141 int ctrl_style = wxLC_REPORT | wxLC_VRULES;
142 int col_style = wxLIST_FORMAT_LEFT;
144 // Creating the ListCtrl for the levels > 0 (not for Root level)
146 i < handler->GetTree().GetNumberOfLevels() -1;
149 GimmickDebugMessage(5,"Creating view for level "<<i
152 level.SelectedUpToDate = true;
153 level.SortColumn = 0;
155 // If the first level : parent = this
156 wxWindow* sparent = this;
157 // else parent = last splitter
159 sparent = mLevelList[i-1].wxSplitter;
161 level.wxSplitter = new wxSplitterWindow( sparent , -1);
164 level.wxSplitter->Show(false);
166 // level.wxSplitter->SetMinimumPaneSize(100);
168 wxListCtrl* ctrl = new wxListCtrl(level.wxSplitter,
174 level.wxSplitter->Initialize(ctrl);
176 // Create the columns : one for each attribute of the level
180 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
181 for (a = handler->GetTree().GetAttributeDescriptorList(i+1).begin();
182 a != handler->GetTree().GetAttributeDescriptorList(i+1).end();
187 GimmickDebugMessage(5,"Creating column "<<col<<" : "
191 if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE)
194 if(a->GetName()=="UNKNOWN")
197 title += handler->GetTree().GetLevelDescriptor(i+1).GetName();
198 if (title[title.size()-1]!='s')
206 std::string temp = a->GetKey();
207 if (temp.compare("ID") != 0)
210 ctrl->InsertColumn(col,
215 level.key.push_back(a->GetKey());
220 mLevelList.push_back(level);
227 wxMenuItem* m1=menu->Append(wxID_ANY, _T("&Sort ascending"));
228 wxMenuItem* m2=menu->Append(wxID_ANY, _T("&Sort descending"));
229 wxMenuItem* m3=menu->Append(wxID_ANY, _T("&Filter"));
230 mAscendingID=m1->GetId();
231 mDescendingID=m2->GetId();
232 mFilterID=m3->GetId();
233 Connect( mAscendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
234 Connect( mDescendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
235 Connect( mFilterID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupFilter) );
238 ////SubMenuItem EXPORT
239 subExportMenu = new wxMenu;
240 wxMenuItem *subExp1 = subExportMenu->Append(wxID_ANY, _T("&Export to Storage"));
241 Connect( subExp1->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnExportToStorage) );
244 menuItem =new wxMenu;
247 wxMenuItem* m2Item=menuItem->Append(wxID_ANY, _T("&Local Copy"));
248 wxMenuItem* m3Item=menuItem->Append(wxID_ANY, _T("&Edit Fields"));
249 wxMenuItem* m4Item=menuItem->Append(wxID_ANY, _T("&Display Dicom Tags"));
250 menuItem->AppendSubMenu(subExportMenu, wxT("&Export"));
253 wxMenuItem* m1Item=menuItem->Append(wxID_ANY, _T("&Anonymize"));
254 mAnonymizingID=m1Item->GetId();
255 Connect( mAnonymizingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnAnonymizer) );
257 mLocalCopyID=m2Item->GetId();
258 mEditFieldID=m3Item->GetId();
259 mDumpID=m4Item->GetId();
262 Connect( mLocalCopyID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnLocalCopy) );
263 Connect( mEditFieldID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnEditField) );
264 Connect( mDumpID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnDumpTags) );
268 #endif // wxUSE_MENUS
269 /// Initialize the first level splitter
271 msizer->Add( mLevelList[0].wxSplitter ,1, wxGROW ,0);
272 // mColumnSelected=1;
277 mIgnoreSelectedChanged = false;
279 //CreateColorPalette();
287 //=====================================================================
289 //=====================================================================
291 WxTreeView::~WxTreeView()
293 GimmickDebugMessage(1,"WxTreeView::~WxTreeView"
299 //=====================================================================
303 //=====================================================================
304 const std::vector<tree::Node*>& WxTreeView::GetSelected(int level)
306 std::vector<tree::Node*>& sel = mLevelList[0].Selected;
307 // if (GetSelectedUpToDate(level))
309 // the selection of upper level
310 if(mLevelList.size() == level -1)
311 sel = mLevelList.back().Selected;
313 sel= mLevelList[l].Selected;
320 sel.push_back(GetTreeHandler()->GetTree().GetTree());
322 else if (level < mLevelList.size()+2 )
327 item = GetCtrl(l-1)->GetNextItem(item,
329 wxLIST_STATE_SELECTED);
332 long adr = GetCtrl(l-1)->GetItemData(item);
333 tree::Node* n = ((ItemData*)adr)->node;
334 /* FCY 18-04-2011: don't understand the real purpose of these lines,
335 if uncomment add last frame in first place
336 if(mLastSelected==item)
338 std::vector<tree::Node*>::iterator it;
340 it = sel.insert ( it , n );
349 /*int n = GetCtrl(l-1)->GetItemCount();
350 for (int i = 0; i<n; i++)
352 std::cout<<GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED)<<std::endl;
353 if ( GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED))
355 long adr = GetCtrl(l-1)->GetItemData(i);
356 tree::Node* n = ((ItemData*)adr)->node;
359 std::vector<tree::Node*>::iterator it;
361 it = sel.insert ( it , n );
376 // return mLevelList[level-1].Selected;
380 //=====================================================================
382 //=====================================================================
383 ///Removes selected nodes on last selected level
385 void WxTreeView::RemoveSelected(std::string &i_save)
389 unsigned int tempLevel = mLastLevel;
391 const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
392 // if no selection, no remove action.
396 std::stringstream out;
397 std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
400 if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
407 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<"?";
409 if (wxMessageBox(crea::std2wx(out.str()),
411 wxYES_NO,this ) == wxYES)
417 GetGimmickView()->modifyValidationSignal(false);
418 bool needRefresh=false;
419 std::vector<tree::Node*>::const_iterator i;
420 for (i=sel.begin(); i!=sel.end(); ++i)
427 if((*i)->GetParent()->GetNumberOfChildren()<2)
431 //tree::Node* n = new (tree::Node*)(*i);
432 GetTreeHandler()->LoadChildren((*i),4);
433 GetGimmickView()->AddIgnoreFile(*i);
434 GetTreeHandler()->Remove(*i);
437 if(needRefresh && mLastLevel>1)
439 UpdateLevel(mLastLevel-2);
441 else if(mLastLevel>1)
443 UpdateLevel(mLastLevel-1);
447 UpdateLevel(mLastLevel);
453 // no need to incremente level
454 mLastLevel = tempLevel;
457 if (erase && mLastLevel == 1 && i_save == "0")
460 RemoveAlertDlg *dial = new RemoveAlertDlg(this, crea::std2wx("Remove files"), wxSize(370,100));
462 if (dial->ShowModal() == wxID_OK)
464 i_save = dial->isChecked() == false? "0" : "1";
471 //=====================================================================
472 /// Updates a level of the view (adds or removes children, etc.)
473 void WxTreeView::UpdateLevel( int level )
475 GimmickDebugMessage(1,
476 GetTreeHandler()->GetTree().GetLabel()
477 <<"WxTreeView::UpdateLevel(level "
483 RecursiveUpdateLevel(level);
485 for (i=0; i<level-1; i++)
487 if (!GetSplitter(i)->IsSplit())
488 GetSplitter(i)->SplitVertically( GetCtrl(i), GetSplitter(i+1),
491 if (GetSplitter(i)->IsSplit()) GetSplitter(i)->Unsplit();
494 //=====================================================================
496 //=====================================================================
497 /// Recursive method called upon by UpdateLevel to refresh all windows
498 void WxTreeView::RecursiveUpdateLevel( int level )
500 GimmickDebugMessage(1,
501 GetTreeHandler()->GetTree().GetLabel()
502 <<"WxTreeView::RecursiveUpdateLevel(level "
507 const std::vector<tree::Node*>& sel(GetSelected(level));
511 // to speed up inserting we hide the control temporarily
513 GetCtrl(l)->DeleteAllItems();
515 std::vector<tree::Node*>::const_iterator i;
517 for (i=sel.begin(); i!=sel.end(); ++i)
519 GimmickDebugMessage(1,
520 "adding children of '"
526 //Adds items and sets their attributes
528 GetTreeHandler()->LoadChildren(*i,1);
529 tree::Node::ChildrenListType::reverse_iterator j;
530 for (j = (*i)->GetChildrenList().rbegin();
531 j!= (*i)->GetChildrenList().rend();
534 GimmickDebugMessage(1,
541 item.SetMask(wxLIST_MASK_STATE |
543 // wxLIST_MASK_IMAGE |
545 // wxLIST_MASK_WIDTH |
549 ItemData* data = new ItemData();
557 GetCtrl(l)->InsertItem(item);
560 for (int k=0; k<GetCtrl(l)->GetColumnCount(); ++k)
563 // Temporary correction : it works but no explanation about the problem FCY
567 val = (*j)->GetAttribute("NumberOfChildren");
570 val = (*j)->GetAttribute(mLevelList[l].key[k]);
571 if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isDateEntry()) // Date
573 // std::cout << "["<<val<< "]" << std::endl;
574 std::string valtmp(val);
577 boost::gregorian::date d1(boost::gregorian::from_undelimited_string(val));
578 val = to_iso_extended_string(d1);
584 // std::cout << "["<<val<< "]" << std::endl;
586 else if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isTimeEntry()) // Time
588 if ((val.size()>6) &&
589 (val != "" || val != " "))
590 val = val.substr(0,2) + " : "
591 + val.substr(2,2) + " : "
596 if (val.size()==0) val = "?";
598 if (val.size()==0) val = "X";
599 item.SetText( crea::std2wx(val));
602 GetCtrl(l)->SetItem(item);
612 //=====================================================================
615 //================================================================
616 void WxTreeView::OnItemDeSelected(wxListEvent& event)
618 GimmickDebugMessage(1,
619 GetTreeHandler()->GetTree().GetLabel()
620 <<" WxTreeView::OnItemDeselected"<<std::endl);
621 // retrieve the level
622 wxObject* obj = event.GetEventObject();
623 unsigned int level = 0;
624 for (level = 0; level<mLevelList.size(); ++level)
626 if ( GetCtrl(level) == obj ) break;
628 SetSelectedUpToDate(level,false);
629 // to allow a first selection in images TreeView
630 if (level==mLevelList.size()-1)
631 OnItemSelected(event);
633 //================================================================
635 //================================================================
636 void WxTreeView::OnItemSelected(wxListEvent& event)
639 GimmickDebugMessage(1,
640 GetTreeHandler()->GetTree().GetLabel()
641 <<" WxTreeView::OnItemSelected"<<std::endl);
643 if (mIgnoreSelectedChanged)
645 GimmickDebugMessage(1,
646 " mIgnoreSelectedChanged true: returning"
654 info.m_itemId = event.m_itemIndex;
655 mLastSelected = event.m_itemIndex;
656 // retrieve the level
657 wxObject* obj = event.GetEventObject();
658 unsigned int level = 0;
659 for (level = 0; level<mLevelList.size(); ++level)
661 if ( GetCtrl(level) == obj ) break;
664 GimmickDebugMessage(1,
668 // Update the children level (if selection not at last level)
669 if (level<mLevelList.size()-1)
672 UpdateLevel( level + 2 );
673 // Reset the viewer setting the default image
674 GetGimmickView()->ClearSelection();
676 // Select all images if the selection is at series level
677 if (level==mLevelList.size()-2)
679 // Validate selected images if the selection is at image level
680 if (level==(mLevelList.size()-1)) //&&mProcess)
682 if(event.GetEventType()==wxEVT_COMMAND_LIST_ITEM_SELECTED)
684 ValidateSelectedImages (true);
688 ValidateSelectedImages (false);
693 //================================================================
695 //================================================================
696 void WxTreeView::SelectAll(int level)
699 // int level=mLevelList.size()-1;
702 item = GetCtrl(level)->GetNextItem(item,
707 if(item==(GetCtrl(level)->GetItemCount()-1))
709 mIgnoreSelectedChanged = false;//mProcess=true;
713 mIgnoreSelectedChanged = true;// mProcess=false;
715 GetCtrl(level)->SetItemState(item,wxLIST_STATE_SELECTED, wxLIST_MASK_STATE
716 | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT);
720 //================================================================
721 //================================================================
723 void WxTreeView::OnColClick(wxListEvent& event)
725 mColumnSelected = event.m_col;
727 clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
728 clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
729 senderCtrl = event.GetEventObject();
730 unsigned int level = 0;
731 for (level = 0; level<mLevelList.size(); ++level)
733 if ( GetCtrl(level) == senderCtrl ) break;
735 PopupMenu(menu, clientpt);
739 //================================================================
740 //================================================================
742 void WxTreeView::OnItemMenu(wxListEvent &event)
745 clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
746 clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
747 senderCtrl = event.GetEventObject();
748 unsigned int level = 0;
749 for (level = 0; level<mLevelList.size(); ++level)
751 if ( GetCtrl(level) == senderCtrl ) break;
755 mLastRightLevel=level;
756 mLastRightSelected=GetCtrl(level)->HitTest(wxPoint(0,clientpt.y-8),flag,ptr);
757 PopupMenu(menuItem, clientpt);
761 //================================================================
762 //================================================================
764 void WxTreeView::OnPopupFilter(wxCommandEvent& event)
767 GimmickDebugMessage(7,
768 "WxTreeView::OnEndLabelEdit"
770 unsigned int level = 0;
771 for (level = 0; level<mLevelList.size(); ++level)
773 if ( GetCtrl(level) == senderCtrl ) break;
775 std::string filter = crea::wx2std(wxGetTextFromUser(_T("Enter the filter to apply"), _T("Filter On Column")));
780 UpdateLevel(level+1);
782 std::vector<long> items;
787 it = GetCtrl(level)->GetNextItem(it,
792 long adr = GetCtrl(level)->GetItemData(it);
793 tree::Node* nod = ((ItemData*)adr)->node;
794 att=(*nod).GetAttribute(mLevelList[level].key[mColumnSelected]);
797 if(att.find(filter)>900)
809 items.push_back(it-del);
813 std::vector<long>::iterator iter;
814 for(iter=items.begin();iter!=items.end();++iter)
816 GetCtrl(level)->DeleteItem(*iter);
818 GetGimmickView()->ClearSelection();
820 //================================================================
822 //================================================================
823 void WxTreeView::OnPopupSort(wxCommandEvent& event)
826 unsigned int level = 0;
827 for (level = 0; level<mLevelList.size(); ++level)
829 if ( GetCtrl(level) == senderCtrl ) break;
831 mLevelList[level].SortColumn = mColumnSelected;
833 if(event.GetId()==mAscendingID)
835 mLevelList[level].SortAscending = true;
837 else if(event.GetId()==mDescendingID)
839 mLevelList[level].SortAscending = false;
844 //================================================================
846 void WxTreeView::OnAnonymizer(wxCommandEvent &event)
849 std::vector<std::string> filesname;
850 std::vector<tree::Node*> nodes;
851 nodes.push_back(((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node);
852 if(nodes.size() != 0)
854 GetFilenamesAsString(nodes,filesname);
855 GetGimmickView()->Anonymize(filesname,0);
860 //================================================================
861 void WxTreeView::OnLocalCopy(wxCommandEvent& event)
865 unsigned int tempLevel = mLastLevel;
867 const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
872 std::stringstream out;
873 std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
876 if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
879 out<<"s to .creaImageIO?";
883 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<" to .creaImageIO?";
885 if (wxMessageBox(crea::std2wx(out.str()),
887 wxYES_NO,this ) == wxYES)
893 std::vector<std::string> s;
894 GetFilenamesAsString(sel,s);
895 GetGimmickView()->CopyFiles(s);
900 mLastLevel = tempLevel;
905 //================================================================
907 //================================================================
908 void WxTreeView::OnEditField(wxCommandEvent& event)
910 if(mLastRightSelected!=-1)
912 tree::Node* node=((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node;
913 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
914 std::vector<std::string> names;
915 std::vector<std::string> keys;
916 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).begin();
917 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).end();
920 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE)
922 names.push_back(a->GetName());
923 keys.push_back(a->GetKey());
926 GetGimmickView()->CreateEditFieldsDialog(node,names,keys);
930 //================================================================
932 //================================================================
934 void WxTreeView::OnExportToStorage(wxCommandEvent &event)
936 std::vector<std::string> filesname;
937 std::vector<tree::Node*> nodes;
938 nodes.push_back(((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node);
939 GetFilenamesAsString(nodes,filesname);
940 GetGimmickView()->ExportToStorage(filesname);
943 //================================================================
945 //================================================================
947 void WxTreeView::OnDumpTags(wxCommandEvent &event)
949 if(mLastRightSelected!=-1)
951 tree::Node* node=((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node;
952 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
953 std::vector<std::string> names;
954 std::vector<std::string> keys;
955 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).begin();
956 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).end();
959 if(a->GetKey()=="FullFileName")
961 GetGimmickView()->DumpTags(node->GetAttribute("FullFileName"));
969 //================================================================
971 //================================================================
972 void WxTreeView::SortLevel(int level)
974 GimmickDebugMessage(1,
975 "WxTreeView::SortLevel("
978 //Obtain the column name and the level that needs to be organized
980 // int l = level - 1;
981 //Sets the data for the items to be sorted
985 int n = GetCtrl(level)->GetItemCount();
986 for (int i = 0; i < n; i++)
989 //Gets current item data
990 ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
992 //Extracts the node and the type of attribute
993 tree::Node* nod = data->node;
996 (*nod).GetAttributeDescriptor
997 (mLevelList[level].key[mLevelList[level].SortColumn])
1000 //Obtains the organizing attribute
1001 data->attr = & (*nod).GetAttribute
1002 (mLevelList[level].key[mLevelList[level].SortColumn]);
1004 data->selected = false;
1005 if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
1007 data->selected = true;
1012 GimmickDebugMessage(1,
1013 "WxTreeView::OnSort : "
1014 <<nbselected<<" selected before sorting"
1017 mIgnoreSelectedChanged = true;
1019 if (mLevelList[level].SortAscending)
1024 GetCtrl(level)->SortItems(CompareFunctionInts, 0);
1028 GetCtrl(level)->SortItems(CompareFunctionStrings, 0);
1036 GetCtrl(level)->SortItems(CompareFunctionInts, 1);
1040 GetCtrl(level)->SortItems(CompareFunctionStrings, 1);
1045 // Reselects the unselected
1046 n = GetCtrl(level)->GetItemCount();
1048 for (int i = 0; i < n; i++)
1051 //Gets current item data
1052 ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
1057 // item = GetCtrl(level)->GetNextItem(item,wxLIST_NEXT_ALL);
1058 // if ( item == -1 ) break;
1059 //Gets current item data
1060 // ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(item);
1068 // if it is the last one we must process the selection
1069 mIgnoreSelectedChanged = false;
1071 GetCtrl(level)->SetItemState(i,
1072 wxLIST_STATE_SELECTED,
1078 | wxLIST_MASK_FORMAT);
1080 if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
1087 mIgnoreSelectedChanged = false;
1088 GimmickDebugMessage(1,
1089 "WxTreeView::SortLevel : "
1090 <<after<<" selected after sorting"
1094 //================================================================
1097 //================================================================
1098 void WxTreeView::ValidateSelectedImages(bool isSelection)
1100 GimmickDebugMessage(7,
1101 "WxTreeView::ValidateSelectedImages"
1103 const std::vector<tree::Node*>& sel(GetSelected(mLevelList.size()+1));
1104 GetGimmickView()->OnSelectionChange(sel,
1105 isSelection,(mLastSelected-1),
1106 !mIgnoreSelectedChanged);
1109 //================================================================
1112 //================================================================
1113 void WxTreeView::GetNodes(std::vector<tree::Node*>& nodes, bool direction)
1115 long item = mLastSelected;
1116 int level=mLevelList.size()-1;
1117 //Gets current item data
1118 long adr = GetCtrl(level)->GetItemData(item);
1120 tree::Node* nod = ((ItemData*)adr)->node;
1125 item = GetCtrl(level)->GetNextItem(item,
1130 item = GetCtrl(level)->GetNextItem(item,
1133 if ( item == -1 || item==0 )
1137 if(GetCtrl(level)->GetItemState(item, wxLIST_STATE_SELECTED)==0 )
1140 adr = GetCtrl(level)->GetItemData(item);
1141 nod = ((ItemData*)adr)->node;
1142 nodes.push_back(nod);
1147 //================================================================
1148 //=================================================
1149 void WxTreeView::OnKeyDown(wxListEvent &event)
1151 if(event.GetKeyCode() == WXK_DELETE)
1154 std::string temp = "0";
1155 RemoveSelected(temp);
1156 GetGimmickView()->ClearSelection();
1160 //================================================================
1162 //================================================================
1163 // Should be in another place : not specific !
1164 void WxTreeView::GetSelectedAsString(std::vector<std::string>&s)
1166 int level=mLevelList.size();
1167 const std::vector<tree::Node*>& sel=GetSelected(level+1);
1168 std::vector<tree::Node*>::const_iterator i;
1170 for (i=sel.begin(); i!=sel.end(); ++i)
1172 std::string filename=(*i)->GetAttribute("FullFileName");
1173 s.push_back(filename);
1179 //================================================================
1180 void WxTreeView::GetFilenamesAsString(const std::vector<tree::Node*>& nodes, std::vector<std::string>&s)
1182 std::vector<tree::Node*>::const_iterator i;
1184 for (i=nodes.begin(); i!=nodes.end(); ++i)
1186 if((*i)->GetLevel()<mLevelList.size())
1188 GetTreeHandler()->LoadChildren(*i,0);
1189 GetFilenamesAsString((*i)->GetChildrenList(),s);
1193 std::string filename=(*i)->GetAttribute("FullFileName");
1194 s.push_back(filename);
1199 //================================================================
1201 //================================================================
1202 void WxTreeView::GetAttributes(std::vector<std::string>& areShown, std::vector<std::string>& notShown, int level)
1206 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1207 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).begin();
1208 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).end();
1211 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE && IsAttributeVisible(a->GetName(),level))
1213 areShown.push_back(a->GetName());
1216 notShown=mLevelList[level-1].notShownAtts;
1219 //================================================================
1220 void WxTreeView::SetNonVisibleAttributes(const std::vector<std::string>& notShown, int nlevel)
1222 mLevelList[nlevel].notShownAtts=notShown;
1225 //================================================================
1226 void WxTreeView::CreateCtrl(std::vector<std::string>& notShown, int nlevel)
1228 int ctrl_style = wxLC_REPORT | wxLC_VRULES;
1229 int col_style = wxLIST_FORMAT_LEFT;
1231 mLevelList[nlevel].SelectedUpToDate = true;
1232 mLevelList[nlevel].SortColumn = 0;
1233 mLevelList[nlevel].key.clear();
1235 mLevelList[nlevel].wxCtrl = new wxListCtrl(mLevelList[nlevel].wxSplitter,
1240 wxWindow* oldWin=mLevelList[nlevel].wxSplitter->GetWindow1();
1241 mLevelList[nlevel].wxSplitter->ReplaceWindow(oldWin,mLevelList[nlevel].wxCtrl);
1242 mLevelList[nlevel].wxSplitter->Initialize(mLevelList[nlevel].wxCtrl);
1244 // Create the columns : one for each attribute of the level
1248 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1249 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).begin();
1250 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).end();
1254 if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE && IsAttributeVisible(a->GetName(),nlevel+1))
1257 std::string temp = a->GetKey();
1258 if (temp.compare("ID") != 0)
1260 mLevelList[nlevel].wxCtrl->InsertColumn(col,
1261 crea::std2wx(title),
1265 mLevelList[nlevel].key.push_back(a->GetKey());
1273 //================================================================
1274 bool WxTreeView::IsAttributeVisible(const std::string& val, int level)
1276 std::vector<std::string> ns=mLevelList[level-1].notShownAtts;
1277 std::vector<std::string>::iterator it;
1279 for(it=ns.begin();it!=ns.end()&&!found;++it)
1281 if(val.compare(*it)==0)
1288 //================================================================
1289 //================================================================
1291 RemoveAlertDlg::RemoveAlertDlg(wxWindow *parent,
1299 wxDEFAULT_DIALOG_STYLE)
1301 wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
1303 //std::string out("To reload deleted patient, you should synchronize your database before."); // JPR
1304 //wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY,crea::std2wx(out),wxDefaultPosition, wxSize(500,20));
1305 wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY,
1306 _T("To reload deleted patient, you should synchronize your database before."),
1307 wxDefaultPosition, wxSize(650,20)); // 650 vs 500 ? // JPRx
1308 mcheck = new wxCheckBox(this, 5478, _T("Do not display this warning again!"));
1309 Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &RemoveAlertDlg::onCheck );
1310 wxSizer* buttonsSizer = this->CreateSeparatedButtonSizer(wxOK|wxCANCEL);
1312 topsizer->Add(text);
1313 topsizer->Add(mcheck,0,wxGROW);
1314 topsizer->Add(buttonsSizer,0,wxGROW);
1315 SetSizer(topsizer, true);
1319 RemoveAlertDlg::~RemoveAlertDlg(){};
1320 bool RemoveAlertDlg::isChecked()
1324 void RemoveAlertDlg::onCheck(wxCommandEvent &Event)
1326 mSave = mcheck->IsChecked();
1330 //================================================================
1331 //================================================================
1332 BEGIN_EVENT_TABLE(WxTreeView, wxPanel)
1334 EVT_SIZE(MyFrame::OnSize)
1336 EVT_MENU(LIST_QUIT, MyFrame::OnQuit)
1337 EVT_MENU(LIST_ABOUT, MyFrame::OnAbout)
1338 EVT_MENU(LIST_LIST_VIEW, MyFrame::OnListView)
1339 EVT_MENU(LIST_REPORT_VIEW, MyFrame::OnReportView)
1340 EVT_MENU(LIST_ICON_VIEW, MyFrame::OnIconView)
1341 EVT_MENU(LIST_ICON_TEXT_VIEW, MyFrame::OnIconTextView)
1342 EVT_MENU(LIST_SMALL_ICON_VIEW, MyFrame::OnSmallIconView)
1343 EVT_MENU(LIST_SMALL_ICON_TEXT_VIEW, MyFrame::OnSmallIconTextView)
1344 EVT_MENU(LIST_VIRTUAL_VIEW, MyFrame::OnVirtualView)
1345 EVT_MENU(LIST_SMALL_VIRTUAL_VIEW, MyFrame::OnSmallVirtualView)
1347 EVT_MENU(LIST_FOCUS_LAST, MyFrame::OnFocusLast)
1348 EVT_MENU(LIST_TOGGLE_FIRST, MyFrame::OnToggleFirstSel)
1349 EVT_MENU(LIST_DESELECT_ALL, MyFrame::OnDeselectAll)
1350 EVT_MENU(LIST_SELECT_ALL, MyFrame::OnSelectAll)
1351 EVT_MENU(LIST_DELETE, MyFrame::OnDelete)
1352 EVT_MENU(LIST_ADD, MyFrame::OnAdd)
1353 EVT_MENU(LIST_EDIT, MyFrame::OnEdit)
1354 EVT_MENU(LIST_DELETE_ALL, MyFrame::OnDeleteAll)
1355 EVT_MENU(LIST_SORT, MyFrame::OnSort)
1356 EVT_MENU(LIST_SET_FG_COL, MyFrame::OnSetFgColour)
1357 EVT_MENU(LIST_SET_BG_COL, MyFrame::OnSetBgColour)
1358 EVT_MENU(LIST_TOGGLE_MULTI_SEL, MyFrame::OnToggleMultiSel)
1359 EVT_MENU(LIST_SHOW_COL_INFO, MyFrame::OnShowColInfo)
1360 EVT_MENU(LIST_SHOW_SEL_INFO, MyFrame::OnShowSelInfo)
1361 EVT_MENU(LIST_FREEZE, MyFrame::OnFreeze)
1362 EVT_MENU(LIST_THAW, MyFrame::OnThaw)
1363 EVT_MENU(LIST_TOGGLE_LINES, MyFrame::OnToggleLines)
1364 EVT_MENU(LIST_MAC_USE_GENERIC, MyFrame::OnToggleMacUseGeneric)
1366 EVT_UPDATE_UI(LIST_SHOW_COL_INFO, MyFrame::OnUpdateShowColInfo)
1367 EVT_UPDATE_UI(LIST_TOGGLE_MULTI_SEL, MyFrame::OnUpdateToggleMultiSel)
1370 BEGIN_EVENT_TABLE(MyListCtrl, wxListCtrl)
1371 EVT_LIST_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnBeginDrag)
1372 EVT_LIST_BEGIN_RDRAG(LIST_CTRL, MyListCtrl::OnBeginRDrag)
1374 EVT_LIST_BEGIN_LABEL_EDIT(-1, WxTreeView::OnBeginLabelEdit)
1375 EVT_LIST_END_LABEL_EDIT(-1, WxTreeView::OnEndLabelEdit)
1377 EVT_LIST_DELETE_ITEM(LIST_CTRL, MyListCtrl::OnDeleteItem)
1378 EVT_LIST_DELETE_ALL_ITEMS(LIST_CTRL, MyListCtrl::OnDeleteAllItems)
1379 #if WXWIN_COMPATIBILITY_2_4
1380 EVT_LIST_GET_INFO(LIST_CTRL, MyListCtrl::OnGetInfo)
1381 EVT_LIST_SET_INFO(LIST_CTRL, MyListCtrl::OnSetInfo)
1384 EVT_LIST_KEY_DOWN(-1, WxTreeView::OnKeyDown)
1385 EVT_LIST_ITEM_SELECTED(-1, WxTreeView::OnItemSelected)
1386 EVT_LIST_ITEM_RIGHT_CLICK(-1, WxTreeView::OnItemMenu)
1387 EVT_LIST_ITEM_DESELECTED(-1, WxTreeView::OnItemDeSelected)
1389 EVT_LIST_KEY_DOWN(LIST_CTRL, MyListCtrl::OnListKeyDown)
1390 EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, MyListCtrl::OnActivated)
1391 EVT_LIST_ITEM_FOCUSED(LIST_CTRL, MyListCtrl::OnFocused)
1393 EVT_LIST_COL_RIGHT_CLICK(-1, WxTreeView::OnColClick)
1395 EVT_LIST_COL_CLICK(-1, WxTreeView::OnColClick)
1397 //EVT_LEFT_DOWN(WxTreeView::OnMouseClick)
1399 EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnColBeginDrag)
1400 EVT_LIST_COL_DRAGGING(LIST_CTRL, MyListCtrl::OnColDragging)
1401 EVT_LIST_COL_END_DRAG(LIST_CTRL, MyListCtrl::OnColEndDrag)
1403 EVT_LIST_CACHE_HINT(LIST_CTRL, MyListCtrl::OnCacheHint)
1405 #if USE_CONTEXT_MENU
1406 EVT_CONTEXT_MENU(MyListCtrl::OnContextMenu)
1408 EVT_CHAR(MyListCtrl::OnChar)
1410 EVT_RIGHT_DOWN(MyListCtrl::OnRightClick)
1414 } // EO namespace creaImageIO