+ //=====================================================================
+
+
+
+ //=====================================================================
+ const std::vector<tree::Node*>& WxTreeView::GetSelected(int level)
+ {
+ // if (GetSelectedUpToDate(level))
+
+ int l = level - 1;
+ // the selection of upper level
+ std::vector<tree::Node*>& sel(mLevelList[level-1].Selected);
+ sel.clear();
+
+ if (level == 1)
+ {
+ sel.push_back(GetTreeHandler()->GetTree().GetTree());
+ }
+ else if (level < 5)
+ {
+ int n = GetCtrl(l-1)->GetItemCount();
+ for (int i = 0; i < n; i++)
+ {
+ if ( GetCtrl(l-1)->GetItemState(i,wxLIST_STATE_SELECTED))
+ {
+ long adr = GetCtrl(l-1)->GetItemData(i);
+ tree::Node* n = ((ItemData*)adr)->node;
+ if(mLastSelected==i)
+ {
+ std::vector<tree::Node*>::iterator it;
+ it = sel.begin();
+ it = sel.insert ( it , n );
+ }
+ else
+ {
+ sel.push_back(n);
+ }
+ }
+ }
+ }
+ else
+ {
+ // NOTHING
+ }
+
+
+
+ // return mLevelList[level-1].Selected;
+ return sel;
+ }
+
+ //=====================================================================
+
+ //=====================================================================
+ ///Removes selected nodes on last selected level
+ // NOT SPECIFIC
+ void WxTreeView::RemoveSelected()
+ {
+ unsigned int tempLevel = mLastLevel;
+ mLastLevel+=1;
+ const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
+ // if no selection, no remove action.
+ if(sel.size() != 0)
+ {
+ bool erase=false;
+ std::stringstream out;
+ std::string levelName=GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName();
+ out<<"Delete ";
+ out<<sel.size();
+ if(sel.size()>1&&levelName.at(levelName.size()-1)!='s')
+ {
+ out<<" "<<levelName;
+ out<<"s?";
+ }
+ else
+ {
+ out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<"?";
+ }
+ if (wxMessageBox(crea::std2wx(out.str()),
+ _T("Remove Files"),
+ wxYES_NO,this ) == wxYES)
+ {
+ erase = true;
+ }
+ if(erase)
+ {
+ GetGimmickView()->modifyValidationSignal(false);
+ bool needRefresh=false;
+ std::vector<tree::Node*>::const_iterator i;
+ for (i=sel.begin(); i!=sel.end(); ++i)
+ {
+ GimmickMessage(1,
+ "deleting '"
+ <<(*i)->GetLabel()
+ <<"'"<<mLastLevel
+ <<std::endl);
+ if((*i)->GetParent()->GetNumberOfChildren()<2)
+ {
+ needRefresh=true;
+ }
+ GetTimestampDatabaseHandler()->RemoveNode("PATH",(*i));
+ GetTreeHandler()->Remove(*i);
+ }
+
+ if(needRefresh && mLastLevel>1)
+ {
+ UpdateLevel(mLastLevel-2);
+ }
+ else if(mLastLevel>1)
+ {
+ UpdateLevel(mLastLevel-1);
+ }
+ else
+ {
+ UpdateLevel(mLastLevel);
+ }
+ }
+ }
+ else
+ {
+ // no need to incremente level
+ mLastLevel = tempLevel;
+ }
+
+ }
+
+
+ //=====================================================================
+ /// Updates a level of the view (adds or removes children, etc.)
+ void WxTreeView::UpdateLevel( int level )
+ {
+ GimmickDebugMessage(1,
+ GetTreeHandler()->GetTree().GetLabel()
+ <<"WxTreeView::UpdateLevel(level "
+ <<level
+ <<")"
+ <<std::endl);
+
+ wxBusyCursor busy;
+ RecursiveUpdateLevel(level);
+ int i;
+ for (i=0; i<level-1; i++)
+ {
+ if (!GetSplitter(i)->IsSplit())
+ GetSplitter(i)->SplitVertically( GetCtrl(i), GetSplitter(i+1),
+ 100 );
+ }
+ if (GetSplitter(i)->IsSplit()) GetSplitter(i)->Unsplit();
+
+ }
+ //=====================================================================
+
+ //=====================================================================
+ /// Recursive method called upon by UpdateLevel to refresh all windows
+ void WxTreeView::RecursiveUpdateLevel( int level )
+ {
+ GimmickDebugMessage(1,
+ GetTreeHandler()->GetTree().GetLabel()
+ <<"WxTreeView::RecursiveUpdateLevel(level "
+ <<level
+ <<")"<<std::endl);
+
+
+ const std::vector<tree::Node*>& sel(GetSelected(level));
+
+ int l = level - 1;
+
+ // to speed up inserting we hide the control temporarily
+ GetCtrl(l)->Hide();
+ GetCtrl(l)->DeleteAllItems();
+
+ std::vector<tree::Node*>::const_iterator i;
+
+ for (i=sel.begin(); i!=sel.end(); ++i)
+ {
+ GimmickDebugMessage(1,
+ "adding children of '"
+ <<(*i)->GetLabel()
+ <<"'"
+ <<std::endl);
+ int _id=0;
+
+ //Adds items and sets their attributes
+
+ GetTreeHandler()->LoadChildren(*i,1);
+ tree::Node::ChildrenListType::reverse_iterator j;
+ for (j = (*i)->GetChildrenList().rbegin();
+ j!= (*i)->GetChildrenList().rend();
+ ++j)
+ {
+ GimmickDebugMessage(1,
+ "adding children "
+ <<(*j)->GetLabel()
+ <<"'"
+ <<std::endl);
+
+ wxListItem item;
+ item.SetMask(wxLIST_MASK_STATE |
+ wxLIST_MASK_TEXT |
+ // wxLIST_MASK_IMAGE |
+ wxLIST_MASK_DATA |
+ // wxLIST_MASK_WIDTH |
+ wxLIST_MASK_FORMAT
+ );
+
+ 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; k<GetCtrl(l)->GetColumnCount(); ++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
+ {
+ boost::gregorian::date d1(boost::gregorian::from_undelimited_string(val));
+ val = to_iso_extended_string(d1);
+ }
+ else if(((*j)->GetAttributeDescriptor(mLevelList[l].key[k])).isTimeEntry()) // Time
+ {
+ if (val != "" || val != " ")
+ val = val.substr(0,2) + " : " + val.substr(2,2) + " : " + val.substr(4,2);
+ }
+ else
+ {
+
+ }
+ if (val.size()==0) val = "?";
+ item.SetText( crea::std2wx(val));
+ item.SetColumn(k);
+ GetCtrl(l)->SetItem(item);
+ }
+
+ }
+ }
+
+ SortLevel(l);
+ GetCtrl(l)->Show();
+ }
+ //=====================================================================
+
+
+ //================================================================
+ void WxTreeView::OnItemDeSelected(wxListEvent& event)
+ {
+ GimmickDebugMessage(1,
+ GetTreeHandler()->GetTree().GetLabel()
+ <<" WxTreeView::OnItemDeselected"<<std::endl);
+ // retrieve the level
+ wxObject* obj = event.GetEventObject();
+ unsigned int level = 0;
+ for (level = 0; level<mLevelList.size(); ++level)
+ {
+ if ( GetCtrl(level) == obj ) break;
+ }
+ SetSelectedUpToDate(level,false);
+ // to allow a first selection in images TreeView
+ if (level==mLevelList.size()-1)
+ OnItemSelected(event);
+ }
+ //================================================================
+
+ //================================================================
+ void WxTreeView::OnItemSelected(wxListEvent& event)
+ {
+ GimmickDebugMessage(1,
+ GetTreeHandler()->GetTree().GetLabel()
+ <<" WxTreeView::OnItemSelected"<<std::endl);
+
+ if (mIgnoreSelectedChanged)
+ {
+ GimmickDebugMessage(1,
+ " mIgnoreSelectedChanged true: returning"
+ <<std::endl);
+ return;
+ }
+
+
+
+ wxListItem info;
+ info.m_itemId = event.m_itemIndex;
+ mLastSelected = event.m_itemIndex;
+ // retrieve the level
+ wxObject* obj = event.GetEventObject();
+ unsigned int level = 0;
+ for (level = 0; level<mLevelList.size(); ++level)
+ {
+ if ( GetCtrl(level) == obj ) break;
+ }
+ mLastLevel=level;
+ GimmickDebugMessage(1,
+ " Level "<<level+1
+ <<std::endl);
+
+ // Update the children level (if selection not at last level)
+ if (level<mLevelList.size()-1)
+ {
+
+ 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()==10145)
+ {
+ ValidateSelectedImages (true);
+ }
+ else
+ {
+ ValidateSelectedImages (false);
+ }
+ }
+
+ }
+ //================================================================
+
+ //================================================================
+ 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);
+ }
+ }
+
+ //================================================================
+ //================================================================
+
+ void WxTreeView::OnColClick(wxListEvent& event)
+ {
+ mColumnSelected = event.m_col;
+ wxPoint clientpt;
+ clientpt.x = wxGetMousePosition().x - this->GetScreenPosition().x;
+ clientpt.y = wxGetMousePosition().y - this->GetScreenPosition().y;
+ senderCtrl = event.GetEventObject();
+ unsigned int level = 0;
+ for (level = 0; level<mLevelList.size(); ++level)
+ {
+ if ( GetCtrl(level) == senderCtrl ) break;
+ }
+ PopupMenu(menu, clientpt);
+
+ }
+
+ //================================================================
+ //================================================================
+
+ void WxTreeView::OnPopupFilter(wxCommandEvent& event)
+ {
+ wxBusyCursor busy;
+ GimmickDebugMessage(7,
+ "WxTreeView::OnEndLabelEdit"
+ <<std::endl);
+ wxObject* ctrl = event.GetEventObject();
+ unsigned int level = 0;
+ for (level = 0; level<mLevelList.size(); ++level)
+ {
+ if ( GetCtrl(level) == senderCtrl ) break;
+ }
+ std::string filter = crea::wx2std(wxGetTextFromUser(_T("Enter the filter to apply"), _T("Filter On Column")));
+
+ std::string att;
+
+ long it = -1;
+ UpdateLevel(level+1);
+
+ std::vector<long> items;
+ bool in=false;
+ int del=0;
+ for ( ;; )
+ {
+ it = GetCtrl(level)->GetNextItem(it,
+ wxLIST_NEXT_ALL);
+ if ( it == -1 )
+ break;
+
+ long adr = GetCtrl(level)->GetItemData(it);
+ tree::Node* nod = ((ItemData*)adr)->node;
+ att=(*nod).GetAttribute(mLevelList[level].key[mColumnSelected]);
+
+
+ if(att.find(filter)>900)
+ {
+
+ if(!in)
+ {
+ in=true;
+ }
+ else
+ {
+ del+=1;
+ }
+
+ items.push_back(it-del);
+ }
+
+ }
+ std::vector<long>::iterator iter;
+ for(iter=items.begin();iter!=items.end();++iter)
+ {
+ GetCtrl(level)->DeleteItem(*iter);
+ }
+ GetGimmickView()->ClearSelection();
+ }
+ //================================================================