X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FcreaImageIOWxTreeView.cpp;h=8dbc4af1f7026217ce38404fea55efce57b46edd;hb=refs%2Fheads%2Fvtk9itk5wx3-macos;hp=3c1f3081a9fc0c287a6cf284f32c9fb863c423de;hpb=f5357d5e24ce935ff82ebb98d21dc95185c3528e;p=creaImageIO.git diff --git a/src/creaImageIOWxTreeView.cpp b/src/creaImageIOWxTreeView.cpp index 3c1f308..8dbc4af 100644 --- a/src/creaImageIOWxTreeView.cpp +++ b/src/creaImageIOWxTreeView.cpp @@ -27,7 +27,6 @@ #include #include - #include #include #include @@ -45,33 +44,24 @@ namespace creaImageIO //===================================================================== ///Comparing function for ordering algorithm. Takes parameters as strings. -int wxCALLBACK CompareFunctionStrings(long item1, long item2, long sortData) +//int wxCALLBACK CompareFunctionStrings(long item1, long item2, long sortData) +int wxCALLBACK CompareFunctionStrings(wxIntPtr item1, wxIntPtr item2, wxIntPtr sortData) { creaImageIO::ItemData* data1 = (creaImageIO::ItemData*)item1; creaImageIO::ItemData* data2 = (creaImageIO::ItemData*)item2; - const std::string& s1(*(data1->attr)); - const std::string& s2(*(data2->attr)); + const std::string& s2(*(data2->attr)); if(sortData==1) { // inverse the order - if (s1 < s2) - return 1; - if (s1 > s2) - return -1; - + if (s1 < s2) return 1; + if (s1 > s2) return -1; return 0; - } - else - { - if (s1 < s2) - return -1; - if (s1 > s2) - return 1; - + } else { + if (s1 < s2) return -1; + if (s1 > s2) return 1; return 0; - - } + } // if sortData } //===================================================================== @@ -126,104 +116,91 @@ namespace creaImageIO : wxPanel(parent,id), TreeView(handler, gimmick) { - GimmickDebugMessage(1,"WxTreeView::WxTreeView" - < 0 (not for Root level) - for (int i = 0; - i < handler->GetTree().GetNumberOfLevels() -1; - ++i) - { - GimmickDebugMessage(5,"Creating view for level "<0) - sparent = mLevelList[i-1].wxSplitter; - - level.wxSplitter = new wxSplitterWindow( sparent , -1); - if(i!=0) - { - level.wxSplitter->Show(false); - } - // level.wxSplitter->SetMinimumPaneSize(100); - - wxListCtrl* ctrl = new wxListCtrl(level.wxSplitter, - i, - wxDefaultPosition, - wxDefaultSize, - ctrl_style); - level.wxCtrl = ctrl; - level.wxSplitter->Initialize(ctrl); - - // Create the columns : one for each attribute of the level - int col = 0; - std::string title; - - tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a; - for (a = handler->GetTree().GetAttributeDescriptorList(i+1).begin(); - a != handler->GetTree().GetAttributeDescriptorList(i+1).end(); - ++a) - -{ - - GimmickDebugMessage(5,"Creating column "<GetName() - <GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE) - { - - if(a->GetName()=="UNKNOWN") - { - title = "#"; - title += handler->GetTree().GetLevelDescriptor(i+1).GetName(); - if (title[title.size()-1]!='s') - title += "s"; - - } - else - { - title=a->GetName(); - } - std::string temp = a->GetKey(); - if (temp.compare("ID") != 0) - { + for (int i = 0;i < handler->GetTree().GetNumberOfLevels() -1; ++i) + { + GimmickDebugMessage(5,"Creating view for level "<0) + { + sparent = mLevelList[i-1].wxSplitter; + } // if + level.wxSplitter = new wxSplitterWindow( sparent , -1); + if(i!=0) + { + level.wxSplitter->Show(false); + } // if + // level.wxSplitter->SetMinimumPaneSize(100); - ctrl->InsertColumn(col, - crea::std2wx(title), - col_style); - col++; - } - level.key.push_back(a->GetKey()); - } + wxListCtrl* ctrl = new wxListCtrl(level.wxSplitter, - } - - mLevelList.push_back(level); - } +// EED1 2018-08-16 +// i, + wxID_ANY, + + wxDefaultPosition, + wxDefaultSize, + ctrl_style); + level.wxCtrl = ctrl; + level.wxSplitter->Initialize(ctrl); + + // Create the columns : one for each attribute of the level + int col = 0; + std::string title; + + tree::LevelDescriptor::AttributeDescriptorListType::const_iterator a; + for (a = handler->GetTree().GetAttributeDescriptorList(i+1).begin(); + a != handler->GetTree().GetAttributeDescriptorList(i+1).end(); + ++a) + { + GimmickDebugMessage(5,"Creating column "<GetName() <GetFlags()!=creaImageIO::tree::AttributeDescriptor::PRIVATE) + { + if(a->GetName()=="UNKNOWN") + { + title = "#"; + title += handler->GetTree().GetLevelDescriptor(i+1).GetName(); + if (title[title.size()-1]!='s') + { + title += "s"; + } // if + } else { + title=a->GetName(); + } // if a + std::string temp = a->GetKey(); + if (temp.compare("ID") != 0) + { + ctrl->InsertColumn(col,crea::std2wx(title),col_style); + col++; + } // if temp + level.key.push_back(a->GetKey()); + } // if + + } // for a + mLevelList.push_back(level); + } // for i #if wxUSE_MENUS // Column Menu - menu =new wxMenu; + menu =new wxMenu(); wxMenuItem* m1=menu->Append(wxID_ANY, _T("&Sort ascending")); wxMenuItem* m2=menu->Append(wxID_ANY, _T("&Sort descending")); wxMenuItem* m3=menu->Append(wxID_ANY, _T("&Filter")); @@ -236,20 +213,18 @@ namespace creaImageIO ////SubMenuItem EXPORT - subExportMenu = new wxMenu; + subExportMenu = new wxMenu(); wxMenuItem *subExp1 = subExportMenu->Append(wxID_ANY, _T("&Export to Storage")); Connect( subExp1->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnExportToStorage) ); //ItemMenu - menuItem =new wxMenu; - + menuItem =new wxMenu(); wxMenuItem* m2Item=menuItem->Append(wxID_ANY, _T("&Local Copy")); wxMenuItem* m3Item=menuItem->Append(wxID_ANY, _T("&Edit Fields")); wxMenuItem* m4Item=menuItem->Append(wxID_ANY, _T("&Display Dicom Tags")); menuItem->AppendSubMenu(subExportMenu, wxT("&Export")); - wxMenuItem* m1Item=menuItem->Append(wxID_ANY, _T("&Anonymize")); mAnonymizingID=m1Item->GetId(); Connect( mAnonymizingID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnAnonymizer) ); @@ -258,21 +233,18 @@ namespace creaImageIO mEditFieldID=m3Item->GetId(); mDumpID=m4Item->GetId(); - Connect( mLocalCopyID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnLocalCopy) ); Connect( mEditFieldID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnEditField) ); Connect( mDumpID, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(WxTreeView::OnDumpTags) ); - - #endif // wxUSE_MENUS /// Initialize the first level splitter msizer->Add( mLevelList[0].wxSplitter ,1, wxGROW ,0); - // mColumnSelected=1; - mLastSelected=0; - mLastLevel=0; - // mDirection=true; + // mColumnSelected = 1; + mLastSelected = 0; + mLastLevel = 0; + // mDirection = true; mIgnoreSelectedChanged = false; @@ -282,7 +254,6 @@ namespace creaImageIO SetSizer( msizer ); SetAutoLayout(true); Layout(); - } //===================================================================== @@ -290,16 +261,12 @@ namespace creaImageIO /// Destructor WxTreeView::~WxTreeView() { - GimmickDebugMessage(1,"WxTreeView::~WxTreeView" - <& WxTreeView::GetSelected(int level) { @@ -308,29 +275,33 @@ namespace creaImageIO int l = level - 1; // the selection of upper level if(mLevelList.size() == level -1) - sel = mLevelList.back().Selected; - else - sel= mLevelList[l].Selected; + { + sel = mLevelList.back().Selected; + } else { + sel= mLevelList[l].Selected; + } if (sel.size() > 0) { sel.clear(); } - if (level == 1) - { - sel.push_back(GetTreeHandler()->GetTree().GetTree()); - } - else if (level < mLevelList.size()+2 ) + if (level == 1) { + sel.push_back( GetTreeHandler()->GetTree().GetTree() ); + } else if (level < mLevelList.size()+2 ) { long item = -1; for ( ;; ) { - item = GetCtrl(l-1)->GetNextItem(item, + item = GetCtrl(l-1)->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if ( item == -1 ) + { break; - long adr = (long)GetCtrl(l-1)->GetItemData(item); - tree::Node* n = ((ItemData*)adr)->node; + } +// long adr = (long)GetCtrl(l-1)->GetItemData(item); + ItemData* adr = (ItemData*)GetCtrl(l-1)->GetItemData(item); +// tree::Node* n = ((ItemData*)adr)->node; + tree::Node* n = adr->node; /* FCY 18-04-2011: don't understand the real purpose of these lines, if uncomment add last frame in first place if(mLastSelected==item) @@ -340,12 +311,11 @@ namespace creaImageIO it = sel.insert ( it , n ); } else - {*/ - + {*/ sel.push_back(n); //} - } + } // for /*int n = GetCtrl(l-1)->GetItemCount(); for (int i = 0; iGetTree().GetLevelDescriptor(mLastLevel).GetName(); out<<"Delete "; @@ -419,11 +386,7 @@ namespace creaImageIO std::vector::const_iterator i; for (i=sel.begin(); i!=sel.end(); ++i) { - GimmickMessage(1, - "deleting '" - <<(*i)->GetLabel() - <<"'"<GetLabel() << "'" << mLastLevel << std::endl ); if((*i)->GetParent()->GetNumberOfChildren()<2) { needRefresh=true; @@ -435,21 +398,15 @@ namespace creaImageIO } if(needRefresh && mLastLevel>1) - { - UpdateLevel(mLastLevel-2); - } - else if(mLastLevel>1) - { - UpdateLevel(mLastLevel-1); - } - else - { - UpdateLevel(mLastLevel); - } - } - } - else - { + { + UpdateLevel(mLastLevel-2); + } else if(mLastLevel>1) { + UpdateLevel(mLastLevel-1); + } else { + UpdateLevel(mLastLevel); + } // if needRefresh + } // if erase + } else { // no need to incremente level mLastLevel = tempLevel; } @@ -457,7 +414,7 @@ namespace creaImageIO if (erase && mLastLevel == 1 && i_save == "0") { - RemoveAlertDlg *dial = new RemoveAlertDlg(this, crea::std2wx("Remove files"), wxSize(370,100)); + RemoveAlertDlg *dial = new RemoveAlertDlg(this, crea::std2wx("Remove files"), wxSize(450,300)); //dial->ShowModal(); if (dial->ShowModal() == wxID_OK) { @@ -472,7 +429,7 @@ namespace creaImageIO /// Updates a level of the view (adds or removes children, etc.) void WxTreeView::UpdateLevel( int level ) { - GimmickDebugMessage(1, + GimmickDebugMessage(1, GetTreeHandler()->GetTree().GetLabel() <<"WxTreeView::UpdateLevel(level " <IsSplit()) - GetSplitter(i)->SplitVertically( GetCtrl(i), GetSplitter(i+1), - 100 ); - } - if (GetSplitter(i)->IsSplit()) GetSplitter(i)->Unsplit(); + { + if (!GetSplitter(i)->IsSplit()) + { + GetSplitter(i)->SplitVertically( GetCtrl(i), GetSplitter(i+1),100 ); + } // if + } // for + if (GetSplitter(i)->IsSplit()) + { + GetSplitter(i)->Unsplit(); + } } //===================================================================== @@ -502,29 +463,21 @@ namespace creaImageIO <<"WxTreeView::RecursiveUpdateLevel(level " <& sel(GetSelected(level)); - - int l = level - 1; - // to speed up inserting we hide the control temporarily GetCtrl(l)->Hide(); GetCtrl(l)->DeleteAllItems(); - std::vector::const_iterator i; - for (i=sel.begin(); i!=sel.end(); ++i) - { + { GimmickDebugMessage(1, "adding children of '" <<(*i)->GetLabel() <<"'" <LoadChildren(*i,1); tree::Node::ChildrenListType::reverse_iterator j; for (j = (*i)->GetChildrenList().rbegin(); @@ -536,7 +489,6 @@ namespace creaImageIO <<(*j)->GetLabel() <<"'" <node = *j; - data->id = _id; - + ItemData* data = new ItemData(); + data->node = *j; + data->id = _id; item.SetId(_id); item.SetData(data); - _id++; GetCtrl(l)->InsertItem(item); - //Setting attributes for (int k=0; kGetColumnCount(); ++k) - { - std::string val; - // Temporary correction : it works but no explanation about the problem FCY - - if(k==0 && level <3) - { - val = (*j)->GetAttribute("NumberOfChildren"); - } - else - val = (*j)->GetAttribute(mLevelList[l].key[k]); - if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isDateEntry()) // Date - { - // std::cout << "["<GetAttributeDescriptor(mLevelList[l].key[k])).isTimeEntry()) // Time - { - if ((val.size()>6) && - (val != "" || val != " ")) - val = val.substr(0,2) + " : " - + val.substr(2,2) + " : " - + val.substr(4,2); - } - else - { - if (val.size()==0) val = "?"; - } - if (val.size()==0) val = "X"; - item.SetText( crea::std2wx(val)); - item.SetColumn(k); - - GetCtrl(l)->SetItem(item); - } + { + std::string val; + // Temporary correction : it works but no explanation about the problem FCY + if(k==0 && level <3) + { + val = (*j)->GetAttribute("NumberOfChildren"); + } else { + val = (*j)->GetAttribute(mLevelList[l].key[k]); + } + if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isDateEntry()) // Date + { + // std::cout << "["<GetAttributeDescriptor(mLevelList[l].key[k])).isTimeEntry()) // Time + { + if ((val.size()>6) && (val != "" || val != " ")) + { + val = val.substr(0,2) + " : " + val.substr(2,2) + " : " + val.substr(4,2); + } + } else { + if (val.size()==0) + { + val = "?"; + } + } // if j + if (val.size()==0) + { + val = "X"; + } + item.SetText( crea::std2wx(val)); + item.SetColumn(k); + GetCtrl(l)->SetItem(item); + } // for k item.Clear(); - - } - } - + } // for j + + } // for i SortLevel(l); GetCtrl(l)->Show(); } @@ -635,21 +581,14 @@ namespace creaImageIO //================================================================ void WxTreeView::OnItemSelected(wxListEvent& event) { - - GimmickDebugMessage(1, - GetTreeHandler()->GetTree().GetLabel() - <<" WxTreeView::OnItemSelected"<GetTree().GetLabel()<<" WxTreeView::OnItemSelected"<ClearSelection(); - } + { + UpdateLevel( level + 2 ); + // Reset the viewer setting the default image + GetGimmickView()->ClearSelection(); + } // Select all images if the selection is at series level if (level==mLevelList.size()-2) + { SelectAll(level+1); + } // Validate selected images if the selection is at image level if (level==(mLevelList.size()-1)) //&&mProcess) - { - if(event.GetEventType()==wxEVT_COMMAND_LIST_ITEM_SELECTED) - { + { + if(event.GetEventType()==wxEVT_COMMAND_LIST_ITEM_SELECTED) + { ValidateSelectedImages (true); - } - else - { + } else { ValidateSelectedImages (false); - } - } - + } + } // if } //================================================================ //================================================================ void WxTreeView::SelectAll(int level) - { + { long item = -1; // int level=mLevelList.size()-1; for ( ;; ) - { - item = GetCtrl(level)->GetNextItem(item, - wxLIST_NEXT_ALL); - if ( item == -1 ) - break; - - if(item==(GetCtrl(level)->GetItemCount()-1)) - { - mIgnoreSelectedChanged = false;//mProcess=true; - } - else - { - mIgnoreSelectedChanged = true;// mProcess=false; - } - GetCtrl(level)->SetItemState(item,wxLIST_STATE_SELECTED, wxLIST_MASK_STATE - | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT); - } + { + item = GetCtrl(level)->GetNextItem(item,wxLIST_NEXT_ALL); + if ( item == -1 ) + { + break; + } + if(item==(GetCtrl(level)->GetItemCount()-1)) + { + mIgnoreSelectedChanged = false;//mProcess=true; + } else { + mIgnoreSelectedChanged = true;// mProcess=false; + } + GetCtrl(level)->SetItemState(item,wxLIST_STATE_SELECTED, wxLIST_MASK_STATE + | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT); + } // for } //================================================================ @@ -838,7 +771,6 @@ namespace creaImageIO { mLevelList[level].SortAscending = false; } - SortLevel(level); } //================================================================ @@ -970,7 +902,7 @@ namespace creaImageIO //================================================================ void WxTreeView::SortLevel(int level) - { + { GimmickDebugMessage(1, "WxTreeView::SortLevel(" <GetItemCount(); for (int i = 0; i < n; i++) - { - - //Gets current item data - ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i); - - //Extracts the node and the type of attribute - tree::Node* nod = data->node; - if(i==0) - { - (*nod).GetAttributeDescriptor - (mLevelList[level].key[mLevelList[level].SortColumn]) - .DecodeType( ty ); - } - //Obtains the organizing attribute - data->attr = & (*nod).GetAttribute - (mLevelList[level].key[mLevelList[level].SortColumn]); - //Selected ? - data->selected = false; - if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0) - { - data->selected = true; - nbselected++; - } - - } + { + //Gets current item data + ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i); + //Extracts the node and the type of attribute + tree::Node* nod = data->node; + if(i==0) + { + (*nod).GetAttributeDescriptor + (mLevelList[level].key[mLevelList[level].SortColumn]) + .DecodeType( ty ); + } // if i + //Obtains the organizing attribute + data->attr = & (*nod).GetAttribute(mLevelList[level].key[mLevelList[level].SortColumn]); + //Selected ? + data->selected = false; + if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0) + { + data->selected = true; + nbselected++; + } // if + }// for GimmickDebugMessage(1, "WxTreeView::OnSort : " <SortItems(CompareFunctionInts, 0); - } - else - { - GetCtrl(level)->SortItems(CompareFunctionStrings, 0); - } - - } - else - { - if(ty==1) - { - GetCtrl(level)->SortItems(CompareFunctionInts, 1); - } - else - { - GetCtrl(level)->SortItems(CompareFunctionStrings, 1); - } - } + { + if(ty==1) + { + GetCtrl(level)->SortItems(CompareFunctionInts, 0); + } else { + GetCtrl(level)->SortItems(CompareFunctionStrings, 0); + } // if ty + } else { + if(ty==1) + { + GetCtrl(level)->SortItems(CompareFunctionInts, 1); + } else { + GetCtrl(level)->SortItems(CompareFunctionStrings, 1); + } // if ty + } //mLevelList - // Reselects the unselected n = GetCtrl(level)->GetItemCount(); int after = 0; for (int i = 0; i < n; i++) - { - - //Gets current item data - ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i); - - // long item = -1; - // for ( ;; ) - // { - // item = GetCtrl(level)->GetNextItem(item,wxLIST_NEXT_ALL); - // if ( item == -1 ) break; - //Gets current item data - // ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(item); - // was selected ? - - if (data->selected) - { - nbselected--; - if (nbselected==0) - { - // if it is the last one we must process the selection - mIgnoreSelectedChanged = false; - } - GetCtrl(level)->SetItemState(i, - wxLIST_STATE_SELECTED, - wxLIST_MASK_STATE - | wxLIST_MASK_TEXT - | wxLIST_MASK_IMAGE - | wxLIST_MASK_DATA - | wxLIST_MASK_WIDTH - | wxLIST_MASK_FORMAT); - } - if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0) - { - after++; - } + { + //Gets current item data + ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(i); + // long item = -1; + // for ( ;; ) + // { + // item = GetCtrl(level)->GetNextItem(item,wxLIST_NEXT_ALL); + // if ( item == -1 ) break; + //Gets current item data + // ItemData* data = (ItemData*)GetCtrl(level)->GetItemData(item); + // was selected ? + + if (data->selected) + { + nbselected--; + if (nbselected==0) + { + // if it is the last one we must process the selection + mIgnoreSelectedChanged = false; + } + GetCtrl(level)->SetItemState(i, + wxLIST_STATE_SELECTED, + wxLIST_MASK_STATE + | wxLIST_MASK_TEXT + | wxLIST_MASK_IMAGE + | wxLIST_MASK_DATA + | wxLIST_MASK_WIDTH + | wxLIST_MASK_FORMAT); + } // if data + if (GetCtrl(level)->GetItemState(i,wxLIST_STATE_SELECTED)>0) + { + after++; + } - } + } // for mIgnoreSelectedChanged = false; - GimmickDebugMessage(1, + GimmickDebugMessage(1, "WxTreeView::SortLevel : " <