Salome HOME
Merge commit '4823245056426a9ccf9c7965daecf11459f58af5' into V9_11_BR
[modules/geom.git] / src / DependencyTree / DependencyTree_View.cxx
index 198a50bc6f500c8a28d4d7cb2b925fb3e49d9e95..a4ef11eafaba54c92c78bea7dd96f071f23d954c 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2014-2022  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
+// Internal includes
 #include "DependencyTree_View.h"
 #include "DependencyTree_Object.h"
 #include "DependencyTree_Arrow.h"
 
-#include <GEOM_InteractiveObject.hxx>
-#include <GeometryGUI.h>
-#include <GEOMBase.h>
-
 // GUI includes
 #include <SUIT_Session.h>
 #include <SUIT_ResourceMgr.h>
-#include <SalomeApp_Application.h>
 #include <SalomeApp_Study.h>
 #include <QtxActionToolMgr.h>
 #include <LightApp_SelectionMgr.h>
-#include <SALOME_ListIteratorOfListIO.hxx>
-
-// Qt includes
-#include <QCloseEvent>
-#include <QTimerEvent>
-#include <QGraphicsScene>
+#include <SALOME_ListIO.hxx>
 
+// GEOM includes
+#include <GEOMBase.h>
 
-#include <iostream>
-int iter = 0;
+// Qt includes
+#include <QApplication>
+#include <QWidgetAction>
+#include <QWheelEvent>
 
 DependencyTree_View::DependencyTree_View( QWidget* theParent )
-:GraphicsView_ViewPort(theParent),
+:GraphicsView_ViewPort( theParent ),
+myLevelsNumber(0),
 myMaxDownwardLevelsNumber(0),
 myMaxUpwardLevelsNumber(0),
-myLevelsNumber(0),
-myIsCompute(true),
 myIsUpdate( true )
 {
   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
   if ( !app ) return;
 
-  SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
-  SALOMEDS::Study_var myStudy = GeometryGUI::ClientStudyToStudy( study->studyDS());
-
-  LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
-  if ( !aSelMgr ) return;
-
-  SALOME_ListIO aSelList;
-  aSelMgr->selectedObjects(aSelList);
-
-  GEOM::string_array_var ObjectIORs = new GEOM::string_array();
-    ObjectIORs->length( aSelList.Extent());
-    int aaa=0;
-
-   for ( SALOME_ListIteratorOfListIO It( aSelList ); It.More(); It.Next() ) {
-    Handle( SALOME_InteractiveObject ) io = It.Value();
+  mySelectionMgr = app->selectionMgr();
+  if ( !mySelectionMgr ) return;
 
+  myMainEntries = new GEOM::string_array();
 
-    GEOM::GEOM_Object_var myObject = GEOM::GEOM_Object::_nil();
-    myObject = GEOMBase::ConvertIOinGEOMObject( io );
-    QString ior = myObject->GetEntry();
-    ObjectIORs[aaa] = ior.toLatin1().constData();
-    aaa++;
-
-    std::cout << "\n\n IOR = " << ior.toStdString() << std::endl;
-  }
-
-  SALOMEDS::TMPFile_var SeqFile =
-  GeometryGUI::GetGeomGen()->GetDependencyTree( myStudy, ObjectIORs );
-  char* buf;
-  buf = (char*) &SeqFile[0];
-
-  std::cout << "\n\n\n\n\n TREE = " << buf << std::endl;
-
-  GEOMUtils::ConvertStringToTree( buf, myTreeModel );
-
+  getNewTreeModel();
 }
 
 DependencyTree_View::~DependencyTree_View()
 {
-
-}
-
-void DependencyTree_View::drawArrows()
-{
-       GEOMUtils::TreeModel::const_iterator i;
-       for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
-               DependencyTree_Object* Main_object = myTreeMap[i->first];
-               GEOMUtils::LevelInfo Levelup = i->second.first.at(0);
-               if( myDisplayAscendants ->isChecked() ) {
-                       GEOMUtils::LevelInfo::const_iterator node;
-               for (node = Levelup.begin(); node != Levelup.end(); node++ ) {
-                   DependencyTree_Object* object = myTreeMap[node->first];
-                   DependencyTree_Arrow* arrow = Arrows[std::pair<DependencyTree_Object*,DependencyTree_Object*>(Main_object, object)];
-                   if( arrow && !isItemAdded( arrow) )
-                     addItem( arrow );
-                 }
-               }
-               if( myDisplayAscendants ->isChecked() )
-       drawWardArrows( i->second.first );
-               if( myDisplayDescendants->isChecked() )
-       drawWardArrows( i->second.second );
-
-         }
-}
-
-void DependencyTree_View::drawWardArrows( GEOMUtils::LevelsList theWard )
-{
-         for(int j = 0; j < theWard.size(); j++ ) {
-                 if( j >= myLevelsNumber )
-               break;
-                 GEOMUtils::LevelInfo Level = theWard.at(j);
-                 GEOMUtils::LevelInfo::const_iterator node;
-                 for (node = Level.begin(); node != Level.end(); node++ ) {
-                   DependencyTree_Object* object = myTreeMap[node->first];
-                   GEOMUtils::NodeLinks Links = node->second;
-          for( int link = 0; link < Links.size(); link++ ) {
-            DependencyTree_Object* LinkObject = myTreeMap[Links[link]];
-            if( isItemAdded( object ) && isItemAdded( LinkObject ) ) {
-                   DependencyTree_Arrow* arrow = Arrows[std::pair<DependencyTree_Object*,DependencyTree_Object*>(object, LinkObject)];
-                   if( arrow && !isItemAdded( arrow) )
-                     addItem( arrow );
-               }
-          }
-                 }
-         }
-}
-
-void DependencyTree_View::parseTree()
-{
-
-  GEOMUtils::TreeModel::const_iterator i;
-  for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
-    std::string objectEntry = i->first;
-    addNode( objectEntry );
-    parseTreeWard( i->second.first );
-    if( i->second.first.size() > myMaxUpwardLevelsNumber )
-      myMaxUpwardLevelsNumber = i->second.first.size();
-    parseTreeWard( i->second.second );
-    if( i->second.second.size() > myMaxDownwardLevelsNumber )
-      myMaxDownwardLevelsNumber = i->second.second.size();
-  }
-
-  for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
-    DependencyTree_Object* Main_object = myTreeMap[i->first];
-    GEOMUtils::LevelInfo Levelup = i->second.first.at(0);
-    GEOMUtils::LevelInfo::const_iterator node;
-    for (node = Levelup.begin(); node != Levelup.end(); node++ ) {
-      DependencyTree_Object* object = myTreeMap[node->first];
-      addArrow( Main_object, object );
-    }
-    parseTreeWardArrow( i->second.first );
-    parseTreeWardArrow( i->second.second );
-  }
-
-
-}
-void DependencyTree_View::parseTreeWard(const GEOMUtils::LevelsList theWard)
-{
-  int levelsNumber = theWard.size();
-  for( int level = 0; level < levelsNumber; level++ ) {
-    GEOMUtils::LevelInfo levelInfo = theWard[ level ];
-    GEOMUtils::LevelInfo::const_iterator node;
-    for (node = levelInfo.begin(); node != levelInfo.end(); node++ ) {
-      addNode( node->first );
-    }
-  }
+  clearView( true );
 }
