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