Salome HOME
Merge changes for HYDRO project : hydro/imps_2017_salome_84 branch.
[modules/geom.git] / src / DependencyTree / DependencyTree_View.cxx
index 5d1323278c0f72763511a94e8249c568aa623c41..2164574db669c68983c5514d8d984bb2765872aa 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2014-2016  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_Study.h>
 #include <QtxActionToolMgr.h>
 #include <LightApp_SelectionMgr.h>
-#include <SALOME_ListIteratorOfListIO.hxx>
+#include <SALOME_ListIO.hxx>
+
+// GEOM includes
+#include <GEOMBase.h>
 
 // Qt includes
-#include <QCloseEvent>
 #include <QApplication>
-#include <QGraphicsScene>
-
-#define DRAW_EVENT  ( QEvent::User + 1 )
-
-#include <iostream>
+#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(false),
-myIsUpdate( true ),
-myTotalCost(0),
-myComputedCost(0)
+myIsUpdate( true )
 {
   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
   if ( !app ) return;
@@ -61,33 +54,36 @@ myComputedCost(0)
   mySelectionMgr = app->selectionMgr();
   if ( !mySelectionMgr ) return;
 
+  myMainEntries = new GEOM::string_array();
+
   getNewTreeModel();
 }
 
 DependencyTree_View::~DependencyTree_View()
 {
+  clearView( true );
 }
 
+//=================================================================================
+// function : init()
+// purpose  : this method is obligatory for initialize view frame actions
+//=================================================================================
 void DependencyTree_View::init( GraphicsView_ViewFrame* theViewFrame )
 {
-  qthread = new DependencyTree_ComputeDlg_QThread( this );
-
-  SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
-
   myNodesMovable = new QCheckBox( tr( "MOVE_NODES" ) );
   QWidgetAction* nodesMovableAction = new QWidgetAction( theViewFrame );
   nodesMovableAction->setDefaultWidget( myNodesMovable );
 
   myDisplayAscendants = new QCheckBox( tr( "DISPLAY_ASCENDANTS" ) );
-  QWidgetAction* ShowParentsAction = new QWidgetAction( theViewFrame );
-  ShowParentsAction->setDefaultWidget( myDisplayAscendants  );
+  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);
+  QWidgetAction* hierarchyDepthLabelAction = new QWidgetAction( theViewFrame );
   hierarchyDepthLabelAction->setDefaultWidget( hierarchyDepthLabel );
 
   myLevelsNumber = checkMaxLevelsNumber();
@@ -103,198 +99,112 @@ void DependencyTree_View::init( GraphicsView_ViewFrame* theViewFrame )
   QWidgetAction* updateAction = new QWidgetAction( theViewFrame );
   updateAction->setDefaultWidget( updateButton );
 
-  QPushButton* cancelButton = new QPushButton( tr( "CANCEL" ) );
-  cancelButton->setCheckable( true );
-  cancelAction = new QWidgetAction( theViewFrame );
-  cancelAction->setDefaultWidget( cancelButton );
-  cancelAction->setVisible( false );
-
-  QProgressBar* progressBar = new QProgressBar( this );
-  progressBar->setMinimum( 0 );
-  progressBar->setMaximum( 100 );
-  progressBar->setFixedWidth( 100 );
-  progressAction = new QWidgetAction( theViewFrame );
-  progressAction->setDefaultWidget( progressBar );
-  progressAction->setVisible( false );
-
   QAction* separator1 = theViewFrame->toolMgr()->separator( false );
   QAction* separator2 = theViewFrame->toolMgr()->separator( false );
 
   theViewFrame->toolMgr()->append( separator1, theViewFrame->getToolBarId() );
-  theViewFrame->toolMgr()->append( nodesMovableAction, theViewFrame->getToolBarId() );
   theViewFrame->toolMgr()->append( hierarchyDepthLabelAction, theViewFrame->getToolBarId() );
   theViewFrame->toolMgr()->append( hierarchyDepthAction, theViewFrame->getToolBarId() );
-  theViewFrame->toolMgr()->append( ShowParentsAction, theViewFrame->getToolBarId() );
-  theViewFrame->toolMgr()->append( ShowChildrenAction, 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() );
-  theViewFrame->toolMgr()->append( progressAction, theViewFrame->getToolBarId() );
-  theViewFrame->toolMgr()->append( cancelAction, 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( onUpdateModel( false ) ) );
-  connect( cancelButton, SIGNAL( clicked() ), this, SLOT( onCancel() ) );
-
-  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 ) );
-}
+  connect( updateButton, SIGNAL( clicked() ), this, SLOT( onUpdateModel() ) );
 