-void DependencyTree_View::parseTreeWardArrow(const GEOMUtils::LevelsList theWard)
-{
-  for(int j = 0; j < theWard.size(); j++ ) {
-         GEOMUtils::LevelInfo Level = theWard.at(j);
-         GEOMUtils::LevelInfo::const_iterator node;
-    for (node = Level.begin(); node != Level.end(); node++ ) {
-      DependencyTree_Object* object = myTreeMap[node->first];
-      std::vector<std::string> Links = node->second;
-      for( int link = 0; link < Links.size(); link++ ) {
-        DependencyTree_Object* LinkObject = myTreeMap[Links[link]];
-        if( object && LinkObject )
-          addArrow( object, LinkObject );
-      }
-    }
-  }
-}
-//void DependencyTree_View::parseData( QString& theData )
-//{
-//       int cursor = 0;
-//
-//       while( theData.indexOf('-',cursor) != -1 ) //find next selected object
-//       {
-//         int objectIndex = theData.indexOf( '-', cursor );
-//         QString objectEntry = theData.mid( cursor, objectIndex - cursor );
-//         //addNode( objectEntry );
-//         std::cout<<"\n\nMainObject = " << objectEntry.toStdString() <<std::endl;
-//         cursor = objectIndex;
-//
-//         int upwardIndexBegin = theData.indexOf("{",cursor) + 1;
-//         int upwardIndexFinish = theData.indexOf("}",upwardIndexBegin);
-//         std::cout<<"  Upward:" << std::endl;
-//         LevelsList upwardList = parseWard( theData, cursor );
-//         if( upwardList.size() > myMaxUpwardLevelsNumber )
-//           myMaxUpwardLevelsNumber = upwardList.size();
-//         std::cout<<"  Downward:" << std::endl;
-//         LevelsList downwardList = parseWard( theData, cursor );
-//         if( downwardList.size() > myMaxDownwardLevelsNumber )
-//           myMaxDownwardLevelsNumber = downwardList.size();
-//
-//         myTreeModel[objectEntry] = QPair<LevelsList,LevelsList>( upwardList, downwardList );
-//       }
-//}
-
-void DependencyTree_View::addNode( const std::string& theEntry )
-{
-  if( !myTreeMap[theEntry] )
-    myTreeMap[theEntry] = new DependencyTree_Object( theEntry );
-}
-
-void DependencyTree_View::addArrow( DependencyTree_Object *startItem, DependencyTree_Object *endItem )
-{
-  bool isFind = false;
-
-  std::cout << "   " << startItem->getEntry() << "   " << endItem->getEntry() << std::endl;
-  std::map<std::pair<DependencyTree_Object*,DependencyTree_Object*>, DependencyTree_Arrow* >::const_iterator i;
-  for (i = Arrows.begin(); i != Arrows.end(); i++ ) {
-         DependencyTree_Arrow* arrow = i->second;
-    if( arrow->getStartItem() == startItem && arrow->getEndItem() == endItem ) {
-      isFind = true;
-      std::cout<<" theSame " << std::endl;
-    }
-    else if( arrow->getStartItem() == endItem && arrow->getEndItem() == startItem ) {
-      arrow->setIsBiLink( true );
-      std::cout<<" Bilink " << std::endl;
-      isFind = true;
-    }
-  }
-
-  if( !isFind ) {
-         DependencyTree_Arrow *arrow = new DependencyTree_Arrow(startItem, endItem);
-           //Arrows.append( arrow );
-           //addItem(arrow);
-           Arrows[std::pair<DependencyTree_Object*,DependencyTree_Object*>( startItem, endItem )] = arrow;
-           std::cout<<" addArrow " << std::endl;
-  }
-}
-
-//DependencyTree_View::LevelsList DependencyTree_View::parseWard( const QString& theData, int& theCursor )
-//{
-//       int indexStart = theData.indexOf( "{", theCursor ) + 1;
-//       int indexEnd = theData.indexOf( "}", indexStart );
-//
-//       QString ward = theData.mid( indexStart, indexEnd - indexStart );
-//       QStringList levelsListStr = ward.split( ';' );
-//       LevelsList levelsListData;
-//       for( int level = 0; level < levelsListStr.size(); level++ ) {
-//         std::cout<<"    Level" << level + 1 << ":" << std::endl;
-//         QStringList namesListStr = levelsListStr[level].split( ',' );
-//         LevelInfo levelInfoData;
-//         for( int node = 0; node < namesListStr.size(); node++ ) {
-//           QStringList linksListStr = namesListStr[node].split( '_' );
-//           QString nodeItem = linksListStr[0];
-//           if( !nodeItem.isEmpty() ) {
-//             //addNode( nodeItem );
-//             NodeLinks linksListData;
-//             std::cout<<"      " << nodeItem.toStdString() << " - ";
-//             for( int link = 1; link < linksListStr.size(); link++ ) {
-//               QString linkItem = linksListStr[link];
-//               //addNode( linkItem );
-//               linksListData.append( linkItem );
-//               std::cout << linkItem.toStdString() << ", ";
-//             }// Links
-//             levelInfoData[nodeItem] = linksListData;
-//             std::cout << std::endl;
-//           }
-//         }// Level's objects
-//         levelsListData.append(levelInfoData);
-//       }// Levels
-//
-//       theCursor = indexEnd + 1;
-//
-//       return levelsListData;
-//}
-
-void DependencyTree_View::drawTree()
-{
-
-  int horDistance, verDistance;
-  myCurrentLevel = 0;
-    GEOMUtils::TreeModel::const_iterator i;
-    for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
-      myCurrentLevel = 0;
-      std::string objectEntry = i->first;
-      DependencyTree_Object* objectItem = myTreeMap[ objectEntry ];
-      horDistance = 100 + int( objectItem->boundingRect().width() );
-      verDistance = 3 * int( objectItem->boundingRect().height() );
-      if( isItemAdded( objectItem ) ) {
-        myCurrentLevel = myLevelMap[ objectEntry ];
-      }
-      else {
-        addItem( objectItem );
-        myLevelMap[ objectEntry ] = myCurrentLevel;
-        myLevelsObject[ myCurrentLevel ].push_back( objectEntry );
-      }
-      objectItem->setIsMainObject( true );
-
-      int levelposition = myCurrentLevel;
-      if( myDisplayAscendants ->isChecked() ){
-        drawWard( i->second.first, -1 );
-        myCurrentLevel = levelposition;
-      }
-      if( myDisplayDescendants->isChecked() )
-        drawWard( i->second.second, 1 );
-      }
-
-               std::map< int, std::vector<std::string> >::const_iterator j;
-               for (j = myLevelsObject.begin(); j != myLevelsObject.end(); j++ ) {
-                 int step = -horDistance*( j->second.size() - 1 )/2;
-                       std::cout<<"\n\n LEVEL = " << j->first << std::endl;
-                 for( int object = 0; object < j->second.size(); object++ ) {
-                        if( myIsCompute ) {
-                         std::cout << j->second.at( object ) << ", ";
-                        DependencyTree_Object* anObject = myTreeMap[ j->second.at( object ) ];
-                        anObject->setPos( step, verDistance*j->first );
-                        step += horDistance;
-                        //sleep(1);
-                        }
-                 }
-               }
-  centerOn( scene()->sceneRect().center() );
-
-}
-
-void DependencyTree_View::drawWard( const GEOMUtils::LevelsList theWard, const int theLevelStep )
-{
-       std::cout << "\n\n myLevelsNumber2 = " << myLevelsNumber << std::endl;
-         int levelsNumber = theWard.size();
-       std::cout << "\n\n levelsNumber = " << levelsNumber << std::endl;
-         for( int level = 0; level < levelsNumber; level++ ) {
-                 if( level >= myLevelsNumber )
-               return;
-           myCurrentLevel += theLevelStep;
-           GEOMUtils::LevelInfo levelInfo = theWard.at( level );
-           GEOMUtils::LevelInfo::const_iterator node;
-               for (node = levelInfo.begin(); node != levelInfo.end(); node++ ) {
-             DependencyTree_Object* object = myTreeMap[ node->first ];
-             if( !isItemAdded( object ) ) {
-               std::cout<< "\n\n\n addItem = " << object->getEntry() << std::endl;
-               addItem( object );
-               myLevelMap[ node->first ] = myCurrentLevel;
-               myLevelsObject[ myCurrentLevel ].push_back( node->first );
-             }
-           }
-        }
-
-}
-
-void DependencyTree_View::onUpdateTree()
-{
-  myLevelMap.clear();
-  myLevelsObject.clear();
-
-
-  std::map<std::string,DependencyTree_Object*>::const_iterator i;
-       for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
-               DependencyTree_Object* object = myTreeMap[ i->first ];
-               if( isItemAdded( object ) && object )
-          removeItem( object );
-
-       }
-
-   std::map<std::pair<DependencyTree_Object*,DependencyTree_Object*>, DependencyTree_Arrow* >::const_iterator j;
-   for (j = Arrows.begin(); j != Arrows.end(); j++ ) {
-     DependencyTree_Arrow* object = Arrows[ j->first ];
-     if( isItemAdded( object ) && object )
-       removeItem( object );
-   }
-
-  drawTree();
-  drawArrows();
-}
-
-
-int DependencyTree_View::checkMaxLevelsNumber()
-{
-  if( myDisplayAscendants ->isChecked() && myDisplayDescendants->isChecked() )
-    return myMaxUpwardLevelsNumber>myMaxDownwardLevelsNumber?myMaxUpwardLevelsNumber:myMaxDownwardLevelsNumber;
-  else if( myDisplayAscendants ->isChecked() )
-    return myMaxUpwardLevelsNumber;
-  else if( myDisplayDescendants->isChecked() )
-    return  myMaxDownwardLevelsNumber;
-}
-
 
