]> SALOME platform Git repositories - modules/kernel.git/blob - src/SALOMEGUI/QAD_ObjectBrowser.cxx
Salome HOME
PR: merge from tag mergeto_trunk_17Jan05
[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   /* Creating SObjects item */
1056   SALOMEDS::SObject_var                      RefSO;
1057   SALOMEDS::GenericAttribute_var             anAttr;
1058   SALOMEDS::AttributeName_var                aName;
1059   SALOMEDS::AttributeIOR_var                 anIOR;
1060   SALOMEDS::AttributeSelectable_var          aSelectable;
1061   SALOMEDS::AttributeExpandable_var          anExpandable;
1062   SALOMEDS::AttributePixMap_var              aPixmap;
1063   SALOMEDS::AttributeTextColor_var           aTextColor;
1064   SALOMEDS::AttributeTextHighlightColor_var  aTextHighlightColor;
1065   QString                                    valueString;
1066   QString                                    ior = "";
1067   CORBA::String_var                          aString = UCObject->GetID();
1068   QString                                    UCEntry = aString.in();
1069
1070   SALOMEDS::UseCaseBuilder_var               UCBuilder = myStudy->GetUseCaseBuilder();
1071   SALOMEDS::SObject_var                      SOCurrent = UCBuilder->GetCurrentObject();
1072   bool                                       isUseCase = UCBuilder->IsUseCase( UCObject );
1073
1074   QAD_ObjectBrowserItem* UCSubItem = 0;
1075   if ( myUseCaseMap.contains( UCEntry ) && myUseCaseMap[ UCEntry ].count() > 0 )
1076     UCSubItem = myUseCaseMap[ UCEntry ].first();
1077
1078   if ( UCObject->ReferencedObject( RefSO ) && !RefSO->_is_nil() ) {
1079     aString = RefSO->GetID();
1080     QString RefSOEntry = aString.in();
1081     if ( UCObject->FindAttribute( anAttr, "AttributeName" ) || RefSO->FindAttribute( anAttr, "AttributeName" ) ) {
1082       aName = SALOMEDS::AttributeName::_narrow( anAttr );
1083       if ( RefSO->FindAttribute( anAttr, "AttributeIOR" ) ) {
1084         anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr );
1085         aString = anIOR->Value();
1086         ior = aString.in();
1087       }
1088       valueString = getValueFromObject( RefSO );
1089       aString = aName->Value();
1090       if ( !UCSubItem ) {
1091         UCSubItem = AddItem( UCItem, 
1092                              QString( " * " ) + aString.in(), 
1093                              RefSOEntry, 
1094                              ior, 
1095                              2, 
1096                              UCEntry, 
1097                              valueString );
1098         myUseCaseMap[ RefSOEntry ].append( UCSubItem );
1099       }
1100       else {
1101         UCSubItem->setName( QString( " * " ) + aString.in() );
1102         UCSubItem->setEntry( RefSOEntry );
1103         UCSubItem->setIOR( ior );
1104         UCSubItem->setReference( UCEntry );
1105         UCSubItem->setValue( valueString );
1106       }
1107       UCSubItem->setCurrent( !SOCurrent->_is_nil() && QString( SOCurrent->GetID() ) == QString( UCEntry ) );
1108     }
1109   } 
1110   else {
1111     // getting Value
1112     valueString = getValueFromObject( UCObject );
1113     // getting IOR
1114     if ( UCObject->FindAttribute( anAttr, "AttributeIOR" ) )  {
1115       anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr );
1116       aString = anIOR->Value();
1117       ior = aString.in();
1118     }
1119     // getting Name and adding new Item
1120     if ( UCObject->FindAttribute( anAttr, "AttributeName" ) ) {
1121       aName = SALOMEDS::AttributeName::_narrow( anAttr );
1122       aString = aName->Value();
1123       if ( !UCSubItem ) {
1124         UCSubItem = AddItem( UCItem, aString.in(), UCEntry, ior, isUseCase ? 1 : 0, "", valueString );
1125         myUseCaseMap[ UCEntry ].append( UCSubItem );
1126       }
1127       else {
1128         UCSubItem->setName( aString.in() );
1129         UCSubItem->setEntry( UCEntry );
1130         UCSubItem->setIOR( ior );
1131         UCSubItem->setReference( "" );
1132         UCSubItem->setValue( valueString );
1133       }
1134     } 
1135     // adding other attributes 
1136     if ( UCSubItem ) {
1137       UCSubItem->setCurrent( !SOCurrent->_is_nil() && QString( SOCurrent->GetID() ) == QString( UCEntry ) );
1138 //  Selectable
1139 //      if ( UCObject->FindAttribute( anAttr, "AttributeSelectable" ) ) {
1140 //      aSelectable = SALOMEDS::AttributeSelectable::_narrow( anAttr );
1141 //      UCSubItem->setSelectable( aSelectable->IsSelectable() );
1142 //      }
1143 // Expandable
1144 //      if ( UCObject->FindAttribute( anAttr, "AttributeExpandable" ) ) {
1145 //      anExpandable = SALOMEDS::AttributeExpandable::_narrow( anAttr );
1146 //      UCSubItem->setExpandable( anExpandable->IsExpandable() );
1147 //      }
1148 // TextColor
1149       if ( UCObject->FindAttribute(anAttr, "AttributeTextColor" ) ) {
1150         aTextColor = SALOMEDS::AttributeTextColor::_narrow( anAttr );
1151         QColor aColor( (int)(aTextColor->TextColor().R), 
1152                        (int)(aTextColor->TextColor().G), 
1153                        (int)(aTextColor->TextColor().B) );
1154         UCSubItem->setTextColor( aColor );
1155       }
1156       // TextHighlightColor
1157       if ( UCObject->FindAttribute( anAttr, "AttributeTextHighlightColor" ) ) {
1158         aTextHighlightColor = SALOMEDS::AttributeTextHighlightColor::_narrow( anAttr );
1159         QColor aColor( (int)(aTextHighlightColor->TextHighlightColor().R), 
1160                        (int)(aTextHighlightColor->TextHighlightColor().G), 
1161                        (int)(aTextHighlightColor->TextHighlightColor().B) );
1162         UCSubItem->setTextHighlightColor( aColor );
1163       }
1164       // Pixmap
1165       if ( UCObject->FindAttribute( anAttr, "AttributePixMap" ) ) {
1166         aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
1167         if ( aPixmap->HasPixMap() ) {
1168           SALOMEDS::SComponent_var father = UCObject->GetFatherComponent();
1169           if ( father->FindAttribute( anAttr, "AttributeName" ) ) {
1170             SALOMEDS::AttributeName_var aFatherName;
1171             aFatherName = SALOMEDS::AttributeName::_narrow( anAttr );
1172             QAD_ResourceMgr* resMgr = QAD_Desktop::getResourceManager();
1173             if ( resMgr ) {
1174               QString msg;
1175               if( resMgr->loadResources( QAD_Application::getDesktop()->getComponentName(QString( aFatherName->Value() )), msg ) ) {
1176                 QPixmap icon ( resMgr->loadPixmap( QAD_Application::getDesktop()->getComponentName(QString( aFatherName->Value() )),
1177                                                    tr( aPixmap->GetPixMap() ) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ) );
1178                 UCSubItem->setPixmap( 0, icon );
1179               }
1180             }
1181           }
1182         }
1183       }
1184     } 
1185   }
1186   if ( UCSubItem ) {
1187     // updating children ...
1188     QMap<QString,SALOMEDS::SObject_var> ucList;
1189     SALOMEDS::UseCaseIterator_var UCIter = UCBuilder->GetUseCaseIterator( UCObject );
1190     if ( !UCIter->_is_nil() ) {
1191       for ( ; UCIter->More(); UCIter->Next() ) {
1192         SALOMEDS::SObject_var UCSubObject = UCIter->Value();
1193         aString = UCSubObject->GetID();
1194         QString UCSubEntry = aString.in();
1195         ucList[ UCSubEntry ] = UCSubObject;
1196       }
1197     }
1198     // ... 1) delete removed items
1199     QAD_ObjectBrowserItem* childItem = ( QAD_ObjectBrowserItem* )UCSubItem->firstChild();
1200     while ( childItem ) {
1201       QAD_ObjectBrowserItem* prevItem = childItem;
1202       childItem = ( QAD_ObjectBrowserItem* )childItem->nextSibling();
1203       if ( !ucList.contains( prevItem->getEntry() ) ) {
1204         //      myUseCaseMap[ prevItem->getEntry() ].removeRef( prevItem );
1205         //      if ( myUseCaseMap[ prevItem->getEntry() ].isEmpty() )
1206         //      myUseCaseMap.remove( prevItem->getEntry() );
1207         removeFromMap( myUseCaseMap, prevItem );
1208         delete prevItem;
1209       }
1210     }
1211     // ... 2) create/update existing
1212     QMap<QString,SALOMEDS::SObject_var>::Iterator it;
1213     for ( it = ucList.begin(); it != ucList.end(); ++it ) {
1214       UpdateUCItem( it.data(), UCSubItem );
1215     }
1216   }
1217 }
1218
1219 /*!
1220   Unhighlights all items
1221 */
1222 void QAD_ObjectBrowser::unHighlightAll()
1223 {
1224   myListView->clearSelection();
1225   myUseCaseView->clearSelection();  
1226 }
1227
1228 /*!
1229   Highlights items which refer to object
1230 */
1231 void QAD_ObjectBrowser::highlight( const Handle(SALOME_InteractiveObject)& IObject, bool highlight )
1232 {
1233   QList<QAD_ObjectBrowserItem> List;
1234   if (getItems(IObject, List)) {
1235     for (int i = 0; i < List.count(); i++) {
1236       List.at(i)->setSelected( highlight );
1237       List.at(i)->repaint();
1238     } 
1239   }
1240 }
1241
1242 /*!
1243   Gets items from Object Browser which refer to object 
1244 */
1245 bool QAD_ObjectBrowser::getItems( const Handle(SALOME_InteractiveObject)& IObject, 
1246                                   QList<QAD_ObjectBrowserItem>& List)
1247 {
1248   List.clear();
1249   if ( myListViewMap.contains( IObject->getEntry() ) ) {
1250     ItemList ilist = myListViewMap[ IObject->getEntry() ];
1251     for ( int i = 0; i < ilist.count(); i++ )
1252       List.append( ilist.at(i) );
1253   }
1254   if ( myUseCaseMap.contains( IObject->getEntry() ) ) {
1255     ItemList ilist = myUseCaseMap[ IObject->getEntry() ];
1256     for ( int i = 0; i < ilist.count(); i++ )
1257       List.append( ilist.at(i) );
1258   }
1259   return (List.count() > 0);
1260 }
1261
1262 /*!
1263   Gets items from Object Browser which refer to object 
1264 */
1265 bool QAD_ObjectBrowser::getItems( SALOMEDS::SObject_ptr SO, 
1266                                   QList<QAD_ObjectBrowserItem>& List)
1267 {
1268   List.clear();
1269   if ( myListViewMap.contains( SO->GetID() ) ) {
1270     ItemList ilist = myListViewMap[ SO->GetID() ];
1271     for ( int i = 0; i < ilist.count(); i++ )
1272       List.append( ilist.at(i) );
1273   }
1274   if ( myUseCaseMap.contains( SO->GetID() ) ) {
1275     ItemList ilist = myUseCaseMap[ SO->GetID() ];
1276     for ( int i = 0; i < ilist.count(); i++ )
1277       List.append( ilist.at(i) );
1278   }
1279   return (List.count() > 0);
1280 }
1281
1282 /*!
1283   Gets first item from Object Browser which refers to object (not reference) 
1284 */
1285 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getItem( const Handle(SALOME_InteractiveObject)& IObject )
1286 {
1287   if ( myListViewMap.contains( IObject->getEntry() ) ) {
1288     ItemList ilist = myListViewMap[ IObject->getEntry() ];
1289     for ( int i = 0; i < ilist.count(); i++ ) {
1290       QString aRef   = ilist.at(i)->getReference();
1291       if ( ilist.at(i)->getReference().isEmpty() )
1292         return ilist.at(i);
1293     }
1294   }
1295   return 0;
1296 }
1297
1298 /*!
1299   Finds item from Object Browser corresponding to Object, returns 0 if fails
1300 */
1301 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getItem( SALOMEDS::SObject_ptr SO )
1302 {
1303   if ( myListViewMap.contains( SO->GetID() ) ) {
1304     ItemList ilist = myListViewMap[ SO->GetID() ];
1305     for ( int i = 0; i < ilist.count(); i++ ) {
1306       QString aRef   = ilist.at(i)->getReference();
1307       if ( ilist.at(i)->getReference().isEmpty() )
1308         return ilist.at(i);
1309     }
1310   }
1311   return 0;
1312 }
1313
1314
1315 /*!
1316   Gets first item from UseCase Browser which refers to object (not reference) 
1317 */
1318 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getUCItem( const Handle(SALOME_InteractiveObject)& IObject )
1319 {
1320   if ( myUseCaseMap.contains( IObject->getEntry() ) ) {
1321     ItemList ilist = myUseCaseMap[ IObject->getEntry() ];
1322     for ( int i = 0; i < ilist.count(); i++ ) {
1323       QString aRef   = ilist.at(i)->getReference();
1324       if ( ilist.at(i)->getReference().isEmpty() )
1325         return ilist.at(i);
1326     }
1327   }
1328   return 0;
1329 }
1330
1331 /*!
1332   Finds item from UseCase Browser corresponding to Object, returns 0 if fails
1333 */
1334 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getUCItem( SALOMEDS::SObject_ptr SO )
1335 {
1336   if ( myUseCaseMap.contains( SO->GetID() ) ) {
1337     ItemList ilist = myUseCaseMap[ SO->GetID() ];
1338     for ( int i = 0; i < ilist.count(); i++ ) {
1339       QString aRef   = ilist.at(i)->getReference();
1340       if ( ilist.at(i)->getReference().isEmpty() )
1341         return ilist.at(i);
1342     }
1343   }
1344   return 0;
1345 }
1346 /*!
1347   Finds item corresponding to interactive object, returns 0 if fails
1348 */
1349 void QAD_ObjectBrowser::rename( const Handle(SALOME_InteractiveObject)& IObject, QString newName )
1350 {
1351   QAD_ObjectBrowserItem* item = getItem( IObject );
1352   if ( item ) {
1353     item->setName( newName );
1354     item->repaint();
1355   }
1356   item = getUCItem( IObject );
1357   if ( item ) {
1358     item->setName( newName );
1359     item->repaint();
1360   }
1361 }
1362
1363 /*!
1364   Creates and show specific Popup to this according to current selection (Object Browser)
1365 */
1366 void QAD_ObjectBrowser::showPopupMenu(QListViewItem* theItem)
1367 {
1368   QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1369   SALOME_Selection*    Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1370   QString       ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1371
1372   if (theItem != NULL && ( Sel->IObjectCount()>0 || ActiveComp.isEmpty() ) ) {
1373
1374     // PAL5618: if IO is presented by several items, assure that the selected IO
1375     // is presented exactly by theItem: difference is in reference
1376     QAD_ObjectBrowserItem *item = (QAD_ObjectBrowserItem *) theItem;
1377     QString theEntry = item->getEntry();
1378     const SALOME_ListIO& SelIO = Sel->StoredIObjects();
1379     for ( SALOME_ListIteratorOfListIO SelIt( SelIO ); SelIt.More(); SelIt.Next() ) {
1380       const Handle(SALOME_InteractiveObject)& IO = SelIt.Value();
1381       if ( strcmp ( IO->getEntry(), theEntry ) == 0 )
1382         IO->setReference( item->getReference() );
1383     }
1384     
1385     createPopup();
1386
1387     if ( myPopup ) {
1388       QAD_Tools::checkPopup( myPopup );
1389       if ( myPopup->count()>0 ) {
1390         myPopup->exec( QCursor::pos() );
1391       }
1392       destroyPopup();
1393     }
1394   }
1395 }
1396
1397 /*!
1398   Creates and show specific Popup to this according to current selection (UseCase Browser)
1399 */
1400 void QAD_ObjectBrowser::showUseCasePopupMenu(QListViewItem* theItem)
1401 {
1402   createPopup();
1403   if ( myPopup ) {
1404     QAD_Tools::checkPopup( myPopup );
1405     if ( myPopup->count() > 0 ) {
1406       myPopup->exec( QCursor::pos() );
1407     }
1408     destroyPopup();
1409   }
1410 }
1411
1412 /*!
1413   Called when current selection was changed (Object Browser)
1414 */
1415 void QAD_ObjectBrowser::onSelectedItem()
1416 {
1417   if (currentPage()==myListView)
1418     myUseCaseView->clearSelection();
1419
1420   QListView* whoIs;
1421   if ( sender()->inherits("QListView") )
1422     whoIs = (QListView*)sender();
1423   else
1424     whoIs = myListView;
1425   QAD_Study*   myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1426   SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
1427   SALOME_Selection*      Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1428   QAD_Application* myApp     = QAD_Application::getDesktop()->getActiveApp();
1429
1430   SALOME_ListIO DeltaPos;
1431   DeltaPos.Clear();
1432   SALOME_ListIO DeltaNeg;
1433   DeltaNeg.Clear();
1434
1435   typedef QMap<QString, SALOME_InteractiveObject*> SelMap;
1436
1437   SelMap currMap, allMap;
1438   for( SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() ); It.More(); It.Next() )
1439     currMap.insert( It.Value()->getEntry(), It.Value().operator->() );
1440
1441   QListViewItemIterator it( whoIs );
1442   for ( ; it.current(); ++it ) {
1443     QAD_ObjectBrowserItem* item = (QAD_ObjectBrowserItem*)it.current();
1444     QString theEntry = item->getEntry();
1445     QString theName  = item->getName();
1446     QString theRef   = item->getReference();
1447
1448     if ( !theEntry.isEmpty() ) {
1449       if ( item->isSelected() ) {
1450         allMap.insert( theEntry, 0 );
1451
1452         if ( !currMap.contains( theEntry ) ) {
1453           Handle(SALOME_InteractiveObject) newIO;
1454           SALOMEDS::SObject_var obj = aStudy->FindObjectID( theEntry.latin1() );
1455           if ( !obj->_is_nil() ) {
1456             SALOMEDS::SComponent_var comp = obj->GetFatherComponent();
1457             if ( !comp->_is_nil() ) {
1458               CORBA::String_var datatype(comp->ComponentDataType());
1459               newIO = new SALOME_InteractiveObject( theEntry.latin1(),
1460                                                     datatype.in(),
1461                                                     theName.latin1() );
1462               newIO->setReference( theRef.latin1() );
1463             }
1464           } else {
1465             newIO = new SALOME_InteractiveObject( theEntry.latin1(),
1466                                                   "",
1467                                                   theName.latin1() );
1468             newIO->setReference( theRef.latin1() );
1469           }
1470           if (!newIO.IsNull()) {
1471             DeltaPos.Append( newIO );
1472           } 
1473         }
1474       } else if ( currMap.contains( theEntry ) )
1475         DeltaNeg.Append( currMap[theEntry] );
1476     }
1477   }
1478
1479   SALOME_ListIteratorOfListIO ItNeg( DeltaNeg );
1480   for(;ItNeg.More();ItNeg.Next()) {
1481     Sel->RemoveIObject( ItNeg.Value() );
1482   }
1483   
1484   SALOME_ListIteratorOfListIO ItPos( DeltaPos );
1485   for(;ItPos.More();ItPos.Next()) {
1486     Sel->AddIObject( ItPos.Value() );
1487   }
1488
1489   for ( SelMap::iterator it = currMap.begin(); it != currMap.end(); ++it ) 
1490     if ( !allMap.contains( it.key() ) )
1491       Sel->RemoveIObject( it.data() );
1492
1493   if ( myApp )
1494     myApp->updateActions();
1495 }
1496
1497 /*!
1498   Called when selection is changed (UseCase Browser)
1499 */
1500 void QAD_ObjectBrowser::onUseCaseSelectedItem()
1501 {
1502 }
1503
1504 /*!
1505   Called when item is expanded
1506 */
1507 void QAD_ObjectBrowser::onExpanded (QListViewItem* item)
1508 {
1509   QAD_ObjectBrowserItem* aItem = (QAD_ObjectBrowserItem*)item;
1510   if (!myStudy->_is_nil() && aItem)
1511   {
1512     SALOMEDS::SObject_var Object = myStudy->FindObjectID(aItem->getEntry());
1513     if (!Object->_is_nil())
1514     {
1515       SALOMEDS::StudyBuilder_var StudyBuilder = myStudy->NewBuilder();
1516       SALOMEDS::AttributeOpened_var  anAttr = SALOMEDS::AttributeOpened::_narrow(
1517                    StudyBuilder->FindOrCreateAttribute(Object, "AttributeOpened") );
1518       anAttr->SetOpened(true);
1519     }
1520   }
1521 }
1522
1523 /*!
1524   Called when item is collapsed
1525 */
1526 void QAD_ObjectBrowser::onCollapsed(QListViewItem* item)
1527 {
1528   QAD_ObjectBrowserItem* aItem = (QAD_ObjectBrowserItem*)item;
1529   if (!myStudy->_is_nil() && aItem)
1530   {
1531     SALOMEDS::SObject_var Object = myStudy->FindObjectID(aItem->getEntry());
1532     if (!Object->_is_nil())
1533     {
1534       SALOMEDS::StudyBuilder_var StudyBuilder = myStudy->NewBuilder();
1535       SALOMEDS::AttributeOpened_var  anAttr = SALOMEDS::AttributeOpened::_narrow(
1536                    StudyBuilder->FindOrCreateAttribute(Object, "AttributeOpened") );
1537       anAttr->SetOpened(false);
1538     }
1539   }
1540 }
1541
1542 /*!
1543   Find and returns value for the object
1544   Warning: object can have several values attributes, search is done in the following order:
1545   [integer], [real], [table of integer], [table of real], [comment]
1546 */
1547 QString QAD_ObjectBrowser::getValueFromObject( SALOMEDS::SObject_ptr SO )
1548 {
1549   if ( SO->_is_nil() )
1550     return QString::null;
1551   SALOMEDS::SComponent_var isComponent = SALOMEDS::SComponent::_narrow( SO );
1552   if ( !isComponent->_is_nil() )
1553     return QString::null; // no values to show for components
1554
1555   SALOMEDS::GenericAttribute_var        anAttr;
1556   SALOMEDS::AttributeInteger_var        anInt;
1557   SALOMEDS::AttributeReal_var           aReal;
1558   SALOMEDS::AttributeTableOfInteger_var aTableInt;
1559   SALOMEDS::AttributeTableOfReal_var    aTableReal;
1560   SALOMEDS::AttributeComment_var        aComment;
1561   CORBA::String_var aString;
1562
1563   // Integer
1564   if ( SO->FindAttribute( anAttr, "AttributeInteger" ) ) {
1565     anInt = SALOMEDS::AttributeInteger::_narrow( anAttr );
1566     QString val = QString::number( anInt->Value() );
1567     return val;
1568   }
1569   // Real
1570   if ( SO->FindAttribute( anAttr, "AttributeReal" ) ) {
1571     aReal = SALOMEDS::AttributeReal::_narrow( anAttr );
1572     QString val = QString::number( aReal->Value() );
1573     return val;
1574   } 
1575   // Table of integer
1576   if ( SO->FindAttribute( anAttr, "AttributeTableOfInteger" ) ) {
1577     aTableInt = SALOMEDS::AttributeTableOfInteger::_narrow( anAttr );
1578     aString = aTableInt->GetTitle();
1579     QString tlt( aString.in() );
1580     if ( !tlt.isEmpty() )
1581       tlt += " ";
1582     int nbRows  = aTableInt->GetNbRows() ; 
1583     int nbCols  = aTableInt->GetNbColumns();
1584     QString val = tlt + QString( "[" ) + QString::number( nbRows ) + QString( "," ) + QString::number( nbCols ) + QString( "]" );
1585     return val;
1586   }
1587   // Table of real
1588   if ( SO->FindAttribute( anAttr, "AttributeTableOfReal" ) ) {
1589     aTableReal = SALOMEDS::AttributeTableOfReal::_narrow( anAttr );
1590     aString = aTableReal->GetTitle();
1591     QString tlt( aString.in() );
1592     if ( !tlt.isEmpty() )
1593       tlt += " ";
1594     int nbRows  = aTableReal->GetNbRows() ; 
1595     int nbCols  = aTableReal->GetNbColumns();
1596     QString val = tlt + QString( "[" ) + QString::number( nbRows ) + QString( "," ) + QString::number( nbCols ) + QString( "]" );
1597     return val;
1598   }
1599   // Comment
1600   if ( SO->FindAttribute(anAttr, "AttributeComment") ) {
1601     aComment = SALOMEDS::AttributeComment::_narrow( anAttr );
1602     aString = aComment->Value();
1603     QString val = QString( aString.in() );
1604     return val;
1605   }
1606   return QString::null;
1607 }
1608
1609 /*!
1610   Shows/hides IAPP sub-tree in ObjectBrowser
1611   Current implementation just udpates browser
1612 */
1613 void QAD_ObjectBrowser::setShowIAPP( bool show )
1614 {
1615   Update();
1616 }
1617
1618 /*!
1619   Shows/hides info columns: Entry, IOR, Reference
1620 */
1621 void QAD_ObjectBrowser::setShowInfoColumns( bool show )
1622 {
1623   bool shown = myListView->header()->isResizeEnabled( 2 );
1624   
1625   if ( show != shown ) {
1626     if ( show ) {
1627       myListView->header()->setResizeEnabled( true, 2 );
1628       myListView->header()->setResizeEnabled( true, 3 );
1629       myListView->header()->setResizeEnabled( true, 4 );
1630       myListView->setColumnWidthMode( 2, QListView::Maximum );
1631       myListView->setColumnWidthMode( 3, QListView::Maximum );
1632       myListView->setColumnWidthMode( 4, QListView::Maximum );
1633       if ( myListView->columnWidth( 2 ) <= 0 )
1634         myListView->header()->resizeSection( 2, 50 );
1635       if ( myListView->columnWidth( 3 ) <= 0 )
1636         myListView->header()->resizeSection( 3, 50 );
1637       if ( myListView->columnWidth( 4 ) <= 0 )
1638         myListView->header()->resizeSection( 4, 50 );
1639     }
1640     else {
1641       myListView->setColumnWidthMode( 2, QListView::Manual );
1642       myListView->setColumnWidthMode( 3, QListView::Manual );
1643       myListView->setColumnWidthMode( 4, QListView::Manual );
1644       myListView->header()->resizeSection( 2, 0 );
1645       myListView->header()->resizeSection( 3, 0 );
1646       myListView->header()->resizeSection( 4, 0 );
1647       myListView->header()->setResizeEnabled( false, 2 );
1648       myListView->header()->setResizeEnabled( false, 3 );
1649       myListView->header()->setResizeEnabled( false, 4 );
1650     }
1651   }
1652 }
1653
1654 /*!
1655   Shows/hides Value column
1656 */
1657 void QAD_ObjectBrowser::setShowValueColumn( bool show )
1658 {
1659   bool shown = myListView->header()->isResizeEnabled( 1 );
1660   
1661   if ( show != shown ) {
1662     if ( show ) {
1663       myListView->header()->setResizeEnabled( true, 1 );
1664       myListView->setColumnWidthMode( 1, QListView::Maximum );
1665       if ( myListView->columnWidth( 1 ) <= 0 )
1666         myListView->header()->resizeSection( 1, 50 );
1667     }
1668     else {
1669       myListView->setColumnWidthMode( 1, QListView::Manual );
1670       myListView->header()->resizeSection( 1, 0 );
1671       myListView->header()->setResizeEnabled( false, 1 );
1672     }
1673   }
1674 }
1675
1676 /*!
1677   Sets CHRONO sorting enabled/disabled
1678   Note: when CHRONO sorting is enabled items are sorted by Entry value and column headers 
1679         become unclickable to prohibit another sort type;
1680         when CHRONO sorting is disabled column headers become clickable - this allows
1681         to sort data by any column
1682 */
1683 void QAD_ObjectBrowser::setEnableChronoSort( bool enable )
1684 {
1685   if ( enable ) {
1686     // if CHRONO sorting is enabled set clickable header disabled ...
1687     myListView->header()->setClickEnabled( false );
1688     // ... and then sort by column 2 - OCAF doc entry
1689     myListView->setSorting( 2, TRUE ) ;
1690   }
1691   else {
1692     // if CHRONO sorting is enabled set clickable header enabled ...
1693     myListView->header()->setClickEnabled( true );
1694     // and clear sorting by column 2
1695     myListView->setSorting( 10, TRUE );
1696   }
1697 //  myListView->sort( ) ;  
1698 }
1699
1700 /*!
1701   Slot, called to edit value
1702 */
1703 void QAD_ObjectBrowser::onEditAttribute()
1704 {
1705   QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1706   SALOME_Selection*    Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1707   QString       ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1708   if ( myStudy->_is_nil() )
1709     return;
1710
1711   if ( Sel->IObjectCount() == 1 ) {
1712     SALOMEDS::SObject_var SO = myStudy->FindObjectID( Sel->firstIObject()->getEntry() );
1713     SALOMEDS::SComponent_var isComponent = SALOMEDS::SComponent::_narrow( SO );
1714     if ( !SO->_is_nil() && isComponent->_is_nil() ) { // no values to show for components
1715       SALOMEDS::GenericAttribute_var        anAttr;
1716       SALOMEDS::AttributeInteger_var        anInt;
1717       SALOMEDS::AttributeReal_var           aReal;
1718       SALOMEDS::AttributeTableOfInteger_var aTableInt;
1719       SALOMEDS::AttributeTableOfReal_var    aTableReal;
1720       SALOMEDS::AttributeComment_var        aComment;
1721       bool bOk = false;
1722         
1723       // if Integer
1724       if ( SO->FindAttribute( anAttr, "AttributeInteger" ) ) {
1725         anInt = SALOMEDS::AttributeInteger::_narrow( anAttr );
1726         int val = SALOMEGUI_SetValueDlg::getInteger( tr( "SET_VALUE_INT_TLT" ),
1727                                                      tr( "SET_VALUE_INT_LBL" ),
1728                                                      anInt->Value(),
1729                                                      &bOk,
1730                                                      QAD_Application::getDesktop() );
1731         if ( bOk ) {
1732           anInt->SetValue( val );
1733         }
1734       }
1735       // if Real
1736       else 
1737       if ( SO->FindAttribute( anAttr, "AttributeReal" ) ) {
1738         aReal = SALOMEDS::AttributeReal::_narrow( anAttr );
1739         double val = SALOMEGUI_SetValueDlg::getDouble( tr( "SET_VALUE_REAL_TLT" ),
1740                                                        tr( "SET_VALUE_REAL_LBL" ),
1741                                                        aReal->Value(),
1742                                                        &bOk,
1743                                                        QAD_Application::getDesktop() );
1744         if ( bOk ) {
1745           aReal->SetValue( val );
1746         }
1747       }
1748       // if Table of integer
1749       else
1750       if ( SO->FindAttribute( anAttr, "AttributeTableOfInteger" ) ) {
1751         SALOMEGUI_TableDlg* dlg = new SALOMEGUI_TableDlg( QAD_Application::getDesktop(),
1752                                                           SO, 
1753                                                           true, 
1754                                                           SALOMEGUI_TableDlg::ttInt );
1755         bOk = ( dlg->exec() == QDialog::Accepted );
1756       }
1757       // if Table of real
1758       else
1759       if ( SO->FindAttribute( anAttr, "AttributeTableOfReal" ) ) {
1760         SALOMEGUI_TableDlg* dlg = new SALOMEGUI_TableDlg( QAD_Application::getDesktop(),
1761                                                           SO, 
1762                                                           true, 
1763                                                           SALOMEGUI_TableDlg::ttReal );
1764         bOk = ( dlg->exec() == QDialog::Accepted );
1765       }
1766       // if Comment
1767       else
1768       if ( SO->FindAttribute(anAttr, "AttributeComment") ) {
1769         aComment = SALOMEDS::AttributeComment::_narrow( anAttr );
1770         QString val = SALOMEGUI_SetValueDlg::getString( tr( "SET_VALUE_COMMENT_TLT" ),
1771                                                         tr( "SET_VALUE_COMMENT_LBL" ),
1772                                                         aComment->Value(),
1773                                                         &bOk,
1774                                                         QAD_Application::getDesktop() );
1775         if ( bOk ) {
1776           aComment->SetValue( val );
1777         }
1778       }
1779       if ( bOk ) {
1780         Update();
1781       }
1782     }
1783   }
1784 }
1785
1786 /*!
1787   Returns true if object has editable attrubute : 
1788   integer, real, table or comment
1789 */
1790 bool QAD_ObjectBrowser::hasEditableAttribute( const Handle(SALOME_InteractiveObject)& object )
1791 {
1792   if ( !myStudy->_is_nil() ) {
1793     SALOMEDS::SObject_var obj  = myStudy->FindObjectID( object->getEntry() );
1794     SALOMEDS::SComponent_var comp = myStudy->FindComponentID( object->getEntry() );
1795     if ( !comp->_is_nil() || obj->_is_nil() )
1796       return false;
1797     QString val = getValueFromObject( obj );
1798     return ( !val.isNull() );
1799   }
1800   return false;
1801 }
1802
1803 /*!
1804   Returns true if object has table attrubute ( integer and/or real )
1805 */
1806 bool QAD_ObjectBrowser::hasTable( const Handle(SALOME_InteractiveObject)& object )
1807 {
1808   SALOMEDS::GenericAttribute_var anAttr;
1809   if ( !myStudy->_is_nil() ) {
1810     SALOMEDS::SObject_var obj  = myStudy->FindObjectID( object->getEntry() );
1811     SALOMEDS::SComponent_var comp = myStudy->FindComponentID( object->getEntry() );
1812     if ( !comp->_is_nil() || obj->_is_nil() )
1813       return false;
1814     if ( obj->FindAttribute( anAttr, "AttributeTableOfInteger" ) )
1815       return true;
1816     if ( obj->FindAttribute( anAttr, "AttributeTableOfReal" ) )
1817       return true;
1818   }
1819   return false;
1820 }
1821
1822 /*!
1823   Slot, called when one of the UseCase Browser menu command is called
1824 */
1825 void QAD_ObjectBrowser::onUseCasePopupMenu( int action )
1826 {
1827   if ( myStudy->_is_nil() )
1828     return;
1829   
1830   // Check if the study is locked
1831   QAD_Desktop* Desktop     = (QAD_Desktop*) QAD_Application::getDesktop();
1832   QAD_Study* myActiveStudy = Desktop->getActiveStudy();
1833   SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
1834   if ( aStudy->GetProperties()->IsLocked() )
1835     {
1836       QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(),
1837                               QObject::tr("WRN_WARNING"), 
1838                               QObject::tr("WRN_STUDY_LOCKED"),
1839                               QObject::tr("BUT_OK") );
1840       return;
1841     }
1842
1843   SALOME_Selection* Sel    = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1844   SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
1845   SALOMEDS::SObject_var Current = UCBuilder->GetCurrentObject();
1846   CORBA::String_var aString;
1847
1848   QList<QListViewItem> ucSelected; 
1849   ucSelected.setAutoDelete( false );
1850   getSelectedParents( myUseCaseView, ucSelected );
1851
1852   if ( action == UC_NEW_EMPTY_ID ) {
1853     if ( ucSelected.count() == 1 ) {
1854       if ( isRootItem( ucSelected.at(0) ) )
1855         UCBuilder->SetRootCurrent();
1856       else
1857         UCBuilder->SetCurrentObject( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) );
1858       UCBuilder->AddUseCase( tr( "NEW_OBJECT" ) ); 
1859       myActiveStudy->updateUseCaseBrowser();
1860     }
1861   }
1862   else
1863   if ( action == UC_SET_CURRENT_ID ) {
1864     if ( ucSelected.count() > 0 ) {
1865       if ( isRootItem( ucSelected.at(0) ) )
1866         UCBuilder->SetRootCurrent();
1867       else
1868         UCBuilder->SetCurrentObject( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) );
1869     }
1870     myActiveStudy->updateUseCaseBrowser( );
1871   }
1872   else
1873   if ( action == UC_RENAME_ID ) {
1874     if ( ucSelected.count() == 1 ) {
1875       QAD_ObjectBrowserItem* useCaseItem = ( QAD_ObjectBrowserItem* )( ucSelected.at( 0 ) );
1876       aString = UCBuilder->GetName();
1877       if ( isRootItem( useCaseItem ) ) {
1878         QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), aString.in() );
1879         if ( !name.isEmpty() ) {
1880           UCBuilder->SetName( name.latin1() );
1881           myActiveStudy->updateUseCaseBrowser( );
1882         }
1883       }
1884       else/* if ( UCBuilder->IsUseCase( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) ) )*/ {
1885         QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), aString.in() );
1886         if ( !name.isEmpty() ) {
1887           myActiveStudy->renameIObject( Sel->firstIObject(), name );
1888         }
1889       }
1890     }
1891   }
1892   else 
1893   if ( action == UC_APPEND_ID ) {
1894     if ( Sel->IObjectCount() > 0 ) {
1895       SALOME_ListIO SelIO; SelIO = Sel->StoredIObjects();
1896       SALOME_ListIteratorOfListIO SelIt( SelIO );
1897       for( ; SelIt.More(); SelIt.Next() ) {
1898         SALOMEDS::SObject_var selSO = myStudy->FindObjectID( SelIt.Value()->getEntry() );
1899         if ( !selSO->_is_nil() && strcmp( SelIt.Value()->getEntry(), ( "0:2" ) ) != 0 ) {
1900           UCBuilder->Remove( selSO );  // first remove object for sure ...
1901           UCBuilder->Append( selSO );  // ... and now re-append it
1902         }
1903       }
1904       myActiveStudy->updateUseCaseBrowser( true );
1905     }
1906   }
1907   else 
1908   if ( action == UC_REMOVE_ID ) {
1909     ucSelected.clear();
1910     getSelectedParents( myUseCaseView, ucSelected, true );
1911     for ( int i = 0; i < ucSelected.count(); i++ ) {
1912       QAD_ObjectBrowserItem* item = ( QAD_ObjectBrowserItem* )ucSelected.at( i );
1913       if ( !isRootItem( item ) ) {
1914         // SObject selected
1915         SALOMEDS::SObject_var SO = myStudy->FindObjectID( item->getEntry() );
1916         if ( !SO->_is_nil() ) {
1917           UCBuilder->Remove( SO );
1918         }
1919       }
1920       else {
1921       }
1922     }
1923     Sel->ClearIObjects();
1924     myActiveStudy->updateUseCaseBrowser( true );
1925   }
1926   else 
1927   if ( action == UC_CLEAR_ID ) {
1928     if ( myUseCaseView->childCount() > 0 && myUseCaseView->firstChild()->childCount() > 0) {
1929       QAD_ObjectBrowserItem* child = ( QAD_ObjectBrowserItem* )myUseCaseView->firstChild()->firstChild();
1930       while ( child ) {
1931         UCBuilder->Remove( myStudy->FindObjectID( child->getEntry().latin1() ) );
1932         child = ( QAD_ObjectBrowserItem* )( child->nextSibling() );
1933       }
1934       Sel->ClearIObjects();
1935       myActiveStudy->updateUseCaseBrowser();
1936     }
1937   }
1938 }
1939 /*!
1940   Use Case browser buttons slot
1941 */
1942 void QAD_ObjectBrowser::onUseCaseBtn()
1943 {
1944   // Check if the study is locked
1945   QAD_Desktop* Desktop     = (QAD_Desktop*) QAD_Application::getDesktop();
1946   QAD_Study* myActiveStudy = Desktop->getActiveStudy();
1947   SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
1948   if ( aStudy->GetProperties()->IsLocked() )
1949     {
1950       QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(),
1951                               QObject::tr("WRN_WARNING"), 
1952                               QObject::tr("WRN_STUDY_LOCKED"),
1953                               QObject::tr("BUT_OK") );
1954       return;
1955     }
1956   
1957   if ( sender() == myNewBtn ) {
1958     SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
1959     UCBuilder->AddUseCase( tr( "NEW_OBJECT" ) ); 
1960     myActiveStudy->updateUseCaseBrowser();
1961   }
1962   if ( sender() == myAddBtn )
1963     onUseCasePopupMenu( UC_APPEND_ID );
1964   if ( sender() == myDelBtn )
1965     onUseCasePopupMenu( UC_REMOVE_ID );
1966   if ( sender() == myClearBtn )
1967     onUseCasePopupMenu( UC_CLEAR_ID );
1968   if ( sender() == myCurrentBtn )
1969     onUseCasePopupMenu( UC_SET_CURRENT_ID );
1970 }
1971
1972 /* 
1973    Show/remove UseCase Browser 
1974 */
1975
1976 void QAD_ObjectBrowser::showUseCaseBrowser ( bool show )
1977 {
1978   bool shown = (this->count() > 1);
1979   
1980   if (show != shown)
1981     {
1982       if (show)
1983         {
1984           this->addTab( myVBox, tr( "TLT_USECASE_BROWSER" ) );
1985           UpdateUseCaseBrowser();
1986           unHighlightAll();
1987         }
1988       else
1989         this->removePage(myVBox);
1990     }
1991 }
1992
1993 /*!
1994   Switch between auto resizing of columns and manual mode
1995 */
1996 void QAD_ObjectBrowser::autoSizeColumns( bool autosize )
1997 {
1998   if (autosize)
1999     {
2000       for (int i = 0; i < myListView->header()->count(); i++ )
2001         if (myListView->header()->isResizeEnabled(i))
2002           myListView->setColumnWidthMode(i, QListView::Maximum);
2003       
2004     }
2005   else
2006     {
2007       for (int i = 0; i < myListView->header()->count(); i++ )
2008         myListView->setColumnWidthMode(i, QListView::Manual); 
2009     }
2010 }