-void DependencyTree_View::updateModel( bool getSelectedObjects )
-{
-  getNewTreeModel( getSelectedObjects );
+  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::drawTree()
+//=================================================================================
+// function : updateModel()
+// purpose  : run all stage of dependency tree creation
+//=================================================================================
+void DependencyTree_View::updateModel( bool theUseSelectedObject, bool theUseOB )
 {
-  myComputedCost = 0;
-  calcTotalCost();
-  std::cout << "\n\n\n TOTAL COST = " << myTotalCost << std::endl;
-
-       if( !myIsCompute )
-    return;
-
-  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++ ) {
-       if( !myIsCompute )
-      return;
-    currentLevel = 0;
-    myComputedCost++;
-    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 {
-      addNewItem( 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 * ( level->second.size() - 1 ) / 2;
-    std::cout<<"\n\n LEVEL = " << level->first << std::endl;
-    for( int objIter = 0; objIter < level->second.size(); objIter++ ) {
-        std::cout << level->second.at( objIter ) << ", ";
-        DependencyTree_Object* anObject = myTreeMap[ level->second.at( objIter ) ];
-        anObject->setPos( step, verDistance * level->first );
-        step += horDistance;
-    }
-  }
+  getNewTreeModel( theUseSelectedObject, theUseOB );
+  onHierarchyType();
+}
 
-  // 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*>(Main_object, object)];
-          if( arrow && !isItemAdded( arrow) )
-            addNewItem( arrow );
-        }
-      }
-    }
-    if( myDisplayAscendants->isChecked() )
-      drawWardArrows( j->second.first );
-    if( myDisplayDescendants->isChecked() )
-      drawWardArrows( j->second.second );
+//=================================================================================
+// function : mouseMoveEvent()
+// purpose  : make some actions when mouse was moved
+//=================================================================================
+void DependencyTree_View::mouseMoveEvent( QMouseEvent *event )
+{
+  QGraphicsView::mouseMoveEvent( event );
+  ArrowsInfo::const_iterator i;
+  for( i = myArrows.begin(); i != myArrows.end(); i++ ) {
+    if( DependencyTree_Arrow* arrow = myArrows[ i->first ] )
+      arrow->update();
   }
-  std::cout << "\n ComputedCost = " << myComputedCost << std::endl;
-
 }
 
-int DependencyTree_View::select( const QRectF& theRect, bool theIsAppend )
+//=================================================================================
+// function : wheelEvent()
+// purpose  : add zoom action when wheel is spinning
+//=================================================================================
+void DependencyTree_View::wheelEvent( QWheelEvent* event )
 {
-  GraphicsView_ViewPort::select( theRect, theIsAppend );
-
-  mySelectionMgr->clearSelected();
+  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 );
 
-  // get selection
-  SALOME_ListIO listIO;
-  int StudyId = myStudy->StudyId();
-  for( initSelected(); moreSelected(); nextSelected() )
-    if( DependencyTree_Object* treeObject = dynamic_cast<DependencyTree_Object*>( selectedObject() ) ) {
-      CORBA::String_var studyEntry = treeObject->getGeomObject()->GetStudyEntry();
-      Handle(SALOME_InteractiveObject) tmpIO =
-        new SALOME_InteractiveObject( studyEntry.in(), "GEOM", "TEMP_IO");
-      listIO.Append( tmpIO );
-    }
-  mySelectionMgr->setSelectedObjects( listIO, true );
+  QGraphicsView::wheelEvent( event );
 }
 
-void DependencyTree_View::customEvent( QEvent * event )
+//=================================================================================
+// function : getViewName()
+// purpose  : return the name of current view
+//=================================================================================
+QString DependencyTree_View::getViewName() const
 {
-  if( event->type() == DRAW_EVENT ) {
-
-    QPushButton* cancelButton = dynamic_cast<QPushButton*>( cancelAction->defaultWidget() );
-    QProgressBar* progressBar = dynamic_cast<QProgressBar*>( progressAction->defaultWidget() );
-
-    if ( !cancelButton->isChecked() )
-      progressBar->setValue( progressBar->maximum() * getComputeProgress() );
-
-    std::cout << "\n\n *** qthread->isFinished() = " << qthread->isFinished() << std::endl;
-    if( !myIsCompute || qthread->isFinished() ) {
-      changeWidgetState( false );
-      cancelButton->setChecked( false );
-      progressBar->setValue(0);
-      fitAll();
-      QApplication::removePostedEvents( this, ( QEvent::Type )DRAW_EVENT );
-    }
-  }
-  event->accept();
+  return tr( "DEPENDENCY_TREE" );
 }
 
