Salome HOME
NRI : Modification.
[modules/kernel.git] / src / SALOMEGUI / QAD_ObjectBrowser.cxx
1 using namespace std;
2 //  File      : QAD_ObjectBrowser.cxx
3 //  Created   : Thu Jun 14 15:42:10 2001
4 //  Author    : Nicolas REJNERI
5 //  Project   : SALOME
6 //  Module    : SALOMEGUI
7 //  Copyright : Open CASCADE
8 //  $Header$
9
10
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"
26  
27 // QT Includes
28 #include <qlistview.h>
29 #include <qheader.h>
30 #include <qpopupmenu.h>
31 #include <qtabwidget.h>
32 #include <qpushbutton.h>
33 #include <qlayout.h>
34 #include <qvbox.h>
35 #include <qhbox.h>
36 #include <qtooltip.h>
37 #include <qdragobject.h>
38 #include <qstringlist.h>
39
40 //VRV: porting on Qt 3.0.5
41 #if QT_VERSION >= 0x030005
42 #include <qcursor.h> 
43 #endif
44 //VRV: porting on Qt 3.0.5
45
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
55
56 /*!
57   Gets selected top-level items (i.e. not including sub-items) [ static ]
58 */
59 static void getSelectedParents( QListViewItem* listViewItem, QList<QListViewItem>& itemList )
60 {
61   QListViewItem* item = listViewItem->firstChild();
62   while ( item ) {
63     if ( item->isSelected() ) {
64       itemList.append( item );
65     }
66     else {
67       getSelectedParents( item, itemList );
68     }
69     item = item->nextSibling();
70   }
71 }
72 /*!
73   Gets selected top-level items (i.e. not including sub-items) [ static ]
74 */
75 static void getSelectedParents( QListView* listView, QList<QListViewItem>& itemList, bool ignoreRoot = false )
76 {
77   itemList.clear();
78   QListViewItem* item = listView->firstChild();
79   while ( item ) {
80     if ( item->isSelected() && !ignoreRoot ) {
81       itemList.append( item );
82     }
83     else {
84       getSelectedParents( item, itemList );
85     }
86     item = item->nextSibling();
87   }
88 }
89 /*!
90   Gets top-most parent item [ static ]
91 */
92 static QListViewItem* getTopParent( QListViewItem* item )
93 {
94   if ( !item )
95     return 0;
96   QListViewItem* p = item->parent();
97   if ( !p )
98     return item;
99   while ( p->parent() ) {
100     p = p->parent();
101   }
102   return p;
103 }
104 /*!
105   Returns true if the item is top-level (root)
106 */
107 static bool isRootItem( QListViewItem* item )
108 {
109   return ( item->listView() && !item->parent() );
110 }
111 /*!
112   Constructor
113 */
114 QAD_ObjectBrowser::QAD_ObjectBrowser( SALOMEDS::Study_var study, QWidget* parent, const char* name, WFlags fl )
115      : QTabWidget( parent, name, fl )
116 {
117   myStudy = SALOMEDS::Study::_duplicate( study );
118   myListViewMap.clear();
119   myUseCaseMap.clear();
120   setupListView();
121 }
122
123 /*!
124   Destructor
125 */
126 QAD_ObjectBrowser::~QAD_ObjectBrowser() 
127 {
128   if (!myStudy->_is_nil())
129     CORBA::release(myStudy);
130 }
131
132 /*!
133   Configures Object Browser and UseCase Browser. 
134   Columns, Selection Mode and Palette.
135 */
136 void QAD_ObjectBrowser::setupListView()
137 {
138   QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
139
140   this->setTabPosition( QTabWidget::Bottom );
141
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" );
146
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 ) );
152
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 );
160
161   /* Properties */
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 ); /* ...                                              */
168
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* ) ) );
174 #else
175   connect( myListView, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint&, int ) ),
176            this,       SLOT(   showPopupMenu( QListViewItem* ) ) );
177 #endif  
178   //VRV: porting on Qt 3.0.5
179
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* ) ) );
186
187   /* create and setup UseCase Browser ================================ */
188   QWidget* vBox = new QWidget( this );
189   QVBoxLayout* vBoxLayout = new QVBoxLayout( vBox );
190   
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 ) );
195
196   /* First column = object name */
197   myUseCaseView->addColumn( tr( "OBJECT_BROWSER_OBJECT" ) );
198   /* Properties */
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 ); 
211
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" ) );
232
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();
250
251   vBoxLayout->addLayout( btnLayout ); 
252
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() ) );
258
259   /* Connect section */
260 #if QT_VERSION < 0x030005
261   connect( myUseCaseView, SIGNAL( rightButtonClicked( QListViewItem*, const QPoint&, int ) ),
262            this,       SLOT(   showPopupMenu( QListViewItem* ) ) );
263 #else
264   connect( myUseCaseView, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint&, int ) ),
265            this,       SLOT(   showPopupMenu( QListViewItem* ) ) );
266 #endif  
267   
268   connect( myUseCaseView, SIGNAL( selectionChanged() ),
269            this,       SLOT( onSelectedItem() ) );
270
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" ) );
274
275   setShowInfoColumns( AddColumn == "true" );
276   setShowValueColumn( ValueColumn == "true" );
277   setEnableChronoSort( ShowCHRONO_SORT == "true" );
278   
279   resize( QSize( 100, 400 ) );
280 }
281
282 /*!
283   Event filter
284 */
285
286 bool QAD_ObjectBrowser::eventFilter( QObject* o, QEvent* e )
287 {
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 );
292
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 );
306           bool done = true;
307           for ( ; it.current(); ++it ) {
308             QAD_ObjectBrowserItem* selItem = ( QAD_ObjectBrowserItem* )( it.current() );
309             if ( selItem->isSelected() ) {
310               if ( isRootItem( selItem ) ) {
311                 done = false;
312                 break;
313               }
314               else {
315                 entryList.append( selItem->getEntry() );
316               }
317             }
318           }
319           if ( done && !entryList.isEmpty() ) {
320             QTextDrag *d = new QTextDrag( entryList.join("*"), myUseCaseView->viewport() );
321             d->dragMove();
322             return true;
323           }
324         }
325       }
326     }
327     else if ( e->type() == QEvent::DragMove ) {
328       QDragMoveEvent* dme = ( QDragMoveEvent* )e;
329       if ( dme->source() == myUseCaseView->viewport() ) {
330         dme->accept();
331       }
332       else {
333         dme->ignore();
334       }
335       return true;
336     }
337     else if ( e->type() == QEvent::Drop ) {
338       QDropEvent* de = ( QDropEvent* )e;
339       QString text;
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 );
344           if ( useCaseItem ) {
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 );
351               }
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 );
364                   }
365                 }
366               }
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 );
373                 }
374               }
375               myActiveStudy->updateUseCaseBrowser();
376             }
377           }
378         }
379         de->acceptAction();
380       }
381       else {
382         de->ignore();
383       }
384       return true;
385     }
386   }
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 );
392         return true;
393       }
394     }
395   }
396   return QTabWidget::eventFilter( o, e );
397 }
398
399
400 /*!
401   Builds popup menu
402 */
403 void QAD_ObjectBrowser::onCreatePopup()
404 {
405   QAD_Desktop*     Desktop = (QAD_Desktop*) QAD_Application::getDesktop();
406   QAD_Study*   myActiveStudy = Desktop->getActiveStudy();
407   SALOME_Selection*      Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
408
409   /* VSR : Creation of common POPUP menu for Object Browser/Use Case Browser */
410   if ( Sel->IObjectCount() > 0 ) {
411     QString theContext;
412     QString theParent;
413     QString theObject;
414     
415     Desktop->definePopup( theContext, theParent, theObject );
416     if ( myPopup ) {
417       Desktop->createPopup( myPopup, theContext, "ObjectBrowser", theObject);
418       if ( !Desktop->getActiveComponent().isEmpty() ) {
419         Desktop->customPopup( myPopup, theContext, "ObjectBrowser", theObject );
420       }
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" ),
427                              this,
428                              SLOT( onEditAttribute() ) );
429       }
430     }
431   } else {
432     // NRI 02/12/2002
433     // No selected item => it's not necessary to create popup
434     //NRI- :  Desktop->createPopup( myPopup, "", "ObjectBrowser", "");
435   }
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 );
441     
442     if ( myPopup && !myStudy->_is_nil() ) {
443       SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
444 //      myPopup->clear();
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() ) ) ); 
453
454       if ( isRoot )
455         myPopup->clear();
456       QPopupMenu *UseCasePopup = new QPopupMenu( myPopup );
457       if ( isOne )
458         UseCasePopup->insertItem( tr( "UC_NEW_ID" ), this, SLOT( onUseCasePopupMenu( int ) ), 0, UC_NEW_EMPTY_ID );
459       if ( isOne )
460         UseCasePopup->insertItem( tr( "UC_SET_CURRENT_ID" ), this, SLOT( onUseCasePopupMenu( int ) ), 0, UC_SET_CURRENT_ID );
461       if ( isUseCase )
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 );
465
466       if ( UseCasePopup->count() > 0 ) {
467         if ( myPopup->count() > 0 )
468           myPopup->insertSeparator();
469         myPopup->insertItem( tr( "UC_POPUP" ), UseCasePopup );
470       }
471       else {
472         delete UseCasePopup;
473       }
474     }
475   }
476 }
477
478 /*!
479   Returns Object Browser list view
480 */
481 QListView* QAD_ObjectBrowser::getListView() const
482 {
483   return myListView;
484 }
485
486 /*!
487   Returns UseCase Browser list view
488 */
489 QListView* QAD_ObjectBrowser::getUseCaseView() const
490 {
491   return myUseCaseView;
492 }
493
494 /*!
495   Adds anItem ( probably a SComponent )
496 */
497 QAD_ObjectBrowserItem* QAD_ObjectBrowser::AddItem(QListView*             theView,
498                                                   const QString&         theName,
499                                                   const QString&         theEntry,
500                                                   const QString&         theIOR, 
501                                                   int                    theType, 
502                                                   const QString&         theValue,
503                                                   QAD_ObjectBrowserItem* theAfter)
504
505 {
506   QAD_ObjectBrowserItem* last = (QAD_ObjectBrowserItem*)(theView->firstChild());
507   if ( theAfter )
508     last = theAfter;
509   else if ( last ) {
510     for ( ; last->nextSibling(); last = (QAD_ObjectBrowserItem*)(last->nextSibling()) );
511   }
512   QAD_ObjectBrowserItem* anItem = new QAD_ObjectBrowserItem( theView, last );
513   
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( "" );
521
522   return anItem;
523 }
524
525 /*!
526   Adds anItem ( probably a StudyObject )
527 */
528 QAD_ObjectBrowserItem* QAD_ObjectBrowser::AddItem(QAD_ObjectBrowserItem* theParentItem,
529                                                   const QString&         theName,
530                                                   const QString&         theEntry,
531                                                   const QString&         theIOR,
532                                                   int                    theType,
533                                                   const QString&         theRef,
534                                                   const QString&         theValue,
535                                                   QAD_ObjectBrowserItem* theAfter)
536
537 {
538   QAD_ObjectBrowserItem* last = (QAD_ObjectBrowserItem*)(theParentItem->firstChild());
539   if ( theAfter )
540     last = theAfter;
541   else if ( last ) {
542     for ( ; last->nextSibling(); last = (QAD_ObjectBrowserItem*)(last->nextSibling()) );
543   }
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 );
552
553   return anItem;
554 }
555
556 /*!
557   Updates Object Browsers' item [ protected ]
558 */
559 void QAD_ObjectBrowser::Update( SALOMEDS::SObject_ptr SO,
560                                 QAD_ObjectBrowserItem* theParentItem )
561 {
562   if ( myStudy->_is_nil() || SO->_is_nil() || !theParentItem ) {
563     return;
564   }
565   SALOMEDS::ChildIterator_var it = myStudy->NewChildIterator(SO);
566
567   for (; it->More();it->Next()) {
568     SALOMEDS::SObject_var             CSO = it->Value();
569     SALOMEDS::SObject_var             RefSO;
570     QString                           ior = "";
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;
584
585     QAD_ObjectBrowserItem*            Item = 0;
586     QAD_ObjectBrowserItem*            subItem;
587     QString                           valueString;
588    
589     if ( CSO->ReferencedObject(RefSO) && !RefSO->_is_nil() ) {
590       
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() );
597         }
598         valueString = getValueFromObject( RefSO );
599 //      AddItem (Item, QString(" * ") + strdup( aName->Value() ), RefSOEntry, ior, 2, CSOEntry);
600         Item = AddItem(theParentItem, 
601                        QString(" * ") + strdup( aName->Value() ), 
602                        RefSOEntry, 
603                        ior, 
604                        2, 
605                        CSOEntry, 
606                        valueString);
607         myListViewMap[ RefSOEntry ].append( Item );
608       }
609       else {
610         MESSAGE("QAD_ObjectBrowser::Update : noname item: "<<CSO->GetID());
611       }
612     } else {
613       // getting Value
614       valueString = getValueFromObject( CSO );
615       // getting IOR
616       if (CSO->FindAttribute(anAttr, "AttributeIOR"))  {
617         anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
618         ior = strdup( anIOR->Value() );
619       }
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 );
625       } 
626       else {
627         MESSAGE("QAD_ObjectBrowser::Update : noname item: "<<CSO->GetID());
628       }
629       // adding other attributes 
630       if (Item) {
631         // Selectable
632         if ( CSO->FindAttribute(anAttr, "AttributeSelectable") ) {
633           aSelectable = SALOMEDS::AttributeSelectable::_narrow(anAttr);
634           Item->setSelectable(aSelectable->IsSelectable());
635         }
636         // Expandable
637         if ( CSO->FindAttribute(anAttr, "AttributeExpandable") ) {
638           anExpandable = SALOMEDS::AttributeExpandable::_narrow(anAttr);
639           Item->setExpandable(anExpandable->IsExpandable());
640         }
641         // Opened
642         if ( CSO->FindAttribute(anAttr, "AttributeOpened") ) {
643           anOpened = SALOMEDS::AttributeOpened::_narrow(anAttr);
644           Item->setOpen(anOpened->IsOpened());
645         }
646         // TextColor
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);
651         }
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);
659         }
660         // Pixmap
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);
668
669               QString msg;
670               QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
671               if ( resMgr ) {
672                 if(resMgr->loadResources( QAD_Application::getDesktop()->getComponentName(QString(aFatherName->Value())), msg )) {
673                   QPixmap icon ( resMgr->loadPixmap( QAD_Application::getDesktop()->getComponentName(QString(aFatherName->Value())),
674                                                      tr(aPixmap->GetPixMap()) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ));
675                   Item->setPixmap( 0, icon );
676                 }
677               }
678             }
679           }
680         }
681       } 
682     }
683 //  if ( theParentItem->isOpen() )
684 //    Item->setOpen(TRUE);
685
686     if ( Item )
687       Update(CSO, Item);
688   }
689 }
690
691 /*!
692   Updates Object Browser tree and UseCase Browser tree
693 */
694 void QAD_ObjectBrowser::Update()
695 {
696   myListView->clear();
697   myListViewMap.clear();
698
699   if ( myStudy->_is_nil() ) {
700     return;
701   }
702
703   QString ShowIAPP = QAD_CONFIG->getSetting("ObjectBrowser:IAPP");
704
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() );
711     QString                  ior      = "";
712     QString                  SCEntry  = strdup( SC->GetID() );
713
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;
726
727     if (SC->FindAttribute(anAttr, "AttributeIOR")) {
728       anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
729       ior = strdup( anIOR->Value() );
730     }
731
732     bool caseIAPP = false;
733
734     // create data-tree item, corresponding to component (and set name if component has it)
735     if ( dataType.compare("Interface Applicative") == 0 ) {
736       caseIAPP = true;
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 );
742         } 
743         else {
744           Item = AddItem (myListView, dataType, SCEntry, ior, 1, "");
745           myListViewMap[ SCEntry ].append( Item );
746         }
747
748       }
749     } 
750     else {
751       caseIAPP = false;
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 );
756       } 
757       else {
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, "");
762         */
763       }
764     }
765     // add other attributes 
766     if (Item) {
767       QAD_ObjectBrowserItem* subItem;
768       // Selectable
769       if ( SC->FindAttribute(anAttr, "AttributeSelectable") ) {
770         aSelectable = SALOMEDS::AttributeSelectable::_narrow(anAttr);
771         Item->setSelectable(aSelectable->IsSelectable());
772       }
773       // Expandable
774       if ( SC->FindAttribute(anAttr, "AttributeExpandable") ) {
775         anExpandable = SALOMEDS::AttributeExpandable::_narrow(anAttr);
776         Item->setExpandable(anExpandable->IsExpandable());
777       }
778       // Opened
779       if ( SC->FindAttribute(anAttr, "AttributeOpened") ) {
780         anOpened = SALOMEDS::AttributeOpened::_narrow(anAttr);
781         Item->setOpen(anOpened->IsOpened());
782       }
783       // TextColor
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);
788       }
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);
796       }
797       
798       // Pixmap
799       if ( SC->FindAttribute(anAttr, "AttributePixMap") ) {
800         aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
801         if ( aPixmap->HasPixMap() ) {
802           QString msg;
803           QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
804           if ( resMgr ) {
805             MESSAGE ( " Component " << aName->Value() )
806               MESSAGE ( " Icon " << aPixmap->GetPixMap() )
807             if(resMgr->loadResources( QAD_Application::getDesktop()->getComponentName(QString(aName->Value())), msg )) {
808               QPixmap icon ( resMgr->loadPixmap( QAD_Application::getDesktop()->getComponentName(QString(aName->Value())),
809                                                  tr(aPixmap->GetPixMap()) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ));
810               Item->setPixmap( 0, icon );
811             }
812           }
813         }
814       }
815       /*
816          if ( strcmp(dataType, TypeComponent) == 0 )
817          Item->setOpen(TRUE);
818       */
819       if ( caseIAPP && ShowIAPP.compare("true") == 0 )
820         Update (SC, Item);
821       
822       if ( !caseIAPP )
823         Update (SC, Item);
824     }
825   }
826   /* Updating UseCase Browser ============================================= */
827   UpdateUseCaseBrowser();
828 }
829
830 /*!
831   Removes item with all childs from the map - used to optimize UseCase browser update
832 */
833 void removeFromMap( ItemMap& theMap, QAD_ObjectBrowserItem* item )
834 {
835   if ( item ) {
836     QAD_ObjectBrowserItem* subItem = ( QAD_ObjectBrowserItem* )( item->firstChild() );
837     while ( subItem ) {
838       removeFromMap( theMap, subItem );
839       subItem = ( QAD_ObjectBrowserItem* )( subItem->nextSibling() );
840     }
841     if ( theMap.contains( item->getEntry() ) ) {
842       theMap[ item->getEntry() ].removeRef( item );
843       if ( theMap[ item->getEntry() ].isEmpty() ) {
844         theMap.remove( item->getEntry() );
845       }
846     }
847   }
848 }
849
850 /*!
851   Updates only UseCase Browser
852 */
853 void QAD_ObjectBrowser::UpdateUseCaseBrowser() {
854 //  myUseCaseView->clear(); myUseCaseMap.clear();
855   if ( myStudy->_is_nil() ) {
856     return;
857   }
858   myUseCaseView->blockSignals( true );
859 //  myUseCaseView->setUpdatesEnabled( false );
860
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
868   if ( !root ) {
869     root = AddItem( myUseCaseView, UCName, "0:2", "", 1, "" );
870     myUseCaseMap[ "0:2" ].append( root );
871   }
872   else
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;
884     }
885   }
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 );
896       delete prevItem;
897     }
898   }
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 );
903   }
904   myUseCaseView->blockSignals( false );
905 //  myUseCaseView->setUpdatesEnabled( true );
906 //  myUseCaseView->update();
907 //  UCItem->setOpen( true );
908 }
909
910 /*!
911   Updates UseCase Browser's item
912 */
913 void QAD_ObjectBrowser::UpdateUCItem( SALOMEDS::SObject_var UCObject, QAD_ObjectBrowserItem* UCItem )
914 {
915   if ( myStudy->_is_nil() || !UCItem )
916     return;
917
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;
928   QString                                    valueString;
929   QString                                    ior = "";
930   QString                                    UCEntry = strdup( UCObject->GetID() );
931
932   SALOMEDS::UseCaseBuilder_var               UCBuilder = myStudy->GetUseCaseBuilder();
933   SALOMEDS::SObject_var                      SOCurrent = UCBuilder->GetCurrentObject();
934
935   bool bFound = false;
936   QAD_ObjectBrowserItem* UCSubItem = 0;
937   if ( myUseCaseMap.contains( UCEntry ) && myUseCaseMap[ UCEntry ].count() > 0 )
938     UCSubItem = myUseCaseMap[ UCEntry ].first();
939
940 //  if ( !bFound ) {
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() );
948       }
949       valueString = getValueFromObject( RefSO );
950       if ( !UCSubItem ) {
951         UCSubItem = AddItem( UCItem, 
952                              QString( " * " ) + strdup( aName->Value() ), 
953                              RefSOEntry, 
954                              ior, 
955                              2, 
956                              UCEntry, 
957                              valueString );
958         myUseCaseMap[ RefSOEntry ].append( UCSubItem );
959       }
960       else {
961         UCSubItem->setName( QString( " * " ) + strdup( aName->Value() ) );
962         UCSubItem->setEntry( RefSOEntry );
963         UCSubItem->setIOR( ior );
964         UCSubItem->setReference( UCEntry );
965         UCSubItem->setValue( valueString );
966       }
967       UCSubItem->setCurrent( !SOCurrent->_is_nil() && QString( SOCurrent->GetID() ) == QString( UCEntry ) );
968     }
969   } 
970   else {
971     // getting Value
972     valueString = getValueFromObject( UCObject );
973     // getting IOR
974     if ( UCObject->FindAttribute( anAttr, "AttributeIOR" ) )  {
975       anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr );
976       ior = strdup( anIOR->Value() );
977     }
978     // getting Name and adding new Item
979     if ( UCObject->FindAttribute( anAttr, "AttributeName" ) ) {
980       aName = SALOMEDS::AttributeName::_narrow( anAttr );
981       if ( !UCSubItem ) {
982         UCSubItem = AddItem( UCItem, strdup( aName->Value() ), UCEntry, ior, 0, "", valueString );
983         myUseCaseMap[ UCEntry ].append( UCSubItem );
984       }
985       else {
986         UCSubItem->setName( strdup( aName->Value() ) );
987         UCSubItem->setEntry( UCEntry );
988         UCSubItem->setIOR( ior );
989         UCSubItem->setReference( "" );
990         UCSubItem->setValue( valueString );
991       }
992     } 
993     // adding other attributes 
994     if ( UCSubItem ) {
995       UCSubItem->setCurrent( !SOCurrent->_is_nil() && QString( SOCurrent->GetID() ) == QString( UCEntry ) );
996 //  Selectable
997 //      if ( UCObject->FindAttribute( anAttr, "AttributeSelectable" ) ) {
998 //      aSelectable = SALOMEDS::AttributeSelectable::_narrow( anAttr );
999 //      UCSubItem->setSelectable( aSelectable->IsSelectable() );
1000 //      }
1001 // Expandable
1002 //      if ( UCObject->FindAttribute( anAttr, "AttributeExpandable" ) ) {
1003 //      anExpandable = SALOMEDS::AttributeExpandable::_narrow( anAttr );
1004 //      UCSubItem->setExpandable( anExpandable->IsExpandable() );
1005 //      }
1006 // TextColor
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 );
1013       }
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 );
1021       }
1022       // Pixmap
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();
1031             if ( resMgr ) {
1032               QString msg;
1033               if( resMgr->loadResources( QAD_Application::getDesktop()->getComponentName(QString( aFatherName->Value() )), msg ) ) {
1034                 QPixmap icon ( resMgr->loadPixmap( QAD_Application::getDesktop()->getComponentName(QString( aFatherName->Value() )),
1035                                                    tr( aPixmap->GetPixMap() ) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ) );
1036                 UCSubItem->setPixmap( 0, icon );
1037               }
1038             }
1039           }
1040         }
1041       }
1042     } 
1043   }
1044   if ( UCSubItem ) {
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;
1053       }
1054     }
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 );
1065         delete prevItem;
1066       }
1067     }
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 );
1072     }
1073   }
1074 }
1075
1076 /*!
1077   Unhighlights all items
1078 */
1079 void QAD_ObjectBrowser::unHighlightAll()
1080 {
1081   myListView->clearSelection();
1082   myUseCaseView->clearSelection();
1083 }
1084
1085 /*!
1086   Highlights items which refer to object
1087 */
1088 void QAD_ObjectBrowser::highlight( const Handle(SALOME_InteractiveObject)& IObject, bool highlight )
1089 {
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();
1095     } 
1096   }
1097 }
1098
1099 /*!
1100   Gets items from Object Browser which refer to object 
1101 */
1102 bool QAD_ObjectBrowser::getItems( const Handle(SALOME_InteractiveObject)& IObject, 
1103                                   QList<QAD_ObjectBrowserItem>& List)
1104 {
1105   List.clear();
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) );
1110   }
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) );
1115   }
1116   return (List.count() > 0);
1117 }
1118
1119 /*!
1120   Gets items from Object Browser which refer to object 
1121 */
1122 bool QAD_ObjectBrowser::getItems( SALOMEDS::SObject_ptr SO, 
1123                                   QList<QAD_ObjectBrowserItem>& List)
1124 {
1125   List.clear();
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) );
1130   }
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) );
1135   }
1136   return (List.count() > 0);
1137 }
1138
1139 /*!
1140   Gets first item from Object Browser which refers to object (not reference) 
1141 */
1142 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getItem( const Handle(SALOME_InteractiveObject)& IObject )
1143 {
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() )
1149         return ilist.at(i);
1150     }
1151   }
1152   return 0;
1153 }
1154
1155 /*!
1156   Finds item from Object Browser corresponding to Object, returns 0 if fails
1157 */
1158 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getItem( SALOMEDS::SObject_ptr SO )
1159 {
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() )
1165         return ilist.at(i);
1166     }
1167   }
1168   return 0;
1169 }
1170
1171
1172 /*!
1173   Gets first item from UseCase Browser which refers to object (not reference) 
1174 */
1175 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getUCItem( const Handle(SALOME_InteractiveObject)& IObject )
1176 {
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() )
1182         return ilist.at(i);
1183     }
1184   }
1185   return 0;
1186 }
1187
1188 /*!
1189   Finds item from UseCase Browser corresponding to Object, returns 0 if fails
1190 */
1191 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getUCItem( SALOMEDS::SObject_ptr SO )
1192 {
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() )
1198         return ilist.at(i);
1199     }
1200   }
1201   return 0;
1202 }
1203 /*!
1204   Finds item corresponding to interactive object, returns 0 if fails
1205 */
1206 void QAD_ObjectBrowser::rename( const Handle(SALOME_InteractiveObject)& IObject, QString newName )
1207 {
1208   QAD_ObjectBrowserItem* item = getItem( IObject );
1209   if ( item ) {
1210     item->setName( newName );
1211     item->repaint();
1212   }
1213   item = getUCItem( IObject );
1214   if ( item ) {
1215     item->setName( newName );
1216     item->repaint();
1217   }
1218 }
1219
1220 /*!
1221   Creates and show specific Popup to this according to current selection (Object Browser)
1222 */
1223 void QAD_ObjectBrowser::showPopupMenu(QListViewItem* theItem)
1224 {
1225   QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1226   SALOME_Selection*    Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1227   QString       ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1228
1229   if (theItem != NULL && ( Sel->IObjectCount()>0 || ActiveComp.isEmpty() ) ) {
1230     createPopup();
1231
1232     if ( myPopup ) {
1233       QAD_Tools::checkPopup( myPopup );
1234       if ( myPopup->count()>0 ) {
1235         myPopup->exec( QCursor::pos() );
1236       }
1237       destroyPopup();
1238     }
1239   }
1240 }
1241
1242 /*!
1243   Creates and show specific Popup to this according to current selection (UseCase Browser)
1244 */
1245 void QAD_ObjectBrowser::showUseCasePopupMenu(QListViewItem* theItem)
1246 {
1247   createPopup();
1248   if ( myPopup ) {
1249     QAD_Tools::checkPopup( myPopup );
1250     if ( myPopup->count() > 0 ) {
1251       myPopup->exec( QCursor::pos() );
1252     }
1253     destroyPopup();
1254   }
1255 }
1256
1257 /*!
1258   Called when current selection was changed (Object Browser)
1259 */
1260 void QAD_ObjectBrowser::onSelectedItem()
1261 {
1262   QListView* whoIs;
1263   if ( sender()->inherits("QListView") )
1264     whoIs = (QListView*)sender();
1265   else
1266     whoIs = myListView;
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();
1271
1272   SALOME_ListIO DeltaPos;
1273   DeltaPos.Clear();
1274   SALOME_ListIO DeltaNeg;
1275   DeltaNeg.Clear();
1276
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();
1283
1284     if ( !theEntry.isEmpty() ) {
1285       if ( item->isSelected() ) {
1286         bool itemAlreadySelected = false;
1287        
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;
1293             break;
1294           }
1295         }
1296       
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),
1305                                                     datatype,
1306                                                     strdup(theName) );
1307               newIO->setReference( strdup(theRef) );
1308             }
1309           } else {
1310             newIO = new SALOME_InteractiveObject( strdup(theEntry),
1311                                                   "",
1312                                                   strdup(theName) );
1313             newIO->setReference( strdup(theRef) );
1314           }
1315           if (!newIO.IsNull()) {
1316             DeltaPos.Append( newIO );
1317           } 
1318         }
1319       } else {
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 );
1325             break;
1326           }
1327         }
1328       }
1329     }
1330   }
1331
1332   SALOME_ListIteratorOfListIO ItNeg( DeltaNeg );
1333   for(;ItNeg.More();ItNeg.Next()) {
1334     Sel->RemoveIObject( ItNeg.Value() );
1335   }
1336   
1337   SALOME_ListIteratorOfListIO ItPos( DeltaPos );
1338   for(;ItPos.More();ItPos.Next()) {
1339     Sel->AddIObject( ItPos.Value() );
1340   }
1341   if ( myApp )
1342     myApp->updateActions();
1343 }
1344
1345 /*!
1346   Called when selection is changed (UseCase Browser)
1347 */
1348 void QAD_ObjectBrowser::onUseCaseSelectedItem()
1349 {
1350 }
1351
1352 /*!
1353   Called when item is expanded
1354 */
1355 void QAD_ObjectBrowser::onExpanded (QListViewItem* item)
1356 {
1357   QAD_ObjectBrowserItem* aItem = (QAD_ObjectBrowserItem*)item;
1358   if (!myStudy->_is_nil() && aItem)
1359   {
1360     SALOMEDS::SObject_var Object = myStudy->FindObjectID(aItem->getEntry());
1361     if (!Object->_is_nil())
1362     {
1363       SALOMEDS::StudyBuilder_var StudyBuilder = myStudy->NewBuilder();
1364       SALOMEDS::AttributeOpened_var  anAttr = SALOMEDS::AttributeOpened::_narrow(
1365                    StudyBuilder->FindOrCreateAttribute(Object, "AttributeOpened") );
1366       anAttr->SetOpened(true);
1367     }
1368   }
1369 }
1370
1371 /*!
1372   Called when item is collapsed
1373 */
1374 void QAD_ObjectBrowser::onCollapsed(QListViewItem* item)
1375 {
1376   QAD_ObjectBrowserItem* aItem = (QAD_ObjectBrowserItem*)item;
1377   if (!myStudy->_is_nil() && aItem)
1378   {
1379     SALOMEDS::SObject_var Object = myStudy->FindObjectID(aItem->getEntry());
1380     if (!Object->_is_nil())
1381     {
1382       SALOMEDS::StudyBuilder_var StudyBuilder = myStudy->NewBuilder();
1383       SALOMEDS::AttributeOpened_var  anAttr = SALOMEDS::AttributeOpened::_narrow(
1384                    StudyBuilder->FindOrCreateAttribute(Object, "AttributeOpened") );
1385       anAttr->SetOpened(false);
1386     }
1387   }
1388 }
1389
1390 /*!
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]
1394 */
1395 QString QAD_ObjectBrowser::getValueFromObject( SALOMEDS::SObject_ptr SO )
1396 {
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
1402
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;
1409
1410   // Integer
1411   if ( SO->FindAttribute( anAttr, "AttributeInteger" ) ) {
1412     anInt = SALOMEDS::AttributeInteger::_narrow( anAttr );
1413     QString val = QString::number( anInt->Value() );
1414     return val;
1415   }
1416   // Real
1417   if ( SO->FindAttribute( anAttr, "AttributeReal" ) ) {
1418     aReal = SALOMEDS::AttributeReal::_narrow( anAttr );
1419     QString val = QString::number( aReal->Value() );
1420     return val;
1421   } 
1422   // Table of integer
1423   if ( SO->FindAttribute( anAttr, "AttributeTableOfInteger" ) ) {
1424     aTableInt = SALOMEDS::AttributeTableOfInteger::_narrow( anAttr );
1425     QString tlt = QString( strdup( aTableInt->GetTitle() ) );
1426     if ( !tlt.isEmpty() )
1427       tlt += " ";
1428     int nbRows  = aTableInt->GetNbRows() ; 
1429     int nbCols  = aTableInt->GetNbColumns();
1430     QString val = tlt + QString( "[" ) + QString::number( nbRows ) + QString( "," ) + QString::number( nbCols ) + QString( "]" );
1431     return val;
1432   }
1433   // Table of real
1434   if ( SO->FindAttribute( anAttr, "AttributeTableOfReal" ) ) {
1435     aTableReal = SALOMEDS::AttributeTableOfReal::_narrow( anAttr );
1436     QString tlt = QString( strdup( aTableReal->GetTitle() ) );
1437     if ( !tlt.isEmpty() )
1438       tlt += " ";
1439     int nbRows  = aTableReal->GetNbRows() ; 
1440     int nbCols  = aTableReal->GetNbColumns();
1441     QString val = tlt + QString( "[" ) + QString::number( nbRows ) + QString( "," ) + QString::number( nbCols ) + QString( "]" );
1442     return val;
1443   }
1444   // Comment
1445   if ( SO->FindAttribute(anAttr, "AttributeComment") ) {
1446     aComment = SALOMEDS::AttributeComment::_narrow( anAttr );
1447     QString val = QString( strdup( aComment->Value() ) );
1448     return val;
1449   }
1450   return QString::null;
1451 }
1452
1453 /*!
1454   Shows/hides IAPP sub-tree in ObjectBrowser
1455   Current implementation just udpates browser
1456 */
1457 void QAD_ObjectBrowser::setShowIAPP( bool show )
1458 {
1459   Update();
1460 }
1461
1462 /*!
1463   Shows/hides info columns: Entry, IOR, Reference
1464 */
1465 void QAD_ObjectBrowser::setShowInfoColumns( bool show )
1466 {
1467   bool shown = myListView->header()->isResizeEnabled( 2 );
1468   if ( show != shown ) {
1469     if ( show ) {
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 );
1482     }
1483     else {
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 );
1493     }
1494   }
1495 }
1496
1497 /*!
1498   Shows/hides Value column
1499 */
1500 void QAD_ObjectBrowser::setShowValueColumn( bool show )
1501 {
1502   bool shown = myListView->header()->isResizeEnabled( 1 );
1503   if ( show != shown ) {
1504     if ( show ) {
1505       myListView->header()->setResizeEnabled( true, 1 );
1506       myListView->setColumnWidthMode( 1, QListView::Maximum );
1507       if ( myListView->columnWidth( 1 ) <= 0 )
1508         myListView->header()->resizeSection( 1, 50 );
1509     }
1510     else {
1511       myListView->setColumnWidthMode( 1, QListView::Manual );
1512       myListView->header()->resizeSection( 1, 0 );
1513       myListView->header()->setResizeEnabled( false, 1 );
1514     }
1515   }
1516 }
1517
1518 /*!
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
1524 */
1525 void QAD_ObjectBrowser::setEnableChronoSort( bool enable )
1526 {
1527   if ( 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 ) ;
1532   }
1533   else {
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 );
1538   }
1539 //  myListView->sort( ) ;  
1540 }
1541
1542 /*!
1543   Slot, called to edit value
1544 */
1545 void QAD_ObjectBrowser::onEditAttribute()
1546 {
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() )
1551     return;
1552
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;
1563       bool bOk = false;
1564         
1565       // if Integer
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" ),
1570                                                      anInt->Value(),
1571                                                      &bOk,
1572                                                      QAD_Application::getDesktop() );
1573         if ( bOk ) {
1574           anInt->SetValue( val );
1575         }
1576       }
1577       // if Real
1578       else 
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" ),
1583                                                        aReal->Value(),
1584                                                        &bOk,
1585                                                        QAD_Application::getDesktop() );
1586         if ( bOk ) {
1587           aReal->SetValue( val );
1588         }
1589       }
1590       // if Table of integer
1591       else
1592       if ( SO->FindAttribute( anAttr, "AttributeTableOfInteger" ) ) {
1593         SALOMEGUI_TableDlg* dlg = new SALOMEGUI_TableDlg( QAD_Application::getDesktop(),
1594                                                           SO, 
1595                                                           true, 
1596                                                           SALOMEGUI_TableDlg::ttInt );
1597         bOk = ( dlg->exec() == QDialog::Accepted );
1598       }
1599       // if Table of real
1600       else
1601       if ( SO->FindAttribute( anAttr, "AttributeTableOfReal" ) ) {
1602         SALOMEGUI_TableDlg* dlg = new SALOMEGUI_TableDlg( QAD_Application::getDesktop(),
1603                                                           SO, 
1604                                                           true, 
1605                                                           SALOMEGUI_TableDlg::ttReal );
1606         bOk = ( dlg->exec() == QDialog::Accepted );
1607       }
1608       // if Comment
1609       else
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" ),
1614                                                         aComment->Value(),
1615                                                         &bOk,
1616                                                         QAD_Application::getDesktop() );
1617         if ( bOk ) {
1618           aComment->SetValue( val );
1619         }
1620       }
1621       if ( bOk ) {
1622         Update();
1623       }
1624     }
1625   }
1626 }
1627
1628 /*!
1629   Returns true if object has editable attrubute : 
1630   integer, real, table or comment
1631 */
1632 bool QAD_ObjectBrowser::hasEditableAttribute( const Handle(SALOME_InteractiveObject)& object )
1633 {
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() )
1638       return false;
1639     QString val = getValueFromObject( obj );
1640     return ( !val.isNull() );
1641   }
1642   return false;
1643 }
1644
1645 /*!
1646   Returns true if object has table attrubute ( integer and/or real )
1647 */
1648 bool QAD_ObjectBrowser::hasTable( const Handle(SALOME_InteractiveObject)& object )
1649 {
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() )
1655       return false;
1656     if ( obj->FindAttribute( anAttr, "AttributeTableOfInteger" ) )
1657       return true;
1658     if ( obj->FindAttribute( anAttr, "AttributeTableOfReal" ) )
1659       return true;
1660   }
1661   return false;
1662 }
1663
1664 /*!
1665   Slot, called when one of the UseCase Browser menu command is called
1666 */
1667 void QAD_ObjectBrowser::onUseCasePopupMenu( int action )
1668 {
1669   if ( myStudy->_is_nil() )
1670     return;
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();
1676
1677   QList<QListViewItem> ucSelected; 
1678   ucSelected.setAutoDelete( false );
1679   getSelectedParents( myUseCaseView, ucSelected );
1680
1681   if ( action == UC_NEW_EMPTY_ID ) {
1682     if ( ucSelected.count() == 1 ) {
1683       if ( isRootItem( ucSelected.at(0) ) )
1684         UCBuilder->SetRootCurrent();
1685       else
1686         UCBuilder->SetCurrentObject( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) );
1687       UCBuilder->AddUseCase( tr( "NEW_OBJECT" ) ); 
1688       myActiveStudy->updateUseCaseBrowser();
1689     }
1690   }
1691   else
1692   if ( action == UC_SET_CURRENT_ID ) {
1693     if ( ucSelected.count() > 0 ) {
1694       if ( isRootItem( ucSelected.at(0) ) )
1695         UCBuilder->SetRootCurrent();
1696       else
1697         UCBuilder->SetCurrentObject( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) );
1698     }
1699     myActiveStudy->updateUseCaseBrowser( );
1700   }
1701   else
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( );
1710         }
1711       }
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 );
1716         }
1717       }
1718     }
1719   }
1720   else 
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
1730         }
1731       }
1732       myActiveStudy->updateUseCaseBrowser( true );
1733     }
1734   }
1735   else 
1736   if ( action == UC_REMOVE_ID ) {
1737     ucSelected.clear();
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 ) ) {
1742         // SObject selected
1743         SALOMEDS::SObject_var SO = myStudy->FindObjectID( item->getEntry() );
1744         if ( !SO->_is_nil() ) {
1745           UCBuilder->Remove( SO );
1746         }
1747       }
1748       else {
1749       }
1750     }
1751     Sel->ClearIObjects();
1752     myActiveStudy->updateUseCaseBrowser( true );
1753   }
1754   else 
1755   if ( action == UC_CLEAR_ID ) {
1756     if ( myUseCaseView->childCount() > 0 && myUseCaseView->firstChild()->childCount() > 0) {
1757       QAD_ObjectBrowserItem* child = ( QAD_ObjectBrowserItem* )myUseCaseView->firstChild()->firstChild();
1758       while ( child ) {
1759         UCBuilder->Remove( myStudy->FindObjectID( child->getEntry().latin1() ) );
1760         child = ( QAD_ObjectBrowserItem* )( child->nextSibling() );
1761       }
1762       Sel->ClearIObjects();
1763       myActiveStudy->updateUseCaseBrowser();
1764     }
1765   }
1766 }
1767 /*!
1768   Use Case browser buttons slot
1769 */
1770 void QAD_ObjectBrowser::onUseCaseBtn()
1771 {
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();
1778   }
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 );
1787 }