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 Selection( "Salome" );
82 /* create study frame */
84 createStudyFrame( getNextStudyFrameName() );
86 /* set default Undo/Redo limit */
87 QAD_ASSERT_DEBUG_ONLY( !myStudy->_is_nil() );
88 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
89 SB->UndoLimit( MAX_UNDO );
95 QAD_Study::~QAD_Study ()
101 Returns TRUE if Study is created correctly. Returns FALSE otherwise.
103 bool QAD_Study::getResult()
109 //=======================================================================//
110 // StudyFrames management //
111 //=======================================================================//
115 void QAD_Study::addStudyFrame(QAD_StudyFrame* sf )
117 myStudyFrames.append( sf );
119 sf->getRightFrame()->getViewFrame()->setPopupServer( myApp );
120 // Provide the same common popup menu commands for both the Object Browser and 3D viewer
121 sf->getLeftFrame()->getObjectBrowser()->setPopupServer( myApp );
123 /* icon of Study Frame */
124 const QPixmap& icon = myApp->getApplicationIcon();
125 if ( !icon.isNull() )
126 sf->setIcon ( icon );
129 QAD_ASSERT ( connect( sf, SIGNAL(sfStudyFrameActivated(QAD_StudyFrame*) ),
130 SLOT(onStudyFrameActivated(QAD_StudyFrame*))) );
133 QAD_ASSERT ( connect( sf,
134 SIGNAL(sfStudyFrameClosing(QAD_StudyFrame*) ),
136 SLOT(onLastStudyFrameClosing(QAD_StudyFrame*))) );
139 myActiveStudyFrame = sf;
143 Removes studyframe from the list
145 void QAD_Study::removeStudyFrame( QAD_StudyFrame* sf )
148 if (!myStudy->IsEmpty()) {
149 SALOMEDS::SObject_var fatherSF = myStudy->FindObjectID(sf->entry());
150 if (!fatherSF->_is_nil()) {
151 SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder();
152 aStudyBuilder->RemoveObject(fatherSF);
155 updateObjBrowser( true );
157 myStudyFrames.removeRef( sf );
162 Returns number of study frames
164 int QAD_Study::getStudyFramesCount() const
166 return myStudyFrames.count();
170 Returns study frame by its index in list
172 QAD_StudyFrame* QAD_Study::getStudyFrame( unsigned i )
174 return myStudyFrames.at(i);
178 Returns study frame by its name or null if not found
180 QAD_StudyFrame* QAD_Study::getStudyFrameByName ( const QString& name )
182 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() )
184 if ( sf->title().compare(name) == 0 ) {
192 Returns first study frame in the list
194 QAD_StudyFrame* QAD_Study::getFirstStudyFrame()
196 return myStudyFrames.first();
200 Returns last study frame in the list
202 QAD_StudyFrame* QAD_Study::getLastStudyFrame()
204 return myStudyFrames.last();
208 Returns the vector of studyframes
210 const QList<QAD_StudyFrame>& QAD_Study::getStudyFrames() const
212 return myStudyFrames;
216 Returns the active study frame
218 QAD_StudyFrame* QAD_Study::getActiveStudyFrame() const
220 return myActiveStudyFrame;
223 //=======================================================================//
224 // Study properties //
225 //=======================================================================//
227 Returns reference to supporting application
229 QAD_Application* QAD_Study::getApp() const
235 Returns the name of document ( filename without path and extension )
237 const QString& QAD_Study::getTitle() const
243 Returns the absolute file path of this document
245 const QString& QAD_Study::getPath() const
251 Changes the name of document
253 void QAD_Study::setTitle( const QString& path )
257 QString title = QAD_Tools::getFileNameFromPath( path, false );
258 QAD_ASSERT_DEBUG_ONLY ( !title.isNull() );
260 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf ; sf = myStudyFrames.next() )
262 QString oldName = sf->title();
263 int k = oldName.find( myTitle, 0, false );
264 QString restName = ( oldName.length() > myTitle.length() + k) ?
265 oldName.right(oldName.length() - (myTitle.length() + k) + 1) :
272 int l = restName.find( "#", 0, false );
273 int ll = restName.length();
274 newName = title + restName.mid( l, ll-l );
276 newName = oldName.mid(0, k);
277 newName = newName + title + restName;
279 sf->setTitle( newName );
284 Selection( QAD_Application::getDesktop()->getActiveComponent() );
288 Returns whether the document is active
290 bool QAD_Study::isActive() const
296 Returns whether the document is read only
298 bool QAD_Study::isReadOnly() const
304 Sets read-only property
306 void QAD_Study::setReadOnly(bool state)
308 myIsReadOnly = state;
311 //=======================================================================//
312 // Study operations //
313 //=======================================================================//
315 Performs specific study frame related actions when it is activated.
316 By default resumes all suspended operations.
318 void QAD_Study::onStudyFrameActivated( QAD_StudyFrame* activeStudyFrame )
320 static int IS_FIRST_STUDY = 1;
321 if(IS_FIRST_STUDY){ //for normally initialize "salome.py and ..."
322 _interp->run(""); IS_FIRST_STUDY = 0;
324 // bool found = false;
325 for ( QAD_StudyFrame* studyframe = myStudyFrames.first(); studyframe; studyframe = myStudyFrames.next() ) {
326 if ( studyframe == activeStudyFrame) { /* one of my study frames */
328 // if ( !myActiveStudyFrame || myActiveStudyFrame != activeStudyFrame ) {
329 myActiveStudyFrame = activeStudyFrame;
330 //NRI if ( !myIsActive ) {
332 resumeAllOperations();
333 /* activate application */
334 myApp->onStudyActivated( this );
341 // myActiveStudyFrame = 0;
346 Performs specific study related actions when it is deactivated.
347 By default suspends all performing operations.
349 void QAD_Study::onStudyDeactivated()
351 // MESSAGE ("QAD_Study::onStudyDeactivated init. ");
353 suspendAllOperations();
354 // MESSAGE ("QAD_Study::onStudyDeactivated done. ");
358 Closes all study frames of the study and performs other specific study
359 related actions needed for proper closing of the study
361 void QAD_Study::close()
363 if ( !myStudy->_is_nil() )
364 abortAllOperations();
365 /* clear each study frame */
366 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.first() ) {
369 qApp->processEvents();
370 qApp->processEvents();
371 removeStudyFrame(sf);
374 /* delete all studyframes */
375 myStudyFrames.clear();
376 myOperations.clear();
377 myChildWidgets.clear();
379 // QWorkspace* ws = QAD_Application::getDesktop()->getMainFrame();
380 // if (/* !ws->activeWindow() && */ws->windowList().count() > 0 )
381 // ws->activateWindow(ws->windowList().last());
384 //=======================================================================//
385 // Operations management //
386 //=======================================================================//
388 Returns number of completed operations
390 int QAD_Study::getOperationsCount() const
392 return myOperations.count();
396 Returns the state of the last operation
398 OperationState QAD_Study::getOperationState() const
400 return myOperationState;
404 Returns operation by its index in list
406 QAD_Operation* QAD_Study::getOperation( unsigned i)
408 return ( myOperations.isEmpty() ? 0 : myOperations.at(i) );
412 Returns performing operation launched first
414 QAD_Operation* QAD_Study::getFirstOperation()
416 return ( myOperations.isEmpty() ? 0 : myOperations.first() );
420 Returns performing operation launched last
422 QAD_Operation* QAD_Study::getLastOperation()
424 return ( myOperations.isEmpty() ? 0 : myOperations.last() );
428 Aborts all performing operations
430 void QAD_Study::abortAllOperations()
432 for ( QAD_Operation* op = myOperations.last(); op;
433 op = myOperations.prev() )
438 Resumes all performing operations
440 void QAD_Study::resumeAllOperations()
442 for ( QAD_Operation* op = myOperations.first(); op;
443 op = myOperations.next() )
448 Suspendes all performing operations
450 void QAD_Study::suspendAllOperations()
452 // MESSAGE ( " QAD_Study::suspendAllOperations init. " )
453 for ( QAD_Operation* op = myOperations.last(); op;
454 op = myOperations.prev() )
459 Initializes the operation and checks its compatibility
460 with another operation in process if any.
461 Returns 'true' if init'ed OK, 'false' otherwise.
463 bool QAD_Study::initOperation( QAD_Operation* op )
466 { /* can't start a non-const operation */
467 if ( op->changesData() )
469 QAD_MessageBox::error1( QAD_Application::getDesktop(), tr("ERR_ERROR"),
470 tr("ERR_DOC_READONLY"), tr("BUT_OK") );
475 /* Add the new operation
477 if ( myOperations.isEmpty() )
478 myOperations.append( op );
481 /* Check compatibility of new operation with the existing operations.
482 Since each operations is checked in that way, it's enough to check
483 the last operation only */
484 if ( !getLastOperation()->compatibleWith( op ) )
486 if ( QAD_MessageBox::warn2( QAD_Application::getDesktop(), tr("WRN_WARNING"),
487 tr("QUE_ABORTCURRENTOPERATION"), tr("BUT_YES"),
488 tr("BUT_NO"), QAD_YES, QAD_NO, QAD_NO )
491 getLastOperation()->abort();
493 myOperations.append( op );
499 Called when operation was finished.
500 Removes appointed operation from the list and aborted all operations
503 void QAD_Study::clearOperation( QAD_Operation* op)
505 if ( myOperations.contains( op ) )
507 /* abort all the operations launched after 'op' */
508 for ( QAD_Operation* cur = myOperations.last(); cur;
509 cur = myOperations.prev() )
511 if ( cur == op ) break;
514 myOperations.remove( op );
521 QAD_StudyFrame* QAD_Study::createStudyFrame( const QString& title, ViewType theViewType)
523 QAD_Desktop* parent = QAD_Application::getDesktop();
524 //srn: Forbid appending Interface Applicative and its children to UseCase
525 myStudy->EnableUseCaseAutoFilling(false);
527 SALOMEDS::SComponent_var father = myStudy->FindComponent("Interface Applicative");
528 SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder();
529 SALOMEDS::GenericAttribute_var anAttr;
530 SALOMEDS::AttributeName_var aName;
531 SALOMEDS::AttributeComment_var aComment;
532 SALOMEDS::AttributeSelectable_var aSelAttr;
534 // mpv : where is "NewCommand" call?
535 // aStudyBuilder->CommitCommand();
537 // mpv : is study is locked, then next code will raise exception. So, temporary unlock study
538 int aLocked = myStudy->GetProperties()->IsLocked();
539 if (aLocked) myStudy->GetProperties()->SetLocked(false);
541 if ( father->_is_nil() ) {
542 father = aStudyBuilder->NewComponent("Interface Applicative");
543 anAttr = aStudyBuilder->FindOrCreateAttribute(father, "AttributeName");
544 aName = SALOMEDS::AttributeName::_narrow(anAttr);
545 aName->SetValue("Interface Applicative");
547 anAttr = aStudyBuilder->FindOrCreateAttribute(father, "AttributeSelectable");
548 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
549 aSelAttr->SetSelectable(false);
552 //VRV: T2.5 - add default viewer
553 if(theViewType == VIEW_TYPE_MAX) {
554 QString viewerValue = QAD_CONFIG->getSetting( "Viewer:DefaultViewer" );
556 theViewType = (ViewType)viewerValue.toInt( &ok, 10 );
557 if (!ok || theViewType < VIEW_OCC || theViewType >= VIEW_TYPE_MAX)
558 theViewType = VIEW_VTK;
560 //QApplication::restoreOverrideCursor();
561 QAD_StudyFrame* sf = NULL;
562 SALOMEDS::SObject_var newObj = aStudyBuilder->NewObject(father);
563 if ( theViewType == VIEW_OCC) {
564 // MESSAGE ("Create Study Frame for OCC viewer");
565 sf = new QAD_StudyFrame ( this, parent->getMainFrame(),
566 title, _interp, VIEW_OCC );
568 Standard_CString name = strdup(sf->title().latin1());
569 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName");
570 aName = SALOMEDS::AttributeName::_narrow(anAttr);
571 aName->SetValue(name);
572 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeComment");
573 aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
574 aComment->SetValue("OCC");
576 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeSelectable");
577 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
578 aSelAttr->SetSelectable(false);
580 else if ( theViewType == VIEW_VTK) {
581 // MESSAGE ("Create Study Frame for VTK viewer");
582 sf = new QAD_StudyFrame ( this, parent->getMainFrame(),
583 title, _interp, VIEW_VTK );
584 Standard_CString name = strdup(sf->title().latin1());
585 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName");
586 aName = SALOMEDS::AttributeName::_narrow(anAttr);
587 aName->SetValue(name);
588 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeComment");
589 aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
590 aComment->SetValue("VTK");
592 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeSelectable");
593 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
594 aSelAttr->SetSelectable(false);
596 else if ( theViewType == VIEW_GRAPHSUPERV) {
597 //MESSAGE ("Create Study Frame for SUPER`VISOR Graph");
598 sf = new QAD_StudyFrame ( this, parent->getMainFrame(),
599 title, _interp, VIEW_GRAPHSUPERV );
600 Standard_CString name = strdup(sf->title().latin1());
601 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName");
602 aName = SALOMEDS::AttributeName::_narrow(anAttr);
603 aName->SetValue(name);
604 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeComment");
605 aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
606 aComment->SetValue("GRAPH");
608 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeSelectable");
609 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
610 aSelAttr->SetSelectable(false);
612 else if ( theViewType == VIEW_PLOT2D ) {
613 sf = new QAD_StudyFrame ( this, parent->getMainFrame(),
614 title, _interp, VIEW_PLOT2D );
615 Standard_CString name = strdup(sf->title().latin1());
616 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeName");
617 aName = SALOMEDS::AttributeName::_narrow(anAttr);
618 aName->SetValue(name);
619 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeComment");
620 aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
621 aComment->SetValue("PLOT2D");
623 anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeSelectable");
624 aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
625 aSelAttr->SetSelectable(false);
627 //VRV: T2.5 - add default viewer
629 sf->resize( int (0.8*parent->getMainFrame()->width()),
630 int (0.8*parent->getMainFrame()->height() ));
632 sf->setEntry(newObj->GetID());
636 updateObjBrowser( true );
638 parent->setSettings();
642 if (aLocked) myStudy->GetProperties()->SetLocked(true);
644 // T2.12 - add the word "locked" to study frame captions if this study is locked
647 myStudy->EnableUseCaseAutoFilling(true);
653 Updates study frame captions according to IsLocked study flag
655 void QAD_Study::updateCaptions()
657 QString appendix("");
659 if (!myStudy->_is_nil()) {
660 SALOMEDS::AttributeStudyProperties_var propAttr = myStudy->GetProperties();
662 if (!propAttr->_is_nil() ) {
663 if ( propAttr->IsModified() )
664 appendix += " (" + tr("PRP_STUDY_MODIFIED") + ")";
666 appendix += " (" + tr("PRP_STUDY_SAVED") + ")";
670 if (!propAttr->_is_nil() && propAttr->IsLocked()) {
671 appendix += " (" + tr("PRP_STUDY_LOCKED") + ")";
675 for (myStudyFrames.first(); myStudyFrames.current(); myStudyFrames.next()) {
676 myStudyFrames.current()->setCaption(myStudyFrames.current()->title() + appendix);
682 Shows the active study frame.
683 Called by Desktop after 'new' and 'open' commands.
685 void QAD_Study::show()
687 for (myStudyFrames.first(); myStudyFrames.current(); myStudyFrames.next()) {
688 myStudyFrames.current()->show();
692 //=======================================================================//
693 // Study properties (CAF related) //
694 //=======================================================================//
697 Returns connected SALOMEDS_Study object
699 SALOMEDS::Study_var QAD_Study::getStudyDocument()
705 Returns whether the document was saved in file
707 bool QAD_Study::isSaved() const
709 return myStudy->IsSaved();
713 Returns whether the document is modified
715 bool QAD_Study::isModified() const
717 // return myStudy->IsModified(); // VSR:05/12/02 - USE PROPERTY : MODIFIED FLAG
718 if ( !myStudy->_is_nil() ) {
719 SALOMEDS::AttributeStudyProperties_var propAttr = myStudy->GetProperties();
720 if ( !propAttr->_is_nil() )
721 return propAttr->IsModified();
726 bool QAD_Study::undo()
729 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
732 /* Update Object Browser */
733 updateObjBrowser( true );
735 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
737 sf->getRightFrame()->getViewFrame()->undo( myStudy, sf->entry() );
741 // mpv 07.03.2003 SAL1805: clear selection must be called after study structure changed
742 SALOME_Selection* Sel = SALOME_Selection::Selection( getSelection() );
743 Sel->ClearIObjects();
745 // mpv : undo command can raise exception, if study is locked
746 catch ( SALOMEDS::StudyBuilder::LockProtection& ) {
747 QAD_MessageBox::warn1 ((QWidget*)QAD_Application::getDesktop(),
748 QObject::tr("WRN_WARNING"),
749 QObject::tr("WRN_STUDY_LOCKED"),
750 QObject::tr("BUT_OK"));
753 catch ( Standard_Failure ) {
761 bool QAD_Study::redo()
764 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
767 /* Update Object Browser */
768 updateObjBrowser( true );
771 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
772 sf->getRightFrame()->getViewFrame()->redo( myStudy, sf->entry() );
776 // mpv 07.03.2003 SAL1805: clear selection must be called after study structure changed
777 SALOME_Selection* Sel = SALOME_Selection::Selection( getSelection() );
778 Sel->ClearIObjects();
780 // mpv : redo command can raise exception, if study is locked
781 catch ( SALOMEDS::StudyBuilder::LockProtection& ) {
782 QAD_MessageBox::warn1 ((QWidget*)QAD_Application::getDesktop(),
783 QObject::tr("WRN_WARNING"),
784 QObject::tr("WRN_STUDY_LOCKED"),
785 QObject::tr("BUT_OK"));
788 catch ( Standard_Failure ) {
794 Check if possible to perform 'undo' command
796 bool QAD_Study::canUndo() const
798 if ( myStudy->_is_nil() )
801 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
802 return (SB->GetAvailableUndos() > 0 );
806 Check if possible to perform 'redo' command
808 bool QAD_Study::canRedo() const
810 if ( myStudy->_is_nil() )
813 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
814 return (SB->GetAvailableRedos() > 0 );
818 Called when operation is started
819 Returns 'true' if started OK, 'false' otherwise.
821 bool QAD_Study::onOperationStarted( QAD_Operation* op )
823 if ( !initOperation( op ) )
827 { /* start a new transaction */
828 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
831 catch ( Standard_Failure )
833 /* May be, a transaction is already open,
834 it's not a problem */
836 myOperationState = Started;
841 Called when operation is finished
843 void QAD_Study::onOperationFinished( QAD_Operation* op )
846 /* transaction is completed OK */
847 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
850 catch ( SALOMEDS::StudyBuilder::LockProtection& ) {
851 QApplication::restoreOverrideCursor();
852 QAD_MessageBox::warn1 ((QWidget*)QAD_Application::getDesktop(),
853 QObject::tr("WRN_WARNING"),
854 QObject::tr("WRN_STUDY_LOCKED"),
855 QObject::tr("BUT_OK"));
856 onOperationAborted(op);
857 updateObjBrowser( true );
860 catch ( Standard_Failure ) {
862 myOperationState = Finished;
863 emit docOperationTerminated( true ); /* terminated successfully */
866 // mpv: any operation must call this method, otherwise study may not be saved
867 updateObjBrowser( true );
869 clearOperation( op ); /* we don't need the operation anymore */
870 QAD_Application::getDesktop()->putInfo ( tr("INF_DOC_OPERATIONFINISHED") );
874 Called when operation is suspended
876 void QAD_Study::onOperationSuspended( QAD_Operation* op )
878 myOperationState = Suspended;
882 Called when operation is resumed
884 void QAD_Study::onOperationResumed( QAD_Operation* op )
886 myOperationState = Resumed;
890 Called when operation is aborted
892 void QAD_Study::onOperationAborted(QAD_Operation* op)
895 /* abort transaction */
896 SALOMEDS::StudyBuilder_var SB = myStudy->NewBuilder();
899 catch ( Standard_Failure )
902 myOperationState = Aborted;
903 emit docOperationTerminated( false ); /* aborted */
908 QAD_Application::getDesktop()->putInfo ( tr("INF_DOC_OPERATIONABORTED") );
912 Call when the last study frame is closing
914 void QAD_Study::onLastStudyFrameClosing( QAD_StudyFrame* sf )
916 if ( myStudyFrames.count() == 1 ) {
917 emit docClosing( this );
919 removeStudyFrame( sf );
921 // QWorkspace* ws = QAD_Application::getDesktop()->getMainFrame();
922 // if ( !ws->activeWindow() && ws->windowList().count() > 0 )
923 // ws->activatePreviousWindow();
927 Call when created a new window3d
929 QAD_StudyFrame* QAD_Study::newWindow3d(QString name, ViewType theViewType, bool toShow)
931 if(name == "") name = getNextStudyFrameName();
932 QAD_StudyFrame* sf = createStudyFrame( name, theViewType );
934 if (toShow) showFrame(sf);
935 // sf->compressLeft(); /* compress LeftFrame */
936 sf->getRightFrame()->compressBottom(); /* compress BottomFrame */
942 void QAD_Study::showFrame(QAD_StudyFrame* theFrame){
943 theFrame->resize(0.64*QAD_Application::getDesktop()->getMainFrame()->width(),
944 0.64*QAD_Application::getDesktop()->getMainFrame()->height());
952 Call when setted a message
954 void QAD_Study::setMessage(const char* message)
956 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
957 sf->getRightFrame()->getMessage()->setMessage(message);
962 Call when updated object browser
964 void QAD_Study::updateObjBrowser( bool updateSelection )
966 QAD_Desktop* parent = QAD_Application::getDesktop();
967 SALOME_ModuleCatalog::ModuleCatalog_var Catalog = parent->getCatalogue();
969 QString ActiveComp = parent->getActiveComponent();
971 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
972 sf->getLeftFrame()->getObjectBrowser()->Update();
975 /* update selection */
976 if ( updateSelection && (myStudyFrames.count() > 0) ) {
977 SALOME_Selection* Sel = SALOME_Selection::Selection( getSelection() );
978 SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
979 for(;It.More();It.Next()) {
980 if ( Sel->AddIObject( It.Value() ) == 0 ) {
981 highlight( It.Value(), true, false );
990 Updates only Use Case Browser
992 void QAD_Study::updateUseCaseBrowser( bool updateSelection )
994 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
995 sf->getLeftFrame()->getObjectBrowser()->UpdateUseCaseBrowser();
997 /* update selection */
998 if ( updateSelection && (myStudyFrames.count() > 0) ) {
999 SALOME_Selection* Sel = SALOME_Selection::Selection( getSelection() );
1000 SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
1001 for(;It.More();It.Next()) {
1002 if ( Sel->AddIObject( It.Value() ) == 0 ) {
1003 highlight( It.Value(), true, false );
1006 /* update viewers */
1012 unHighlight All Interactive Objects in All Devices
1014 void QAD_Study::unHighlightAll()
1016 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
1017 /* Device = Viewers */
1018 sf->getRightFrame()->getViewFrame()->unHighlightAll();
1020 /* Device = ObjectBrowser */
1021 sf->getLeftFrame()->getObjectBrowser()->unHighlightAll();
1026 Returns type of Interactive Object
1028 int QAD_Study::typeIObject( const Handle(SALOME_InteractiveObject)& IObject )
1030 bool IsStudyObject = isInStudy( IObject );
1031 bool IsGraphicalObject = isInViewer( IObject );
1033 // MESSAGE ( "IsStudyObject : " << IsStudyObject )
1034 // MESSAGE ( "IsGraphicalObject : " << IsGraphicalObject )
1036 if ( IsStudyObject ) {
1037 if ( IsGraphicalObject )
1038 return 1; /* StudyObject and GraphicalObject */
1040 return 2; /* only StudyObject */
1042 if ( IsGraphicalObject )
1043 return 3; /* only GraphicalObject */
1045 return 4; /* may be a component */
1052 Renames the Interactive Object in All Devices
1054 void QAD_Study::renameIObject( const Handle(SALOME_InteractiveObject)& IObject, QString newName )
1056 if (myStudy->GetProperties()->IsLocked()) {
1057 QAD_MessageBox::warn1 ((QWidget*)QAD_Application::getDesktop(),
1058 QObject::tr("WRN_WARNING"),
1059 QObject::tr("WRN_STUDY_LOCKED"),
1060 QObject::tr("BUT_OK"));
1064 highlight( IObject, false );
1066 int nbFrames = myStudyFrames.count();
1067 for ( int i = 0; i < nbFrames; i++ ) {
1068 QAD_StudyFrame* sf = myStudyFrames.at( i );
1069 switch ( typeIObject(IObject) ) {
1072 /* Device = Viewers */
1073 sf->getRightFrame()->getViewFrame()->rename(IObject, newName);
1074 /* Device = ObjectBrowser */
1075 sf->getLeftFrame()->getObjectBrowser()->rename(IObject, newName);
1080 /* Device = ObjectBrowser */
1081 sf->getLeftFrame()->getObjectBrowser()->rename(IObject, newName);
1086 /* Device = Viewers */
1087 sf->getRightFrame()->getViewFrame()->rename(IObject, newName);
1092 QString ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1093 if ( !ActiveComp.isEmpty() ) {
1094 sf->getLeftFrame()->getObjectBrowser()->rename(IObject,newName);
1102 SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder();
1103 SALOMEDS::SObject_var obj = myStudy->FindObjectID( IObject->getEntry() );
1104 if ( !obj->_is_nil() ) {
1105 SALOMEDS::GenericAttribute_var anAttr;
1106 SALOMEDS::AttributeName_var aName;
1107 anAttr = aStudyBuilder->FindOrCreateAttribute(obj, "AttributeName");
1108 aName = SALOMEDS::AttributeName::_narrow(anAttr);
1109 aName->SetValue(strdup(newName.latin1()));
1112 // VSR 13/03/03 - rename Interactive object
1113 IObject->setName( ( char* )newName.latin1() );
1115 updateObjBrowser( true );
1119 Selects the Interactive Object in All Devices
1121 void QAD_Study::highlight( const Handle(SALOME_InteractiveObject)& IObject, bool highlight,bool immediatly )
1123 // MESSAGE ( " QAD_Study::highlight : " << highlight )
1124 int typeIO = typeIObject( IObject );
1126 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
1130 /* Device = Viewer */
1131 if (sf->getTypeView() >= 0 ) { /* Device = Viewers */
1132 sf->getRightFrame()->getViewFrame()->highlight(IObject, highlight, immediatly);
1134 /* Device = ObjectBrowser */
1135 sf->getLeftFrame()->getObjectBrowser()->highlight(IObject, highlight);
1140 /* Device = ObjectBrowser */
1141 sf->getLeftFrame()->getObjectBrowser()->highlight(IObject, highlight);
1146 /* Device = Viewer */
1147 if (sf->getTypeView() >= 0) { /* Device = Viewers */
1148 sf->getRightFrame()->getViewFrame()->highlight(IObject, highlight, immediatly);
1154 QString ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1155 if ( !ActiveComp.isEmpty() ) {
1156 sf->getLeftFrame()->getObjectBrowser()->highlight(IObject,highlight);
1165 Returns TRUE if the IObject is a Study Object. Returns FALSE otherwise.
1167 bool QAD_Study::isInStudy( const Handle(SALOME_InteractiveObject)& IObject )
1169 return IObject->hasEntry();
1173 Returns true if the IObject has a Graphical Object. Returns FALSE otherwise.
1175 bool QAD_Study::isInViewer( const Handle(SALOME_InteractiveObject)& IObject )
1178 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
1179 found = sf->getRightFrame()->getViewFrame()->isInViewer(IObject);
1187 Returns true if the IObject has a Graphical Object into studyframe. Returns FALSE otherwise.
1189 bool QAD_Study::isInViewer(const char* anEntry, const char* StudyFrameEntry)
1191 SALOMEDS::SObject_var RefSO;
1192 SALOMEDS::SObject_var SO = myStudy->FindObjectID(StudyFrameEntry);
1193 SALOMEDS::ChildIterator_var it = myStudy->NewChildIterator(SO);
1194 for (; it->More();it->Next()){
1195 SALOMEDS::SObject_var CSO= it->Value();
1196 if (CSO->ReferencedObject(RefSO))
1197 if ( strcmp( anEntry, RefSO->GetID() ) == 0 )
1205 Returns title for the new studyframe window
1207 QString QAD_Study::getNextStudyFrameName()
1209 QString numStudyFrame;
1210 numStudyFrame.sprintf("%s%d", "#", ++myStudyFrameCount );
1211 return myTitle + numStudyFrame; /* return unique name ( title + unique number) */
1216 Returns the Python interpreter that belongs to this study
1218 QAD_PyInterp* QAD_Study::get_PyInterp(void)
1224 Sets current selection.
1226 void QAD_Study::Selection( QString aSelection )
1228 if ( !SALOME_Selection::FindSelection( QString(myTitle + "_" + aSelection) ) )
1229 SALOME_Selection::CreateSelection( QString(myTitle + "_" + aSelection) );
1231 SALOME_Selection* Sel = SALOME_Selection::Selection( QString(myTitle + "_" + aSelection) );
1233 mySelection = aSelection;
1237 Returns the name of current selection
1239 QString QAD_Study::getSelection()
1241 return QString (myTitle + "_" + mySelection);
1245 Returns the study Id.
1247 int QAD_Study::getStudyId()
1249 return myStudy->StudyId();
1252 void QAD_Study::update3dViewers()
1254 for ( QAD_StudyFrame* sf = myStudyFrames.first(); sf; sf = myStudyFrames.next() ) {
1255 sf->getRightFrame()->getViewFrame()->Repaint();
1259 /* Adds new child window */
1260 void QAD_Study::addChildWidget( QWidget* child )
1262 if ( myChildWidgets.findRef( child ) < 0 ) {
1263 myChildWidgets.append( child );
1264 child->installEventFilter( this );
1269 Removes child window from the list ( and deletes it )
1271 void QAD_Study::removeChildWidget( QWidget* child )
1273 myChildWidgets.removeRef( child );
1277 bool QAD_Study::eventFilter( QObject* o, QEvent* e)
1279 int index = myChildWidgets.findRef( ( QWidget* )o );
1280 if ( index >= 0 && e->type() == QEvent::Close ) {
1281 myChildWidgets.at( index )->removeEventFilter( this );
1282 myChildWidgets.remove( ( QWidget* )o );
1285 return QObject::eventFilter( o, e );