+//=================================================================================
+// function : init()
+// purpose  : this method is obligatory for initialize view frame actions
+//=================================================================================
 void DependencyTree_View::init( GraphicsView_ViewFrame* theViewFrame )
 {
-         SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
-
-         std::string Data = "MainObject1-upward{up11_up21_up22,up12_up23,up13_up24;up21_up11,up22_up21_up12,up23_up23,up24}"
-                                "downward{down11_MainObject1,down12_MainObject1;down21_down11,down22_down12,down23_down12,down24_down24_down11,down25_down12;down31_down11_down23,down32_down25}"
-                                "down23-upward{down12_MainObject1;MainObject1_up11_up12_up13;up11_up21_up22,up12_up23,up13_up24;up21,up22_up21_up12,up23,up24}"
-                                "downward{down31_down11_down23}"
-                                "MainObject2-upward{up21,newup11_newup31,newup12_newup21;newup21_newup31LongName;newup31LongName}downward{newdown11_MainObject2,newdown12_MainObject2,newdown13_MainObject2;newdown21_newdown13,down21;newdown31_newdown11}"
-                                "MainObject3-upward{moUP1_moUP4,moUP2_moUP3;moUP4,moUP3_down23}downward{moDOWN1_MainObject3}";
-
-
-         //GEOMUtils::ConvertStringToTree( Data, myTreeModel );
-
-
-
-//       GEOMUtils::TreeModel::const_iterator i;
-//       for ( i = aTreeModel.begin(); i != aTreeModel.end(); i++ ) {
-//         std::string objectEntry = i->first;
-//         std::cout << "\n\n Main object = " << objectEntry << std::endl;
-//       }
-//  parseData( Data );
-  parseTree();
-
-
   myNodesMovable = new QCheckBox( tr( "MOVE_NODES" ) );
-  QWidgetAction* moveNodesAction = new QWidgetAction( theViewFrame );
-  moveNodesAction->setDefaultWidget( myNodesMovable );
+  QWidgetAction* nodesMovableAction = new QWidgetAction( theViewFrame );
+  nodesMovableAction->setDefaultWidget( myNodesMovable );
 
-  myDisplayAscendants  = new QCheckBox( tr( "DISPLAY_ASCENDANTS" ));
-  myDisplayAscendants ->setChecked( true );
-  QWidgetAction* ShowParentsAction = new QWidgetAction(theViewFrame);
-  ShowParentsAction->setDefaultWidget( myDisplayAscendants  );
+  myDisplayAscendants = new QCheckBox( tr( "DISPLAY_ASCENDANTS" ) );
+  QWidgetAction* displayAscendantsAction = new QWidgetAction( theViewFrame );
+  displayAscendantsAction->setDefaultWidget( myDisplayAscendants  );
 
   myDisplayDescendants = new QCheckBox(tr("DISPLAY_DESCENDANTS"));
-  QWidgetAction* ShowChildrenAction = new QWidgetAction(theViewFrame);
-  ShowChildrenAction->setDefaultWidget( myDisplayDescendants );
+  QWidgetAction* displayDescendantsAction = new QWidgetAction( theViewFrame );
+  displayDescendantsAction->setDefaultWidget( myDisplayDescendants );
+
+  QLabel* hierarchyDepthLabel = new QLabel( tr( "HIERARCHY_DEPTH" ) );
+  QWidgetAction* hierarchyDepthLabelAction = new QWidgetAction( theViewFrame );
+  hierarchyDepthLabelAction->setDefaultWidget( hierarchyDepthLabel );
 
   myLevelsNumber = checkMaxLevelsNumber();
-  std::cout << "\n\n myLevelsNumber1 = " << myLevelsNumber << std::endl;
+
   myHierarchyDepth = new QSpinBox();
   myHierarchyDepth->setRange( 0, checkMaxLevelsNumber() );
+  myHierarchyDepth->setSpecialValueText( tr( "SHOW_ALL" ) );
   myHierarchyDepth->setValue( 0 );
-  myHierarchyDepth->setSpecialValueText( "All" );
-  QWidgetAction* LevelsAction = new QWidgetAction(theViewFrame);
-  LevelsAction->setDefaultWidget( myHierarchyDepth );
-
-  QLabel* LevelsLabel = new QLabel( tr("HIERARCHY_DEPTH") );
-  QWidgetAction* LevelsLebelAction = new QWidgetAction(theViewFrame);
-  LevelsLebelAction->setDefaultWidget( LevelsLabel );
-
-
-  QPushButton* UpdateButton = new QPushButton(tr("Update"));
-  QWidgetAction* UpdateAction = new QWidgetAction(theViewFrame);
-  UpdateAction->setDefaultWidget( UpdateButton );
-
-  cancelButton = new QPushButton(tr("CANCEL"));
-  cancelButton->setCheckable(true);
-  cancelButton->setVisible( false );
-  cancelAction = new QWidgetAction(theViewFrame);
-  cancelAction->setDefaultWidget( cancelButton );
-  cancelAction->setVisible(false);
-
-  progressBar  = new QProgressBar(this);
-  progressBar->setMinimum( 0 );
-  progressBar->setMaximum( 1000 );
-  progressBar->setFixedWidth(100);
-  progressAction = new QWidgetAction(theViewFrame);
-  progressAction->setDefaultWidget( progressBar );
-  progressAction->setVisible(false);
-
-  QAction* separator = theViewFrame->toolMgr()->separator(false);
-  theViewFrame->toolMgr()->append( separator, theViewFrame->getToolBarId() );
-  theViewFrame->toolMgr()->append( moveNodesAction, theViewFrame->getToolBarId() );
-  theViewFrame->toolMgr()->append( LevelsLebelAction, theViewFrame->getToolBarId() );
-  theViewFrame->toolMgr()->append( LevelsAction, theViewFrame->getToolBarId() );
-  theViewFrame->toolMgr()->append( ShowParentsAction, theViewFrame->getToolBarId() );
-  theViewFrame->toolMgr()->append( ShowChildrenAction, theViewFrame->getToolBarId() );
-  QAction* separator2 = theViewFrame->toolMgr()->separator(false);
-  theViewFrame->toolMgr()->append( separator2, theViewFrame->getToolBarId() );
-  theViewFrame->toolMgr()->append( UpdateAction, theViewFrame->getToolBarId() );
-  std::cout<<"\n\n\n\n ToolBarId = " << theViewFrame->getToolBarId() << std::endl;
-  theViewFrame->toolMgr()->append( progressAction, theViewFrame->getToolBarId() );
-  theViewFrame->toolMgr()->append( cancelAction, theViewFrame->getToolBarId() );
+  QWidgetAction* hierarchyDepthAction = new QWidgetAction( theViewFrame );
+  hierarchyDepthAction->setDefaultWidget( myHierarchyDepth );
 
-  connect(cancelButton, SIGNAL(clicked()), this, SLOT(onCancel()));
+  updateButton = new QPushButton( tr( "UPDATE" ) );
+  QWidgetAction* updateAction = new QWidgetAction( theViewFrame );
+  updateAction->setDefaultWidget( updateButton );
 
+  QAction* separator1 = theViewFrame->toolMgr()->separator( false );
+  QAction* separator2 = theViewFrame->toolMgr()->separator( false );
+
+  theViewFrame->toolMgr()->append( separator1, theViewFrame->getToolBarId() );
+  theViewFrame->toolMgr()->append( hierarchyDepthLabelAction, theViewFrame->getToolBarId() );
+  theViewFrame->toolMgr()->append( hierarchyDepthAction, theViewFrame->getToolBarId() );
+  theViewFrame->toolMgr()->append( displayAscendantsAction, theViewFrame->getToolBarId() );
+  theViewFrame->toolMgr()->append( displayDescendantsAction, theViewFrame->getToolBarId() );
+  theViewFrame->toolMgr()->append( nodesMovableAction, theViewFrame->getToolBarId() );
+
+  theViewFrame->toolMgr()->append( separator2, theViewFrame->getToolBarId() );
+  theViewFrame->toolMgr()->append( updateAction, theViewFrame->getToolBarId() );
+
+  connect( myNodesMovable, SIGNAL( toggled( bool ) ), this, SLOT( onMoveNodes( bool ) ) );
   connect( myHierarchyDepth, SIGNAL( valueChanged ( int ) ), this, SLOT( onHierarchyType() ) );
-  connect( myDisplayAscendants , SIGNAL( toggled(bool) ), this, SLOT( onHierarchyType() ) );
-  connect( myDisplayDescendants, SIGNAL( toggled(bool) ), this, SLOT( onHierarchyType() ) );
-  connect( UpdateButton, SIGNAL( clicked() ), this, SLOT( updateView() ) );
-  connect( myNodesMovable, SIGNAL( toggled(bool) ), this, SLOT( onMoveNodes( bool ) ) );
+  connect( myDisplayAscendants , SIGNAL( toggled( bool ) ), this, SLOT( onHierarchyType() ) );
+  connect( myDisplayDescendants, SIGNAL( toggled( bool ) ), this, SLOT( onHierarchyType() ) );
+  connect( updateButton, SIGNAL( clicked() ), this, SLOT( onUpdateModel() ) );
 
+  SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
+  GeometryGUI* aGeomGUI = dynamic_cast<GeometryGUI*>( app->module( "Geometry" ) );
+  if ( aGeomGUI ) {
+    connect( aGeomGUI, SIGNAL( SignalDependencyTreeParamChanged( const QString&, const QString& ) ),
+             this, SLOT( onPreferenceChanged( const QString&, const QString& ) ) );
+    connect( aGeomGUI, SIGNAL( SignalDependencyTreeRenameObject( const QString& ) ),
+             this, SLOT( onRenameObject( const QString& ) ) );
+  }
+
+  SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
   setPrefBackgroundColor( resMgr->colorValue( "Geometry", "dependency_tree_background_color", QColor( 255, 255, 255 ) ) );
   setNodesMovable( resMgr->booleanValue( "Geometry", "dependency_tree_move_nodes", true ) );
   setHierarchyType( resMgr->integerValue( "Geometry", "dependency_tree_hierarchy_type", 0 ) );
-
 }
 
