2 // File : QAD_ObjectBrowser.cxx
3 // Created : Thu Jun 14 15:42:10 2001
4 // Author : Nicolas REJNERI
7 // Copyright : Open CASCADE
11 #include "QAD_ObjectBrowserItem.h"
12 #include "QAD_ObjectBrowser.h"
13 #include "QAD_Application.h"
14 #include "QAD_MessageBox.h"
15 #include "QAD_Desktop.h"
16 #include "QAD_Config.h"
17 #include "QAD_Settings.h"
18 #include "QAD_Tools.h"
19 #include "QAD_RightFrame.h"
20 #include "SALOME_Selection.h"
21 #include "SALOME_InteractiveObject.hxx"
22 #include "SALOME_ListIteratorOfListIO.hxx"
23 #include "SALOMEGUI_SetValueDlg.h"
24 #include "SALOMEGUI_TableDlg.h"
25 #include "SALOMEGUI_NameDlg.h"
28 #include <qlistview.h>
30 #include <qpopupmenu.h>
31 #include <qtabwidget.h>
32 #include <qpushbutton.h>
37 #include <qdragobject.h>
38 #include <qstringlist.h>
40 //VRV: porting on Qt 3.0.5
41 #if QT_VERSION >= 0x030005
44 //VRV: porting on Qt 3.0.5
46 #define UC_NEW_EMPTY_ID 1000000
47 #define UC_NEW_COMP_ID 1000002
48 #define UC_NEW_FULL_ID 1000004
49 #define UC_NEW_COPY_ID 1000006
50 #define UC_APPEND_ID 1000008
51 #define UC_REMOVE_ID 1000010
52 #define UC_RENAME_ID 1000012
53 #define UC_CLEAR_ID 1000014
54 #define UC_SET_CURRENT_ID 1000016
57 Gets selected top-level items (i.e. not including sub-items) [ static ]
59 static void getSelectedParents( QListViewItem* listViewItem, QList<QListViewItem>& itemList )
61 QListViewItem* item = listViewItem->firstChild();
63 if ( item->isSelected() ) {
64 itemList.append( item );
67 getSelectedParents( item, itemList );
69 item = item->nextSibling();
73 Gets selected top-level items (i.e. not including sub-items) [ static ]
75 static void getSelectedParents( QListView* listView, QList<QListViewItem>& itemList, bool ignoreRoot = false )
78 QListViewItem* item = listView->firstChild();
80 if ( item->isSelected() && !ignoreRoot ) {
81 itemList.append( item );
84 getSelectedParents( item, itemList );
86 item = item->nextSibling();
90 Gets top-most parent item [ static ]
92 static QListViewItem* getTopParent( QListViewItem* item )
96 QListViewItem* p = item->parent();
99 while ( p->parent() ) {
105 Returns true if the item is top-level (root)
107 static bool isRootItem( QListViewItem* item )
109 return ( item->listView() && !item->parent() );
114 QAD_ObjectBrowser::QAD_ObjectBrowser( SALOMEDS::Study_var study, QWidget* parent, const char* name, WFlags fl )
115 : QTabWidget( parent, name, fl )
117 myStudy = SALOMEDS::Study::_duplicate( study );
118 myListViewMap.clear();
119 myUseCaseMap.clear();
126 QAD_ObjectBrowser::~QAD_ObjectBrowser()
128 if (!myStudy->_is_nil())
129 CORBA::release(myStudy);
133 Configures Object Browser and UseCase Browser.
134 Columns, Selection Mode and Palette.
136 void QAD_ObjectBrowser::setupListView()
138 QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
140 this->setTabPosition( QTabWidget::Bottom );
142 /* Reading setting : Columns for Value, OCAF Doc entry, object IOR, OCAF Doc ref entry and Chrono sorting */
143 QString AddColumn = QAD_CONFIG->getSetting( "ObjectBrowser:AddColumn" );
144 QString ValueColumn = QAD_CONFIG->getSetting( "ObjectBrowser:ValueColumn" );
145 QString ShowCHRONO_SORT = QAD_CONFIG->getSetting( "ObjectBrowser:CHRONO_SORT" );
147 /* create and setup Object Browser ================================= */
148 myListView = new QListView( this, "Object Browser");
149 myListView->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
150 myListView->setMinimumSize( 1, 1 );
151 myListView->setPalette( QAD_Application::getPalette( true ) );
153 /* First two columns = object name and value - always visible */
154 myListView->addColumn( tr( "OBJECT_BROWSER_OBJECT" ) ); /* Adding Object column */
155 myListView->addColumn( tr( "OBJECT_BROWSER_VALUE" ) ); /* Adding Value column */
156 myListView->addColumn( tr( "OBJECT_BROWSER_ENTRY" ) ); /* Adding Doc entry column */
157 myListView->addColumn( tr( "OBJECT_BROWSER_IOR" ) ); /* Adding Object IOR column */
158 myListView->addColumn( tr( "OBJECT_BROWSER_REFENTRY" ) ); /* Adding OCAF Doc ref entry column */
159 myListView->header()->setMovingEnabled( false );
162 myListView->header()->setClickEnabled( TRUE ); /* Enable clicking on the header */
163 myListView->setShowSortIndicator( TRUE ) ; /* Add user arrows to indicate the sort order : LPN */
164 myListView->setRootIsDecorated( TRUE ); /* Enable expand/collapse control for the root item */
165 myListView->setSelectionMode ( QListView::Extended ); /* Enable multiple selection */
166 myListView->setVScrollBarMode( QScrollView::AlwaysOn ); /* Set scrollbars always visible */
167 myListView->setHScrollBarMode( QScrollView::AlwaysOn ); /* ... */
169 /* Connect section */
170 //VRV: porting on Qt 3.0.5
171 #if QT_VERSION < 0x030005
172 connect( myListView, SIGNAL( rightButtonClicked( QListViewItem*, const QPoint&, int ) ),
173 this, SLOT( showPopupMenu( QListViewItem* ) ) );
175 connect( myListView, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint&, int ) ),
176 this, SLOT( showPopupMenu( QListViewItem* ) ) );
178 //VRV: porting on Qt 3.0.5
180 connect( myListView, SIGNAL( selectionChanged() ),
181 this, SLOT( onSelectedItem() ) );
182 connect( myListView, SIGNAL( expanded( QListViewItem* ) ),
183 this, SLOT( onExpanded( QListViewItem* ) ) );
184 connect( myListView, SIGNAL( collapsed( QListViewItem* ) ),
185 this, SLOT( onCollapsed( QListViewItem* ) ) );
187 /* create and setup UseCase Browser ================================ */
188 QWidget* vBox = new QWidget( this );
189 QVBoxLayout* vBoxLayout = new QVBoxLayout( vBox );
191 myUseCaseView = new QListView( vBox, "UseCase Browser");
192 myUseCaseView->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
193 myUseCaseView->setMinimumSize( 1, 1 );
194 myUseCaseView->setPalette( QAD_Application::getPalette( true ) );
196 /* First column = object name */
197 myUseCaseView->addColumn( tr( "OBJECT_BROWSER_OBJECT" ) );
199 myUseCaseView->header()->setClickEnabled( TRUE ); /* Enable clicking on the header */
200 myUseCaseView->setShowSortIndicator( TRUE ) ; /* Add user arrows to indicate the sort order : LPN */
201 myUseCaseView->setRootIsDecorated( TRUE ); /* Enable expand/collapse control for the root item */
202 myUseCaseView->setSelectionMode ( QListView::Extended ); /* Enable multiple selection */
203 myUseCaseView->setVScrollBarMode( QScrollView::AlwaysOn ); /* Set scrollbars always visible */
204 myUseCaseView->setHScrollBarMode( QScrollView::AlwaysOn ); /* ... */
205 myUseCaseView->header()->setMovingEnabled( false );
206 myUseCaseView->viewport()->setAcceptDrops( true );
207 myUseCaseView->installEventFilter( this );
208 myUseCaseView->viewport()->installEventFilter( this );
209 myUseCaseView->setSorting( -1 ) ;
210 vBoxLayout->addWidget( myUseCaseView );
212 myNewBtn = new QToolButton( vBox );
213 myNewBtn->setIconSet( resMgr->loadPixmap( "QAD", tr("ICON_UC_NEW") ) );
214 myNewBtn->setAutoRaise( true );
215 QToolTip::add( myNewBtn, tr( "UC_NEW_ID" ), QAD_Application::getDesktop()->toolTipGroup(), tr( "UC_NEW_TIP" ) );
216 myAddBtn = new QToolButton( vBox );
217 myAddBtn->setIconSet( resMgr->loadPixmap( "QAD", tr("ICON_UC_ADD") ) );
218 myAddBtn->setAutoRaise( true );
219 QToolTip::add( myAddBtn, tr( "UC_APPEND_ID" ), QAD_Application::getDesktop()->toolTipGroup(), tr( "UC_APPEND_TIP" ) );
220 myDelBtn = new QToolButton( vBox );
221 myDelBtn->setIconSet( resMgr->loadPixmap( "QAD", tr("ICON_UC_REMOVE") ) );
222 myDelBtn->setAutoRaise( true );
223 QToolTip::add( myDelBtn, tr( "UC_REMOVE_ID" ), QAD_Application::getDesktop()->toolTipGroup(), tr( "UC_REMOVE_TIP" ) );
224 myClearBtn = new QToolButton( vBox );
225 myClearBtn->setIconSet( resMgr->loadPixmap( "QAD", tr("ICON_UC_CLEAR") ) );
226 myClearBtn->setAutoRaise( true );
227 QToolTip::add( myClearBtn, tr( "UC_CLEAR_ID" ), QAD_Application::getDesktop()->toolTipGroup(), tr( "UC_CLEAR_TIP" ) );
228 myCurrentBtn = new QToolButton( vBox );
229 myCurrentBtn->setIconSet( resMgr->loadPixmap( "QAD", tr("ICON_UC_SET_CURRENT") ) );
230 myCurrentBtn->setAutoRaise( true );
231 QToolTip::add( myCurrentBtn, tr( "UC_SET_CURRENT_ID" ), QAD_Application::getDesktop()->toolTipGroup(), tr( "UC_SET_CURRENT_TIP" ) );
233 QHBoxLayout* btnLayout = new QHBoxLayout;
234 btnLayout->setMargin( 3 ); btnLayout->setSpacing( 3 );
235 btnLayout->addWidget( myNewBtn );
236 btnLayout->addStretch();
237 btnLayout->addSpacing( 5 );
238 btnLayout->addStretch();
239 btnLayout->addWidget( myAddBtn );
240 btnLayout->addWidget( myDelBtn );
241 btnLayout->addStretch();
242 btnLayout->addSpacing( 5 );
243 btnLayout->addStretch();
244 btnLayout->addWidget( myClearBtn );
245 btnLayout->addStretch();
246 btnLayout->addSpacing( 5 );
247 btnLayout->addStretch();
248 btnLayout->addWidget( myCurrentBtn );
249 btnLayout->addStretch();
251 vBoxLayout->addLayout( btnLayout );
253 connect( myNewBtn, SIGNAL( clicked() ), this, SLOT( onUseCaseBtn() ) );
254 connect( myAddBtn, SIGNAL( clicked() ), this, SLOT( onUseCaseBtn() ) );
255 connect( myDelBtn, SIGNAL( clicked() ), this, SLOT( onUseCaseBtn() ) );
256 connect( myClearBtn, SIGNAL( clicked() ), this, SLOT( onUseCaseBtn() ) );
257 connect( myCurrentBtn, SIGNAL( clicked() ), this, SLOT( onUseCaseBtn() ) );
259 /* Connect section */
260 #if QT_VERSION < 0x030005
261 connect( myUseCaseView, SIGNAL( rightButtonClicked( QListViewItem*, const QPoint&, int ) ),
262 this, SLOT( showPopupMenu( QListViewItem* ) ) );
264 connect( myUseCaseView, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint&, int ) ),
265 this, SLOT( showPopupMenu( QListViewItem* ) ) );
268 connect( myUseCaseView, SIGNAL( selectionChanged() ),
269 this, SLOT( onSelectedItem() ) );
271 /* add Object Browser and UseCase Browser as pages ================= */
272 this->addTab( myListView, tr( "TLT_OBJECT_BROWSER" ) );
273 this->addTab( vBox, tr( "TLT_USECASE_BROWSER" ) );
275 setShowInfoColumns( AddColumn == "true" );
276 setShowValueColumn( ValueColumn == "true" );
277 setEnableChronoSort( ShowCHRONO_SORT == "true" );
279 resize( QSize( 100, 400 ) );
286 bool QAD_ObjectBrowser::eventFilter( QObject* o, QEvent* e )
288 QAD_Desktop* Desktop = (QAD_Desktop*) QAD_Application::getDesktop();
289 QAD_Study* myActiveStudy = Desktop->getActiveStudy();
290 if ( myStudy->_is_nil() )
291 return QTabWidget::eventFilter( o, e );
293 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
294 if ( o == myUseCaseView->viewport() ) {
295 if ( e->type() == QEvent::MouseButtonPress ) {
296 // Test if clicked on selection and start drag if necessary
297 QMouseEvent* me = ( QMouseEvent* )e;
298 QAD_ObjectBrowserItem* item = ( QAD_ObjectBrowserItem* )( myUseCaseView->itemAt( me->pos() ) );
299 if ( item && item->isSelected() && me->button() == LeftButton) {
300 if ( me->pos().x() > myUseCaseView->header()->sectionPos( myUseCaseView->header()->mapToIndex( 0 ) ) +
301 myUseCaseView->treeStepSize() * ( item->depth() + ( myUseCaseView->rootIsDecorated() ? 1 : 0 ) ) +
302 myUseCaseView->itemMargin() ||
303 me->pos().x() < myUseCaseView->header()->sectionPos( myUseCaseView->header()->mapToIndex( 0 ) ) ) {
304 QStringList entryList;
305 QListViewItemIterator it( myUseCaseView );
307 for ( ; it.current(); ++it ) {
308 QAD_ObjectBrowserItem* selItem = ( QAD_ObjectBrowserItem* )( it.current() );
309 if ( selItem->isSelected() ) {
310 if ( isRootItem( selItem ) ) {
315 entryList.append( selItem->getEntry() );
319 if ( done && !entryList.isEmpty() ) {
320 QTextDrag *d = new QTextDrag( entryList.join("*"), myUseCaseView->viewport() );
327 else if ( e->type() == QEvent::DragMove ) {
328 QDragMoveEvent* dme = ( QDragMoveEvent* )e;
329 if ( dme->source() == myUseCaseView->viewport() ) {
337 else if ( e->type() == QEvent::Drop ) {
338 QDropEvent* de = ( QDropEvent* )e;
340 QAD_ObjectBrowserItem* dropItem = ( QAD_ObjectBrowserItem* )( myUseCaseView->itemAt( de->pos() ) );
341 if ( de->source() == myUseCaseView->viewport() ) {
342 if ( QTextDrag::decode( de, text ) && dropItem && !dropItem->isSelected() ) {
343 QAD_ObjectBrowserItem* useCaseItem = ( QAD_ObjectBrowserItem* )getTopParent( dropItem );
345 if ( !UCBuilder->_is_nil() ) {
346 UCBuilder->SetRootCurrent();
347 if ( useCaseItem != dropItem ) {
348 SALOMEDS::SObject_var dropObject = myStudy->FindObjectID( dropItem->getEntry() );
349 if ( !dropObject->_is_nil() )
350 UCBuilder->SetCurrentObject( dropObject );
352 QStringList entryList = QStringList::split( "*", text, false );
353 // if Move action then first remove all selected items
354 if ( de->action() == QDropEvent::Move ) {
355 QList<QListViewItem> ucSelected;
356 ucSelected.setAutoDelete( false );
357 getSelectedParents( myUseCaseView, ucSelected );
358 for ( int j = 0; j < entryList.count(); j++ ) {
359 QAD_ObjectBrowserItem* delItem = ( QAD_ObjectBrowserItem* )( ucSelected.at( j ) );
360 QAD_ObjectBrowserItem* ucDelItem = ( QAD_ObjectBrowserItem* )getTopParent( delItem );
361 SALOMEDS::SObject_var delSO = myStudy->FindObjectID( delItem->getEntry() );
362 if ( !delSO->_is_nil() && ucDelItem ) {
363 UCBuilder->Remove( delSO );
367 // then try to append items to destination
368 for ( int i = 0; i < entryList.count(); i++ ) {
369 SALOMEDS::SObject_var SO = myStudy->FindObjectID( entryList[i] );
370 if ( !SO->_is_nil() ) {
371 UCBuilder->Remove( SO );
372 UCBuilder->Append( SO );
375 myActiveStudy->updateUseCaseBrowser();
387 else if ( o == myUseCaseView ) {
388 if ( e->type() == QEvent::KeyPress ) {
389 QKeyEvent* ke = ( QKeyEvent* )e;
390 if ( ke->key() == Key_Delete ) {
391 onUseCasePopupMenu( UC_REMOVE_ID );
396 return QTabWidget::eventFilter( o, e );
403 void QAD_ObjectBrowser::onCreatePopup()
405 QAD_Desktop* Desktop = (QAD_Desktop*) QAD_Application::getDesktop();
406 QAD_Study* myActiveStudy = Desktop->getActiveStudy();
407 SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
409 /* VSR : Creation of common POPUP menu for Object Browser/Use Case Browser */
410 if ( Sel->IObjectCount() > 0 ) {
415 Desktop->definePopup( theContext, theParent, theObject );
417 Desktop->createPopup( myPopup, theContext, "ObjectBrowser", theObject);
418 if ( !Desktop->getActiveComponent().isEmpty() ) {
419 Desktop->customPopup( myPopup, theContext, "ObjectBrowser", theObject );
421 // VSR:22/01/03 - Command for edit attributes value
422 bool EditValues = QAD_CONFIG->getSetting( "ObjectBrowser:EditValues" ) == "true";
423 if ( EditValues && Sel->IObjectCount() == 1 && hasEditableAttribute(Sel->firstIObject()) ) {
424 if ( myPopup->count() > 0 )
425 myPopup->insertSeparator();
426 myPopup->insertItem( tr( "EDIT_VALUE_CMD" ),
428 SLOT( onEditAttribute() ) );
433 // No selected item => it's not necessary to create popup
434 //NRI- : Desktop->createPopup( myPopup, "", "ObjectBrowser", "");
436 if ( currentPage() != myListView ) {
437 /* VSR : Creation of POPUP menu for UseCase Browser */
438 QList<QListViewItem> ucSelected;
439 ucSelected.setAutoDelete( false );
440 getSelectedParents( myUseCaseView, ucSelected );
442 if ( myPopup && !myStudy->_is_nil() ) {
443 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
445 bool isOne = ucSelected.count() == 1;
446 bool isMany = ucSelected.count() > 1;
447 bool isEmpty = ucSelected.count() == 1;
448 bool obSelected = Sel->IObjectCount() > 0;
449 bool isRoot = isOne && isRootItem( ucSelected.at( 0 ) );
450 bool manyChildren = myUseCaseView->childCount() > 0 && myUseCaseView->firstChild()->childCount() > 0;
451 bool isUseCase = isOne &&
452 ( isRoot || UCBuilder->IsUseCase( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) ) );
456 QPopupMenu *UseCasePopup = new QPopupMenu( myPopup );
458 UseCasePopup->insertItem( tr( "UC_NEW_ID" ), this, SLOT( onUseCasePopupMenu( int ) ), 0, UC_NEW_EMPTY_ID );
460 UseCasePopup->insertItem( tr( "UC_SET_CURRENT_ID" ), this, SLOT( onUseCasePopupMenu( int ) ), 0, UC_SET_CURRENT_ID );
462 UseCasePopup->insertItem( tr( "UC_RENAME_ID" ), this, SLOT( onUseCasePopupMenu( int ) ), 0, UC_RENAME_ID );
463 if ( isRoot && manyChildren )
464 UseCasePopup->insertItem( tr( "UC_CLEAR_ID" ), this, SLOT( onUseCasePopupMenu( int ) ), 0, UC_CLEAR_ID );
466 if ( UseCasePopup->count() > 0 ) {
467 if ( myPopup->count() > 0 )
468 myPopup->insertSeparator();
469 myPopup->insertItem( tr( "UC_POPUP" ), UseCasePopup );
479 Returns Object Browser list view
481 QListView* QAD_ObjectBrowser::getListView() const
487 Returns UseCase Browser list view
489 QListView* QAD_ObjectBrowser::getUseCaseView() const
491 return myUseCaseView;
495 Adds anItem ( probably a SComponent )
497 QAD_ObjectBrowserItem* QAD_ObjectBrowser::AddItem(QListView* theView,
498 const QString& theName,
499 const QString& theEntry,
500 const QString& theIOR,
502 const QString& theValue,
503 QAD_ObjectBrowserItem* theAfter)
506 QAD_ObjectBrowserItem* last = (QAD_ObjectBrowserItem*)(theView->firstChild());
510 for ( ; last->nextSibling(); last = (QAD_ObjectBrowserItem*)(last->nextSibling()) );
512 QAD_ObjectBrowserItem* anItem = new QAD_ObjectBrowserItem( theView, last );
514 anItem->setType( theType );
515 anItem->setOpen( FALSE );
516 anItem->setName( theName );
517 anItem->setValue( theValue );
518 anItem->setEntry( theEntry );
519 anItem->setIOR( theIOR );
520 anItem->setReference( "" );
526 Adds anItem ( probably a StudyObject )
528 QAD_ObjectBrowserItem* QAD_ObjectBrowser::AddItem(QAD_ObjectBrowserItem* theParentItem,
529 const QString& theName,
530 const QString& theEntry,
531 const QString& theIOR,
533 const QString& theRef,
534 const QString& theValue,
535 QAD_ObjectBrowserItem* theAfter)
538 QAD_ObjectBrowserItem* last = (QAD_ObjectBrowserItem*)(theParentItem->firstChild());
542 for ( ; last->nextSibling(); last = (QAD_ObjectBrowserItem*)(last->nextSibling()) );
544 QAD_ObjectBrowserItem* anItem = new QAD_ObjectBrowserItem(theParentItem, last);
545 anItem->setType( theType );
546 anItem->setOpen( FALSE );
547 anItem->setName( theName );
548 anItem->setValue( theValue );
549 anItem->setEntry( theEntry );
550 anItem->setIOR( theIOR );
551 anItem->setReference( theRef );
557 Updates Object Browsers' item [ protected ]
559 void QAD_ObjectBrowser::Update( SALOMEDS::SObject_ptr SO,
560 QAD_ObjectBrowserItem* theParentItem )
562 if ( myStudy->_is_nil() || SO->_is_nil() || !theParentItem ) {
565 SALOMEDS::ChildIterator_var it = myStudy->NewChildIterator(SO);
567 for (; it->More();it->Next()) {
568 SALOMEDS::SObject_var CSO = it->Value();
569 SALOMEDS::SObject_var RefSO;
571 QString CSOEntry = strdup( CSO->GetID() );
572 SALOMEDS::GenericAttribute_var anAttr;
573 SALOMEDS::AttributeName_var aName;
574 SALOMEDS::AttributeComment_var aCmnt;
575 SALOMEDS::AttributeIOR_var anIOR;
576 SALOMEDS::AttributeReal_var aReal;
577 SALOMEDS::AttributeInteger_var anInt;
578 SALOMEDS::AttributeSelectable_var aSelectable;
579 SALOMEDS::AttributeExpandable_var anExpandable;
580 SALOMEDS::AttributeOpened_var anOpened;
581 SALOMEDS::AttributePixMap_var aPixmap;
582 SALOMEDS::AttributeTextColor_var aTextColor;
583 SALOMEDS::AttributeTextHighlightColor_var aTextHighlightColor;
585 QAD_ObjectBrowserItem* Item = 0;
586 QAD_ObjectBrowserItem* subItem;
589 if ( CSO->ReferencedObject(RefSO) && !RefSO->_is_nil() ) {
591 QString RefSOEntry = strdup( RefSO->GetID() );
592 if (CSO->FindAttribute(anAttr, "AttributeName") || RefSO->FindAttribute(anAttr, "AttributeName")) {
593 aName = SALOMEDS::AttributeName::_narrow(anAttr);
594 if (RefSO->FindAttribute(anAttr, "AttributeIOR")) {
595 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
596 ior = strdup( anIOR->Value() );
598 valueString = getValueFromObject( RefSO );
599 // AddItem (Item, QString(" * ") + strdup( aName->Value() ), RefSOEntry, ior, 2, CSOEntry);
600 Item = AddItem(theParentItem,
601 QString(" * ") + strdup( aName->Value() ),
607 myListViewMap[ RefSOEntry ].append( Item );
610 MESSAGE("QAD_ObjectBrowser::Update : noname item: "<<CSO->GetID());
614 valueString = getValueFromObject( CSO );
616 if (CSO->FindAttribute(anAttr, "AttributeIOR")) {
617 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
618 ior = strdup( anIOR->Value() );
620 // getting Name and adding new Item
621 if (CSO->FindAttribute(anAttr, "AttributeName") ) {
622 aName = SALOMEDS::AttributeName::_narrow(anAttr);
623 Item = AddItem(theParentItem, strdup( aName->Value() ), CSOEntry, ior, 0, "", valueString);
624 myListViewMap[ CSOEntry ].append( Item );
627 MESSAGE("QAD_ObjectBrowser::Update : noname item: "<<CSO->GetID());
629 // adding other attributes
632 if ( CSO->FindAttribute(anAttr, "AttributeSelectable") ) {
633 aSelectable = SALOMEDS::AttributeSelectable::_narrow(anAttr);
634 Item->setSelectable(aSelectable->IsSelectable());
637 if ( CSO->FindAttribute(anAttr, "AttributeExpandable") ) {
638 anExpandable = SALOMEDS::AttributeExpandable::_narrow(anAttr);
639 Item->setExpandable(anExpandable->IsExpandable());
642 if ( CSO->FindAttribute(anAttr, "AttributeOpened") ) {
643 anOpened = SALOMEDS::AttributeOpened::_narrow(anAttr);
644 Item->setOpen(anOpened->IsOpened());
647 if ( CSO->FindAttribute(anAttr, "AttributeTextColor") ) {
648 aTextColor = SALOMEDS::AttributeTextColor::_narrow(anAttr);
649 QColor aColor(aTextColor->TextColor().R, aTextColor->TextColor().G, aTextColor->TextColor().B) ;
650 Item->setTextColor(aColor);
652 // TextHighlightColor
653 if ( CSO->FindAttribute(anAttr, "AttributeTextHighlightColor") ) {
654 aTextHighlightColor = SALOMEDS::AttributeTextHighlightColor::_narrow(anAttr);
655 QColor aColor(aTextHighlightColor->TextHighlightColor().R,
656 aTextHighlightColor->TextHighlightColor().G,
657 aTextHighlightColor->TextHighlightColor().B) ;
658 Item->setTextHighlightColor(aColor);
661 if ( CSO->FindAttribute(anAttr, "AttributePixMap") ) {
662 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
663 if ( aPixmap->HasPixMap() ) {
664 SALOMEDS::SComponent_var father = CSO->GetFatherComponent();
665 if (father->FindAttribute(anAttr, "AttributeName") ) {
666 SALOMEDS::AttributeName_var aFatherName;
667 aFatherName = SALOMEDS::AttributeName::_narrow(anAttr);
670 QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
672 if(resMgr->loadResources( QString(aFatherName->Value()) + "GUI", msg )) {
673 QPixmap icon ( resMgr->loadPixmap( QString(aFatherName->Value()) + "GUI",
674 tr(aPixmap->GetPixMap()) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ));
675 Item->setPixmap( 0, icon );
683 // if ( theParentItem->isOpen() )
684 // Item->setOpen(TRUE);
692 Updates Object Browser tree and UseCase Browser tree
694 void QAD_ObjectBrowser::Update()
697 myListViewMap.clear();
699 if ( myStudy->_is_nil() ) {
703 QString ShowIAPP = QAD_CONFIG->getSetting("ObjectBrowser:IAPP");
705 /* Updating Object Browser ============================================== */
706 SALOMEDS::SComponentIterator_var itcomp = myStudy->NewComponentIterator();
707 for (; itcomp->More(); itcomp->Next()) {
708 QAD_ObjectBrowserItem* Item = 0;
709 SALOMEDS::SComponent_var SC = itcomp->Value();
710 QString dataType = strdup( SC->ComponentDataType() );
712 QString SCEntry = strdup( SC->GetID() );
714 SALOMEDS::GenericAttribute_var anAttr;
715 SALOMEDS::AttributeName_var aName;
716 SALOMEDS::AttributeComment_var aCmnt;
717 SALOMEDS::AttributeIOR_var anIOR;
718 SALOMEDS::AttributeReal_var aReal;
719 SALOMEDS::AttributeInteger_var anInt;
720 SALOMEDS::AttributeSelectable_var aSelectable;
721 SALOMEDS::AttributeExpandable_var anExpandable;
722 SALOMEDS::AttributeOpened_var anOpened;
723 SALOMEDS::AttributePixMap_var aPixmap;
724 SALOMEDS::AttributeTextColor_var aTextColor;
725 SALOMEDS::AttributeTextHighlightColor_var aTextHighlightColor;
727 if (SC->FindAttribute(anAttr, "AttributeIOR")) {
728 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
729 ior = strdup( anIOR->Value() );
732 bool caseIAPP = false;
734 // create data-tree item, corresponding to component (and set name if component has it)
735 if ( dataType.compare("Interface Applicative") == 0 ) {
737 if ( ShowIAPP.compare("true") == 0 ) {
738 if (SC->FindAttribute(anAttr, "AttributeName")) {
739 aName = SALOMEDS::AttributeName::_narrow(anAttr);
740 Item = AddItem (myListView, strdup( aName->Value() ), strdup( SCEntry ), ior, 1, "");
741 myListViewMap[ SCEntry ].append( Item );
744 Item = AddItem (myListView, dataType, SCEntry, ior, 1, "");
745 myListViewMap[ SCEntry ].append( Item );
752 if (SC->FindAttribute(anAttr, "AttributeName")) {
753 aName = SALOMEDS::AttributeName::_narrow(anAttr);
754 Item = AddItem (myListView, strdup( aName->Value() ), SCEntry, ior, 1, "");
755 myListViewMap[ SCEntry ].append( Item );
758 /*In according to CAF - any label (even if it is empty) exist during to whole session.
759 So, if label haven't an "AttributeName" it is means that the label is empty.
760 Therefore follow action couses bug -
761 Item = AddItem (myListView, dataType, SC->GetID(), ior, 1, "");
765 // add other attributes
767 QAD_ObjectBrowserItem* subItem;
769 if ( SC->FindAttribute(anAttr, "AttributeSelectable") ) {
770 aSelectable = SALOMEDS::AttributeSelectable::_narrow(anAttr);
771 Item->setSelectable(aSelectable->IsSelectable());
774 if ( SC->FindAttribute(anAttr, "AttributeExpandable") ) {
775 anExpandable = SALOMEDS::AttributeExpandable::_narrow(anAttr);
776 Item->setExpandable(anExpandable->IsExpandable());
779 if ( SC->FindAttribute(anAttr, "AttributeOpened") ) {
780 anOpened = SALOMEDS::AttributeOpened::_narrow(anAttr);
781 Item->setOpen(anOpened->IsOpened());
784 if ( SC->FindAttribute(anAttr, "AttributeTextColor") ) {
785 aTextColor = SALOMEDS::AttributeTextColor::_narrow(anAttr);
786 QColor aColor(aTextColor->TextColor().R, aTextColor->TextColor().G, aTextColor->TextColor().B) ;
787 Item->setTextColor(aColor);
789 // TextHighlightColor
790 if ( SC->FindAttribute(anAttr, "AttributeTextHighlightColor") ) {
791 aTextHighlightColor = SALOMEDS::AttributeTextHighlightColor::_narrow(anAttr);
792 QColor aColor(aTextHighlightColor->TextHighlightColor().R,
793 aTextHighlightColor->TextHighlightColor().G,
794 aTextHighlightColor->TextHighlightColor().B) ;
795 Item->setTextHighlightColor(aColor);
799 if ( SC->FindAttribute(anAttr, "AttributePixMap") ) {
800 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
801 if ( aPixmap->HasPixMap() ) {
803 QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
805 MESSAGE ( " Component " << aName->Value() )
806 MESSAGE ( " Icon " << aPixmap->GetPixMap() )
807 if(resMgr->loadResources( QString(aName->Value()) + "GUI", msg )) {
808 QPixmap icon ( resMgr->loadPixmap( QString(aName->Value()) + "GUI",
809 tr(aPixmap->GetPixMap()) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ));
810 Item->setPixmap( 0, icon );
816 if ( strcmp(dataType, TypeComponent) == 0 )
819 if ( caseIAPP && ShowIAPP.compare("true") == 0 )
826 /* Updating UseCase Browser ============================================= */
827 UpdateUseCaseBrowser();
831 Removes item with all childs from the map - used to optimize UseCase browser update
833 void removeFromMap( ItemMap& theMap, QAD_ObjectBrowserItem* item )
836 QAD_ObjectBrowserItem* subItem = ( QAD_ObjectBrowserItem* )( item->firstChild() );
838 removeFromMap( theMap, subItem );
839 subItem = ( QAD_ObjectBrowserItem* )( subItem->nextSibling() );
841 if ( theMap.contains( item->getEntry() ) ) {
842 theMap[ item->getEntry() ].removeRef( item );
843 if ( theMap[ item->getEntry() ].isEmpty() ) {
844 theMap.remove( item->getEntry() );
851 Updates only UseCase Browser
853 void QAD_ObjectBrowser::UpdateUseCaseBrowser() {
854 // myUseCaseView->clear(); myUseCaseMap.clear();
855 if ( myStudy->_is_nil() ) {
858 myUseCaseView->blockSignals( true );
859 // myUseCaseView->setUpdatesEnabled( false );
861 QAD_ObjectBrowserItem* root = ( QAD_ObjectBrowserItem* )myUseCaseView->firstChild();
862 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
863 SALOMEDS::SObject_var SOCurrent = UCBuilder->GetCurrentObject();
864 QString UCName = QString( strdup( UCBuilder->GetName() ) );
865 if ( UCName.isEmpty() )
866 UCName = QString( tr( "Root" ) );
867 // creating root item if is not yet created
869 root = AddItem( myUseCaseView, UCName, "0:2", "", 1, "" );
870 myUseCaseMap[ "0:2" ].append( root );
873 root->setName( UCName );
874 // setting it current if necessary
875 root->setCurrent( SOCurrent->_is_nil() || !strcmp( SOCurrent->GetID(), "0:2" ) );
876 // updating list view...
877 QMap<QString,SALOMEDS::SObject_var> ucList;
878 SALOMEDS::UseCaseIterator_var UCIter = UCBuilder->GetUseCaseIterator( SALOMEDS::SObject::_nil() );
879 if ( !UCIter->_is_nil() ) {
880 for ( ; UCIter->More(); UCIter->Next() ) {
881 SALOMEDS::SObject_var UCObject = UCIter->Value();
882 QString UCEntry = strdup( UCObject->GetID() );
883 ucList[ UCEntry ] = UCObject;
886 // ... 1) delete removed items
887 QAD_ObjectBrowserItem* childItem = ( QAD_ObjectBrowserItem* )root->firstChild();
888 while ( childItem ) {
889 QAD_ObjectBrowserItem* prevItem = childItem;
890 childItem = ( QAD_ObjectBrowserItem* )childItem->nextSibling();
891 if ( !ucList.contains( prevItem->getEntry() ) ) {
892 // myUseCaseMap[ prevItem->getEntry() ].removeRef( prevItem );
893 // if ( myUseCaseMap[ prevItem->getEntry() ].isEmpty() )
894 // myUseCaseMap.remove( prevItem->getEntry() );
895 removeFromMap( myUseCaseMap, prevItem );
899 // ... 2) create/update existing
900 QMap<QString,SALOMEDS::SObject_var>::Iterator it;
901 for ( it = ucList.begin(); it != ucList.end(); ++it ) {
902 UpdateUCItem( it.data(), root );
904 myUseCaseView->blockSignals( false );
905 // myUseCaseView->setUpdatesEnabled( true );
906 // myUseCaseView->update();
907 // UCItem->setOpen( true );
911 Updates UseCase Browser's item
913 void QAD_ObjectBrowser::UpdateUCItem( SALOMEDS::SObject_var UCObject, QAD_ObjectBrowserItem* UCItem )
915 if ( myStudy->_is_nil() || !UCItem )
918 /* Creating SObjects item */
919 SALOMEDS::SObject_var RefSO;
920 SALOMEDS::GenericAttribute_var anAttr;
921 SALOMEDS::AttributeName_var aName;
922 SALOMEDS::AttributeIOR_var anIOR;
923 SALOMEDS::AttributeSelectable_var aSelectable;
924 SALOMEDS::AttributeExpandable_var anExpandable;
925 SALOMEDS::AttributePixMap_var aPixmap;
926 SALOMEDS::AttributeTextColor_var aTextColor;
927 SALOMEDS::AttributeTextHighlightColor_var aTextHighlightColor;
930 QString UCEntry = strdup( UCObject->GetID() );
932 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
933 SALOMEDS::SObject_var SOCurrent = UCBuilder->GetCurrentObject();
936 QAD_ObjectBrowserItem* UCSubItem = 0;
937 if ( myUseCaseMap.contains( UCEntry ) && myUseCaseMap[ UCEntry ].count() > 0 )
938 UCSubItem = myUseCaseMap[ UCEntry ].first();
941 if ( UCObject->ReferencedObject( RefSO ) && !RefSO->_is_nil() ) {
942 QString RefSOEntry = strdup( RefSO->GetID() );
943 if ( UCObject->FindAttribute( anAttr, "AttributeName" ) || RefSO->FindAttribute( anAttr, "AttributeName" ) ) {
944 aName = SALOMEDS::AttributeName::_narrow( anAttr );
945 if ( RefSO->FindAttribute( anAttr, "AttributeIOR" ) ) {
946 anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr );
947 ior = strdup( anIOR->Value() );
949 valueString = getValueFromObject( RefSO );
951 UCSubItem = AddItem( UCItem,
952 QString( " * " ) + strdup( aName->Value() ),
958 myUseCaseMap[ RefSOEntry ].append( UCSubItem );
961 UCSubItem->setName( QString( " * " ) + strdup( aName->Value() ) );
962 UCSubItem->setEntry( RefSOEntry );
963 UCSubItem->setIOR( ior );
964 UCSubItem->setReference( UCEntry );
965 UCSubItem->setValue( valueString );
967 UCSubItem->setCurrent( !SOCurrent->_is_nil() && QString( SOCurrent->GetID() ) == QString( UCEntry ) );
972 valueString = getValueFromObject( UCObject );
974 if ( UCObject->FindAttribute( anAttr, "AttributeIOR" ) ) {
975 anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr );
976 ior = strdup( anIOR->Value() );
978 // getting Name and adding new Item
979 if ( UCObject->FindAttribute( anAttr, "AttributeName" ) ) {
980 aName = SALOMEDS::AttributeName::_narrow( anAttr );
982 UCSubItem = AddItem( UCItem, strdup( aName->Value() ), UCEntry, ior, 0, "", valueString );
983 myUseCaseMap[ UCEntry ].append( UCSubItem );
986 UCSubItem->setName( strdup( aName->Value() ) );
987 UCSubItem->setEntry( UCEntry );
988 UCSubItem->setIOR( ior );
989 UCSubItem->setReference( "" );
990 UCSubItem->setValue( valueString );
993 // adding other attributes
995 UCSubItem->setCurrent( !SOCurrent->_is_nil() && QString( SOCurrent->GetID() ) == QString( UCEntry ) );
997 // if ( UCObject->FindAttribute( anAttr, "AttributeSelectable" ) ) {
998 // aSelectable = SALOMEDS::AttributeSelectable::_narrow( anAttr );
999 // UCSubItem->setSelectable( aSelectable->IsSelectable() );
1002 // if ( UCObject->FindAttribute( anAttr, "AttributeExpandable" ) ) {
1003 // anExpandable = SALOMEDS::AttributeExpandable::_narrow( anAttr );
1004 // UCSubItem->setExpandable( anExpandable->IsExpandable() );
1007 if ( UCObject->FindAttribute(anAttr, "AttributeTextColor" ) ) {
1008 aTextColor = SALOMEDS::AttributeTextColor::_narrow( anAttr );
1009 QColor aColor( aTextColor->TextColor().R,
1010 aTextColor->TextColor().G,
1011 aTextColor->TextColor().B );
1012 UCSubItem->setTextColor( aColor );
1014 // TextHighlightColor
1015 if ( UCObject->FindAttribute( anAttr, "AttributeTextHighlightColor" ) ) {
1016 aTextHighlightColor = SALOMEDS::AttributeTextHighlightColor::_narrow( anAttr );
1017 QColor aColor( aTextHighlightColor->TextHighlightColor().R,
1018 aTextHighlightColor->TextHighlightColor().G,
1019 aTextHighlightColor->TextHighlightColor().B );
1020 UCSubItem->setTextHighlightColor( aColor );
1023 if ( UCObject->FindAttribute( anAttr, "AttributePixMap" ) ) {
1024 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
1025 if ( aPixmap->HasPixMap() ) {
1026 SALOMEDS::SComponent_var father = UCObject->GetFatherComponent();
1027 if ( father->FindAttribute( anAttr, "AttributeName" ) ) {
1028 SALOMEDS::AttributeName_var aFatherName;
1029 aFatherName = SALOMEDS::AttributeName::_narrow( anAttr );
1030 QAD_ResourceMgr* resMgr = QAD_Desktop::getResourceManager();
1033 if( resMgr->loadResources( QString( aFatherName->Value() ) + "GUI", msg ) ) {
1034 QPixmap icon ( resMgr->loadPixmap( QString( aFatherName->Value() ) + "GUI",
1035 tr( aPixmap->GetPixMap() ) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ) );
1036 UCSubItem->setPixmap( 0, icon );
1045 // updating children ...
1046 QMap<QString,SALOMEDS::SObject_var> ucList;
1047 SALOMEDS::UseCaseIterator_var UCIter = UCBuilder->GetUseCaseIterator( UCObject );
1048 if ( !UCIter->_is_nil() ) {
1049 for ( ; UCIter->More(); UCIter->Next() ) {
1050 SALOMEDS::SObject_var UCSubObject = UCIter->Value();
1051 QString UCSubEntry = strdup( UCSubObject->GetID() );
1052 ucList[ UCSubEntry ] = UCSubObject;
1055 // ... 1) delete removed items
1056 QAD_ObjectBrowserItem* childItem = ( QAD_ObjectBrowserItem* )UCSubItem->firstChild();
1057 while ( childItem ) {
1058 QAD_ObjectBrowserItem* prevItem = childItem;
1059 childItem = ( QAD_ObjectBrowserItem* )childItem->nextSibling();
1060 if ( !ucList.contains( prevItem->getEntry() ) ) {
1061 // myUseCaseMap[ prevItem->getEntry() ].removeRef( prevItem );
1062 // if ( myUseCaseMap[ prevItem->getEntry() ].isEmpty() )
1063 // myUseCaseMap.remove( prevItem->getEntry() );
1064 removeFromMap( myUseCaseMap, prevItem );
1068 // ... 2) create/update existing
1069 QMap<QString,SALOMEDS::SObject_var>::Iterator it;
1070 for ( it = ucList.begin(); it != ucList.end(); ++it ) {
1071 UpdateUCItem( it.data(), UCSubItem );
1077 Unhighlights all items
1079 void QAD_ObjectBrowser::unHighlightAll()
1081 myListView->clearSelection();
1082 myUseCaseView->clearSelection();
1086 Highlights items which refer to object
1088 void QAD_ObjectBrowser::highlight( const Handle(SALOME_InteractiveObject)& IObject, bool highlight )
1090 QList<QAD_ObjectBrowserItem> List;
1091 if (getItems(IObject, List)) {
1092 for (int i = 0; i < List.count(); i++) {
1093 List.at(i)->setSelected( highlight );
1094 List.at(i)->repaint();
1100 Gets items from Object Browser which refer to object
1102 bool QAD_ObjectBrowser::getItems( const Handle(SALOME_InteractiveObject)& IObject,
1103 QList<QAD_ObjectBrowserItem>& List)
1106 if ( myListViewMap.contains( IObject->getEntry() ) ) {
1107 ItemList ilist = myListViewMap[ IObject->getEntry() ];
1108 for ( int i = 0; i < ilist.count(); i++ )
1109 List.append( ilist.at(i) );
1111 if ( myUseCaseMap.contains( IObject->getEntry() ) ) {
1112 ItemList ilist = myUseCaseMap[ IObject->getEntry() ];
1113 for ( int i = 0; i < ilist.count(); i++ )
1114 List.append( ilist.at(i) );
1116 return (List.count() > 0);
1120 Gets items from Object Browser which refer to object
1122 bool QAD_ObjectBrowser::getItems( SALOMEDS::SObject_ptr SO,
1123 QList<QAD_ObjectBrowserItem>& List)
1126 if ( myListViewMap.contains( SO->GetID() ) ) {
1127 ItemList ilist = myListViewMap[ SO->GetID() ];
1128 for ( int i = 0; i < ilist.count(); i++ )
1129 List.append( ilist.at(i) );
1131 if ( myUseCaseMap.contains( SO->GetID() ) ) {
1132 ItemList ilist = myUseCaseMap[ SO->GetID() ];
1133 for ( int i = 0; i < ilist.count(); i++ )
1134 List.append( ilist.at(i) );
1136 return (List.count() > 0);
1140 Gets first item from Object Browser which refers to object (not reference)
1142 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getItem( const Handle(SALOME_InteractiveObject)& IObject )
1144 if ( myListViewMap.contains( IObject->getEntry() ) ) {
1145 ItemList ilist = myListViewMap[ IObject->getEntry() ];
1146 for ( int i = 0; i < ilist.count(); i++ ) {
1147 QString aRef = ilist.at(i)->getReference();
1148 if ( ilist.at(i)->getReference().isEmpty() )
1156 Finds item from Object Browser corresponding to Object, returns 0 if fails
1158 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getItem( SALOMEDS::SObject_ptr SO )
1160 if ( myListViewMap.contains( SO->GetID() ) ) {
1161 ItemList ilist = myListViewMap[ SO->GetID() ];
1162 for ( int i = 0; i < ilist.count(); i++ ) {
1163 QString aRef = ilist.at(i)->getReference();
1164 if ( ilist.at(i)->getReference().isEmpty() )
1173 Gets first item from UseCase Browser which refers to object (not reference)
1175 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getUCItem( const Handle(SALOME_InteractiveObject)& IObject )
1177 if ( myUseCaseMap.contains( IObject->getEntry() ) ) {
1178 ItemList ilist = myUseCaseMap[ IObject->getEntry() ];
1179 for ( int i = 0; i < ilist.count(); i++ ) {
1180 QString aRef = ilist.at(i)->getReference();
1181 if ( ilist.at(i)->getReference().isEmpty() )
1189 Finds item from UseCase Browser corresponding to Object, returns 0 if fails
1191 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getUCItem( SALOMEDS::SObject_ptr SO )
1193 if ( myUseCaseMap.contains( SO->GetID() ) ) {
1194 ItemList ilist = myUseCaseMap[ SO->GetID() ];
1195 for ( int i = 0; i < ilist.count(); i++ ) {
1196 QString aRef = ilist.at(i)->getReference();
1197 if ( ilist.at(i)->getReference().isEmpty() )
1204 Finds item corresponding to interactive object, returns 0 if fails
1206 void QAD_ObjectBrowser::rename( const Handle(SALOME_InteractiveObject)& IObject, QString newName )
1208 QAD_ObjectBrowserItem* item = getItem( IObject );
1210 item->setName( newName );
1213 item = getUCItem( IObject );
1215 item->setName( newName );
1221 Creates and show specific Popup to this according to current selection (Object Browser)
1223 void QAD_ObjectBrowser::showPopupMenu(QListViewItem* theItem)
1225 QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1226 SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1227 QString ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1229 if (theItem != NULL && ( Sel->IObjectCount()>0 || ActiveComp.isEmpty() ) ) {
1233 QAD_Tools::checkPopup( myPopup );
1234 if ( myPopup->count()>0 ) {
1235 myPopup->exec( QCursor::pos() );
1243 Creates and show specific Popup to this according to current selection (UseCase Browser)
1245 void QAD_ObjectBrowser::showUseCasePopupMenu(QListViewItem* theItem)
1249 QAD_Tools::checkPopup( myPopup );
1250 if ( myPopup->count() > 0 ) {
1251 myPopup->exec( QCursor::pos() );
1258 Called when current selection was changed (Object Browser)
1260 void QAD_ObjectBrowser::onSelectedItem()
1263 if ( sender()->inherits("QListView") )
1264 whoIs = (QListView*)sender();
1267 QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1268 SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
1269 SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1270 QAD_Application* myApp = QAD_Application::getDesktop()->getActiveApp();
1272 SALOME_ListIO DeltaPos;
1274 SALOME_ListIO DeltaNeg;
1277 QListViewItemIterator it( whoIs );
1278 for ( ; it.current(); ++it ) {
1279 QAD_ObjectBrowserItem* item = (QAD_ObjectBrowserItem*)it.current();
1280 QString theEntry = item->getEntry();
1281 QString theName = item->getName();
1282 QString theRef = item->getReference();
1284 if ( !theEntry.isEmpty() ) {
1285 if ( item->isSelected() ) {
1286 bool itemAlreadySelected = false;
1288 SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
1289 for(;It.More();It.Next()) {
1290 Handle(SALOME_InteractiveObject) IO = It.Value();
1291 if ( strcmp ( IO->getEntry(), theEntry ) == 0 ) {
1292 itemAlreadySelected = true;
1297 if (!itemAlreadySelected) {
1298 Handle(SALOME_InteractiveObject) newIO;
1299 SALOMEDS::SObject_var obj = aStudy->FindObjectID( theEntry.latin1() );
1300 if ( !obj->_is_nil() ) {
1301 SALOMEDS::SComponent_var comp = obj->GetFatherComponent();
1302 if ( !comp->_is_nil() ) {
1303 Standard_CString datatype = comp->ComponentDataType();
1304 newIO = new SALOME_InteractiveObject( strdup(theEntry),
1307 newIO->setReference( strdup(theRef) );
1310 newIO = new SALOME_InteractiveObject( strdup(theEntry),
1313 newIO->setReference( strdup(theRef) );
1315 if (!newIO.IsNull()) {
1316 DeltaPos.Append( newIO );
1320 SALOME_ListIteratorOfListIO It1( Sel->StoredIObjects() );
1321 for(;It1.More();It1.Next()) {
1322 Handle(SALOME_InteractiveObject) IO = It1.Value();
1323 if ( strcmp( IO->getEntry(), item->getEntry() ) == 0 ) {
1324 DeltaNeg.Append( IO );
1332 SALOME_ListIteratorOfListIO ItNeg( DeltaNeg );
1333 for(;ItNeg.More();ItNeg.Next()) {
1334 Sel->RemoveIObject( ItNeg.Value() );
1337 SALOME_ListIteratorOfListIO ItPos( DeltaPos );
1338 for(;ItPos.More();ItPos.Next()) {
1339 Sel->AddIObject( ItPos.Value() );
1342 myApp->updateActions();
1346 Called when selection is changed (UseCase Browser)
1348 void QAD_ObjectBrowser::onUseCaseSelectedItem()
1353 Called when item is expanded
1355 void QAD_ObjectBrowser::onExpanded (QListViewItem* item)
1357 QAD_ObjectBrowserItem* aItem = (QAD_ObjectBrowserItem*)item;
1358 if (!myStudy->_is_nil() && aItem)
1360 SALOMEDS::SObject_var Object = myStudy->FindObjectID(aItem->getEntry());
1361 if (!Object->_is_nil())
1363 SALOMEDS::StudyBuilder_var StudyBuilder = myStudy->NewBuilder();
1364 SALOMEDS::AttributeOpened_var anAttr = SALOMEDS::AttributeOpened::_narrow(
1365 StudyBuilder->FindOrCreateAttribute(Object, "AttributeOpened") );
1366 anAttr->SetOpened(true);
1372 Called when item is collapsed
1374 void QAD_ObjectBrowser::onCollapsed(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(false);
1391 Find and returns value for the object
1392 Warning: object can have several values attributes, search is done in the following order:
1393 [integer], [real], [table of integer], [table of real], [comment]
1395 QString QAD_ObjectBrowser::getValueFromObject( SALOMEDS::SObject_ptr SO )
1397 if ( SO->_is_nil() )
1398 return QString::null;
1399 SALOMEDS::SComponent_var isComponent = SALOMEDS::SComponent::_narrow( SO );
1400 if ( !isComponent->_is_nil() )
1401 return QString::null; // no values to show for components
1403 SALOMEDS::GenericAttribute_var anAttr;
1404 SALOMEDS::AttributeInteger_var anInt;
1405 SALOMEDS::AttributeReal_var aReal;
1406 SALOMEDS::AttributeTableOfInteger_var aTableInt;
1407 SALOMEDS::AttributeTableOfReal_var aTableReal;
1408 SALOMEDS::AttributeComment_var aComment;
1411 if ( SO->FindAttribute( anAttr, "AttributeInteger" ) ) {
1412 anInt = SALOMEDS::AttributeInteger::_narrow( anAttr );
1413 QString val = QString::number( anInt->Value() );
1417 if ( SO->FindAttribute( anAttr, "AttributeReal" ) ) {
1418 aReal = SALOMEDS::AttributeReal::_narrow( anAttr );
1419 QString val = QString::number( aReal->Value() );
1423 if ( SO->FindAttribute( anAttr, "AttributeTableOfInteger" ) ) {
1424 aTableInt = SALOMEDS::AttributeTableOfInteger::_narrow( anAttr );
1425 QString tlt = QString( strdup( aTableInt->GetTitle() ) );
1426 if ( !tlt.isEmpty() )
1428 int nbRows = aTableInt->GetNbRows() ;
1429 int nbCols = aTableInt->GetNbColumns();
1430 QString val = tlt + QString( "[" ) + QString::number( nbRows ) + QString( "," ) + QString::number( nbCols ) + QString( "]" );
1434 if ( SO->FindAttribute( anAttr, "AttributeTableOfReal" ) ) {
1435 aTableReal = SALOMEDS::AttributeTableOfReal::_narrow( anAttr );
1436 QString tlt = QString( strdup( aTableReal->GetTitle() ) );
1437 if ( !tlt.isEmpty() )
1439 int nbRows = aTableReal->GetNbRows() ;
1440 int nbCols = aTableReal->GetNbColumns();
1441 QString val = tlt + QString( "[" ) + QString::number( nbRows ) + QString( "," ) + QString::number( nbCols ) + QString( "]" );
1445 if ( SO->FindAttribute(anAttr, "AttributeComment") ) {
1446 aComment = SALOMEDS::AttributeComment::_narrow( anAttr );
1447 QString val = QString( strdup( aComment->Value() ) );
1450 return QString::null;
1454 Shows/hides IAPP sub-tree in ObjectBrowser
1455 Current implementation just udpates browser
1457 void QAD_ObjectBrowser::setShowIAPP( bool show )
1463 Shows/hides info columns: Entry, IOR, Reference
1465 void QAD_ObjectBrowser::setShowInfoColumns( bool show )
1467 bool shown = myListView->header()->isResizeEnabled( 2 );
1468 if ( show != shown ) {
1470 myListView->header()->setResizeEnabled( true, 2 );
1471 myListView->header()->setResizeEnabled( true, 3 );
1472 myListView->header()->setResizeEnabled( true, 4 );
1473 myListView->setColumnWidthMode( 2, QListView::Maximum );
1474 myListView->setColumnWidthMode( 3, QListView::Maximum );
1475 myListView->setColumnWidthMode( 4, QListView::Maximum );
1476 if ( myListView->columnWidth( 2 ) <= 0 )
1477 myListView->header()->resizeSection( 2, 50 );
1478 if ( myListView->columnWidth( 3 ) <= 0 )
1479 myListView->header()->resizeSection( 3, 50 );
1480 if ( myListView->columnWidth( 4 ) <= 0 )
1481 myListView->header()->resizeSection( 4, 50 );
1484 myListView->setColumnWidthMode( 2, QListView::Manual );
1485 myListView->setColumnWidthMode( 3, QListView::Manual );
1486 myListView->setColumnWidthMode( 4, QListView::Manual );
1487 myListView->header()->resizeSection( 2, 0 );
1488 myListView->header()->resizeSection( 3, 0 );
1489 myListView->header()->resizeSection( 4, 0 );
1490 myListView->header()->setResizeEnabled( false, 2 );
1491 myListView->header()->setResizeEnabled( false, 3 );
1492 myListView->header()->setResizeEnabled( false, 4 );
1498 Shows/hides Value column
1500 void QAD_ObjectBrowser::setShowValueColumn( bool show )
1502 bool shown = myListView->header()->isResizeEnabled( 1 );
1503 if ( show != shown ) {
1505 myListView->header()->setResizeEnabled( true, 1 );
1506 myListView->setColumnWidthMode( 1, QListView::Maximum );
1507 if ( myListView->columnWidth( 1 ) <= 0 )
1508 myListView->header()->resizeSection( 1, 50 );
1511 myListView->setColumnWidthMode( 1, QListView::Manual );
1512 myListView->header()->resizeSection( 1, 0 );
1513 myListView->header()->setResizeEnabled( false, 1 );
1519 Sets CHRONO sorting enabled/disabled
1520 Note: when CHRONO sorting is enabled items are sorted by Entry value and column headers
1521 become unclickable to prohibit another sort type;
1522 when CHRONO sorting is disabled column headers become clickable - this allows
1523 to sort data by any column
1525 void QAD_ObjectBrowser::setEnableChronoSort( bool enable )
1528 // if CHRONO sorting is enabled set clickable header disabled ...
1529 myListView->header()->setClickEnabled( false );
1530 // ... and then sort by column 2 - OCAF doc entry
1531 myListView->setSorting( 2, TRUE ) ;
1534 // if CHRONO sorting is enabled set clickable header enabled ...
1535 myListView->header()->setClickEnabled( true );
1536 // and clear sorting by column 2
1537 myListView->setSorting( 10, TRUE );
1539 // myListView->sort( ) ;
1543 Slot, called to edit value
1545 void QAD_ObjectBrowser::onEditAttribute()
1547 QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1548 SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1549 QString ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1550 if ( myStudy->_is_nil() )
1553 if ( Sel->IObjectCount() == 1 ) {
1554 SALOMEDS::SObject_var SO = myStudy->FindObjectID( Sel->firstIObject()->getEntry() );
1555 SALOMEDS::SComponent_var isComponent = SALOMEDS::SComponent::_narrow( SO );
1556 if ( !SO->_is_nil() && isComponent->_is_nil() ) { // no values to show for components
1557 SALOMEDS::GenericAttribute_var anAttr;
1558 SALOMEDS::AttributeInteger_var anInt;
1559 SALOMEDS::AttributeReal_var aReal;
1560 SALOMEDS::AttributeTableOfInteger_var aTableInt;
1561 SALOMEDS::AttributeTableOfReal_var aTableReal;
1562 SALOMEDS::AttributeComment_var aComment;
1566 if ( SO->FindAttribute( anAttr, "AttributeInteger" ) ) {
1567 anInt = SALOMEDS::AttributeInteger::_narrow( anAttr );
1568 int val = SALOMEGUI_SetValueDlg::getInteger( tr( "SET_VALUE_INT_TLT" ),
1569 tr( "SET_VALUE_INT_LBL" ),
1572 QAD_Application::getDesktop() );
1574 anInt->SetValue( val );
1579 if ( SO->FindAttribute( anAttr, "AttributeReal" ) ) {
1580 aReal = SALOMEDS::AttributeReal::_narrow( anAttr );
1581 double val = SALOMEGUI_SetValueDlg::getDouble( tr( "SET_VALUE_REAL_TLT" ),
1582 tr( "SET_VALUE_REAL_LBL" ),
1585 QAD_Application::getDesktop() );
1587 aReal->SetValue( val );
1590 // if Table of integer
1592 if ( SO->FindAttribute( anAttr, "AttributeTableOfInteger" ) ) {
1593 SALOMEGUI_TableDlg* dlg = new SALOMEGUI_TableDlg( QAD_Application::getDesktop(),
1596 SALOMEGUI_TableDlg::ttInt );
1597 bOk = ( dlg->exec() == QDialog::Accepted );
1601 if ( SO->FindAttribute( anAttr, "AttributeTableOfReal" ) ) {
1602 SALOMEGUI_TableDlg* dlg = new SALOMEGUI_TableDlg( QAD_Application::getDesktop(),
1605 SALOMEGUI_TableDlg::ttReal );
1606 bOk = ( dlg->exec() == QDialog::Accepted );
1610 if ( SO->FindAttribute(anAttr, "AttributeComment") ) {
1611 aComment = SALOMEDS::AttributeComment::_narrow( anAttr );
1612 QString val = SALOMEGUI_SetValueDlg::getString( tr( "SET_VALUE_COMMENT_TLT" ),
1613 tr( "SET_VALUE_COMMENT_LBL" ),
1616 QAD_Application::getDesktop() );
1618 aComment->SetValue( val );
1629 Returns true if object has editable attrubute :
1630 integer, real, table or comment
1632 bool QAD_ObjectBrowser::hasEditableAttribute( const Handle(SALOME_InteractiveObject)& object )
1634 if ( !myStudy->_is_nil() ) {
1635 SALOMEDS::SObject_var obj = myStudy->FindObjectID( object->getEntry() );
1636 SALOMEDS::SComponent_var comp = myStudy->FindComponentID( object->getEntry() );
1637 if ( !comp->_is_nil() || obj->_is_nil() )
1639 QString val = getValueFromObject( obj );
1640 return ( !val.isNull() );
1646 Returns true if object has table attrubute ( integer and/or real )
1648 bool QAD_ObjectBrowser::hasTable( const Handle(SALOME_InteractiveObject)& object )
1650 SALOMEDS::GenericAttribute_var anAttr;
1651 if ( !myStudy->_is_nil() ) {
1652 SALOMEDS::SObject_var obj = myStudy->FindObjectID( object->getEntry() );
1653 SALOMEDS::SComponent_var comp = myStudy->FindComponentID( object->getEntry() );
1654 if ( !comp->_is_nil() || obj->_is_nil() )
1656 if ( obj->FindAttribute( anAttr, "AttributeTableOfInteger" ) )
1658 if ( obj->FindAttribute( anAttr, "AttributeTableOfReal" ) )
1665 Slot, called when one of the UseCase Browser menu command is called
1667 void QAD_ObjectBrowser::onUseCasePopupMenu( int action )
1669 if ( myStudy->_is_nil() )
1671 QAD_Desktop* Desktop = (QAD_Desktop*) QAD_Application::getDesktop();
1672 QAD_Study* myActiveStudy = Desktop->getActiveStudy();
1673 SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1674 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
1675 SALOMEDS::SObject_var Current = UCBuilder->GetCurrentObject();
1677 QList<QListViewItem> ucSelected;
1678 ucSelected.setAutoDelete( false );
1679 getSelectedParents( myUseCaseView, ucSelected );
1681 if ( action == UC_NEW_EMPTY_ID ) {
1682 if ( ucSelected.count() == 1 ) {
1683 if ( isRootItem( ucSelected.at(0) ) )
1684 UCBuilder->SetRootCurrent();
1686 UCBuilder->SetCurrentObject( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) );
1687 UCBuilder->AddUseCase( tr( "NEW_OBJECT" ) );
1688 myActiveStudy->updateUseCaseBrowser();
1692 if ( action == UC_SET_CURRENT_ID ) {
1693 if ( ucSelected.count() > 0 ) {
1694 if ( isRootItem( ucSelected.at(0) ) )
1695 UCBuilder->SetRootCurrent();
1697 UCBuilder->SetCurrentObject( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) );
1699 myActiveStudy->updateUseCaseBrowser( );
1702 if ( action == UC_RENAME_ID ) {
1703 if ( ucSelected.count() == 1 ) {
1704 QAD_ObjectBrowserItem* useCaseItem = ( QAD_ObjectBrowserItem* )( ucSelected.at( 0 ) );
1705 if ( isRootItem( useCaseItem ) ) {
1706 QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), strdup( UCBuilder->GetName() ) );
1707 if ( !name.isEmpty() ) {
1708 bool ok = UCBuilder->SetName( strdup( name.latin1() ) );
1709 myActiveStudy->updateUseCaseBrowser( );
1712 else/* if ( UCBuilder->IsUseCase( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) ) )*/ {
1713 QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), strdup( useCaseItem->getName() ) );
1714 if ( !name.isEmpty() ) {
1715 myActiveStudy->renameIObject( Sel->firstIObject(), name );
1721 if ( action == UC_APPEND_ID ) {
1722 if ( Sel->IObjectCount() > 0 ) {
1723 SALOME_ListIO SelIO; SelIO = Sel->StoredIObjects();
1724 SALOME_ListIteratorOfListIO SelIt( SelIO );
1725 for( ; SelIt.More(); SelIt.Next() ) {
1726 SALOMEDS::SObject_var selSO = myStudy->FindObjectID( SelIt.Value()->getEntry() );
1727 if ( !selSO->_is_nil() && strcmp( SelIt.Value()->getEntry(), ( "0:2" ) ) != 0 ) {
1728 UCBuilder->Remove( selSO ); // first remove object for sure ...
1729 UCBuilder->Append( selSO ); // ... and now re-append it
1732 myActiveStudy->updateUseCaseBrowser( true );
1736 if ( action == UC_REMOVE_ID ) {
1738 getSelectedParents( myUseCaseView, ucSelected, true );
1739 for ( int i = 0; i < ucSelected.count(); i++ ) {
1740 QAD_ObjectBrowserItem* item = ( QAD_ObjectBrowserItem* )ucSelected.at( i );
1741 if ( !isRootItem( item ) ) {
1743 SALOMEDS::SObject_var SO = myStudy->FindObjectID( item->getEntry() );
1744 if ( !SO->_is_nil() ) {
1745 UCBuilder->Remove( SO );
1751 Sel->ClearIObjects();
1752 myActiveStudy->updateUseCaseBrowser( true );
1755 if ( action == UC_CLEAR_ID ) {
1756 if ( myUseCaseView->childCount() > 0 && myUseCaseView->firstChild()->childCount() > 0) {
1757 QAD_ObjectBrowserItem* child = ( QAD_ObjectBrowserItem* )myUseCaseView->firstChild()->firstChild();
1759 UCBuilder->Remove( myStudy->FindObjectID( child->getEntry().latin1() ) );
1760 child = ( QAD_ObjectBrowserItem* )( child->nextSibling() );
1762 Sel->ClearIObjects();
1763 myActiveStudy->updateUseCaseBrowser();
1768 Use Case browser buttons slot
1770 void QAD_ObjectBrowser::onUseCaseBtn()
1772 if ( sender() == myNewBtn ) {
1773 QAD_Desktop* Desktop = (QAD_Desktop*) QAD_Application::getDesktop();
1774 QAD_Study* myActiveStudy = Desktop->getActiveStudy();
1775 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
1776 UCBuilder->AddUseCase( tr( "NEW_OBJECT" ) );
1777 myActiveStudy->updateUseCaseBrowser();
1779 if ( sender() == myAddBtn )
1780 onUseCasePopupMenu( UC_APPEND_ID );
1781 if ( sender() == myDelBtn )
1782 onUseCasePopupMenu( UC_REMOVE_ID );
1783 if ( sender() == myClearBtn )
1784 onUseCasePopupMenu( UC_CLEAR_ID );
1785 if ( sender() == myCurrentBtn )
1786 onUseCasePopupMenu( UC_SET_CURRENT_ID );