-void DependencyTree_View::addNewItem( QGraphicsItem* theObject )
+//=================================================================================
+// function : getStudyId()
+// purpose  : return Id of current study
+//=================================================================================
+int DependencyTree_View::getStudyId() const
 {
-  qthread->sleepDraw();
-  if( theObject )
-    addItem( theObject );
-  SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
-  QApplication::postEvent( this, new QEvent( ( QEvent::Type )DRAW_EVENT ) );
+  return myStudy->StudyId();
 }
 
-void DependencyTree_View::mouseMoveEvent(QMouseEvent *event)
+//=================================================================================
+// function : getObjectByEntry()
+// purpose  : return DependencyTree_Object by entry
+//=================================================================================
+DependencyTree_Object* DependencyTree_View::getObjectByEntry( const std::string& theEntry )
 {
-  QGraphicsView::mouseMoveEvent( event );
-  ArrowsInfo::const_iterator j;
-  for (j = myArrows.begin(); j != myArrows.end(); j++ ) {
-    DependencyTree_Arrow* arrow = myArrows[ j->first ];
-    arrow->update();
-  }
+  return myTreeMap[ theEntry ];
 }
 
+//=================================================================================
+// function : setHierarchyType()
+// purpose  : set hierarchy type of dependency tree
+//=================================================================================
 void DependencyTree_View::setHierarchyType( const int theType )
 {
   myIsUpdate = false;
@@ -313,17 +223,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() )
@@ -335,127 +251,145 @@ void DependencyTree_View::setPrefBackgroundColor( const QColor& theColor )
     setBackgroundColor( theColor );
 }
 
