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)
49 creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
50 creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
52 const std::string& s1(*(data1->attr));
53 const std::string& s2(*(data2->attr));
75 //=====================================================================
77 //=====================================================================
78 ///Comparing function for ordering algorithm. Takes parameters as ints.
79 int wxCALLBACK CompareFunctionInts(long item1, long item2, long sortData)
81 creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1;
82 creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2;
84 const std::string& s1(*(data1->attr));
85 const std::string& s2(*(data2->attr));
87 int val1=atoi(s1.c_str());
88 int val2=atoi(s2.c_str());
113 //=====================================================================
116 //=====================================================================
117 namespace creaImageIO
119 //=====================================================================
121 WxTreeView::WxTreeView(TreeHandler* handler,
122 GimmickView* gimmick,
125 : wxPanel(parent,id),
126 TreeView(handler, gimmick)
128 GimmickDebugMessage(1,"WxTreeView::WxTreeView"
132 // Split part below toolbar into notebook for views and panel
133 // for preview, messages...
135 // mSplitter = new wxSplitterWindow( this , -1);
138 msizer = new wxBoxSizer(wxHORIZONTAL);
140 int ctrl_style = wxLC_REPORT | wxLC_VRULES;
141 int col_style = wxLIST_FORMAT_LEFT;
143 // Creating the ListCtrl for the levels > 0 (not for Root level)
145 i < handler->GetTree().GetNumberOfLevels() -1;
148 GimmickDebugMessage(5,"Creating view for level "<<i
151 level.SelectedUpToDate = true;
152 level.SortColumn = 0;
154 // If the first level : parent = this
155 wxWindow* sparent = this;
156 // else parent = last splitter
158 sparent = mLevelList[i-1].wxSplitter;
160 level.wxSplitter = new wxSplitterWindow( sparent , -1);
163 level.wxSplitter->Show(false);
165 // level.wxSplitter->SetMinimumPaneSize(100);
167 wxListCtrl* ctrl = new wxListCtrl(level.wxSplitter,
173 level.wxSplitter->Initialize(ctrl);
175 // Create the columns : one for each attribute of the level
179 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
180 for (a = handler->GetTree().GetAttributeDescriptorList(i+1).begin();
181 a != handler->GetTree().GetAttributeDescriptorList(i+1).end();
186 GimmickDebugMessage(5,"Creating column "<<col<<" : "
190 if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE)
193 if(a->GetName()=="UNKNOWN")
196 title += handler->GetTree().GetLevelDescriptor(i+1).GetName();
197 if (title[title.size()-1]!='s')
205 std::string temp = a->GetKey();
206 if (temp.compare("ID") != 0)
209 ctrl->InsertColumn(col,
214 level.key.push_back(a->GetKey());
219 mLevelList.push_back(level);
226 wxMenuItem* m1=menu->Append(wxID_ANY, _T("&Sort ascending"));
227 wxMenuItem* m2=menu->Append(wxID_ANY, _T("&Sort descending"));
228 wxMenuItem* m3=menu->Append(wxID_ANY, _T("&Filter"));
229 mAscendingID=m1->GetId();
230 mDescendingID=m2->GetId();
231 mFilterID=m3->GetId();
232 Connect( mAscendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
233 Connect( mDescendingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupSort) );
234 Connect( mFilterID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnPopupFilter) );
237 ////SubMenuItem EXPORT
238 subExportMenu = new wxMenu;
239 wxMenuItem *subExp1 = subExportMenu->Append(wxID_ANY, _T("&Export to Storage"));
240 Connect( subExp1->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnExportToStorage) );
243 menuItem =new wxMenu;
246 wxMenuItem* m2Item=menuItem->Append(wxID_ANY, _T("&Local Copy"));
247 wxMenuItem* m3Item=menuItem->Append(wxID_ANY, _T("&Edit Fields"));
248 wxMenuItem* m4Item=menuItem->Append(wxID_ANY, _T("&Display Dicom Tags"));
249 menuItem->AppendSubMenu(subExportMenu, wxT("&Export"));
252 wxMenuItem* m1Item=menuItem->Append(wxID_ANY, _T("&Anonymize"));
253 mAnonymizingID=m1Item->GetId();
254 Connect( mAnonymizingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnAnonymizer) );
256 mLocalCopyID=m2Item->GetId();
257 mEditFieldID=m3Item->GetId();
258 mDumpID=m4Item->GetId();
261 Connect( mLocalCopyID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnLocalCopy) );
262 Connect( mEditFieldID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnEditField) );
263 Connect( mDumpID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnDumpTags) );
267 #endif // wxUSE_MENUS
268 /// Initialize the first level splitter
270 msizer->Add( mLevelList[0].wxSplitter ,1, wxGROW ,0);
271 // mColumnSelected=1;
276 mIgnoreSelectedChanged = false;
278 //CreateColorPalette();
286 //=====================================================================
288 //=====================================================================
290 WxTreeView::~WxTreeView()
292 GimmickDebugMessage(1,"WxTreeView::~WxTreeView"
298 //=====================================================================
302 //=====================================================================
303 const std::vector<tree::Node*>& WxTreeView::GetSelected(int level)
305 printf("EED WxTreeView::GetSelected Start\n");
307 std::vector<tree::Node*>& sel = mLevelList[0].Selected;
308 // if (GetSelectedUpToDate(level))
310 // the selection of upper level
311 printf("EED WxTreeView::GetSelected 1\n");
312 if(mLevelList.size() == level -1)
314 sel = mLevelList.back().Selected;
316 sel= mLevelList[l].Selected;
318 printf("EED WxTreeView::GetSelected 2\n");
323 printf("EED WxTreeView::GetSelected 3\n");
326 printf("EED WxTreeView::GetSelected 4\n");
327 sel.push_back(GetTreeHandler()->GetTree().GetTree());
328 } else if (level < mLevelList.size()+2 )
330 printf("EED WxTreeView::GetSelected 5\n");
334 printf("EED WxTreeView::GetSelected 5.1\n");
335 item = GetCtrl(l-1)->GetNextItem(item,
337 wxLIST_STATE_SELECTED);
338 printf("EED WxTreeView::GetSelected 5.2\n");
341 printf("EED WxTreeView::GetSelected 5.3\n");
344 long adr = (long)GetCtrl(l-1)->GetItemData(item);
345 printf("EED WxTreeView::GetSelected 5.4\n");
346 tree::Node* n = ((ItemData*)adr)->node;
347 /* FCY 18-04-2011: don't understand the real purpose of these lines,
348 if uncomment add last frame in first place
349 if(mLastSelected==item)
351 std::vector<tree::Node*>::iterator it;
353 it = sel.insert ( it , n );
357 printf("EED WxTreeView::GetSelected 6\n");
362 /*int n = GetCtrl(l-1)->GetItemCount();
363 for (int i = 0; i<n; i++)
365 std::cout<<GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED)<<std::endl;
366 if ( GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED))
368 long adr = GetCtrl(l-1)->GetItemData(i);
369 tree::Node* n = ((ItemData*)adr)->node;
372 std::vector<tree::Node*>::iterator it;
374 it = sel.insert ( it , n );
387 // return mLevelList[level-1].Selected;
388 printf("EED WxTreeView::GetSelected End\n");
392 //=====================================================================
394 //=====================================================================
395 ///Removes selected nodes on last selected level
397 void WxTreeView::RemoveSelected(std::string &i_save)
401 unsigned int tempLevel = mLastLevel;
403 const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
404 // if no selection, no remove action.
408 std::stringstream out;
409 std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
412 if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
419 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<"?";
421 if (wxMessageBox(crea::std2wx(out.str()),
423 wxYES_NO,this ) == wxYES)
429 GetGimmickView()->modifyValidationSignal(false);
430 bool needRefresh=false;
431 std::vector<tree::Node*>::const_iterator i;
432 for (i=sel.begin(); i!=sel.end(); ++i)
434 GimmickMessage(1,"deleting '" << (*i)->GetLabel() << "'" << mLastLevel << std::endl );
435 if((*i)->GetParent()->GetNumberOfChildren()<2)
439 //tree::Node* n = new (tree::Node*)(*i);
440 GetTreeHandler()->LoadChildren((*i),4);
441 GetGimmickView()->AddIgnoreFile(*i);
442 GetTreeHandler()->Remove(*i);
445 if(needRefresh && mLastLevel>1)
447 UpdateLevel(mLastLevel-2);
448 } else if(mLastLevel>1) {
449 UpdateLevel(mLastLevel-1);
451 UpdateLevel(mLastLevel);
455 // no need to incremente level
456 mLastLevel = tempLevel;
459 if (erase && mLastLevel == 1 && i_save == "0")
462 RemoveAlertDlg *dial = new RemoveAlertDlg(this, crea::std2wx("Remove files"), wxSize(370,100));
464 if (dial->ShowModal() == wxID_OK)
466 i_save = dial->isChecked() == false? "0" : "1";
473 //=====================================================================
474 /// Updates a level of the view (adds or removes children, etc.)
475 void WxTreeView::UpdateLevel( int level )
477 printf("EED WxTreeView::UpdateLevel Start\n ");
478 GimmickDebugMessage(1,
479 GetTreeHandler()->GetTree().GetLabel()
480 <<"WxTreeView::UpdateLevel(level "
486 printf("EED WxTreeView::UpdateLevel 1\n ");
487 RecursiveUpdateLevel(level);
488 printf("EED WxTreeView::UpdateLevel 2\n ");
490 for (i=0; i<level-1; i++)
492 printf("EED WxTreeView::UpdateLevel 3\n ");
493 if (!GetSplitter(i)->IsSplit())
495 printf("EED WxTreeView::UpdateLevel 4\n ");
496 GetSplitter(i)->SplitVertically( GetCtrl(i), GetSplitter(i+1),100 );
499 printf("EED WxTreeView::UpdateLevel 5\n ");
500 if (GetSplitter(i)->IsSplit())
502 printf("EED WxTreeView::UpdateLevel 6\n ");
503 GetSplitter(i)->Unsplit();
505 printf("EED WxTreeView::UpdateLevel End\n ");
508 //=====================================================================
510 //=====================================================================
511 /// Recursive method called upon by UpdateLevel to refresh all windows
512 void WxTreeView::RecursiveUpdateLevel( int level )
514 printf("EED WxTreeView::RecursiveUpdateLevel Start\n");
515 GimmickDebugMessage(1,
516 GetTreeHandler()->GetTree().GetLabel()
517 <<"WxTreeView::RecursiveUpdateLevel(level "
521 printf("EED WxTreeView::RecursiveUpdateLevel 0.1\n");
523 const std::vector<tree::Node*>& sel(GetSelected(level));
525 printf("EED WxTreeView::RecursiveUpdateLevel 0.2\n");
527 printf("EED WxTreeView::RecursiveUpdateLevel 0.3\n");
529 // to speed up inserting we hide the control temporarily
531 printf("EED WxTreeView::RecursiveUpdateLevel 0.4\n");
532 GetCtrl(l)->DeleteAllItems();
534 printf("EED WxTreeView::RecursiveUpdateLevel 0.5\n");
535 std::vector<tree::Node*>::const_iterator i;
536 printf("EED WxTreeView::RecursiveUpdateLevel 1\n");
538 for (i=sel.begin(); i!=sel.end(); ++i)
540 printf("EED WxTreeView::RecursiveUpdateLevel 2\n");
541 GimmickDebugMessage(1,
542 "adding children of '"
548 //Adds items and sets their attributes
550 GetTreeHandler()->LoadChildren(*i,1);
551 tree::Node::ChildrenListType::reverse_iterator j;
552 for (j = (*i)->GetChildrenList().rbegin();
553 j!= (*i)->GetChildrenList().rend();
556 printf("EED WxTreeView::RecursiveUpdateLevel 3\n");
557 GimmickDebugMessage(1,
564 item.SetMask(wxLIST_MASK_STATE |
566 // wxLIST_MASK_IMAGE |
568 // wxLIST_MASK_WIDTH |
572 ItemData* data = new ItemData();
580 GetCtrl(l)->InsertItem(item);
583 for (int k=0; k<GetCtrl(l)->GetColumnCount(); ++k)
586 // Temporary correction : it works but no explanation about the problem FCY
590 val = (*j)->GetAttribute("NumberOfChildren");
592 val = (*j)->GetAttribute(mLevelList[l].key[k]);
594 printf("EED WxTreeView::RecursiveUpdateLevel 4\n");
595 if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isDateEntry()) // Date
597 // std::cout << "["<<val<< "]" << std::endl;
598 std::string valtmp(val);
601 boost::gregorian::date d1(boost::gregorian::from_undelimited_string(val));
602 val = to_iso_extended_string(d1);
608 // std::cout << "["<<val<< "]" << std::endl;
609 } else if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isTimeEntry()) // Time
611 if ((val.size()>6) &&
612 (val != "" || val != " "))
613 val = val.substr(0,2) + " : "
614 + val.substr(2,2) + " : "
617 if (val.size()==0) val = "?";
619 printf("EED WxTreeView::RecursiveUpdateLevel 5\n");
620 if (val.size()==0) val = "X";
621 item.SetText( crea::std2wx(val));
624 GetCtrl(l)->SetItem(item);
630 printf("EED WxTreeView::RecursiveUpdateLevel 6\n");
633 printf("EED WxTreeView::RecursiveUpdateLevel 7\n");
635 printf("EED WxTreeView::RecursiveUpdateLevel End\n");
637 //=====================================================================
640 //================================================================
641 void WxTreeView::OnItemDeSelected(wxListEvent& event)
643 GimmickDebugMessage(1,
644 GetTreeHandler()->GetTree().GetLabel()
645 <<" WxTreeView::OnItemDeselected"<<std::endl);
646 // retrieve the level
647 wxObject* obj = event.GetEventObject();
648 unsigned int level = 0;
649 for (level = 0; level<mLevelList.size(); ++level)
651 if ( GetCtrl(level) == obj ) break;
653 SetSelectedUpToDate(level,false);
654 // to allow a first selection in images TreeView
655 if (level==mLevelList.size()-1)
656 OnItemSelected(event);
658 //================================================================
660 //================================================================
661 void WxTreeView::OnItemSelected(wxListEvent& event)
663 printf("EED WxTreeView::OnItemSelected Start\n");
664 GimmickDebugMessage(1,GetTreeHandler()->GetTree().GetLabel()<<" WxTreeView::OnItemSelected"<<std::endl);
666 if (mIgnoreSelectedChanged)
668 GimmickDebugMessage(1, " mIgnoreSelectedChanged true: returning"<<std::endl);
669 printf("EED WxTreeView::OnItemSelected 0.1\n");
673 printf("EED WxTreeView::OnItemSelected 1\n");
676 info.m_itemId = event.m_itemIndex;
677 mLastSelected = event.m_itemIndex;
678 // retrieve the level
679 wxObject* obj = event.GetEventObject();
680 unsigned int level = 0;
681 for (level = 0; level<mLevelList.size(); ++level)
683 if ( GetCtrl(level) == obj ) break;
686 GimmickDebugMessage(1," Level "<<level+1<<std::endl);
688 printf("EED WxTreeView::OnItemSelected 2 %d %d \n", level, mLevelList.size() );
689 // Update the children level (if selection not at last level)
690 if (level<mLevelList.size()-1)
692 printf("EED WxTreeView::OnItemSelected 2.0\n");
693 UpdateLevel( level + 2 );
694 // Reset the viewer setting the default image
695 printf("EED WxTreeView::OnItemSelected 2.1\n");
696 GetGimmickView()->ClearSelection();
697 printf("EED WxTreeView::OnItemSelected 2.2\n");
699 printf("EED WxTreeView::OnItemSelected 3\n");
700 // Select all images if the selection is at series level
701 if (level==mLevelList.size()-2)
703 printf("EED WxTreeView::OnItemSelected 4\n");
706 printf("EED WxTreeView::OnItemSelected 5\n");
707 // Validate selected images if the selection is at image level
708 if (level==(mLevelList.size()-1)) //&&mProcess)
710 if(event.GetEventType()==wxEVT_COMMAND_LIST_ITEM_SELECTED)
712 ValidateSelectedImages (true);
714 ValidateSelectedImages (false);
717 printf("EED WxTreeView::OnItemSelected End\n");
719 //================================================================
721 //================================================================
722 void WxTreeView::SelectAll(int level)
724 printf("EED WxTreeView::SelectAll Start\n");
727 // int level=mLevelList.size()-1;
730 item = GetCtrl(level)->GetNextItem(item,
735 if(item==(GetCtrl(level)->GetItemCount()-1))
737 mIgnoreSelectedChanged = false;//mProcess=true;
741 mIgnoreSelectedChanged = true;// mProcess=false;
743 GetCtrl(level)->SetItemState(item,wxLIST_STATE_SELECTED, wxLIST_MASK_STATE
744 | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT);
746 printf("EED WxTreeView::SelectAll End\n");
750 //================================================================
751 //================================================================
753 void WxTreeView::OnColClick(wxListEvent& event)
755 mColumnSelected = event.m_col;
757 clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
758 clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
759 senderCtrl = event.GetEventObject();
760 unsigned int level = 0;
761 for (level = 0; level<mLevelList.size(); ++level)
763 if ( GetCtrl(level) == senderCtrl ) break;
765 PopupMenu(menu, clientpt);
769 //================================================================
770 //================================================================
772 void WxTreeView::OnItemMenu(wxListEvent &event)
775 clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
776 clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
777 senderCtrl = event.GetEventObject();
778 unsigned int level = 0;
779 for (level = 0; level<mLevelList.size(); ++level)
781 if ( GetCtrl(level) == senderCtrl ) break;
785 mLastRightLevel=level;
786 mLastRightSelected=GetCtrl(level)->HitTest(wxPoint(0,clientpt.y-8),flag,ptr);
787 PopupMenu(menuItem, clientpt);
791 //================================================================
792 //================================================================
794 void WxTreeView::OnPopupFilter(wxCommandEvent& event)
797 GimmickDebugMessage(7,
798 "WxTreeView::OnEndLabelEdit"
800 unsigned int level = 0;
801 for (level = 0; level<mLevelList.size(); ++level)
803 if ( GetCtrl(level) == senderCtrl ) break;
805 std::string filter = crea::wx2std(wxGetTextFromUser(_T("Enter the filter to apply"), _T("Filter On Column")));
810 UpdateLevel(level+1);
812 std::vector<long> items;
817 it = GetCtrl(level)->GetNextItem(it,
822 long adr = (long)GetCtrl(level)->GetItemData(it);
823 tree::Node* nod = ((ItemData*)adr)->node;
824 att=(*nod).GetAttribute(mLevelList[level].key[mColumnSelected]);
827 if(att.find(filter)>900)
839 items.push_back(it-del);
843 std::vector<long>::iterator iter;
844 for(iter=items.begin();iter!=items.end();++iter)
846 GetCtrl(level)->DeleteItem(*iter);
848 GetGimmickView()->ClearSelection();
850 //================================================================
852 //================================================================
853 void WxTreeView::OnPopupSort(wxCommandEvent& event)
856 unsigned int level = 0;
857 for (level = 0; level<mLevelList.size(); ++level)
859 if ( GetCtrl(level) == senderCtrl ) break;
861 mLevelList[level].SortColumn = mColumnSelected;
863 if(event.GetId()==mAscendingID)
865 mLevelList[level].SortAscending = true;
867 else if(event.GetId()==mDescendingID)
869 mLevelList[level].SortAscending = false;
874 //================================================================
876 void WxTreeView::OnAnonymizer(wxCommandEvent &event)
879 std::vector<std::string> filesname;
880 std::vector<tree::Node*> nodes;
881 nodes.push_back(((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node);
882 if(nodes.size() != 0)
884 GetFilenamesAsString(nodes,filesname);
885 GetGimmickView()->Anonymize(filesname,0);
890 //================================================================
891 void WxTreeView::OnLocalCopy(wxCommandEvent& event)
895 unsigned int tempLevel = mLastLevel;
897 const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
902 std::stringstream out;
903 std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
906 if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
909 out<<"s to .creaImageIO?";
913 out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<" to .creaImageIO?";
915 if (wxMessageBox(crea::std2wx(out.str()),
917 wxYES_NO,this ) == wxYES)
923 std::vector<std::string> s;
924 GetFilenamesAsString(sel,s);
925 GetGimmickView()->CopyFiles(s);
930 mLastLevel = tempLevel;
935 //================================================================
937 //================================================================
938 void WxTreeView::OnEditField(wxCommandEvent& event)
940 if(mLastRightSelected!=-1)
942 tree::Node* node=((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node;
943 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
944 std::vector<std::string> names;
945 std::vector<std::string> keys;
946 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).begin();
947 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).end();
950 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE)
952 names.push_back(a->GetName());
953 keys.push_back(a->GetKey());
956 GetGimmickView()->CreateEditFieldsDialog(node,names,keys);
960 //================================================================
962 //================================================================
964 void WxTreeView::OnExportToStorage(wxCommandEvent &event)
966 std::vector<std::string> filesname;
967 std::vector<tree::Node*> nodes;
968 nodes.push_back(((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node);
969 GetFilenamesAsString(nodes,filesname);
970 GetGimmickView()->ExportToStorage(filesname);
973 //================================================================
975 //================================================================
977 void WxTreeView::OnDumpTags(wxCommandEvent &event)
979 if(mLastRightSelected!=-1)
981 tree::Node* node=((ItemData*)GetCtrl(mLastRightLevel)->GetItemData(mLastRightSelected))->node;
982 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
983 std::vector<std::string> names;
984 std::vector<std::string> keys;
985 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).begin();
986 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(mLastRightLevel+1).end();
989 if(a->GetKey()=="FullFileName")
991 GetGimmickView()->DumpTags(node->GetAttribute("FullFileName"));
999 //================================================================
1001 //================================================================
1002 void WxTreeView::SortLevel(int level)
1004 printf("EED WxTreeView::SortLevel Start %d \n", level);
1005 GimmickDebugMessage(1,
1006 "WxTreeView::SortLevel("
1009 //Obtain the column name and the level that needs to be organized
1011 // int l = level - 1;
1012 //Sets the data for the items to be sorted
1016 int n = GetCtrl(level)->GetItemCount();
1017 for (int i = 0; i < n; i++)
1019 //Gets current item data
1020 ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
1021 //Extracts the node and the type of attribute
1022 tree::Node* nod = data->node;
1025 (*nod).GetAttributeDescriptor
1026 (mLevelList[level].key[mLevelList[level].SortColumn])
1029 //Obtains the organizing attribute
1030 data->attr = & (*nod).GetAttribute(mLevelList[level].key[mLevelList[level].SortColumn]);
1032 data->selected = false;
1033 if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
1035 data->selected = true;
1040 GimmickDebugMessage(1,
1041 "WxTreeView::OnSort : "
1042 <<nbselected<<" selected before sorting"
1045 printf("EED WxTreeView::SortLevel 1\n");
1046 mIgnoreSelectedChanged = true;
1048 if (mLevelList[level].SortAscending)
1050 printf("EED WxTreeView::SortLevel 2\n");
1054 GetCtrl(level)->SortItems(CompareFunctionInts, 0);
1056 GetCtrl(level)->SortItems(CompareFunctionStrings, 0);
1061 GetCtrl(level)->SortItems(CompareFunctionInts, 1);
1063 GetCtrl(level)->SortItems(CompareFunctionStrings, 1);
1067 printf("EED WxTreeView::SortLevel 3\n");
1069 // Reselects the unselected
1070 n = GetCtrl(level)->GetItemCount();
1072 for (int i = 0; i < n; i++)
1074 //Gets current item data
1075 ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i);
1079 // item = GetCtrl(level)->GetNextItem(item,wxLIST_NEXT_ALL);
1080 // if ( item == -1 ) break;
1081 //Gets current item data
1082 // ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(item);
1087 printf("EED WxTreeView::SortLevel 4\n");
1091 // if it is the last one we must process the selection
1092 mIgnoreSelectedChanged = false;
1094 GetCtrl(level)->SetItemState(i,
1095 wxLIST_STATE_SELECTED,
1101 | wxLIST_MASK_FORMAT);
1103 if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0)
1110 mIgnoreSelectedChanged = false;
1111 GimmickDebugMessage(1,
1112 "WxTreeView::SortLevel : "
1113 <<after<<" selected after sorting"
1116 printf("EED WxTreeView::SortLevel End\n");
1118 //================================================================
1121 //================================================================
1122 void WxTreeView::ValidateSelectedImages(bool isSelection)
1124 GimmickDebugMessage(7,
1125 "WxTreeView::ValidateSelectedImages"
1127 const std::vector<tree::Node*>& sel(GetSelected((int)mLevelList.size()+1));
1128 GetGimmickView()->OnSelectionChange(sel,
1129 isSelection,(mLastSelected-1),
1130 !mIgnoreSelectedChanged);
1133 //================================================================
1136 //================================================================
1137 void WxTreeView::GetNodes(std::vector<tree::Node*>& nodes, bool direction)
1139 long item = mLastSelected;
1140 int level=(int)mLevelList.size()-1;
1141 //Gets current item data
1142 long adr = (long)GetCtrl(level)->GetItemData(item);
1144 tree::Node* nod = ((ItemData*)adr)->node;
1149 item = GetCtrl(level)->GetNextItem(item,
1154 item = GetCtrl(level)->GetNextItem(item,
1157 if ( item == -1 || item==0 )
1161 if(GetCtrl(level)->GetItemState(item, wxLIST_STATE_SELECTED)==0 )
1164 adr = (long)GetCtrl(level)->GetItemData(item);
1165 nod = ((ItemData*)adr)->node;
1166 nodes.push_back(nod);
1171 //================================================================
1172 //=================================================
1173 void WxTreeView::OnKeyDown(wxListEvent &event)
1175 if(event.GetKeyCode() == WXK_DELETE)
1178 std::string temp = "0";
1179 RemoveSelected(temp);
1180 GetGimmickView()->ClearSelection();
1184 //================================================================
1186 //================================================================
1187 // Should be in another place : not specific !
1188 void WxTreeView::GetSelectedAsString(std::vector<std::string>&s)
1190 int level= (int)mLevelList.size();
1191 const std::vector<tree::Node*>& sel=GetSelected(level+1);
1192 std::vector<tree::Node*>::const_iterator i;
1194 for (i=sel.begin(); i!=sel.end(); ++i)
1196 std::string filename=(*i)->GetAttribute("FullFileName");
1197 s.push_back(filename);
1203 //================================================================
1204 void WxTreeView::GetFilenamesAsString(const std::vector<tree::Node*>& nodes, std::vector<std::string>&s)
1206 std::vector<tree::Node*>::const_iterator i;
1208 for (i=nodes.begin(); i!=nodes.end(); ++i)
1210 if((*i)->GetLevel()<mLevelList.size())
1212 GetTreeHandler()->LoadChildren(*i,0);
1213 GetFilenamesAsString((*i)->GetChildrenList(),s);
1217 std::string filename=(*i)->GetAttribute("FullFileName");
1218 s.push_back(filename);
1223 //================================================================
1225 //================================================================
1226 void WxTreeView::GetAttributes(std::vector<std::string>& areShown, std::vector<std::string>& notShown, int level)
1230 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1231 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).begin();
1232 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(level).end();
1235 if(a->GetFlags()==creaImageIO::tree::AttributeDescriptor::EDITABLE && IsAttributeVisible(a->GetName(),level))
1237 areShown.push_back(a->GetName());
1240 notShown=mLevelList[level-1].notShownAtts;
1243 //================================================================
1244 void WxTreeView::SetNonVisibleAttributes(const std::vector<std::string>& notShown, int nlevel)
1246 mLevelList[nlevel].notShownAtts=notShown;
1249 //================================================================
1250 void WxTreeView::CreateCtrl(std::vector<std::string>& notShown, int nlevel)
1252 int ctrl_style = wxLC_REPORT | wxLC_VRULES;
1253 int col_style = wxLIST_FORMAT_LEFT;
1255 mLevelList[nlevel].SelectedUpToDate = true;
1256 mLevelList[nlevel].SortColumn = 0;
1257 mLevelList[nlevel].key.clear();
1259 mLevelList[nlevel].wxCtrl = new wxListCtrl(mLevelList[nlevel].wxSplitter,
1264 wxWindow* oldWin=mLevelList[nlevel].wxSplitter->GetWindow1();
1265 mLevelList[nlevel].wxSplitter->ReplaceWindow(oldWin,mLevelList[nlevel].wxCtrl);
1266 mLevelList[nlevel].wxSplitter->Initialize(mLevelList[nlevel].wxCtrl);
1268 // Create the columns : one for each attribute of the level
1272 tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a;
1273 for (a = GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).begin();
1274 a != GetTreeHandler()->GetTree().GetAttributeDescriptorList(nlevel+1).end();
1278 if(a->GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE && IsAttributeVisible(a->GetName(),nlevel+1))
1281 std::string temp = a->GetKey();
1282 if (temp.compare("ID") != 0)
1284 mLevelList[nlevel].wxCtrl->InsertColumn(col,
1285 crea::std2wx(title),
1289 mLevelList[nlevel].key.push_back(a->GetKey());
1297 //================================================================
1298 bool WxTreeView::IsAttributeVisible(const std::string& val, int level)
1300 std::vector<std::string> ns=mLevelList[level-1].notShownAtts;
1301 std::vector<std::string>::iterator it;
1303 for(it=ns.begin();it!=ns.end()&&!found;++it)
1305 if(val.compare(*it)==0)
1312 //================================================================
1313 //================================================================
1315 RemoveAlertDlg::RemoveAlertDlg(wxWindow *parent,
1323 wxDEFAULT_DIALOG_STYLE)
1325 wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
1327 //std::string out("To reload deleted patient, you should synchronize your database before."); // JPR
1328 //wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY,crea::std2wx(out),wxDefaultPosition, wxSize(500,20));
1329 wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY,
1330 _T("To reload deleted patient, you should synchronize your database before."),
1331 wxDefaultPosition, wxSize(650,20)); // 650 vs 500 ? // JPRx
1332 mcheck = new wxCheckBox(this, 5478, _T("Do not display this warning again!"));
1333 Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &RemoveAlertDlg::onCheck );
1334 wxSizer* buttonsSizer = this->CreateSeparatedButtonSizer(wxOK|wxCANCEL);
1336 topsizer->Add(text);
1337 topsizer->Add(mcheck,0,wxGROW);
1338 topsizer->Add(buttonsSizer,0,wxGROW);
1339 SetSizer(topsizer, true);
1343 RemoveAlertDlg::~RemoveAlertDlg(){};
1344 bool RemoveAlertDlg::isChecked()
1348 void RemoveAlertDlg::onCheck(wxCommandEvent &Event)
1350 mSave = mcheck->IsChecked();
1354 //================================================================
1355 //================================================================
1356 BEGIN_EVENT_TABLE(WxTreeView, wxPanel)
1358 EVT_SIZE(MyFrame::OnSize)
1360 EVT_MENU(LIST_QUIT, MyFrame::OnQuit)
1361 EVT_MENU(LIST_ABOUT, MyFrame::OnAbout)
1362 EVT_MENU(LIST_LIST_VIEW, MyFrame::OnListView)
1363 EVT_MENU(LIST_REPORT_VIEW, MyFrame::OnReportView)
1364 EVT_MENU(LIST_ICON_VIEW, MyFrame::OnIconView)
1365 EVT_MENU(LIST_ICON_TEXT_VIEW, MyFrame::OnIconTextView)
1366 EVT_MENU(LIST_SMALL_ICON_VIEW, MyFrame::OnSmallIconView)
1367 EVT_MENU(LIST_SMALL_ICON_TEXT_VIEW, MyFrame::OnSmallIconTextView)
1368 EVT_MENU(LIST_VIRTUAL_VIEW, MyFrame::OnVirtualView)
1369 EVT_MENU(LIST_SMALL_VIRTUAL_VIEW, MyFrame::OnSmallVirtualView)
1371 EVT_MENU(LIST_FOCUS_LAST, MyFrame::OnFocusLast)
1372 EVT_MENU(LIST_TOGGLE_FIRST, MyFrame::OnToggleFirstSel)
1373 EVT_MENU(LIST_DESELECT_ALL, MyFrame::OnDeselectAll)
1374 EVT_MENU(LIST_SELECT_ALL, MyFrame::OnSelectAll)
1375 EVT_MENU(LIST_DELETE, MyFrame::OnDelete)
1376 EVT_MENU(LIST_ADD, MyFrame::OnAdd)
1377 EVT_MENU(LIST_EDIT, MyFrame::OnEdit)
1378 EVT_MENU(LIST_DELETE_ALL, MyFrame::OnDeleteAll)
1379 EVT_MENU(LIST_SORT, MyFrame::OnSort)
1380 EVT_MENU(LIST_SET_FG_COL, MyFrame::OnSetFgColour)
1381 EVT_MENU(LIST_SET_BG_COL, MyFrame::OnSetBgColour)
1382 EVT_MENU(LIST_TOGGLE_MULTI_SEL, MyFrame::OnToggleMultiSel)
1383 EVT_MENU(LIST_SHOW_COL_INFO, MyFrame::OnShowColInfo)
1384 EVT_MENU(LIST_SHOW_SEL_INFO, MyFrame::OnShowSelInfo)
1385 EVT_MENU(LIST_FREEZE, MyFrame::OnFreeze)
1386 EVT_MENU(LIST_THAW, MyFrame::OnThaw)
1387 EVT_MENU(LIST_TOGGLE_LINES, MyFrame::OnToggleLines)
1388 EVT_MENU(LIST_MAC_USE_GENERIC, MyFrame::OnToggleMacUseGeneric)
1390 EVT_UPDATE_UI(LIST_SHOW_COL_INFO, MyFrame::OnUpdateShowColInfo)
1391 EVT_UPDATE_UI(LIST_TOGGLE_MULTI_SEL, MyFrame::OnUpdateToggleMultiSel)
1394 BEGIN_EVENT_TABLE(MyListCtrl, wxListCtrl)
1395 EVT_LIST_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnBeginDrag)
1396 EVT_LIST_BEGIN_RDRAG(LIST_CTRL, MyListCtrl::OnBeginRDrag)
1398 EVT_LIST_BEGIN_LABEL_EDIT(-1, WxTreeView::OnBeginLabelEdit)
1399 EVT_LIST_END_LABEL_EDIT(-1, WxTreeView::OnEndLabelEdit)
1401 EVT_LIST_DELETE_ITEM(LIST_CTRL, MyListCtrl::OnDeleteItem)
1402 EVT_LIST_DELETE_ALL_ITEMS(LIST_CTRL, MyListCtrl::OnDeleteAllItems)
1403 #if WXWIN_COMPATIBILITY_2_4
1404 EVT_LIST_GET_INFO(LIST_CTRL, MyListCtrl::OnGetInfo)
1405 EVT_LIST_SET_INFO(LIST_CTRL, MyListCtrl::OnSetInfo)
1408 EVT_LIST_KEY_DOWN(-1, WxTreeView::OnKeyDown)
1409 EVT_LIST_ITEM_SELECTED(-1, WxTreeView::OnItemSelected)
1410 EVT_LIST_ITEM_RIGHT_CLICK(-1, WxTreeView::OnItemMenu)
1411 EVT_LIST_ITEM_DESELECTED(-1, WxTreeView::OnItemDeSelected)
1413 EVT_LIST_KEY_DOWN(LIST_CTRL, MyListCtrl::OnListKeyDown)
1414 EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, MyListCtrl::OnActivated)
1415 EVT_LIST_ITEM_FOCUSED(LIST_CTRL, MyListCtrl::OnFocused)
1417 EVT_LIST_COL_RIGHT_CLICK(-1, WxTreeView::OnColClick)
1419 EVT_LIST_COL_CLICK(-1, WxTreeView::OnColClick)
1421 //EVT_LEFT_DOWN(WxTreeView::OnMouseClick)
1423 EVT_LIST_COL_BEGIN_DRAG(LIST_CTRL, MyListCtrl::OnColBeginDrag)
1424 EVT_LIST_COL_DRAGGING(LIST_CTRL, MyListCtrl::OnColDragging)
1425 EVT_LIST_COL_END_DRAG(LIST_CTRL, MyListCtrl::OnColEndDrag)
1427 EVT_LIST_CACHE_HINT(LIST_CTRL, MyListCtrl::OnCacheHint)
1429 #if USE_CONTEXT_MENU
1430 EVT_CONTEXT_MENU(MyListCtrl::OnContextMenu)
1432 EVT_CHAR(MyListCtrl::OnChar)
1434 EVT_RIGHT_DOWN(MyListCtrl::OnRightClick)
1438 } // EO namespace creaImageIO