1 // SALOME SALOMEGUI : implementation of desktop and GUI kernel
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : QAD_ObjectBrowser.cxx
25 // Author : Nicolas REJNERI
30 #include "QAD_ObjectBrowserItem.h"
31 #include "QAD_ObjectBrowser.h"
32 #include "QAD_Application.h"
33 #include "QAD_MessageBox.h"
34 #include "QAD_Desktop.h"
35 #include "QAD_Config.h"
36 #include "QAD_Settings.h"
37 #include "QAD_Tools.h"
38 #include "QAD_RightFrame.h"
39 #include "SALOME_Selection.h"
40 #include "SALOME_InteractiveObject.hxx"
41 #include "SALOME_ListIteratorOfListIO.hxx"
42 #include "SALOMEGUI_SetValueDlg.h"
43 #include "SALOMEGUI_TableDlg.h"
44 #include "SALOMEGUI_NameDlg.h"
47 #include <qlistview.h>
49 #include <qpopupmenu.h>
50 #include <qtabwidget.h>
51 #include <qpushbutton.h>
56 #include <qdragobject.h>
57 #include <qstringlist.h>
59 //VRV: porting on Qt 3.0.5
60 #if QT_VERSION >= 0x030005
63 //VRV: porting on Qt 3.0.5
65 #define UC_NEW_EMPTY_ID 1000000
66 #define UC_NEW_COMP_ID 1000002
67 #define UC_NEW_FULL_ID 1000004
68 #define UC_NEW_COPY_ID 1000006
69 #define UC_APPEND_ID 1000008
70 #define UC_REMOVE_ID 1000010
71 #define UC_RENAME_ID 1000012
72 #define UC_CLEAR_ID 1000014
73 #define UC_SET_CURRENT_ID 1000016
76 Gets selected top-level items (i.e. not including sub-items) [ static ]
78 static void getSelectedParents( QListViewItem* listViewItem, QList<QListViewItem>& itemList )
80 QListViewItem* item = listViewItem->firstChild();
82 if ( item->isSelected() ) {
83 itemList.append( item );
86 getSelectedParents( item, itemList );
88 item = item->nextSibling();
92 Gets selected top-level items (i.e. not including sub-items) [ static ]
94 static void getSelectedParents( QListView* listView, QList<QListViewItem>& itemList, bool ignoreRoot = false )
97 QListViewItem* item = listView->firstChild();
99 if ( item->isSelected() && !ignoreRoot ) {
100 itemList.append( item );
103 getSelectedParents( item, itemList );
105 item = item->nextSibling();
109 Gets top-most parent item [ static ]
111 static QListViewItem* getTopParent( QListViewItem* item )
115 QListViewItem* p = item->parent();
118 while ( p->parent() ) {
124 Returns true if the item is top-level (root)
126 static bool isRootItem( QListViewItem* item )
128 return ( item->listView() && !item->parent() );
133 QAD_ObjectBrowser::QAD_ObjectBrowser( SALOMEDS::Study_var study, QWidget* parent, const char* name, WFlags fl )
134 : QTabWidget( parent, name, fl )
136 myStudy = SALOMEDS::Study::_duplicate( study );
137 myListViewMap.clear();
138 myUseCaseMap.clear();
145 QAD_ObjectBrowser::~QAD_ObjectBrowser()
147 if (!myStudy->_is_nil())
148 CORBA::release(myStudy);
152 Configures Object Browser and UseCase Browser.
153 Columns, Selection Mode and Palette.
155 void QAD_ObjectBrowser::setupListView()
157 QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
159 this->setTabPosition( QTabWidget::Bottom );
161 /* Reading setting : Columns for Value, OCAF Doc entry, object IOR, OCAF Doc ref entry and Chrono sorting */
162 QString AddColumn = QAD_CONFIG->getSetting( "ObjectBrowser:AddColumn" );
163 QString ValueColumn = QAD_CONFIG->getSetting( "ObjectBrowser:ValueColumn" );
164 QString ShowCHRONO_SORT = QAD_CONFIG->getSetting( "ObjectBrowser:CHRONO_SORT" );
166 /* create and setup Object Browser ================================= */
167 myListView = new QListView( this, "Object Browser");
168 myListView->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
169 myListView->setMinimumSize( 1, 1 );
170 myListView->setPalette( QAD_Application::getPalette( true ) );
172 /* First two columns = object name and value - always visible */
173 myListView->addColumn( tr( "OBJECT_BROWSER_OBJECT" ) ); /* Adding Object column */
174 myListView->addColumn( tr( "OBJECT_BROWSER_VALUE" ) ); /* Adding Value column */
175 myListView->addColumn( tr( "OBJECT_BROWSER_ENTRY" ) ); /* Adding Doc entry column */
176 myListView->addColumn( tr( "OBJECT_BROWSER_IOR" ) ); /* Adding Object IOR column */
177 myListView->addColumn( tr( "OBJECT_BROWSER_REFENTRY" ) ); /* Adding OCAF Doc ref entry column */
178 myListView->header()->setMovingEnabled( false );
181 myListView->header()->setClickEnabled( TRUE ); /* Enable clicking on the header */
182 myListView->setShowSortIndicator( TRUE ) ; /* Add user arrows to indicate the sort order : LPN */
183 myListView->setRootIsDecorated( TRUE ); /* Enable expand/collapse control for the root item */
184 myListView->setSelectionMode ( QListView::Extended ); /* Enable multiple selection */
185 myListView->setVScrollBarMode( QScrollView::AlwaysOn ); /* Set scrollbars always visible */
186 myListView->setHScrollBarMode( QScrollView::AlwaysOn ); /* ... */
188 /* Connect section */
189 //VRV: porting on Qt 3.0.5
190 #if QT_VERSION < 0x030005
191 connect( myListView, SIGNAL( rightButtonClicked( QListViewItem*, const QPoint&, int ) ),
192 this, SLOT( showPopupMenu( QListViewItem* ) ) );
194 connect( myListView, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint&, int ) ),
195 this, SLOT( showPopupMenu( QListViewItem* ) ) );
197 //VRV: porting on Qt 3.0.5
199 connect( myListView, SIGNAL( selectionChanged() ),
200 this, SLOT( onSelectedItem() ) );
201 connect( myListView, SIGNAL( expanded( QListViewItem* ) ),
202 this, SLOT( onExpanded( QListViewItem* ) ) );
203 connect( myListView, SIGNAL( collapsed( QListViewItem* ) ),
204 this, SLOT( onCollapsed( QListViewItem* ) ) );
206 /* create and setup UseCase Browser ================================ */
207 QWidget* vBox = new QWidget( this );
208 QVBoxLayout* vBoxLayout = new QVBoxLayout( vBox );
210 myUseCaseView = new QListView( vBox, "UseCase Browser");
211 myUseCaseView->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
212 myUseCaseView->setMinimumSize( 1, 1 );
213 myUseCaseView->setPalette( QAD_Application::getPalette( true ) );
215 /* First column = object name */
216 myUseCaseView->addColumn( tr( "OBJECT_BROWSER_OBJECT" ) );
218 myUseCaseView->header()->setClickEnabled( TRUE ); /* Enable clicking on the header */
219 myUseCaseView->setShowSortIndicator( TRUE ) ; /* Add user arrows to indicate the sort order : LPN */
220 myUseCaseView->setRootIsDecorated( TRUE ); /* Enable expand/collapse control for the root item */
221 myUseCaseView->setSelectionMode ( QListView::Extended ); /* Enable multiple selection */
222 myUseCaseView->setVScrollBarMode( QScrollView::AlwaysOn ); /* Set scrollbars always visible */
223 myUseCaseView->setHScrollBarMode( QScrollView::AlwaysOn ); /* ... */
224 myUseCaseView->header()->setMovingEnabled( false );
225 myUseCaseView->viewport()->setAcceptDrops( true );
226 myUseCaseView->installEventFilter( this );
227 myUseCaseView->viewport()->installEventFilter( this );
228 myUseCaseView->setSorting( -1 ) ;
229 vBoxLayout->addWidget( myUseCaseView );
231 myNewBtn = new QToolButton( vBox );
232 myNewBtn->setIconSet( resMgr->loadPixmap( "QAD", tr("ICON_UC_NEW") ) );
233 myNewBtn->setAutoRaise( true );
234 QToolTip::add( myNewBtn, tr( "UC_NEW_ID" ), QAD_Application::getDesktop()->toolTipGroup(), tr( "UC_NEW_TIP" ) );
235 myAddBtn = new QToolButton( vBox );
236 myAddBtn->setIconSet( resMgr->loadPixmap( "QAD", tr("ICON_UC_ADD") ) );
237 myAddBtn->setAutoRaise( true );
238 QToolTip::add( myAddBtn, tr( "UC_APPEND_ID" ), QAD_Application::getDesktop()->toolTipGroup(), tr( "UC_APPEND_TIP" ) );
239 myDelBtn = new QToolButton( vBox );
240 myDelBtn->setIconSet( resMgr->loadPixmap( "QAD", tr("ICON_UC_REMOVE") ) );
241 myDelBtn->setAutoRaise( true );
242 QToolTip::add( myDelBtn, tr( "UC_REMOVE_ID" ), QAD_Application::getDesktop()->toolTipGroup(), tr( "UC_REMOVE_TIP" ) );
243 myClearBtn = new QToolButton( vBox );
244 myClearBtn->setIconSet( resMgr->loadPixmap( "QAD", tr("ICON_UC_CLEAR") ) );
245 myClearBtn->setAutoRaise( true );
246 QToolTip::add( myClearBtn, tr( "UC_CLEAR_ID" ), QAD_Application::getDesktop()->toolTipGroup(), tr( "UC_CLEAR_TIP" ) );
247 myCurrentBtn = new QToolButton( vBox );
248 myCurrentBtn->setIconSet( resMgr->loadPixmap( "QAD", tr("ICON_UC_SET_CURRENT") ) );
249 myCurrentBtn->setAutoRaise( true );
250 QToolTip::add( myCurrentBtn, tr( "UC_SET_CURRENT_ID" ), QAD_Application::getDesktop()->toolTipGroup(), tr( "UC_SET_CURRENT_TIP" ) );
252 QHBoxLayout* btnLayout = new QHBoxLayout;
253 btnLayout->setMargin( 3 ); btnLayout->setSpacing( 3 );
254 btnLayout->addWidget( myNewBtn );
255 btnLayout->addStretch();
256 btnLayout->addSpacing( 5 );
257 btnLayout->addStretch();
258 btnLayout->addWidget( myAddBtn );
259 btnLayout->addWidget( myDelBtn );
260 btnLayout->addStretch();
261 btnLayout->addSpacing( 5 );
262 btnLayout->addStretch();
263 btnLayout->addWidget( myClearBtn );
264 btnLayout->addStretch();
265 btnLayout->addSpacing( 5 );
266 btnLayout->addStretch();
267 btnLayout->addWidget( myCurrentBtn );
268 btnLayout->addStretch();
270 vBoxLayout->addLayout( btnLayout );
272 connect( myNewBtn, SIGNAL( clicked() ), this, SLOT( onUseCaseBtn() ) );
273 connect( myAddBtn, SIGNAL( clicked() ), this, SLOT( onUseCaseBtn() ) );
274 connect( myDelBtn, SIGNAL( clicked() ), this, SLOT( onUseCaseBtn() ) );
275 connect( myClearBtn, SIGNAL( clicked() ), this, SLOT( onUseCaseBtn() ) );
276 connect( myCurrentBtn, SIGNAL( clicked() ), this, SLOT( onUseCaseBtn() ) );
278 /* Connect section */
279 #if QT_VERSION < 0x030005
280 connect( myUseCaseView, SIGNAL( rightButtonClicked( QListViewItem*, const QPoint&, int ) ),
281 this, SLOT( showPopupMenu( QListViewItem* ) ) );
283 connect( myUseCaseView, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint&, int ) ),
284 this, SLOT( showPopupMenu( QListViewItem* ) ) );
287 connect( myUseCaseView, SIGNAL( selectionChanged() ),
288 this, SLOT( onSelectedItem() ) );
290 /* add Object Browser and UseCase Browser as pages ================= */
291 this->addTab( myListView, tr( "TLT_OBJECT_BROWSER" ) );
292 this->addTab( vBox, tr( "TLT_USECASE_BROWSER" ) );
294 setShowInfoColumns( AddColumn == "true" );
295 setShowValueColumn( ValueColumn == "true" );
296 setEnableChronoSort( ShowCHRONO_SORT == "true" );
298 resize( QSize( 100, 400 ) );
305 bool QAD_ObjectBrowser::eventFilter( QObject* o, QEvent* e )
307 QAD_Desktop* Desktop = (QAD_Desktop*) QAD_Application::getDesktop();
308 QAD_Study* myActiveStudy = Desktop->getActiveStudy();
309 if ( myStudy->_is_nil() )
310 return QTabWidget::eventFilter( o, e );
312 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
313 if ( o == myUseCaseView->viewport() ) {
314 if ( e->type() == QEvent::MouseButtonPress ) {
315 // Test if clicked on selection and start drag if necessary
316 QMouseEvent* me = ( QMouseEvent* )e;
317 QAD_ObjectBrowserItem* item = ( QAD_ObjectBrowserItem* )( myUseCaseView->itemAt( me->pos() ) );
318 if ( item && item->isSelected() && me->button() == LeftButton) {
319 if ( me->pos().x() > myUseCaseView->header()->sectionPos( myUseCaseView->header()->mapToIndex( 0 ) ) +
320 myUseCaseView->treeStepSize() * ( item->depth() + ( myUseCaseView->rootIsDecorated() ? 1 : 0 ) ) +
321 myUseCaseView->itemMargin() ||
322 me->pos().x() < myUseCaseView->header()->sectionPos( myUseCaseView->header()->mapToIndex( 0 ) ) ) {
323 QStringList entryList;
324 QListViewItemIterator it( myUseCaseView );
326 for ( ; it.current(); ++it ) {
327 QAD_ObjectBrowserItem* selItem = ( QAD_ObjectBrowserItem* )( it.current() );
328 if ( selItem->isSelected() ) {
329 if ( isRootItem( selItem ) ) {
334 entryList.append( selItem->getEntry() );
338 if ( done && !entryList.isEmpty() ) {
339 QTextDrag *d = new QTextDrag( entryList.join("*"), myUseCaseView->viewport() );
346 else if ( e->type() == QEvent::DragMove ) {
347 QDragMoveEvent* dme = ( QDragMoveEvent* )e;
348 if ( dme->source() == myUseCaseView->viewport() ) {
356 else if ( e->type() == QEvent::Drop ) {
357 QDropEvent* de = ( QDropEvent* )e;
359 QAD_ObjectBrowserItem* dropItem = ( QAD_ObjectBrowserItem* )( myUseCaseView->itemAt( de->pos() ) );
360 if ( de->source() == myUseCaseView->viewport() ) {
361 if ( QTextDrag::decode( de, text ) && dropItem && !dropItem->isSelected() ) {
362 QAD_ObjectBrowserItem* useCaseItem = ( QAD_ObjectBrowserItem* )getTopParent( dropItem );
364 if ( !UCBuilder->_is_nil() ) {
365 UCBuilder->SetRootCurrent();
366 if ( useCaseItem != dropItem ) {
367 SALOMEDS::SObject_var dropObject = myStudy->FindObjectID( dropItem->getEntry() );
368 if ( !dropObject->_is_nil() )
369 UCBuilder->SetCurrentObject( dropObject );
371 QStringList entryList = QStringList::split( "*", text, false );
372 // if Move action then first remove all selected items
373 if ( de->action() == QDropEvent::Move ) {
374 QList<QListViewItem> ucSelected;
375 ucSelected.setAutoDelete( false );
376 getSelectedParents( myUseCaseView, ucSelected );
377 for ( int j = 0; j < entryList.count(); j++ ) {
378 QAD_ObjectBrowserItem* delItem = ( QAD_ObjectBrowserItem* )( ucSelected.at( j ) );
379 QAD_ObjectBrowserItem* ucDelItem = ( QAD_ObjectBrowserItem* )getTopParent( delItem );
380 SALOMEDS::SObject_var delSO = myStudy->FindObjectID( delItem->getEntry() );
381 if ( !delSO->_is_nil() && ucDelItem ) {
382 UCBuilder->Remove( delSO );
386 // then try to append items to destination
387 for ( int i = 0; i < entryList.count(); i++ ) {
388 SALOMEDS::SObject_var SO = myStudy->FindObjectID( entryList[i] );
389 if ( !SO->_is_nil() ) {
390 UCBuilder->Remove( SO );
391 UCBuilder->Append( SO );
394 myActiveStudy->updateUseCaseBrowser();
406 else if ( o == myUseCaseView ) {
407 if ( e->type() == QEvent::KeyPress ) {
408 QKeyEvent* ke = ( QKeyEvent* )e;
409 if ( ke->key() == Key_Delete ) {
410 onUseCasePopupMenu( UC_REMOVE_ID );
415 return QTabWidget::eventFilter( o, e );
422 void QAD_ObjectBrowser::onCreatePopup()
424 QAD_Desktop* Desktop = (QAD_Desktop*) QAD_Application::getDesktop();
425 QAD_Study* myActiveStudy = Desktop->getActiveStudy();
426 SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
428 /* VSR : Creation of common POPUP menu for Object Browser/Use Case Browser */
429 if ( Sel->IObjectCount() > 0 ) {
434 Desktop->definePopup( theContext, theParent, theObject );
436 Desktop->createPopup( myPopup, theContext, "ObjectBrowser", theObject);
437 if ( !Desktop->getActiveComponent().isEmpty() ) {
438 Desktop->customPopup( myPopup, theContext, "ObjectBrowser", theObject );
440 // VSR:22/01/03 - Command for edit attributes value
441 bool EditValues = QAD_CONFIG->getSetting( "ObjectBrowser:EditValues" ) == "true";
442 if ( EditValues && Sel->IObjectCount() == 1 && hasEditableAttribute(Sel->firstIObject()) ) {
443 if ( myPopup->count() > 0 )
444 myPopup->insertSeparator();
445 myPopup->insertItem( tr( "EDIT_VALUE_CMD" ),
447 SLOT( onEditAttribute() ) );
452 // No selected item => it's not necessary to create popup
453 //NRI- : Desktop->createPopup( myPopup, "", "ObjectBrowser", "");
455 if ( currentPage() != myListView ) {
456 /* VSR : Creation of POPUP menu for UseCase Browser */
457 QList<QListViewItem> ucSelected;
458 ucSelected.setAutoDelete( false );
459 getSelectedParents( myUseCaseView, ucSelected );
461 if ( myPopup && !myStudy->_is_nil() ) {
462 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
464 bool isOne = ucSelected.count() == 1;
465 bool isMany = ucSelected.count() > 1;
466 bool isEmpty = ucSelected.count() == 1;
467 bool obSelected = Sel->IObjectCount() > 0;
468 bool isRoot = isOne && isRootItem( ucSelected.at( 0 ) );
469 bool manyChildren = myUseCaseView->childCount() > 0 && myUseCaseView->firstChild()->childCount() > 0;
470 bool isUseCase = isOne &&
471 ( isRoot || UCBuilder->IsUseCase( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) ) );
475 QPopupMenu *UseCasePopup = new QPopupMenu( myPopup );
477 UseCasePopup->insertItem( tr( "UC_NEW_ID" ), this, SLOT( onUseCasePopupMenu( int ) ), 0, UC_NEW_EMPTY_ID );
479 UseCasePopup->insertItem( tr( "UC_SET_CURRENT_ID" ), this, SLOT( onUseCasePopupMenu( int ) ), 0, UC_SET_CURRENT_ID );
481 UseCasePopup->insertItem( tr( "UC_RENAME_ID" ), this, SLOT( onUseCasePopupMenu( int ) ), 0, UC_RENAME_ID );
482 if ( isRoot && manyChildren )
483 UseCasePopup->insertItem( tr( "UC_CLEAR_ID" ), this, SLOT( onUseCasePopupMenu( int ) ), 0, UC_CLEAR_ID );
485 if ( UseCasePopup->count() > 0 ) {
486 if ( myPopup->count() > 0 )
487 myPopup->insertSeparator();
488 myPopup->insertItem( tr( "UC_POPUP" ), UseCasePopup );
498 Returns Object Browser list view
500 QListView* QAD_ObjectBrowser::getListView() const
506 Returns UseCase Browser list view
508 QListView* QAD_ObjectBrowser::getUseCaseView() const
510 return myUseCaseView;
514 Adds anItem ( probably a SComponent )
516 QAD_ObjectBrowserItem* QAD_ObjectBrowser::AddItem(QListView* theView,
517 const QString& theName,
518 const QString& theEntry,
519 const QString& theIOR,
521 const QString& theValue,
522 QAD_ObjectBrowserItem* theAfter)
525 QAD_ObjectBrowserItem* last = (QAD_ObjectBrowserItem*)(theView->firstChild());
529 for ( ; last->nextSibling(); last = (QAD_ObjectBrowserItem*)(last->nextSibling()) );
531 QAD_ObjectBrowserItem* anItem = new QAD_ObjectBrowserItem( theView, last );
533 anItem->setType( theType );
534 anItem->setOpen( FALSE );
535 anItem->setName( theName );
536 anItem->setValue( theValue );
537 anItem->setEntry( theEntry );
538 anItem->setIOR( theIOR );
539 anItem->setReference( "" );
545 Adds anItem ( probably a StudyObject )
547 QAD_ObjectBrowserItem* QAD_ObjectBrowser::AddItem(QAD_ObjectBrowserItem* theParentItem,
548 const QString& theName,
549 const QString& theEntry,
550 const QString& theIOR,
552 const QString& theRef,
553 const QString& theValue,
554 QAD_ObjectBrowserItem* theAfter)
557 QAD_ObjectBrowserItem* last = (QAD_ObjectBrowserItem*)(theParentItem->firstChild());
561 for ( ; last->nextSibling(); last = (QAD_ObjectBrowserItem*)(last->nextSibling()) );
563 QAD_ObjectBrowserItem* anItem = new QAD_ObjectBrowserItem(theParentItem, last);
564 anItem->setType( theType );
565 anItem->setOpen( FALSE );
566 anItem->setName( theName );
567 anItem->setValue( theValue );
568 anItem->setEntry( theEntry );
569 anItem->setIOR( theIOR );
570 anItem->setReference( theRef );
576 Updates Object Browsers' item [ protected ]
578 void QAD_ObjectBrowser::Update( SALOMEDS::SObject_ptr SO,
579 QAD_ObjectBrowserItem* theParentItem )
581 if ( myStudy->_is_nil() || SO->_is_nil() || !theParentItem ) {
584 SALOMEDS::ChildIterator_var it = myStudy->NewChildIterator(SO);
586 for (; it->More();it->Next()) {
587 SALOMEDS::SObject_var CSO = it->Value();
588 SALOMEDS::SObject_var RefSO;
590 QString CSOEntry = strdup( CSO->GetID() );
591 SALOMEDS::GenericAttribute_var anAttr;
592 SALOMEDS::AttributeName_var aName;
593 SALOMEDS::AttributeComment_var aCmnt;
594 SALOMEDS::AttributeIOR_var anIOR;
595 SALOMEDS::AttributeReal_var aReal;
596 SALOMEDS::AttributeInteger_var anInt;
597 SALOMEDS::AttributeSelectable_var aSelectable;
598 SALOMEDS::AttributeExpandable_var anExpandable;
599 SALOMEDS::AttributeOpened_var anOpened;
600 SALOMEDS::AttributePixMap_var aPixmap;
601 SALOMEDS::AttributeTextColor_var aTextColor;
602 SALOMEDS::AttributeTextHighlightColor_var aTextHighlightColor;
604 QAD_ObjectBrowserItem* Item = 0;
605 QAD_ObjectBrowserItem* subItem;
608 if ( CSO->ReferencedObject(RefSO) && !RefSO->_is_nil() ) {
610 QString RefSOEntry = strdup( RefSO->GetID() );
611 if (CSO->FindAttribute(anAttr, "AttributeName") || RefSO->FindAttribute(anAttr, "AttributeName")) {
612 aName = SALOMEDS::AttributeName::_narrow(anAttr);
613 if (RefSO->FindAttribute(anAttr, "AttributeIOR")) {
614 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
615 ior = strdup( anIOR->Value() );
617 valueString = getValueFromObject( RefSO );
618 // AddItem (Item, QString(" * ") + strdup( aName->Value() ), RefSOEntry, ior, 2, CSOEntry);
619 Item = AddItem(theParentItem,
620 QString(" * ") + strdup( aName->Value() ),
626 myListViewMap[ RefSOEntry ].append( Item );
629 MESSAGE("QAD_ObjectBrowser::Update : noname item: "<<CSO->GetID());
633 valueString = getValueFromObject( CSO );
635 if (CSO->FindAttribute(anAttr, "AttributeIOR")) {
636 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
637 ior = strdup( anIOR->Value() );
639 // getting Name and adding new Item
640 if (CSO->FindAttribute(anAttr, "AttributeName") ) {
641 aName = SALOMEDS::AttributeName::_narrow(anAttr);
642 Item = AddItem(theParentItem, strdup( aName->Value() ), CSOEntry, ior, 0, "", valueString);
643 myListViewMap[ CSOEntry ].append( Item );
646 MESSAGE("QAD_ObjectBrowser::Update : noname item: "<<CSO->GetID());
648 // adding other attributes
651 if ( CSO->FindAttribute(anAttr, "AttributeSelectable") ) {
652 aSelectable = SALOMEDS::AttributeSelectable::_narrow(anAttr);
653 Item->setSelectable(aSelectable->IsSelectable());
656 if ( CSO->FindAttribute(anAttr, "AttributeExpandable") ) {
657 anExpandable = SALOMEDS::AttributeExpandable::_narrow(anAttr);
658 Item->setExpandable(anExpandable->IsExpandable());
661 if ( CSO->FindAttribute(anAttr, "AttributeOpened") ) {
662 anOpened = SALOMEDS::AttributeOpened::_narrow(anAttr);
663 Item->setOpen(anOpened->IsOpened());
666 if ( CSO->FindAttribute(anAttr, "AttributeTextColor") ) {
667 aTextColor = SALOMEDS::AttributeTextColor::_narrow(anAttr);
668 QColor aColor((int)(aTextColor->TextColor().R), (int)(aTextColor->TextColor().G), (int)(aTextColor->TextColor().B)) ;
669 Item->setTextColor(aColor);
671 // TextHighlightColor
672 if ( CSO->FindAttribute(anAttr, "AttributeTextHighlightColor") ) {
673 aTextHighlightColor = SALOMEDS::AttributeTextHighlightColor::_narrow(anAttr);
674 QColor aColor((int)(aTextHighlightColor->TextHighlightColor().R),
675 (int)(aTextHighlightColor->TextHighlightColor().G),
676 (int)(aTextHighlightColor->TextHighlightColor().B)) ;
677 Item->setTextHighlightColor(aColor);
680 if ( CSO->FindAttribute(anAttr, "AttributePixMap") ) {
681 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
682 if ( aPixmap->HasPixMap() ) {
683 SALOMEDS::SComponent_var father = CSO->GetFatherComponent();
684 if (father->FindAttribute(anAttr, "AttributeName") ) {
685 SALOMEDS::AttributeName_var aFatherName;
686 aFatherName = SALOMEDS::AttributeName::_narrow(anAttr);
689 QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
691 if(resMgr->loadResources( QString(aFatherName->Value()) + "GUI", msg )) {
692 QPixmap icon ( resMgr->loadPixmap( QString(aFatherName->Value()) + "GUI",
693 tr(aPixmap->GetPixMap()) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ));
694 Item->setPixmap( 0, icon );
702 // if ( theParentItem->isOpen() )
703 // Item->setOpen(TRUE);
711 Updates Object Browser tree and UseCase Browser tree
713 void QAD_ObjectBrowser::Update()
716 myListViewMap.clear();
718 if ( myStudy->_is_nil() ) {
722 QString ShowIAPP = QAD_CONFIG->getSetting("ObjectBrowser:IAPP");
724 /* Updating Object Browser ============================================== */
725 SALOMEDS::SComponentIterator_var itcomp = myStudy->NewComponentIterator();
726 for (; itcomp->More(); itcomp->Next()) {
727 QAD_ObjectBrowserItem* Item = 0;
728 SALOMEDS::SComponent_var SC = itcomp->Value();
729 QString dataType = strdup( SC->ComponentDataType() );
731 QString SCEntry = strdup( SC->GetID() );
733 SALOMEDS::GenericAttribute_var anAttr;
734 SALOMEDS::AttributeName_var aName;
735 SALOMEDS::AttributeComment_var aCmnt;
736 SALOMEDS::AttributeIOR_var anIOR;
737 SALOMEDS::AttributeReal_var aReal;
738 SALOMEDS::AttributeInteger_var anInt;
739 SALOMEDS::AttributeSelectable_var aSelectable;
740 SALOMEDS::AttributeExpandable_var anExpandable;
741 SALOMEDS::AttributeOpened_var anOpened;
742 SALOMEDS::AttributePixMap_var aPixmap;
743 SALOMEDS::AttributeTextColor_var aTextColor;
744 SALOMEDS::AttributeTextHighlightColor_var aTextHighlightColor;
746 if (SC->FindAttribute(anAttr, "AttributeIOR")) {
747 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
748 ior = strdup( anIOR->Value() );
751 bool caseIAPP = false;
753 // create data-tree item, corresponding to component (and set name if component has it)
754 if ( dataType.compare("Interface Applicative") == 0 ) {
756 if ( ShowIAPP.compare("true") == 0 ) {
757 if (SC->FindAttribute(anAttr, "AttributeName")) {
758 aName = SALOMEDS::AttributeName::_narrow(anAttr);
759 Item = AddItem (myListView, strdup( aName->Value() ), strdup( SCEntry ), ior, 1, "");
760 myListViewMap[ SCEntry ].append( Item );
763 Item = AddItem (myListView, dataType, SCEntry, ior, 1, "");
764 myListViewMap[ SCEntry ].append( Item );
771 if (SC->FindAttribute(anAttr, "AttributeName")) {
772 aName = SALOMEDS::AttributeName::_narrow(anAttr);
773 Item = AddItem (myListView, strdup( aName->Value() ), SCEntry, ior, 1, "");
774 myListViewMap[ SCEntry ].append( Item );
777 /*In according to CAF - any label (even if it is empty) exist during to whole session.
778 So, if label haven't an "AttributeName" it is means that the label is empty.
779 Therefore follow action couses bug -
780 Item = AddItem (myListView, dataType, SC->GetID(), ior, 1, "");
784 // add other attributes
786 QAD_ObjectBrowserItem* subItem;
788 if ( SC->FindAttribute(anAttr, "AttributeSelectable") ) {
789 aSelectable = SALOMEDS::AttributeSelectable::_narrow(anAttr);
790 Item->setSelectable(aSelectable->IsSelectable());
793 if ( SC->FindAttribute(anAttr, "AttributeExpandable") ) {
794 anExpandable = SALOMEDS::AttributeExpandable::_narrow(anAttr);
795 Item->setExpandable(anExpandable->IsExpandable());
798 if ( SC->FindAttribute(anAttr, "AttributeOpened") ) {
799 anOpened = SALOMEDS::AttributeOpened::_narrow(anAttr);
800 Item->setOpen(anOpened->IsOpened());
803 if ( SC->FindAttribute(anAttr, "AttributeTextColor") ) {
804 aTextColor = SALOMEDS::AttributeTextColor::_narrow(anAttr);
805 QColor aColor((int)(aTextColor->TextColor().R), (int)(aTextColor->TextColor().G), (int)(aTextColor->TextColor().B)) ;
806 Item->setTextColor(aColor);
808 // TextHighlightColor
809 if ( SC->FindAttribute(anAttr, "AttributeTextHighlightColor") ) {
810 aTextHighlightColor = SALOMEDS::AttributeTextHighlightColor::_narrow(anAttr);
811 QColor aColor((int)(aTextHighlightColor->TextHighlightColor().R),
812 (int)(aTextHighlightColor->TextHighlightColor().G),
813 (int)(aTextHighlightColor->TextHighlightColor().B)) ;
814 Item->setTextHighlightColor(aColor);
818 if ( SC->FindAttribute(anAttr, "AttributePixMap") ) {
819 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
820 if ( aPixmap->HasPixMap() ) {
822 QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
824 MESSAGE ( " Component " << aName->Value() )
825 MESSAGE ( " Icon " << aPixmap->GetPixMap() )
826 if(resMgr->loadResources( QString(aName->Value()) + "GUI", msg )) {
827 QPixmap icon ( resMgr->loadPixmap( QString(aName->Value()) + "GUI",
828 tr(aPixmap->GetPixMap()) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ));
829 Item->setPixmap( 0, icon );
835 if ( strcmp(dataType, TypeComponent) == 0 )
838 if ( caseIAPP && ShowIAPP.compare("true") == 0 )
845 /* Updating UseCase Browser ============================================= */
846 UpdateUseCaseBrowser();
850 Removes item with all childs from the map - used to optimize UseCase browser update
852 void removeFromMap( ItemMap& theMap, QAD_ObjectBrowserItem* item )
855 QAD_ObjectBrowserItem* subItem = ( QAD_ObjectBrowserItem* )( item->firstChild() );
857 removeFromMap( theMap, subItem );
858 subItem = ( QAD_ObjectBrowserItem* )( subItem->nextSibling() );
860 if ( theMap.contains( item->getEntry() ) ) {
861 theMap[ item->getEntry() ].removeRef( item );
862 if ( theMap[ item->getEntry() ].isEmpty() ) {
863 theMap.remove( item->getEntry() );
870 Updates only UseCase Browser
872 void QAD_ObjectBrowser::UpdateUseCaseBrowser() {
873 // myUseCaseView->clear(); myUseCaseMap.clear();
874 if ( myStudy->_is_nil() ) {
877 myUseCaseView->blockSignals( true );
878 // myUseCaseView->setUpdatesEnabled( false );
880 QAD_ObjectBrowserItem* root = ( QAD_ObjectBrowserItem* )myUseCaseView->firstChild();
881 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
882 SALOMEDS::SObject_var SOCurrent = UCBuilder->GetCurrentObject();
883 QString UCName = QString( strdup( UCBuilder->GetName() ) );
884 if ( UCName.isEmpty() )
885 UCName = QString( tr( "Root" ) );
886 // creating root item if is not yet created
888 root = AddItem( myUseCaseView, UCName, "0:2", "", 1, "" );
889 myUseCaseMap[ "0:2" ].append( root );
892 root->setName( UCName );
893 // setting it current if necessary
894 root->setCurrent( SOCurrent->_is_nil() || !strcmp( SOCurrent->GetID(), "0:2" ) );
895 // updating list view...
896 QMap<QString,SALOMEDS::SObject_var> ucList;
897 SALOMEDS::UseCaseIterator_var UCIter = UCBuilder->GetUseCaseIterator( SALOMEDS::SObject::_nil() );
898 if ( !UCIter->_is_nil() ) {
899 for ( ; UCIter->More(); UCIter->Next() ) {
900 SALOMEDS::SObject_var UCObject = UCIter->Value();
901 QString UCEntry = strdup( UCObject->GetID() );
902 ucList[ UCEntry ] = UCObject;
905 // ... 1) delete removed items
906 QAD_ObjectBrowserItem* childItem = ( QAD_ObjectBrowserItem* )root->firstChild();
907 while ( childItem ) {
908 QAD_ObjectBrowserItem* prevItem = childItem;
909 childItem = ( QAD_ObjectBrowserItem* )childItem->nextSibling();
910 if ( !ucList.contains( prevItem->getEntry() ) ) {
911 // myUseCaseMap[ prevItem->getEntry() ].removeRef( prevItem );
912 // if ( myUseCaseMap[ prevItem->getEntry() ].isEmpty() )
913 // myUseCaseMap.remove( prevItem->getEntry() );
914 removeFromMap( myUseCaseMap, prevItem );
918 // ... 2) create/update existing
919 QMap<QString,SALOMEDS::SObject_var>::Iterator it;
920 for ( it = ucList.begin(); it != ucList.end(); ++it ) {
921 UpdateUCItem( it.data(), root );
923 myUseCaseView->blockSignals( false );
924 // myUseCaseView->setUpdatesEnabled( true );
925 // myUseCaseView->update();
926 // UCItem->setOpen( true );
930 Updates UseCase Browser's item
932 void QAD_ObjectBrowser::UpdateUCItem( SALOMEDS::SObject_var UCObject, QAD_ObjectBrowserItem* UCItem )
934 if ( myStudy->_is_nil() || !UCItem )
937 /* Creating SObjects item */
938 SALOMEDS::SObject_var RefSO;
939 SALOMEDS::GenericAttribute_var anAttr;
940 SALOMEDS::AttributeName_var aName;
941 SALOMEDS::AttributeIOR_var anIOR;
942 SALOMEDS::AttributeSelectable_var aSelectable;
943 SALOMEDS::AttributeExpandable_var anExpandable;
944 SALOMEDS::AttributePixMap_var aPixmap;
945 SALOMEDS::AttributeTextColor_var aTextColor;
946 SALOMEDS::AttributeTextHighlightColor_var aTextHighlightColor;
949 QString UCEntry = strdup( UCObject->GetID() );
951 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
952 SALOMEDS::SObject_var SOCurrent = UCBuilder->GetCurrentObject();
955 QAD_ObjectBrowserItem* UCSubItem = 0;
956 if ( myUseCaseMap.contains( UCEntry ) && myUseCaseMap[ UCEntry ].count() > 0 )
957 UCSubItem = myUseCaseMap[ UCEntry ].first();
960 if ( UCObject->ReferencedObject( RefSO ) && !RefSO->_is_nil() ) {
961 QString RefSOEntry = strdup( RefSO->GetID() );
962 if ( UCObject->FindAttribute( anAttr, "AttributeName" ) || RefSO->FindAttribute( anAttr, "AttributeName" ) ) {
963 aName = SALOMEDS::AttributeName::_narrow( anAttr );
964 if ( RefSO->FindAttribute( anAttr, "AttributeIOR" ) ) {
965 anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr );
966 ior = strdup( anIOR->Value() );
968 valueString = getValueFromObject( RefSO );
970 UCSubItem = AddItem( UCItem,
971 QString( " * " ) + strdup( aName->Value() ),
977 myUseCaseMap[ RefSOEntry ].append( UCSubItem );
980 UCSubItem->setName( QString( " * " ) + strdup( aName->Value() ) );
981 UCSubItem->setEntry( RefSOEntry );
982 UCSubItem->setIOR( ior );
983 UCSubItem->setReference( UCEntry );
984 UCSubItem->setValue( valueString );
986 UCSubItem->setCurrent( !SOCurrent->_is_nil() && QString( SOCurrent->GetID() ) == QString( UCEntry ) );
991 valueString = getValueFromObject( UCObject );
993 if ( UCObject->FindAttribute( anAttr, "AttributeIOR" ) ) {
994 anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr );
995 ior = strdup( anIOR->Value() );
997 // getting Name and adding new Item
998 if ( UCObject->FindAttribute( anAttr, "AttributeName" ) ) {
999 aName = SALOMEDS::AttributeName::_narrow( anAttr );
1001 UCSubItem = AddItem( UCItem, strdup( aName->Value() ), UCEntry, ior, 0, "", valueString );
1002 myUseCaseMap[ UCEntry ].append( UCSubItem );
1005 UCSubItem->setName( strdup( aName->Value() ) );
1006 UCSubItem->setEntry( UCEntry );
1007 UCSubItem->setIOR( ior );
1008 UCSubItem->setReference( "" );
1009 UCSubItem->setValue( valueString );
1012 // adding other attributes
1014 UCSubItem->setCurrent( !SOCurrent->_is_nil() && QString( SOCurrent->GetID() ) == QString( UCEntry ) );
1016 // if ( UCObject->FindAttribute( anAttr, "AttributeSelectable" ) ) {
1017 // aSelectable = SALOMEDS::AttributeSelectable::_narrow( anAttr );
1018 // UCSubItem->setSelectable( aSelectable->IsSelectable() );
1021 // if ( UCObject->FindAttribute( anAttr, "AttributeExpandable" ) ) {
1022 // anExpandable = SALOMEDS::AttributeExpandable::_narrow( anAttr );
1023 // UCSubItem->setExpandable( anExpandable->IsExpandable() );
1026 if ( UCObject->FindAttribute(anAttr, "AttributeTextColor" ) ) {
1027 aTextColor = SALOMEDS::AttributeTextColor::_narrow( anAttr );
1028 QColor aColor( (int)(aTextColor->TextColor().R),
1029 (int)(aTextColor->TextColor().G),
1030 (int)(aTextColor->TextColor().B) );
1031 UCSubItem->setTextColor( aColor );
1033 // TextHighlightColor
1034 if ( UCObject->FindAttribute( anAttr, "AttributeTextHighlightColor" ) ) {
1035 aTextHighlightColor = SALOMEDS::AttributeTextHighlightColor::_narrow( anAttr );
1036 QColor aColor( (int)(aTextHighlightColor->TextHighlightColor().R),
1037 (int)(aTextHighlightColor->TextHighlightColor().G),
1038 (int)(aTextHighlightColor->TextHighlightColor().B) );
1039 UCSubItem->setTextHighlightColor( aColor );
1042 if ( UCObject->FindAttribute( anAttr, "AttributePixMap" ) ) {
1043 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
1044 if ( aPixmap->HasPixMap() ) {
1045 SALOMEDS::SComponent_var father = UCObject->GetFatherComponent();
1046 if ( father->FindAttribute( anAttr, "AttributeName" ) ) {
1047 SALOMEDS::AttributeName_var aFatherName;
1048 aFatherName = SALOMEDS::AttributeName::_narrow( anAttr );
1049 QAD_ResourceMgr* resMgr = QAD_Desktop::getResourceManager();
1052 if( resMgr->loadResources( QString( aFatherName->Value() ) + "GUI", msg ) ) {
1053 QPixmap icon ( resMgr->loadPixmap( QString( aFatherName->Value() ) + "GUI",
1054 tr( aPixmap->GetPixMap() ) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ) );
1055 UCSubItem->setPixmap( 0, icon );
1064 // updating children ...
1065 QMap<QString,SALOMEDS::SObject_var> ucList;
1066 SALOMEDS::UseCaseIterator_var UCIter = UCBuilder->GetUseCaseIterator( UCObject );
1067 if ( !UCIter->_is_nil() ) {
1068 for ( ; UCIter->More(); UCIter->Next() ) {
1069 SALOMEDS::SObject_var UCSubObject = UCIter->Value();
1070 QString UCSubEntry = strdup( UCSubObject->GetID() );
1071 ucList[ UCSubEntry ] = UCSubObject;
1074 // ... 1) delete removed items
1075 QAD_ObjectBrowserItem* childItem = ( QAD_ObjectBrowserItem* )UCSubItem->firstChild();
1076 while ( childItem ) {
1077 QAD_ObjectBrowserItem* prevItem = childItem;
1078 childItem = ( QAD_ObjectBrowserItem* )childItem->nextSibling();
1079 if ( !ucList.contains( prevItem->getEntry() ) ) {
1080 // myUseCaseMap[ prevItem->getEntry() ].removeRef( prevItem );
1081 // if ( myUseCaseMap[ prevItem->getEntry() ].isEmpty() )
1082 // myUseCaseMap.remove( prevItem->getEntry() );
1083 removeFromMap( myUseCaseMap, prevItem );
1087 // ... 2) create/update existing
1088 QMap<QString,SALOMEDS::SObject_var>::Iterator it;
1089 for ( it = ucList.begin(); it != ucList.end(); ++it ) {
1090 UpdateUCItem( it.data(), UCSubItem );
1096 Unhighlights all items
1098 void QAD_ObjectBrowser::unHighlightAll()
1100 myListView->clearSelection();
1101 myUseCaseView->clearSelection();
1105 Highlights items which refer to object
1107 void QAD_ObjectBrowser::highlight( const Handle(SALOME_InteractiveObject)& IObject, bool highlight )
1109 QList<QAD_ObjectBrowserItem> List;
1110 if (getItems(IObject, List)) {
1111 for (int i = 0; i < List.count(); i++) {
1112 List.at(i)->setSelected( highlight );
1113 List.at(i)->repaint();
1119 Gets items from Object Browser which refer to object
1121 bool QAD_ObjectBrowser::getItems( const Handle(SALOME_InteractiveObject)& IObject,
1122 QList<QAD_ObjectBrowserItem>& List)
1125 if ( myListViewMap.contains( IObject->getEntry() ) ) {
1126 ItemList ilist = myListViewMap[ IObject->getEntry() ];
1127 for ( int i = 0; i < ilist.count(); i++ )
1128 List.append( ilist.at(i) );
1130 if ( myUseCaseMap.contains( IObject->getEntry() ) ) {
1131 ItemList ilist = myUseCaseMap[ IObject->getEntry() ];
1132 for ( int i = 0; i < ilist.count(); i++ )
1133 List.append( ilist.at(i) );
1135 return (List.count() > 0);
1139 Gets items from Object Browser which refer to object
1141 bool QAD_ObjectBrowser::getItems( SALOMEDS::SObject_ptr SO,
1142 QList<QAD_ObjectBrowserItem>& List)
1145 if ( myListViewMap.contains( SO->GetID() ) ) {
1146 ItemList ilist = myListViewMap[ SO->GetID() ];
1147 for ( int i = 0; i < ilist.count(); i++ )
1148 List.append( ilist.at(i) );
1150 if ( myUseCaseMap.contains( SO->GetID() ) ) {
1151 ItemList ilist = myUseCaseMap[ SO->GetID() ];
1152 for ( int i = 0; i < ilist.count(); i++ )
1153 List.append( ilist.at(i) );
1155 return (List.count() > 0);
1159 Gets first item from Object Browser which refers to object (not reference)
1161 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getItem( const Handle(SALOME_InteractiveObject)& IObject )
1163 if ( myListViewMap.contains( IObject->getEntry() ) ) {
1164 ItemList ilist = myListViewMap[ IObject->getEntry() ];
1165 for ( int i = 0; i < ilist.count(); i++ ) {
1166 QString aRef = ilist.at(i)->getReference();
1167 if ( ilist.at(i)->getReference().isEmpty() )
1175 Finds item from Object Browser corresponding to Object, returns 0 if fails
1177 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getItem( SALOMEDS::SObject_ptr SO )
1179 if ( myListViewMap.contains( SO->GetID() ) ) {
1180 ItemList ilist = myListViewMap[ SO->GetID() ];
1181 for ( int i = 0; i < ilist.count(); i++ ) {
1182 QString aRef = ilist.at(i)->getReference();
1183 if ( ilist.at(i)->getReference().isEmpty() )
1192 Gets first item from UseCase Browser which refers to object (not reference)
1194 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getUCItem( const Handle(SALOME_InteractiveObject)& IObject )
1196 if ( myUseCaseMap.contains( IObject->getEntry() ) ) {
1197 ItemList ilist = myUseCaseMap[ IObject->getEntry() ];
1198 for ( int i = 0; i < ilist.count(); i++ ) {
1199 QString aRef = ilist.at(i)->getReference();
1200 if ( ilist.at(i)->getReference().isEmpty() )
1208 Finds item from UseCase Browser corresponding to Object, returns 0 if fails
1210 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getUCItem( SALOMEDS::SObject_ptr SO )
1212 if ( myUseCaseMap.contains( SO->GetID() ) ) {
1213 ItemList ilist = myUseCaseMap[ SO->GetID() ];
1214 for ( int i = 0; i < ilist.count(); i++ ) {
1215 QString aRef = ilist.at(i)->getReference();
1216 if ( ilist.at(i)->getReference().isEmpty() )
1223 Finds item corresponding to interactive object, returns 0 if fails
1225 void QAD_ObjectBrowser::rename( const Handle(SALOME_InteractiveObject)& IObject, QString newName )
1227 QAD_ObjectBrowserItem* item = getItem( IObject );
1229 item->setName( newName );
1232 item = getUCItem( IObject );
1234 item->setName( newName );
1240 Creates and show specific Popup to this according to current selection (Object Browser)
1242 void QAD_ObjectBrowser::showPopupMenu(QListViewItem* theItem)
1244 QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1245 SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1246 QString ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1248 if (theItem != NULL && ( Sel->IObjectCount()>0 || ActiveComp.isEmpty() ) ) {
1252 QAD_Tools::checkPopup( myPopup );
1253 if ( myPopup->count()>0 ) {
1254 myPopup->exec( QCursor::pos() );
1262 Creates and show specific Popup to this according to current selection (UseCase Browser)
1264 void QAD_ObjectBrowser::showUseCasePopupMenu(QListViewItem* theItem)
1268 QAD_Tools::checkPopup( myPopup );
1269 if ( myPopup->count() > 0 ) {
1270 myPopup->exec( QCursor::pos() );
1277 Called when current selection was changed (Object Browser)
1279 void QAD_ObjectBrowser::onSelectedItem()
1282 if ( sender()->inherits("QListView") )
1283 whoIs = (QListView*)sender();
1286 QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1287 SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
1288 SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1289 QAD_Application* myApp = QAD_Application::getDesktop()->getActiveApp();
1291 SALOME_ListIO DeltaPos;
1293 SALOME_ListIO DeltaNeg;
1296 QListViewItemIterator it( whoIs );
1297 for ( ; it.current(); ++it ) {
1298 QAD_ObjectBrowserItem* item = (QAD_ObjectBrowserItem*)it.current();
1299 QString theEntry = item->getEntry();
1300 QString theName = item->getName();
1301 QString theRef = item->getReference();
1303 if ( !theEntry.isEmpty() ) {
1304 if ( item->isSelected() ) {
1305 bool itemAlreadySelected = false;
1307 SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
1308 for(;It.More();It.Next()) {
1309 Handle(SALOME_InteractiveObject) IO = It.Value();
1310 if ( strcmp ( IO->getEntry(), theEntry ) == 0 ) {
1311 itemAlreadySelected = true;
1316 if (!itemAlreadySelected) {
1317 Handle(SALOME_InteractiveObject) newIO;
1318 SALOMEDS::SObject_var obj = aStudy->FindObjectID( theEntry.latin1() );
1319 if ( !obj->_is_nil() ) {
1320 SALOMEDS::SComponent_var comp = obj->GetFatherComponent();
1321 if ( !comp->_is_nil() ) {
1322 Standard_CString datatype = comp->ComponentDataType();
1323 newIO = new SALOME_InteractiveObject( strdup(theEntry),
1326 newIO->setReference( strdup(theRef) );
1329 newIO = new SALOME_InteractiveObject( strdup(theEntry),
1332 newIO->setReference( strdup(theRef) );
1334 if (!newIO.IsNull()) {
1335 DeltaPos.Append( newIO );
1339 SALOME_ListIteratorOfListIO It1( Sel->StoredIObjects() );
1340 for(;It1.More();It1.Next()) {
1341 Handle(SALOME_InteractiveObject) IO = It1.Value();
1342 if ( strcmp( IO->getEntry(), item->getEntry() ) == 0 ) {
1343 DeltaNeg.Append( IO );
1351 SALOME_ListIteratorOfListIO ItNeg( DeltaNeg );
1352 for(;ItNeg.More();ItNeg.Next()) {
1353 Sel->RemoveIObject( ItNeg.Value() );
1356 SALOME_ListIteratorOfListIO ItPos( DeltaPos );
1357 for(;ItPos.More();ItPos.Next()) {
1358 Sel->AddIObject( ItPos.Value() );
1361 myApp->updateActions();
1365 Called when selection is changed (UseCase Browser)
1367 void QAD_ObjectBrowser::onUseCaseSelectedItem()
1372 Called when item is expanded
1374 void QAD_ObjectBrowser::onExpanded (QListViewItem* item)
1376 QAD_ObjectBrowserItem* aItem = (QAD_ObjectBrowserItem*)item;
1377 if (!myStudy->_is_nil() && aItem)
1379 SALOMEDS::SObject_var Object = myStudy->FindObjectID(aItem->getEntry());
1380 if (!Object->_is_nil())
1382 SALOMEDS::StudyBuilder_var StudyBuilder = myStudy->NewBuilder();
1383 SALOMEDS::AttributeOpened_var anAttr = SALOMEDS::AttributeOpened::_narrow(
1384 StudyBuilder->FindOrCreateAttribute(Object, "AttributeOpened") );
1385 anAttr->SetOpened(true);
1391 Called when item is collapsed
1393 void QAD_ObjectBrowser::onCollapsed(QListViewItem* item)
1395 QAD_ObjectBrowserItem* aItem = (QAD_ObjectBrowserItem*)item;
1396 if (!myStudy->_is_nil() && aItem)
1398 SALOMEDS::SObject_var Object = myStudy->FindObjectID(aItem->getEntry());
1399 if (!Object->_is_nil())
1401 SALOMEDS::StudyBuilder_var StudyBuilder = myStudy->NewBuilder();
1402 SALOMEDS::AttributeOpened_var anAttr = SALOMEDS::AttributeOpened::_narrow(
1403 StudyBuilder->FindOrCreateAttribute(Object, "AttributeOpened") );
1404 anAttr->SetOpened(false);
1410 Find and returns value for the object
1411 Warning: object can have several values attributes, search is done in the following order:
1412 [integer], [real], [table of integer], [table of real], [comment]
1414 QString QAD_ObjectBrowser::getValueFromObject( SALOMEDS::SObject_ptr SO )
1416 if ( SO->_is_nil() )
1417 return QString::null;
1418 SALOMEDS::SComponent_var isComponent = SALOMEDS::SComponent::_narrow( SO );
1419 if ( !isComponent->_is_nil() )
1420 return QString::null; // no values to show for components
1422 SALOMEDS::GenericAttribute_var anAttr;
1423 SALOMEDS::AttributeInteger_var anInt;
1424 SALOMEDS::AttributeReal_var aReal;
1425 SALOMEDS::AttributeTableOfInteger_var aTableInt;
1426 SALOMEDS::AttributeTableOfReal_var aTableReal;
1427 SALOMEDS::AttributeComment_var aComment;
1430 if ( SO->FindAttribute( anAttr, "AttributeInteger" ) ) {
1431 anInt = SALOMEDS::AttributeInteger::_narrow( anAttr );
1432 QString val = QString::number( anInt->Value() );
1436 if ( SO->FindAttribute( anAttr, "AttributeReal" ) ) {
1437 aReal = SALOMEDS::AttributeReal::_narrow( anAttr );
1438 QString val = QString::number( aReal->Value() );
1442 if ( SO->FindAttribute( anAttr, "AttributeTableOfInteger" ) ) {
1443 aTableInt = SALOMEDS::AttributeTableOfInteger::_narrow( anAttr );
1444 QString tlt = QString( strdup( aTableInt->GetTitle() ) );
1445 if ( !tlt.isEmpty() )
1447 int nbRows = aTableInt->GetNbRows() ;
1448 int nbCols = aTableInt->GetNbColumns();
1449 QString val = tlt + QString( "[" ) + QString::number( nbRows ) + QString( "," ) + QString::number( nbCols ) + QString( "]" );
1453 if ( SO->FindAttribute( anAttr, "AttributeTableOfReal" ) ) {
1454 aTableReal = SALOMEDS::AttributeTableOfReal::_narrow( anAttr );
1455 QString tlt = QString( strdup( aTableReal->GetTitle() ) );
1456 if ( !tlt.isEmpty() )
1458 int nbRows = aTableReal->GetNbRows() ;
1459 int nbCols = aTableReal->GetNbColumns();
1460 QString val = tlt + QString( "[" ) + QString::number( nbRows ) + QString( "," ) + QString::number( nbCols ) + QString( "]" );
1464 if ( SO->FindAttribute(anAttr, "AttributeComment") ) {
1465 aComment = SALOMEDS::AttributeComment::_narrow( anAttr );
1466 QString val = QString( strdup( aComment->Value() ) );
1469 return QString::null;
1473 Shows/hides IAPP sub-tree in ObjectBrowser
1474 Current implementation just udpates browser
1476 void QAD_ObjectBrowser::setShowIAPP( bool show )
1482 Shows/hides info columns: Entry, IOR, Reference
1484 void QAD_ObjectBrowser::setShowInfoColumns( bool show )
1486 bool shown = myListView->header()->isResizeEnabled( 2 );
1487 if ( show != shown ) {
1489 myListView->header()->setResizeEnabled( true, 2 );
1490 myListView->header()->setResizeEnabled( true, 3 );
1491 myListView->header()->setResizeEnabled( true, 4 );
1492 myListView->setColumnWidthMode( 2, QListView::Maximum );
1493 myListView->setColumnWidthMode( 3, QListView::Maximum );
1494 myListView->setColumnWidthMode( 4, QListView::Maximum );
1495 if ( myListView->columnWidth( 2 ) <= 0 )
1496 myListView->header()->resizeSection( 2, 50 );
1497 if ( myListView->columnWidth( 3 ) <= 0 )
1498 myListView->header()->resizeSection( 3, 50 );
1499 if ( myListView->columnWidth( 4 ) <= 0 )
1500 myListView->header()->resizeSection( 4, 50 );
1503 myListView->setColumnWidthMode( 2, QListView::Manual );
1504 myListView->setColumnWidthMode( 3, QListView::Manual );
1505 myListView->setColumnWidthMode( 4, QListView::Manual );
1506 myListView->header()->resizeSection( 2, 0 );
1507 myListView->header()->resizeSection( 3, 0 );
1508 myListView->header()->resizeSection( 4, 0 );
1509 myListView->header()->setResizeEnabled( false, 2 );
1510 myListView->header()->setResizeEnabled( false, 3 );
1511 myListView->header()->setResizeEnabled( false, 4 );
1517 Shows/hides Value column
1519 void QAD_ObjectBrowser::setShowValueColumn( bool show )
1521 bool shown = myListView->header()->isResizeEnabled( 1 );
1522 if ( show != shown ) {
1524 myListView->header()->setResizeEnabled( true, 1 );
1525 myListView->setColumnWidthMode( 1, QListView::Maximum );
1526 if ( myListView->columnWidth( 1 ) <= 0 )
1527 myListView->header()->resizeSection( 1, 50 );
1530 myListView->setColumnWidthMode( 1, QListView::Manual );
1531 myListView->header()->resizeSection( 1, 0 );
1532 myListView->header()->setResizeEnabled( false, 1 );
1538 Sets CHRONO sorting enabled/disabled
1539 Note: when CHRONO sorting is enabled items are sorted by Entry value and column headers
1540 become unclickable to prohibit another sort type;
1541 when CHRONO sorting is disabled column headers become clickable - this allows
1542 to sort data by any column
1544 void QAD_ObjectBrowser::setEnableChronoSort( bool enable )
1547 // if CHRONO sorting is enabled set clickable header disabled ...
1548 myListView->header()->setClickEnabled( false );
1549 // ... and then sort by column 2 - OCAF doc entry
1550 myListView->setSorting( 2, TRUE ) ;
1553 // if CHRONO sorting is enabled set clickable header enabled ...
1554 myListView->header()->setClickEnabled( true );
1555 // and clear sorting by column 2
1556 myListView->setSorting( 10, TRUE );
1558 // myListView->sort( ) ;
1562 Slot, called to edit value
1564 void QAD_ObjectBrowser::onEditAttribute()
1566 QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1567 SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1568 QString ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1569 if ( myStudy->_is_nil() )
1572 if ( Sel->IObjectCount() == 1 ) {
1573 SALOMEDS::SObject_var SO = myStudy->FindObjectID( Sel->firstIObject()->getEntry() );
1574 SALOMEDS::SComponent_var isComponent = SALOMEDS::SComponent::_narrow( SO );
1575 if ( !SO->_is_nil() && isComponent->_is_nil() ) { // no values to show for components
1576 SALOMEDS::GenericAttribute_var anAttr;
1577 SALOMEDS::AttributeInteger_var anInt;
1578 SALOMEDS::AttributeReal_var aReal;
1579 SALOMEDS::AttributeTableOfInteger_var aTableInt;
1580 SALOMEDS::AttributeTableOfReal_var aTableReal;
1581 SALOMEDS::AttributeComment_var aComment;
1585 if ( SO->FindAttribute( anAttr, "AttributeInteger" ) ) {
1586 anInt = SALOMEDS::AttributeInteger::_narrow( anAttr );
1587 int val = SALOMEGUI_SetValueDlg::getInteger( tr( "SET_VALUE_INT_TLT" ),
1588 tr( "SET_VALUE_INT_LBL" ),
1591 QAD_Application::getDesktop() );
1593 anInt->SetValue( val );
1598 if ( SO->FindAttribute( anAttr, "AttributeReal" ) ) {
1599 aReal = SALOMEDS::AttributeReal::_narrow( anAttr );
1600 double val = SALOMEGUI_SetValueDlg::getDouble( tr( "SET_VALUE_REAL_TLT" ),
1601 tr( "SET_VALUE_REAL_LBL" ),
1604 QAD_Application::getDesktop() );
1606 aReal->SetValue( val );
1609 // if Table of integer
1611 if ( SO->FindAttribute( anAttr, "AttributeTableOfInteger" ) ) {
1612 SALOMEGUI_TableDlg* dlg = new SALOMEGUI_TableDlg( QAD_Application::getDesktop(),
1615 SALOMEGUI_TableDlg::ttInt );
1616 bOk = ( dlg->exec() == QDialog::Accepted );
1620 if ( SO->FindAttribute( anAttr, "AttributeTableOfReal" ) ) {
1621 SALOMEGUI_TableDlg* dlg = new SALOMEGUI_TableDlg( QAD_Application::getDesktop(),
1624 SALOMEGUI_TableDlg::ttReal );
1625 bOk = ( dlg->exec() == QDialog::Accepted );
1629 if ( SO->FindAttribute(anAttr, "AttributeComment") ) {
1630 aComment = SALOMEDS::AttributeComment::_narrow( anAttr );
1631 QString val = SALOMEGUI_SetValueDlg::getString( tr( "SET_VALUE_COMMENT_TLT" ),
1632 tr( "SET_VALUE_COMMENT_LBL" ),
1635 QAD_Application::getDesktop() );
1637 aComment->SetValue( val );
1648 Returns true if object has editable attrubute :
1649 integer, real, table or comment
1651 bool QAD_ObjectBrowser::hasEditableAttribute( const Handle(SALOME_InteractiveObject)& object )
1653 if ( !myStudy->_is_nil() ) {
1654 SALOMEDS::SObject_var obj = myStudy->FindObjectID( object->getEntry() );
1655 SALOMEDS::SComponent_var comp = myStudy->FindComponentID( object->getEntry() );
1656 if ( !comp->_is_nil() || obj->_is_nil() )
1658 QString val = getValueFromObject( obj );
1659 return ( !val.isNull() );
1665 Returns true if object has table attrubute ( integer and/or real )
1667 bool QAD_ObjectBrowser::hasTable( const Handle(SALOME_InteractiveObject)& object )
1669 SALOMEDS::GenericAttribute_var anAttr;
1670 if ( !myStudy->_is_nil() ) {
1671 SALOMEDS::SObject_var obj = myStudy->FindObjectID( object->getEntry() );
1672 SALOMEDS::SComponent_var comp = myStudy->FindComponentID( object->getEntry() );
1673 if ( !comp->_is_nil() || obj->_is_nil() )
1675 if ( obj->FindAttribute( anAttr, "AttributeTableOfInteger" ) )
1677 if ( obj->FindAttribute( anAttr, "AttributeTableOfReal" ) )
1684 Slot, called when one of the UseCase Browser menu command is called
1686 void QAD_ObjectBrowser::onUseCasePopupMenu( int action )
1688 if ( myStudy->_is_nil() )
1690 QAD_Desktop* Desktop = (QAD_Desktop*) QAD_Application::getDesktop();
1691 QAD_Study* myActiveStudy = Desktop->getActiveStudy();
1692 SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1693 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
1694 SALOMEDS::SObject_var Current = UCBuilder->GetCurrentObject();
1696 QList<QListViewItem> ucSelected;
1697 ucSelected.setAutoDelete( false );
1698 getSelectedParents( myUseCaseView, ucSelected );
1700 if ( action == UC_NEW_EMPTY_ID ) {
1701 if ( ucSelected.count() == 1 ) {
1702 if ( isRootItem( ucSelected.at(0) ) )
1703 UCBuilder->SetRootCurrent();
1705 UCBuilder->SetCurrentObject( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) );
1706 UCBuilder->AddUseCase( tr( "NEW_OBJECT" ) );
1707 myActiveStudy->updateUseCaseBrowser();
1711 if ( action == UC_SET_CURRENT_ID ) {
1712 if ( ucSelected.count() > 0 ) {
1713 if ( isRootItem( ucSelected.at(0) ) )
1714 UCBuilder->SetRootCurrent();
1716 UCBuilder->SetCurrentObject( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) );
1718 myActiveStudy->updateUseCaseBrowser( );
1721 if ( action == UC_RENAME_ID ) {
1722 if ( ucSelected.count() == 1 ) {
1723 QAD_ObjectBrowserItem* useCaseItem = ( QAD_ObjectBrowserItem* )( ucSelected.at( 0 ) );
1724 if ( isRootItem( useCaseItem ) ) {
1725 QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), strdup( UCBuilder->GetName() ) );
1726 if ( !name.isEmpty() ) {
1727 bool ok = UCBuilder->SetName( strdup( name.latin1() ) );
1728 myActiveStudy->updateUseCaseBrowser( );
1731 else/* if ( UCBuilder->IsUseCase( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) ) )*/ {
1732 QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), strdup( useCaseItem->getName() ) );
1733 if ( !name.isEmpty() ) {
1734 myActiveStudy->renameIObject( Sel->firstIObject(), name );
1740 if ( action == UC_APPEND_ID ) {
1741 if ( Sel->IObjectCount() > 0 ) {
1742 SALOME_ListIO SelIO; SelIO = Sel->StoredIObjects();
1743 SALOME_ListIteratorOfListIO SelIt( SelIO );
1744 for( ; SelIt.More(); SelIt.Next() ) {
1745 SALOMEDS::SObject_var selSO = myStudy->FindObjectID( SelIt.Value()->getEntry() );
1746 if ( !selSO->_is_nil() && strcmp( SelIt.Value()->getEntry(), ( "0:2" ) ) != 0 ) {
1747 UCBuilder->Remove( selSO ); // first remove object for sure ...
1748 UCBuilder->Append( selSO ); // ... and now re-append it
1751 myActiveStudy->updateUseCaseBrowser( true );
1755 if ( action == UC_REMOVE_ID ) {
1757 getSelectedParents( myUseCaseView, ucSelected, true );
1758 for ( int i = 0; i < ucSelected.count(); i++ ) {
1759 QAD_ObjectBrowserItem* item = ( QAD_ObjectBrowserItem* )ucSelected.at( i );
1760 if ( !isRootItem( item ) ) {
1762 SALOMEDS::SObject_var SO = myStudy->FindObjectID( item->getEntry() );
1763 if ( !SO->_is_nil() ) {
1764 UCBuilder->Remove( SO );
1770 Sel->ClearIObjects();
1771 myActiveStudy->updateUseCaseBrowser( true );
1774 if ( action == UC_CLEAR_ID ) {
1775 if ( myUseCaseView->childCount() > 0 && myUseCaseView->firstChild()->childCount() > 0) {
1776 QAD_ObjectBrowserItem* child = ( QAD_ObjectBrowserItem* )myUseCaseView->firstChild()->firstChild();
1778 UCBuilder->Remove( myStudy->FindObjectID( child->getEntry().latin1() ) );
1779 child = ( QAD_ObjectBrowserItem* )( child->nextSibling() );
1781 Sel->ClearIObjects();
1782 myActiveStudy->updateUseCaseBrowser();
1787 Use Case browser buttons slot
1789 void QAD_ObjectBrowser::onUseCaseBtn()
1791 if ( sender() == myNewBtn ) {
1792 QAD_Desktop* Desktop = (QAD_Desktop*) QAD_Application::getDesktop();
1793 QAD_Study* myActiveStudy = Desktop->getActiveStudy();
1794 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
1795 UCBuilder->AddUseCase( tr( "NEW_OBJECT" ) );
1796 myActiveStudy->updateUseCaseBrowser();
1798 if ( sender() == myAddBtn )
1799 onUseCasePopupMenu( UC_APPEND_ID );
1800 if ( sender() == myDelBtn )
1801 onUseCasePopupMenu( UC_REMOVE_ID );
1802 if ( sender() == myClearBtn )
1803 onUseCasePopupMenu( UC_CLEAR_ID );
1804 if ( sender() == myCurrentBtn )
1805 onUseCasePopupMenu( UC_SET_CURRENT_ID );