]> Creatis software - creaImageIO.git/commitdiff
Remove algorithm is now linear, and everything can be removed without deleting the...
authorcaballero <caballero>
Tue, 7 Apr 2009 14:57:47 +0000 (14:57 +0000)
committercaballero <caballero>
Tue, 7 Apr 2009 14:57:47 +0000 (14:57 +0000)
src2/creaImageIOSQLiteTreeHandler.cpp
src2/creaImageIOTreeHandlerImageAdder.cpp
src2/creaImageIOTreeHandlerImageAdder.h
src2/creaImageIOTreeView.h
src2/creaImageIOWxGimmickView.cpp
src2/creaImageIOWxTreeView.cpp
src2/creaImageIOWxTreeView.h

index 564ec3346f601c9cd453b50ffec8f588347ee9ee..aec51554f68406d87bd679cebf989b9770b542cf 100644 (file)
@@ -130,11 +130,16 @@ namespace creaImageIO
   //===================================================================== 
   int SQLiteTreeHandler::AddBranch( const AttributeMapType& attr )
   {
-    //std::cout << "AddBranch" << std::endl;
     tree::Node* parent = DBGetParent(attr);
-    //std::cout << " parent = "<<parent->GetLabel()<<" level "<<parent->GetLevel()<<std::endl;
     DBGraftToParent(parent,attr);
-       
+       if(parent->GetLevel()<GetTree().GetNumberOfLevels()-1&&parent->GetLevel()>0)
+       {
+       int nC=GetNumberOfChildren(parent);
+       nC=nC+1;
+       std::stringstream out;
+       out <<nC;
+       SetAttribute(parent,"D1111_0011",out.str());
+       }
     return (parent->GetLevel()+1);
          
   }
@@ -147,11 +152,30 @@ namespace creaImageIO
    DBRecursiveRemoveNode(node);
  
     //    std::cout << "DELETE"<<std::endl;
-    if (node->GetParent())
+   bool remove=false;
+   tree::Node* parent=node->GetParent();
+    if (parent)
       {
-       node->GetParent()->RemoveChildrenFromList(node);
+       parent->RemoveChildrenFromList(node);
+       int nC=GetNumberOfChildren(parent);
+       nC=nC-1;
+       if(nC>0)
+       {       
+               std::stringstream out;
+               out <<nC;
+               SetAttribute(parent,"D1111_0011",out.str());
+       }
+       else
+       {
+               remove=true;
+       }
+
       }
     delete node;
+       if(remove&&parent->GetLevel()>0)
+       {
+               Remove(parent);
+       }
     //    std::cout << "DELETE OK"<<std::endl;
     return true;
    }
@@ -661,7 +685,7 @@ namespace creaImageIO
     int nbloaded = 0;
     // If children loaded we do not have to do it but we need to recurse
     // in order to load the children's children if necessary, and so on...
-    if (node->GetChildrenLoaded()||mIsAdding
+    if (node->GetChildrenLoaded()) 
       {
        // Iterate the children 
 
@@ -767,8 +791,10 @@ namespace creaImageIO
       {
        // Create Node
        tree::Node* child = new tree::Node(parent,attr);
+       GetNumberOfChildren(parent);
        child->SetChildrenLoaded(true);
        //      std::cout<<"Number of children "<<parent->GetNumberOfChildren()<<std::endl;
+
        // Set PARENT_ID if necessary 
        if ( parent->GetLevel()>0 )
          child->SetAttribute("PARENT_ID",parent->GetAttribute("ID"));
@@ -868,26 +894,30 @@ namespace creaImageIO
          // Query DB
        int nb=0;
     int level = n->GetLevel();
-       if(GetTree().GetNumberOfLevels()!=(level+1))
+       
+       if(level<GetTree().GetNumberOfLevels()&& level>0)
        {
-       std::string query = "SELECT * FROM ";
-    query += GetTree().GetLevelDescriptor(level+1).GetName();
+               std::string query = "SELECT D1111_0011 FROM ";
+    query += GetTree().GetLevelDescriptor(level).GetName();
     if (level>0)
       {
-       query += " WHERE PARENT_ID='" + n->UnsafeGetAttribute("ID") 
+       query += " WHERE ID='" + n->UnsafeGetAttribute("ID") 
          + "'";
       }
-
     CppSQLite3Query q;
     QUERYDB(query,q);
        
 
                while (!q.eof())
                {
-                       nb++;
+                       for (int fld = 0; fld < q.numFields(); fld++)
+                       {
+                               nb=q.getIntField(fld);  
+                       }
                        q.nextRow();
                }
        }
+       if(nb==0){nb=1;}
     return nb; 
   }
 
index b9291e1f31b0e3269f37ba1d70c7ac1624e0ffcb..ef31c09f651f327a5276e9301c21c9e364063782 100644 (file)
@@ -56,7 +56,6 @@ namespace creaImageIO
        mProgressSignal(mProgress);
        if (mProgress.GetStop()) break;
       }
-         SetNumberOfChildren();
   }
   //=====================================================================
 
