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 <wx/splitter.h>
31 #include <wx/gdicmn.h>
32 #include <boost/date_time/gregorian/gregorian.hpp>
33 #include <creaImageIOGimmick.h>
37 //=====================================================================
41 //=====================================================================
43 //=====================================================================
45 //=====================================================================
46 ///Comparing function for ordering algorithm. Takes parameters as strings.
47 //int wxCALLBACK CompareFunctionStrings(long item1, long item2, long sortData)
48 int wxCALLBACK CompareFunctionStrings(wxIntPtr item1, wxIntPtr item2, wxIntPtr sortData)
50 creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
51 creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
52 const std::string& s1(*(data1->attr));
53 const std::string& s2(*(data2->attr));
57 if (s1 < s2) return 1;
58 if (s1 > s2) return -1;
61 if (s1 < s2) return -1;
62 if (s1 > s2) return 1;
66 //=====================================================================
68 //=====================================================================
69 ///Comparing function for ordering algorithm. Takes parameters as ints.
70 int wxCALLBACK CompareFunctionInts(long item1, long item2, long sortData)
72 creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
73 creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
75 const std::string& s1(*(data1->attr));
76 const std::string& s2(*(data2->attr));
78 int val1=atoi(s1.c_str());
79 int val2=atoi(s2.c_str());
104 //=====================================================================
107 //=====================================================================
108 namespace creaImageIO
110 //=====================================================================
112 WxTreeView::WxTreeView(TreeHandler* handler,
113 GimmickView* gimmick,
116 : wxPanel(parent,id),
117 TreeView(handler, gimmick)
119 GimmickDebugMessage(1,"WxTreeView::WxTreeView"<<std::endl);
121 // Split part below toolbar into notebook for views and panel
122 // for preview, messages...
124 // mSplitter = new wxSplitterWindow( this , -1);
127 msizer = new wxBoxSizer(wxHORIZONTAL);
128 int ctrl_style = wxLC_REPORT | wxLC_VRULES;
129 int col_style = wxLIST_FORMAT_LEFT;
130 // Creating the ListCtrl for the levels > 0 (not for Root level)
131 for (int i = 0;i < handler->GetTree().GetNumberOfLevels() -1; ++i)
133 GimmickDebugMessage(5,"Creating view for level "<<i <<std::endl);
135 level.SelectedUpToDate = true;
136 level.SortColumn = 0;
138 // If the first level : parent = this
139 wxWindow* sparent = this;
140 // else parent = last splitter
143 sparent = mLevelList[i-1].wxSplitter;
145 level.wxSplitter = new wxSplitterWindow( sparent , -1);
148 level.wxSplitter->Show(false);
150 // level.wxSplitter->SetMinimumPaneSize(100);
152 wxListCtrl* ctrl = new wxListCtrl(level.wxSplitter,
162 level.wxSplitter->Initialize(ctrl);
164 // Create the columns : one for each attribute of the level
168 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
169 for (a = handler->GetTree().GetAttributeDescriptorList(i+1).begin();
170 a != handler->GetTree().GetAttributeDescriptorList(i+1).end();
173 GimmickDebugMessage(5,"Creating column "<<col<<" : " <<a->GetName() <<std::endl);
174 if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE)
176 if(a->GetName()=="UNKNOWN")
179 title += handler->GetTree().GetLevelDescriptor(i+1).GetName();
180 if (title[title.size()-1]!='s')
187 std::string temp = a->GetKey();
188 if (temp.compare("ID") != 0)
190 ctrl->InsertColumn(col,crea::std2wx(title),col_style);
193 level.key.push_back(a->GetKey());
197 mLevelList.push_back(level);
204 wxMenuItem* m1=menu->Append(wxID_ANY, _T("&Sort ascending"));
205 wxMenuItem* m2=menu->Append(wxID_ANY, _T("&Sort descending"));
206 wxMenuItem* m3=menu->Append(wxID_ANY, _T("&Filter"));
207 mAscendingID=m1->GetId();
208 mDescendingID=m2->GetId();
209 mFilterID=m3->GetId();
210 Connect( mAscendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
211 Connect( mDescendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
212 Connect( mFilterID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupFilter) );
215 ////SubMenuItem EXPORT
216 subExportMenu = new wxMenu();
217 wxMenuItem *subExp1 = subExportMenu->Append(wxID_ANY, _T("&Export to Storage"));
218 Connect( subExp1->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnExportToStorage) );
221 menuItem =new wxMenu();
223 wxMenuItem* m2Item=menuItem->Append(wxID_ANY, _T("&Local Copy"));
224 wxMenuItem* m3Item=menuItem->Append(wxID_ANY, _T("&Edit Fields"));
225 wxMenuItem* m4Item=menuItem->Append(wxID_ANY, _T("&Display Dicom Tags"));
226 menuItem->AppendSubMenu(subExportMenu, wxT("&Export"));
228 wxMenuItem* m1Item=menuItem->Append(wxID_ANY, _T("&Anonymize"));
229 mAnonymizingID=m1Item->GetId();
230 Connect( mAnonymizingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnAnonymizer) );
232 mLocalCopyID=m2Item->GetId();
233 mEditFieldID=m3Item->GetId();
234 mDumpID=m4Item->GetId();
236 Connect( mLocalCopyID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnLocalCopy) );
237 Connect( mEditFieldID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnEditField) );
238 Connect( mDumpID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnDumpTags) );
240 #endif // wxUSE_MENUS
241 /// Initialize the first level splitter
243 msizer->Add( mLevelList[0].wxSplitter ,1, wxGROW ,0);
244 // mColumnSelected = 1;
247 // mDirection = true;
249 mIgnoreSelectedChanged = false;
251 //CreateColorPalette();
258 //=====================================================================
260 //=====================================================================
262 WxTreeView::~WxTreeView()
264 GimmickDebugMessage(1,"WxTreeView::~WxTreeView"<<std::endl);
268 //=====================================================================
270 //=====================================================================
271 const std::vector<tree::Node*>& WxTreeView::GetSelected(int level)
273 std::vector<tree::Node*>& sel = mLevelList[0].Selected;
274 // if (GetSelectedUpToDate(level))
276 // the selection of upper level
277 if(mLevelList.size() == level -1)
279 sel = mLevelList.back().Selected;
281 sel= mLevelList[l].Selected;
289 sel.push_back( GetTreeHandler()->GetTree().GetTree() );
290 } else if (level < mLevelList.size()+2 ) {
294 item = GetCtrl(l-1)->GetNextItem(item,
296 wxLIST_STATE_SELECTED);
301 // long adr = (long)GetCtrl(l-1)->GetItemData(item);
302 ItemData* adr = (ItemData*)GetCtrl(l-1)->GetItemData(item);
303 // tree::Node* n = ((ItemData*)adr)->node;
304 tree::Node* n = adr->node;
305 /* FCY 18-04-2011: don't understand the real purpose of these lines,
306 if uncomment add last frame in first place
307 if(mLastSelected==item)
309 std::vector<tree::Node*>::iterator it;
311 it = sel.insert ( it , n );
319 /*int n = GetCtrl(l-1)->GetItemCount();
320 for (int i = 0; i<n; i++)
322 std::cout<<GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED)<<std::endl;
323 if ( GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED))
325 long adr = GetCtrl(l-1)->GetItemData(i);
326 tree::Node* n = ((ItemData*)adr)->node;
329 std::vector<tree::Node*>::iterator it;
331 it = sel.insert ( it , n );
344 // return mLevelList[level-1].Selected;
348 //=====================================================================
350 //=====================================================================
351 ///Removes selected nodes on last selected level
353 void WxTreeView::RemoveSelected(std::string &i_save)
357 unsigned int tempLevel = mLastLevel;
359 const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
360 // if no selection, no remove action.
363 std::stringstream out;
364 std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
367 if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
374 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<"?";
376 if (wxMessageBox(crea::std2wx(out.str()),
378 wxYES_NO,this ) == wxYES)
384 GetGimmickView()->modifyValidationSignal(false);
385 bool needRefresh=false;
386 std::vector<tree::Node*>::const_iterator i;
387 for (i=sel.begin(); i!=sel.end(); ++i)
389 GimmickMessage(1,"deleting '" << (*i)->GetLabel() << "'" << mLastLevel << std::endl );
390 if((*i)->GetParent()->GetNumberOfChildren()<2)
394 //tree::Node* n = new (tree::Node*)(*i);
395 GetTreeHandler()->LoadChildren((*i),4);
396 GetGimmickView()->AddIgnoreFile(*i);
397 GetTreeHandler()->Remove(*i);
400 if(needRefresh && mLastLevel>1)
402 UpdateLevel(mLastLevel-2);
403 } else if(mLastLevel>1) {
404 UpdateLevel(mLastLevel-1);
406 UpdateLevel(mLastLevel);
410 // no need to incremente level
411 mLastLevel = tempLevel;
414 if (erase && mLastLevel == 1 && i_save == "0")
417 RemoveAlertDlg *dial = new RemoveAlertDlg(this, crea::std2wx("Remove files"), wxSize(450,300));
419 if (dial->ShowModal() == wxID_OK)
421 i_save = dial->isChecked() == false? "0" : "1";
428 //=====================================================================
429 /// Updates a level of the view (adds or removes children, etc.)
430 void WxTreeView::UpdateLevel( int level )
432 GimmickDebugMessage(1,
433 GetTreeHandler()->GetTree().GetLabel()
434 <<"WxTreeView::UpdateLevel(level "
440 RecursiveUpdateLevel(level);
442 for (i=0; i<level-1; i++)
444 if (!GetSplitter(i)->IsSplit())
446 GetSplitter(i)->SplitVertically( GetCtrl(i), GetSplitter(i+1),100 );
449 if (GetSplitter(i)->IsSplit())
451 GetSplitter(i)->Unsplit();
455 //=====================================================================
457 //=====================================================================
458 /// Recursive method called upon by UpdateLevel to refresh all windows
459 void WxTreeView::RecursiveUpdateLevel( int level )
461 GimmickDebugMessage(1,
462 GetTreeHandler()->GetTree().GetLabel()
463 <<"WxTreeView::RecursiveUpdateLevel(level "
468 const std::vector<tree::Node*>& sel(GetSelected(level));
471 // to speed up inserting we hide the control temporarily
473 GetCtrl(l)->DeleteAllItems();
475 std::vector<tree::Node*>::const_iterator i;
477 for (i=sel.begin(); i!=sel.end(); ++i)
479 GimmickDebugMessage(1,
480 "adding children of '"
486 //Adds items and sets their attributes
488 GetTreeHandler()->LoadChildren(*i,1);
489 tree::Node::ChildrenListType::reverse_iterator j;
490 for (j = (*i)->GetChildrenList().rbegin();
491 j!= (*i)->GetChildrenList().rend();
494 GimmickDebugMessage(1,
501 item.SetMask(wxLIST_MASK_STATE |
503 // wxLIST_MASK_IMAGE |
505 // wxLIST_MASK_WIDTH |
509 ItemData* data = new ItemData();
517 GetCtrl(l)->InsertItem(item);
520 for (int k=0; k<GetCtrl(l)->GetColumnCount(); ++k)
523 // Temporary correction : it works but no explanation about the problem FCY
526 val = (*j)->GetAttribute("NumberOfChildren");
528 val = (*j)->GetAttribute(mLevelList[l].key[k]);
530 if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isDateEntry()) // Date
532 // std::cout << "["<<val<< "]" << std::endl;
533 std::string valtmp(val);
536 boost::gregorian::date d1(boost::gregorian::from_undelimited_string(val));
537 val = to_iso_extended_string(d1);
541 // std::cout << "["<<val<< "]" << std::endl;
542 } else if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isTimeEntry()) // Time
544 if ((val.size()>6) && (val != "" || val != " "))
546 val = val.substr(0,2) + " : " + val.substr(2,2) + " : " + val.substr(4,2);
558 item.SetText( crea::std2wx(val));
560 GetCtrl(l)->SetItem(item);
568 //=====================================================================
571 //================================================================
572 void WxTreeView::OnItemDeSelected(wxListEvent& event)
574 GimmickDebugMessage(1,
575 GetTreeHandler()->GetTree().GetLabel()
576 <<" WxTreeView::OnItemDeselected"<<std::endl);
577 // retrieve the level
578 wxObject* obj = event.GetEventObject();
579 unsigned int level = 0;
580 for (level = 0; level<mLevelList.size(); ++level)
582 if ( GetCtrl(level) == obj ) break;
584 SetSelectedUpToDate(level,false);
585 // to allow a first selection in images TreeView
586 if (level==mLevelList.size()-1)
587 OnItemSelected(event);
589 //================================================================
591 //================================================================
592 void WxTreeView::OnItemSelected(wxListEvent& event)
594 GimmickDebugMessage(1,GetTreeHandler()->GetTree().GetLabel()<<" WxTreeView::OnItemSelected"<<std::endl);
596 if (mIgnoreSelectedChanged)
598 GimmickDebugMessage(1, " mIgnoreSelectedChanged true: returning"<<std::endl);
603 info.m_itemId = event.m_itemIndex;
604 mLastSelected = event.m_itemIndex;
605 // retrieve the level
606 wxObject* obj = event.GetEventObject();
607 unsigned int level = 0;
608 for (level = 0; level<mLevelList.size(); ++level)
610 if ( GetCtrl(level) == obj ) break;
613 GimmickDebugMessage(1," Level "<<level+1<<std::endl);
615 // Update the children level (if selection not at last level)
616 if (level<mLevelList.size()-1)
618 UpdateLevel( level + 2 );
619 // Reset the viewer setting the default image
620 GetGimmickView()->ClearSelection();
622 // Select all images if the selection is at series level
623 if (level==mLevelList.size()-2)
627 // Validate selected images if the selection is at image level
628 if (level==(mLevelList.size()-1)) //&&mProcess)
630 if(event.GetEventType()==wxEVT_COMMAND_LIST_ITEM_SELECTED)
632 ValidateSelectedImages (true);
634 ValidateSelectedImages (false);
638 //================================================================
640 //================================================================
641 void WxTreeView::SelectAll(int level)
644 // int level=mLevelList.size()-1;
647 item = GetCtrl(level)->GetNextItem(item,wxLIST_NEXT_ALL);
652 if(item==(GetCtrl(level)->GetItemCount()-1))
654 mIgnoreSelectedChanged = false;//mProcess=true;
656 mIgnoreSelectedChanged = true;// mProcess=false;
658 GetCtrl(level)->SetItemState(item,wxLIST_STATE_SELECTED, wxLIST_MASK_STATE
659 | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT);
663 //================================================================
664 //================================================================
666 void WxTreeView::OnColClick(wxListEvent& event)
668 mColumnSelected = event.m_col;
670 clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
671 clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
672 senderCtrl = event.GetEventObject();
673 unsigned int level = 0;
674 for (level = 0; level<mLevelList.size(); ++level)
676 if ( GetCtrl(level) == senderCtrl ) break;
678 PopupMenu(menu, clientpt);
682 //================================================================
683 //================================================================
685 void WxTreeView::OnItemMenu(wxListEvent &event)
688 clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
689 clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
690 senderCtrl = event.GetEventObject();
691 unsigned int level = 0;
692 for (level = 0; level<mLevelList.size(); ++level)
694 if ( GetCtrl(level) == senderCtrl ) break;
698 mLastRightLevel=level;
699 mLastRightSelected=GetCtrl(level)->HitTest(wxPoint(0,clientpt.y-8),flag,ptr);
700 PopupMenu(menuItem, clientpt);
704 //================================================================
705 //================================================================
707 void WxTreeView::OnPopupFilter(wxCommandEvent& event)
710 GimmickDebugMessage(7,
711 "WxTreeView::OnEndLabelEdit"
713 unsigned int level = 0;
714 for (level = 0; level<mLevelList.size(); ++level)
716 if ( GetCtrl(level) == senderCtrl ) break;
718 std::string filter = crea::wx2std(wxGetTextFromUser(_T("Enter the filter to apply"), _T("Filter On Column")));
723 UpdateLevel(level+1);
725 std::vector<long> items;
730 it = GetCtrl(level)->GetNextItem(it,
735 long adr = (long)GetCtrl(level)->GetItemData(it);
736 tree::Node* nod = ((ItemData*)adr)->node;
737 att=(*nod).GetAttribute(mLevelList[level].key[mColumnSelected]);
740 if(att.find(filter)>900)
752 items.push_back(it-del);
756 std::vector<long>::iterator iter;
757 for(iter=items.begin();iter!=items.end();++iter)
759 GetCtrl(level)->DeleteItem(*iter);
761 GetGimmickView()->ClearSelection();
763 //================================================================
765 //================================================================
766 void WxTreeView::OnPopupSort(wxCommandEvent& event)
769 unsigned int level = 0;
770 for (level = 0; level<mLevelList.size(); ++level)
772 if ( GetCtrl(level) == senderCtrl ) break;
774 mLevelList[level].SortColumn = mColumnSelected;
776 if(event.GetId()==mAscendingID)
778 mLevelList[level].SortAscending = true;
780 else if(event.GetId()==mDescendingID)
782 mLevelList[level].SortAscending = false;
786 //================================================================
788 void WxTreeView::OnAnonymizer(wxCommandEvent &event)
791 std::vector<std::string> filesname;
792 std::vector<tree::Node*> nodes;
793 nodes.push_back(((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node);
794 if(nodes.size() != 0)
796 GetFilenamesAsString(nodes,filesname);
797 GetGimmickView()->Anonymize(filesname,0);
802 //================================================================
803 void WxTreeView::OnLocalCopy(wxCommandEvent& event)
807 unsigned int tempLevel = mLastLevel;
809 const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
814 std::stringstream out;
815 std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
818 if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
821 out<<"s to .creaImageIO?";
825 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<" to .creaImageIO?";
827 if (wxMessageBox(crea::std2wx(out.str()),
829 wxYES_NO,this ) == wxYES)
835 std::vector<std::string> s;
836 GetFilenamesAsString(sel,s);
837 GetGimmickView()->CopyFiles(s);
842 mLastLevel = tempLevel;
847 //================================================================
849 //================================================================
850 void WxTreeView::OnEditField(wxCommandEvent& event)
852 if(mLastRightSelected!=-1)
854 tree::Node* node=((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node;
855 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
856 std::vector<std::string> names;
857 std::vector<std::string> keys;
858 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).begin();
859 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).end();
862 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE)
864 names.push_back(a->GetName());
865 keys.push_back(a->GetKey());
868 GetGimmickView()->CreateEditFieldsDialog(node,names,keys);
872 //================================================================
874 //================================================================
876 void WxTreeView::OnExportToStorage(wxCommandEvent &event)
878 std::vector<std::string> filesname;
879 std::vector<tree::Node*> nodes;
880 nodes.push_back(((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node);
881 GetFilenamesAsString(nodes,filesname);
882 GetGimmickView()->ExportToStorage(filesname);
885 //================================================================
887 //================================================================
889 void WxTreeView::OnDumpTags(wxCommandEvent &event)
891 if(mLastRightSelected!=-1)
893 tree::Node* node=((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node;
894 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
895 std::vector<std::string> names;
896 std::vector<std::string> keys;
897 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).begin();
898 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).end();
901 if(a->GetKey()=="FullFileName")
903 GetGimmickView()->DumpTags(node->GetAttribute("FullFileName"));
911 //================================================================
913 //================================================================
914 void WxTreeView::SortLevel(int level)
916 GimmickDebugMessage(1,
917 "WxTreeView::SortLevel("
920 //Obtain the column name and the level that needs to be organized
922 // int l = level - 1;
923 //Sets the data for the items to be sorted
927 int n = GetCtrl(level)->GetItemCount();
928 for (int i = 0; i < n; i++)
930 //Gets current item data
931 ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
932 //Extracts the node and the type of attribute
933 tree::Node* nod = data->node;
936 (*nod).GetAttributeDescriptor
937 (mLevelList[level].key[mLevelList[level].SortColumn])
940 //Obtains the organizing attribute
941 data->attr = & (*nod).GetAttribute(mLevelList[level].key[mLevelList[level].SortColumn]);
943 data->selected = false;
944 if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
946 data->selected = true;
950 GimmickDebugMessage(1,
951 "WxTreeView::OnSort : "
952 <<nbselected<<" selected before sorting"
954 mIgnoreSelectedChanged = true;
956 if (mLevelList[level].SortAscending)
960 GetCtrl(level)->SortItems(CompareFunctionInts, 0);
962 GetCtrl(level)->SortItems(CompareFunctionStrings, 0);
967 GetCtrl(level)->SortItems(CompareFunctionInts, 1);
969 GetCtrl(level)->SortItems(CompareFunctionStrings, 1);
973 // Reselects the unselected
974 n = GetCtrl(level)->GetItemCount();
976 for (int i = 0; i < n; i++)
978 //Gets current item data
979 ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
983 // item = GetCtrl(level)->GetNextItem(item,wxLIST_NEXT_ALL);
984 // if ( item == -1 ) break;
985 //Gets current item data
986 // ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(item);
994 // if it is the last one we must process the selection
995 mIgnoreSelectedChanged = false;
997 GetCtrl(level)->SetItemState(i,
998 wxLIST_STATE_SELECTED,
1004 | wxLIST_MASK_FORMAT);
1006 if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
1013 mIgnoreSelectedChanged = false;
1014 GimmickDebugMessage(1,
1015 "WxTreeView::SortLevel : "
1016 <<after<<" selected after sorting"
1019 //================================================================
1022 //================================================================
1023 void WxTreeView::ValidateSelectedImages(bool isSelection)
1025 GimmickDebugMessage(7,
1026 "WxTreeView::ValidateSelectedImages"
1028 const std::vector<tree::Node*>& sel(GetSelected((int)mLevelList.size()+1));
1029 GetGimmickView()->OnSelectionChange(sel,
1030 isSelection,(mLastSelected-1),
1031 !mIgnoreSelectedChanged);
1034 //================================================================
1037 //================================================================
1038 void WxTreeView::GetNodes(std::vector<tree::Node*>& nodes, bool direction)
1040 long item = mLastSelected;
1041 int level=(int)mLevelList.size()-1;
1042 //Gets current item data
1043 long adr = (long)GetCtrl(level)->GetItemData(item);
1045 tree::Node* nod = ((ItemData*)adr)->node;
1050 item = GetCtrl(level)->GetNextItem(item,
1055 item = GetCtrl(level)->GetNextItem(item,
1058 if ( item == -1 || item==0 )
1062 if(GetCtrl(level)->GetItemState(item, wxLIST_STATE_SELECTED)==0 )
1065 adr = (long)GetCtrl(level)->GetItemData(item);
1066 nod = ((ItemData*)adr)->node;
1067 nodes.push_back(nod);
1072 //================================================================
1073 //=================================================
1074 void WxTreeView::OnKeyDown(wxListEvent &event)
1076 if(event.GetKeyCode() == WXK_DELETE)
1079 std::string temp = "0";
1080 RemoveSelected(temp);
1081 GetGimmickView()->ClearSelection();
1085 //================================================================
1087 //================================================================
1088 // Should be in another place : not specific !
1089 void WxTreeView::GetSelectedAsString(std::vector<std::string>&s)
1091 int level= (int)mLevelList.size();
1092 const std::vector<tree::Node*>& sel=GetSelected(level+1);
1093 std::vector<tree::Node*>::const_iterator i;
1095 for (i=sel.begin(); i!=sel.end(); ++i)
1097 std::string filename=(*i)->GetAttribute("FullFileName");
1098 s.push_back(filename);
1104 //================================================================
1105 void WxTreeView::GetFilenamesAsString(const std::vector<tree::Node*>& nodes, std::vector<std::string>&s)
1107 std::vector<tree::Node*>::const_iterator i;
1109 for (i=nodes.begin(); i!=nodes.end(); ++i)
1111 if((*i)->GetLevel()<mLevelList.size())
1113 GetTreeHandler()->LoadChildren(*i,0);
1114 GetFilenamesAsString((*i)->GetChildrenList(),s);
1118 std::string filename=(*i)->GetAttribute("FullFileName");
1119 s.push_back(filename);
1124 //================================================================
1126 //================================================================
1127 void WxTreeView::GetAttributes(std::vector<std::string>& areShown, std::vector<std::string>& notShown, int level)
1131 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1132 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).begin();
1133 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).end();
1136 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE && IsAttributeVisible(a->GetName(),level))
1138 areShown.push_back(a->GetName());
1141 notShown=mLevelList[level-1].notShownAtts;
1144 //================================================================
1145 void WxTreeView::SetNonVisibleAttributes(const std::vector<std::string>& notShown, int nlevel)
1147 mLevelList[nlevel].notShownAtts=notShown;
1150 //================================================================
1151 void WxTreeView::CreateCtrl(std::vector<std::string>& notShown, int nlevel)
1153 int ctrl_style = wxLC_REPORT | wxLC_VRULES;
1154 int col_style = wxLIST_FORMAT_LEFT;
1156 mLevelList[nlevel].SelectedUpToDate = true;
1157 mLevelList[nlevel].SortColumn = 0;
1158 mLevelList[nlevel].key.clear();
1160 mLevelList[nlevel].wxCtrl = new wxListCtrl(mLevelList[nlevel].wxSplitter,
1165 wxWindow* oldWin=mLevelList[nlevel].wxSplitter->GetWindow1();
1166 mLevelList[nlevel].wxSplitter->ReplaceWindow(oldWin,mLevelList[nlevel].wxCtrl);
1167 mLevelList[nlevel].wxSplitter->Initialize(mLevelList[nlevel].wxCtrl);
1169 // Create the columns : one for each attribute of the level
1173 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1174 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).begin();
1175 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).end();
1179 if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE && IsAttributeVisible(a->GetName(),nlevel+1))
1182 std::string temp = a->GetKey();
1183 if (temp.compare("ID") != 0)
1185 mLevelList[nlevel].wxCtrl->InsertColumn(col,
1186 crea::std2wx(title),
1190 mLevelList[nlevel].key.push_back(a->GetKey());
1198 //================================================================
1199 bool WxTreeView::IsAttributeVisible(const std::string& val, int level)
1201 std::vector<std::string> ns=mLevelList[level-1].notShownAtts;
1202 std::vector<std::string>::iterator it;
1204 for(it=ns.begin();it!=ns.end()&&!found;++it)
1206 if(val.compare(*it)==0)
1213 //================================================================
1214 //================================================================
1216 RemoveAlertDlg::RemoveAlertDlg(wxWindow *parent,
1224 wxDEFAULT_DIALOG_STYLE)
1226 wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
1228 //std::string out("To reload deleted patient, you should synchronize your database before."); // JPR
1229 //wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY,crea::std2wx(out),wxDefaultPosition, wxSize(500,20));
1230 wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY,
1231 _T("To reload deleted patient, you should synchronize your database before."),
1232 wxDefaultPosition, wxSize(650,20)); // 650 vs 500 ? // JPRx
1233 mcheck = new wxCheckBox(this, 5478, _T("Do not display this warning again!"));
1234 Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &RemoveAlertDlg::onCheck );
1235 wxSizer* buttonsSizer = this->CreateSeparatedButtonSizer(wxOK|wxCANCEL);
1237 topsizer->Add(text);
1238 topsizer->Add(mcheck,0,wxGROW);
1239 topsizer->Add(buttonsSizer,0,wxGROW);
1240 SetSizer(topsizer, true);
1244 RemoveAlertDlg::~RemoveAlertDlg(){};
1245 bool RemoveAlertDlg::isChecked()
1249 void RemoveAlertDlg::onCheck(wxCommandEvent &Event)
1251 mSave = mcheck->IsChecked();
1255 //================================================================
1256 //================================================================
1257 BEGIN_EVENT_TABLE(WxTreeView, wxPanel)
1259 EVT_SIZE(MyFrame::OnSize)
1261 EVT_MENU(LIST_QUIT, MyFrame::OnQuit)
1262 EVT_MENU(LIST_ABOUT, MyFrame::OnAbout)
1263 EVT_MENU(LIST_LIST_VIEW, MyFrame::OnListView)
1264 EVT_MENU(LIST_REPORT_VIEW, MyFrame::OnReportView)
1265 EVT_MENU(LIST_ICON_VIEW, MyFrame::OnIconView)
1266 EVT_MENU(LIST_ICON_TEXT_VIEW, MyFrame::OnIconTextView)
1267 EVT_MENU(LIST_SMALL_ICON_VIEW, MyFrame::OnSmallIconView)
1268 EVT_MENU(LIST_SMALL_ICON_TEXT_VIEW, MyFrame::OnSmallIconTextView)
1269 EVT_MENU(LIST_VIRTUAL_VIEW, MyFrame::OnVirtualView)
1270 EVT_MENU(LIST_SMALL_VIRTUAL_VIEW, MyFrame::OnSmallVirtualView)
1272 EVT_MENU(LIST_FOCUS_LAST, MyFrame::OnFocusLast)
1273 EVT_MENU(LIST_TOGGLE_FIRST, MyFrame::OnToggleFirstSel)
1274 EVT_MENU(LIST_DESELECT_ALL, MyFrame::OnDeselectAll)
1275 EVT_MENU(LIST_SELECT_ALL, MyFrame::OnSelectAll)
1276 EVT_MENU(LIST_DELETE, MyFrame::OnDelete)
1277 EVT_MENU(LIST_ADD, MyFrame::OnAdd)
1278 EVT_MENU(LIST_EDIT, MyFrame::OnEdit)
1279 EVT_MENU(LIST_DELETE_ALL, MyFrame::OnDeleteAll)
1280 EVT_MENU(LIST_SORT, MyFrame::OnSort)
1281 EVT_MENU(LIST_SET_FG_COL, MyFrame::OnSetFgColour)
1282 EVT_MENU(LIST_SET_BG_COL, MyFrame::OnSetBgColour)
1283 EVT_MENU(LIST_TOGGLE_MULTI_SEL, MyFrame::OnToggleMultiSel)
1284 EVT_MENU(LIST_SHOW_COL_INFO, MyFrame::OnShowColInfo)
1285 EVT_MENU(LIST_SHOW_SEL_INFO, MyFrame::OnShowSelInfo)
1286 EVT_MENU(LIST_FREEZE, MyFrame::OnFreeze)
1287 EVT_MENU(LIST_THAW, MyFrame::OnThaw)
1288 EVT_MENU(LIST_TOGGLE_LINES, MyFrame::OnToggleLines)
1289 EVT_MENU(LIST_MAC_USE_GENERIC, MyFrame::OnToggleMacUseGeneric)
1291 EVT_UPDATE_UI(LIST_SHOW_COL_INFO, MyFrame::OnUpdateShowColInfo)
1292 EVT_UPDATE_UI(LIST_TOGGLE_MULTI_SEL, MyFrame::OnUpdateToggleMultiSel)
1295 BEGIN_EVENT_TABLE(MyListCtrl, wxListCtrl)
1296 EVT_LIST_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnBeginDrag)
1297 EVT_LIST_BEGIN_RDRAG(LIST_CTRL, MyListCtrl::OnBeginRDrag)
1299 EVT_LIST_BEGIN_LABEL_EDIT(-1, WxTreeView::OnBeginLabelEdit)
1300 EVT_LIST_END_LABEL_EDIT(-1, WxTreeView::OnEndLabelEdit)
1302 EVT_LIST_DELETE_ITEM(LIST_CTRL, MyListCtrl::OnDeleteItem)
1303 EVT_LIST_DELETE_ALL_ITEMS(LIST_CTRL, MyListCtrl::OnDeleteAllItems)
1304 #if WXWIN_COMPATIBILITY_2_4
1305 EVT_LIST_GET_INFO(LIST_CTRL, MyListCtrl::OnGetInfo)
1306 EVT_LIST_SET_INFO(LIST_CTRL, MyListCtrl::OnSetInfo)
1309 EVT_LIST_KEY_DOWN(-1, WxTreeView::OnKeyDown)
1310 EVT_LIST_ITEM_SELECTED(-1, WxTreeView::OnItemSelected)
1311 EVT_LIST_ITEM_RIGHT_CLICK(-1, WxTreeView::OnItemMenu)
1312 EVT_LIST_ITEM_DESELECTED(-1, WxTreeView::OnItemDeSelected)
1314 EVT_LIST_KEY_DOWN(LIST_CTRL, MyListCtrl::OnListKeyDown)
1315 EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, MyListCtrl::OnActivated)
1316 EVT_LIST_ITEM_FOCUSED(LIST_CTRL, MyListCtrl::OnFocused)
1318 EVT_LIST_COL_RIGHT_CLICK(-1, WxTreeView::OnColClick)
1320 EVT_LIST_COL_CLICK(-1, WxTreeView::OnColClick)
1322 //EVT_LEFT_DOWN(WxTreeView::OnMouseClick)
1324 EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnColBeginDrag)
1325 EVT_LIST_COL_DRAGGING(LIST_CTRL, MyListCtrl::OnColDragging)
1326 EVT_LIST_COL_END_DRAG(LIST_CTRL, MyListCtrl::OnColEndDrag)
1328 EVT_LIST_CACHE_HINT(LIST_CTRL, MyListCtrl::OnCacheHint)
1330 #if USE_CONTEXT_MENU
1331 EVT_CONTEXT_MENU(MyListCtrl::OnContextMenu)
1333 EVT_CHAR(MyListCtrl::OnChar)
1335 EVT_RIGHT_DOWN(MyListCtrl::OnRightClick)
1339 } // EO namespace creaImageIO