-void DependencyTree_View::onMoveNodes( bool theIsMoveNodes )
+//=================================================================================
+// function : updateModel()
+// purpose  : run all stage of dependency tree creation
+//=================================================================================
+void DependencyTree_View::updateModel( bool theUseSelectedObject, bool theUseOB )
 {
-  std::map<std::string,DependencyTree_Object*>::const_iterator i;
-  for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
-    DependencyTree_Object* object = myTreeMap[ i->first ];
-    if( object )
-      object->setMovable( theIsMoveNodes );
-  }
-}
-
-void DependencyTree_View::onHierarchyType()
-{
-  myHierarchyDepth->setRange( 0, checkMaxLevelsNumber() );
-  if( myHierarchyDepth->value() > checkMaxLevelsNumber() )
-    myHierarchyDepth->setValue( checkMaxLevelsNumber() );
-
-  if( myHierarchyDepth->value() == 0 )
-    myLevelsNumber = myHierarchyDepth->maximum();
-  else
-    myLevelsNumber = myHierarchyDepth->value();
-
-  updateView();
-}
-void DependencyTree_View::updateView()
-{
-
-  if( !myIsUpdate )
-    return;
-
-         myLevelMap.clear();
-         myLevelsObject.clear();
-
-
-         std::map<std::string,DependencyTree_Object*>::const_iterator i;
-               for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
-                       DependencyTree_Object* object = myTreeMap[ i->first ];
-                       if( isItemAdded( object ) && object )
-                 removeItem( object );
-
-               }
-
-
-                  std::map<std::pair<DependencyTree_Object*,DependencyTree_Object*>, DependencyTree_Arrow* >::const_iterator j;
-                  for (j = Arrows.begin(); j != Arrows.end(); j++ ) {
-                    DependencyTree_Arrow* object = Arrows[ j->first ];
-                    if( isItemAdded( object ) && object )
-                      removeItem( object );
-                  }
-
-
-
-
-       iter = 0;
-  qthread = new DependencyTree_ComputeDlg_QThread(this);// = DependencyTree_ComputeDlg_QThread(this);// const_cast<DependencyTree_View*>(this) );
-  cancelAction->setVisible( true );
-  progressAction->setVisible(true);
-  startTimer(100); // millisecs
-  qthread->start();
+  getNewTreeModel( theUseSelectedObject, theUseOB );
+  onHierarchyType();
 }
 
-void DependencyTree_View::onRedrawTree()
+//=================================================================================
+// function : mouseMoveEvent()
+// purpose  : make some actions when mouse was moved
+//=================================================================================
+void DependencyTree_View::mouseMoveEvent( QMouseEvent *event )
 {
-  drawTree();
-  drawArrows();
-}
-void DependencyTree_View::onCancel()
-{
-  qthread->cancel();
-  cancelButton->setText( tr("CANCELING"));
-  cancelButton->setEnabled(false);
+  QGraphicsView::mouseMoveEvent( event );
+  ArrowsInfo::const_iterator i;
+  for( i = myArrows.begin(); i != myArrows.end(); i++ ) {
+    if( DependencyTree_Arrow* arrow = myArrows[ i->first ] )
+      arrow->update();
+  }
 }
 
