]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOWxTreeView.cpp
Added Timestamp database to avoid repetition of files on addition.
[creaImageIO.git] / src2 / creaImageIOWxTreeView.cpp
index cb53f3310b4964c785af46e60dffe78323cf70d1..2050e53eb036adee2b39bde5d3141be49ba56757 100644 (file)
@@ -3,6 +3,7 @@
 #include <creaImageIOSystem.h>
 #include <wx/splitter.h>
 #include <wx/gdicmn.h>
+#include <boost/date_time/gregorian/gregorian.hpp>
 
 const std::string empty_string("");
 
@@ -105,11 +106,12 @@ namespace creaImageIO
   //=====================================================================
   // CTor
   WxTreeView::WxTreeView(TreeHandler* handler,
+                        TimestampDatabaseHandler* tdh,
                         GimmickView* gimmick,
                         wxWindow* parent,
                         const wxWindowID id)
     : wxPanel(parent,id),
-      TreeView(handler,gimmick)
+      TreeView(handler, tdh, gimmick)
   {
     GimmickDebugMessage(1,"WxTreeView::WxTreeView"
                        <<std::endl);
@@ -127,8 +129,8 @@ namespace creaImageIO
     int col_style = wxLIST_FORMAT_LEFT;
 
     // Creating the ListCtrl for the levels > 0 (not for Root level)
-    for (int i = 1;
-        i < handler->GetTree().GetNumberOfLevels();
+    for (int i = 0;
+        i < handler->GetTree().GetNumberOfLevels() -1;
         ++i)
       {
 
@@ -141,10 +143,11 @@ namespace creaImageIO
        // If the first level : parent = this
        wxWindow* sparent = this;
        // else parent = last splitter
-       if (i>1) sparent = mLevelList[i-2].wxSplitter;
+       if (i>0) 
+               sparent = mLevelList[i-1].wxSplitter;
 
        level.wxSplitter = new wxSplitterWindow( sparent , -1);
-       if(i!=1)
+       if(i!=0)
        {
        level.wxSplitter->Show(false);
        }
@@ -157,16 +160,17 @@ namespace creaImageIO
                                          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).begin();
-            a != handler->GetTree().GetAttributeDescriptorList(i).end();
+
+       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 "<<col<<" : "
                                <<a->GetName()
@@ -187,15 +191,16 @@ namespace creaImageIO
                  {
                    title=a->GetName();
                  }
+                 std::string temp = a->GetKey();
+                 if (temp.compare("ID") != 0)
+                 {
                
                ctrl->InsertColumn(col, 
                                   crea::std2wx(title),
                                   col_style);
-               level.key.push_back(a->GetKey());
-
-               //          ctrl->SetColumnWidth(col, wxLIST_AUTOSIZE );
-
                col++;
+                 }
+               level.key.push_back(a->GetKey());
              }
                
          }
@@ -264,28 +269,34 @@ namespace creaImageIO
       {
        sel.push_back(GetTreeHandler()->GetTree().GetTree());
       }
-    else 
-      {
-       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
+    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))
                        {
-                               sel.push_back(n);
+                               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;
@@ -298,66 +309,75 @@ namespace creaImageIO
    // NOT SPECIFIC 
   void WxTreeView::RemoveSelected()
   {
+         unsigned int tempLevel = mLastLevel;
     mLastLevel+=1;
     const std::vector<tree::Node*>& sel=GetSelected(mLastLevel+1);
-    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)
-         {
-           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;
-                 }
-               GetTreeHandler()->Remove(*i);
-             }
-           
-           if(needRefresh && 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')
              {
-               UpdateLevel(mLastLevel-2);
+               out<<" "<<levelName;
+               out<<"s?";
              }
-           else if(mLastLevel>1)
+           else
              {
-               UpdateLevel(mLastLevel-1);
+               out<<" "<<GetTreeHandler()->GetTree().GetLevelDescriptor(mLastLevel).GetName()<<"?";
              }
-           else
+           if (wxMessageBox(crea::std2wx(out.str()),
+                            _T("Remove Files"),
+                            wxYES_NO,this ) == wxYES)
              {
-               UpdateLevel(mLastLevel);
+               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 )
@@ -406,62 +426,80 @@ namespace creaImageIO
     
     for (i=sel.begin(); i!=sel.end(); ++i)
       {
-       GimmickDebugMessage(2,
+       GimmickDebugMessage(1,
                            "adding children of '"
                            <<(*i)->GetLabel()
                            <<"'"
                            <<std::endl);
-       int _id=1;
+       int _id=0;
        
        //Adds items and sets their attributes 
-       //GetCtrl(l)->InsertItem(0, _T(""));
+
        GetTreeHandler()->LoadChildren(*i,1);
        tree::Node::ChildrenListType::reverse_iterator j;
        for (j = (*i)->GetChildrenList().rbegin(); 
             j!= (*i)->GetChildrenList().rend(); 
             ++j)
          {
-           wxListItem* item= new wxListItem;
-           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;
-           item->SetId(_id);
-           
-           data->id = _id;
-           item->SetData(data);
-           
-           _id++;
-           GetCtrl(l)->InsertItem(*item);
-           
-           //Setting attributes
-           
-           for (int k=0; k<GetCtrl(l)->GetColumnCount(); k++)
-             {
-               std::string val = (*j)->GetAttribute(mLevelList[l].key[k]);
-               if (val.size()==0) val = "?";
-               item->SetText( crea::std2wx(val));
-               item->SetColumn(k);
-               GetCtrl(l)->SetItem(*item);
-             } 
-           
-         }
-       //GetCtrl(l)->DeleteItem(0);
+                       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();
-
-
-    
  }
   //=====================================================================
 
@@ -480,6 +518,9 @@ namespace creaImageIO
        if ( GetCtrl(level) == obj ) break;
       } 
     SetSelectedUpToDate(level,false);
+       // to allow a first selection in images TreeView
+       if (level==mLevelList.size()-1) 
+                OnItemSelected(event);
   }
   //================================================================
 
@@ -666,7 +707,7 @@ namespace creaImageIO
       {
        mLevelList[level].SortAscending = false;
       }
-    
+         
     SortLevel(level);
   }
   //================================================================
@@ -845,6 +886,19 @@ namespace creaImageIO
                }
     }
 
+  }
+  //================================================================
+   //=================================================
+  void WxTreeView::OnKeyDown(wxListEvent &event)
+  {
+         if(event.GetKeyCode() == WXK_DELETE)
+         {
+                  wxBusyCursor busy;
+                 
+                  RemoveSelected();
+                  GetGimmickView()->ClearSelection();
+         }
+                 
   }
   //================================================================
 
@@ -1025,6 +1079,7 @@ BEGIN_EVENT_TABLE(MyListCtrl, wxListCtrl)
     EVT_LIST_SET_INFO(LIST_CTRL, MyListCtrl::OnSetInfo)
 #endif
   */
+    EVT_LIST_KEY_DOWN(-1, WxTreeView::OnKeyDown)
     EVT_LIST_ITEM_SELECTED(-1, WxTreeView::OnItemSelected)
   
     EVT_LIST_ITEM_DESELECTED(-1, WxTreeView::OnItemDeSelected)