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