1 // Copyright (C) 2014 CEA/DEN, EDF R&D, OPEN CASCADE
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 #include "DependencyTree_View.h"
22 #include "DependencyTree_Object.h"
23 #include "DependencyTree_Arrow.h"
26 #include <SUIT_Session.h>
27 #include <SUIT_ResourceMgr.h>
28 #include <SalomeApp_Study.h>
29 #include <QtxActionToolMgr.h>
30 #include <LightApp_SelectionMgr.h>
31 #include <SALOME_ListIteratorOfListIO.hxx>
37 #include <QApplication>
38 #include <QWidgetAction>
40 DependencyTree_View::DependencyTree_View( QWidget* theParent )
41 :GraphicsView_ViewPort( theParent ),
43 myMaxDownwardLevelsNumber(0),
44 myMaxUpwardLevelsNumber(0),
47 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
50 SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>( app->activeStudy() );
51 myStudy = GeometryGUI::ClientStudyToStudy( study->studyDS());
53 mySelectionMgr = app->selectionMgr();
54 if ( !mySelectionMgr ) return;
56 myMainEntries = new GEOM::string_array();
61 DependencyTree_View::~DependencyTree_View()
66 //=================================================================================
68 // purpose : this method is obligatory for initialize view frame actions
69 //=================================================================================
70 void DependencyTree_View::init( GraphicsView_ViewFrame* theViewFrame )
72 myNodesMovable = new QCheckBox( tr( "MOVE_NODES" ) );
73 QWidgetAction* nodesMovableAction = new QWidgetAction( theViewFrame );
74 nodesMovableAction->setDefaultWidget( myNodesMovable );
76 myDisplayAscendants = new QCheckBox( tr( "DISPLAY_ASCENDANTS" ) );
77 QWidgetAction* displayAscendantsAction = new QWidgetAction( theViewFrame );
78 displayAscendantsAction->setDefaultWidget( myDisplayAscendants );
80 myDisplayDescendants = new QCheckBox(tr("DISPLAY_DESCENDANTS"));
81 QWidgetAction* displayDescendantsAction = new QWidgetAction( theViewFrame );
82 displayDescendantsAction->setDefaultWidget( myDisplayDescendants );
84 QLabel* hierarchyDepthLabel = new QLabel( tr( "HIERARCHY_DEPTH" ) );
85 QWidgetAction* hierarchyDepthLabelAction = new QWidgetAction( theViewFrame );
86 hierarchyDepthLabelAction->setDefaultWidget( hierarchyDepthLabel );
88 myLevelsNumber = checkMaxLevelsNumber();
90 myHierarchyDepth = new QSpinBox();
91 myHierarchyDepth->setRange( 0, checkMaxLevelsNumber() );
92 myHierarchyDepth->setSpecialValueText( tr( "SHOW_ALL" ) );
93 myHierarchyDepth->setValue( 0 );
94 QWidgetAction* hierarchyDepthAction = new QWidgetAction( theViewFrame );
95 hierarchyDepthAction->setDefaultWidget( myHierarchyDepth );
97 updateButton = new QPushButton( tr( "UPDATE" ) );
98 QWidgetAction* updateAction = new QWidgetAction( theViewFrame );
99 updateAction->setDefaultWidget( updateButton );
101 QAction* separator1 = theViewFrame->toolMgr()->separator( false );
102 QAction* separator2 = theViewFrame->toolMgr()->separator( false );
104 theViewFrame->toolMgr()->append( separator1, theViewFrame->getToolBarId() );
105 theViewFrame->toolMgr()->append( hierarchyDepthLabelAction, theViewFrame->getToolBarId() );
106 theViewFrame->toolMgr()->append( hierarchyDepthAction, theViewFrame->getToolBarId() );
107 theViewFrame->toolMgr()->append( displayAscendantsAction, theViewFrame->getToolBarId() );
108 theViewFrame->toolMgr()->append( displayDescendantsAction, theViewFrame->getToolBarId() );
109 theViewFrame->toolMgr()->append( nodesMovableAction, theViewFrame->getToolBarId() );
111 theViewFrame->toolMgr()->append( separator2, theViewFrame->getToolBarId() );
112 theViewFrame->toolMgr()->append( updateAction, theViewFrame->getToolBarId() );
114 connect( myNodesMovable, SIGNAL( toggled( bool ) ), this, SLOT( onMoveNodes( bool ) ) );
115 connect( myHierarchyDepth, SIGNAL( valueChanged ( int ) ), this, SLOT( onHierarchyType() ) );
116 connect( myDisplayAscendants , SIGNAL( toggled( bool ) ), this, SLOT( onHierarchyType() ) );
117 connect( myDisplayDescendants, SIGNAL( toggled( bool ) ), this, SLOT( onHierarchyType() ) );
118 connect( updateButton, SIGNAL( clicked() ), this, SLOT( onUpdateModel() ) );
120 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
122 setPrefBackgroundColor( resMgr->colorValue( "Geometry", "dependency_tree_background_color", QColor( 255, 255, 255 ) ) );
123 setNodesMovable( resMgr->booleanValue( "Geometry", "dependency_tree_move_nodes", true ) );
124 setHierarchyType( resMgr->integerValue( "Geometry", "dependency_tree_hierarchy_type", 0 ) );
127 //=================================================================================
128 // function : updateModel()
129 // purpose : run all stage of dependency tree creation
130 //=================================================================================
131 void DependencyTree_View::updateModel( bool theUseSelectedObject, bool theUseOB )
133 getNewTreeModel( theUseSelectedObject, theUseOB );
137 //=================================================================================
138 // function : mouseMoveEvent()
139 // purpose : make some actions when mouse was moved
140 //=================================================================================
141 void DependencyTree_View::mouseMoveEvent( QMouseEvent *event )
143 QGraphicsView::mouseMoveEvent( event );
144 ArrowsInfo::const_iterator i;
145 for( i = myArrows.begin(); i != myArrows.end(); i++ ) {
146 DependencyTree_Arrow* arrow = myArrows[ i->first ];
151 //=================================================================================
152 // function : getViewName()
153 // purpose : return the name of current view
154 //=================================================================================
155 QString DependencyTree_View::getViewName() const
157 return tr( "DEPENDENCY_TREE" );
160 //=================================================================================
161 // function : getStudyId()
162 // purpose : return Id of current study
163 //=================================================================================
164 int DependencyTree_View::getStudyId() const
166 return myStudy->StudyId();
169 //=================================================================================
170 // function : getObjectByEntry()
171 // purpose : return DependencyTree_Object by entry
172 //=================================================================================
173 DependencyTree_Object* DependencyTree_View::getObjectByEntry( const std::string& theEntry )
175 return myTreeMap[ theEntry ];
178 //=================================================================================
179 // function : updateObjectName()
180 // purpose : update object name, having edited it in Object Browser
181 //=================================================================================
182 bool DependencyTree_View::updateObjectName( const std::string& theEntry )
185 for( initSelected(); moreSelected(); nextSelected() ) {
186 if( DependencyTree_Object* aDepObject = dynamic_cast<DependencyTree_Object*>( selectedObject() ) ) {
187 aDepObject->updateName();
194 //=================================================================================
195 // function : setHierarchyType()
196 // purpose : set hierarchy type of dependency tree
197 //=================================================================================
198 void DependencyTree_View::setHierarchyType( const int theType )
203 myDisplayAscendants->setChecked( true );
204 myDisplayDescendants->setChecked( true );
207 myDisplayAscendants->setChecked( true );
208 myDisplayDescendants->setChecked( false );
211 myDisplayAscendants->setChecked( false );
212 myDisplayDescendants->setChecked( true );
216 myLevelsNumber = checkMaxLevelsNumber();
220 //=================================================================================
221 // function : setNodesMovable()
222 // purpose : set possibility to move nodes or not
223 //=================================================================================
224 void DependencyTree_View::setNodesMovable( const bool theIsMovable )
226 myNodesMovable->setChecked( theIsMovable );
229 //=================================================================================
230 // function : setPrefBackgroundColor()
231 // purpose : set background color from preferences
232 //=================================================================================
233 void DependencyTree_View::setPrefBackgroundColor( const QColor& theColor )
235 if( isForegroundEnabled() )
237 setForegroundColor( theColor );
241 setBackgroundColor( theColor );
244 //=================================================================================
245 // function : setNodeColor()
246 // purpose : set node color from preferences
247 //=================================================================================
248 void DependencyTree_View::setNodeColor( const QColor& theColor )
250 EntryObjectMap::const_iterator i;
251 for( i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
252 DependencyTree_Object* object = myTreeMap[ i->first ];
253 object->setColor( theColor );
257 //=================================================================================
258 // function : setMainNodeColor()
259 // purpose : set main node color from preferences
260 //=================================================================================
261 void DependencyTree_View::setMainNodeColor( const QColor& theColor )
263 EntryObjectMap::const_iterator i;
264 for( i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
265 DependencyTree_Object* object = myTreeMap[ i->first ];
266 object->setMainObjectColor( theColor );
270 //=================================================================================
271 // function : setSelectNodeColor()
272 // purpose : set selected node color from preferences
273 //=================================================================================
274 void DependencyTree_View::setSelectNodeColor( const QColor& theColor )
276 EntryObjectMap::const_iterator i;
277 for( i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
278 DependencyTree_Object* object = myTreeMap[ i->first ];
279 object->setSelectColor( theColor );
283 //=================================================================================
284 // function : setArrowColor()
285 // purpose : set arrow color from preferences
286 //=================================================================================
287 void DependencyTree_View::setArrowColor( const QColor& theColor )
289 ArrowsInfo::const_iterator i;
290 for( i = myArrows.begin(); i != myArrows.end(); i++ ) {
291 DependencyTree_Arrow* arrow = myArrows[ i->first ];
292 arrow->setColor( theColor );
296 //=================================================================================
297 // function : setHighlightArrowColor()
298 // purpose : set highlighted arrow color from preferences
299 //=================================================================================
300 void DependencyTree_View::setHighlightArrowColor( const QColor& theColor )
302 ArrowsInfo::const_iterator i;
303 for( i = myArrows.begin(); i != myArrows.end(); i++ ) {
304 DependencyTree_Arrow* arrow = myArrows[ i->first ];
305 arrow->setHighlightColor( theColor );
309 //=================================================================================
310 // function : setSelectArrowColor()
311 // purpose : set selected arrow color from preferences
312 //=================================================================================
313 void DependencyTree_View::setSelectArrowColor( const QColor& theColor )
315 ArrowsInfo::const_iterator i;
316 for( i = myArrows.begin(); i != myArrows.end(); i++ ) {
317 DependencyTree_Arrow* arrow = myArrows[ i->first ];
318 arrow->setSelectColor( theColor );
322 //=================================================================================
323 // function : onRebuildModel()
324 // purpose : slot for updating tree model using selected objects in viewer
325 //=================================================================================
326 void DependencyTree_View::onRebuildModel()
328 updateModel( true, false );
331 //=================================================================================
332 // function : onUpdateModel()
333 // purpose : slot for updating tree model for main objects in viewer
334 //=================================================================================
335 void DependencyTree_View::onUpdateModel()
337 updateModel( false );
340 //=================================================================================
341 // function : onMoveNodes()
342 // purpose : slot for setting the possibility to move nodes in viewer
343 //=================================================================================
344 void DependencyTree_View::onMoveNodes( bool theIsMoveNodes )
346 EntryObjectMap::const_iterator i;
347 for( i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
348 DependencyTree_Object* object = myTreeMap[ i->first ];
350 object->setMovable( theIsMoveNodes );
354 //=================================================================================
355 // function : onHierarchyType()
356 // purpose : slot for setting the hierarchy type of tree
357 //=================================================================================
358 void DependencyTree_View::onHierarchyType()
360 myHierarchyDepth->setRange( 0, checkMaxLevelsNumber() );
361 if( myHierarchyDepth->value() > checkMaxLevelsNumber() )
362 myHierarchyDepth->setValue( checkMaxLevelsNumber() );
364 if( myHierarchyDepth->value() == 0 )
365 myLevelsNumber = myHierarchyDepth->maximum();
367 myLevelsNumber = myHierarchyDepth->value();
372 //=================================================================================
373 // function : parseTree()
374 // purpose : parse created model to initialize all nodes and arrows
375 //=================================================================================
376 void DependencyTree_View::parseTree()
378 GEOMUtils::TreeModel::const_iterator i;
379 for( i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
380 std::string objectEntry = i->first;
381 addNode( objectEntry );
382 parseTreeWard( i->second.first );
383 if( i->second.first.size() > myMaxUpwardLevelsNumber )
384 myMaxUpwardLevelsNumber = i->second.first.size();
385 parseTreeWard( i->second.second );
386 if( i->second.second.size() > myMaxDownwardLevelsNumber )
387 myMaxDownwardLevelsNumber = i->second.second.size();
390 for( i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
391 DependencyTree_Object* Main_object = myTreeMap[ i->first ];
392 if( i->second.first.size() > 0 ) {
393 GEOMUtils::LevelInfo Levelup = i->second.first.at(0);
394 GEOMUtils::LevelInfo::const_iterator node;
395 for( node = Levelup.begin(); node != Levelup.end(); node++ ) {
396 DependencyTree_Object* object = myTreeMap[ node->first ];
397 addArrow( Main_object, object );
400 parseTreeWardArrow( i->second.first );
401 parseTreeWardArrow( i->second.second );
405 //=================================================================================
406 // function : parseTreeWard()
407 // purpose : parse tree ward to initialize all nodes of current ward
408 //=================================================================================
409 void DependencyTree_View::parseTreeWard( const GEOMUtils::LevelsList& theWard )
411 int levelsNumber = theWard.size();
412 for( int level = 0; level < levelsNumber; level++ ) {
413 GEOMUtils::LevelInfo levelInfo = theWard[ level ];
414 GEOMUtils::LevelInfo::const_iterator node;
415 for( node = levelInfo.begin(); node != levelInfo.end(); node++ )
416 addNode( node->first );
420 //=================================================================================
421 // function : parseTreeWardArrow()
422 // purpose : parse tree ward to initialize all arrows of current ward
423 //=================================================================================
424 void DependencyTree_View::parseTreeWardArrow( const GEOMUtils::LevelsList& theWard)
426 for( int j = 0; j < theWard.size(); j++ ) {
427 GEOMUtils::LevelInfo Level = theWard.at(j);
428 GEOMUtils::LevelInfo::const_iterator node;
429 for( node = Level.begin(); node != Level.end(); node++ ) {
430 DependencyTree_Object* object = myTreeMap[ node->first ];
431 std::vector<std::string> Links = node->second;
432 for( int link = 0; link < Links.size(); link++ ) {
433 DependencyTree_Object* LinkObject = myTreeMap[ Links[ link ] ];
434 if( object && LinkObject )
435 addArrow( object, LinkObject );
441 //=================================================================================
442 // function : addNode()
443 // purpose : add node to viewer
444 //=================================================================================
445 void DependencyTree_View::addNode( const std::string& theEntry )
447 if( !myTreeMap[theEntry] )
448 myTreeMap[theEntry] = new DependencyTree_Object( theEntry );
451 //=================================================================================
452 // function : addArrow()
453 // purpose : add arrow to viewer
454 //=================================================================================
455 void DependencyTree_View::addArrow( DependencyTree_Object* startItem, DependencyTree_Object* endItem )
459 ArrowsInfo::const_iterator i;
460 for( i = myArrows.begin(); i != myArrows.end(); i++ ) {
461 DependencyTree_Arrow* arrow = i->second;
462 if( arrow->getStartItem() == startItem && arrow->getEndItem() == endItem )
464 else if( arrow->getStartItem() == endItem && arrow->getEndItem() == startItem ) {
465 arrow->setIsBiLink( true );
470 DependencyTree_Arrow *arrow = new DependencyTree_Arrow( startItem, endItem );
471 myArrows[ std::pair<DependencyTree_Object*,DependencyTree_Object*>( startItem, endItem ) ] = arrow;
475 //=================================================================================
476 // function : drawTree()
477 // purpose : redraw dependency tree using existing model
478 //=================================================================================
479 void DependencyTree_View::drawTree()
484 // draw nodes on scene
485 std::map< std::string, int > entryLevelMap;
486 std::map< int, std::vector< std::string > > levelObjects;
488 int horDistance, verDistance;
489 GEOMUtils::TreeModel::const_reverse_iterator i;
490 for( i = myTreeModel.rbegin(); i != myTreeModel.rend(); i++ ) {
492 std::string objectEntry = i->first;
493 DependencyTree_Object* objectItem = myTreeMap[ objectEntry ];
494 horDistance = 100 + int( objectItem->boundingRect().width() );
495 verDistance = 3 * int( objectItem->boundingRect().height() );
496 if( isItemAdded( objectItem ) )
497 currentLevel = entryLevelMap[ objectEntry ];
499 addItem( objectItem );
500 objectItem->unselect();
501 entryLevelMap[ objectEntry ] = currentLevel;
502 levelObjects[ currentLevel ].push_back( objectEntry );
504 objectItem->setIsMainObject( true );
506 if( myDisplayAscendants->isChecked() )
507 drawWard( i->second.first, entryLevelMap, levelObjects, currentLevel, -1 );
508 if( myDisplayDescendants->isChecked() )
509 drawWard( i->second.second, entryLevelMap, levelObjects, currentLevel, 1 );
512 std::map< int, std::vector< std::string > >::const_iterator level;
513 for( level = levelObjects.begin(); level != levelObjects.end(); level++ ) {
514 int step = -horDistance * ( level->second.size() - 1 ) / 2;
515 for( int objIter = 0; objIter < level->second.size(); objIter++ ) {
516 DependencyTree_Object* anObject = myTreeMap[ level->second.at( objIter ) ];
517 anObject->setPos( step, verDistance * level->first );
522 // draw arrows on scene
523 GEOMUtils::TreeModel::const_iterator j;
524 for( j = myTreeModel.begin(); j != myTreeModel.end(); j++ ) {
525 DependencyTree_Object* Main_object = myTreeMap[ j->first ];
526 if( j->second.first.size() > 0 ) {
527 GEOMUtils::LevelInfo Levelup = j->second.first.at(0);
528 if( myDisplayAscendants ->isChecked() ) {
529 GEOMUtils::LevelInfo::const_iterator node;
530 for( node = Levelup.begin(); node != Levelup.end(); node++ ) {
531 DependencyTree_Object* object = myTreeMap[ node->first ];
532 DependencyTree_Arrow* arrow =
533 myArrows[ std::pair<DependencyTree_Object*,DependencyTree_Object*>( Main_object, object )];
534 if( arrow && !isItemAdded( arrow ) )
539 if( myDisplayAscendants->isChecked() )
540 drawWardArrows( j->second.first );
541 if( myDisplayDescendants->isChecked() )
542 drawWardArrows( j->second.second );
546 //=================================================================================
547 // function : drawWard()
548 // purpose : draw nodes of dependency tree ward (ascendant or descendant)
549 //=================================================================================
550 void DependencyTree_View::drawWard( const GEOMUtils::LevelsList& theWard,
551 std::map< std::string, int >& theEntryLevelMap,
552 std::map< int, std::vector< std::string > >& theLevelObjects,
553 int theCurrentLevel, const int theLevelStep )
555 for( int level = 0; level < theWard.size(); level++ ) {
556 if( level >= myLevelsNumber )
558 theCurrentLevel += theLevelStep;
559 GEOMUtils::LevelInfo levelInfo = theWard.at( level );
560 GEOMUtils::LevelInfo::const_iterator node;
561 for( node = levelInfo.begin(); node != levelInfo.end(); node++ ) {
562 DependencyTree_Object* object = myTreeMap[ node->first ];
563 if( object && !isItemAdded( object ) ) {
566 theEntryLevelMap[ node->first ] = theCurrentLevel;
567 theLevelObjects[ theCurrentLevel ].push_back( node->first );
573 //=================================================================================
574 // function : drawWardArrows()
575 // purpose : draw arrows of dependency tree ward (ascendant or descendant)
576 //=================================================================================
577 void DependencyTree_View::drawWardArrows( const GEOMUtils::LevelsList& theWard )
579 for( int j = 0; j < theWard.size(); j++ ) {
580 if( j >= myLevelsNumber )
582 GEOMUtils::LevelInfo Level = theWard.at(j);
583 GEOMUtils::LevelInfo::const_iterator node;
584 for( node = Level.begin(); node != Level.end(); node++ ) {
585 DependencyTree_Object* object = myTreeMap[ node->first ];
586 GEOMUtils::NodeLinks Links = node->second;
587 for( int link = 0; link < Links.size(); link++ ) {
588 DependencyTree_Object* LinkObject = myTreeMap[ Links[ link ] ];
589 if( isItemAdded( object ) && isItemAdded( LinkObject ) ) {
590 DependencyTree_Arrow* arrow = myArrows[ std::pair<DependencyTree_Object*,DependencyTree_Object*>( object, LinkObject ) ];
591 if( arrow && !isItemAdded( arrow ) )
599 //=================================================================================
600 // function : updateView()
601 // purpose : update viewer using created dependency tree model
602 //=================================================================================
603 void DependencyTree_View::updateView()
612 //=================================================================================
613 // function : clearView()
614 // purpose : clear viewer and initialize all variables
615 //=================================================================================
616 void DependencyTree_View::clearView( bool isClearModel )
618 EntryObjectMap::const_iterator objectIter;
619 for( objectIter = myTreeMap.begin(); objectIter != myTreeMap.end(); objectIter++ ) {
620 DependencyTree_Object* object = objectIter->second;
622 if( isItemAdded( object ) )
623 removeItem( object );
626 ArrowsInfo::const_iterator arrowIter;
627 for( arrowIter = myArrows.begin(); arrowIter != myArrows.end(); arrowIter++ ) {
628 DependencyTree_Arrow* object = arrowIter->second;
630 if( isItemAdded( object ) )
631 removeItem( object );
639 myMaxDownwardLevelsNumber = 0;
640 myMaxUpwardLevelsNumber = 0;
645 //=================================================================================
646 // function : getNewTreeModel()
647 // purpose : get dependency tree model from engine
648 //=================================================================================
649 void DependencyTree_View::getNewTreeModel( bool theUseSelectedObject, bool theUseOB )
651 GEOM::string_array_var objectsEntry = new GEOM::string_array();
654 if( theUseSelectedObject ) {
656 SALOME_ListIO mainObjects;
657 mySelectionMgr->selectedObjects( mainObjects );
658 // create a list of selected object entry
659 objectsEntry->length( mainObjects.Extent() );
660 for ( SALOME_ListIteratorOfListIO It( mainObjects ); It.More(); It.Next(), iter++ ) {
661 Handle( SALOME_InteractiveObject ) io = It.Value();
662 GEOM::GEOM_Object_var geomObject = GEOM::GEOM_Object::_nil();
663 geomObject = GEOMBase::ConvertIOinGEOMObject( io );
664 QString entry = geomObject->GetEntry();
665 objectsEntry[ iter ] = entry.toLatin1().constData();
669 objectsEntry->length( nbSelected() );
670 for( initSelected(); moreSelected(); nextSelected(), iter++ )
671 if( DependencyTree_Object* treeObject = dynamic_cast<DependencyTree_Object*>( selectedObject() ) )
672 objectsEntry[ iter ] = treeObject->getEntry().c_str();
674 myMainEntries = objectsEntry;
677 // get string which describes dependency tree structure
678 SALOMEDS::TMPFile_var SeqFile =
679 GeometryGUI::GetGeomGen()->GetDependencyTree( myStudy, myMainEntries );
680 char* buf = (char*)&SeqFile[0];
683 mySelectionMgr->clearSelected();
685 // get dependency tree structure
686 GEOMUtils::ConvertStringToTree( buf, myTreeModel );
691 //=================================================================================
692 // function : checkMaxLevelsNumber()
693 // purpose : calculate max levels number
694 //=================================================================================
695 int DependencyTree_View::checkMaxLevelsNumber()
697 if( myDisplayAscendants->isChecked() && myDisplayDescendants->isChecked() )
698 return myMaxUpwardLevelsNumber > myMaxDownwardLevelsNumber ?
699 myMaxUpwardLevelsNumber : myMaxDownwardLevelsNumber;
700 else if( myDisplayAscendants ->isChecked() )
701 return myMaxUpwardLevelsNumber;
702 else if( myDisplayDescendants->isChecked() )
703 return myMaxDownwardLevelsNumber;