-void DependencyTree_View::timerEvent(QTimerEvent *event)
+//=================================================================================
+// function : wheelEvent()
+// purpose  : add zoom action when wheel is spinning
+//=================================================================================
+void DependencyTree_View::wheelEvent( QWheelEvent* event )
 {
-  if ( !cancelButton->isChecked() ) // not yet cancelled
-   // progressBar->setValue( progressBar->maximum() * qthread.getMesh()->GetComputeProgress() );
-         progressBar->setValue( iter++ );
-
-  if(!myIsCompute || qthread->isFinished())
-  {
-         cancelAction->setVisible( false );
-         progressAction->setVisible(false);
-         cancelButton->setText( tr("CANCEL"));
-         cancelButton->setEnabled(true);
-  }
+  int inc = 10; // zoom coefficient
+  double cx = width() / 2;
+  double cy = height() / 2;
+  if( event->delta() > 0 )
+    zoom( cx, cy, cx + inc, cy + inc );
+  else
+    zoom( cx, cy, cx - inc, cy - inc );
 
-  event->accept();
+  QGraphicsView::wheelEvent( event );
 }
 
-void DependencyTree_View::closeEvent(QCloseEvent *event)
+//=================================================================================
+// function : getViewName()
+// purpose  : return the name of current view
+//=================================================================================
+QString DependencyTree_View::getViewName() const
 {
-  if(qthread->isRunning())
-  {
-      event->ignore();
-      return;
-    }
-  event->accept();
+  return tr( "DEPENDENCY_TREE" );
 }
 
-void DependencyTree_View::setIsCompute( bool theIsCompute )
+//=================================================================================
+// function : getObjectByEntry()
+// purpose  : return DependencyTree_Object by entry
+//=================================================================================
+DependencyTree_Object* DependencyTree_View::getObjectByEntry( const std::string& theEntry )
 {
-  myIsCompute = theIsCompute;
+  return myTreeMap[ theEntry ];
 }
 
+//=================================================================================
+// function : setHierarchyType()
+// purpose  : set hierarchy type of dependency tree
+//=================================================================================
 void DependencyTree_View::setHierarchyType( const int theType )
 {
   myIsUpdate = false;
@@ -626,14 +211,23 @@ void DependencyTree_View::setHierarchyType( const int theType )
     break;
   }
   myIsUpdate = true;
+  myLevelsNumber = checkMaxLevelsNumber();
   onHierarchyType();
 }
 
+//=================================================================================
+// function : setNodesMovable()
+// purpose  : set possibility to move nodes or not
+//=================================================================================
 void DependencyTree_View::setNodesMovable( const bool theIsMovable )
 {
   myNodesMovable->setChecked( theIsMovable );
 }
 
+//=================================================================================
+// function : setPrefBackgroundColor()
+// purpose  : set background color from preferences
+//=================================================================================
 void DependencyTree_View::setPrefBackgroundColor( const QColor& theColor )
 {
   if( isForegroundEnabled() )
@@ -645,158 +239,578 @@ void DependencyTree_View::setPrefBackgroundColor( const QColor& theColor )
     setBackgroundColor( theColor );
 }
 
+//=================================================================================
+// function : setNodeColor()
+// purpose  : set node color from preferences
+//=================================================================================
 void DependencyTree_View::setNodeColor( const QColor& theColor )
 {
-  std::map<std::string,DependencyTree_Object*>::const_iterator i;
-  for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
+  EntryObjectMap::const_iterator i;
+  fori = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
     DependencyTree_Object* object = myTreeMap[ i->first ];
     object->setColor( theColor );
   }
 }
 
+//=================================================================================
+// function : setMainNodeColor()
+// purpose  : set main node color from preferences
+//=================================================================================
 void DependencyTree_View::setMainNodeColor( const QColor& theColor )
 {
-         std::map<std::string,DependencyTree_Object*>::const_iterator i;
-  for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
+  EntryObjectMap::const_iterator i;
+  fori = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
     DependencyTree_Object* object = myTreeMap[ i->first ];
     object->setMainObjectColor( theColor );
   }
 }
 
+//=================================================================================
+// function : setUnpublishNodeColor()
+// purpose  : set unpublished node color from preferences
+//=================================================================================
+void DependencyTree_View::setUnpublishNodeColor( const QColor& theColor )
+{
+  EntryObjectMap::const_iterator i;
+  for( i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
+    DependencyTree_Object* object = myTreeMap[ i->first ];
+    object->setUnpublishObjectColor( theColor );
+  }
+}
+
+//=================================================================================
+// function : setSelectNodeColor()
+// purpose  : set selected node color from preferences
+//=================================================================================
 void DependencyTree_View::setSelectNodeColor( const QColor& theColor )
 {
-         std::map<std::string,DependencyTree_Object*>::const_iterator i;
-  for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
+  EntryObjectMap::const_iterator i;
+  fori = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
     DependencyTree_Object* object = myTreeMap[ i->first ];
     object->setSelectColor( theColor );
   }
 }
 
