]> SALOME platform Git repositories - modules/kernel.git/blob - src/SALOMEGUI/QAD_ObjectBrowser.cxx
Salome HOME
Moved some functionality to VTKViewer_Utilities.h
[modules/kernel.git] / src / SALOMEGUI / QAD_ObjectBrowser.cxx
1 //  SALOME SALOMEGUI : implementation of desktop and GUI kernel
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
5 // 
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. 
10 // 
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. 
15 // 
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 
19 // 
20 //  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
21 //
22 //
23 //
24 //  File   : QAD_ObjectBrowser.cxx
25 //  Author : Nicolas REJNERI
26 //  Module : SALOME
27 //  $Header$
28
29 #include "QAD_ObjectBrowserItem.h"
30 #include "QAD_ObjectBrowser.h"
31 #include "QAD_Application.h"
32 #include "QAD_MessageBox.h"
33 #include "QAD_Desktop.h"
34 #include "QAD_Config.h"
35 #include "QAD_Settings.h"
36 #include "QAD_Tools.h"
37 #include "QAD_RightFrame.h"
38 #include "QAD_LeftFrame.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"
45  
46 // QT Includes
47 #include <qlistview.h>
48 #include <qheader.h>
49 #include <qpopupmenu.h>
50 #include <qtabwidget.h>
51 #include <qpushbutton.h>
52 #include <qlayout.h>
53 #include <qvbox.h>
54 #include <qhbox.h>
55 #include <qtooltip.h>
56 #include <qdragobject.h>
57 #include <qstringlist.h>
58 #include <qmap.h>
59
60 using namespace std;
61
62 //VRV: porting on Qt 3.0.5
63 #if QT_VERSION >= 0x030005
64 #include <qcursor.h> 
65 #endif
66 //VRV: porting on Qt 3.0.5
67
68 #define UC_NEW_EMPTY_ID    1000000
69 #define UC_NEW_COMP_ID     1000002
70 #define UC_NEW_FULL_ID     1000004
71 #define UC_NEW_COPY_ID     1000006
72 #define UC_APPEND_ID       1000008
73 #define UC_REMOVE_ID       1000010
74 #define UC_RENAME_ID       1000012
75 #define UC_CLEAR_ID        1000014
76 #define UC_SET_CURRENT_ID  1000016
77
78
79 #ifdef _DEBUG_
80 static int MYDEBUG = 0;
81 #else
82 static int MYDEBUG = 0;
83 #endif
84
85
86 /*!
87   Small button which updates Object Browser's contents
88 */
89 Btn::Btn ( QWidget * parent, const char * name ) : QToolButton( parent, name ) 
90 {
91   connect( this, SIGNAL(clicked()), this, SLOT(onClicked()) );
92 }
93 void Btn::onClicked()
94 {
95   QAD_ObjectBrowser* OB = QAD_Application::getDesktop()->getActiveApp()->getActiveStudy()->getActiveStudyFrame()->getLeftFrame()->getObjectBrowser();
96   OB->Update();
97 }
98
99 /*!
100   Gets selected top-level items (i.e. not including sub-items) [ static ]
101 */
102 static void getSelectedParents( QListViewItem* listViewItem, QList<QListViewItem>& itemList )
103 {
104   QListViewItem* item = listViewItem->firstChild();
105   while ( item ) {
106     if ( item->isSelected() ) {
107       itemList.append( item );
108     }
109     else {
110       getSelectedParents( item, itemList );
111     }
112     item = item->nextSibling();
113   }
114 }
115 /*!
116   Gets selected top-level items (i.e. not including sub-items) [ static ]
117 */
118 static void getSelectedParents( QListView* listView, QList<QListViewItem>& itemList, bool ignoreRoot = false )
119 {
120   itemList.clear();
121   QListViewItem* item = listView->firstChild();
122   while ( item ) {
123     if ( item->isSelected() && !ignoreRoot ) {
124       itemList.append( item );
125     }
126     else {
127       getSelectedParents( item, itemList );
128     }
129     item = item->nextSibling();
130   }
131 }
132 /*!
133   Gets top-most parent item [ static ]
134 */
135 static QListViewItem* getTopParent( QListViewItem* item )
136 {
137   if ( !item )
138     return 0;
139   QListViewItem* p = item->parent();
140   if ( !p )
141     return item;
142   while ( p->parent() ) {
143     p = p->parent();
144   }
145   return p;
146 }
147 /*!
148   Returns true if the item is top-level (root)
149 */
150 static bool isRootItem( QListViewItem* item )
151 {
152   return ( item->listView() && !item->parent() );
153 }
154 /*!
155   Constructor
156 */
157 QAD_ObjectBrowser::QAD_ObjectBrowser( SALOMEDS::Study_var study, QWidget* parent, const char* name, WFlags fl )
158      : QTabWidget( parent, name, fl )
159 {
160   myStudy = SALOMEDS::Study::_duplicate( study );
161   myListViewMap.clear();
162   myUseCaseMap.clear();
163   myListView=0;    // must be done before setupListView(): setCornerWidget() provoque call to eventFilter
164   myUseCaseView=0; // and test myUseCaseView->viewport() before initialisation
165   setupListView();
166 }
167
168 /*!
169   Destructor
170 */
171 QAD_ObjectBrowser::~QAD_ObjectBrowser() 
172 {
173   if (!myStudy->_is_nil())
174     CORBA::release(myStudy);
175 }
176
177 /*!
178   Configures Object Browser and UseCase Browser. 
179   Columns, Selection Mode and Palette.
180 */
181 void QAD_ObjectBrowser::setupListView()
182 {
183   QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
184
185   this->setTabPosition( QTabWidget::Bottom );
186   
187   /* Reading setting : Columns for Value, OCAF Doc entry, object IOR, OCAF Doc ref entry and Chrono sorting */
188   QString AddColumn       = QAD_CONFIG->getSetting( "ObjectBrowser:AddColumn"   );
189   QString ValueColumn     = QAD_CONFIG->getSetting( "ObjectBrowser:ValueColumn" );
190   QString ShowCHRONO_SORT = QAD_CONFIG->getSetting( "ObjectBrowser:ChronologicalSort" );
191   QString showUseCase = QAD_CONFIG->getSetting("ObjectBrowser:ShowUseCaseBrowser");
192   QString noAutoSizeColumns = QAD_CONFIG->getSetting( "ObjectBrowser:NoAutoSizeColumns" );
193  
194   /* create and setup Object Browser ================================= */
195   myListView = new QListView( this, "Object Browser");
196   myListView->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
197   myListView->setMinimumSize( 1, 1 );
198   myListView->setPalette( QAD_Application::getPalette( true ) );
199
200   /* First two columns = object name and value - always visible */
201   myListView->addColumn( tr( "OBJECT_BROWSER_OBJECT" ) );   /* Adding Object column             */
202   myListView->addColumn( tr( "OBJECT_BROWSER_VALUE" ) );    /* Adding Value column              */
203   myListView->addColumn( tr( "OBJECT_BROWSER_ENTRY" ) );    /* Adding Doc entry column          */
204   myListView->addColumn( tr( "OBJECT_BROWSER_IOR" ) );      /* Adding Object IOR column         */
205   myListView->addColumn( tr( "OBJECT_BROWSER_REFENTRY" ) ); /* Adding OCAF Doc ref entry column */
206   myListView->header()->setMovingEnabled( false );
207  
208   /* Properties */
209   myListView->header()->setClickEnabled( TRUE );          /* Enable clicking on the header                    */
210   myListView->setShowSortIndicator( TRUE ) ;              /* Add user arrows to indicate the sort order : LPN */
211   myListView->setRootIsDecorated( TRUE );                 /* Enable expand/collapse control for the root item */
212   myListView->setSelectionMode ( QListView::Extended );   /* Enable multiple selection                        */
213   myListView->setVScrollBarMode( QScrollView::AlwaysOn ); /* Set scrollbars always visible                    */
214   myListView->setHScrollBarMode( QScrollView::AlwaysOn ); /* ...                                              */
215
216   myListView->setCornerWidget( new Btn( this ) );
217   /* Connect section */
218   //VRV: porting on Qt 3.0.5
219 #if QT_VERSION < 0x030005
220   connect( myListView, SIGNAL( rightButtonClicked( QListViewItem*, const QPoint&, int ) ),
221            this,       SLOT(   showPopupMenu( QListViewItem* ) ) );
222 #else
223   connect( myListView, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint&, int ) ),
224            this,       SLOT(   showPopupMenu( QListViewItem* ) ) );
225 #endif  
226   //VRV: porting on Qt 3.0.5
227
228   connect( myListView, SIGNAL( selectionChanged() ),
229            this,       SLOT( onSelectedItem() ) );
230   connect( myListView, SIGNAL( expanded( QListViewItem* ) ),
231            this,       SLOT( onExpanded( QListViewItem* ) ) );
232   connect( myListView, SIGNAL( collapsed( QListViewItem* ) ),
233            this,       SLOT( onCollapsed( QListViewItem* ) ) );
234     
235   /* create and setup UseCase Browser ================================ */
236   myVBox = new QWidget( this );
237   QVBoxLayout* vBoxLayout = new QVBoxLayout( myVBox );
238   
239   myUseCaseView = new QListView( myVBox, "UseCase Browser");
240   myUseCaseView->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
241   myUseCaseView->setMinimumSize( 1, 1 );
242   myUseCaseView->setPalette( QAD_Application::getPalette( true ) );
243
244   /* First column = object name */
245   myUseCaseView->addColumn( tr( "OBJECT_BROWSER_OBJECT" ) );
246   /* Properties */
247   myUseCaseView->header()->setClickEnabled( TRUE );          /* Enable clicking on the header                    */
248   myUseCaseView->setShowSortIndicator( TRUE ) ;              /* Add user arrows to indicate the sort order : LPN */
249   myUseCaseView->setRootIsDecorated( TRUE );                 /* Enable expand/collapse control for the root item */
250   myUseCaseView->setSelectionMode ( QListView::Extended );   /* Enable multiple selection                        */
251   myUseCaseView->setVScrollBarMode( QScrollView::AlwaysOn ); /* Set scrollbars always visible                    */
252   myUseCaseView->setHScrollBarMode( QScrollView::AlwaysOn ); /* ...                                              */
253   myUseCaseView->header()->setMovingEnabled( false );
254   myUseCaseView->viewport()->setAcceptDrops( true );
255   myUseCaseView->installEventFilter( this );
256   myUseCaseView->viewport()->installEventFilter( this );
257   myUseCaseView->setSorting( -1 ) ;
258   vBoxLayout->addWidget( myUseCaseView ); 
259
260   myUseCaseView->setCornerWidget( new Btn( this ) );
261
262   myNewBtn = new QToolButton( myVBox );
263   myNewBtn->setIconSet( resMgr->loadPixmap( "QAD", tr("ICON_UC_NEW") ) );
264   myNewBtn->setAutoRaise( true );
265   QToolTip::add( myNewBtn, tr( "UC_NEW_ID" ), QAD_Application::getDesktop()->toolTipGroup(), tr( "UC_NEW_TIP" ) );
266   myAddBtn = new QToolButton( myVBox );
267   myAddBtn->setIconSet( resMgr->loadPixmap( "QAD", tr("ICON_UC_ADD") ) );
268   myAddBtn->setAutoRaise( true );
269   QToolTip::add( myAddBtn, tr( "UC_APPEND_ID" ), QAD_Application::getDesktop()->toolTipGroup(), tr( "UC_APPEND_TIP" ) );
270   myDelBtn = new QToolButton( myVBox );
271   myDelBtn->setIconSet( resMgr->loadPixmap( "QAD", tr("ICON_UC_REMOVE") ) );
272   myDelBtn->setAutoRaise( true );
273   QToolTip::add( myDelBtn, tr( "UC_REMOVE_ID" ), QAD_Application::getDesktop()->toolTipGroup(), tr( "UC_REMOVE_TIP" ) );
274   myClearBtn = new QToolButton( myVBox );
275   myClearBtn->setIconSet( resMgr->loadPixmap( "QAD", tr("ICON_UC_CLEAR") ) );
276   myClearBtn->setAutoRaise( true );
277   QToolTip::add( myClearBtn, tr( "UC_CLEAR_ID" ), QAD_Application::getDesktop()->toolTipGroup(), tr( "UC_CLEAR_TIP" ) );
278   myCurrentBtn = new QToolButton( myVBox );
279   myCurrentBtn->setIconSet( resMgr->loadPixmap( "QAD", tr("ICON_UC_SET_CURRENT") ) );
280   myCurrentBtn->setAutoRaise( true );
281   QToolTip::add( myCurrentBtn, tr( "UC_SET_CURRENT_ID" ), QAD_Application::getDesktop()->toolTipGroup(), tr( "UC_SET_CURRENT_TIP" ) );
282
283   QHBoxLayout* btnLayout = new QHBoxLayout;
284   btnLayout->setMargin( 3 ); btnLayout->setSpacing( 3 );
285   btnLayout->addWidget( myNewBtn );
286   btnLayout->addStretch();
287   btnLayout->addSpacing( 5 );
288   btnLayout->addStretch();
289   btnLayout->addWidget( myAddBtn );
290   btnLayout->addWidget( myDelBtn );
291   btnLayout->addStretch();
292   btnLayout->addSpacing( 5 );
293   btnLayout->addStretch();
294   btnLayout->addWidget( myClearBtn );
295   btnLayout->addStretch();
296   btnLayout->addSpacing( 5 );
297   btnLayout->addStretch();
298   btnLayout->addWidget( myCurrentBtn );
299   btnLayout->addStretch();
300
301   vBoxLayout->addLayout( btnLayout ); 
302
303   connect( myNewBtn,     SIGNAL( clicked() ), this, SLOT( onUseCaseBtn() ) );
304   connect( myAddBtn,     SIGNAL( clicked() ), this, SLOT( onUseCaseBtn() ) );
305   connect( myDelBtn,     SIGNAL( clicked() ), this, SLOT( onUseCaseBtn() ) );
306   connect( myClearBtn,   SIGNAL( clicked() ), this, SLOT( onUseCaseBtn() ) );
307   connect( myCurrentBtn, SIGNAL( clicked() ), this, SLOT( onUseCaseBtn() ) );
308
309   /* Connect section */
310 #if QT_VERSION < 0x030005
311   connect( myUseCaseView, SIGNAL( rightButtonClicked( QListViewItem*, const QPoint&, int ) ),
312            this,       SLOT(   showPopupMenu( QListViewItem* ) ) );
313 #else
314   connect( myUseCaseView, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint&, int ) ),
315            this,       SLOT(   showPopupMenu( QListViewItem* ) ) );
316 #endif  
317   
318   connect( myUseCaseView, SIGNAL( selectionChanged() ),
319            this,       SLOT( onSelectedItem() ) );
320
321   /* add Object Browser and UseCase Browser as pages ================= */
322   this->addTab( myListView,    tr( "TLT_OBJECT_BROWSER" ) );
323   this->addTab( myVBox, tr( "TLT_USECASE_BROWSER" ) );
324   
325   if ( showUseCase != "true")
326     this->removePage(myVBox);
327  
328   setShowInfoColumns( AddColumn == "true" );
329   setShowValueColumn( ValueColumn == "true" );
330   setEnableChronoSort( ShowCHRONO_SORT == "true" );
331   
332   if ( noAutoSizeColumns == "true" ) 
333     {
334       for (int i = 0; i < myListView->header()->count(); i++ )
335         myListView->setColumnWidthMode(i, QListView::Manual);
336     }
337
338   resize( QSize( 100, 400 ) );
339 }
340
341 /*!
342   Event filter
343 */
344
345 bool QAD_ObjectBrowser::eventFilter( QObject* o, QEvent* e )
346 {
347   QAD_Desktop* Desktop     = (QAD_Desktop*) QAD_Application::getDesktop();
348   QAD_Study* myActiveStudy = Desktop->getActiveStudy();
349  
350   if ( myStudy->_is_nil() )
351     return QTabWidget::eventFilter( o, e );
352
353   SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
354   if (! myUseCaseView) return QTabWidget::eventFilter( o, e );
355   if (o == myUseCaseView->viewport()) {
356     if ( e->type() == QEvent::MouseButtonPress ) {
357       // Test if clicked on selection and start drag if necessary
358       QMouseEvent* me = ( QMouseEvent* )e;
359       QAD_ObjectBrowserItem* item = ( QAD_ObjectBrowserItem* )( myUseCaseView->itemAt( me->pos() ) );
360       if ( item && item->isSelected() && me->button() == LeftButton) {
361         if ( me->pos().x() > myUseCaseView->header()->sectionPos( myUseCaseView->header()->mapToIndex( 0 ) ) +
362                              myUseCaseView->treeStepSize() * ( item->depth() + ( myUseCaseView->rootIsDecorated() ? 1 : 0 ) ) + 
363                              myUseCaseView->itemMargin() ||
364              me->pos().x() < myUseCaseView->header()->sectionPos( myUseCaseView->header()->mapToIndex( 0 ) ) ) { 
365           QStringList entryList;
366           QListViewItemIterator it( myUseCaseView );
367           bool done = true;
368           for ( ; it.current(); ++it ) {
369             QAD_ObjectBrowserItem* selItem = ( QAD_ObjectBrowserItem* )( it.current() );
370             if ( selItem->isSelected() ) {
371               if ( isRootItem( selItem ) ) {
372                 done = false;
373                 break;
374               }
375               else {
376                 entryList.append( selItem->getEntry() );
377               }
378             }
379           }
380           if ( done && !entryList.isEmpty() ) {
381             QTextDrag *d = new QTextDrag( entryList.join("*"), myUseCaseView->viewport() );
382             d->dragMove();
383             return true;
384           }
385         }
386       }
387     }
388     else if ( e->type() == QEvent::DragMove ) {
389       QDragMoveEvent* dme = ( QDragMoveEvent* )e;
390       if ( dme->source() == myUseCaseView->viewport() ) {
391         dme->accept();
392       }
393       else {
394         dme->ignore();
395       }
396       return true;
397     }
398     else if ( e->type() == QEvent::Drop ) {
399       QDropEvent* de = ( QDropEvent* )e;
400       QString text;
401       QAD_ObjectBrowserItem* dropItem = ( QAD_ObjectBrowserItem* )( myUseCaseView->itemAt( de->pos() ) );
402       if ( de->source() == myUseCaseView->viewport() ) {
403         if ( QTextDrag::decode( de, text ) && dropItem && !dropItem->isSelected() ) {
404           QAD_ObjectBrowserItem* useCaseItem = ( QAD_ObjectBrowserItem* )getTopParent( dropItem );
405           if ( useCaseItem ) {
406             if ( !UCBuilder->_is_nil() ) {
407               UCBuilder->SetRootCurrent();
408               if ( useCaseItem != dropItem ) {
409                 SALOMEDS::SObject_var dropObject = myStudy->FindObjectID( dropItem->getEntry() );
410                 if ( !dropObject->_is_nil() )
411                   UCBuilder->SetCurrentObject( dropObject );
412               }
413               QStringList entryList = QStringList::split( "*", text, false );
414               // if Move action then first remove all selected items
415               if ( de->action() == QDropEvent::Move ) {
416                 QList<QListViewItem> ucSelected; 
417                 ucSelected.setAutoDelete( false );
418                 getSelectedParents( myUseCaseView, ucSelected );
419                 for ( int j = 0; j < entryList.count(); j++ ) {
420                   QAD_ObjectBrowserItem* delItem = ( QAD_ObjectBrowserItem* )( ucSelected.at( j ) );
421                   QAD_ObjectBrowserItem* ucDelItem = ( QAD_ObjectBrowserItem* )getTopParent( delItem );
422                   SALOMEDS::SObject_var delSO = myStudy->FindObjectID( delItem->getEntry() );
423                   if ( !delSO->_is_nil() && ucDelItem ) {
424                     UCBuilder->Remove( delSO );
425                   }
426                 }
427               }
428               // then try to append items to destination
429               for ( int i = 0; i < entryList.count(); i++ ) {
430                 SALOMEDS::SObject_var SO = myStudy->FindObjectID( entryList[i] );
431                 if ( !SO->_is_nil() ) {
432                   UCBuilder->Remove( SO );
433                   UCBuilder->Append( SO );
434                 }
435               }
436               myActiveStudy->updateUseCaseBrowser();
437             }
438           }
439         }
440         de->acceptAction();
441       }
442       else {
443         de->ignore();
444       }
445       return true;
446     }
447   }
448   else if ( o == myUseCaseView ) {
449     if ( e->type() == QEvent::KeyPress ) {
450       QKeyEvent* ke = ( QKeyEvent* )e;
451       if ( ke->key() == Key_Delete ) {
452         onUseCasePopupMenu( UC_REMOVE_ID );
453         return true;
454       }
455     }
456   }
457   return QTabWidget::eventFilter( o, e );
458 }
459
460
461 /*!
462   Returns true if item is collapsed has collapsed children
463 */
464 static bool hasCollapsed( QListViewItem* item )
465 {
466   if ( !item )
467     return false;
468
469   bool res = ( item->childCount() && !item->isOpen() );
470   for ( QListViewItem* child = item->firstChild(); !res && child; child = child->nextSibling() )
471     res = hasCollapsed( child );
472
473   return res;
474 }
475
476 /*!
477   Expands item and all its children
478 */
479 static void expand(QListViewItem* item)
480 {
481   if ( !item )
482     return;
483
484   item->setOpen( true );
485
486   for ( QListViewItem* child = item->firstChild(); child; child = child->nextSibling() )
487     expand( child );
488 }
489
490 /*!
491   Builds popup menu
492 */
493 void QAD_ObjectBrowser::onCreatePopup()
494 {
495   QAD_Desktop*     Desktop = (QAD_Desktop*) QAD_Application::getDesktop();
496   QAD_Study*   myActiveStudy = Desktop->getActiveStudy();
497   SALOME_Selection*      Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
498
499   bool canExpand = false;
500   /* VSR : Creation of common POPUP menu for Object Browser/Use Case Browser */
501   if ( Sel->IObjectCount() > 0 ) {
502     QString theContext;
503     QString theParent;
504     QString theObject;
505     
506     Desktop->definePopup( theContext, theParent, theObject );
507     if ( myPopup ) {
508       Desktop->createPopup( myPopup, theContext, "ObjectBrowser", theObject);
509       if ( !Desktop->getActiveComponent().isEmpty() ) {
510         Desktop->customPopup( myPopup, theContext, "ObjectBrowser", theObject );
511       }
512       // VSR:22/01/03 - Command for edit attributes value
513       bool EditValues  = QAD_CONFIG->getSetting( "ObjectBrowser:EditValues" ) == "true";
514       if ( EditValues && Sel->IObjectCount() == 1 && hasEditableAttribute(Sel->firstIObject()) ) {
515         if ( myPopup->count() > 0 )
516           myPopup->insertSeparator();
517         myPopup->insertItem( tr( "EDIT_VALUE_CMD" ),
518                              this,
519                              SLOT( onEditAttribute() ) );
520       }
521
522       for ( QListViewItemIterator it( currentPage() == myListView ? myListView : myUseCaseView ); it.current() && !canExpand; ++it )
523         canExpand = canExpand || ( it.current()->isSelected() && hasCollapsed( it.current() ) );
524
525       if ( canExpand ) {
526         if ( myPopup->count() > 0 )
527           myPopup->insertSeparator();
528         myPopup->insertItem( tr( "EXPAND_ALL_CMD" ),
529                              this,
530                              SLOT( onExpandAll() ) );
531       }
532     }
533   } else {
534     // NRI 02/12/2002
535     // No selected item => it's not necessary to create popup
536     //NRI- :  Desktop->createPopup( myPopup, "", "ObjectBrowser", "");
537   }
538   if ( currentPage() != myListView ) {
539     /* VSR : Creation of POPUP menu for UseCase Browser */
540     QList<QListViewItem> ucSelected; 
541     ucSelected.setAutoDelete( false );
542     getSelectedParents( myUseCaseView, ucSelected );
543     
544     if ( myPopup && !myStudy->_is_nil() ) {
545       SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
546 //      myPopup->clear();
547       bool isOne = ucSelected.count() == 1;
548       bool isRoot = isOne && isRootItem( ucSelected.at( 0 ) );
549       bool manyChildren = myUseCaseView->childCount() > 0 && myUseCaseView->firstChild()->childCount() > 0;
550       bool isUseCase = isOne && 
551         ( isRoot || UCBuilder->IsUseCase( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) ) ); 
552
553       if ( isRoot ) {
554         myPopup->clear();
555         if ( canExpand ) {
556           myPopup->insertItem( tr( "EXPAND_ALL_CMD" ),
557                                this,
558                                SLOT( onExpandAll() ) );
559         }
560       }
561       QPopupMenu *UseCasePopup = new QPopupMenu( myPopup );
562       if ( isOne )
563         UseCasePopup->insertItem( tr( "UC_NEW_ID" ), this, SLOT( onUseCasePopupMenu( int ) ), 0, UC_NEW_EMPTY_ID );
564       if ( isOne )
565         UseCasePopup->insertItem( tr( "UC_SET_CURRENT_ID" ), this, SLOT( onUseCasePopupMenu( int ) ), 0, UC_SET_CURRENT_ID );
566       if ( isUseCase )
567         UseCasePopup->insertItem( tr( "UC_RENAME_ID" ),    this, SLOT( onUseCasePopupMenu( int ) ), 0, UC_RENAME_ID );
568       if ( isRoot && manyChildren )
569         UseCasePopup->insertItem( tr( "UC_CLEAR_ID" ),   this, SLOT( onUseCasePopupMenu( int ) ), 0, UC_CLEAR_ID );
570
571       if ( UseCasePopup->count() > 0 ) {
572         if ( myPopup->count() > 0 )
573           myPopup->insertSeparator();
574         myPopup->insertItem( tr( "UC_POPUP" ), UseCasePopup );
575       }
576       else {
577         delete UseCasePopup;
578       }
579     }
580   }
581 }
582
583 /*!
584   Called on "Expand all" popup menu command
585 */
586 void QAD_ObjectBrowser::onExpandAll()
587 {
588   for ( QListViewItemIterator it( currentPage() == myListView ? myListView : myUseCaseView ); it.current(); ++it )
589     if ( it.current()->isSelected() )
590       expand( it.current() );  
591 }
592
593 /*!
594   Returns Object Browser list view
595 */
596 QListView* QAD_ObjectBrowser::getListView() const
597 {
598   return myListView;
599 }
600
601 /*!
602   Returns UseCase Browser list view
603 */
604 QListView* QAD_ObjectBrowser::getUseCaseView() const
605 {
606   return myUseCaseView;
607 }
608
609 /*!
610   Adds anItem ( probably a SComponent )
611 */
612 QAD_ObjectBrowserItem* QAD_ObjectBrowser::AddItem(QListView*             theView,
613                                                   const QString&         theName,
614                                                   const QString&         theEntry,
615                                                   const QString&         theIOR, 
616                                                   int                    theType, 
617                                                   const QString&         theValue,
618                                                   QAD_ObjectBrowserItem* theAfter)
619
620 {
621   QAD_ObjectBrowserItem* last = (QAD_ObjectBrowserItem*)(theView->firstChild());
622   if ( theAfter )
623     last = theAfter;
624   else if ( last ) {
625     for ( ; last->nextSibling(); last = (QAD_ObjectBrowserItem*)(last->nextSibling()) );
626   }
627   QAD_ObjectBrowserItem* anItem = new QAD_ObjectBrowserItem( theView, last );
628   
629   anItem->setType( theType );
630   anItem->setOpen( FALSE );
631   anItem->setName( theName );
632   anItem->setValue( theValue );
633   anItem->setEntry( theEntry );
634   anItem->setIOR( theIOR );
635   anItem->setReference( "" );
636
637   return anItem;
638 }
639
640 /*!
641   Adds anItem ( probably a StudyObject )
642 */
643 QAD_ObjectBrowserItem* QAD_ObjectBrowser::AddItem(QAD_ObjectBrowserItem* theParentItem,
644                                                   const QString&         theName,
645                                                   const QString&         theEntry,
646                                                   const QString&         theIOR,
647                                                   int                    theType,
648                                                   const QString&         theRef,
649                                                   const QString&         theValue,
650                                                   QAD_ObjectBrowserItem* theAfter)
651
652 {
653   QAD_ObjectBrowserItem* last = (QAD_ObjectBrowserItem*)(theParentItem->firstChild());
654   if ( theAfter )
655     last = theAfter;
656   else if ( last ) {
657     for ( ; last->nextSibling(); last = (QAD_ObjectBrowserItem*)(last->nextSibling()) );
658   }
659   QAD_ObjectBrowserItem* anItem = new QAD_ObjectBrowserItem(theParentItem, last);
660   anItem->setType( theType );
661   anItem->setOpen( FALSE );
662   anItem->setName( theName );
663   anItem->setValue( theValue );
664   anItem->setEntry( theEntry );
665   anItem->setIOR( theIOR );
666   anItem->setReference( theRef );
667
668   return anItem;
669 }
670
671 /*!
672   Updates Object Browsers' item [ protected ]
673 */
674 void QAD_ObjectBrowser::Update( SALOMEDS::SObject_ptr SO,
675                                 QAD_ObjectBrowserItem* theParentItem )
676 {
677   if ( myStudy->_is_nil() || SO->_is_nil() || !theParentItem ) {
678     return;
679   }
680   SALOMEDS::ChildIterator_var it = myStudy->NewChildIterator(SO);
681
682   for (; it->More();it->Next()) {
683     SALOMEDS::SObject_var             CSO = it->Value();
684     SALOMEDS::SObject_var             RefSO;
685     QString                           ior = "";
686     CORBA::String_var                 aString(CSO->GetID());
687     QString                           CSOEntry(aString.in());
688     SALOMEDS::GenericAttribute_var    anAttr;
689     SALOMEDS::AttributeName_var       aName;
690     SALOMEDS::AttributeComment_var    aCmnt;
691     SALOMEDS::AttributeIOR_var        anIOR;
692     SALOMEDS::AttributeReal_var       aReal;
693     SALOMEDS::AttributeInteger_var    anInt;
694     SALOMEDS::AttributeSelectable_var aSelectable;
695     SALOMEDS::AttributeExpandable_var anExpandable;
696     SALOMEDS::AttributeOpened_var     anOpened;
697     SALOMEDS::AttributePixMap_var     aPixmap;
698     SALOMEDS::AttributeTextColor_var  aTextColor;
699     SALOMEDS::AttributeTextHighlightColor_var  aTextHighlightColor;
700
701     QAD_ObjectBrowserItem*            Item = 0;
702     QString                           valueString;
703    
704     if ( CSO->ReferencedObject(RefSO) && !RefSO->_is_nil() ) {
705       
706       aString = RefSO->GetID();
707       QString RefSOEntry(aString.in());
708       if (CSO->FindAttribute(anAttr, "AttributeName") || RefSO->FindAttribute(anAttr, "AttributeName")) {
709         aName = SALOMEDS::AttributeName::_narrow(anAttr);
710         if (RefSO->FindAttribute(anAttr, "AttributeIOR")) {
711           anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
712           aString = anIOR->Value();
713           ior = aString.in();
714         }
715         valueString = getValueFromObject( RefSO );
716         aString = aName->Value();
717         Item = AddItem(theParentItem, 
718                        QString(" * ") + aString.in(), 
719                        RefSOEntry, 
720                        ior, 
721                        2, 
722                        CSOEntry, 
723                        valueString);
724         myListViewMap[ RefSOEntry ].append( Item );
725       }
726       else {
727         if(MYDEBUG) MESSAGE("QAD_ObjectBrowser::Update : noname item: "<<CSO->GetID());
728       }
729     } else {
730       // getting Value
731       valueString = getValueFromObject( CSO );
732       // getting IOR
733       if (CSO->FindAttribute(anAttr, "AttributeIOR"))  {
734         anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
735         aString = anIOR->Value();
736         ior = aString.in();
737       }
738       // getting Name and adding new Item
739       if (CSO->FindAttribute(anAttr, "AttributeName") ) {
740         aName = SALOMEDS::AttributeName::_narrow(anAttr);
741         aString = aName->Value();
742         Item = AddItem(theParentItem, aString.in(), CSOEntry, ior, 0, "", valueString);
743         myListViewMap[ CSOEntry ].append( Item );
744       } 
745       else {
746         if(MYDEBUG) MESSAGE("QAD_ObjectBrowser::Update : noname item: "<<CSO->GetID());
747       }
748       // adding other attributes 
749       if (Item) {
750         // Selectable
751         if ( CSO->FindAttribute(anAttr, "AttributeSelectable") ) {
752           aSelectable = SALOMEDS::AttributeSelectable::_narrow(anAttr);
753           Item->setSelectable(aSelectable->IsSelectable());
754         }
755         // Expandable
756         if ( CSO->FindAttribute(anAttr, "AttributeExpandable") ) {
757           anExpandable = SALOMEDS::AttributeExpandable::_narrow(anAttr);
758           Item->setExpandable(anExpandable->IsExpandable());
759         }
760         // Opened
761         if ( CSO->FindAttribute(anAttr, "AttributeOpened") ) {
762           anOpened = SALOMEDS::AttributeOpened::_narrow(anAttr);
763           Item->setOpen(anOpened->IsOpened());
764         }
765         // TextColor
766         if ( CSO->FindAttribute(anAttr, "AttributeTextColor") ) {
767           aTextColor = SALOMEDS::AttributeTextColor::_narrow(anAttr);
768           QColor aColor((int)(aTextColor->TextColor().R), (int)(aTextColor->TextColor().G), (int)(aTextColor->TextColor().B)) ;
769           Item->setTextColor(aColor);
770         }
771         // TextHighlightColor
772         if ( CSO->FindAttribute(anAttr, "AttributeTextHighlightColor") ) {
773           aTextHighlightColor = SALOMEDS::AttributeTextHighlightColor::_narrow(anAttr);
774           QColor aColor((int)(aTextHighlightColor->TextHighlightColor().R), 
775                         (int)(aTextHighlightColor->TextHighlightColor().G), 
776                         (int)(aTextHighlightColor->TextHighlightColor().B)) ;
777           Item->setTextHighlightColor(aColor);
778         }
779         // Pixmap
780         if ( CSO->FindAttribute(anAttr, "AttributePixMap") ) {
781           aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
782           if ( aPixmap->HasPixMap() ) {
783             SALOMEDS::SComponent_var father = CSO->GetFatherComponent();
784             if (father->FindAttribute(anAttr, "AttributeName") ) {
785               SALOMEDS::AttributeName_var aFatherName;
786               aFatherName = SALOMEDS::AttributeName::_narrow(anAttr);
787
788               QString msg;
789               QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
790               if ( resMgr ) {
791                 //if(resMgr->loadResources( QString(aFatherName->Value()) + "GUI", msg )) {
792                 if( resMgr->loadResources( QAD_Application::getDesktop()->getComponentName( QString( aFatherName->Value() ) ), msg ) ) {
793                   QPixmap icon ( resMgr->loadPixmap( QAD_Application::getDesktop()->getComponentName( QString( aFatherName->Value() ) ),
794                                                     tr( aPixmap->GetPixMap() )  /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ) );
795                   //QPixmap icon ( resMgr->loadPixmap( QString(aFatherName->Value()) + "GUI",
796                   //tr(aPixmap->GetPixMap()) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ));
797                   Item->setPixmap( 0, icon );
798                 }
799               }
800             }
801           }
802         }
803       } 
804     }
805 //  if ( theParentItem->isOpen() )
806 //    Item->setOpen(TRUE);
807
808     if ( Item )
809       Update(CSO, Item);
810   }
811 }
812
813 /*!
814   Updates Object Browser tree and UseCase Browser tree
815 */
816 void QAD_ObjectBrowser::Update()
817 {
818   int xc = myListView->contentsX();
819   int yc = myListView->contentsY();
820   myListView->viewport()->setUpdatesEnabled( false );
821  
822   myListView->clear();
823   myListViewMap.clear();
824
825   if ( myStudy->_is_nil() ) {
826     return;
827   }
828
829   QString ShowIAPP = QAD_CONFIG->getSetting("ObjectBrowser:IAPP");
830
831   /* Updating Object Browser ============================================== */
832   SALOMEDS::SComponentIterator_var itcomp = myStudy->NewComponentIterator();
833   for (; itcomp->More(); itcomp->Next()) {
834     QAD_ObjectBrowserItem*   Item     = 0;
835     SALOMEDS::SComponent_var SC       = itcomp->Value();
836     CORBA::String_var        aString  = SC->ComponentDataType();
837     QString                  dataType = aString.in();
838     QString                  ior      = "";
839     aString = SC->GetID();
840     QString                  SCEntry  = aString.in();
841
842     SALOMEDS::GenericAttribute_var    anAttr;
843     SALOMEDS::AttributeName_var       aName;
844     SALOMEDS::AttributeComment_var    aCmnt;
845     SALOMEDS::AttributeIOR_var        anIOR;
846     SALOMEDS::AttributeReal_var       aReal;
847     SALOMEDS::AttributeInteger_var    anInt;
848     SALOMEDS::AttributeSelectable_var aSelectable;
849     SALOMEDS::AttributeExpandable_var anExpandable;
850     SALOMEDS::AttributeOpened_var     anOpened;
851     SALOMEDS::AttributePixMap_var     aPixmap;
852     SALOMEDS::AttributeTextColor_var  aTextColor;
853     SALOMEDS::AttributeTextHighlightColor_var  aTextHighlightColor;
854
855     if (SC->FindAttribute(anAttr, "AttributeIOR")) {
856       anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
857       aString = anIOR->Value();
858       ior = aString.in();
859     }
860
861     bool caseIAPP = false;
862
863     // create data-tree item, corresponding to component (and set name if component has it)
864     if ( dataType.compare("Interface Applicative") == 0 ) {
865       caseIAPP = true;
866       if ( ShowIAPP.compare("true") == 0 ) {
867         if (SC->FindAttribute(anAttr, "AttributeName")) {
868           aName = SALOMEDS::AttributeName::_narrow(anAttr);
869           aString = aName->Value();
870           Item = AddItem (myListView, aString.in(), SCEntry.latin1(), ior, 1, "");
871           myListViewMap[ SCEntry ].append( Item );
872         } 
873         else {
874           Item = AddItem (myListView, dataType, SCEntry, ior, 1, "");
875           myListViewMap[ SCEntry ].append( Item );
876         }
877
878       }
879     } 
880     else {
881       caseIAPP = false;
882       if (SC->FindAttribute(anAttr, "AttributeName")) {
883         aName = SALOMEDS::AttributeName::_narrow(anAttr);
884         aString = aName->Value();
885         Item = AddItem (myListView, aString.in(), SCEntry, ior, 1, "");
886         myListViewMap[ SCEntry ].append( Item );
887       } 
888       else {
889         /*In according to CAF - any label (even if it is empty) exist during to whole session.
890           So, if label haven't an "AttributeName" it is means that the label is empty.
891           Therefore follow action couses bug - 
892         Item = AddItem (myListView, dataType,       SC->GetID(), ior, 1, "");
893         */
894       }
895     }
896     // add other attributes 
897     if (Item) {
898       // Selectable
899       if ( SC->FindAttribute(anAttr, "AttributeSelectable") ) {
900         aSelectable = SALOMEDS::AttributeSelectable::_narrow(anAttr);
901         Item->setSelectable(aSelectable->IsSelectable());
902       }
903       // Expandable
904       if ( SC->FindAttribute(anAttr, "AttributeExpandable") ) {
905         anExpandable = SALOMEDS::AttributeExpandable::_narrow(anAttr);
906         Item->setExpandable(anExpandable->IsExpandable());
907       }
908       // Opened
909       if ( SC->FindAttribute(anAttr, "AttributeOpened") ) {
910         anOpened = SALOMEDS::AttributeOpened::_narrow(anAttr);
911         Item->setOpen(anOpened->IsOpened());
912       }
913       // TextColor
914       if ( SC->FindAttribute(anAttr, "AttributeTextColor") ) {
915         aTextColor = SALOMEDS::AttributeTextColor::_narrow(anAttr);
916         QColor aColor((int)(aTextColor->TextColor().R), (int)(aTextColor->TextColor().G), (int)(aTextColor->TextColor().B)) ;
917         Item->setTextColor(aColor);
918       }
919       // TextHighlightColor
920       if ( SC->FindAttribute(anAttr, "AttributeTextHighlightColor") ) {
921         aTextHighlightColor = SALOMEDS::AttributeTextHighlightColor::_narrow(anAttr);
922         QColor aColor((int)(aTextHighlightColor->TextHighlightColor().R), 
923                       (int)(aTextHighlightColor->TextHighlightColor().G), 
924                       (int)(aTextHighlightColor->TextHighlightColor().B)) ;
925         Item->setTextHighlightColor(aColor);
926       }
927       
928       // Pixmap
929       if ( SC->FindAttribute(anAttr, "AttributePixMap") ) {
930         aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
931         if ( aPixmap->HasPixMap() ) {
932           QString msg;
933           QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
934           if ( resMgr ) {
935             if(MYDEBUG) MESSAGE ( " Component " << aName->Value() );
936             if(MYDEBUG) MESSAGE ( " Icon " << aPixmap->GetPixMap() );
937             if(resMgr->loadResources( QAD_Application::getDesktop()->getComponentName(QString(aName->Value())), msg )) {
938               QPixmap icon ( resMgr->loadPixmap( QAD_Application::getDesktop()->getComponentName(QString(aName->Value())),
939                                                  tr(aPixmap->GetPixMap()) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ));
940               Item->setPixmap( 0, icon );
941             }
942           }
943         }
944       }
945       /*
946          if ( strcmp(dataType, TypeComponent) == 0 )
947          Item->setOpen(TRUE);
948       */
949       if ( caseIAPP && ShowIAPP.compare("true") == 0 )
950         Update (SC, Item);
951       
952       if ( !caseIAPP )
953         Update (SC, Item);
954     }
955   }
956   myListView->setContentsPos(xc,yc);
957
958   myListView->viewport()->setUpdatesEnabled( true );
959   myListView->viewport()->repaint( false );
960   /* Updating UseCase Browser ============================================= */
961   if ( this->count() > 1 ) 
962     UpdateUseCaseBrowser(); 
963
964
965 /*!
966   Removes item with all childs from the map - used to optimize UseCase browser update
967 */
968 void removeFromMap( ItemMap& theMap, QAD_ObjectBrowserItem* item )
969 {
970   if ( item ) {
971     QAD_ObjectBrowserItem* subItem = ( QAD_ObjectBrowserItem* )( item->firstChild() );
972     while ( subItem ) {
973       removeFromMap( theMap, subItem );
974       subItem = ( QAD_ObjectBrowserItem* )( subItem->nextSibling() );
975     }
976     if ( theMap.contains( item->getEntry() ) ) {
977       theMap[ item->getEntry() ].removeRef( item );
978       if ( theMap[ item->getEntry() ].isEmpty() ) {
979         theMap.remove( item->getEntry() );
980       }
981     }
982   }
983 }
984
985 /*!
986   Updates only UseCase Browser
987 */
988 void QAD_ObjectBrowser::UpdateUseCaseBrowser() {
989 //  myUseCaseView->clear(); myUseCaseMap.clear();
990   if ( myStudy->_is_nil() || this->count()<2 ) {
991     return;
992   }
993   myUseCaseView->blockSignals( true );
994 //  myUseCaseView->setUpdatesEnabled( false );
995
996   QAD_ObjectBrowserItem* root = ( QAD_ObjectBrowserItem* )myUseCaseView->firstChild();
997   SALOMEDS::UseCaseBuilder_var  UCBuilder = myStudy->GetUseCaseBuilder();
998   SALOMEDS::SObject_var SOCurrent = UCBuilder->GetCurrentObject();
999   CORBA::String_var aString = UCBuilder->GetName();
1000   QString UCName = aString.in();
1001   if ( UCName.isEmpty() )
1002     UCName = QString( tr( "Root" ) );
1003   // creating root item if is not yet created
1004   if ( !root ) {
1005     root = AddItem( myUseCaseView, UCName, "0:2", "", 1, "" );
1006     myUseCaseMap[ "0:2" ].append( root );
1007   }
1008   else
1009     root->setName( UCName );
1010   // setting it current if necessary
1011   root->setCurrent( SOCurrent->_is_nil() || !strcmp( SOCurrent->GetID(), "0:2" ) );
1012   // updating list view...
1013   QMap<QString,SALOMEDS::SObject_var> ucList;
1014   SALOMEDS::UseCaseIterator_var UCIter = UCBuilder->GetUseCaseIterator( SALOMEDS::SObject::_nil() );
1015   if ( !UCIter->_is_nil() ) {
1016     for ( ; UCIter->More(); UCIter->Next() ) {
1017       SALOMEDS::SObject_var UCObject = UCIter->Value();
1018       aString = UCObject->GetID();
1019       QString UCEntry = aString.in();
1020       ucList[ UCEntry ] = UCObject;
1021     }
1022   }
1023   // ... 1) delete removed items
1024   QAD_ObjectBrowserItem* childItem = ( QAD_ObjectBrowserItem* )root->firstChild();
1025   while ( childItem ) {
1026     QAD_ObjectBrowserItem* prevItem = childItem;
1027     childItem = ( QAD_ObjectBrowserItem* )childItem->nextSibling();
1028     if ( !ucList.contains( prevItem->getEntry() ) ) {
1029 //      myUseCaseMap[ prevItem->getEntry() ].removeRef( prevItem );
1030 //      if ( myUseCaseMap[ prevItem->getEntry() ].isEmpty() )
1031 //      myUseCaseMap.remove( prevItem->getEntry() );
1032       removeFromMap( myUseCaseMap, prevItem );
1033       delete prevItem;
1034     }
1035   }
1036   // ... 2) create/update existing
1037   QMap<QString,SALOMEDS::SObject_var>::Iterator it;
1038   for ( it = ucList.begin(); it != ucList.end(); ++it ) {
1039     UpdateUCItem( it.data(), root );
1040   }
1041   myUseCaseView->blockSignals( false );
1042 //  myUseCaseView->setUpdatesEnabled( true );
1043 //  myUseCaseView->update();
1044 //  UCItem->setOpen( true );
1045 }
1046
1047 /*!
1048   Updates UseCase Browser's item
1049 */
1050 void QAD_ObjectBrowser::UpdateUCItem( SALOMEDS::SObject_var UCObject, QAD_ObjectBrowserItem* UCItem )
1051 {
1052   if ( myStudy->_is_nil() || !UCItem ) 
1053     return;
1054
1055   // --- VSR: 01/02/05 --- start
1056   // skip all 'Interface Applicative' objects
1057   SALOMEDS::SComponent_var SCO = UCObject->GetFatherComponent();
1058   CORBA::String_var aCorbaString = SCO->ComponentDataType();
1059   QString dataType = aCorbaString.in();
1060   if ( dataType.compare("Interface Applicative") == 0 )
1061     return;
1062   // --- VSR: 01/02/05 --- finish
1063
1064   /* Creating SObjects item */
1065   SALOMEDS::SObject_var                      RefSO;
1066   SALOMEDS::GenericAttribute_var             anAttr;
1067   SALOMEDS::AttributeName_var                aName;
1068   SALOMEDS::AttributeIOR_var                 anIOR;
1069   SALOMEDS::AttributeSelectable_var          aSelectable;
1070   SALOMEDS::AttributeExpandable_var          anExpandable;
1071   SALOMEDS::AttributePixMap_var              aPixmap;
1072   SALOMEDS::AttributeTextColor_var           aTextColor;
1073   SALOMEDS::AttributeTextHighlightColor_var  aTextHighlightColor;
1074   QString                                    valueString;
1075   QString                                    ior = "";
1076   CORBA::String_var                          aString = UCObject->GetID();
1077   QString                                    UCEntry = aString.in();
1078
1079   SALOMEDS::UseCaseBuilder_var               UCBuilder = myStudy->GetUseCaseBuilder();
1080   SALOMEDS::SObject_var                      SOCurrent = UCBuilder->GetCurrentObject();
1081   bool                                       isUseCase = UCBuilder->IsUseCase( UCObject );
1082
1083   QAD_ObjectBrowserItem* UCSubItem = 0;
1084   if ( myUseCaseMap.contains( UCEntry ) && myUseCaseMap[ UCEntry ].count() > 0 )
1085     UCSubItem = myUseCaseMap[ UCEntry ].first();
1086
1087   if ( UCObject->ReferencedObject( RefSO ) && !RefSO->_is_nil() ) {
1088     aString = RefSO->GetID();
1089     QString RefSOEntry = aString.in();
1090     if ( UCObject->FindAttribute( anAttr, "AttributeName" ) || RefSO->FindAttribute( anAttr, "AttributeName" ) ) {
1091       aName = SALOMEDS::AttributeName::_narrow( anAttr );
1092       if ( RefSO->FindAttribute( anAttr, "AttributeIOR" ) ) {
1093         anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr );
1094         aString = anIOR->Value();
1095         ior = aString.in();
1096       }
1097       valueString = getValueFromObject( RefSO );
1098       aString = aName->Value();
1099       if ( !UCSubItem ) {
1100         UCSubItem = AddItem( UCItem, 
1101                              QString( " * " ) + aString.in(), 
1102                              RefSOEntry, 
1103                              ior, 
1104                              2, 
1105                              UCEntry, 
1106                              valueString );
1107         myUseCaseMap[ RefSOEntry ].append( UCSubItem );
1108       }
1109       else {
1110         UCSubItem->setName( QString( " * " ) + aString.in() );
1111         UCSubItem->setEntry( RefSOEntry );
1112         UCSubItem->setIOR( ior );
1113         UCSubItem->setReference( UCEntry );
1114         UCSubItem->setValue( valueString );
1115       }
1116       UCSubItem->setCurrent( !SOCurrent->_is_nil() && QString( SOCurrent->GetID() ) == QString( UCEntry ) );
1117     }
1118   } 
1119   else {
1120     // getting Value
1121     valueString = getValueFromObject( UCObject );
1122     // getting IOR
1123     if ( UCObject->FindAttribute( anAttr, "AttributeIOR" ) )  {
1124       anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr );
1125       aString = anIOR->Value();
1126       ior = aString.in();
1127     }
1128     // getting Name and adding new Item
1129     if ( UCObject->FindAttribute( anAttr, "AttributeName" ) ) {
1130       aName = SALOMEDS::AttributeName::_narrow( anAttr );
1131       aString = aName->Value();
1132       if ( !UCSubItem ) {
1133         UCSubItem = AddItem( UCItem, aString.in(), UCEntry, ior, isUseCase ? 1 : 0, "", valueString );
1134         myUseCaseMap[ UCEntry ].append( UCSubItem );
1135       }
1136       else {
1137         UCSubItem->setName( aString.in() );
1138         UCSubItem->setEntry( UCEntry );
1139         UCSubItem->setIOR( ior );
1140         UCSubItem->setReference( "" );
1141         UCSubItem->setValue( valueString );
1142       }
1143     } 
1144     // adding other attributes 
1145     if ( UCSubItem ) {
1146       UCSubItem->setCurrent( !SOCurrent->_is_nil() && QString( SOCurrent->GetID() ) == QString( UCEntry ) );
1147 //  Selectable
1148 //      if ( UCObject->FindAttribute( anAttr, "AttributeSelectable" ) ) {
1149 //      aSelectable = SALOMEDS::AttributeSelectable::_narrow( anAttr );
1150 //      UCSubItem->setSelectable( aSelectable->IsSelectable() );
1151 //      }
1152 // Expandable
1153 //      if ( UCObject->FindAttribute( anAttr, "AttributeExpandable" ) ) {
1154 //      anExpandable = SALOMEDS::AttributeExpandable::_narrow( anAttr );
1155 //      UCSubItem->setExpandable( anExpandable->IsExpandable() );
1156 //      }
1157 // TextColor
1158       if ( UCObject->FindAttribute(anAttr, "AttributeTextColor" ) ) {
1159         aTextColor = SALOMEDS::AttributeTextColor::_narrow( anAttr );
1160         QColor aColor( (int)(aTextColor->TextColor().R), 
1161                        (int)(aTextColor->TextColor().G), 
1162                        (int)(aTextColor->TextColor().B) );
1163         UCSubItem->setTextColor( aColor );
1164       }
1165       // TextHighlightColor
1166       if ( UCObject->FindAttribute( anAttr, "AttributeTextHighlightColor" ) ) {
1167         aTextHighlightColor = SALOMEDS::AttributeTextHighlightColor::_narrow( anAttr );
1168         QColor aColor( (int)(aTextHighlightColor->TextHighlightColor().R), 
1169                        (int)(aTextHighlightColor->TextHighlightColor().G), 
1170                        (int)(aTextHighlightColor->TextHighlightColor().B) );
1171         UCSubItem->setTextHighlightColor( aColor );
1172       }
1173       // Pixmap
1174       if ( UCObject->FindAttribute( anAttr, "AttributePixMap" ) ) {
1175         aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
1176         if ( aPixmap->HasPixMap() ) {
1177           SALOMEDS::SComponent_var father = UCObject->GetFatherComponent();
1178           if ( father->FindAttribute( anAttr, "AttributeName" ) ) {
1179             SALOMEDS::AttributeName_var aFatherName;
1180             aFatherName = SALOMEDS::AttributeName::_narrow( anAttr );
1181             QAD_ResourceMgr* resMgr = QAD_Desktop::getResourceManager();
1182             if ( resMgr ) {
1183               QString msg;
1184               if( resMgr->loadResources( QAD_Application::getDesktop()->getComponentName(QString( aFatherName->Value() )), msg ) ) {
1185                 QPixmap icon ( resMgr->loadPixmap( QAD_Application::getDesktop()->getComponentName(QString( aFatherName->Value() )),
1186                                                    tr( aPixmap->GetPixMap() ) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ) );
1187                 UCSubItem->setPixmap( 0, icon );
1188               }
1189             }
1190           }
1191         }
1192       }
1193     } 
1194   }
1195   if ( UCSubItem ) {
1196     // updating children ...
1197     QMap<QString,SALOMEDS::SObject_var> ucList;
1198     SALOMEDS::UseCaseIterator_var UCIter = UCBuilder->GetUseCaseIterator( UCObject );
1199     if ( !UCIter->_is_nil() ) {
1200       for ( ; UCIter->More(); UCIter->Next() ) {
1201         SALOMEDS::SObject_var UCSubObject = UCIter->Value();
1202         aString = UCSubObject->GetID();
1203         QString UCSubEntry = aString.in();
1204         ucList[ UCSubEntry ] = UCSubObject;
1205       }
1206     }
1207     // ... 1) delete removed items
1208     QAD_ObjectBrowserItem* childItem = ( QAD_ObjectBrowserItem* )UCSubItem->firstChild();
1209     while ( childItem ) {
1210       QAD_ObjectBrowserItem* prevItem = childItem;
1211       childItem = ( QAD_ObjectBrowserItem* )childItem->nextSibling();
1212       if ( !ucList.contains( prevItem->getEntry() ) ) {
1213         //      myUseCaseMap[ prevItem->getEntry() ].removeRef( prevItem );
1214         //      if ( myUseCaseMap[ prevItem->getEntry() ].isEmpty() )
1215         //      myUseCaseMap.remove( prevItem->getEntry() );
1216         removeFromMap( myUseCaseMap, prevItem );
1217         delete prevItem;
1218       }
1219     }
1220     // ... 2) create/update existing
1221     QMap<QString,SALOMEDS::SObject_var>::Iterator it;
1222     for ( it = ucList.begin(); it != ucList.end(); ++it ) {
1223       UpdateUCItem( it.data(), UCSubItem );
1224     }
1225   }
1226 }
1227
1228 /*!
1229   Unhighlights all items
1230 */
1231 void QAD_ObjectBrowser::unHighlightAll()
1232 {
1233   myListView->clearSelection();
1234   myUseCaseView->clearSelection();  
1235 }
1236
1237 /*!
1238   Highlights items which refer to object
1239 */
1240 void QAD_ObjectBrowser::highlight( const Handle(SALOME_InteractiveObject)& IObject, bool highlight )
1241 {
1242   QList<QAD_ObjectBrowserItem> List;
1243   if (getItems(IObject, List)) {
1244     for (int i = 0; i < List.count(); i++) {
1245       List.at(i)->setSelected( highlight );
1246       List.at(i)->repaint();
1247     } 
1248   }
1249 }
1250
1251 /*!
1252   Gets items from Object Browser which refer to object 
1253 */
1254 bool QAD_ObjectBrowser::getItems( const Handle(SALOME_InteractiveObject)& IObject, 
1255                                   QList<QAD_ObjectBrowserItem>& List)
1256 {
1257   List.clear();
1258   if ( myListViewMap.contains( IObject->getEntry() ) ) {
1259     ItemList ilist = myListViewMap[ IObject->getEntry() ];
1260     for ( int i = 0; i < ilist.count(); i++ )
1261       List.append( ilist.at(i) );
1262   }
1263   if ( myUseCaseMap.contains( IObject->getEntry() ) ) {
1264     ItemList ilist = myUseCaseMap[ IObject->getEntry() ];
1265     for ( int i = 0; i < ilist.count(); i++ )
1266       List.append( ilist.at(i) );
1267   }
1268   return (List.count() > 0);
1269 }
1270
1271 /*!
1272   Gets items from Object Browser which refer to object 
1273 */
1274 bool QAD_ObjectBrowser::getItems( SALOMEDS::SObject_ptr SO, 
1275                                   QList<QAD_ObjectBrowserItem>& List)
1276 {
1277   List.clear();
1278   if ( myListViewMap.contains( SO->GetID() ) ) {
1279     ItemList ilist = myListViewMap[ SO->GetID() ];
1280     for ( int i = 0; i < ilist.count(); i++ )
1281       List.append( ilist.at(i) );
1282   }
1283   if ( myUseCaseMap.contains( SO->GetID() ) ) {
1284     ItemList ilist = myUseCaseMap[ SO->GetID() ];
1285     for ( int i = 0; i < ilist.count(); i++ )
1286       List.append( ilist.at(i) );
1287   }
1288   return (List.count() > 0);
1289 }
1290
1291 /*!
1292   Gets first item from Object Browser which refers to object (not reference) 
1293 */
1294 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getItem( const Handle(SALOME_InteractiveObject)& IObject )
1295 {
1296   if ( myListViewMap.contains( IObject->getEntry() ) ) {
1297     ItemList ilist = myListViewMap[ IObject->getEntry() ];
1298     for ( int i = 0; i < ilist.count(); i++ ) {
1299       QString aRef   = ilist.at(i)->getReference();
1300       if ( ilist.at(i)->getReference().isEmpty() )
1301         return ilist.at(i);
1302     }
1303   }
1304   return 0;
1305 }
1306
1307 /*!
1308   Finds item from Object Browser corresponding to Object, returns 0 if fails
1309 */
1310 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getItem( SALOMEDS::SObject_ptr SO )
1311 {
1312   if ( myListViewMap.contains( SO->GetID() ) ) {
1313     ItemList ilist = myListViewMap[ SO->GetID() ];
1314     for ( int i = 0; i < ilist.count(); i++ ) {
1315       QString aRef   = ilist.at(i)->getReference();
1316       if ( ilist.at(i)->getReference().isEmpty() )
1317         return ilist.at(i);
1318     }
1319   }
1320   return 0;
1321 }
1322
1323
1324 /*!
1325   Gets first item from UseCase Browser which refers to object (not reference) 
1326 */
1327 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getUCItem( const Handle(SALOME_InteractiveObject)& IObject )
1328 {
1329   if ( myUseCaseMap.contains( IObject->getEntry() ) ) {
1330     ItemList ilist = myUseCaseMap[ IObject->getEntry() ];
1331     for ( int i = 0; i < ilist.count(); i++ ) {
1332       QString aRef   = ilist.at(i)->getReference();
1333       if ( ilist.at(i)->getReference().isEmpty() )
1334         return ilist.at(i);
1335     }
1336   }
1337   return 0;
1338 }
1339
1340 /*!
1341   Finds item from UseCase Browser corresponding to Object, returns 0 if fails
1342 */
1343 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getUCItem( SALOMEDS::SObject_ptr SO )
1344 {
1345   if ( myUseCaseMap.contains( SO->GetID() ) ) {
1346     ItemList ilist = myUseCaseMap[ SO->GetID() ];
1347     for ( int i = 0; i < ilist.count(); i++ ) {
1348       QString aRef   = ilist.at(i)->getReference();
1349       if ( ilist.at(i)->getReference().isEmpty() )
1350         return ilist.at(i);
1351     }
1352   }
1353   return 0;
1354 }
1355 /*!
1356   Finds item corresponding to interactive object, returns 0 if fails
1357 */
1358 void QAD_ObjectBrowser::rename( const Handle(SALOME_InteractiveObject)& IObject, QString newName )
1359 {
1360   QAD_ObjectBrowserItem* item = getItem( IObject );
1361   if ( item ) {
1362     item->setName( newName );
1363     item->repaint();
1364   }
1365   item = getUCItem( IObject );
1366   if ( item ) {
1367     item->setName( newName );
1368     item->repaint();
1369   }
1370 }
1371
1372 /*!
1373   Creates and show specific Popup to this according to current selection (Object Browser)
1374 */
1375 void QAD_ObjectBrowser::showPopupMenu(QListViewItem* theItem)
1376 {
1377   QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1378   SALOME_Selection*    Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1379   QString       ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1380
1381   if (theItem != NULL && ( Sel->IObjectCount()>0 || ActiveComp.isEmpty() ) ) {
1382
1383     // PAL5618: if IO is presented by several items, assure that the selected IO
1384     // is presented exactly by theItem: difference is in reference
1385     QAD_ObjectBrowserItem *item = (QAD_ObjectBrowserItem *) theItem;
1386     QString theEntry = item->getEntry();
1387     const SALOME_ListIO& SelIO = Sel->StoredIObjects();
1388     for ( SALOME_ListIteratorOfListIO SelIt( SelIO ); SelIt.More(); SelIt.Next() ) {
1389       const Handle(SALOME_InteractiveObject)& IO = SelIt.Value();
1390       if ( strcmp ( IO->getEntry(), theEntry ) == 0 )
1391         IO->setReference( item->getReference() );
1392     }
1393     
1394     createPopup();
1395
1396     if ( myPopup ) {
1397       QAD_Tools::checkPopup( myPopup );
1398       if ( myPopup->count()>0 ) {
1399         myPopup->exec( QCursor::pos() );
1400       }
1401       destroyPopup();
1402     }
1403   }
1404 }
1405
1406 /*!
1407   Creates and show specific Popup to this according to current selection (UseCase Browser)
1408 */
1409 void QAD_ObjectBrowser::showUseCasePopupMenu(QListViewItem* theItem)
1410 {
1411   createPopup();
1412   if ( myPopup ) {
1413     QAD_Tools::checkPopup( myPopup );
1414     if ( myPopup->count() > 0 ) {
1415       myPopup->exec( QCursor::pos() );
1416     }
1417     destroyPopup();
1418   }
1419 }
1420
1421 /*!
1422   Called when current selection was changed (Object Browser)
1423 */
1424 void QAD_ObjectBrowser::onSelectedItem()
1425 {
1426   if (currentPage()==myListView)
1427     myUseCaseView->clearSelection();
1428
1429   QListView* whoIs;
1430   if ( sender()->inherits("QListView") )
1431     whoIs = (QListView*)sender();
1432   else
1433     whoIs = myListView;
1434   QAD_Study*   myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1435   SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
1436   SALOME_Selection*      Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1437   QAD_Application* myApp     = QAD_Application::getDesktop()->getActiveApp();
1438
1439   SALOME_ListIO DeltaPos;
1440   DeltaPos.Clear();
1441   SALOME_ListIO DeltaNeg;
1442   DeltaNeg.Clear();
1443
1444   typedef QMap<QString, SALOME_InteractiveObject*> SelMap;
1445
1446   SelMap currMap, allMap;
1447   for( SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() ); It.More(); It.Next() )
1448     currMap.insert( It.Value()->getEntry(), It.Value().operator->() );
1449
1450   QListViewItemIterator it( whoIs );
1451   for ( ; it.current(); ++it ) {
1452     QAD_ObjectBrowserItem* item = (QAD_ObjectBrowserItem*)it.current();
1453     QString theEntry = item->getEntry();
1454     QString theName  = item->getName();
1455     QString theRef   = item->getReference();
1456
1457     if ( !theEntry.isEmpty() ) {
1458       if ( item->isSelected() ) {
1459         allMap.insert( theEntry, 0 );
1460
1461         if ( !currMap.contains( theEntry ) ) {
1462           Handle(SALOME_InteractiveObject) newIO;
1463           SALOMEDS::SObject_var obj = aStudy->FindObjectID( theEntry.latin1() );
1464           if ( !obj->_is_nil() ) {
1465             SALOMEDS::SComponent_var comp = obj->GetFatherComponent();
1466             if ( !comp->_is_nil() ) {
1467               CORBA::String_var datatype(comp->ComponentDataType());
1468               newIO = new SALOME_InteractiveObject( theEntry.latin1(),
1469                                                     datatype.in(),
1470                                                     theName.latin1() );
1471               newIO->setReference( theRef.latin1() );
1472             }
1473           } else {
1474             newIO = new SALOME_InteractiveObject( theEntry.latin1(),
1475                                                   "",
1476                                                   theName.latin1() );
1477             newIO->setReference( theRef.latin1() );
1478           }
1479           if (!newIO.IsNull()) {
1480             DeltaPos.Append( newIO );
1481           } 
1482         }
1483       } else if ( currMap.contains( theEntry ) )
1484         DeltaNeg.Append( currMap[theEntry] );
1485     }
1486   }
1487
1488   SALOME_ListIteratorOfListIO ItNeg( DeltaNeg );
1489   for(;ItNeg.More();ItNeg.Next()) {
1490     Sel->RemoveIObject( ItNeg.Value() );
1491   }
1492   
1493   SALOME_ListIteratorOfListIO ItPos( DeltaPos );
1494   for(;ItPos.More();ItPos.Next()) {
1495     Sel->AddIObject( ItPos.Value() );
1496   }
1497
1498   for ( SelMap::iterator it = currMap.begin(); it != currMap.end(); ++it ) 
1499     if ( !allMap.contains( it.key() ) )
1500       Sel->RemoveIObject( it.data() );
1501
1502   if ( myApp )
1503     myApp->updateActions();
1504 }
1505
1506 /*!
1507   Called when selection is changed (UseCase Browser)
1508 */
1509 void QAD_ObjectBrowser::onUseCaseSelectedItem()
1510 {
1511 }
1512
1513 /*!
1514   Called when item is expanded
1515 */
1516 void QAD_ObjectBrowser::onExpanded (QListViewItem* item)
1517 {
1518   QAD_ObjectBrowserItem* aItem = (QAD_ObjectBrowserItem*)item;
1519   if (!myStudy->_is_nil() && aItem)
1520   {
1521     SALOMEDS::SObject_var Object = myStudy->FindObjectID(aItem->getEntry());
1522     if (!Object->_is_nil())
1523     {
1524       SALOMEDS::StudyBuilder_var StudyBuilder = myStudy->NewBuilder();
1525       SALOMEDS::AttributeOpened_var  anAttr = SALOMEDS::AttributeOpened::_narrow(
1526                    StudyBuilder->FindOrCreateAttribute(Object, "AttributeOpened") );
1527       anAttr->SetOpened(true);
1528     }
1529   }
1530 }
1531
1532 /*!
1533   Called when item is collapsed
1534 */
1535 void QAD_ObjectBrowser::onCollapsed(QListViewItem* item)
1536 {
1537   QAD_ObjectBrowserItem* aItem = (QAD_ObjectBrowserItem*)item;
1538   if (!myStudy->_is_nil() && aItem)
1539   {
1540     SALOMEDS::SObject_var Object = myStudy->FindObjectID(aItem->getEntry());
1541     if (!Object->_is_nil())
1542     {
1543       SALOMEDS::StudyBuilder_var StudyBuilder = myStudy->NewBuilder();
1544       SALOMEDS::AttributeOpened_var  anAttr = SALOMEDS::AttributeOpened::_narrow(
1545                    StudyBuilder->FindOrCreateAttribute(Object, "AttributeOpened") );
1546       anAttr->SetOpened(false);
1547     }
1548   }
1549 }
1550
1551 /*!
1552   Find and returns value for the object
1553   Warning: object can have several values attributes, search is done in the following order:
1554   [integer], [real], [table of integer], [table of real], [comment]
1555 */
1556 QString QAD_ObjectBrowser::getValueFromObject( SALOMEDS::SObject_ptr SO )
1557 {
1558   if ( SO->_is_nil() )
1559     return QString::null;
1560   SALOMEDS::SComponent_var isComponent = SALOMEDS::SComponent::_narrow( SO );
1561   if ( !isComponent->_is_nil() )
1562     return QString::null; // no values to show for components
1563
1564   SALOMEDS::GenericAttribute_var        anAttr;
1565   SALOMEDS::AttributeInteger_var        anInt;
1566   SALOMEDS::AttributeReal_var           aReal;
1567   SALOMEDS::AttributeTableOfInteger_var aTableInt;
1568   SALOMEDS::AttributeTableOfReal_var    aTableReal;
1569   SALOMEDS::AttributeComment_var        aComment;
1570   CORBA::String_var aString;
1571
1572   // Integer
1573   if ( SO->FindAttribute( anAttr, "AttributeInteger" ) ) {
1574     anInt = SALOMEDS::AttributeInteger::_narrow( anAttr );
1575     QString val = QString::number( anInt->Value() );
1576     return val;
1577   }
1578   // Real
1579   if ( SO->FindAttribute( anAttr, "AttributeReal" ) ) {
1580     aReal = SALOMEDS::AttributeReal::_narrow( anAttr );
1581     QString val = QString::number( aReal->Value() );
1582     return val;
1583   } 
1584   // Table of integer
1585   if ( SO->FindAttribute( anAttr, "AttributeTableOfInteger" ) ) {
1586     aTableInt = SALOMEDS::AttributeTableOfInteger::_narrow( anAttr );
1587     aString = aTableInt->GetTitle();
1588     QString tlt( aString.in() );
1589     if ( !tlt.isEmpty() )
1590       tlt += " ";
1591     int nbRows  = aTableInt->GetNbRows() ; 
1592     int nbCols  = aTableInt->GetNbColumns();
1593     QString val = tlt + QString( "[" ) + QString::number( nbRows ) + QString( "," ) + QString::number( nbCols ) + QString( "]" );
1594     return val;
1595   }
1596   // Table of real
1597   if ( SO->FindAttribute( anAttr, "AttributeTableOfReal" ) ) {
1598     aTableReal = SALOMEDS::AttributeTableOfReal::_narrow( anAttr );
1599     aString = aTableReal->GetTitle();
1600     QString tlt( aString.in() );
1601     if ( !tlt.isEmpty() )
1602       tlt += " ";
1603     int nbRows  = aTableReal->GetNbRows() ; 
1604     int nbCols  = aTableReal->GetNbColumns();
1605     QString val = tlt + QString( "[" ) + QString::number( nbRows ) + QString( "," ) + QString::number( nbCols ) + QString( "]" );
1606     return val;
1607   }
1608   // Comment
1609   if ( SO->FindAttribute(anAttr, "AttributeComment") ) {
1610     aComment = SALOMEDS::AttributeComment::_narrow( anAttr );
1611     aString = aComment->Value();
1612     QString val = QString( aString.in() );
1613     return val;
1614   }
1615   return QString::null;
1616 }
1617
1618 /*!
1619   Shows/hides IAPP sub-tree in ObjectBrowser
1620   Current implementation just udpates browser
1621 */
1622 void QAD_ObjectBrowser::setShowIAPP( bool show )
1623 {
1624   Update();
1625 }
1626
1627 /*!
1628   Shows/hides info columns: Entry, IOR, Reference
1629 */
1630 void QAD_ObjectBrowser::setShowInfoColumns( bool show )
1631 {
1632   bool shown = myListView->header()->isResizeEnabled( 2 );
1633   
1634   if ( show != shown ) {
1635     if ( show ) {
1636       myListView->header()->setResizeEnabled( true, 2 );
1637       myListView->header()->setResizeEnabled( true, 3 );
1638       myListView->header()->setResizeEnabled( true, 4 );
1639       myListView->setColumnWidthMode( 2, QListView::Maximum );
1640       myListView->setColumnWidthMode( 3, QListView::Maximum );
1641       myListView->setColumnWidthMode( 4, QListView::Maximum );
1642       if ( myListView->columnWidth( 2 ) <= 0 )
1643         myListView->header()->resizeSection( 2, 50 );
1644       if ( myListView->columnWidth( 3 ) <= 0 )
1645         myListView->header()->resizeSection( 3, 50 );
1646       if ( myListView->columnWidth( 4 ) <= 0 )
1647         myListView->header()->resizeSection( 4, 50 );
1648     }
1649     else {
1650       myListView->setColumnWidthMode( 2, QListView::Manual );
1651       myListView->setColumnWidthMode( 3, QListView::Manual );
1652       myListView->setColumnWidthMode( 4, QListView::Manual );
1653       myListView->header()->resizeSection( 2, 0 );
1654       myListView->header()->resizeSection( 3, 0 );
1655       myListView->header()->resizeSection( 4, 0 );
1656       myListView->header()->setResizeEnabled( false, 2 );
1657       myListView->header()->setResizeEnabled( false, 3 );
1658       myListView->header()->setResizeEnabled( false, 4 );
1659     }
1660   }
1661 }
1662
1663 /*!
1664   Shows/hides Value column
1665 */
1666 void QAD_ObjectBrowser::setShowValueColumn( bool show )
1667 {
1668   bool shown = myListView->header()->isResizeEnabled( 1 );
1669   
1670   if ( show != shown ) {
1671     if ( show ) {
1672       myListView->header()->setResizeEnabled( true, 1 );
1673       myListView->setColumnWidthMode( 1, QListView::Maximum );
1674       if ( myListView->columnWidth( 1 ) <= 0 )
1675         myListView->header()->resizeSection( 1, 50 );
1676     }
1677     else {
1678       myListView->setColumnWidthMode( 1, QListView::Manual );
1679       myListView->header()->resizeSection( 1, 0 );
1680       myListView->header()->setResizeEnabled( false, 1 );
1681     }
1682   }
1683 }
1684
1685 /*!
1686   Sets CHRONO sorting enabled/disabled
1687   Note: when CHRONO sorting is enabled items are sorted by Entry value and column headers 
1688         become unclickable to prohibit another sort type;
1689         when CHRONO sorting is disabled column headers become clickable - this allows
1690         to sort data by any column
1691 */
1692 void QAD_ObjectBrowser::setEnableChronoSort( bool enable )
1693 {
1694   if ( enable ) {
1695     // if CHRONO sorting is enabled set clickable header disabled ...
1696     myListView->header()->setClickEnabled( false );
1697     // ... and then sort by column 2 - OCAF doc entry
1698     myListView->setSorting( 2, TRUE ) ;
1699   }
1700   else {
1701     // if CHRONO sorting is enabled set clickable header enabled ...
1702     myListView->header()->setClickEnabled( true );
1703     // and clear sorting by column 2
1704     myListView->setSorting( 10, TRUE );
1705   }
1706 //  myListView->sort( ) ;  
1707 }
1708
1709 /*!
1710   Slot, called to edit value
1711 */
1712 void QAD_ObjectBrowser::onEditAttribute()
1713 {
1714   QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1715   SALOME_Selection*    Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1716   QString       ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1717   if ( myStudy->_is_nil() )
1718     return;
1719
1720   if ( Sel->IObjectCount() == 1 ) {
1721     SALOMEDS::SObject_var SO = myStudy->FindObjectID( Sel->firstIObject()->getEntry() );
1722     SALOMEDS::SComponent_var isComponent = SALOMEDS::SComponent::_narrow( SO );
1723     if ( !SO->_is_nil() && isComponent->_is_nil() ) { // no values to show for components
1724       SALOMEDS::GenericAttribute_var        anAttr;
1725       SALOMEDS::AttributeInteger_var        anInt;
1726       SALOMEDS::AttributeReal_var           aReal;
1727       SALOMEDS::AttributeTableOfInteger_var aTableInt;
1728       SALOMEDS::AttributeTableOfReal_var    aTableReal;
1729       SALOMEDS::AttributeComment_var        aComment;
1730       bool bOk = false;
1731         
1732       // if Integer
1733       if ( SO->FindAttribute( anAttr, "AttributeInteger" ) ) {
1734         anInt = SALOMEDS::AttributeInteger::_narrow( anAttr );
1735         int val = SALOMEGUI_SetValueDlg::getInteger( tr( "SET_VALUE_INT_TLT" ),
1736                                                      tr( "SET_VALUE_INT_LBL" ),
1737                                                      anInt->Value(),
1738                                                      &bOk,
1739                                                      QAD_Application::getDesktop() );
1740         if ( bOk ) {
1741           anInt->SetValue( val );
1742         }
1743       }
1744       // if Real
1745       else 
1746       if ( SO->FindAttribute( anAttr, "AttributeReal" ) ) {
1747         aReal = SALOMEDS::AttributeReal::_narrow( anAttr );
1748         double val = SALOMEGUI_SetValueDlg::getDouble( tr( "SET_VALUE_REAL_TLT" ),
1749                                                        tr( "SET_VALUE_REAL_LBL" ),
1750                                                        aReal->Value(),
1751                                                        &bOk,
1752                                                        QAD_Application::getDesktop() );
1753         if ( bOk ) {
1754           aReal->SetValue( val );
1755         }
1756       }
1757       // if Table of integer
1758       else
1759       if ( SO->FindAttribute( anAttr, "AttributeTableOfInteger" ) ) {
1760         SALOMEGUI_TableDlg* dlg = new SALOMEGUI_TableDlg( QAD_Application::getDesktop(),
1761                                                           SO, 
1762                                                           true, 
1763                                                           SALOMEGUI_TableDlg::ttInt );
1764         bOk = ( dlg->exec() == QDialog::Accepted );
1765       }
1766       // if Table of real
1767       else
1768       if ( SO->FindAttribute( anAttr, "AttributeTableOfReal" ) ) {
1769         SALOMEGUI_TableDlg* dlg = new SALOMEGUI_TableDlg( QAD_Application::getDesktop(),
1770                                                           SO, 
1771                                                           true, 
1772                                                           SALOMEGUI_TableDlg::ttReal );
1773         bOk = ( dlg->exec() == QDialog::Accepted );
1774       }
1775       // if Comment
1776       else
1777       if ( SO->FindAttribute(anAttr, "AttributeComment") ) {
1778         aComment = SALOMEDS::AttributeComment::_narrow( anAttr );
1779         QString val = SALOMEGUI_SetValueDlg::getString( tr( "SET_VALUE_COMMENT_TLT" ),
1780                                                         tr( "SET_VALUE_COMMENT_LBL" ),
1781                                                         aComment->Value(),
1782                                                         &bOk,
1783                                                         QAD_Application::getDesktop() );
1784         if ( bOk ) {
1785           aComment->SetValue( val );
1786         }
1787       }
1788       if ( bOk ) {
1789         Update();
1790       }
1791     }
1792   }
1793 }
1794
1795 /*!
1796   Returns true if object has editable attrubute : 
1797   integer, real, table or comment
1798 */
1799 bool QAD_ObjectBrowser::hasEditableAttribute( const Handle(SALOME_InteractiveObject)& object )
1800 {
1801   if ( !myStudy->_is_nil() ) {
1802     SALOMEDS::SObject_var obj  = myStudy->FindObjectID( object->getEntry() );
1803     SALOMEDS::SComponent_var comp = myStudy->FindComponentID( object->getEntry() );
1804     if ( !comp->_is_nil() || obj->_is_nil() )
1805       return false;
1806     QString val = getValueFromObject( obj );
1807     return ( !val.isNull() );
1808   }
1809   return false;
1810 }
1811
1812 /*!
1813   Returns true if object has table attrubute ( integer and/or real )
1814 */
1815 bool QAD_ObjectBrowser::hasTable( const Handle(SALOME_InteractiveObject)& object )
1816 {
1817   SALOMEDS::GenericAttribute_var anAttr;
1818   if ( !myStudy->_is_nil() ) {
1819     SALOMEDS::SObject_var obj  = myStudy->FindObjectID( object->getEntry() );
1820     SALOMEDS::SComponent_var comp = myStudy->FindComponentID( object->getEntry() );
1821     if ( !comp->_is_nil() || obj->_is_nil() )
1822       return false;
1823     if ( obj->FindAttribute( anAttr, "AttributeTableOfInteger" ) )
1824       return true;
1825     if ( obj->FindAttribute( anAttr, "AttributeTableOfReal" ) )
1826       return true;
1827   }
1828   return false;
1829 }
1830
1831 /*!
1832   Slot, called when one of the UseCase Browser menu command is called
1833 */
1834 void QAD_ObjectBrowser::onUseCasePopupMenu( int action )
1835 {
1836   if ( myStudy->_is_nil() )
1837     return;
1838   
1839   // Check if the study is locked
1840   QAD_Desktop* Desktop     = (QAD_Desktop*) QAD_Application::getDesktop();
1841   QAD_Study* myActiveStudy = Desktop->getActiveStudy();
1842   SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
1843   if ( aStudy->GetProperties()->IsLocked() )
1844     {
1845       QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(),
1846                               QObject::tr("WRN_WARNING"), 
1847                               QObject::tr("WRN_STUDY_LOCKED"),
1848                               QObject::tr("BUT_OK") );
1849       return;
1850     }
1851
1852   SALOME_Selection* Sel    = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1853   SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
1854   SALOMEDS::SObject_var Current = UCBuilder->GetCurrentObject();
1855   CORBA::String_var aString;
1856
1857   QList<QListViewItem> ucSelected; 
1858   ucSelected.setAutoDelete( false );
1859   getSelectedParents( myUseCaseView, ucSelected );
1860
1861   if ( action == UC_NEW_EMPTY_ID ) {
1862     if ( ucSelected.count() == 1 ) {
1863       if ( isRootItem( ucSelected.at(0) ) )
1864         UCBuilder->SetRootCurrent();
1865       else
1866         UCBuilder->SetCurrentObject( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) );
1867       UCBuilder->AddUseCase( tr( "NEW_OBJECT" ) ); 
1868       myActiveStudy->updateUseCaseBrowser();
1869     }
1870   }
1871   else
1872   if ( action == UC_SET_CURRENT_ID ) {
1873     if ( ucSelected.count() > 0 ) {
1874       if ( isRootItem( ucSelected.at(0) ) )
1875         UCBuilder->SetRootCurrent();
1876       else
1877         UCBuilder->SetCurrentObject( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) );
1878     }
1879     myActiveStudy->updateUseCaseBrowser( );
1880   }
1881   else
1882   if ( action == UC_RENAME_ID ) {
1883     if ( ucSelected.count() == 1 ) {
1884       QAD_ObjectBrowserItem* useCaseItem = ( QAD_ObjectBrowserItem* )( ucSelected.at( 0 ) );
1885       aString = UCBuilder->GetName();
1886       if ( isRootItem( useCaseItem ) ) {
1887         QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), aString.in() );
1888         if ( !name.isEmpty() ) {
1889           UCBuilder->SetName( name.latin1() );
1890           myActiveStudy->updateUseCaseBrowser( );
1891         }
1892       }
1893       else/* if ( UCBuilder->IsUseCase( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) ) )*/ {
1894         QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), aString.in() );
1895         if ( !name.isEmpty() ) {
1896           myActiveStudy->renameIObject( Sel->firstIObject(), name );
1897         }
1898       }
1899     }
1900   }
1901   else 
1902   if ( action == UC_APPEND_ID ) {
1903     if ( Sel->IObjectCount() > 0 ) {
1904       SALOME_ListIO SelIO; SelIO = Sel->StoredIObjects();
1905       SALOME_ListIteratorOfListIO SelIt( SelIO );
1906       for( ; SelIt.More(); SelIt.Next() ) {
1907         SALOMEDS::SObject_var selSO = myStudy->FindObjectID( SelIt.Value()->getEntry() );
1908         if ( !selSO->_is_nil() && strcmp( SelIt.Value()->getEntry(), ( "0:2" ) ) != 0 ) {
1909           UCBuilder->Remove( selSO );  // first remove object for sure ...
1910           UCBuilder->Append( selSO );  // ... and now re-append it
1911         }
1912       }
1913       myActiveStudy->updateUseCaseBrowser( true );
1914     }
1915   }
1916   else 
1917   if ( action == UC_REMOVE_ID ) {
1918     ucSelected.clear();
1919     getSelectedParents( myUseCaseView, ucSelected, true );
1920     for ( int i = 0; i < ucSelected.count(); i++ ) {
1921       QAD_ObjectBrowserItem* item = ( QAD_ObjectBrowserItem* )ucSelected.at( i );
1922       if ( !isRootItem( item ) ) {
1923         // SObject selected
1924         SALOMEDS::SObject_var SO = myStudy->FindObjectID( item->getEntry() );
1925         if ( !SO->_is_nil() ) {
1926           UCBuilder->Remove( SO );
1927         }
1928       }
1929       else {
1930       }
1931     }
1932     Sel->ClearIObjects();
1933     myActiveStudy->updateUseCaseBrowser( true );
1934   }
1935   else 
1936   if ( action == UC_CLEAR_ID ) {
1937     if ( myUseCaseView->childCount() > 0 && myUseCaseView->firstChild()->childCount() > 0) {
1938       QAD_ObjectBrowserItem* child = ( QAD_ObjectBrowserItem* )myUseCaseView->firstChild()->firstChild();
1939       while ( child ) {
1940         UCBuilder->Remove( myStudy->FindObjectID( child->getEntry().latin1() ) );
1941         child = ( QAD_ObjectBrowserItem* )( child->nextSibling() );
1942       }
1943       Sel->ClearIObjects();
1944       myActiveStudy->updateUseCaseBrowser();
1945     }
1946   }
1947 }
1948 /*!
1949   Use Case browser buttons slot
1950 */
1951 void QAD_ObjectBrowser::onUseCaseBtn()
1952 {
1953   // Check if the study is locked
1954   QAD_Desktop* Desktop     = (QAD_Desktop*) QAD_Application::getDesktop();
1955   QAD_Study* myActiveStudy = Desktop->getActiveStudy();
1956   SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
1957   if ( aStudy->GetProperties()->IsLocked() )
1958     {
1959       QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(),
1960                               QObject::tr("WRN_WARNING"), 
1961                               QObject::tr("WRN_STUDY_LOCKED"),
1962                               QObject::tr("BUT_OK") );
1963       return;
1964     }
1965   
1966   if ( sender() == myNewBtn ) {
1967     SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
1968     UCBuilder->AddUseCase( tr( "NEW_OBJECT" ) ); 
1969     myActiveStudy->updateUseCaseBrowser();
1970   }
1971   if ( sender() == myAddBtn )
1972     onUseCasePopupMenu( UC_APPEND_ID );
1973   if ( sender() == myDelBtn )
1974     onUseCasePopupMenu( UC_REMOVE_ID );
1975   if ( sender() == myClearBtn )
1976     onUseCasePopupMenu( UC_CLEAR_ID );
1977   if ( sender() == myCurrentBtn )
1978     onUseCasePopupMenu( UC_SET_CURRENT_ID );
1979 }
1980
1981 /* 
1982    Show/remove UseCase Browser 
1983 */
1984
1985 void QAD_ObjectBrowser::showUseCaseBrowser ( bool show )
1986 {
1987   bool shown = (this->count() > 1);
1988   
1989   if (show != shown)
1990     {
1991       if (show)
1992         {
1993           this->addTab( myVBox, tr( "TLT_USECASE_BROWSER" ) );
1994           UpdateUseCaseBrowser();
1995           unHighlightAll();
1996         }
1997       else
1998         this->removePage(myVBox);
1999     }
2000 }
2001
2002 /*!
2003   Switch between auto resizing of columns and manual mode
2004 */
2005 void QAD_ObjectBrowser::autoSizeColumns( bool autosize )
2006 {
2007   if (autosize)
2008     {
2009       for (int i = 0; i < myListView->header()->count(); i++ )
2010         if (myListView->header()->isResizeEnabled(i))
2011           myListView->setColumnWidthMode(i, QListView::Maximum);
2012       
2013     }
2014   else
2015     {
2016       for (int i = 0; i < myListView->header()->count(); i++ )
2017         myListView->setColumnWidthMode(i, QListView::Manual); 
2018     }
2019 }