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