+//=================================================================================
+// function : setNodeColor()
+// purpose  : set node color from preferences
+//=================================================================================
 void DependencyTree_View::setNodeColor( const QColor& theColor )
 {
   EntryObjectMap::const_iterator i;
-  for (i = myTreeMap.begin(); i != myTreeMap.end(); 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 )
 {
   EntryObjectMap::const_iterator i;
-  for (i = myTreeMap.begin(); i != myTreeMap.end(); 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 )
 {
   EntryObjectMap::const_iterator i;
-  for (i = myTreeMap.begin(); i != myTreeMap.end(); 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 )
 {
-  ArrowsInfo::const_iterator j;
-  for (j = myArrows.begin(); j != myArrows.end(); j++ ) {
-    DependencyTree_Arrow* arrow = myArrows[ 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 )
 {
-       ArrowsInfo::const_iterator j;
-  for (j = myArrows.begin(); j != myArrows.end(); j++ ) {
-    DependencyTree_Arrow* arrow = myArrows[ 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 )
 {
-       ArrowsInfo::const_iterator j;
-  for (j = myArrows.begin(); j != myArrows.end(); j++ ) {
-    DependencyTree_Arrow* arrow = myArrows[ j->first ];
+  ArrowsInfo::const_iterator i;
+  for( i = myArrows.begin(); i != myArrows.end(); i++ ) {
+    DependencyTree_Arrow* arrow = myArrows[ i->first ];
     arrow->setSelectColor( theColor );
   }
 }
 
-void DependencyTree_View::setIsCompute( bool theIsCompute )
+//=================================================================================
+// function : onRebuildModel()
+// purpose  : slot for updating tree model using selected objects in viewer
+//=================================================================================
+void DependencyTree_View::onRebuildModel()
 {
-  myIsCompute = theIsCompute;
+  updateModel( true, false );
 }
 
-bool DependencyTree_View::getIsCompute()
+//=================================================================================
+// function : resizeEvent()
+// purpose  : reimplemented from QGraphicsView::resizeEvent()
+//=================================================================================
+void DependencyTree_View::resizeEvent(QResizeEvent *event)
 {
-  return myIsCompute;
+  QPointF aCenter = mapToScene( event->oldSize().width()/2,
+                                event->oldSize().height()/2 );
+  QGraphicsView::resizeEvent( event );
+  centerOn( aCenter.x(),aCenter.y() );
 }
 
-//void DependencyTree_View::timerEvent(QTimerEvent *event)
-//{
-//  QPushButton* cancelButton = dynamic_cast<QPushButton*>( cancelAction->defaultWidget() );
-//  QProgressBar* progressBar = dynamic_cast<QProgressBar*>( progressAction->defaultWidget() );
-//
-//  std::cout << "TIMER! " << std::endl;
-//  if ( !cancelButton->isChecked() )
-//    progressBar->setValue( progressBar->maximum() * getComputeProgress() );
-//
-//  if( !myIsCompute || qthread->isFinished() ) {
-//    changeWidgetState( false );
-//    killTimer( myTimer );
-//    cancelButton->setChecked( false );
-//    progressBar->setValue(0);
-//  }
-//  event->accept();
-//}
-
-void DependencyTree_View::closeEvent( QCloseEvent* event )
-{
-  if(qthread->isRunning())
-  {
-    event->ignore();
-    return;
-  }
-  event->accept();
-}
-
-void DependencyTree_View::onUpdateModel( bool getSelectedObjects )
+//=================================================================================
+// function : onUpdateModel()
+// purpose  : slot for updating tree model for main objects in viewer
+//=================================================================================
+void DependencyTree_View::onUpdateModel()
 {
-  updateModel( getSelectedObjects );
-}
-
-void DependencyTree_View::updateView()
-{
-  if( !myIsUpdate )
-    return;
-
-  changeWidgetState( true );
-
-  qthread->start();
-
-
-
-
+  updateModel( false );
 }
 
+//=================================================================================
+// 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++ ) {
+  fori = 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() );
@@ -470,119 +404,259 @@ void DependencyTree_View::onHierarchyType()
   updateView();
 }
 
-void DependencyTree_View::onCancel()
+//=================================================================================
+// function : onPreferencesChanged()
+// purpose  : slot for changing tree parameters from preferences
+//=================================================================================
+void DependencyTree_View::onPreferenceChanged( const QString& section, const QString& param )
 {
-  qthread->cancel();
-  //qthread->deleteLater();
-}
+  SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
 
-void DependencyTree_View::addNode( const std::string& theEntry )
-{
-  if( !myTreeMap[theEntry] )
-    myTreeMap[theEntry] = new DependencyTree_Object( theEntry );
+  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 );
+  }
 }
 
-void DependencyTree_View::addArrow( DependencyTree_Object *startItem, DependencyTree_Object *endItem )
+//=================================================================================
+// function : onRenameObject()
+// purpose  : update object name, having edited it in Object Browser
+//=================================================================================
+void DependencyTree_View::onRenameObject( const QString& theEntry )
 {
-  bool isFind = false;
-
-  std::cout << "   " << startItem->getEntry() << "   " << endItem->getEntry() << std::endl;
-  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;
-      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);
-           myArrows[std::pair<DependencyTree_Object*,DependencyTree_Object*>( startItem, endItem )] = arrow;
-           std::cout<<" addArrow " << std::endl;
-  }
+  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++ ) {
+  fori = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
     std::string objectEntry = i->first;
     addNode( objectEntry );
     parseTreeWard( i->second.first );
-    if( i->second.first.size() > myMaxUpwardLevelsNumber )
+    if((int) i->second.first.size() > myMaxUpwardLevelsNumber )
       myMaxUpwardLevelsNumber = i->second.first.size();
     parseTreeWard( i->second.second );
-    if( i->second.second.size() > myMaxDownwardLevelsNumber )
+    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];
+  fori = 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( Main_object, object );
+      fornode = Levelup.begin(); node != Levelup.end(); node++ ) {
+        DependencyTree_Object* object = myTreeMap[ node->first ];
+        addArrow( object, Main_object );
       }
     }
     parseTreeWardArrow( i->second.first );
     parseTreeWardArrow( i->second.second );
   }
-
-
 }
-void DependencyTree_View::parseTreeWard(const GEOMUtils::LevelsList theWard)
+
+//=================================================================================
+// 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++ ) {
+    for( node = levelInfo.begin(); node != levelInfo.end(); node++ )
       addNode( node->first );
-    }
   }
 }
