2 // File : QAD_Study.cxx
3 // Created : UI team, 05.09.00
4 // Descr : Study for QAD-based application
6 // Modified : Mon Dec 03 14:20:05 2001
7 // Author : Nicolas REJNERI
10 // Copyright : Open CASCADE 2001
14 \class QAD_Study QAD_Study.h
15 \brief Study for QAD-based application.
19 #include "QAD_Tools.h"
20 #include "QAD_Desktop.h"
21 #include "QAD_Study.h"
22 #include "QAD_RightFrame.h"
23 #include "QAD_LeftFrame.h"
24 #include "QAD_MessageBox.h"
25 #include "QAD_Application.h"
26 #include "QAD_ObjectBrowser.h"
27 #include "QAD_PyInterp.h"
28 #include "QAD_Config.h"
30 #include "utilities.h"
32 #include "SALOME_Selection.h"
33 #include "SALOME_TypeFilter.hxx"
34 #include "SALOME_InteractiveObject.hxx"
35 #include "SALOME_ListIteratorOfListIO.hxx"
37 #include <SALOMEconfig.h>
38 #include CORBA_SERVER_HEADER(SALOMEDS)
40 // OPEN CASCADE Include
41 #include <Standard_Failure.hxx>
44 #include <qapplication.h>
50 QAD_Study::QAD_Study(QAD_Application* app,
51 SALOMEDS::Study_var aStudy,
52 const QString& path ) :
53 myOperationState( Undef ),
55 myActiveStudyFrame( 0 ),
56 myStudyFrameCount( 0 ),
61 myTitle = QAD_Tools::getFileNameFromPath( path, false );
68 myStudyFrames.clear();
71 myStudyFrames.setAutoDelete( true );
72 myOperations.setAutoDelete( true );
73 myChildWidgets.setAutoDelete( true );
75 /* create python interpreter */
76 _interp = new QAD_PyInterp();
79 /* create default selection */
80 //NRI Selection( "Salome" );
81 Selection( QAD_Application::getDesktop()->getComponentUserName( "KERNEL" ) );
83 /* create study frame */
85 createStudyFrame( getNextStudyFrameName() );
87 /* set default Undo/Redo limit */
88 QAD_ASSERT_DEBUG_ONLY( !myStudy->_is_nil() );
89 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
90 SB->UndoLimit( MAX_UNDO );
96 QAD_Study::~QAD_Study ()
102 Returns TRUE if Study is created correctly. Returns FALSE otherwise.
104 bool QAD_Study::getResult()
110 //=======================================================================//
111 // StudyFrames management //
112 //=======================================================================//
116 void QAD_Study::addStudyFrame(QAD_StudyFrame* sf )
118 myStudyFrames.append( sf );
120 sf->getRightFrame()->getViewFrame()->setPopupServer( myApp );
121 // Provide the same common popup menu commands for both the Object Browser and 3D viewer
122 sf->getLeftFrame()->getObjectBrowser()->setPopupServer( myApp );
124 /* icon of Study Frame */
125 const QPixmap& icon = myApp->getApplicationIcon();
126 if ( !icon.isNull() )
127 sf->setIcon ( icon );
130 QAD_ASSERT ( connect( sf, SIGNAL(sfStudyFrameActivated(QAD_StudyFrame*) ),
131 SLOT(onStudyFrameActivated(QAD_StudyFrame*))) );
134 QAD_ASSERT ( connect( sf,
135 SIGNAL(sfStudyFrameClosing(QAD_StudyFrame*) ),
137 SLOT(onLastStudyFrameClosing(QAD_StudyFrame*))) );
140 myActiveStudyFrame = sf;
144 Removes studyframe from the list
146 void QAD_Study::removeStudyFrame( QAD_StudyFrame* sf )
149 if (!myStudy->IsEmpty()) {
150 SALOMEDS::SObject_var fatherSF = myStudy->FindObjectID(sf->entry());
151 if (!fatherSF->_is_nil()) {
152 SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder();
153 aStudyBuilder->RemoveObject(fatherSF);
156 updateObjBrowser( true );
158 myStudyFrames.removeRef( sf );
163 Returns number of study frames
165 int QAD_Study::getStudyFramesCount() const
167 return myStudyFrames.count();
171 Returns study frame by its index in list
173 QAD_StudyFrame* QAD_Study::getStudyFrame( unsigned i )
175 return myStudyFrames.at(i);
179 Returns study frame by its name or null if not found
181 QAD_StudyFrame* QAD_Study::getStudyFrameByName ( const QString& name )
183 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() )
185 if ( sf->title().compare(name) == 0 ) {
193 Returns first study frame in the list
195 QAD_StudyFrame* QAD_Study::getFirstStudyFrame()
197 return myStudyFrames.first();
201 Returns last study frame in the list
203 QAD_StudyFrame* QAD_Study::getLastStudyFrame()
205 return myStudyFrames.last();
209 Returns the vector of studyframes
211 const QList<QAD_StudyFrame>& QAD_Study::getStudyFrames() const
213 return myStudyFrames;
217 Returns the active study frame
219 QAD_StudyFrame* QAD_Study::getActiveStudyFrame() const
221 return myActiveStudyFrame;
224 //=======================================================================//
225 // Study properties //
226 //=======================================================================//
228 Returns reference to supporting application
230 QAD_Application* QAD_Study::getApp() const
236 Returns the name of document ( filename without path and extension )
238 const QString& QAD_Study::getTitle() const
244 Returns the absolute file path of this document
246 const QString& QAD_Study::getPath() const
252 Changes the name of document
254 void QAD_Study::setTitle( const QString& path )
258 QString title = QAD_Tools::getFileNameFromPath( path, false );
259 QAD_ASSERT_DEBUG_ONLY ( !title.isNull() );
261 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf ; sf = myStudyFrames.next() )
263 QString oldName = sf->title();
264 int k = oldName.find( myTitle, 0, false );
265 QString restName = ( oldName.length() > myTitle.length() + k) ?
266 oldName.right(oldName.length() - (myTitle.length() + k) + 1) :
273 int l = restName.find( "#", 0, false );
274 int ll = restName.length();
275 newName = title + restName.mid( l, ll-l );
277 newName = oldName.mid(0, k);
278 newName = newName + title + restName;
280 sf->setTitle( newName );
285 Selection( QAD_Application::getDesktop()->getActiveComponent() );
289 Returns whether the document is active
291 bool QAD_Study::isActive() const
297 Returns whether the document is read only
299 bool QAD_Study::isReadOnly() const
305 Sets read-only property
307 void QAD_Study::setReadOnly(bool state)
309 myIsReadOnly = state;
312 //=======================================================================//
313 // Study operations //
314 //=======================================================================//
316 Performs specific study frame related actions when it is activated.
317 By default resumes all suspended operations.
319 void QAD_Study::onStudyFrameActivated( QAD_StudyFrame* activeStudyFrame )
321 static int IS_FIRST_STUDY = 1;
322 if(IS_FIRST_STUDY){ //for normally initialize "salome.py and ..."
323 _interp->run(""); IS_FIRST_STUDY = 0;
325 // bool found = false;
326 for ( QAD_StudyFrame* studyframe = myStudyFrames.first(); studyframe; studyframe = myStudyFrames.next() ) {
327 if ( studyframe == activeStudyFrame) { /* one of my study frames */
329 // if ( !myActiveStudyFrame || myActiveStudyFrame != activeStudyFrame ) {
330 myActiveStudyFrame = activeStudyFrame;
331 //NRI if ( !myIsActive ) {
333 resumeAllOperations();
334 /* activate application */
335 myApp->onStudyActivated( this );
342 // myActiveStudyFrame = 0;
347 Performs specific study related actions when it is deactivated.
348 By default suspends all performing operations.
350 void QAD_Study::onStudyDeactivated()
352 // MESSAGE ("QAD_Study::onStudyDeactivated init. ");
354 suspendAllOperations();
355 // MESSAGE ("QAD_Study::onStudyDeactivated done. ");
359 Closes all study frames of the study and performs other specific study
360 related actions needed for proper closing of the study
362 void QAD_Study::close()
364 if ( !myStudy->_is_nil() )
365 abortAllOperations();
366 /* clear each study frame */
367 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.first() ) {
370 qApp->processEvents();
371 qApp->processEvents();
372 removeStudyFrame(sf);
375 /* delete all studyframes */
376 myStudyFrames.clear();
377 myOperations.clear();
378 myChildWidgets.clear();
380 // QWorkspace* ws = QAD_Application::getDesktop()->getMainFrame();
381 // if (/* !ws->activeWindow() && */ws->windowList().count() > 0 )
382 // ws->activateWindow(ws->windowList().last());
385 //=======================================================================//
386 // Operations management //
387 //=======================================================================//
389 Returns number of completed operations
391 int QAD_Study::getOperationsCount() const
393 return myOperations.count();
397 Returns the state of the last operation
399 OperationState QAD_Study::getOperationState() const
401 return myOperationState;
405 Returns operation by its index in list
407 QAD_Operation* QAD_Study::getOperation( unsigned i)
409 return ( myOperations.isEmpty() ? 0 : myOperations.at(i) );
413 Returns performing operation launched first
415 QAD_Operation* QAD_Study::getFirstOperation()
417 return ( myOperations.isEmpty() ? 0 : myOperations.first() );
421 Returns performing operation launched last
423 QAD_Operation* QAD_Study::getLastOperation()
425 return ( myOperations.isEmpty() ? 0 : myOperations.last() );
429 Aborts all performing operations
431 void QAD_Study::abortAllOperations()
433 for ( QAD_Operation* op = myOperations.last(); op;
434 op = myOperations.prev() )
439 Resumes all performing operations
441 void QAD_Study::resumeAllOperations()
443 for ( QAD_Operation* op = myOperations.first(); op;
444 op = myOperations.next() )
449 Suspendes all performing operations
451 void QAD_Study::suspendAllOperations()
453 // MESSAGE ( " QAD_Study::suspendAllOperations init. " )
454 for ( QAD_Operation* op = myOperations.last(); op;
455 op = myOperations.prev() )
460 Initializes the operation and checks its compatibility
461 with another operation in process if any.
462 Returns 'true' if init'ed OK, 'false' otherwise.
464 bool QAD_Study::initOperation( QAD_Operation* op )
467 { /* can't start a non-const operation */
468 if ( op->changesData() )
470 QAD_MessageBox::error1( QAD_Application::getDesktop(), tr("ERR_ERROR"),
471 tr("ERR_DOC_READONLY"), tr("BUT_OK") );
476 /* Add the new operation
478 if ( myOperations.isEmpty() )
479 myOperations.append( op );
482 /* Check compatibility of new operation with the existing operations.
483 Since each operations is checked in that way, it's enough to check
484 the last operation only */
485 if ( !getLastOperation()->compatibleWith( op ) )
487 if ( QAD_MessageBox::warn2( QAD_Application::getDesktop(), tr("WRN_WARNING"),
488 tr("QUE_ABORTCURRENTOPERATION"), tr("BUT_YES"),
489 tr("BUT_NO"), QAD_YES, QAD_NO, QAD_NO )
492 getLastOperation()->abort();
494 myOperations.append( op );
500 Called when operation was finished.
501 Removes appointed operation from the list and aborted all operations
504 void QAD_Study::clearOperation( QAD_Operation* op)
506 if ( myOperations.contains( op ) )
508 /* abort all the operations launched after 'op' */
509 for ( QAD_Operation* cur = myOperations.last(); cur;
510 cur = myOperations.prev() )
512 if ( cur == op ) break;
515 myOperations.remove( op );
522 QAD_StudyFrame* QAD_Study::createStudyFrame( const QString& title, ViewType theViewType)
524 QAD_Desktop* parent = QAD_Application::getDesktop();
525 //srn: Forbid appending Interface Applicative and its children to UseCase
526 myStudy->EnableUseCaseAutoFilling(false);
528 SALOMEDS::SComponent_var father = myStudy->FindComponent("Interface Applicative");
529 SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder();
530 SALOMEDS::GenericAttribute_var anAttr;
531 SALOMEDS::AttributeName_var aName;
532 SALOMEDS::AttributeComment_var aComment;
533 SALOMEDS::AttributeSelectable_var aSelAttr;
535 // mpv : where is "NewCommand" call?
536 // aStudyBuilder->CommitCommand();
538 // mpv : is study is locked, then next code will raise exception. So, temporary unlock study
539 int aLocked = myStudy->GetProperties()->IsLocked();
540 if (aLocked) myStudy->GetProperties()->SetLocked(false);
542 if ( father->_is_nil() ) {
543 father = aStudyBuilder->NewComponent("Interface Applicative");
544 anAttr = aStudyBuilder->FindOrCreateAttribute(father, "AttributeName");
545 aName = SALOMEDS::AttributeName::_narrow(anAttr);
546 aName->SetValue("Interface Applicative");
548 anAttr = aStudyBuilder->FindOrCreateAttribute(father, "AttributeSelectable");
549 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
550 aSelAttr->SetSelectable(false);
553 //VRV: T2.5 - add default viewer
554 if(theViewType == VIEW_TYPE_MAX) {
555 QString viewerValue = QAD_CONFIG->getSetting( "Viewer:DefaultViewer" );
557 theViewType = (ViewType)viewerValue.toInt( &ok, 10 );
558 if (!ok || theViewType < VIEW_OCC || theViewType >= VIEW_TYPE_MAX)
559 theViewType = VIEW_VTK;
561 //QApplication::restoreOverrideCursor();
562 QAD_StudyFrame* sf = NULL;
563 SALOMEDS::SObject_var newObj = aStudyBuilder->NewObject(father);
564 if ( theViewType == VIEW_OCC) {
565 // MESSAGE ("Create Study Frame for OCC viewer");
566 sf = new QAD_StudyFrame ( this, parent->getMainFrame(),
567 title, _interp, VIEW_OCC );
569 Standard_CString name = strdup(sf->title().latin1());
570 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName");
571 aName = SALOMEDS::AttributeName::_narrow(anAttr);
572 aName->SetValue(name);
573 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeComment");
574 aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
575 aComment->SetValue("OCC");
577 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeSelectable");
578 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
579 aSelAttr->SetSelectable(false);
581 else if ( theViewType == VIEW_VTK) {
582 // MESSAGE ("Create Study Frame for VTK viewer");
583 sf = new QAD_StudyFrame ( this, parent->getMainFrame(),
584 title, _interp, VIEW_VTK );
585 Standard_CString name = strdup(sf->title().latin1());
586 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName");
587 aName = SALOMEDS::AttributeName::_narrow(anAttr);
588 aName->SetValue(name);
589 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeComment");
590 aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
591 aComment->SetValue("VTK");
593 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeSelectable");
594 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
595 aSelAttr->SetSelectable(false);
597 else if ( theViewType == VIEW_GRAPHSUPERV) {
598 //MESSAGE ("Create Study Frame for SUPER`VISOR Graph");
599 sf = new QAD_StudyFrame ( this, parent->getMainFrame(),
600 title, _interp, VIEW_GRAPHSUPERV );
601 Standard_CString name = strdup(sf->title().latin1());
602 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName");
603 aName = SALOMEDS::AttributeName::_narrow(anAttr);
604 aName->SetValue(name);
605 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeComment");
606 aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
607 aComment->SetValue("GRAPH");
609 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeSelectable");
610 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
611 aSelAttr->SetSelectable(false);
613 else if ( theViewType == VIEW_PLOT2D ) {
614 sf = new QAD_StudyFrame ( this, parent->getMainFrame(),
615 title, _interp, VIEW_PLOT2D );
616 Standard_CString name = strdup(sf->title().latin1());
617 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName");
618 aName = SALOMEDS::AttributeName::_narrow(anAttr);
619 aName->SetValue(name);
620 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeComment");
621 aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
622 aComment->SetValue("PLOT2D");
624 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeSelectable");
625 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
626 aSelAttr->SetSelectable(false);
628 //VRV: T2.5 - add default viewer
630 sf->resize( int (0.8*parent->getMainFrame()->width()),
631 int (0.8*parent->getMainFrame()->height() ));
633 sf->setEntry(newObj->GetID());
637 updateObjBrowser( true );
639 parent->setSettings();
643 if (aLocked) myStudy->GetProperties()->SetLocked(true);
645 // T2.12 - add the word "locked" to study frame captions if this study is locked
648 myStudy->EnableUseCaseAutoFilling(true);
654 Updates study frame captions according to IsLocked study flag
656 void QAD_Study::updateCaptions()
658 QString appendix("");
660 if (!myStudy->_is_nil()) {
661 SALOMEDS::AttributeStudyProperties_var propAttr = myStudy->GetProperties();
663 if (!propAttr->_is_nil() ) {
664 if ( propAttr->IsModified() )
665 appendix += " (" + tr("PRP_STUDY_MODIFIED") + ")";
667 appendix += " (" + tr("PRP_STUDY_SAVED") + ")";
671 if (!propAttr->_is_nil() && propAttr->IsLocked()) {
672 appendix += " (" + tr("PRP_STUDY_LOCKED") + ")";
676 for (myStudyFrames.first(); myStudyFrames.current(); myStudyFrames.next()) {
677 myStudyFrames.current()->setCaption(myStudyFrames.current()->title() + appendix);
683 Shows the active study frame.
684 Called by Desktop after 'new' and 'open' commands.
686 void QAD_Study::show()
688 for (myStudyFrames.first(); myStudyFrames.current(); myStudyFrames.next()) {
689 myStudyFrames.current()->show();
693 //=======================================================================//
694 // Study properties (CAF related) //
695 //=======================================================================//
698 Returns connected SALOMEDS_Study object
700 SALOMEDS::Study_var QAD_Study::getStudyDocument()
706 Returns whether the document was saved in file
708 bool QAD_Study::isSaved() const
710 return myStudy->IsSaved();
714 Returns whether the document is modified
716 bool QAD_Study::isModified() const
718 // return myStudy->IsModified(); // VSR:05/12/02 - USE PROPERTY : MODIFIED FLAG
719 if ( !myStudy->_is_nil() ) {
720 SALOMEDS::AttributeStudyProperties_var propAttr = myStudy->GetProperties();
721 if ( !propAttr->_is_nil() )
722 return propAttr->IsModified();
727 bool QAD_Study::undo()
730 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
733 /* Update Object Browser */
734 updateObjBrowser( true );
736 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
738 sf->getRightFrame()->getViewFrame()->undo( myStudy, sf->entry() );
742 // mpv 07.03.2003 SAL1805: clear selection must be called after study structure changed
743 SALOME_Selection* Sel = SALOME_Selection::Selection( getSelection() );
744 Sel->ClearIObjects();
746 // mpv : undo command can raise exception, if study is locked
747 catch ( SALOMEDS::StudyBuilder::LockProtection& ) {
748 QAD_MessageBox::warn1 ((QWidget*)QAD_Application::getDesktop(),
749 QObject::tr("WRN_WARNING"),
750 QObject::tr("WRN_STUDY_LOCKED"),
751 QObject::tr("BUT_OK"));
754 catch ( Standard_Failure ) {
762 bool QAD_Study::redo()
765 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
768 /* Update Object Browser */
769 updateObjBrowser( true );
772 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
773 sf->getRightFrame()->getViewFrame()->redo( myStudy, sf->entry() );
777 // mpv 07.03.2003 SAL1805: clear selection must be called after study structure changed
778 SALOME_Selection* Sel = SALOME_Selection::Selection( getSelection() );
779 Sel->ClearIObjects();
781 // mpv : redo command can raise exception, if study is locked
782 catch ( SALOMEDS::StudyBuilder::LockProtection& ) {
783 QAD_MessageBox::warn1 ((QWidget*)QAD_Application::getDesktop(),
784 QObject::tr("WRN_WARNING"),
785 QObject::tr("WRN_STUDY_LOCKED"),
786 QObject::tr("BUT_OK"));
789 catch ( Standard_Failure ) {
795 Check if possible to perform 'undo' command
797 bool QAD_Study::canUndo() const
799 if ( myStudy->_is_nil() )
802 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
803 return (SB->GetAvailableUndos() > 0 );
807 Check if possible to perform 'redo' command
809 bool QAD_Study::canRedo() const
811 if ( myStudy->_is_nil() )
814 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
815 return (SB->GetAvailableRedos() > 0 );
819 Called when operation is started
820 Returns 'true' if started OK, 'false' otherwise.
822 bool QAD_Study::onOperationStarted( QAD_Operation* op )
824 if ( !initOperation( op ) )
828 { /* start a new transaction */
829 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
832 catch ( Standard_Failure )
834 /* May be, a transaction is already open,
835 it's not a problem */
837 myOperationState = Started;
842 Called when operation is finished
844 void QAD_Study::onOperationFinished( QAD_Operation* op )
847 /* transaction is completed OK */
848 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
851 catch ( SALOMEDS::StudyBuilder::LockProtection& ) {
852 QApplication::restoreOverrideCursor();
853 QAD_MessageBox::warn1 ((QWidget*)QAD_Application::getDesktop(),
854 QObject::tr("WRN_WARNING"),
855 QObject::tr("WRN_STUDY_LOCKED"),
856 QObject::tr("BUT_OK"));
857 onOperationAborted(op);
858 updateObjBrowser( true );
861 catch ( Standard_Failure ) {
863 myOperationState = Finished;
864 emit docOperationTerminated( true ); /* terminated successfully */
867 // mpv: any operation must call this method, otherwise study may not be saved
868 updateObjBrowser( true );
870 clearOperation( op ); /* we don't need the operation anymore */
871 QAD_Application::getDesktop()->putInfo ( tr("INF_DOC_OPERATIONFINISHED") );
875 Called when operation is suspended
877 void QAD_Study::onOperationSuspended( QAD_Operation* op )
879 myOperationState = Suspended;
883 Called when operation is resumed
885 void QAD_Study::onOperationResumed( QAD_Operation* op )
887 myOperationState = Resumed;
891 Called when operation is aborted
893 void QAD_Study::onOperationAborted(QAD_Operation* op)
896 /* abort transaction */
897 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
900 catch ( Standard_Failure )
903 myOperationState = Aborted;
904 emit docOperationTerminated( false ); /* aborted */
909 QAD_Application::getDesktop()->putInfo ( tr("INF_DOC_OPERATIONABORTED") );
913 Call when the last study frame is closing
915 void QAD_Study::onLastStudyFrameClosing( QAD_StudyFrame* sf )
917 if ( myStudyFrames.count() == 1 ) {
918 emit docClosing( this );
920 removeStudyFrame( sf );
922 // QWorkspace* ws = QAD_Application::getDesktop()->getMainFrame();
923 // if ( !ws->activeWindow() && ws->windowList().count() > 0 )
924 // ws->activatePreviousWindow();
928 Call when created a new window3d
930 QAD_StudyFrame* QAD_Study::newWindow3d(QString name, ViewType theViewType, bool toShow)
932 if(name == "") name = getNextStudyFrameName();
933 QAD_StudyFrame* sf = createStudyFrame( name, theViewType );
935 if (toShow) showFrame(sf);
936 // sf->compressLeft(); /* compress LeftFrame */
937 sf->getRightFrame()->compressBottom(); /* compress BottomFrame */
943 void QAD_Study::showFrame(QAD_StudyFrame* theFrame){
944 theFrame->resize(0.64*QAD_Application::getDesktop()->getMainFrame()->width(),
945 0.64*QAD_Application::getDesktop()->getMainFrame()->height());
953 Call when setted a message
955 void QAD_Study::setMessage(const char* message)
957 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
958 sf->getRightFrame()->getMessage()->setMessage(message);
963 Call when updated object browser
965 void QAD_Study::updateObjBrowser( bool updateSelection )
967 QAD_Desktop* parent = QAD_Application::getDesktop();
968 SALOME_ModuleCatalog::ModuleCatalog_var Catalog = parent->getCatalogue();
970 QString ActiveComp = parent->getActiveComponent();
972 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
973 sf->getLeftFrame()->getObjectBrowser()->Update();
976 /* update selection */
977 if ( updateSelection && (myStudyFrames.count() > 0) ) {
978 SALOME_Selection* Sel = SALOME_Selection::Selection( getSelection() );
979 SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
980 for(;It.More();It.Next()) {
981 if ( Sel->AddIObject( It.Value() ) == 0 ) {
982 highlight( It.Value(), true, false );
991 Updates only Use Case Browser
993 void QAD_Study::updateUseCaseBrowser( bool updateSelection )
995 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
996 sf->getLeftFrame()->getObjectBrowser()->UpdateUseCaseBrowser();
998 /* update selection */
999 if ( updateSelection && (myStudyFrames.count() > 0) ) {
1000 SALOME_Selection* Sel = SALOME_Selection::Selection( getSelection() );
1001 SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
1002 for(;It.More();It.Next()) {
1003 if ( Sel->AddIObject( It.Value() ) == 0 ) {
1004 highlight( It.Value(), true, false );
1007 /* update viewers */
1013 unHighlight All Interactive Objects in All Devices
1015 void QAD_Study::unHighlightAll()
1017 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
1018 /* Device = Viewers */
1019 sf->getRightFrame()->getViewFrame()->unHighlightAll();
1021 /* Device = ObjectBrowser */
1022 sf->getLeftFrame()->getObjectBrowser()->unHighlightAll();
1027 Returns type of Interactive Object
1029 int QAD_Study::typeIObject( const Handle(SALOME_InteractiveObject)& IObject )
1031 bool IsStudyObject = isInStudy( IObject );
1032 bool IsGraphicalObject = isInViewer( IObject );
1034 // MESSAGE ( "IsStudyObject : " << IsStudyObject )
1035 // MESSAGE ( "IsGraphicalObject : " << IsGraphicalObject )
1037 if ( IsStudyObject ) {
1038 if ( IsGraphicalObject )
1039 return 1; /* StudyObject and GraphicalObject */
1041 return 2; /* only StudyObject */
1043 if ( IsGraphicalObject )
1044 return 3; /* only GraphicalObject */
1046 return 4; /* may be a component */
1053 Renames the Interactive Object in All Devices
1055 void QAD_Study::renameIObject( const Handle(SALOME_InteractiveObject)& IObject, QString newName )
1057 if (myStudy->GetProperties()->IsLocked()) {
1058 QAD_MessageBox::warn1 ((QWidget*)QAD_Application::getDesktop(),
1059 QObject::tr("WRN_WARNING"),
1060 QObject::tr("WRN_STUDY_LOCKED"),
1061 QObject::tr("BUT_OK"));
1065 highlight( IObject, false );
1067 int nbFrames = myStudyFrames.count();
1068 for ( int i = 0; i < nbFrames; i++ ) {
1069 QAD_StudyFrame* sf = myStudyFrames.at( i );
1070 switch ( typeIObject(IObject) ) {
1073 /* Device = Viewers */
1074 sf->getRightFrame()->getViewFrame()->rename(IObject, newName);
1075 /* Device = ObjectBrowser */
1076 sf->getLeftFrame()->getObjectBrowser()->rename(IObject, newName);
1081 /* Device = ObjectBrowser */
1082 sf->getLeftFrame()->getObjectBrowser()->rename(IObject, newName);
1087 /* Device = Viewers */
1088 sf->getRightFrame()->getViewFrame()->rename(IObject, newName);
1093 QString ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1094 if ( !ActiveComp.isEmpty() ) {
1095 sf->getLeftFrame()->getObjectBrowser()->rename(IObject,newName);
1103 SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder();
1104 SALOMEDS::SObject_var obj = myStudy->FindObjectID( IObject->getEntry() );
1105 if ( !obj->_is_nil() ) {
1106 SALOMEDS::GenericAttribute_var anAttr;
1107 SALOMEDS::AttributeName_var aName;
1108 anAttr = aStudyBuilder->FindOrCreateAttribute(obj, "AttributeName");
1109 aName = SALOMEDS::AttributeName::_narrow(anAttr);
1110 aName->SetValue(strdup(newName.latin1()));
1113 // VSR 13/03/03 - rename Interactive object
1114 IObject->setName( ( char* )newName.latin1() );
1116 updateObjBrowser( true );
1120 Selects the Interactive Object in All Devices
1122 void QAD_Study::highlight( const Handle(SALOME_InteractiveObject)& IObject, bool highlight,bool immediatly )
1124 // MESSAGE ( " QAD_Study::highlight : " << highlight )
1125 int typeIO = typeIObject( IObject );
1127 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
1131 /* Device = Viewer */
1132 if (sf->getTypeView() >= 0 ) { /* Device = Viewers */
1133 sf->getRightFrame()->getViewFrame()->highlight(IObject, highlight, immediatly);
1135 /* Device = ObjectBrowser */
1136 sf->getLeftFrame()->getObjectBrowser()->highlight(IObject, highlight);
1141 /* Device = ObjectBrowser */
1142 sf->getLeftFrame()->getObjectBrowser()->highlight(IObject, highlight);
1147 /* Device = Viewer */
1148 if (sf->getTypeView() >= 0) { /* Device = Viewers */
1149 sf->getRightFrame()->getViewFrame()->highlight(IObject, highlight, immediatly);
1155 QString ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1156 if ( !ActiveComp.isEmpty() ) {
1157 sf->getLeftFrame()->getObjectBrowser()->highlight(IObject,highlight);
1166 Returns TRUE if the IObject is a Study Object. Returns FALSE otherwise.
1168 bool QAD_Study::isInStudy( const Handle(SALOME_InteractiveObject)& IObject )
1170 return IObject->hasEntry();
1174 Returns true if the IObject has a Graphical Object. Returns FALSE otherwise.
1176 bool QAD_Study::isInViewer( const Handle(SALOME_InteractiveObject)& IObject )
1179 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
1180 found = sf->getRightFrame()->getViewFrame()->isInViewer(IObject);
1188 Returns true if the IObject has a Graphical Object into studyframe. Returns FALSE otherwise.
1190 bool QAD_Study::isInViewer(const char* anEntry, const char* StudyFrameEntry)
1192 SALOMEDS::SObject_var RefSO;
1193 SALOMEDS::SObject_var SO = myStudy->FindObjectID(StudyFrameEntry);
1194 SALOMEDS::ChildIterator_var it = myStudy->NewChildIterator(SO);
1195 for (; it->More();it->Next()){
1196 SALOMEDS::SObject_var CSO= it->Value();
1197 if (CSO->ReferencedObject(RefSO))
1198 if ( strcmp( anEntry, RefSO->GetID() ) == 0 )
1206 Returns title for the new studyframe window
1208 QString QAD_Study::getNextStudyFrameName()
1210 QString numStudyFrame;
1211 numStudyFrame.sprintf("%s%d", "#", ++myStudyFrameCount );
1212 return myTitle + numStudyFrame; /* return unique name ( title + unique number) */
1217 Returns the Python interpreter that belongs to this study
1219 QAD_PyInterp* QAD_Study::get_PyInterp(void)
1225 Sets current selection.
1227 void QAD_Study::Selection( QString aSelection )
1229 if ( !SALOME_Selection::FindSelection( QString(myTitle + "_" + aSelection) ) )
1230 SALOME_Selection::CreateSelection( QString(myTitle + "_" + aSelection) );
1232 SALOME_Selection* Sel = SALOME_Selection::Selection( QString(myTitle + "_" + aSelection) );
1234 mySelection = aSelection;
1238 Returns the name of current selection
1240 QString QAD_Study::getSelection()
1242 return QString (myTitle + "_" + mySelection);
1246 Returns the study Id.
1248 int QAD_Study::getStudyId()
1250 return myStudy->StudyId();
1253 void QAD_Study::update3dViewers()
1255 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
1256 sf->getRightFrame()->getViewFrame()->Repaint();
1260 /* Adds new child window */
1261 void QAD_Study::addChildWidget( QWidget* child )
1263 if ( myChildWidgets.findRef( child ) < 0 ) {
1264 myChildWidgets.append( child );
1265 child->installEventFilter( this );
1270 Removes child window from the list ( and deletes it )
1272 void QAD_Study::removeChildWidget( QWidget* child )
1274 myChildWidgets.removeRef( child );
1278 bool QAD_Study::eventFilter( QObject* o, QEvent* e)
1280 int index = myChildWidgets.findRef( ( QWidget* )o );
1281 if ( index >= 0 && e->type() == QEvent::Close ) {
1282 myChildWidgets.at( index )->removeEventFilter( this );
1283 myChildWidgets.remove( ( QWidget* )o );
1286 return QObject::eventFilter( o, e );