@@ -66,39 +65,9 @@ namespace creaImageIO
   {
     mProgress.Reset();
     AddDirectoryRecursor( directory, recurse );
-       SetNumberOfChildren();
     GimmickDebugMessage(3,mProgress<<std::endl);
   }
 
-  //=====================================================================
-
-  void TreeHandlerImageAdder::SetNumberOfChildren()
-  {
-       std::vector<tree::Node*> children = mTreeHandler->GetTree().GetChildrenList();
-       std::vector<tree::Node*>::iterator it;
-       for(it=children.begin();it!=children.end();++it)
-       {
-       SetNumberOfChildrenRecursor(*it);
-       }
-  }
-  //=====================================================================
-
-  void TreeHandlerImageAdder::SetNumberOfChildrenRecursor(tree::Node* node)
-  {
-         std::stringstream out;
-         out << node->GetChildrenList().size();
-         mTreeHandler->SetAttribute(node,"D1111_0011",out.str());
-         if(node->GetLevel()<mTreeHandler->GetTree().GetNumberOfLevels()-2)
-         {
-                 std::vector<tree::Node*> children = node->GetChildrenList();
-                 std::vector<tree::Node*>::iterator it;
-          for(it=children.begin();it!=children.end();++it)
-                 {
-                         SetNumberOfChildrenRecursor(*it);
-                 }
-         }
-  }
-
   //=====================================================================
   void TreeHandlerImageAdder::AddFile( const std::string& filename )
   {
index 6fdaf99a55375260ec431ad3ba156b7aaa32cdf1..bcb74c0c2514b080fdfce842b49dc83890cc6270 100644 (file)
@@ -112,13 +112,6 @@ namespace creaImageIO
     void AddDirectoryRecursor( const std::string& directory, 
                               bool recurse );
 
-       ///Sets the number of children for the tree
-       void SetNumberOfChildren();
-  
-       ///Sets the number of children recursively for the given node
-       void SetNumberOfChildrenRecursor(tree::Node* node);
-    
-
     TreeHandler* mTreeHandler;
     ImageReader mReader;
     
index 5bfb116c9fba0458e536b7bf11dd9a46d392a41f..ca493c91ebfda818223967a0645f15302ee54c49 100644 (file)
@@ -31,8 +31,8 @@ namespace creaImageIO
       virtual void UpdateLevel( int ) 
       { GimmickError("INTERNAL ERROR : TreeView::UpdateLevel not overloaded");}
 
-         ///Removes selected nodes on given level
-         virtual void RemoveSelected( int )
+         ///Removes selected nodes
+         virtual void RemoveSelected( )
          { GimmickError("INTERNAL ERROR : TreeView::RemoveSelected not overloaded");}
 
          ///Validates the selected images
index 7e018a0c2bd62fec02e5de2ae0fac03559197021..cdda6f277bb4a8f57d21b0dd5badfb02944621d6 100644 (file)
@@ -547,7 +547,7 @@ namespace creaImageIO
   {
        //TODO Select current tree handler       
     wxBusyCursor busy;
-    GetTreeViewMap()["Local database"]->RemoveSelected(1);
+    GetTreeViewMap()["Local database"]->RemoveSelected();
        ClearSelection();
   }
   //=================================================
index c121c96a04a2d745a97c0c802dbc3b28835176e5..9884cb03843de979297328302a9623811f0cdb52 100644 (file)
@@ -178,6 +178,7 @@ namespace creaImageIO
       sizer->Add( mLevelList[0].wxSplitter ,1, wxGROW  ,0);
        mColumnSelected=1;
        mLastSelected=0;
+       mLastLevel=0;
        mDirection=true;
        mSelectionMade=false;
        mProcess=true;
@@ -247,12 +248,26 @@ namespace creaImageIO
 
   //=====================================================================
   
-  ///Removes selected nodes on given level
-  void WxTreeView::RemoveSelected( int level )
+  ///Removes selected nodes on last selected level
+  void WxTreeView::RemoveSelected()
   {
-         std::vector<tree::Node*> sel=GetSelected(level+1);
+         mLastLevel+=1;
+         std::vector<tree::Node*> sel=GetSelected(mLastLevel+1);
          bool erase=false;
-         if (wxMessageBox(_T("Delete file(s) ?"),
+         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(_T(out.str()),
                         _T("Remove Files"),
                         wxYES_NO,this ) == wxYES)
          {
@@ -260,18 +275,34 @@ namespace creaImageIO
          }
          if(erase)
          {
+               bool needRefresh=false;
                std::vector<tree::Node*>::iterator i;
                for (i=sel.begin(); i!=sel.end(); ++i)
                {
-                       GimmickDebugMessage(2,
+                       GimmickMessage(1,
                                        "deleting '"
                                        <<(*i)->GetLabel()
-                                       <<"'"<<level
+                                       <<"'"<<mLastLevel
                                        <<std::endl);
+                       if((*i)->GetParent()->GetNumberOfChildren()<2)
+                       {
+                               needRefresh=true;
+                       }
                                GetTreeHandler()->Remove(*i);
                }
 
-               UpdateLevel(level);
+               if(needRefresh && mLastLevel>1)
+               {
+               UpdateLevel(mLastLevel-2);
+               }
+               else if(mLastLevel>1)
+               {
+               UpdateLevel(mLastLevel-1);
+               }
+               else
+               {
+               UpdateLevel(mLastLevel);
+               }
          }
          
   }
@@ -398,6 +429,7 @@ namespace creaImageIO
       {
        if ( GetCtrl(level) == obj ) break;
       }
+       mLastLevel=level;
     GimmickDebugMessage(1,
                        " Level "<<level+1
                        <<std::endl);
@@ -405,6 +437,7 @@ namespace creaImageIO
     // 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();
@@ -666,11 +699,11 @@ namespace creaImageIO
                        item = GetCtrl(level)->GetNextItem(item,
                                      wxLIST_NEXT_BELOW);
                }
-        if ( item == -1  )
+        if ( item == -1 || item==0  )
                {
             break;
                }
-               if(GetCtrl(level)->GetItemState(item, wxLIST_STATE_SELECTED)==0 /*&& item!=0*/)
+               if(GetCtrl(level)->GetItemState(item, wxLIST_STATE_SELECTED)==0 )
                {
                        adr = GetCtrl(level)->GetItemData(item);
                        nod = ((ItemData*)adr)->node;
index 201335d4a6652b46fd64f8485bf3f7a7ece85eb2..53dac45ced887fb26a7e6dd6862716ad2a6952a5 100644 (file)
@@ -34,7 +34,7 @@ namespace creaImageIO
       virtual void UpdateLevel( int );
 
          ///Removes selected nodes on given level
-         virtual void RemoveSelected( int );
+         virtual void RemoveSelected();
 
          /// Callback for selection change
       void OnSelectedChanged(wxListEvent& event);
@@ -115,6 +115,7 @@ namespace creaImageIO
          int mAscendingID;
          int mDescendingID;
          int mFilterID;
+         unsigned int mLastLevel;
 
       DECLARE_EVENT_TABLE()
     };