-void DependencyTree_View::parseTreeWardArrow(const GEOMUtils::LevelsList theWard)
+
+//=================================================================================
+// function : parseTreeWardArrow()
+// purpose  : parse tree ward to initialize all arrows of current ward
+//=================================================================================
+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];
+  for( size_t j = 0; j < theWard.size(); j++ ) {
+    GEOMUtils::LevelInfo Level = theWard.at(j);
+    GEOMUtils::LevelInfo::const_iterator node;
+    fornode = 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]];
+      for( size_t link = 0; link < Links.size(); link++ ) {
+        DependencyTree_Object* LinkObject = myTreeMap[ Links[ link ] ];
         if( object && LinkObject )
-          addArrow( 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; level < theWard.size(); level++ ) {
-    if( level >= myLevelsNumber || !myIsCompute )
+  for( int level = 0, size = theWard.size(); level < size; level++ ) {
+    if( level >= myLevelsNumber )
       return;
-    myComputedCost++;
     theCurrentLevel += theLevelStep;
     GEOMUtils::LevelInfo levelInfo = theWard.at( level );
     GEOMUtils::LevelInfo::const_iterator node;
-    for (node = levelInfo.begin(); node != levelInfo.end(); node++ ) {
+    fornode = levelInfo.begin(); node != levelInfo.end(); node++ ) {
       DependencyTree_Object* object = myTreeMap[ node->first ];
-      if( !isItemAdded( object ) ) {
-        addNewItem( object );
+      if( object && !isItemAdded( object ) ) {
+        addItem( object );
         object->unselect();
         theEntryLevelMap[ node->first ] = theCurrentLevel;
         theLevelObjects[ theCurrentLevel ].push_back( node->first );
@@ -591,154 +665,164 @@ void DependencyTree_View::drawWard( const GEOMUtils::LevelsList& theWard,
   }
 }
 
-void DependencyTree_View::drawWardArrows( GEOMUtils::LevelsList theWard )
+//=================================================================================
+// function : drawWardArrows()
+// purpose  : draw arrows of dependency tree ward (ascendant or descendant)
+//=================================================================================
+void DependencyTree_View::drawWardArrows( const GEOMUtils::LevelsList& theWard )
 {
-  for(int j = 0; j < theWard.size(); j++ ) {
-    if( j >= myLevelsNumber || !myIsCompute )
+  for( int j = 0, size = theWard.size(); j < size; j++ ) {
+    if( j >= myLevelsNumber )
       break;
-    myComputedCost++;
     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];
+    fornode = 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]];
+      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*>(object, LinkObject)];
-          if( arrow && !isItemAdded( arrow) )
-            addNewItem( arrow );
+          DependencyTree_Arrow* arrow = myArrows[ std::pair<DependencyTree_Object*,DependencyTree_Object*>( LinkObject, object ) ];
+          if( arrow && !isItemAdded( arrow ) )
+            addItem( arrow );
         }
       }
     }
   }
 }
 
-void DependencyTree_View::getNewTreeModel( bool getSelectedObjects )
+//=================================================================================
+// function : updateView()
+// purpose  : update viewer using created dependency tree model
+//=================================================================================
+void DependencyTree_View::updateView()
 {
-  clearView( true );
-
-  if( getSelectedObjects )
-    mySelectionMgr->selectedObjects( myMainObjects );
-
-  // create a list of selected object entry
-  GEOM::string_array_var objectsEntry = new GEOM::string_array();
-  objectsEntry->length( myMainObjects.Extent());
-  int iter = 0;
-  for ( SALOME_ListIteratorOfListIO It( myMainObjects ); It.More(); It.Next(), iter++ ) {
-    Handle( SALOME_InteractiveObject ) io = It.Value();
-    GEOM::GEOM_Object_var geomObject = GEOM::GEOM_Object::_nil();
-    geomObject = GEOMBase::ConvertIOinGEOMObject( io );
-    QString entry = geomObject->GetEntry();
-    objectsEntry[ iter ] = entry.toLatin1().constData();
-  }
-
-  // get string which describes dependency tree structure
-  SALOMEDS::TMPFile_var SeqFile =
-    GeometryGUI::GetGeomGen()->GetDependencyTree( myStudy, objectsEntry );
-  char* buf = (char*) &SeqFile[0];
-
-  std::cout << "\n\n\n\n\n TREE = " << buf << std::endl;
-
-  // get dependency tree structure
-  GEOMUtils::ConvertStringToTree( buf, myTreeModel );
-
-  mySelectionMgr->clearSelected();
-
-  parseTree();
+  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++ ) {
-    DependencyTree_Object* object = objectIter->second;
-    if( object )
+    if( DependencyTree_Object* object = objectIter->second )
       if( isItemAdded( object ) )
-      removeItem( object );
+        removeItem( object );
   }
 
   ArrowsInfo::const_iterator arrowIter;
   for( arrowIter = myArrows.begin(); arrowIter != myArrows.end(); arrowIter++ ) {
-    DependencyTree_Arrow* object = arrowIter->second;
-    if( object )
-      if( isItemAdded( object ) )
-      removeItem( object );
+    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;
-    myLevelsNumber = 0;
-    myIsCompute = false;
     myIsUpdate = true;
   }
 }
 
