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( QAD_Application::getDesktop()->getComponentName(QString(aFatherName->Value())), msg )) {
692 QPixmap icon ( resMgr->loadPixmap( QAD_Application::getDesktop()->getComponentName(QString(aFatherName->Value())),
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()
715 int x = myListView->contentsX();
716 int y = myListView->contentsY();
719 myListViewMap.clear();
721 if ( myStudy->_is_nil() ) {
725 QString ShowIAPP = QAD_CONFIG->getSetting("ObjectBrowser:IAPP");
727 /* Updating Object Browser ============================================== */
728 SALOMEDS::SComponentIterator_var itcomp = myStudy->NewComponentIterator();
729 for (; itcomp->More(); itcomp->Next()) {
730 QAD_ObjectBrowserItem* Item = 0;
731 SALOMEDS::SComponent_var SC = itcomp->Value();
732 QString dataType = strdup( SC->ComponentDataType() );
734 QString SCEntry = strdup( SC->GetID() );
736 SALOMEDS::GenericAttribute_var anAttr;
737 SALOMEDS::AttributeName_var aName;
738 SALOMEDS::AttributeComment_var aCmnt;
739 SALOMEDS::AttributeIOR_var anIOR;
740 SALOMEDS::AttributeReal_var aReal;
741 SALOMEDS::AttributeInteger_var anInt;
742 SALOMEDS::AttributeSelectable_var aSelectable;
743 SALOMEDS::AttributeExpandable_var anExpandable;
744 SALOMEDS::AttributeOpened_var anOpened;
745 SALOMEDS::AttributePixMap_var aPixmap;
746 SALOMEDS::AttributeTextColor_var aTextColor;
747 SALOMEDS::AttributeTextHighlightColor_var aTextHighlightColor;
749 if (SC->FindAttribute(anAttr, "AttributeIOR")) {
750 anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
751 ior = strdup( anIOR->Value() );
754 bool caseIAPP = false;
756 // create data-tree item, corresponding to component (and set name if component has it)
757 if ( dataType.compare("Interface Applicative") == 0 ) {
759 if ( ShowIAPP.compare("true") == 0 ) {
760 if (SC->FindAttribute(anAttr, "AttributeName")) {
761 aName = SALOMEDS::AttributeName::_narrow(anAttr);
762 Item = AddItem (myListView, strdup( aName->Value() ), strdup( SCEntry ), ior, 1, "");
763 myListViewMap[ SCEntry ].append( Item );
766 Item = AddItem (myListView, dataType, SCEntry, ior, 1, "");
767 myListViewMap[ SCEntry ].append( Item );
774 if (SC->FindAttribute(anAttr, "AttributeName")) {
775 aName = SALOMEDS::AttributeName::_narrow(anAttr);
776 Item = AddItem (myListView, strdup( aName->Value() ), SCEntry, ior, 1, "");
777 myListViewMap[ SCEntry ].append( Item );
780 /*In according to CAF - any label (even if it is empty) exist during to whole session.
781 So, if label haven't an "AttributeName" it is means that the label is empty.
782 Therefore follow action couses bug -
783 Item = AddItem (myListView, dataType, SC->GetID(), ior, 1, "");
787 // add other attributes
789 QAD_ObjectBrowserItem* subItem;
791 if ( SC->FindAttribute(anAttr, "AttributeSelectable") ) {
792 aSelectable = SALOMEDS::AttributeSelectable::_narrow(anAttr);
793 Item->setSelectable(aSelectable->IsSelectable());
796 if ( SC->FindAttribute(anAttr, "AttributeExpandable") ) {
797 anExpandable = SALOMEDS::AttributeExpandable::_narrow(anAttr);
798 Item->setExpandable(anExpandable->IsExpandable());
801 if ( SC->FindAttribute(anAttr, "AttributeOpened") ) {
802 anOpened = SALOMEDS::AttributeOpened::_narrow(anAttr);
803 Item->setOpen(anOpened->IsOpened());
806 if ( SC->FindAttribute(anAttr, "AttributeTextColor") ) {
807 aTextColor = SALOMEDS::AttributeTextColor::_narrow(anAttr);
808 QColor aColor((int)(aTextColor->TextColor().R), (int)(aTextColor->TextColor().G), (int)(aTextColor->TextColor().B)) ;
809 Item->setTextColor(aColor);
811 // TextHighlightColor
812 if ( SC->FindAttribute(anAttr, "AttributeTextHighlightColor") ) {
813 aTextHighlightColor = SALOMEDS::AttributeTextHighlightColor::_narrow(anAttr);
814 QColor aColor((int)(aTextHighlightColor->TextHighlightColor().R),
815 (int)(aTextHighlightColor->TextHighlightColor().G),
816 (int)(aTextHighlightColor->TextHighlightColor().B)) ;
817 Item->setTextHighlightColor(aColor);
821 if ( SC->FindAttribute(anAttr, "AttributePixMap") ) {
822 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
823 if ( aPixmap->HasPixMap() ) {
825 QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
827 MESSAGE ( " Component " << aName->Value() )
828 MESSAGE ( " Icon " << aPixmap->GetPixMap() )
829 if(resMgr->loadResources( QAD_Application::getDesktop()->getComponentName(QString(aName->Value())), msg )) {
830 QPixmap icon ( resMgr->loadPixmap( QAD_Application::getDesktop()->getComponentName(QString(aName->Value())),
831 tr(aPixmap->GetPixMap()) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ));
832 Item->setPixmap( 0, icon );
838 if ( strcmp(dataType, TypeComponent) == 0 )
841 if ( caseIAPP && ShowIAPP.compare("true") == 0 )
848 /* Updating UseCase Browser ============================================= */
849 UpdateUseCaseBrowser();
851 myListView->setContentsPos(x,y);
855 Removes item with all childs from the map - used to optimize UseCase browser update
857 void removeFromMap( ItemMap& theMap, QAD_ObjectBrowserItem* item )
860 QAD_ObjectBrowserItem* subItem = ( QAD_ObjectBrowserItem* )( item->firstChild() );
862 removeFromMap( theMap, subItem );
863 subItem = ( QAD_ObjectBrowserItem* )( subItem->nextSibling() );
865 if ( theMap.contains( item->getEntry() ) ) {
866 theMap[ item->getEntry() ].removeRef( item );
867 if ( theMap[ item->getEntry() ].isEmpty() ) {
868 theMap.remove( item->getEntry() );
875 Updates only UseCase Browser
877 void QAD_ObjectBrowser::UpdateUseCaseBrowser() {
878 // myUseCaseView->clear(); myUseCaseMap.clear();
879 if ( myStudy->_is_nil() ) {
882 myUseCaseView->blockSignals( true );
883 // myUseCaseView->setUpdatesEnabled( false );
885 QAD_ObjectBrowserItem* root = ( QAD_ObjectBrowserItem* )myUseCaseView->firstChild();
886 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
887 SALOMEDS::SObject_var SOCurrent = UCBuilder->GetCurrentObject();
888 QString UCName = QString( strdup( UCBuilder->GetName() ) );
889 if ( UCName.isEmpty() )
890 UCName = QString( tr( "Root" ) );
891 // creating root item if is not yet created
893 root = AddItem( myUseCaseView, UCName, "0:2", "", 1, "" );
894 myUseCaseMap[ "0:2" ].append( root );
897 root->setName( UCName );
898 // setting it current if necessary
899 root->setCurrent( SOCurrent->_is_nil() || !strcmp( SOCurrent->GetID(), "0:2" ) );
900 // updating list view...
901 QMap<QString,SALOMEDS::SObject_var> ucList;
902 SALOMEDS::UseCaseIterator_var UCIter = UCBuilder->GetUseCaseIterator( SALOMEDS::SObject::_nil() );
903 if ( !UCIter->_is_nil() ) {
904 for ( ; UCIter->More(); UCIter->Next() ) {
905 SALOMEDS::SObject_var UCObject = UCIter->Value();
906 QString UCEntry = strdup( UCObject->GetID() );
907 ucList[ UCEntry ] = UCObject;
910 // ... 1) delete removed items
911 QAD_ObjectBrowserItem* childItem = ( QAD_ObjectBrowserItem* )root->firstChild();
912 while ( childItem ) {
913 QAD_ObjectBrowserItem* prevItem = childItem;
914 childItem = ( QAD_ObjectBrowserItem* )childItem->nextSibling();
915 if ( !ucList.contains( prevItem->getEntry() ) ) {
916 // myUseCaseMap[ prevItem->getEntry() ].removeRef( prevItem );
917 // if ( myUseCaseMap[ prevItem->getEntry() ].isEmpty() )
918 // myUseCaseMap.remove( prevItem->getEntry() );
919 removeFromMap( myUseCaseMap, prevItem );
923 // ... 2) create/update existing
924 QMap<QString,SALOMEDS::SObject_var>::Iterator it;
925 for ( it = ucList.begin(); it != ucList.end(); ++it ) {
926 UpdateUCItem( it.data(), root );
928 myUseCaseView->blockSignals( false );
929 // myUseCaseView->setUpdatesEnabled( true );
930 // myUseCaseView->update();
931 // UCItem->setOpen( true );
935 Updates UseCase Browser's item
937 void QAD_ObjectBrowser::UpdateUCItem( SALOMEDS::SObject_var UCObject, QAD_ObjectBrowserItem* UCItem )
939 if ( myStudy->_is_nil() || !UCItem )
942 /* Creating SObjects item */
943 SALOMEDS::SObject_var RefSO;
944 SALOMEDS::GenericAttribute_var anAttr;
945 SALOMEDS::AttributeName_var aName;
946 SALOMEDS::AttributeIOR_var anIOR;
947 SALOMEDS::AttributeSelectable_var aSelectable;
948 SALOMEDS::AttributeExpandable_var anExpandable;
949 SALOMEDS::AttributePixMap_var aPixmap;
950 SALOMEDS::AttributeTextColor_var aTextColor;
951 SALOMEDS::AttributeTextHighlightColor_var aTextHighlightColor;
954 QString UCEntry = strdup( UCObject->GetID() );
956 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
957 SALOMEDS::SObject_var SOCurrent = UCBuilder->GetCurrentObject();
960 QAD_ObjectBrowserItem* UCSubItem = 0;
961 if ( myUseCaseMap.contains( UCEntry ) && myUseCaseMap[ UCEntry ].count() > 0 )
962 UCSubItem = myUseCaseMap[ UCEntry ].first();
965 if ( UCObject->ReferencedObject( RefSO ) && !RefSO->_is_nil() ) {
966 QString RefSOEntry = strdup( RefSO->GetID() );
967 if ( UCObject->FindAttribute( anAttr, "AttributeName" ) || RefSO->FindAttribute( anAttr, "AttributeName" ) ) {
968 aName = SALOMEDS::AttributeName::_narrow( anAttr );
969 if ( RefSO->FindAttribute( anAttr, "AttributeIOR" ) ) {
970 anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr );
971 ior = strdup( anIOR->Value() );
973 valueString = getValueFromObject( RefSO );
975 UCSubItem = AddItem( UCItem,
976 QString( " * " ) + strdup( aName->Value() ),
982 myUseCaseMap[ RefSOEntry ].append( UCSubItem );
985 UCSubItem->setName( QString( " * " ) + strdup( aName->Value() ) );
986 UCSubItem->setEntry( RefSOEntry );
987 UCSubItem->setIOR( ior );
988 UCSubItem->setReference( UCEntry );
989 UCSubItem->setValue( valueString );
991 UCSubItem->setCurrent( !SOCurrent->_is_nil() && QString( SOCurrent->GetID() ) == QString( UCEntry ) );
996 valueString = getValueFromObject( UCObject );
998 if ( UCObject->FindAttribute( anAttr, "AttributeIOR" ) ) {
999 anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr );
1000 ior = strdup( anIOR->Value() );
1002 // getting Name and adding new Item
1003 if ( UCObject->FindAttribute( anAttr, "AttributeName" ) ) {
1004 aName = SALOMEDS::AttributeName::_narrow( anAttr );
1006 UCSubItem = AddItem( UCItem, strdup( aName->Value() ), UCEntry, ior, 0, "", valueString );
1007 myUseCaseMap[ UCEntry ].append( UCSubItem );
1010 UCSubItem->setName( strdup( aName->Value() ) );
1011 UCSubItem->setEntry( UCEntry );
1012 UCSubItem->setIOR( ior );
1013 UCSubItem->setReference( "" );
1014 UCSubItem->setValue( valueString );
1017 // adding other attributes
1019 UCSubItem->setCurrent( !SOCurrent->_is_nil() && QString( SOCurrent->GetID() ) == QString( UCEntry ) );
1021 // if ( UCObject->FindAttribute( anAttr, "AttributeSelectable" ) ) {
1022 // aSelectable = SALOMEDS::AttributeSelectable::_narrow( anAttr );
1023 // UCSubItem->setSelectable( aSelectable->IsSelectable() );
1026 // if ( UCObject->FindAttribute( anAttr, "AttributeExpandable" ) ) {
1027 // anExpandable = SALOMEDS::AttributeExpandable::_narrow( anAttr );
1028 // UCSubItem->setExpandable( anExpandable->IsExpandable() );
1031 if ( UCObject->FindAttribute(anAttr, "AttributeTextColor" ) ) {
1032 aTextColor = SALOMEDS::AttributeTextColor::_narrow( anAttr );
1033 QColor aColor( (int)(aTextColor->TextColor().R),
1034 (int)(aTextColor->TextColor().G),
1035 (int)(aTextColor->TextColor().B) );
1036 UCSubItem->setTextColor( aColor );
1038 // TextHighlightColor
1039 if ( UCObject->FindAttribute( anAttr, "AttributeTextHighlightColor" ) ) {
1040 aTextHighlightColor = SALOMEDS::AttributeTextHighlightColor::_narrow( anAttr );
1041 QColor aColor( (int)(aTextHighlightColor->TextHighlightColor().R),
1042 (int)(aTextHighlightColor->TextHighlightColor().G),
1043 (int)(aTextHighlightColor->TextHighlightColor().B) );
1044 UCSubItem->setTextHighlightColor( aColor );
1047 if ( UCObject->FindAttribute( anAttr, "AttributePixMap" ) ) {
1048 aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
1049 if ( aPixmap->HasPixMap() ) {
1050 SALOMEDS::SComponent_var father = UCObject->GetFatherComponent();
1051 if ( father->FindAttribute( anAttr, "AttributeName" ) ) {
1052 SALOMEDS::AttributeName_var aFatherName;
1053 aFatherName = SALOMEDS::AttributeName::_narrow( anAttr );
1054 QAD_ResourceMgr* resMgr = QAD_Desktop::getResourceManager();
1057 if( resMgr->loadResources( QAD_Application::getDesktop()->getComponentName(QString( aFatherName->Value() )), msg ) ) {
1058 QPixmap icon ( resMgr->loadPixmap( QAD_Application::getDesktop()->getComponentName(QString( aFatherName->Value() )),
1059 tr( aPixmap->GetPixMap() ) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ) );
1060 UCSubItem->setPixmap( 0, icon );
1069 // updating children ...
1070 QMap<QString,SALOMEDS::SObject_var> ucList;
1071 SALOMEDS::UseCaseIterator_var UCIter = UCBuilder->GetUseCaseIterator( UCObject );
1072 if ( !UCIter->_is_nil() ) {
1073 for ( ; UCIter->More(); UCIter->Next() ) {
1074 SALOMEDS::SObject_var UCSubObject = UCIter->Value();
1075 QString UCSubEntry = strdup( UCSubObject->GetID() );
1076 ucList[ UCSubEntry ] = UCSubObject;
1079 // ... 1) delete removed items
1080 QAD_ObjectBrowserItem* childItem = ( QAD_ObjectBrowserItem* )UCSubItem->firstChild();
1081 while ( childItem ) {
1082 QAD_ObjectBrowserItem* prevItem = childItem;
1083 childItem = ( QAD_ObjectBrowserItem* )childItem->nextSibling();
1084 if ( !ucList.contains( prevItem->getEntry() ) ) {
1085 // myUseCaseMap[ prevItem->getEntry() ].removeRef( prevItem );
1086 // if ( myUseCaseMap[ prevItem->getEntry() ].isEmpty() )
1087 // myUseCaseMap.remove( prevItem->getEntry() );
1088 removeFromMap( myUseCaseMap, prevItem );
1092 // ... 2) create/update existing
1093 QMap<QString,SALOMEDS::SObject_var>::Iterator it;
1094 for ( it = ucList.begin(); it != ucList.end(); ++it ) {
1095 UpdateUCItem( it.data(), UCSubItem );
1101 Unhighlights all items
1103 void QAD_ObjectBrowser::unHighlightAll()
1105 myListView->clearSelection();
1106 myUseCaseView->clearSelection();
1110 Highlights items which refer to object
1112 void QAD_ObjectBrowser::highlight( const Handle(SALOME_InteractiveObject)& IObject, bool highlight )
1114 QList<QAD_ObjectBrowserItem> List;
1115 if (getItems(IObject, List)) {
1116 for (int i = 0; i < List.count(); i++) {
1117 List.at(i)->setSelected( highlight );
1118 List.at(i)->repaint();
1124 Gets items from Object Browser which refer to object
1126 bool QAD_ObjectBrowser::getItems( const Handle(SALOME_InteractiveObject)& IObject,
1127 QList<QAD_ObjectBrowserItem>& List)
1130 if ( myListViewMap.contains( IObject->getEntry() ) ) {
1131 ItemList ilist = myListViewMap[ IObject->getEntry() ];
1132 for ( int i = 0; i < ilist.count(); i++ )
1133 List.append( ilist.at(i) );
1135 if ( myUseCaseMap.contains( IObject->getEntry() ) ) {
1136 ItemList ilist = myUseCaseMap[ IObject->getEntry() ];
1137 for ( int i = 0; i < ilist.count(); i++ )
1138 List.append( ilist.at(i) );
1140 return (List.count() > 0);
1144 Gets items from Object Browser which refer to object
1146 bool QAD_ObjectBrowser::getItems( SALOMEDS::SObject_ptr SO,
1147 QList<QAD_ObjectBrowserItem>& List)
1150 if ( myListViewMap.contains( SO->GetID() ) ) {
1151 ItemList ilist = myListViewMap[ SO->GetID() ];
1152 for ( int i = 0; i < ilist.count(); i++ )
1153 List.append( ilist.at(i) );
1155 if ( myUseCaseMap.contains( SO->GetID() ) ) {
1156 ItemList ilist = myUseCaseMap[ SO->GetID() ];
1157 for ( int i = 0; i < ilist.count(); i++ )
1158 List.append( ilist.at(i) );
1160 return (List.count() > 0);
1164 Gets first item from Object Browser which refers to object (not reference)
1166 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getItem( const Handle(SALOME_InteractiveObject)& IObject )
1168 if ( myListViewMap.contains( IObject->getEntry() ) ) {
1169 ItemList ilist = myListViewMap[ IObject->getEntry() ];
1170 for ( int i = 0; i < ilist.count(); i++ ) {
1171 QString aRef = ilist.at(i)->getReference();
1172 if ( ilist.at(i)->getReference().isEmpty() )
1180 Finds item from Object Browser corresponding to Object, returns 0 if fails
1182 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getItem( SALOMEDS::SObject_ptr SO )
1184 if ( myListViewMap.contains( SO->GetID() ) ) {
1185 ItemList ilist = myListViewMap[ SO->GetID() ];
1186 for ( int i = 0; i < ilist.count(); i++ ) {
1187 QString aRef = ilist.at(i)->getReference();
1188 if ( ilist.at(i)->getReference().isEmpty() )
1197 Gets first item from UseCase Browser which refers to object (not reference)
1199 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getUCItem( const Handle(SALOME_InteractiveObject)& IObject )
1201 if ( myUseCaseMap.contains( IObject->getEntry() ) ) {
1202 ItemList ilist = myUseCaseMap[ IObject->getEntry() ];
1203 for ( int i = 0; i < ilist.count(); i++ ) {
1204 QString aRef = ilist.at(i)->getReference();
1205 if ( ilist.at(i)->getReference().isEmpty() )
1213 Finds item from UseCase Browser corresponding to Object, returns 0 if fails
1215 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getUCItem( SALOMEDS::SObject_ptr SO )
1217 if ( myUseCaseMap.contains( SO->GetID() ) ) {
1218 ItemList ilist = myUseCaseMap[ SO->GetID() ];
1219 for ( int i = 0; i < ilist.count(); i++ ) {
1220 QString aRef = ilist.at(i)->getReference();
1221 if ( ilist.at(i)->getReference().isEmpty() )
1228 Finds item corresponding to interactive object, returns 0 if fails
1230 void QAD_ObjectBrowser::rename( const Handle(SALOME_InteractiveObject)& IObject, QString newName )
1232 QAD_ObjectBrowserItem* item = getItem( IObject );
1234 item->setName( newName );
1237 item = getUCItem( IObject );
1239 item->setName( newName );
1245 Creates and show specific Popup to this according to current selection (Object Browser)
1247 void QAD_ObjectBrowser::showPopupMenu(QListViewItem* theItem)
1249 QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1250 SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1251 QString ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1253 if (theItem != NULL && ( Sel->IObjectCount()>0 || ActiveComp.isEmpty() ) ) {
1257 QAD_Tools::checkPopup( myPopup );
1258 if ( myPopup->count()>0 ) {
1259 myPopup->exec( QCursor::pos() );
1267 Creates and show specific Popup to this according to current selection (UseCase Browser)
1269 void QAD_ObjectBrowser::showUseCasePopupMenu(QListViewItem* theItem)
1273 QAD_Tools::checkPopup( myPopup );
1274 if ( myPopup->count() > 0 ) {
1275 myPopup->exec( QCursor::pos() );
1282 Called when current selection was changed (Object Browser)
1284 void QAD_ObjectBrowser::onSelectedItem()
1287 if ( sender()->inherits("QListView") )
1288 whoIs = (QListView*)sender();
1291 QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1292 SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
1293 SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1294 QAD_Application* myApp = QAD_Application::getDesktop()->getActiveApp();
1296 SALOME_ListIO DeltaPos;
1298 SALOME_ListIO DeltaNeg;
1301 QListViewItemIterator it( whoIs );
1302 for ( ; it.current(); ++it ) {
1303 QAD_ObjectBrowserItem* item = (QAD_ObjectBrowserItem*)it.current();
1304 QString theEntry = item->getEntry();
1305 QString theName = item->getName();
1306 QString theRef = item->getReference();
1308 if ( !theEntry.isEmpty() ) {
1309 if ( item->isSelected() ) {
1310 bool itemAlreadySelected = false;
1312 SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
1313 for(;It.More();It.Next()) {
1314 Handle(SALOME_InteractiveObject) IO = It.Value();
1315 if ( strcmp ( IO->getEntry(), theEntry ) == 0 ) {
1316 itemAlreadySelected = true;
1321 if (!itemAlreadySelected) {
1322 Handle(SALOME_InteractiveObject) newIO;
1323 SALOMEDS::SObject_var obj = aStudy->FindObjectID( theEntry.latin1() );
1324 if ( !obj->_is_nil() ) {
1325 SALOMEDS::SComponent_var comp = obj->GetFatherComponent();
1326 if ( !comp->_is_nil() ) {
1327 Standard_CString datatype = comp->ComponentDataType();
1328 newIO = new SALOME_InteractiveObject( strdup(theEntry),
1331 newIO->setReference( strdup(theRef) );
1334 newIO = new SALOME_InteractiveObject( strdup(theEntry),
1337 newIO->setReference( strdup(theRef) );
1339 if (!newIO.IsNull()) {
1340 DeltaPos.Append( newIO );
1344 SALOME_ListIteratorOfListIO It1( Sel->StoredIObjects() );
1345 for(;It1.More();It1.Next()) {
1346 Handle(SALOME_InteractiveObject) IO = It1.Value();
1347 if ( strcmp( IO->getEntry(), item->getEntry() ) == 0 ) {
1348 DeltaNeg.Append( IO );
1356 SALOME_ListIteratorOfListIO ItNeg( DeltaNeg );
1357 for(;ItNeg.More();ItNeg.Next()) {
1358 Sel->RemoveIObject( ItNeg.Value() );
1361 SALOME_ListIteratorOfListIO ItPos( DeltaPos );
1362 for(;ItPos.More();ItPos.Next()) {
1363 Sel->AddIObject( ItPos.Value() );
1366 myApp->updateActions();
1370 Called when selection is changed (UseCase Browser)
1372 void QAD_ObjectBrowser::onUseCaseSelectedItem()
1377 Called when item is expanded
1379 void QAD_ObjectBrowser::onExpanded (QListViewItem* item)
1381 QAD_ObjectBrowserItem* aItem = (QAD_ObjectBrowserItem*)item;
1382 if (!myStudy->_is_nil() && aItem)
1384 SALOMEDS::SObject_var Object = myStudy->FindObjectID(aItem->getEntry());
1385 if (!Object->_is_nil())
1387 SALOMEDS::StudyBuilder_var StudyBuilder = myStudy->NewBuilder();
1388 SALOMEDS::AttributeOpened_var anAttr = SALOMEDS::AttributeOpened::_narrow(
1389 StudyBuilder->FindOrCreateAttribute(Object, "AttributeOpened") );
1390 anAttr->SetOpened(true);
1396 Called when item is collapsed
1398 void QAD_ObjectBrowser::onCollapsed(QListViewItem* item)
1400 QAD_ObjectBrowserItem* aItem = (QAD_ObjectBrowserItem*)item;
1401 if (!myStudy->_is_nil() && aItem)
1403 SALOMEDS::SObject_var Object = myStudy->FindObjectID(aItem->getEntry());
1404 if (!Object->_is_nil())
1406 SALOMEDS::StudyBuilder_var StudyBuilder = myStudy->NewBuilder();
1407 SALOMEDS::AttributeOpened_var anAttr = SALOMEDS::AttributeOpened::_narrow(
1408 StudyBuilder->FindOrCreateAttribute(Object, "AttributeOpened") );
1409 anAttr->SetOpened(false);
1415 Find and returns value for the object
1416 Warning: object can have several values attributes, search is done in the following order:
1417 [integer], [real], [table of integer], [table of real], [comment]
1419 QString QAD_ObjectBrowser::getValueFromObject( SALOMEDS::SObject_ptr SO )
1421 if ( SO->_is_nil() )
1422 return QString::null;
1423 SALOMEDS::SComponent_var isComponent = SALOMEDS::SComponent::_narrow( SO );
1424 if ( !isComponent->_is_nil() )
1425 return QString::null; // no values to show for components
1427 SALOMEDS::GenericAttribute_var anAttr;
1428 SALOMEDS::AttributeInteger_var anInt;
1429 SALOMEDS::AttributeReal_var aReal;
1430 SALOMEDS::AttributeTableOfInteger_var aTableInt;
1431 SALOMEDS::AttributeTableOfReal_var aTableReal;
1432 SALOMEDS::AttributeComment_var aComment;
1435 if ( SO->FindAttribute( anAttr, "AttributeInteger" ) ) {
1436 anInt = SALOMEDS::AttributeInteger::_narrow( anAttr );
1437 QString val = QString::number( anInt->Value() );
1441 if ( SO->FindAttribute( anAttr, "AttributeReal" ) ) {
1442 aReal = SALOMEDS::AttributeReal::_narrow( anAttr );
1443 QString val = QString::number( aReal->Value() );
1447 if ( SO->FindAttribute( anAttr, "AttributeTableOfInteger" ) ) {
1448 aTableInt = SALOMEDS::AttributeTableOfInteger::_narrow( anAttr );
1449 QString tlt = QString( strdup( aTableInt->GetTitle() ) );
1450 if ( !tlt.isEmpty() )
1452 int nbRows = aTableInt->GetNbRows() ;
1453 int nbCols = aTableInt->GetNbColumns();
1454 QString val = tlt + QString( "[" ) + QString::number( nbRows ) + QString( "," ) + QString::number( nbCols ) + QString( "]" );
1458 if ( SO->FindAttribute( anAttr, "AttributeTableOfReal" ) ) {
1459 aTableReal = SALOMEDS::AttributeTableOfReal::_narrow( anAttr );
1460 QString tlt = QString( strdup( aTableReal->GetTitle() ) );
1461 if ( !tlt.isEmpty() )
1463 int nbRows = aTableReal->GetNbRows() ;
1464 int nbCols = aTableReal->GetNbColumns();
1465 QString val = tlt + QString( "[" ) + QString::number( nbRows ) + QString( "," ) + QString::number( nbCols ) + QString( "]" );
1469 if ( SO->FindAttribute(anAttr, "AttributeComment") ) {
1470 aComment = SALOMEDS::AttributeComment::_narrow( anAttr );
1471 QString val = QString( strdup( aComment->Value() ) );
1474 return QString::null;
1478 Shows/hides IAPP sub-tree in ObjectBrowser
1479 Current implementation just udpates browser
1481 void QAD_ObjectBrowser::setShowIAPP( bool show )
1487 Shows/hides info columns: Entry, IOR, Reference
1489 void QAD_ObjectBrowser::setShowInfoColumns( bool show )
1491 bool shown = myListView->header()->isResizeEnabled( 2 );
1492 if ( show != shown ) {
1494 myListView->header()->setResizeEnabled( true, 2 );
1495 myListView->header()->setResizeEnabled( true, 3 );
1496 myListView->header()->setResizeEnabled( true, 4 );
1497 myListView->setColumnWidthMode( 2, QListView::Maximum );
1498 myListView->setColumnWidthMode( 3, QListView::Maximum );
1499 myListView->setColumnWidthMode( 4, QListView::Maximum );
1500 if ( myListView->columnWidth( 2 ) <= 0 )
1501 myListView->header()->resizeSection( 2, 50 );
1502 if ( myListView->columnWidth( 3 ) <= 0 )
1503 myListView->header()->resizeSection( 3, 50 );
1504 if ( myListView->columnWidth( 4 ) <= 0 )
1505 myListView->header()->resizeSection( 4, 50 );
1508 myListView->setColumnWidthMode( 2, QListView::Manual );
1509 myListView->setColumnWidthMode( 3, QListView::Manual );
1510 myListView->setColumnWidthMode( 4, QListView::Manual );
1511 myListView->header()->resizeSection( 2, 0 );
1512 myListView->header()->resizeSection( 3, 0 );
1513 myListView->header()->resizeSection( 4, 0 );
1514 myListView->header()->setResizeEnabled( false, 2 );
1515 myListView->header()->setResizeEnabled( false, 3 );
1516 myListView->header()->setResizeEnabled( false, 4 );
1522 Shows/hides Value column
1524 void QAD_ObjectBrowser::setShowValueColumn( bool show )
1526 bool shown = myListView->header()->isResizeEnabled( 1 );
1527 if ( show != shown ) {
1529 myListView->header()->setResizeEnabled( true, 1 );
1530 myListView->setColumnWidthMode( 1, QListView::Maximum );
1531 if ( myListView->columnWidth( 1 ) <= 0 )
1532 myListView->header()->resizeSection( 1, 50 );
1535 myListView->setColumnWidthMode( 1, QListView::Manual );
1536 myListView->header()->resizeSection( 1, 0 );
1537 myListView->header()->setResizeEnabled( false, 1 );
1543 Sets CHRONO sorting enabled/disabled
1544 Note: when CHRONO sorting is enabled items are sorted by Entry value and column headers
1545 become unclickable to prohibit another sort type;
1546 when CHRONO sorting is disabled column headers become clickable - this allows
1547 to sort data by any column
1549 void QAD_ObjectBrowser::setEnableChronoSort( bool enable )
1552 // if CHRONO sorting is enabled set clickable header disabled ...
1553 myListView->header()->setClickEnabled( false );
1554 // ... and then sort by column 2 - OCAF doc entry
1555 myListView->setSorting( 2, TRUE ) ;
1558 // if CHRONO sorting is enabled set clickable header enabled ...
1559 myListView->header()->setClickEnabled( true );
1560 // and clear sorting by column 2
1561 myListView->setSorting( 10, TRUE );
1563 // myListView->sort( ) ;
1567 Slot, called to edit value
1569 void QAD_ObjectBrowser::onEditAttribute()
1571 QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1572 SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1573 QString ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1574 if ( myStudy->_is_nil() )
1577 if ( Sel->IObjectCount() == 1 ) {
1578 SALOMEDS::SObject_var SO = myStudy->FindObjectID( Sel->firstIObject()->getEntry() );
1579 SALOMEDS::SComponent_var isComponent = SALOMEDS::SComponent::_narrow( SO );
1580 if ( !SO->_is_nil() && isComponent->_is_nil() ) { // no values to show for components
1581 SALOMEDS::GenericAttribute_var anAttr;
1582 SALOMEDS::AttributeInteger_var anInt;
1583 SALOMEDS::AttributeReal_var aReal;
1584 SALOMEDS::AttributeTableOfInteger_var aTableInt;
1585 SALOMEDS::AttributeTableOfReal_var aTableReal;
1586 SALOMEDS::AttributeComment_var aComment;
1590 if ( SO->FindAttribute( anAttr, "AttributeInteger" ) ) {
1591 anInt = SALOMEDS::AttributeInteger::_narrow( anAttr );
1592 int val = SALOMEGUI_SetValueDlg::getInteger( tr( "SET_VALUE_INT_TLT" ),
1593 tr( "SET_VALUE_INT_LBL" ),
1596 QAD_Application::getDesktop() );
1598 anInt->SetValue( val );
1603 if ( SO->FindAttribute( anAttr, "AttributeReal" ) ) {
1604 aReal = SALOMEDS::AttributeReal::_narrow( anAttr );
1605 double val = SALOMEGUI_SetValueDlg::getDouble( tr( "SET_VALUE_REAL_TLT" ),
1606 tr( "SET_VALUE_REAL_LBL" ),
1609 QAD_Application::getDesktop() );
1611 aReal->SetValue( val );
1614 // if Table of integer
1616 if ( SO->FindAttribute( anAttr, "AttributeTableOfInteger" ) ) {
1617 SALOMEGUI_TableDlg* dlg = new SALOMEGUI_TableDlg( QAD_Application::getDesktop(),
1620 SALOMEGUI_TableDlg::ttInt );
1621 bOk = ( dlg->exec() == QDialog::Accepted );
1625 if ( SO->FindAttribute( anAttr, "AttributeTableOfReal" ) ) {
1626 SALOMEGUI_TableDlg* dlg = new SALOMEGUI_TableDlg( QAD_Application::getDesktop(),
1629 SALOMEGUI_TableDlg::ttReal );
1630 bOk = ( dlg->exec() == QDialog::Accepted );
1634 if ( SO->FindAttribute(anAttr, "AttributeComment") ) {
1635 aComment = SALOMEDS::AttributeComment::_narrow( anAttr );
1636 QString val = SALOMEGUI_SetValueDlg::getString( tr( "SET_VALUE_COMMENT_TLT" ),
1637 tr( "SET_VALUE_COMMENT_LBL" ),
1640 QAD_Application::getDesktop() );
1642 aComment->SetValue( val );
1653 Returns true if object has editable attrubute :
1654 integer, real, table or comment
1656 bool QAD_ObjectBrowser::hasEditableAttribute( const Handle(SALOME_InteractiveObject)& object )
1658 if ( !myStudy->_is_nil() ) {
1659 SALOMEDS::SObject_var obj = myStudy->FindObjectID( object->getEntry() );
1660 SALOMEDS::SComponent_var comp = myStudy->FindComponentID( object->getEntry() );
1661 if ( !comp->_is_nil() || obj->_is_nil() )
1663 QString val = getValueFromObject( obj );
1664 return ( !val.isNull() );
1670 Returns true if object has table attrubute ( integer and/or real )
1672 bool QAD_ObjectBrowser::hasTable( const Handle(SALOME_InteractiveObject)& object )
1674 SALOMEDS::GenericAttribute_var anAttr;
1675 if ( !myStudy->_is_nil() ) {
1676 SALOMEDS::SObject_var obj = myStudy->FindObjectID( object->getEntry() );
1677 SALOMEDS::SComponent_var comp = myStudy->FindComponentID( object->getEntry() );
1678 if ( !comp->_is_nil() || obj->_is_nil() )
1680 if ( obj->FindAttribute( anAttr, "AttributeTableOfInteger" ) )
1682 if ( obj->FindAttribute( anAttr, "AttributeTableOfReal" ) )
1689 Slot, called when one of the UseCase Browser menu command is called
1691 void QAD_ObjectBrowser::onUseCasePopupMenu( int action )
1693 if ( myStudy->_is_nil() )
1695 QAD_Desktop* Desktop = (QAD_Desktop*) QAD_Application::getDesktop();
1696 QAD_Study* myActiveStudy = Desktop->getActiveStudy();
1697 SALOME_Selection* Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1698 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
1699 SALOMEDS::SObject_var Current = UCBuilder->GetCurrentObject();
1701 QList<QListViewItem> ucSelected;
1702 ucSelected.setAutoDelete( false );
1703 getSelectedParents( myUseCaseView, ucSelected );
1705 if ( action == UC_NEW_EMPTY_ID ) {
1706 if ( ucSelected.count() == 1 ) {
1707 if ( isRootItem( ucSelected.at(0) ) )
1708 UCBuilder->SetRootCurrent();
1710 UCBuilder->SetCurrentObject( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) );
1711 UCBuilder->AddUseCase( tr( "NEW_OBJECT" ) );
1712 myActiveStudy->updateUseCaseBrowser();
1716 if ( action == UC_SET_CURRENT_ID ) {
1717 if ( ucSelected.count() > 0 ) {
1718 if ( isRootItem( ucSelected.at(0) ) )
1719 UCBuilder->SetRootCurrent();
1721 UCBuilder->SetCurrentObject( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) );
1723 myActiveStudy->updateUseCaseBrowser( );
1726 if ( action == UC_RENAME_ID ) {
1727 if ( ucSelected.count() == 1 ) {
1728 QAD_ObjectBrowserItem* useCaseItem = ( QAD_ObjectBrowserItem* )( ucSelected.at( 0 ) );
1729 if ( isRootItem( useCaseItem ) ) {
1730 QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), strdup( UCBuilder->GetName() ) );
1731 if ( !name.isEmpty() ) {
1732 bool ok = UCBuilder->SetName( strdup( name.latin1() ) );
1733 myActiveStudy->updateUseCaseBrowser( );
1736 else/* if ( UCBuilder->IsUseCase( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) ) )*/ {
1737 QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), strdup( useCaseItem->getName() ) );
1738 if ( !name.isEmpty() ) {
1739 myActiveStudy->renameIObject( Sel->firstIObject(), name );
1745 if ( action == UC_APPEND_ID ) {
1746 if ( Sel->IObjectCount() > 0 ) {
1747 SALOME_ListIO SelIO; SelIO = Sel->StoredIObjects();
1748 SALOME_ListIteratorOfListIO SelIt( SelIO );
1749 for( ; SelIt.More(); SelIt.Next() ) {
1750 SALOMEDS::SObject_var selSO = myStudy->FindObjectID( SelIt.Value()->getEntry() );
1751 if ( !selSO->_is_nil() && strcmp( SelIt.Value()->getEntry(), ( "0:2" ) ) != 0 ) {
1752 UCBuilder->Remove( selSO ); // first remove object for sure ...
1753 UCBuilder->Append( selSO ); // ... and now re-append it
1756 myActiveStudy->updateUseCaseBrowser( true );
1760 if ( action == UC_REMOVE_ID ) {
1762 getSelectedParents( myUseCaseView, ucSelected, true );
1763 for ( int i = 0; i < ucSelected.count(); i++ ) {
1764 QAD_ObjectBrowserItem* item = ( QAD_ObjectBrowserItem* )ucSelected.at( i );
1765 if ( !isRootItem( item ) ) {
1767 SALOMEDS::SObject_var SO = myStudy->FindObjectID( item->getEntry() );
1768 if ( !SO->_is_nil() ) {
1769 UCBuilder->Remove( SO );
1775 Sel->ClearIObjects();
1776 myActiveStudy->updateUseCaseBrowser( true );
1779 if ( action == UC_CLEAR_ID ) {
1780 if ( myUseCaseView->childCount() > 0 && myUseCaseView->firstChild()->childCount() > 0) {
1781 QAD_ObjectBrowserItem* child = ( QAD_ObjectBrowserItem* )myUseCaseView->firstChild()->firstChild();
1783 UCBuilder->Remove( myStudy->FindObjectID( child->getEntry().latin1() ) );
1784 child = ( QAD_ObjectBrowserItem* )( child->nextSibling() );
1786 Sel->ClearIObjects();
1787 myActiveStudy->updateUseCaseBrowser();
1792 Use Case browser buttons slot
1794 void QAD_ObjectBrowser::onUseCaseBtn()
1796 if ( sender() == myNewBtn ) {
1797 QAD_Desktop* Desktop = (QAD_Desktop*) QAD_Application::getDesktop();
1798 QAD_Study* myActiveStudy = Desktop->getActiveStudy();
1799 SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
1800 UCBuilder->AddUseCase( tr( "NEW_OBJECT" ) );
1801 myActiveStudy->updateUseCaseBrowser();
1803 if ( sender() == myAddBtn )
1804 onUseCasePopupMenu( UC_APPEND_ID );
1805 if ( sender() == myDelBtn )
1806 onUseCasePopupMenu( UC_REMOVE_ID );
1807 if ( sender() == myClearBtn )
1808 onUseCasePopupMenu( UC_CLEAR_ID );
1809 if ( sender() == myCurrentBtn )
1810 onUseCasePopupMenu( UC_SET_CURRENT_ID );