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
20 #include "DependencyTree_View.h"
21 #include "DependencyTree_Object.h"
22 #include "DependencyTree_Arrow.h"
24 #include <GEOM_InteractiveObject.hxx>
25 #include <GeometryGUI.h>
29 #include <SUIT_Session.h>
30 #include <SUIT_ResourceMgr.h>
31 #include <SalomeApp_Application.h>
32 #include <SalomeApp_Study.h>
33 #include <QtxActionToolMgr.h>
34 #include <LightApp_SelectionMgr.h>
35 #include <SALOME_ListIteratorOfListIO.hxx>
38 #include <QCloseEvent>
39 #include <QTimerEvent>
40 #include <QGraphicsScene>
46 DependencyTree_View::DependencyTree_View( QWidget* theParent )
47 :GraphicsView_ViewPort(theParent),
48 myMaxDownwardLevelsNumber(0),
49 myMaxUpwardLevelsNumber(0),
54 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
57 SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
58 SALOMEDS::Study_var myStudy = GeometryGUI::ClientStudyToStudy( study->studyDS());
60 LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
61 if ( !aSelMgr ) return;
63 SALOME_ListIO aSelList;
64 aSelMgr->selectedObjects(aSelList);
66 GEOM::string_array_var ObjectIORs = new GEOM::string_array();
67 ObjectIORs->length( aSelList.Extent());
70 for ( SALOME_ListIteratorOfListIO It( aSelList ); It.More(); It.Next() ) {
71 Handle( SALOME_InteractiveObject ) io = It.Value();
74 GEOM::GEOM_Object_var myObject = GEOM::GEOM_Object::_nil();
75 myObject = GEOMBase::ConvertIOinGEOMObject( io );
76 QString ior = myObject->GetEntry();
77 ObjectIORs[aaa] = ior.toLatin1().constData();
80 std::cout << "\n\n IOR = " << ior.toStdString() << std::endl;
83 SALOMEDS::TMPFile_var SeqFile =
84 GeometryGUI::GetGeomGen()->GetDependencyTree( myStudy, ObjectIORs );
86 buf = (char*) &SeqFile[0];
88 std::cout << "\n\n\n\n\n TREE = " << buf << std::endl;
90 GEOMUtils::ConvertStringToTree( buf, myTreeModel );
92 aSelMgr->clearSelected();
95 DependencyTree_View::~DependencyTree_View()
100 void DependencyTree_View::drawArrows()
102 GEOMUtils::TreeModel::const_iterator i;
103 for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
104 DependencyTree_Object* Main_object = myTreeMap[i->first];
105 if( i->second.first.size() > 0 ) {
106 GEOMUtils::LevelInfo Levelup = i->second.first.at(0);
107 if( myDisplayAscendants ->isChecked() ) {
108 GEOMUtils::LevelInfo::const_iterator node;
109 for (node = Levelup.begin(); node != Levelup.end(); node++ ) {
110 DependencyTree_Object* object = myTreeMap[node->first];
111 DependencyTree_Arrow* arrow = Arrows[std::pair<DependencyTree_Object*,DependencyTree_Object*>(Main_object, object)];
112 if( arrow && !isItemAdded( arrow) )
117 if( myDisplayAscendants ->isChecked() )
118 drawWardArrows( i->second.first );
119 if( myDisplayDescendants->isChecked() )
120 drawWardArrows( i->second.second );
125 void DependencyTree_View::drawWardArrows( GEOMUtils::LevelsList theWard )
127 for(int j = 0; j < theWard.size(); j++ ) {
128 if( j >= myLevelsNumber )
130 GEOMUtils::LevelInfo Level = theWard.at(j);
131 GEOMUtils::LevelInfo::const_iterator node;
132 for (node = Level.begin(); node != Level.end(); node++ ) {
133 DependencyTree_Object* object = myTreeMap[node->first];
134 GEOMUtils::NodeLinks Links = node->second;
135 for( int link = 0; link < Links.size(); link++ ) {
136 DependencyTree_Object* LinkObject = myTreeMap[Links[link]];
137 if( isItemAdded( object ) && isItemAdded( LinkObject ) ) {
138 DependencyTree_Arrow* arrow = Arrows[std::pair<DependencyTree_Object*,DependencyTree_Object*>(object, LinkObject)];
139 if( arrow && !isItemAdded( arrow) )
147 void DependencyTree_View::parseTree()
150 GEOMUtils::TreeModel::const_iterator i;
151 for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
152 std::string objectEntry = i->first;
153 addNode( objectEntry );
154 parseTreeWard( i->second.first );
155 if( i->second.first.size() > myMaxUpwardLevelsNumber )
156 myMaxUpwardLevelsNumber = i->second.first.size();
157 parseTreeWard( i->second.second );
158 if( i->second.second.size() > myMaxDownwardLevelsNumber )
159 myMaxDownwardLevelsNumber = i->second.second.size();
162 for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
163 DependencyTree_Object* Main_object = myTreeMap[i->first];
164 if( i->second.first.size() > 0 ) {
165 GEOMUtils::LevelInfo Levelup = i->second.first.at(0);
166 GEOMUtils::LevelInfo::const_iterator node;
167 for (node = Levelup.begin(); node != Levelup.end(); node++ ) {
168 DependencyTree_Object* object = myTreeMap[node->first];
169 addArrow( Main_object, object );
172 parseTreeWardArrow( i->second.first );
173 parseTreeWardArrow( i->second.second );
178 void DependencyTree_View::parseTreeWard(const GEOMUtils::LevelsList theWard)
180 int levelsNumber = theWard.size();
181 for( int level = 0; level < levelsNumber; level++ ) {
182 GEOMUtils::LevelInfo levelInfo = theWard[ level ];
183 GEOMUtils::LevelInfo::const_iterator node;
184 for (node = levelInfo.begin(); node != levelInfo.end(); node++ ) {
185 addNode( node->first );
189 void DependencyTree_View::parseTreeWardArrow(const GEOMUtils::LevelsList theWard)
191 for(int j = 0; j < theWard.size(); j++ ) {
192 GEOMUtils::LevelInfo Level = theWard.at(j);
193 GEOMUtils::LevelInfo::const_iterator node;
194 for (node = Level.begin(); node != Level.end(); node++ ) {
195 DependencyTree_Object* object = myTreeMap[node->first];
196 std::vector<std::string> Links = node->second;
197 for( int link = 0; link < Links.size(); link++ ) {
198 DependencyTree_Object* LinkObject = myTreeMap[Links[link]];
199 if( object && LinkObject )
200 addArrow( object, LinkObject );
205 //void DependencyTree_View::parseData( QString& theData )
209 // while( theData.indexOf('-',cursor) != -1 ) //find next selected object
211 // int objectIndex = theData.indexOf( '-', cursor );
212 // QString objectEntry = theData.mid( cursor, objectIndex - cursor );
213 // //addNode( objectEntry );
214 // std::cout<<"\n\nMainObject = " << objectEntry.toStdString() <<std::endl;
215 // cursor = objectIndex;
217 // int upwardIndexBegin = theData.indexOf("{",cursor) + 1;
218 // int upwardIndexFinish = theData.indexOf("}",upwardIndexBegin);
219 // std::cout<<" Upward:" << std::endl;
220 // LevelsList upwardList = parseWard( theData, cursor );
221 // if( upwardList.size() > myMaxUpwardLevelsNumber )
222 // myMaxUpwardLevelsNumber = upwardList.size();
223 // std::cout<<" Downward:" << std::endl;
224 // LevelsList downwardList = parseWard( theData, cursor );
225 // if( downwardList.size() > myMaxDownwardLevelsNumber )
226 // myMaxDownwardLevelsNumber = downwardList.size();
228 // myTreeModel[objectEntry] = QPair<LevelsList,LevelsList>( upwardList, downwardList );
232 void DependencyTree_View::addNode( const std::string& theEntry )
234 if( !myTreeMap[theEntry] )
235 myTreeMap[theEntry] = new DependencyTree_Object( theEntry );
238 void DependencyTree_View::addArrow( DependencyTree_Object *startItem, DependencyTree_Object *endItem )
242 std::cout << " " << startItem->getEntry() << " " << endItem->getEntry() << std::endl;
243 std::map<std::pair<DependencyTree_Object*,DependencyTree_Object*>, DependencyTree_Arrow* >::const_iterator i;
244 for (i = Arrows.begin(); i != Arrows.end(); i++ ) {
245 DependencyTree_Arrow* arrow = i->second;
246 if( arrow->getStartItem() == startItem && arrow->getEndItem() == endItem ) {
248 std::cout<<" theSame " << std::endl;
250 else if( arrow->getStartItem() == endItem && arrow->getEndItem() == startItem ) {
251 arrow->setIsBiLink( true );
252 std::cout<<" Bilink " << std::endl;
258 DependencyTree_Arrow *arrow = new DependencyTree_Arrow(startItem, endItem);
259 //Arrows.append( arrow );
261 Arrows[std::pair<DependencyTree_Object*,DependencyTree_Object*>( startItem, endItem )] = arrow;
262 std::cout<<" addArrow " << std::endl;
266 //DependencyTree_View::LevelsList DependencyTree_View::parseWard( const QString& theData, int& theCursor )
268 // int indexStart = theData.indexOf( "{", theCursor ) + 1;
269 // int indexEnd = theData.indexOf( "}", indexStart );
271 // QString ward = theData.mid( indexStart, indexEnd - indexStart );
272 // QStringList levelsListStr = ward.split( ';' );
273 // LevelsList levelsListData;
274 // for( int level = 0; level < levelsListStr.size(); level++ ) {
275 // std::cout<<" Level" << level + 1 << ":" << std::endl;
276 // QStringList namesListStr = levelsListStr[level].split( ',' );
277 // LevelInfo levelInfoData;
278 // for( int node = 0; node < namesListStr.size(); node++ ) {
279 // QStringList linksListStr = namesListStr[node].split( '_' );
280 // QString nodeItem = linksListStr[0];
281 // if( !nodeItem.isEmpty() ) {
282 // //addNode( nodeItem );
283 // NodeLinks linksListData;
284 // std::cout<<" " << nodeItem.toStdString() << " - ";
285 // for( int link = 1; link < linksListStr.size(); link++ ) {
286 // QString linkItem = linksListStr[link];
287 // //addNode( linkItem );
288 // linksListData.append( linkItem );
289 // std::cout << linkItem.toStdString() << ", ";
291 // levelInfoData[nodeItem] = linksListData;
292 // std::cout << std::endl;
294 // }// Level's objects
295 // levelsListData.append(levelInfoData);
298 // theCursor = indexEnd + 1;
300 // return levelsListData;
303 void DependencyTree_View::drawTree()
306 int horDistance, verDistance;
308 GEOMUtils::TreeModel::const_iterator i;
309 for (i = myTreeModel.begin(); i != myTreeModel.end(); i++ ) {
311 std::string objectEntry = i->first;
312 DependencyTree_Object* objectItem = myTreeMap[ objectEntry ];
313 horDistance = 100 + int( objectItem->boundingRect().width() );
314 verDistance = 3 * int( objectItem->boundingRect().height() );
315 if( isItemAdded( objectItem ) ) {
316 myCurrentLevel = myLevelMap[ objectEntry ];
319 addItem( objectItem );
320 myLevelMap[ objectEntry ] = myCurrentLevel;
321 myLevelsObject[ myCurrentLevel ].push_back( objectEntry );
323 objectItem->setIsMainObject( true );
325 int levelposition = myCurrentLevel;
326 if( myDisplayAscendants ->isChecked() ){
327 drawWard( i->second.first, -1 );
328 myCurrentLevel = levelposition;
330 if( myDisplayDescendants->isChecked() )
331 drawWard( i->second.second, 1 );
334 std::map< int, std::vector<std::string> >::const_iterator j;
335 for (j = myLevelsObject.begin(); j != myLevelsObject.end(); j++ ) {
336 int step = -horDistance*( j->second.size() - 1 )/2;
337 std::cout<<"\n\n LEVEL = " << j->first << std::endl;
338 for( int object = 0; object < j->second.size(); object++ ) {
340 std::cout << j->second.at( object ) << ", ";
341 DependencyTree_Object* anObject = myTreeMap[ j->second.at( object ) ];
342 anObject->setPos( step, verDistance*j->first );
348 centerOn( scene()->sceneRect().center() );
353 void DependencyTree_View::drawWard( const GEOMUtils::LevelsList theWard, const int theLevelStep )
355 std::cout << "\n\n myLevelsNumber2 = " << myLevelsNumber << std::endl;
356 int levelsNumber = theWard.size();
357 std::cout << "\n\n levelsNumber = " << levelsNumber << std::endl;
358 for( int level = 0; level < levelsNumber; level++ ) {
359 if( level >= myLevelsNumber )
361 myCurrentLevel += theLevelStep;
362 GEOMUtils::LevelInfo levelInfo = theWard.at( level );
363 GEOMUtils::LevelInfo::const_iterator node;
364 for (node = levelInfo.begin(); node != levelInfo.end(); node++ ) {
365 DependencyTree_Object* object = myTreeMap[ node->first ];
366 if( !isItemAdded( object ) ) {
368 myLevelMap[ node->first ] = myCurrentLevel;
369 myLevelsObject[ myCurrentLevel ].push_back( node->first );
376 void DependencyTree_View::onUpdateTree()
379 myLevelsObject.clear();
382 std::map<std::string,DependencyTree_Object*>::const_iterator i;
383 for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
384 DependencyTree_Object* object = myTreeMap[ i->first ];
385 if( isItemAdded( object ) && object )
386 removeItem( object );
390 std::map<std::pair<DependencyTree_Object*,DependencyTree_Object*>, DependencyTree_Arrow* >::const_iterator j;
391 for (j = Arrows.begin(); j != Arrows.end(); j++ ) {
392 DependencyTree_Arrow* object = Arrows[ j->first ];
393 if( isItemAdded( object ) && object )
394 removeItem( object );
402 int DependencyTree_View::checkMaxLevelsNumber()
404 if( myDisplayAscendants ->isChecked() && myDisplayDescendants->isChecked() )
405 return myMaxUpwardLevelsNumber>myMaxDownwardLevelsNumber?myMaxUpwardLevelsNumber:myMaxDownwardLevelsNumber;
406 else if( myDisplayAscendants ->isChecked() )
407 return myMaxUpwardLevelsNumber;
408 else if( myDisplayDescendants->isChecked() )
409 return myMaxDownwardLevelsNumber;
413 void DependencyTree_View::init( GraphicsView_ViewFrame* theViewFrame )
415 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
417 std::string Data = "MainObject1-upward{up11_up21_up22,up12_up23,up13_up24;up21_up11,up22_up21_up12,up23_up23,up24}"
418 "downward{down11_MainObject1,down12_MainObject1;down21_down11,down22_down12,down23_down12,down24_down24_down11,down25_down12;down31_down11_down23,down32_down25}"
419 "down23-upward{down12_MainObject1;MainObject1_up11_up12_up13;up11_up21_up22,up12_up23,up13_up24;up21,up22_up21_up12,up23,up24}"
420 "downward{down31_down11_down23}"
421 "MainObject2-upward{up21,newup11_newup31,newup12_newup21;newup21_newup31LongName;newup31LongName}downward{newdown11_MainObject2,newdown12_MainObject2,newdown13_MainObject2;newdown21_newdown13,down21;newdown31_newdown11}"
422 "MainObject3-upward{moUP1_moUP4,moUP2_moUP3;moUP4,moUP3_down23}downward{moDOWN1_MainObject3}";
425 //GEOMUtils::ConvertStringToTree( Data, myTreeModel );
429 // GEOMUtils::TreeModel::const_iterator i;
430 // for ( i = aTreeModel.begin(); i != aTreeModel.end(); i++ ) {
431 // std::string objectEntry = i->first;
432 // std::cout << "\n\n Main object = " << objectEntry << std::endl;
434 // parseData( Data );
438 myNodesMovable = new QCheckBox( tr( "MOVE_NODES" ) );
439 QWidgetAction* moveNodesAction = new QWidgetAction( theViewFrame );
440 moveNodesAction->setDefaultWidget( myNodesMovable );
442 myDisplayAscendants = new QCheckBox( tr( "DISPLAY_ASCENDANTS" ));
443 myDisplayAscendants ->setChecked( true );
444 QWidgetAction* ShowParentsAction = new QWidgetAction(theViewFrame);
445 ShowParentsAction->setDefaultWidget( myDisplayAscendants );
447 myDisplayDescendants = new QCheckBox(tr("DISPLAY_DESCENDANTS"));
448 QWidgetAction* ShowChildrenAction = new QWidgetAction(theViewFrame);
449 ShowChildrenAction->setDefaultWidget( myDisplayDescendants );
451 myLevelsNumber = checkMaxLevelsNumber();
452 std::cout << "\n\n myLevelsNumber1 = " << myLevelsNumber << std::endl;
453 myHierarchyDepth = new QSpinBox();
454 myHierarchyDepth->setRange( 0, checkMaxLevelsNumber() );
455 myHierarchyDepth->setValue( 0 );
456 myHierarchyDepth->setSpecialValueText( "All" );
457 QWidgetAction* LevelsAction = new QWidgetAction(theViewFrame);
458 LevelsAction->setDefaultWidget( myHierarchyDepth );
460 QLabel* LevelsLabel = new QLabel( tr("HIERARCHY_DEPTH") );
461 QWidgetAction* LevelsLebelAction = new QWidgetAction(theViewFrame);
462 LevelsLebelAction->setDefaultWidget( LevelsLabel );
465 QPushButton* UpdateButton = new QPushButton(tr("Update"));
466 QWidgetAction* UpdateAction = new QWidgetAction(theViewFrame);
467 UpdateAction->setDefaultWidget( UpdateButton );
469 cancelButton = new QPushButton(tr("CANCEL"));
470 cancelButton->setCheckable(true);
471 cancelButton->setVisible( false );
472 cancelAction = new QWidgetAction(theViewFrame);
473 cancelAction->setDefaultWidget( cancelButton );
474 cancelAction->setVisible(false);
476 progressBar = new QProgressBar(this);
477 progressBar->setMinimum( 0 );
478 progressBar->setMaximum( 1000 );
479 progressBar->setFixedWidth(100);
480 progressAction = new QWidgetAction(theViewFrame);
481 progressAction->setDefaultWidget( progressBar );
482 progressAction->setVisible(false);
484 QAction* separator = theViewFrame->toolMgr()->separator(false);
485 theViewFrame->toolMgr()->append( separator, theViewFrame->getToolBarId() );
486 theViewFrame->toolMgr()->append( moveNodesAction, theViewFrame->getToolBarId() );
487 theViewFrame->toolMgr()->append( LevelsLebelAction, theViewFrame->getToolBarId() );
488 theViewFrame->toolMgr()->append( LevelsAction, theViewFrame->getToolBarId() );
489 theViewFrame->toolMgr()->append( ShowParentsAction, theViewFrame->getToolBarId() );
490 theViewFrame->toolMgr()->append( ShowChildrenAction, theViewFrame->getToolBarId() );
491 QAction* separator2 = theViewFrame->toolMgr()->separator(false);
492 theViewFrame->toolMgr()->append( separator2, theViewFrame->getToolBarId() );
493 theViewFrame->toolMgr()->append( UpdateAction, theViewFrame->getToolBarId() );
494 std::cout<<"\n\n\n\n ToolBarId = " << theViewFrame->getToolBarId() << std::endl;
495 theViewFrame->toolMgr()->append( progressAction, theViewFrame->getToolBarId() );
496 theViewFrame->toolMgr()->append( cancelAction, theViewFrame->getToolBarId() );
498 connect(cancelButton, SIGNAL(clicked()), this, SLOT(onCancel()));
500 connect( myHierarchyDepth, SIGNAL( valueChanged ( int ) ), this, SLOT( onHierarchyType() ) );
501 connect( myDisplayAscendants , SIGNAL( toggled(bool) ), this, SLOT( onHierarchyType() ) );
502 connect( myDisplayDescendants, SIGNAL( toggled(bool) ), this, SLOT( onHierarchyType() ) );
503 connect( UpdateButton, SIGNAL( clicked() ), this, SLOT( updateView() ) );
504 connect( myNodesMovable, SIGNAL( toggled(bool) ), this, SLOT( onMoveNodes( bool ) ) );
506 setPrefBackgroundColor( resMgr->colorValue( "Geometry", "dependency_tree_background_color", QColor( 255, 255, 255 ) ) );
507 setNodesMovable( resMgr->booleanValue( "Geometry", "dependency_tree_move_nodes", true ) );
508 setHierarchyType( resMgr->integerValue( "Geometry", "dependency_tree_hierarchy_type", 0 ) );
513 void DependencyTree_View::onMoveNodes( bool theIsMoveNodes )
515 std::map<std::string,DependencyTree_Object*>::const_iterator i;
516 for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
517 DependencyTree_Object* object = myTreeMap[ i->first ];
519 object->setMovable( theIsMoveNodes );
523 void DependencyTree_View::onHierarchyType()
525 myHierarchyDepth->setRange( 0, checkMaxLevelsNumber() );
526 if( myHierarchyDepth->value() > checkMaxLevelsNumber() )
527 myHierarchyDepth->setValue( checkMaxLevelsNumber() );
529 if( myHierarchyDepth->value() == 0 )
530 myLevelsNumber = myHierarchyDepth->maximum();
532 myLevelsNumber = myHierarchyDepth->value();
536 void DependencyTree_View::updateView()
543 myLevelsObject.clear();
546 std::map<std::string,DependencyTree_Object*>::const_iterator i;
547 for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
548 DependencyTree_Object* object = myTreeMap[ i->first ];
549 if( isItemAdded( object ) && object )
550 removeItem( object );
555 std::map<std::pair<DependencyTree_Object*,DependencyTree_Object*>, DependencyTree_Arrow* >::const_iterator j;
556 for (j = Arrows.begin(); j != Arrows.end(); j++ ) {
557 DependencyTree_Arrow* object = Arrows[ j->first ];
558 if( isItemAdded( object ) && object )
559 removeItem( object );
566 qthread = new DependencyTree_ComputeDlg_QThread(this);// = DependencyTree_ComputeDlg_QThread(this);// const_cast<DependencyTree_View*>(this) );
567 cancelAction->setVisible( true );
568 progressAction->setVisible(true);
569 myNodesMovable->setEnabled(false);
570 myHierarchyDepth->setEnabled( false);
571 myDisplayAscendants->setEnabled( false );
572 myDisplayDescendants->setEnabled( false );
573 myTimer = startTimer(100); // millisecs
577 void DependencyTree_View::onRedrawTree()
582 void DependencyTree_View::onCancel()
585 cancelButton->setText( tr("CANCELING"));
586 cancelButton->setEnabled(false);
587 killTimer( myTimer );
588 qthread->killTimer( myTimer );
589 qthread->deleteLater();
593 void DependencyTree_View::timerEvent(QTimerEvent *event)
595 if ( !cancelButton->isChecked() ) // not yet cancelled
596 // progressBar->setValue( progressBar->maximum() * qthread.getMesh()->GetComputeProgress() );
597 progressBar->setValue( iter++ );
599 if(!myIsCompute || qthread->isFinished())
601 cancelAction->setVisible( false );
602 progressAction->setVisible(false);
603 cancelButton->setText( tr("CANCEL"));
604 cancelButton->setEnabled(true);
605 myNodesMovable->setEnabled( true );
606 myHierarchyDepth->setEnabled( true );
607 myDisplayAscendants->setEnabled( true );
608 myDisplayDescendants->setEnabled( true );
614 void DependencyTree_View::closeEvent(QCloseEvent *event)
616 if(qthread->isRunning())
624 void DependencyTree_View::setIsCompute( bool theIsCompute )
626 myIsCompute = theIsCompute;
629 void DependencyTree_View::setHierarchyType( const int theType )
634 myDisplayAscendants->setChecked( true );
635 myDisplayDescendants->setChecked( true );
638 myDisplayAscendants->setChecked( true );
639 myDisplayDescendants->setChecked( false );
642 myDisplayAscendants->setChecked( false );
643 myDisplayDescendants->setChecked( true );
650 void DependencyTree_View::setNodesMovable( const bool theIsMovable )
652 myNodesMovable->setChecked( theIsMovable );
655 void DependencyTree_View::setPrefBackgroundColor( const QColor& theColor )
657 if( isForegroundEnabled() )
659 setForegroundColor( theColor );
663 setBackgroundColor( theColor );
666 void DependencyTree_View::setNodeColor( const QColor& theColor )
668 std::map<std::string,DependencyTree_Object*>::const_iterator i;
669 for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
670 DependencyTree_Object* object = myTreeMap[ i->first ];
671 object->setColor( theColor );
675 void DependencyTree_View::setMainNodeColor( const QColor& theColor )
677 std::map<std::string,DependencyTree_Object*>::const_iterator i;
678 for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
679 DependencyTree_Object* object = myTreeMap[ i->first ];
680 object->setMainObjectColor( theColor );
684 void DependencyTree_View::setSelectNodeColor( const QColor& theColor )
686 std::map<std::string,DependencyTree_Object*>::const_iterator i;
687 for (i = myTreeMap.begin(); i != myTreeMap.end(); i++ ) {
688 DependencyTree_Object* object = myTreeMap[ i->first ];
689 object->setSelectColor( theColor );
693 void DependencyTree_View::setArrowColor( const QColor& theColor )
695 std::map<std::pair<DependencyTree_Object*,DependencyTree_Object*>, DependencyTree_Arrow* >::const_iterator j;
696 for (j = Arrows.begin(); j != Arrows.end(); j++ ) {
697 DependencyTree_Arrow* arrow = Arrows[ j->first ];
698 arrow->setColor( theColor );
702 void DependencyTree_View::setHighlightArrowColor( const QColor& theColor )
704 std::map<std::pair<DependencyTree_Object*,DependencyTree_Object*>, DependencyTree_Arrow* >::const_iterator j;
705 for (j = Arrows.begin(); j != Arrows.end(); j++ ) {
706 DependencyTree_Arrow* arrow = Arrows[ j->first ];
707 arrow->setHighlightColor( theColor );
711 void DependencyTree_View::setSelectArrowColor( const QColor& theColor )
713 std::map<std::pair<DependencyTree_Object*,DependencyTree_Object*>, DependencyTree_Arrow* >::const_iterator j;
714 for (j = Arrows.begin(); j != Arrows.end(); j++ ) {
715 DependencyTree_Arrow* arrow = Arrows[ j->first ];
716 arrow->setSelectColor( theColor );
720 int DependencyTree_View::select( const QRectF& theRect, bool theIsAppend )
722 GraphicsView_ViewPort::select( theRect, theIsAppend );
724 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
726 LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
729 SALOME_ListIO listIO;
730 aSelMgr->clearSelected();
731 SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>(app->activeStudy());
732 SALOMEDS::Study_var aStudyDS = GeometryGUI::ClientStudyToStudy( study->studyDS());
733 int StudyId = aStudyDS->StudyId();
734 for( initSelected(); moreSelected(); nextSelected() )
735 if( DependencyTree_Object* aDepObject = dynamic_cast<DependencyTree_Object*>( selectedObject() ) ) {
736 GEOM::_objref_GEOM_BaseObject* object = GeometryGUI::GetGeomGen()->GetObject( StudyId, aDepObject->getEntry().c_str() );
737 CORBA::String_var aChildEntry = object->GetStudyEntry();
738 Handle(SALOME_InteractiveObject) tmpIO =
739 new SALOME_InteractiveObject( aChildEntry.in(), "GEOM", "TEMP_IO");
740 listIO.Append(tmpIO);
742 aSelMgr->setSelectedObjects( listIO, true );
745 //================================================================================
746 //================================================================================
748 DependencyTree_ComputeDlg_QThread::DependencyTree_ComputeDlg_QThread(DependencyTree_View* theView)
753 void DependencyTree_ComputeDlg_QThread::run()
755 myView->setIsCompute( true );
756 myView->onRedrawTree();
759 bool DependencyTree_ComputeDlg_QThread::result()
764 void DependencyTree_ComputeDlg_QThread::cancel()
766 myView->setIsCompute( false );
769 ////================================================================================
770 ////================================================================================
772 //DependencyTree_ComputeDlg_QThreadQDialog::DependencyTree_ComputeDlg_QThreadQDialog(QWidget* parent,
773 // DependencyTree_View* theView)
775 // Qt::WindowSystemMenuHint |
776 // Qt::WindowCloseButtonHint |
778 // Qt::WindowMaximizeButtonHint),
779 // qthread( theView )
782 // setWindowTitle(tr("TITLE"));
783 // setMinimumWidth( 200 );
785 // cancelButton = new QPushButton(tr("CANCEL"));
786 // cancelButton->setDefault(true);
787 // cancelButton->setCheckable(true);
789 // progressBar = new QProgressBar(this);
790 // progressBar->setMinimum( 0 );
791 // progressBar->setMaximum( 1000 );
793 // QGridLayout* layout = new QGridLayout(this);
794 // layout->setMargin( 11 );
795 // layout->setSpacing( 6 );
797 // layout->addWidget(progressBar, row++, 0, 1, 2);
798 // layout->addWidget(cancelButton, row++, 0, 1, 2);
802 // connect(cancelButton, SIGNAL(clicked()), this, SLOT(onCancel()));
804 // startTimer(300); // millisecs
808 //bool DependencyTree_ComputeDlg_QThreadQDialog::result()
810 // return qthread.result();
813 //void DependencyTree_ComputeDlg_QThreadQDialog::onCancel()
816 // cancelButton->setText( tr("CANCELING"));
817 // cancelButton->setEnabled(false);
820 //void DependencyTree_ComputeDlg_QThreadQDialog::timerEvent(QTimerEvent *event)
822 // if ( !cancelButton->isChecked() ) // not yet cancelled
823 // // progressBar->setValue( progressBar->maximum() * qthread.getMesh()->GetComputeProgress() );
824 // progressBar->setValue( 10 );
826 // if(qthread.isFinished())
834 //void DependencyTree_ComputeDlg_QThreadQDialog::closeEvent(QCloseEvent *event)
836 // if(qthread.isRunning())