-int DependencyTree_View::checkMaxLevelsNumber()
+//=================================================================================
+// function : fitWindow()
+// purpose  : scale the window considering a size of scene
+//=================================================================================
+void DependencyTree_View::fitWindow()
 {
-  if( myDisplayAscendants->isChecked() && myDisplayDescendants->isChecked() )
-    return myMaxUpwardLevelsNumber>myMaxDownwardLevelsNumber?myMaxUpwardLevelsNumber:myMaxDownwardLevelsNumber;
-  else if( myDisplayAscendants ->isChecked() )
-    return myMaxUpwardLevelsNumber;
-  else if( myDisplayDescendants->isChecked() )
-    return  myMaxDownwardLevelsNumber;
-}
-
-void DependencyTree_View::calcTotalCost()
-{
-  myTotalCost = myTreeModel.size();
-  GEOMUtils::TreeModel::const_iterator i;
-  for( i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
-    if( myDisplayAscendants->isChecked() )
-      myTotalCost += 2*( myLevelsNumber < i->second.first.size() ? myLevelsNumber : i->second.first.size() );
-    if( myDisplayDescendants->isChecked() )
-      myTotalCost += 2*( myLevelsNumber < i->second.second.size() ? myLevelsNumber : i->second.second.size() );
+  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();
 }
 
-double DependencyTree_View::getComputeProgress()
-{
-  return double( myComputedCost ) / double( myTotalCost );
-}
-
-void DependencyTree_View::changeWidgetState( bool theIsCompute )
+//=================================================================================
+// function : getNewTreeModel()
+// purpose  : get dependency tree model from engine
+//=================================================================================
+void DependencyTree_View::getNewTreeModel( bool theUseSelectedObject, bool theUseOB )
 {
-  cancelAction->setVisible( theIsCompute );
-  progressAction->setVisible( theIsCompute );
+  GEOM::string_array_var objectsEntry = new GEOM::string_array();
+  int iter = 0;
 
-  myHierarchyDepth->setEnabled( !theIsCompute );
-  myDisplayAscendants->setEnabled( !theIsCompute );
-  myDisplayDescendants->setEnabled( !theIsCompute );
-  updateButton->setEnabled( !theIsCompute );
-}
+  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.toLatin1().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;
+  }
 
-DependencyTree_ComputeDlg_QThread::DependencyTree_ComputeDlg_QThread( DependencyTree_View* theView )
-{
-  myView = theView;
-}
+  // get string which describes dependency tree structure
+  SALOMEDS::TMPFile_var SeqFile =
+    GeometryGUI::GetGeomGen()->GetDependencyTree( myStudy, myMainEntries );
+  char* buf = (char*)&SeqFile[0];
 
-void DependencyTree_ComputeDlg_QThread::run()
-{
-  myView->myMutex.lock();
- // QMutexLocker lock( &myView->myMutex );
-  myView->setIsCompute( true );
-  myView->drawTree();
+  clearView( true );
+  mySelectionMgr->clearSelected();
 
-  QApplication::postEvent( myView, new QEvent( ( QEvent::Type )DRAW_EVENT ) );
-  myView->myMutex.unlock();
-  //exec();
-}
+  // get dependency tree structure
+  GEOMUtils::ConvertStringToTree( buf, myTreeModel );
 
-void DependencyTree_ComputeDlg_QThread::sleepDraw()
-{
-  msleep(1);
+  parseTree();
 }
 
-void DependencyTree_ComputeDlg_QThread::cancel()
+//=================================================================================
+// function : checkMaxLevelsNumber()
+// purpose  : calculate max levels number
+//=================================================================================
+int DependencyTree_View::checkMaxLevelsNumber()
 {
-  myView->setIsCompute( false );
+  if( myDisplayAscendants->isChecked() && myDisplayDescendants->isChecked() )
+    return myMaxUpwardLevelsNumber > myMaxDownwardLevelsNumber ?
+           myMaxUpwardLevelsNumber : myMaxDownwardLevelsNumber;
+  else if( myDisplayAscendants ->isChecked() )
+    return myMaxUpwardLevelsNumber;
+  else if( myDisplayDescendants->isChecked() )
+    return  myMaxDownwardLevelsNumber;
+  return 0;
 }