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>
7 #include <creaImageIOGimmick.h>
11 //=====================================================================
15 //=====================================================================
17 //=====================================================================
19 //=====================================================================
20 ///Comparing function for ordering algorithm. Takes parameters as strings.
21 int wxCALLBACK CompareFunctionStrings(long item1, long item2, long sortData)
23 creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
24 creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
26 const std::string& s1(*(data1->attr));
27 const std::string& s2(*(data2->attr));
49 //=====================================================================
51 //=====================================================================
52 ///Comparing function for ordering algorithm. Takes parameters as ints.
53 int wxCALLBACK CompareFunctionInts(long item1, long item2, long sortData)
55 creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
56 creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
58 const std::string& s1(*(data1->attr));
59 const std::string& s2(*(data2->attr));
61 int val1=atoi(s1.c_str());
62 int val2=atoi(s2.c_str());
87 //=====================================================================
90 //=====================================================================
93 //=====================================================================
95 WxTreeView::WxTreeView(TreeHandler* handler,
100 TreeView(handler, gimmick)
102 GimmickDebugMessage(1,"WxTreeView::WxTreeView"
106 // Split part below toolbar into notebook for views and panel
107 // for preview, messages...
109 // mSplitter = new wxSplitterWindow( this , -1);
112 msizer = new wxBoxSizer(wxHORIZONTAL);
114 int ctrl_style = wxLC_REPORT | wxLC_VRULES;
115 int col_style = wxLIST_FORMAT_LEFT;
117 // Creating the ListCtrl for the levels > 0 (not for Root level)
119 i < handler->GetTree().GetNumberOfLevels() -1;
122 GimmickDebugMessage(5,"Creating view for level "<<i
125 level.SelectedUpToDate = true;
126 level.SortColumn = 0;
128 // If the first level : parent = this
129 wxWindow* sparent = this;
130 // else parent = last splitter
132 sparent = mLevelList[i-1].wxSplitter;
134 level.wxSplitter = new wxSplitterWindow( sparent , -1);
137 level.wxSplitter->Show(false);
139 // level.wxSplitter->SetMinimumPaneSize(100);
141 wxListCtrl* ctrl = new wxListCtrl(level.wxSplitter,
147 level.wxSplitter->Initialize(ctrl);
149 // Create the columns : one for each attribute of the level
153 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
154 for (a = handler->GetTree().GetAttributeDescriptorList(i+1).begin();
155 a != handler->GetTree().GetAttributeDescriptorList(i+1).end();
160 GimmickDebugMessage(5,"Creating column "<<col<<" : "
164 if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE)
167 if(a->GetName()=="UNKNOWN")
170 title += handler->GetTree().GetLevelDescriptor(i+1).GetName();
171 if (title[title.size()-1]!='s')
179 std::string temp = a->GetKey();
180 if (temp.compare("ID") != 0)
183 ctrl->InsertColumn(col,
188 level.key.push_back(a->GetKey());
193 mLevelList.push_back(level);
200 wxMenuItem* m1=menu->Append(wxID_ANY, _T("&Sort ascending"));
201 wxMenuItem* m2=menu->Append(wxID_ANY, _T("&Sort descending"));
202 wxMenuItem* m3=menu->Append(wxID_ANY, _T("&Filter"));
203 mAscendingID=m1->GetId();
204 mDescendingID=m2->GetId();
205 mFilterID=m3->GetId();
206 Connect( mAscendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
207 Connect( mDescendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
208 Connect( mFilterID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupFilter) );
211 ////SubMenuItem EXPORT
212 subExportMenu = new wxMenu;
213 wxMenuItem *subExp1 = subExportMenu->Append(wxID_ANY, _T("&Export to Storage"));
214 Connect( subExp1->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnExportToStorage) );
217 menuItem =new wxMenu;
220 wxMenuItem* m2Item=menuItem->Append(wxID_ANY, _T("&Local Copy"));
221 wxMenuItem* m3Item=menuItem->Append(wxID_ANY, _T("&Edit Fields"));
222 wxMenuItem* m4Item=menuItem->Append(wxID_ANY, _T("&Display Dicom Tags"));
223 menuItem->AppendSubMenu(subExportMenu, wxT("&Export"));
225 #if defined(USE_GDCM_ANOM)
226 wxMenuItem* m1Item=menuItem->Append(wxID_ANY, _T("&Anonymize"));
227 mAnonymizingID=m1Item->GetId();
228 Connect( mAnonymizingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnAnonymize) );
230 mLocalCopyID=m2Item->GetId();
231 mEditFieldID=m3Item->GetId();
232 mDumpID=m4Item->GetId();
235 Connect( mLocalCopyID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnLocalCopy) );
236 Connect( mEditFieldID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnEditField) );
237 Connect( mDumpID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnDumpTags) );
241 #endif // wxUSE_MENUS
242 /// Initialize the first level splitter
244 msizer->Add( mLevelList[0].wxSplitter ,1, wxGROW ,0);
245 // mColumnSelected=1;
250 mIgnoreSelectedChanged = false;
252 //CreateColorPalette();
260 //=====================================================================
262 //=====================================================================
264 WxTreeView::~WxTreeView()
266 GimmickDebugMessage(1,"WxTreeView::~WxTreeView"
272 //=====================================================================
276 //=====================================================================
277 const std::vector<tree::Node*>& WxTreeView::GetSelected(int level)
279 std::vector<tree::Node*>& sel = mLevelList[0].Selected;
280 // if (GetSelectedUpToDate(level))
282 // the selection of upper level
283 if(mLevelList.size() == level -1)
284 sel = mLevelList.back().Selected;
286 sel= mLevelList[l].Selected;
293 sel.push_back(GetTreeHandler()->GetTree().GetTree());
295 else if (level < mLevelList.size()+2 )
300 item = GetCtrl(l-1)->GetNextItem(item,
302 wxLIST_STATE_SELECTED);
305 long adr = GetCtrl(l-1)->GetItemData(item);
306 tree::Node* n = ((ItemData*)adr)->node;
307 /* FCY 18-04-2011: don't understand the real purpose of these lines,
308 if uncomment add last frame in first place
309 if(mLastSelected==item)
311 std::vector<tree::Node*>::iterator it;
313 it = sel.insert ( it , n );
322 /*int n = GetCtrl(l-1)->GetItemCount();
323 for (int i = 0; i<n; i++)
325 std::cout<<GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED)<<std::endl;
326 if ( GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED))
328 long adr = GetCtrl(l-1)->GetItemData(i);
329 tree::Node* n = ((ItemData*)adr)->node;
332 std::vector<tree::Node*>::iterator it;
334 it = sel.insert ( it , n );
349 // return mLevelList[level-1].Selected;
353 //=====================================================================
355 //=====================================================================
356 ///Removes selected nodes on last selected level
358 void WxTreeView::RemoveSelected(std::string &i_save)
362 unsigned int tempLevel = mLastLevel;
364 const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
365 // if no selection, no remove action.
369 std::stringstream out;
370 std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
373 if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
380 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<"?";
382 if (wxMessageBox(crea::std2wx(out.str()),
384 wxYES_NO,this ) == wxYES)
390 GetGimmickView()->modifyValidationSignal(false);
391 bool needRefresh=false;
392 std::vector<tree::Node*>::const_iterator i;
393 for (i=sel.begin(); i!=sel.end(); ++i)
400 if((*i)->GetParent()->GetNumberOfChildren()<2)
404 //tree::Node* n = new (tree::Node*)(*i);
405 GetTreeHandler()->LoadChildren((*i),4);
406 GetGimmickView()->AddIgnoreFile(*i);
407 GetTreeHandler()->Remove(*i);
410 if(needRefresh && mLastLevel>1)
412 UpdateLevel(mLastLevel-2);
414 else if(mLastLevel>1)
416 UpdateLevel(mLastLevel-1);
420 UpdateLevel(mLastLevel);
426 // no need to incremente level
427 mLastLevel = tempLevel;
430 if (erase && mLastLevel == 1 && i_save == "0")
433 RemoveAlertDlg *dial = new RemoveAlertDlg(this, crea::std2wx("Remove files"), wxSize(370,100));
435 if (dial->ShowModal() == wxID_OK)
437 i_save = dial->isChecked() == false? "0" : "1";
444 //=====================================================================
445 /// Updates a level of the view (adds or removes children, etc.)
446 void WxTreeView::UpdateLevel( int level )
448 GimmickDebugMessage(1,
449 GetTreeHandler()->GetTree().GetLabel()
450 <<"WxTreeView::UpdateLevel(level "
456 RecursiveUpdateLevel(level);
458 for (i=0; i<level-1; i++)
460 if (!GetSplitter(i)->IsSplit())
461 GetSplitter(i)->SplitVertically( GetCtrl(i), GetSplitter(i+1),
464 if (GetSplitter(i)->IsSplit()) GetSplitter(i)->Unsplit();
467 //=====================================================================
469 //=====================================================================
470 /// Recursive method called upon by UpdateLevel to refresh all windows
471 void WxTreeView::RecursiveUpdateLevel( int level )
473 GimmickDebugMessage(1,
474 GetTreeHandler()->GetTree().GetLabel()
475 <<"WxTreeView::RecursiveUpdateLevel(level "
480 const std::vector<tree::Node*>& sel(GetSelected(level));
484 // to speed up inserting we hide the control temporarily
486 GetCtrl(l)->DeleteAllItems();
488 std::vector<tree::Node*>::const_iterator i;
490 for (i=sel.begin(); i!=sel.end(); ++i)
492 GimmickDebugMessage(1,
493 "adding children of '"
499 //Adds items and sets their attributes
501 GetTreeHandler()->LoadChildren(*i,1);
502 tree::Node::ChildrenListType::reverse_iterator j;
503 for (j = (*i)->GetChildrenList().rbegin();
504 j!= (*i)->GetChildrenList().rend();
507 GimmickDebugMessage(1,
514 item.SetMask(wxLIST_MASK_STATE |
516 // wxLIST_MASK_IMAGE |
518 // wxLIST_MASK_WIDTH |
522 ItemData* data = new ItemData();
530 GetCtrl(l)->InsertItem(item);
533 for (int k=0; k<GetCtrl(l)->GetColumnCount(); ++k)
536 // Temporary correction : it works but no explanation about the problem FCY
540 val = (*j)->GetAttribute("NumberOfChildren");
543 val = (*j)->GetAttribute(mLevelList[l].key[k]);
544 if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isDateEntry()) // Date
546 // std::cout << "["<<val<< "]" << std::endl;
547 std::string valtmp(val);
550 boost::gregorian::date d1(boost::gregorian::from_undelimited_string(val));
551 val = to_iso_extended_string(d1);
557 // std::cout << "["<<val<< "]" << std::endl;
559 else if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isTimeEntry()) // Time
561 if ((val.size()>6) &&
562 (val != "" || val != " "))
563 val = val.substr(0,2) + " : "
564 + val.substr(2,2) + " : "
569 if (val.size()==0) val = "?";
571 if (val.size()==0) val = "X";
572 item.SetText( crea::std2wx(val));
575 GetCtrl(l)->SetItem(item);
585 //=====================================================================
588 //================================================================
589 void WxTreeView::OnItemDeSelected(wxListEvent& event)
591 GimmickDebugMessage(1,
592 GetTreeHandler()->GetTree().GetLabel()
593 <<" WxTreeView::OnItemDeselected"<<std::endl);
594 // retrieve the level
595 wxObject* obj = event.GetEventObject();
596 unsigned int level = 0;
597 for (level = 0; level<mLevelList.size(); ++level)
599 if ( GetCtrl(level) == obj ) break;
601 SetSelectedUpToDate(level,false);
602 // to allow a first selection in images TreeView
603 if (level==mLevelList.size()-1)
604 OnItemSelected(event);
606 //================================================================
608 //================================================================
609 void WxTreeView::OnItemSelected(wxListEvent& event)
612 GimmickDebugMessage(1,
613 GetTreeHandler()->GetTree().GetLabel()
614 <<" WxTreeView::OnItemSelected"<<std::endl);
616 if (mIgnoreSelectedChanged)
618 GimmickDebugMessage(1,
619 " mIgnoreSelectedChanged true: returning"
627 info.m_itemId = event.m_itemIndex;
628 mLastSelected = event.m_itemIndex;
629 // retrieve the level
630 wxObject* obj = event.GetEventObject();
631 unsigned int level = 0;
632 for (level = 0; level<mLevelList.size(); ++level)
634 if ( GetCtrl(level) == obj ) break;
637 GimmickDebugMessage(1,
641 // Update the children level (if selection not at last level)
642 if (level<mLevelList.size()-1)
645 UpdateLevel( level + 2 );
646 // Reset the viewer setting the default image
647 GetGimmickView()->ClearSelection();
649 // Select all images if the selection is at series level
650 if (level==mLevelList.size()-2)
652 // Validate selected images if the selection is at image level
653 if (level==(mLevelList.size()-1)) //&&mProcess)
655 if(event.GetEventType()==wxEVT_COMMAND_LIST_ITEM_SELECTED)
657 ValidateSelectedImages (true);
661 ValidateSelectedImages (false);
666 //================================================================
668 //================================================================
669 void WxTreeView::SelectAll(int level)
672 // int level=mLevelList.size()-1;
675 item = GetCtrl(level)->GetNextItem(item,
680 if(item==(GetCtrl(level)->GetItemCount()-1))
682 mIgnoreSelectedChanged = false;//mProcess=true;
686 mIgnoreSelectedChanged = true;// mProcess=false;
688 GetCtrl(level)->SetItemState(item,wxLIST_STATE_SELECTED, wxLIST_MASK_STATE
689 | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT);
693 //================================================================
694 //================================================================
696 void WxTreeView::OnColClick(wxListEvent& event)
698 mColumnSelected = event.m_col;
700 clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
701 clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
702 senderCtrl = event.GetEventObject();
703 unsigned int level = 0;
704 for (level = 0; level<mLevelList.size(); ++level)
706 if ( GetCtrl(level) == senderCtrl ) break;
708 PopupMenu(menu, clientpt);
712 //================================================================
713 //================================================================
715 void WxTreeView::OnItemMenu(wxListEvent &event)
718 clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
719 clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
720 senderCtrl = event.GetEventObject();
721 unsigned int level = 0;
722 for (level = 0; level<mLevelList.size(); ++level)
724 if ( GetCtrl(level) == senderCtrl ) break;
728 mLastRightLevel=level;
729 mLastRightSelected=GetCtrl(level)->HitTest(wxPoint(0,clientpt.y-8),flag,ptr);
730 PopupMenu(menuItem, clientpt);
734 //================================================================
735 //================================================================
737 void WxTreeView::OnPopupFilter(wxCommandEvent& event)
740 GimmickDebugMessage(7,
741 "WxTreeView::OnEndLabelEdit"
743 unsigned int level = 0;
744 for (level = 0; level<mLevelList.size(); ++level)
746 if ( GetCtrl(level) == senderCtrl ) break;
748 std::string filter = crea::wx2std(wxGetTextFromUser(_T("Enter the filter to apply"), _T("Filter On Column")));
753 UpdateLevel(level+1);
755 std::vector<long> items;
760 it = GetCtrl(level)->GetNextItem(it,
765 long adr = GetCtrl(level)->GetItemData(it);
766 tree::Node* nod = ((ItemData*)adr)->node;
767 att=(*nod).GetAttribute(mLevelList[level].key[mColumnSelected]);
770 if(att.find(filter)>900)
782 items.push_back(it-del);
786 std::vector<long>::iterator iter;
787 for(iter=items.begin();iter!=items.end();++iter)
789 GetCtrl(level)->DeleteItem(*iter);
791 GetGimmickView()->ClearSelection();
793 //================================================================
795 //================================================================
796 void WxTreeView::OnPopupSort(wxCommandEvent& event)
799 unsigned int level = 0;
800 for (level = 0; level<mLevelList.size(); ++level)
802 if ( GetCtrl(level) == senderCtrl ) break;
804 mLevelList[level].SortColumn = mColumnSelected;
806 if(event.GetId()==mAscendingID)
808 mLevelList[level].SortAscending = true;
810 else if(event.GetId()==mDescendingID)
812 mLevelList[level].SortAscending = false;
817 //================================================================
819 void WxTreeView::OnAnonymizer(wxCommandEvent &event)
822 std::vector<std::string> filesname;
823 std::vector<tree::Node*> nodes;
824 // nodes.push_back(((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node);
825 if(nodes.size() != 0)
827 GetFilenamesAsString(nodes,filesname);
828 // GetGimmickView()->Anonymize(filesname,0);
833 //================================================================
834 void WxTreeView::OnLocalCopy(wxCommandEvent& event)
838 unsigned int tempLevel = mLastLevel;
840 const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
845 std::stringstream out;
846 std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
849 if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
852 out<<"s to .creaImageIO?";
856 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<" to .creaImageIO?";
858 if (wxMessageBox(crea::std2wx(out.str()),
860 wxYES_NO,this ) == wxYES)
866 std::vector<std::string> s;
867 GetFilenamesAsString(sel,s);
868 GetGimmickView()->CopyFiles(s);
873 mLastLevel = tempLevel;
878 //================================================================
880 //================================================================
881 void WxTreeView::OnEditField(wxCommandEvent& event)
883 if(mLastRightSelected!=-1)
885 tree::Node* node=((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node;
886 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
887 std::vector<std::string> names;
888 std::vector<std::string> keys;
889 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).begin();
890 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).end();
893 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE)
895 names.push_back(a->GetName());
896 keys.push_back(a->GetKey());
899 GetGimmickView()->CreateEditFieldsDialog(node,names,keys);
903 //================================================================
905 //================================================================
907 void WxTreeView::OnExportToStorage(wxCommandEvent &event)
909 std::vector<std::string> filesname;
910 std::vector<tree::Node*> nodes;
911 nodes.push_back(((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node);
912 GetFilenamesAsString(nodes,filesname);
913 GetGimmickView()->ExportToStorage(filesname);
916 //================================================================
918 //================================================================
920 void WxTreeView::OnDumpTags(wxCommandEvent &event)
922 if(mLastRightSelected!=-1)
924 tree::Node* node=((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node;
925 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
926 std::vector<std::string> names;
927 std::vector<std::string> keys;
928 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).begin();
929 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).end();
932 if(a->GetKey()=="FullFileName")
934 GetGimmickView()->DumpTags(node->GetAttribute("FullFileName"));
942 //================================================================
944 //================================================================
945 void WxTreeView::SortLevel(int level)
947 GimmickDebugMessage(1,
948 "WxTreeView::SortLevel("
951 //Obtain the column name and the level that needs to be organized
953 // int l = level - 1;
954 //Sets the data for the items to be sorted
958 int n = GetCtrl(level)->GetItemCount();
959 for (int i = 0; i < n; i++)
962 //Gets current item data
963 ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
965 //Extracts the node and the type of attribute
966 tree::Node* nod = data->node;
969 (*nod).GetAttributeDescriptor
970 (mLevelList[level].key[mLevelList[level].SortColumn])
973 //Obtains the organizing attribute
974 data->attr = & (*nod).GetAttribute
975 (mLevelList[level].key[mLevelList[level].SortColumn]);
977 data->selected = false;
978 if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
980 data->selected = true;
985 GimmickDebugMessage(1,
986 "WxTreeView::OnSort : "
987 <<nbselected<<" selected before sorting"
990 mIgnoreSelectedChanged = true;
992 if (mLevelList[level].SortAscending)
997 GetCtrl(level)->SortItems(CompareFunctionInts, 0);
1001 GetCtrl(level)->SortItems(CompareFunctionStrings, 0);
1009 GetCtrl(level)->SortItems(CompareFunctionInts, 1);
1013 GetCtrl(level)->SortItems(CompareFunctionStrings, 1);
1018 // Reselects the unselected
1019 n = GetCtrl(level)->GetItemCount();
1021 for (int i = 0; i < n; i++)
1024 //Gets current item data
1025 ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
1030 // item = GetCtrl(level)->GetNextItem(item,wxLIST_NEXT_ALL);
1031 // if ( item == -1 ) break;
1032 //Gets current item data
1033 // ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(item);
1041 // if it is the last one we must process the selection
1042 mIgnoreSelectedChanged = false;
1044 GetCtrl(level)->SetItemState(i,
1045 wxLIST_STATE_SELECTED,
1051 | wxLIST_MASK_FORMAT);
1053 if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
1060 mIgnoreSelectedChanged = false;
1061 GimmickDebugMessage(1,
1062 "WxTreeView::SortLevel : "
1063 <<after<<" selected after sorting"
1067 //================================================================
1070 //================================================================
1071 void WxTreeView::ValidateSelectedImages(bool isSelection)
1073 GimmickDebugMessage(7,
1074 "WxTreeView::ValidateSelectedImages"
1076 const std::vector<tree::Node*>& sel(GetSelected(mLevelList.size()+1));
1077 GetGimmickView()->OnSelectionChange(sel,
1078 isSelection,(mLastSelected-1),
1079 !mIgnoreSelectedChanged);
1082 //================================================================
1085 //================================================================
1086 void WxTreeView::GetNodes(std::vector<tree::Node*>& nodes, bool direction)
1088 long item = mLastSelected;
1089 int level=mLevelList.size()-1;
1090 //Gets current item data
1091 long adr = GetCtrl(level)->GetItemData(item);
1093 tree::Node* nod = ((ItemData*)adr)->node;
1098 item = GetCtrl(level)->GetNextItem(item,
1103 item = GetCtrl(level)->GetNextItem(item,
1106 if ( item == -1 || item==0 )
1110 if(GetCtrl(level)->GetItemState(item, wxLIST_STATE_SELECTED)==0 )
1113 adr = GetCtrl(level)->GetItemData(item);
1114 nod = ((ItemData*)adr)->node;
1115 nodes.push_back(nod);
1120 //================================================================
1121 //=================================================
1122 void WxTreeView::OnKeyDown(wxListEvent &event)
1124 if(event.GetKeyCode() == WXK_DELETE)
1127 std::string temp = "0";
1128 RemoveSelected(temp);
1129 GetGimmickView()->ClearSelection();
1133 //================================================================
1135 //================================================================
1136 // Should be in another place : not specific !
1137 void WxTreeView::GetSelectedAsString(std::vector<std::string>&s)
1139 int level=mLevelList.size();
1140 const std::vector<tree::Node*>& sel=GetSelected(level+1);
1141 std::vector<tree::Node*>::const_iterator i;
1143 for (i=sel.begin(); i!=sel.end(); ++i)
1145 std::string filename=(*i)->GetAttribute("FullFileName");
1146 s.push_back(filename);
1152 //================================================================
1153 void WxTreeView::GetFilenamesAsString(const std::vector<tree::Node*>& nodes, std::vector<std::string>&s)
1155 std::vector<tree::Node*>::const_iterator i;
1157 for (i=nodes.begin(); i!=nodes.end(); ++i)
1159 if((*i)->GetLevel()<mLevelList.size())
1161 GetTreeHandler()->LoadChildren(*i,0);
1162 GetFilenamesAsString((*i)->GetChildrenList(),s);
1166 std::string filename=(*i)->GetAttribute("FullFileName");
1167 s.push_back(filename);
1172 //================================================================
1174 //================================================================
1175 void WxTreeView::GetAttributes(std::vector<std::string>& areShown, std::vector<std::string>& notShown, int level)
1179 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1180 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).begin();
1181 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).end();
1184 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE && IsAttributeVisible(a->GetName(),level))
1186 areShown.push_back(a->GetName());
1189 notShown=mLevelList[level-1].notShownAtts;
1192 //================================================================
1193 void WxTreeView::SetNonVisibleAttributes(const std::vector<std::string>& notShown, int nlevel)
1195 mLevelList[nlevel].notShownAtts=notShown;
1198 //================================================================
1199 void WxTreeView::CreateCtrl(std::vector<std::string>& notShown, int nlevel)
1201 int ctrl_style = wxLC_REPORT | wxLC_VRULES;
1202 int col_style = wxLIST_FORMAT_LEFT;
1204 mLevelList[nlevel].SelectedUpToDate = true;
1205 mLevelList[nlevel].SortColumn = 0;
1206 mLevelList[nlevel].key.clear();
1208 mLevelList[nlevel].wxCtrl = new wxListCtrl(mLevelList[nlevel].wxSplitter,
1213 wxWindow* oldWin=mLevelList[nlevel].wxSplitter->GetWindow1();
1214 mLevelList[nlevel].wxSplitter->ReplaceWindow(oldWin,mLevelList[nlevel].wxCtrl);
1215 mLevelList[nlevel].wxSplitter->Initialize(mLevelList[nlevel].wxCtrl);
1217 // Create the columns : one for each attribute of the level
1221 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1222 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).begin();
1223 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).end();
1227 if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE && IsAttributeVisible(a->GetName(),nlevel+1))
1230 std::string temp = a->GetKey();
1231 if (temp.compare("ID") != 0)
1233 mLevelList[nlevel].wxCtrl->InsertColumn(col,
1234 crea::std2wx(title),
1238 mLevelList[nlevel].key.push_back(a->GetKey());
1246 //================================================================
1247 bool WxTreeView::IsAttributeVisible(const std::string& val, int level)
1249 std::vector<std::string> ns=mLevelList[level-1].notShownAtts;
1250 std::vector<std::string>::iterator it;
1252 for(it=ns.begin();it!=ns.end()&&!found;++it)
1254 if(val.compare(*it)==0)
1261 //================================================================
1262 //================================================================
1264 RemoveAlertDlg::RemoveAlertDlg(wxWindow *parent,
1272 wxDEFAULT_DIALOG_STYLE)
1274 wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
1276 //std::string out("To reload deleted patient, you should synchronize your database before."); // JPR
1277 //wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY,crea::std2wx(out),wxDefaultPosition, wxSize(500,20));
1278 wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY,
1279 _T("To reload deleted patient, you should synchronize your database before."),
1280 wxDefaultPosition, wxSize(650,20)); // 650 vs 500 ? // JPRx
1281 mcheck = new wxCheckBox(this, 5478, _T("Do not display this warning again!"));
1282 Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &RemoveAlertDlg::onCheck );
1283 wxSizer* buttonsSizer = this->CreateSeparatedButtonSizer(wxOK|wxCANCEL);
1285 topsizer->Add(text);
1286 topsizer->Add(mcheck,0,wxGROW);
1287 topsizer->Add(buttonsSizer,0,wxGROW);
1288 SetSizer(topsizer, true);
1292 RemoveAlertDlg::~RemoveAlertDlg(){};
1293 bool RemoveAlertDlg::isChecked()
1297 void RemoveAlertDlg::onCheck(wxCommandEvent &Event)
1299 mSave = mcheck->IsChecked();
1303 //================================================================
1304 //================================================================
1305 BEGIN_EVENT_TABLE(WxTreeView, wxPanel)
1307 EVT_SIZE(MyFrame::OnSize)
1309 EVT_MENU(LIST_QUIT, MyFrame::OnQuit)
1310 EVT_MENU(LIST_ABOUT, MyFrame::OnAbout)
1311 EVT_MENU(LIST_LIST_VIEW, MyFrame::OnListView)
1312 EVT_MENU(LIST_REPORT_VIEW, MyFrame::OnReportView)
1313 EVT_MENU(LIST_ICON_VIEW, MyFrame::OnIconView)
1314 EVT_MENU(LIST_ICON_TEXT_VIEW, MyFrame::OnIconTextView)
1315 EVT_MENU(LIST_SMALL_ICON_VIEW, MyFrame::OnSmallIconView)
1316 EVT_MENU(LIST_SMALL_ICON_TEXT_VIEW, MyFrame::OnSmallIconTextView)
1317 EVT_MENU(LIST_VIRTUAL_VIEW, MyFrame::OnVirtualView)
1318 EVT_MENU(LIST_SMALL_VIRTUAL_VIEW, MyFrame::OnSmallVirtualView)
1320 EVT_MENU(LIST_FOCUS_LAST, MyFrame::OnFocusLast)
1321 EVT_MENU(LIST_TOGGLE_FIRST, MyFrame::OnToggleFirstSel)
1322 EVT_MENU(LIST_DESELECT_ALL, MyFrame::OnDeselectAll)
1323 EVT_MENU(LIST_SELECT_ALL, MyFrame::OnSelectAll)
1324 EVT_MENU(LIST_DELETE, MyFrame::OnDelete)
1325 EVT_MENU(LIST_ADD, MyFrame::OnAdd)
1326 EVT_MENU(LIST_EDIT, MyFrame::OnEdit)
1327 EVT_MENU(LIST_DELETE_ALL, MyFrame::OnDeleteAll)
1328 EVT_MENU(LIST_SORT, MyFrame::OnSort)
1329 EVT_MENU(LIST_SET_FG_COL, MyFrame::OnSetFgColour)
1330 EVT_MENU(LIST_SET_BG_COL, MyFrame::OnSetBgColour)
1331 EVT_MENU(LIST_TOGGLE_MULTI_SEL, MyFrame::OnToggleMultiSel)
1332 EVT_MENU(LIST_SHOW_COL_INFO, MyFrame::OnShowColInfo)
1333 EVT_MENU(LIST_SHOW_SEL_INFO, MyFrame::OnShowSelInfo)
1334 EVT_MENU(LIST_FREEZE, MyFrame::OnFreeze)
1335 EVT_MENU(LIST_THAW, MyFrame::OnThaw)
1336 EVT_MENU(LIST_TOGGLE_LINES, MyFrame::OnToggleLines)
1337 EVT_MENU(LIST_MAC_USE_GENERIC, MyFrame::OnToggleMacUseGeneric)
1339 EVT_UPDATE_UI(LIST_SHOW_COL_INFO, MyFrame::OnUpdateShowColInfo)
1340 EVT_UPDATE_UI(LIST_TOGGLE_MULTI_SEL, MyFrame::OnUpdateToggleMultiSel)
1343 BEGIN_EVENT_TABLE(MyListCtrl, wxListCtrl)
1344 EVT_LIST_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnBeginDrag)
1345 EVT_LIST_BEGIN_RDRAG(LIST_CTRL, MyListCtrl::OnBeginRDrag)
1347 EVT_LIST_BEGIN_LABEL_EDIT(-1, WxTreeView::OnBeginLabelEdit)
1348 EVT_LIST_END_LABEL_EDIT(-1, WxTreeView::OnEndLabelEdit)
1350 EVT_LIST_DELETE_ITEM(LIST_CTRL, MyListCtrl::OnDeleteItem)
1351 EVT_LIST_DELETE_ALL_ITEMS(LIST_CTRL, MyListCtrl::OnDeleteAllItems)
1352 #if WXWIN_COMPATIBILITY_2_4
1353 EVT_LIST_GET_INFO(LIST_CTRL, MyListCtrl::OnGetInfo)
1354 EVT_LIST_SET_INFO(LIST_CTRL, MyListCtrl::OnSetInfo)
1357 EVT_LIST_KEY_DOWN(-1, WxTreeView::OnKeyDown)
1358 EVT_LIST_ITEM_SELECTED(-1, WxTreeView::OnItemSelected)
1359 EVT_LIST_ITEM_RIGHT_CLICK(-1, WxTreeView::OnItemMenu)
1360 EVT_LIST_ITEM_DESELECTED(-1, WxTreeView::OnItemDeSelected)
1362 EVT_LIST_KEY_DOWN(LIST_CTRL, MyListCtrl::OnListKeyDown)
1363 EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, MyListCtrl::OnActivated)
1364 EVT_LIST_ITEM_FOCUSED(LIST_CTRL, MyListCtrl::OnFocused)
1366 EVT_LIST_COL_RIGHT_CLICK(-1, WxTreeView::OnColClick)
1368 EVT_LIST_COL_CLICK(-1, WxTreeView::OnColClick)
1370 //EVT_LEFT_DOWN(WxTreeView::OnMouseClick)
1372 EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnColBeginDrag)
1373 EVT_LIST_COL_DRAGGING(LIST_CTRL, MyListCtrl::OnColDragging)
1374 EVT_LIST_COL_END_DRAG(LIST_CTRL, MyListCtrl::OnColEndDrag)
1376 EVT_LIST_CACHE_HINT(LIST_CTRL, MyListCtrl::OnCacheHint)
1378 #if USE_CONTEXT_MENU
1379 EVT_CONTEXT_MENU(MyListCtrl::OnContextMenu)
1381 EVT_CHAR(MyListCtrl::OnChar)
1383 EVT_RIGHT_DOWN(MyListCtrl::OnRightClick)
1387 } // EO namespace creaImageIO