+//=================================================================================
+// function : setArrowColor()
+// purpose  : set arrow color from preferences
+//=================================================================================
 void DependencyTree_View::setArrowColor( const QColor& theColor )
 {
-  std::map<std::pair<DependencyTree_Object*,DependencyTree_Object*>, DependencyTree_Arrow* >::const_iterator j;
-  for (j = Arrows.begin(); j != Arrows.end(); j++ ) {
-    DependencyTree_Arrow* arrow = Arrows[ j->first ];
+  ArrowsInfo::const_iterator i;
+  for( i = myArrows.begin(); i != myArrows.end(); i++ ) {
+    DependencyTree_Arrow* arrow = myArrows[ i->first ];
     arrow->setColor( theColor );
   }
 }
 
+//=================================================================================
+// function : setHighlightArrowColor()
+// purpose  : set highlighted arrow color from preferences
+//=================================================================================
 void DependencyTree_View::setHighlightArrowColor( const QColor& theColor )
 {
-         std::map<std::pair<DependencyTree_Object*,DependencyTree_Object*>, DependencyTree_Arrow* >::const_iterator j;
-  for (j = Arrows.begin(); j != Arrows.end(); j++ ) {
-    DependencyTree_Arrow* arrow = Arrows[ j->first ];
+  ArrowsInfo::const_iterator i;
+  for( i = myArrows.begin(); i != myArrows.end(); i++ ) {
+    DependencyTree_Arrow* arrow = myArrows[ i->first ];
     arrow->setHighlightColor( theColor );
   }
 }
 
+//=================================================================================
+// function : setSelectArrowColor()
+// purpose  : set selected arrow color from preferences
+//=================================================================================
 void DependencyTree_View::setSelectArrowColor( const QColor& theColor )
 {
-         std::map<std::pair<DependencyTree_Object*,DependencyTree_Object*>, DependencyTree_Arrow* >::const_iterator j;
-  for (j = Arrows.begin(); j != Arrows.end(); j++ ) {
-    DependencyTree_Arrow* arrow = Arrows[ j->first ];
+  ArrowsInfo::const_iterator i;
+  for( i = myArrows.begin(); i != myArrows.end(); i++ ) {
+    DependencyTree_Arrow* arrow = myArrows[ i->first ];
     arrow->setSelectColor( theColor );
   }
 }
 
-//================================================================================
-//================================================================================
+//=================================================================================
+// function : onRebuildModel()
+// purpose  : slot for updating tree model using selected objects in viewer
+//=================================================================================
+void DependencyTree_View::onRebuildModel()
+{
+  updateModel( true, false );
+}
 
-DependencyTree_ComputeDlg_QThread::DependencyTree_ComputeDlg_QThread(DependencyTree_View* theView)
+//=================================================================================
+// function : resizeEvent()
+// purpose  : reimplemented from QGraphicsView::resizeEvent()
+//=================================================================================
+void DependencyTree_View::resizeEvent(QResizeEvent *event)
 {
-  myView = theView;
+  QPointF aCenter = mapToScene( event->oldSize().width()/2,
+                                event->oldSize().height()/2 );
+  QGraphicsView::resizeEvent( event );
+  centerOn( aCenter.x(),aCenter.y() );
 }
 
-void DependencyTree_ComputeDlg_QThread::run()
+//=================================================================================
+// function : onUpdateModel()
+// purpose  : slot for updating tree model for main objects in viewer
+//=================================================================================
+void DependencyTree_View::onUpdateModel()
 {
-  myView->setIsCompute( true );
-  myView->onRedrawTree();
+  updateModel( false );
 }
 
-bool DependencyTree_ComputeDlg_QThread::result()
+//=================================================================================
+// function : onMoveNodes()
+// purpose  : slot for setting the possibility to move nodes in viewer
+//=================================================================================
+void DependencyTree_View::onMoveNodes( bool theIsMoveNodes )
 {
+  EntryObjectMap::const_iterator i;
+  for( i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
+    DependencyTree_Object* object = myTreeMap[ i->first ];
+    if( object )
+      object->setMovable( theIsMoveNodes );
+  }
+}
 
+//=================================================================================
+// function : onHierarchyType()
+// purpose  : slot for setting the hierarchy type of tree
+//=================================================================================
+void DependencyTree_View::onHierarchyType()
+{
+  myHierarchyDepth->setRange( 0, checkMaxLevelsNumber() );
+  if( myHierarchyDepth->value() > checkMaxLevelsNumber() )
+    myHierarchyDepth->setValue( checkMaxLevelsNumber() );
+
+  if( myHierarchyDepth->value() == 0 )
+    myLevelsNumber = myHierarchyDepth->maximum();
+  else
+    myLevelsNumber = myHierarchyDepth->value();
+
+  updateView();
 }
 
-void DependencyTree_ComputeDlg_QThread::cancel()
+//=================================================================================
+// function : onPreferencesChanged()
+// purpose  : slot for changing tree parameters from preferences
+//=================================================================================
+void DependencyTree_View::onPreferenceChanged( const QString& section, const QString& param )
 {
-  myView->setIsCompute( false );
+  SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+
+  if( param == QString("dependency_tree_hierarchy_type") ) {
+    int hierarchyType = resMgr->integerValue( section, param, 0);
+    setHierarchyType( hierarchyType );
+  }
+  else if(  param == QString("dependency_tree_move_nodes") ) {
+    bool isNodesMovable = resMgr->booleanValue( section, param, true);
+    setNodesMovable( isNodesMovable );
+  }
+  else if(  param == QString("dependency_tree_background_color") ) {
+    QColor c = resMgr->colorValue( section, param, QColor( 255, 255, 255 ) );
+    setPrefBackgroundColor( c );
+  }
+  else if(  param == QString("dependency_tree_node_color") ) {
+    QColor c = resMgr->colorValue( section, param, QColor( 62, 180, 238 ) );
+    setNodeColor( c );
+  }
+  else if(  param == QString("dependency_tree_main_node_color") ) {
+    QColor c = resMgr->colorValue( section, param, QColor( 238, 90, 125 ) );
+    setMainNodeColor( c );
+  }
+  else if(  param == QString("dependency_tree_unpublish_node_color") ) {
+    QColor c = resMgr->colorValue( section, param, QColor( 255, 255, 255 ) );
+    setUnpublishNodeColor( c );
+  }
+  else if(  param == QString("dependency_tree_select_node_color") ) {
+    QColor c = resMgr->colorValue( section, param, QColor( 237, 243, 58 ) );
+    setSelectNodeColor( c );
+  }
+  else if(  param == QString("dependency_tree_arrow_color") ) {
+    QColor c = resMgr->colorValue( section, param, QColor( 0, 0, 130 ) );
+    setArrowColor( c );
+  }
+  else if(  param == QString("dependency_tree_highlight_arrow_color") ) {
+    QColor c = resMgr->colorValue( section, param, QColor( 0, 0, 255 ) );
+    setHighlightArrowColor( c );
+  }
+  else if(  param == QString("dependency_tree_select_arrow_color") ) {
+    QColor c = resMgr->colorValue( section, param, QColor( 255, 0, 0 ) );
+    setSelectArrowColor( c );
+  }
 }
 
-////================================================================================
-////================================================================================
-//
-//DependencyTree_ComputeDlg_QThreadQDialog::DependencyTree_ComputeDlg_QThreadQDialog(QWidget* parent,
-//             DependencyTree_View* theView)
-//  : QDialog(parent,
-//            Qt::WindowSystemMenuHint |
-//            Qt::WindowCloseButtonHint |
-//            Qt::Dialog |
-//            Qt::WindowMaximizeButtonHint),
-//    qthread( theView )
-//{
-//  // --
-//  setWindowTitle(tr("TITLE"));
-//  setMinimumWidth( 200 );
-//
-//  cancelButton = new QPushButton(tr("CANCEL"));
-//  cancelButton->setDefault(true);
-//  cancelButton->setCheckable(true);
-//
-//  progressBar  = new QProgressBar(this);
-//  progressBar->setMinimum( 0 );
-//  progressBar->setMaximum( 1000 );
-//
-//  QGridLayout* layout = new QGridLayout(this);
-//  layout->setMargin( 11 );
-//  layout->setSpacing( 6 );
-//  int row = 0;
-//  layout->addWidget(progressBar,  row++, 0, 1, 2);
-//  layout->addWidget(cancelButton, row++, 0, 1, 2);
-//  adjustSize();
-//  update();
-//
-//  connect(cancelButton, SIGNAL(clicked()), this, SLOT(onCancel()));
-//  // --
-//  startTimer(300); // millisecs
-//  qthread.start();
-//}
-//
-//bool DependencyTree_ComputeDlg_QThreadQDialog::result()
-//{
-//  return qthread.result();
-//}
-//
-//void DependencyTree_ComputeDlg_QThreadQDialog::onCancel()
-//{
-//  qthread.cancel();
-//  cancelButton->setText( tr("CANCELING"));
-//  cancelButton->setEnabled(false);
-//}
-//
-//void DependencyTree_ComputeDlg_QThreadQDialog::timerEvent(QTimerEvent *event)
-//{
-//  if ( !cancelButton->isChecked() ) // not yet cancelled
-//   // progressBar->setValue( progressBar->maximum() * qthread.getMesh()->GetComputeProgress() );
-//       progressBar->setValue( 10 );
-//
-//  if(qthread.isFinished())
-//  {
-//    close();
-//  }
-//
-//  event->accept();
-//}
-//
-//void DependencyTree_ComputeDlg_QThreadQDialog::closeEvent(QCloseEvent *event)
-//{
-//  if(qthread.isRunning())
-//  {
-//      event->ignore();
-//      return;
-//    }
-//  event->accept();
-//}
-//
+//=================================================================================
+// function : onRenameObject()
+// purpose  : update object name, having edited it in Object Browser
+//=================================================================================
+void DependencyTree_View::onRenameObject( const QString& theEntry )
+{
+  if( DependencyTree_Object* object = getObjectByEntry( theEntry.toStdString() ) )
+    object->updateName();
+}
 
+//=================================================================================
+// function : parseTree()
+// purpose  : parse created model to initialize all nodes and arrows
+//=================================================================================
+void DependencyTree_View::parseTree()
+{
+  GEOMUtils::TreeModel::const_iterator i;
+  for( i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
+    std::string objectEntry = i->first;
+    addNode( objectEntry );
+    parseTreeWard( i->second.first );
+    if((int) i->second.first.size() > myMaxUpwardLevelsNumber )
+      myMaxUpwardLevelsNumber = i->second.first.size();
+    parseTreeWard( i->second.second );
+    if((int) i->second.second.size() > myMaxDownwardLevelsNumber )
+      myMaxDownwardLevelsNumber = i->second.second.size();
+  }
+
+  for( i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
+    DependencyTree_Object* Main_object = myTreeMap[ i->first ];
+    if( i->second.first.size() > 0 ) {
+      GEOMUtils::LevelInfo Levelup = i->second.first.at(0);
+      GEOMUtils::LevelInfo::const_iterator node;
+      for( node = Levelup.begin(); node != Levelup.end(); node++ ) {
+        DependencyTree_Object* object = myTreeMap[ node->first ];
+        addArrow( object, Main_object );
+      }
+    }
+    parseTreeWardArrow( i->second.first );
+    parseTreeWardArrow( i->second.second );
+  }
+}
 
+//=================================================================================
+// function : parseTreeWard()
+// purpose  : parse tree ward to initialize all nodes of current ward
+//=================================================================================
+void DependencyTree_View::parseTreeWard( const GEOMUtils::LevelsList& theWard )
+{
+  int levelsNumber = theWard.size();
+  for( int level = 0; level < levelsNumber; level++ ) {
+    GEOMUtils::LevelInfo levelInfo = theWard[ level ];
+    GEOMUtils::LevelInfo::const_iterator node;
+    for( node = levelInfo.begin(); node != levelInfo.end(); node++ )
+      addNode( node->first );
+  }
+}
+
+//=================================================================================
+// function : parseTreeWardArrow()
+// purpose  : parse tree ward to initialize all arrows of current ward
+//=================================================================================
+void DependencyTree_View::parseTreeWardArrow( const GEOMUtils::LevelsList& theWard)
+{
+  for( size_t j = 0; j < theWard.size(); j++ ) {
+    GEOMUtils::LevelInfo Level = theWard.at(j);
+    GEOMUtils::LevelInfo::const_iterator node;
+    for( node = Level.begin(); node != Level.end(); node++ ) {
+      DependencyTree_Object* object = myTreeMap[ node->first ];
+      std::vector<std::string> Links = node->second;
+      for( size_t link = 0; link < Links.size(); link++ ) {
+        DependencyTree_Object* LinkObject = myTreeMap[ Links[ link ] ];
+        if( object && LinkObject )
+          addArrow( LinkObject, object );
+      }
+    }
+  }
+}
+
+//=================================================================================
+// function : addNode()
+// purpose  : add node to viewer
+//=================================================================================
+void DependencyTree_View::addNode( const std::string& theEntry )
+{
+  if( !myTreeMap[theEntry] )
+    myTreeMap[theEntry] = new DependencyTree_Object( theEntry );
+}
+
+//=================================================================================
+// function : addArrow()
+// purpose  : add arrow to viewer
+//=================================================================================
+void DependencyTree_View::addArrow( DependencyTree_Object* startItem, DependencyTree_Object* endItem )
+{
+  bool isFind = false;
+
+  ArrowsInfo::const_iterator i;
+  for( i = myArrows.begin(); i != myArrows.end(); i++ ) {
+    DependencyTree_Arrow* arrow = i->second;
+    if( arrow->getStartItem() == startItem && arrow->getEndItem() == endItem )
+      isFind = true;
+    else if( arrow->getStartItem() == endItem && arrow->getEndItem() == startItem ) {
+      arrow->setIsBiLink( true );
+      isFind = true;
+    }
+  }
+  if( !isFind ) {
+    DependencyTree_Arrow *arrow = new DependencyTree_Arrow( startItem, endItem );
+    myArrows[ std::pair<DependencyTree_Object*,DependencyTree_Object*>( startItem, endItem ) ] = arrow;
+  }
+}
+
+//=================================================================================
+// function : drawTree()
+// purpose  : redraw dependency tree using existing model
+//=================================================================================
+void DependencyTree_View::drawTree()
+{
+  clearView( false );
+  clearSelected();
+
+  // draw nodes on scene
+  std::map< std::string, int > entryLevelMap;
+  std::map< int, std::vector< std::string > > levelObjects;
+  int currentLevel;
+  int horDistance, verDistance;
+  GEOMUtils::TreeModel::const_reverse_iterator i;
+  for( i = myTreeModel.rbegin(); i != myTreeModel.rend(); i++ ) {
+    currentLevel = 0;
+    std::string objectEntry = i->first;
+    DependencyTree_Object* objectItem = myTreeMap[ objectEntry ];
+    horDistance = 100 + int( objectItem->boundingRect().width() );
+    verDistance = 3 * int( objectItem->boundingRect().height() );
+    if( isItemAdded( objectItem ) )
+      currentLevel = entryLevelMap[ objectEntry ];
+    else {
+      addItem( objectItem );
+      objectItem->unselect();
+      entryLevelMap[ objectEntry ] = currentLevel;
+      levelObjects[ currentLevel ].push_back( objectEntry );
+    }
+    objectItem->setIsMainObject( true );
+
+    if( myDisplayAscendants->isChecked() )
+      drawWard( i->second.first, entryLevelMap, levelObjects, currentLevel, -1 );
+    if( myDisplayDescendants->isChecked() )
+      drawWard( i->second.second, entryLevelMap, levelObjects, currentLevel, 1 );
+  }
+
+  std::map< int, std::vector< std::string > >::const_iterator level;
+  for( level = levelObjects.begin(); level != levelObjects.end(); level++ ) {
+    int step = -horDistance * ( int(level->second.size()) - 1 ) / 2;
+    for( size_t objIter = 0; objIter < level->second.size(); objIter++ ) {
+      DependencyTree_Object* anObject = myTreeMap[ level->second.at( objIter ) ];
+      anObject->setPos( step, verDistance * level->first );
+      step += horDistance;
+    }
+  }
+
+  // draw arrows on scene
+  GEOMUtils::TreeModel::const_iterator j;
+  for( j = myTreeModel.begin(); j != myTreeModel.end(); j++ ) {
+    DependencyTree_Object* Main_object = myTreeMap[ j->first ];
+    if( j->second.first.size() > 0 ) {
+      GEOMUtils::LevelInfo Levelup = j->second.first.at(0);
+      if( myDisplayAscendants ->isChecked() ) {
+        GEOMUtils::LevelInfo::const_iterator node;
+        for( node = Levelup.begin(); node != Levelup.end(); node++ ) {
+          DependencyTree_Object* object = myTreeMap[ node->first ];
+          DependencyTree_Arrow* arrow =
+            myArrows[ std::pair<DependencyTree_Object*,DependencyTree_Object*>( object, Main_object )];
+          if( arrow && !isItemAdded( arrow ) )
+            addItem( arrow );
+        }
+      }
+    }
+    if( myDisplayAscendants->isChecked() )
+      drawWardArrows( j->second.first );
+    if( myDisplayDescendants->isChecked() )
+      drawWardArrows( j->second.second );
+  }
+}
+
+//=================================================================================
+// function : drawWard()
+// purpose  : draw nodes of dependency tree ward (ascendant or descendant)
+//=================================================================================
+void DependencyTree_View::drawWard( const GEOMUtils::LevelsList& theWard,
+                                    std::map< std::string, int >& theEntryLevelMap,
+                                    std::map< int, std::vector< std::string > >& theLevelObjects,
+                                    int theCurrentLevel, const int theLevelStep )
+{
+  for( int level = 0, size = theWard.size(); level < size; level++ ) {
+    if( level >= myLevelsNumber )
+      return;
+    theCurrentLevel += theLevelStep;
+    GEOMUtils::LevelInfo levelInfo = theWard.at( level );
+    GEOMUtils::LevelInfo::const_iterator node;
+    for( node = levelInfo.begin(); node != levelInfo.end(); node++ ) {
+      DependencyTree_Object* object = myTreeMap[ node->first ];
+      if( object && !isItemAdded( object ) ) {
+        addItem( object );
+        object->unselect();
+        theEntryLevelMap[ node->first ] = theCurrentLevel;
+        theLevelObjects[ theCurrentLevel ].push_back( node->first );
+      }
+    }
+  }
+}
+
+//=================================================================================
+// function : drawWardArrows()
+// purpose  : draw arrows of dependency tree ward (ascendant or descendant)
+//=================================================================================
+void DependencyTree_View::drawWardArrows( const GEOMUtils::LevelsList& theWard )
+{
+  for( int j = 0, size = theWard.size(); j < size; j++ ) {
+    if( j >= myLevelsNumber )
+      break;
+    GEOMUtils::LevelInfo Level = theWard.at(j);
+    GEOMUtils::LevelInfo::const_iterator node;
+    for( node = Level.begin(); node != Level.end(); node++ ) {
+      DependencyTree_Object* object = myTreeMap[ node->first ];
+      GEOMUtils::NodeLinks Links = node->second;
+      for( size_t link = 0; link < Links.size(); link++ ) {
+        DependencyTree_Object* LinkObject = myTreeMap[ Links[ link ] ];
+        if( isItemAdded( object ) && isItemAdded( LinkObject ) ) {
+          DependencyTree_Arrow* arrow = myArrows[ std::pair<DependencyTree_Object*,DependencyTree_Object*>( LinkObject, object ) ];
+          if( arrow && !isItemAdded( arrow ) )
+            addItem( arrow );
+        }
+      }
+    }
+  }
+}
+
+//=================================================================================
+// function : updateView()
+// purpose  : update viewer using created dependency tree model
+//=================================================================================
+void DependencyTree_View::updateView()
+{
+  if( !myIsUpdate )
+    return;
+
+  drawTree();
+  fitWindow();
+}
+
+//=================================================================================
+// function : clearView()
+// purpose  : clear viewer and initialize all variables
+//=================================================================================
+void DependencyTree_View::clearView( bool isClearModel )
+{
+  EntryObjectMap::const_iterator objectIter;
+  for( objectIter = myTreeMap.begin(); objectIter != myTreeMap.end(); objectIter++ ) {
+    if( DependencyTree_Object* object = objectIter->second )
+      if( isItemAdded( object ) )
+        removeItem( object );
+  }
+
+  ArrowsInfo::const_iterator arrowIter;
+  for( arrowIter = myArrows.begin(); arrowIter != myArrows.end(); arrowIter++ ) {
+    if( DependencyTree_Arrow* arrow = arrowIter->second )
+      if( isItemAdded( arrow ) )
+        removeItem( arrow );
+  }
+
+  if( isClearModel ) {
+    EntryObjectMap::const_iterator objectIter;
+    for( objectIter = myTreeMap.begin(); objectIter != myTreeMap.end(); objectIter++ ) {
+      if( DependencyTree_Object* object = objectIter->second )
+        delete object;
+    }
+
+    ArrowsInfo::const_iterator arrowIter;
+    for( arrowIter = myArrows.begin(); arrowIter != myArrows.end(); arrowIter++ ) {
+      if( DependencyTree_Arrow* arrow = arrowIter->second )
+        delete arrow;
+    }
+    myTreeMap.clear();
+    myArrows.clear();
+    myTreeModel.clear();
+    myLevelsNumber = 0;
+    myMaxDownwardLevelsNumber = 0;
+    myMaxUpwardLevelsNumber = 0;
+    myIsUpdate = true;
+  }
+}
+
+//=================================================================================
+// function : fitWindow()
+// purpose  : scale the window considering a size of scene
+//=================================================================================
+void DependencyTree_View::fitWindow()
+{
+  int sizeFactor = 4;
+  if( objectsBoundingRect(true).width() > sizeFactor*size().width() ||
+      objectsBoundingRect(true).height() > sizeFactor*size().width() ) {
+    QRectF aRect = QRectF( -sizeFactor*size().width()/2, -sizeFactor*size().height()/2,
+                           sizeFactor*size().width(), sizeFactor*size().height() );
+    fitInView( aRect, Qt::KeepAspectRatio );
+  }
+  else
+    fitAll();
+}
+
+//=================================================================================
+// function : getNewTreeModel()
+// purpose  : get dependency tree model from engine
+//=================================================================================
+void DependencyTree_View::getNewTreeModel( bool theUseSelectedObject, bool theUseOB )
+{
+  GEOM::string_array_var objectsEntry = new GEOM::string_array();
+  int iter = 0;
+
+  if( theUseSelectedObject ) {
+    if( theUseOB ) {
+      SALOME_ListIO mainObjects;
+      mySelectionMgr->selectedObjects( mainObjects );
+      // create a list of selected object entry
+      objectsEntry->length( mainObjects.Extent() );
+      for ( SALOME_ListIteratorOfListIO It( mainObjects ); It.More(); It.Next(), iter++ ) {
+        Handle( SALOME_InteractiveObject ) io = It.Value();
+        if( !io->hasEntry() )
+          continue;
+        GEOM::GEOM_Object_var geomObject = GEOM::GEOM_Object::_nil();
+        geomObject = GEOMBase::ConvertIOinGEOMObject( io );
+        QString entry = geomObject->GetEntry();
+        objectsEntry[ iter ] = entry.toUtf8().constData();
+      }
+    }
+    else {
+      objectsEntry->length( nbSelected() );
+      for( initSelected(); moreSelected(); nextSelected(), iter++ )
+        if( DependencyTree_Object* treeObject = dynamic_cast<DependencyTree_Object*>( selectedObject() ) )
+          objectsEntry[ iter ] = treeObject->getEntry().c_str();
+    }
+    myMainEntries = objectsEntry;
+  }
+
+  // get string which describes dependency tree structure
+  SALOMEDS::TMPFile_var SeqFile =
+    GeometryGUI::GetGeomGen()->GetDependencyTree( myMainEntries );
+  char* buf = (char*)&SeqFile[0];
+
+  clearView( true );
+  mySelectionMgr->clearSelected();
+
+  // get dependency tree structure
+  GEOMUtils::ConvertStringToTree( buf, myTreeModel );
+
+  parseTree();
+}
+
+//=================================================================================
+// function : checkMaxLevelsNumber()
+// purpose  : calculate max levels number
+//=================================================================================
+int DependencyTree_View::checkMaxLevelsNumber()
+{
+  if( myDisplayAscendants->isChecked() && myDisplayDescendants->isChecked() )
+    return myMaxUpwardLevelsNumber > myMaxDownwardLevelsNumber ?
+           myMaxUpwardLevelsNumber : myMaxDownwardLevelsNumber;
+  else if( myDisplayAscendants ->isChecked() )
+    return myMaxUpwardLevelsNumber;
+  else if( myDisplayDescendants->isChecked() )
+    return  myMaxDownwardLevelsNumber;
+  return 0;
+}