Salome HOME
import SalomePro v1.2c
[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( QString(aFatherName->Value()) + "GUI", msg )) {
692                   QPixmap icon ( resMgr->loadPixmap( QString(aFatherName->Value()) + "GUI",
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   myListView->clear();
716   myListViewMap.clear();
717
718   if ( myStudy->_is_nil() ) {
719     return;
720   }
721
722   QString ShowIAPP = QAD_CONFIG->getSetting("ObjectBrowser:IAPP");
723
724   /* Updating Object Browser ============================================== */
725   SALOMEDS::SComponentIterator_var itcomp = myStudy->NewComponentIterator();
726   for (; itcomp->More(); itcomp->Next()) {
727     QAD_ObjectBrowserItem*   Item     = 0;
728     SALOMEDS::SComponent_var SC       = itcomp->Value();
729     QString                  dataType = strdup( SC->ComponentDataType() );
730     QString                  ior      = "";
731     QString                  SCEntry  = strdup( SC->GetID() );
732
733     SALOMEDS::GenericAttribute_var    anAttr;
734     SALOMEDS::AttributeName_var       aName;
735     SALOMEDS::AttributeComment_var    aCmnt;
736     SALOMEDS::AttributeIOR_var        anIOR;
737     SALOMEDS::AttributeReal_var       aReal;
738     SALOMEDS::AttributeInteger_var    anInt;
739     SALOMEDS::AttributeSelectable_var aSelectable;
740     SALOMEDS::AttributeExpandable_var anExpandable;
741     SALOMEDS::AttributeOpened_var     anOpened;
742     SALOMEDS::AttributePixMap_var     aPixmap;
743     SALOMEDS::AttributeTextColor_var  aTextColor;
744     SALOMEDS::AttributeTextHighlightColor_var  aTextHighlightColor;
745
746     if (SC->FindAttribute(anAttr, "AttributeIOR")) {
747       anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
748       ior = strdup( anIOR->Value() );
749     }
750
751     bool caseIAPP = false;
752
753     // create data-tree item, corresponding to component (and set name if component has it)
754     if ( dataType.compare("Interface Applicative") == 0 ) {
755       caseIAPP = true;
756       if ( ShowIAPP.compare("true") == 0 ) {
757         if (SC->FindAttribute(anAttr, "AttributeName")) {
758           aName = SALOMEDS::AttributeName::_narrow(anAttr);
759           Item = AddItem (myListView, strdup( aName->Value() ), strdup( SCEntry ), ior, 1, "");
760           myListViewMap[ SCEntry ].append( Item );
761         } 
762         else {
763           Item = AddItem (myListView, dataType, SCEntry, ior, 1, "");
764           myListViewMap[ SCEntry ].append( Item );
765         }
766
767       }
768     } 
769     else {
770       caseIAPP = false;
771       if (SC->FindAttribute(anAttr, "AttributeName")) {
772         aName = SALOMEDS::AttributeName::_narrow(anAttr);
773         Item = AddItem (myListView, strdup( aName->Value() ), SCEntry, ior, 1, "");
774         myListViewMap[ SCEntry ].append( Item );
775       } 
776       else {
777         /*In according to CAF - any label (even if it is empty) exist during to whole session.
778           So, if label haven't an "AttributeName" it is means that the label is empty.
779           Therefore follow action couses bug - 
780         Item = AddItem (myListView, dataType,       SC->GetID(), ior, 1, "");
781         */
782       }
783     }
784     // add other attributes 
785     if (Item) {
786       QAD_ObjectBrowserItem* subItem;
787       // Selectable
788       if ( SC->FindAttribute(anAttr, "AttributeSelectable") ) {
789         aSelectable = SALOMEDS::AttributeSelectable::_narrow(anAttr);
790         Item->setSelectable(aSelectable->IsSelectable());
791       }
792       // Expandable
793       if ( SC->FindAttribute(anAttr, "AttributeExpandable") ) {
794         anExpandable = SALOMEDS::AttributeExpandable::_narrow(anAttr);
795         Item->setExpandable(anExpandable->IsExpandable());
796       }
797       // Opened
798       if ( SC->FindAttribute(anAttr, "AttributeOpened") ) {
799         anOpened = SALOMEDS::AttributeOpened::_narrow(anAttr);
800         Item->setOpen(anOpened->IsOpened());
801       }
802       // TextColor
803       if ( SC->FindAttribute(anAttr, "AttributeTextColor") ) {
804         aTextColor = SALOMEDS::AttributeTextColor::_narrow(anAttr);
805         QColor aColor((int)(aTextColor->TextColor().R), (int)(aTextColor->TextColor().G), (int)(aTextColor->TextColor().B)) ;
806         Item->setTextColor(aColor);
807       }
808       // TextHighlightColor
809       if ( SC->FindAttribute(anAttr, "AttributeTextHighlightColor") ) {
810         aTextHighlightColor = SALOMEDS::AttributeTextHighlightColor::_narrow(anAttr);
811         QColor aColor((int)(aTextHighlightColor->TextHighlightColor().R), 
812                       (int)(aTextHighlightColor->TextHighlightColor().G), 
813                       (int)(aTextHighlightColor->TextHighlightColor().B)) ;
814         Item->setTextHighlightColor(aColor);
815       }
816       
817       // Pixmap
818       if ( SC->FindAttribute(anAttr, "AttributePixMap") ) {
819         aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
820         if ( aPixmap->HasPixMap() ) {
821           QString msg;
822           QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager();
823           if ( resMgr ) {
824             MESSAGE ( " Component " << aName->Value() )
825               MESSAGE ( " Icon " << aPixmap->GetPixMap() )
826             if(resMgr->loadResources( QString(aName->Value()) + "GUI", msg )) {
827               QPixmap icon ( resMgr->loadPixmap( QString(aName->Value()) + "GUI",
828                                                  tr(aPixmap->GetPixMap()) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ));
829               Item->setPixmap( 0, icon );
830             }
831           }
832         }
833       }
834       /*
835          if ( strcmp(dataType, TypeComponent) == 0 )
836          Item->setOpen(TRUE);
837       */
838       if ( caseIAPP && ShowIAPP.compare("true") == 0 )
839         Update (SC, Item);
840       
841       if ( !caseIAPP )
842         Update (SC, Item);
843     }
844   }
845   /* Updating UseCase Browser ============================================= */
846   UpdateUseCaseBrowser();
847 }
848
849 /*!
850   Removes item with all childs from the map - used to optimize UseCase browser update
851 */
852 void removeFromMap( ItemMap& theMap, QAD_ObjectBrowserItem* item )
853 {
854   if ( item ) {
855     QAD_ObjectBrowserItem* subItem = ( QAD_ObjectBrowserItem* )( item->firstChild() );
856     while ( subItem ) {
857       removeFromMap( theMap, subItem );
858       subItem = ( QAD_ObjectBrowserItem* )( subItem->nextSibling() );
859     }
860     if ( theMap.contains( item->getEntry() ) ) {
861       theMap[ item->getEntry() ].removeRef( item );
862       if ( theMap[ item->getEntry() ].isEmpty() ) {
863         theMap.remove( item->getEntry() );
864       }
865     }
866   }
867 }
868
869 /*!
870   Updates only UseCase Browser
871 */
872 void QAD_ObjectBrowser::UpdateUseCaseBrowser() {
873 //  myUseCaseView->clear(); myUseCaseMap.clear();
874   if ( myStudy->_is_nil() ) {
875     return;
876   }
877   myUseCaseView->blockSignals( true );
878 //  myUseCaseView->setUpdatesEnabled( false );
879
880   QAD_ObjectBrowserItem* root = ( QAD_ObjectBrowserItem* )myUseCaseView->firstChild();
881   SALOMEDS::UseCaseBuilder_var  UCBuilder = myStudy->GetUseCaseBuilder();
882   SALOMEDS::SObject_var SOCurrent = UCBuilder->GetCurrentObject();
883   QString UCName = QString( strdup( UCBuilder->GetName() ) );
884   if ( UCName.isEmpty() )
885     UCName = QString( tr( "Root" ) );
886   // creating root item if is not yet created
887   if ( !root ) {
888     root = AddItem( myUseCaseView, UCName, "0:2", "", 1, "" );
889     myUseCaseMap[ "0:2" ].append( root );
890   }
891   else
892     root->setName( UCName );
893   // setting it current if necessary
894   root->setCurrent( SOCurrent->_is_nil() || !strcmp( SOCurrent->GetID(), "0:2" ) );
895   // updating list view...
896   QMap<QString,SALOMEDS::SObject_var> ucList;
897   SALOMEDS::UseCaseIterator_var UCIter = UCBuilder->GetUseCaseIterator( SALOMEDS::SObject::_nil() );
898   if ( !UCIter->_is_nil() ) {
899     for ( ; UCIter->More(); UCIter->Next() ) {
900       SALOMEDS::SObject_var UCObject = UCIter->Value();
901       QString UCEntry = strdup( UCObject->GetID() );
902       ucList[ UCEntry ] = UCObject;
903     }
904   }
905   // ... 1) delete removed items
906   QAD_ObjectBrowserItem* childItem = ( QAD_ObjectBrowserItem* )root->firstChild();
907   while ( childItem ) {
908     QAD_ObjectBrowserItem* prevItem = childItem;
909     childItem = ( QAD_ObjectBrowserItem* )childItem->nextSibling();
910     if ( !ucList.contains( prevItem->getEntry() ) ) {
911 //      myUseCaseMap[ prevItem->getEntry() ].removeRef( prevItem );
912 //      if ( myUseCaseMap[ prevItem->getEntry() ].isEmpty() )
913 //      myUseCaseMap.remove( prevItem->getEntry() );
914       removeFromMap( myUseCaseMap, prevItem );
915       delete prevItem;
916     }
917   }
918   // ... 2) create/update existing
919   QMap<QString,SALOMEDS::SObject_var>::Iterator it;
920   for ( it = ucList.begin(); it != ucList.end(); ++it ) {
921     UpdateUCItem( it.data(), root );
922   }
923   myUseCaseView->blockSignals( false );
924 //  myUseCaseView->setUpdatesEnabled( true );
925 //  myUseCaseView->update();
926 //  UCItem->setOpen( true );
927 }
928
929 /*!
930   Updates UseCase Browser's item
931 */
932 void QAD_ObjectBrowser::UpdateUCItem( SALOMEDS::SObject_var UCObject, QAD_ObjectBrowserItem* UCItem )
933 {
934   if ( myStudy->_is_nil() || !UCItem )
935     return;
936
937   /* Creating SObjects item */
938   SALOMEDS::SObject_var                      RefSO;
939   SALOMEDS::GenericAttribute_var             anAttr;
940   SALOMEDS::AttributeName_var                aName;
941   SALOMEDS::AttributeIOR_var                 anIOR;
942   SALOMEDS::AttributeSelectable_var          aSelectable;
943   SALOMEDS::AttributeExpandable_var          anExpandable;
944   SALOMEDS::AttributePixMap_var              aPixmap;
945   SALOMEDS::AttributeTextColor_var           aTextColor;
946   SALOMEDS::AttributeTextHighlightColor_var  aTextHighlightColor;
947   QString                                    valueString;
948   QString                                    ior = "";
949   QString                                    UCEntry = strdup( UCObject->GetID() );
950
951   SALOMEDS::UseCaseBuilder_var               UCBuilder = myStudy->GetUseCaseBuilder();
952   SALOMEDS::SObject_var                      SOCurrent = UCBuilder->GetCurrentObject();
953
954   bool bFound = false;
955   QAD_ObjectBrowserItem* UCSubItem = 0;
956   if ( myUseCaseMap.contains( UCEntry ) && myUseCaseMap[ UCEntry ].count() > 0 )
957     UCSubItem = myUseCaseMap[ UCEntry ].first();
958
959 //  if ( !bFound ) {
960   if ( UCObject->ReferencedObject( RefSO ) && !RefSO->_is_nil() ) {
961     QString RefSOEntry = strdup( RefSO->GetID() );
962     if ( UCObject->FindAttribute( anAttr, "AttributeName" ) || RefSO->FindAttribute( anAttr, "AttributeName" ) ) {
963       aName = SALOMEDS::AttributeName::_narrow( anAttr );
964       if ( RefSO->FindAttribute( anAttr, "AttributeIOR" ) ) {
965         anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr );
966         ior = strdup( anIOR->Value() );
967       }
968       valueString = getValueFromObject( RefSO );
969       if ( !UCSubItem ) {
970         UCSubItem = AddItem( UCItem, 
971                              QString( " * " ) + strdup( aName->Value() ), 
972                              RefSOEntry, 
973                              ior, 
974                              2, 
975                              UCEntry, 
976                              valueString );
977         myUseCaseMap[ RefSOEntry ].append( UCSubItem );
978       }
979       else {
980         UCSubItem->setName( QString( " * " ) + strdup( aName->Value() ) );
981         UCSubItem->setEntry( RefSOEntry );
982         UCSubItem->setIOR( ior );
983         UCSubItem->setReference( UCEntry );
984         UCSubItem->setValue( valueString );
985       }
986       UCSubItem->setCurrent( !SOCurrent->_is_nil() && QString( SOCurrent->GetID() ) == QString( UCEntry ) );
987     }
988   } 
989   else {
990     // getting Value
991     valueString = getValueFromObject( UCObject );
992     // getting IOR
993     if ( UCObject->FindAttribute( anAttr, "AttributeIOR" ) )  {
994       anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr );
995       ior = strdup( anIOR->Value() );
996     }
997     // getting Name and adding new Item
998     if ( UCObject->FindAttribute( anAttr, "AttributeName" ) ) {
999       aName = SALOMEDS::AttributeName::_narrow( anAttr );
1000       if ( !UCSubItem ) {
1001         UCSubItem = AddItem( UCItem, strdup( aName->Value() ), UCEntry, ior, 0, "", valueString );
1002         myUseCaseMap[ UCEntry ].append( UCSubItem );
1003       }
1004       else {
1005         UCSubItem->setName( strdup( aName->Value() ) );
1006         UCSubItem->setEntry( UCEntry );
1007         UCSubItem->setIOR( ior );
1008         UCSubItem->setReference( "" );
1009         UCSubItem->setValue( valueString );
1010       }
1011     } 
1012     // adding other attributes 
1013     if ( UCSubItem ) {
1014       UCSubItem->setCurrent( !SOCurrent->_is_nil() && QString( SOCurrent->GetID() ) == QString( UCEntry ) );
1015 //  Selectable
1016 //      if ( UCObject->FindAttribute( anAttr, "AttributeSelectable" ) ) {
1017 //      aSelectable = SALOMEDS::AttributeSelectable::_narrow( anAttr );
1018 //      UCSubItem->setSelectable( aSelectable->IsSelectable() );
1019 //      }
1020 // Expandable
1021 //      if ( UCObject->FindAttribute( anAttr, "AttributeExpandable" ) ) {
1022 //      anExpandable = SALOMEDS::AttributeExpandable::_narrow( anAttr );
1023 //      UCSubItem->setExpandable( anExpandable->IsExpandable() );
1024 //      }
1025 // TextColor
1026       if ( UCObject->FindAttribute(anAttr, "AttributeTextColor" ) ) {
1027         aTextColor = SALOMEDS::AttributeTextColor::_narrow( anAttr );
1028         QColor aColor( (int)(aTextColor->TextColor().R), 
1029                        (int)(aTextColor->TextColor().G), 
1030                        (int)(aTextColor->TextColor().B) );
1031         UCSubItem->setTextColor( aColor );
1032       }
1033       // TextHighlightColor
1034       if ( UCObject->FindAttribute( anAttr, "AttributeTextHighlightColor" ) ) {
1035         aTextHighlightColor = SALOMEDS::AttributeTextHighlightColor::_narrow( anAttr );
1036         QColor aColor( (int)(aTextHighlightColor->TextHighlightColor().R), 
1037                        (int)(aTextHighlightColor->TextHighlightColor().G), 
1038                        (int)(aTextHighlightColor->TextHighlightColor().B) );
1039         UCSubItem->setTextHighlightColor( aColor );
1040       }
1041       // Pixmap
1042       if ( UCObject->FindAttribute( anAttr, "AttributePixMap" ) ) {
1043         aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
1044         if ( aPixmap->HasPixMap() ) {
1045           SALOMEDS::SComponent_var father = UCObject->GetFatherComponent();
1046           if ( father->FindAttribute( anAttr, "AttributeName" ) ) {
1047             SALOMEDS::AttributeName_var aFatherName;
1048             aFatherName = SALOMEDS::AttributeName::_narrow( anAttr );
1049             QAD_ResourceMgr* resMgr = QAD_Desktop::getResourceManager();
1050             if ( resMgr ) {
1051               QString msg;
1052               if( resMgr->loadResources( QString( aFatherName->Value() ) + "GUI", msg ) ) {
1053                 QPixmap icon ( resMgr->loadPixmap( QString( aFatherName->Value() ) + "GUI",
1054                                                    tr( aPixmap->GetPixMap() ) /*tr( "ICON_OBJBROWSER_" + theComponent )*/ ) );
1055                 UCSubItem->setPixmap( 0, icon );
1056               }
1057             }
1058           }
1059         }
1060       }
1061     } 
1062   }
1063   if ( UCSubItem ) {
1064     // updating children ...
1065     QMap<QString,SALOMEDS::SObject_var> ucList;
1066     SALOMEDS::UseCaseIterator_var UCIter = UCBuilder->GetUseCaseIterator( UCObject );
1067     if ( !UCIter->_is_nil() ) {
1068       for ( ; UCIter->More(); UCIter->Next() ) {
1069         SALOMEDS::SObject_var UCSubObject = UCIter->Value();
1070         QString UCSubEntry = strdup( UCSubObject->GetID() );
1071         ucList[ UCSubEntry ] = UCSubObject;
1072       }
1073     }
1074     // ... 1) delete removed items
1075     QAD_ObjectBrowserItem* childItem = ( QAD_ObjectBrowserItem* )UCSubItem->firstChild();
1076     while ( childItem ) {
1077       QAD_ObjectBrowserItem* prevItem = childItem;
1078       childItem = ( QAD_ObjectBrowserItem* )childItem->nextSibling();
1079       if ( !ucList.contains( prevItem->getEntry() ) ) {
1080         //      myUseCaseMap[ prevItem->getEntry() ].removeRef( prevItem );
1081         //      if ( myUseCaseMap[ prevItem->getEntry() ].isEmpty() )
1082         //      myUseCaseMap.remove( prevItem->getEntry() );
1083         removeFromMap( myUseCaseMap, prevItem );
1084         delete prevItem;
1085       }
1086     }
1087     // ... 2) create/update existing
1088     QMap<QString,SALOMEDS::SObject_var>::Iterator it;
1089     for ( it = ucList.begin(); it != ucList.end(); ++it ) {
1090       UpdateUCItem( it.data(), UCSubItem );
1091     }
1092   }
1093 }
1094
1095 /*!
1096   Unhighlights all items
1097 */
1098 void QAD_ObjectBrowser::unHighlightAll()
1099 {
1100   myListView->clearSelection();
1101   myUseCaseView->clearSelection();
1102 }
1103
1104 /*!
1105   Highlights items which refer to object
1106 */
1107 void QAD_ObjectBrowser::highlight( const Handle(SALOME_InteractiveObject)& IObject, bool highlight )
1108 {
1109   QList<QAD_ObjectBrowserItem> List;
1110   if (getItems(IObject, List)) {
1111     for (int i = 0; i < List.count(); i++) {
1112       List.at(i)->setSelected( highlight );
1113       List.at(i)->repaint();
1114     } 
1115   }
1116 }
1117
1118 /*!
1119   Gets items from Object Browser which refer to object 
1120 */
1121 bool QAD_ObjectBrowser::getItems( const Handle(SALOME_InteractiveObject)& IObject, 
1122                                   QList<QAD_ObjectBrowserItem>& List)
1123 {
1124   List.clear();
1125   if ( myListViewMap.contains( IObject->getEntry() ) ) {
1126     ItemList ilist = myListViewMap[ IObject->getEntry() ];
1127     for ( int i = 0; i < ilist.count(); i++ )
1128       List.append( ilist.at(i) );
1129   }
1130   if ( myUseCaseMap.contains( IObject->getEntry() ) ) {
1131     ItemList ilist = myUseCaseMap[ IObject->getEntry() ];
1132     for ( int i = 0; i < ilist.count(); i++ )
1133       List.append( ilist.at(i) );
1134   }
1135   return (List.count() > 0);
1136 }
1137
1138 /*!
1139   Gets items from Object Browser which refer to object 
1140 */
1141 bool QAD_ObjectBrowser::getItems( SALOMEDS::SObject_ptr SO, 
1142                                   QList<QAD_ObjectBrowserItem>& List)
1143 {
1144   List.clear();
1145   if ( myListViewMap.contains( SO->GetID() ) ) {
1146     ItemList ilist = myListViewMap[ SO->GetID() ];
1147     for ( int i = 0; i < ilist.count(); i++ )
1148       List.append( ilist.at(i) );
1149   }
1150   if ( myUseCaseMap.contains( SO->GetID() ) ) {
1151     ItemList ilist = myUseCaseMap[ SO->GetID() ];
1152     for ( int i = 0; i < ilist.count(); i++ )
1153       List.append( ilist.at(i) );
1154   }
1155   return (List.count() > 0);
1156 }
1157
1158 /*!
1159   Gets first item from Object Browser which refers to object (not reference) 
1160 */
1161 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getItem( const Handle(SALOME_InteractiveObject)& IObject )
1162 {
1163   if ( myListViewMap.contains( IObject->getEntry() ) ) {
1164     ItemList ilist = myListViewMap[ IObject->getEntry() ];
1165     for ( int i = 0; i < ilist.count(); i++ ) {
1166       QString aRef   = ilist.at(i)->getReference();
1167       if ( ilist.at(i)->getReference().isEmpty() )
1168         return ilist.at(i);
1169     }
1170   }
1171   return 0;
1172 }
1173
1174 /*!
1175   Finds item from Object Browser corresponding to Object, returns 0 if fails
1176 */
1177 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getItem( SALOMEDS::SObject_ptr SO )
1178 {
1179   if ( myListViewMap.contains( SO->GetID() ) ) {
1180     ItemList ilist = myListViewMap[ SO->GetID() ];
1181     for ( int i = 0; i < ilist.count(); i++ ) {
1182       QString aRef   = ilist.at(i)->getReference();
1183       if ( ilist.at(i)->getReference().isEmpty() )
1184         return ilist.at(i);
1185     }
1186   }
1187   return 0;
1188 }
1189
1190
1191 /*!
1192   Gets first item from UseCase Browser which refers to object (not reference) 
1193 */
1194 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getUCItem( const Handle(SALOME_InteractiveObject)& IObject )
1195 {
1196   if ( myUseCaseMap.contains( IObject->getEntry() ) ) {
1197     ItemList ilist = myUseCaseMap[ IObject->getEntry() ];
1198     for ( int i = 0; i < ilist.count(); i++ ) {
1199       QString aRef   = ilist.at(i)->getReference();
1200       if ( ilist.at(i)->getReference().isEmpty() )
1201         return ilist.at(i);
1202     }
1203   }
1204   return 0;
1205 }
1206
1207 /*!
1208   Finds item from UseCase Browser corresponding to Object, returns 0 if fails
1209 */
1210 QAD_ObjectBrowserItem* QAD_ObjectBrowser::getUCItem( SALOMEDS::SObject_ptr SO )
1211 {
1212   if ( myUseCaseMap.contains( SO->GetID() ) ) {
1213     ItemList ilist = myUseCaseMap[ SO->GetID() ];
1214     for ( int i = 0; i < ilist.count(); i++ ) {
1215       QString aRef   = ilist.at(i)->getReference();
1216       if ( ilist.at(i)->getReference().isEmpty() )
1217         return ilist.at(i);
1218     }
1219   }
1220   return 0;
1221 }
1222 /*!
1223   Finds item corresponding to interactive object, returns 0 if fails
1224 */
1225 void QAD_ObjectBrowser::rename( const Handle(SALOME_InteractiveObject)& IObject, QString newName )
1226 {
1227   QAD_ObjectBrowserItem* item = getItem( IObject );
1228   if ( item ) {
1229     item->setName( newName );
1230     item->repaint();
1231   }
1232   item = getUCItem( IObject );
1233   if ( item ) {
1234     item->setName( newName );
1235     item->repaint();
1236   }
1237 }
1238
1239 /*!
1240   Creates and show specific Popup to this according to current selection (Object Browser)
1241 */
1242 void QAD_ObjectBrowser::showPopupMenu(QListViewItem* theItem)
1243 {
1244   QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1245   SALOME_Selection*    Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1246   QString       ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1247
1248   if (theItem != NULL && ( Sel->IObjectCount()>0 || ActiveComp.isEmpty() ) ) {
1249     createPopup();
1250
1251     if ( myPopup ) {
1252       QAD_Tools::checkPopup( myPopup );
1253       if ( myPopup->count()>0 ) {
1254         myPopup->exec( QCursor::pos() );
1255       }
1256       destroyPopup();
1257     }
1258   }
1259 }
1260
1261 /*!
1262   Creates and show specific Popup to this according to current selection (UseCase Browser)
1263 */
1264 void QAD_ObjectBrowser::showUseCasePopupMenu(QListViewItem* theItem)
1265 {
1266   createPopup();
1267   if ( myPopup ) {
1268     QAD_Tools::checkPopup( myPopup );
1269     if ( myPopup->count() > 0 ) {
1270       myPopup->exec( QCursor::pos() );
1271     }
1272     destroyPopup();
1273   }
1274 }
1275
1276 /*!
1277   Called when current selection was changed (Object Browser)
1278 */
1279 void QAD_ObjectBrowser::onSelectedItem()
1280 {
1281   QListView* whoIs;
1282   if ( sender()->inherits("QListView") )
1283     whoIs = (QListView*)sender();
1284   else
1285     whoIs = myListView;
1286   QAD_Study*   myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1287   SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument();
1288   SALOME_Selection*      Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1289   QAD_Application* myApp     = QAD_Application::getDesktop()->getActiveApp();
1290
1291   SALOME_ListIO DeltaPos;
1292   DeltaPos.Clear();
1293   SALOME_ListIO DeltaNeg;
1294   DeltaNeg.Clear();
1295
1296   QListViewItemIterator it( whoIs );
1297   for ( ; it.current(); ++it ) {
1298     QAD_ObjectBrowserItem* item = (QAD_ObjectBrowserItem*)it.current();
1299     QString theEntry = item->getEntry();
1300     QString theName  = item->getName();
1301     QString theRef   = item->getReference();
1302
1303     if ( !theEntry.isEmpty() ) {
1304       if ( item->isSelected() ) {
1305         bool itemAlreadySelected = false;
1306        
1307         SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() );
1308         for(;It.More();It.Next()) {
1309           Handle(SALOME_InteractiveObject) IO = It.Value();
1310           if ( strcmp ( IO->getEntry(), theEntry ) == 0 ) {
1311             itemAlreadySelected = true;
1312             break;
1313           }
1314         }
1315       
1316         if (!itemAlreadySelected) {
1317           Handle(SALOME_InteractiveObject) newIO;
1318           SALOMEDS::SObject_var obj = aStudy->FindObjectID( theEntry.latin1() );
1319           if ( !obj->_is_nil() ) {
1320             SALOMEDS::SComponent_var comp = obj->GetFatherComponent();
1321             if ( !comp->_is_nil() ) {
1322               Standard_CString datatype = comp->ComponentDataType();
1323               newIO = new SALOME_InteractiveObject( strdup(theEntry),
1324                                                     datatype,
1325                                                     strdup(theName) );
1326               newIO->setReference( strdup(theRef) );
1327             }
1328           } else {
1329             newIO = new SALOME_InteractiveObject( strdup(theEntry),
1330                                                   "",
1331                                                   strdup(theName) );
1332             newIO->setReference( strdup(theRef) );
1333           }
1334           if (!newIO.IsNull()) {
1335             DeltaPos.Append( newIO );
1336           } 
1337         }
1338       } else {
1339         SALOME_ListIteratorOfListIO It1( Sel->StoredIObjects() );
1340         for(;It1.More();It1.Next()) {
1341           Handle(SALOME_InteractiveObject) IO = It1.Value();
1342           if ( strcmp( IO->getEntry(), item->getEntry() ) == 0 ) {
1343             DeltaNeg.Append( IO );
1344             break;
1345           }
1346         }
1347       }
1348     }
1349   }
1350
1351   SALOME_ListIteratorOfListIO ItNeg( DeltaNeg );
1352   for(;ItNeg.More();ItNeg.Next()) {
1353     Sel->RemoveIObject( ItNeg.Value() );
1354   }
1355   
1356   SALOME_ListIteratorOfListIO ItPos( DeltaPos );
1357   for(;ItPos.More();ItPos.Next()) {
1358     Sel->AddIObject( ItPos.Value() );
1359   }
1360   if ( myApp )
1361     myApp->updateActions();
1362 }
1363
1364 /*!
1365   Called when selection is changed (UseCase Browser)
1366 */
1367 void QAD_ObjectBrowser::onUseCaseSelectedItem()
1368 {
1369 }
1370
1371 /*!
1372   Called when item is expanded
1373 */
1374 void QAD_ObjectBrowser::onExpanded (QListViewItem* item)
1375 {
1376   QAD_ObjectBrowserItem* aItem = (QAD_ObjectBrowserItem*)item;
1377   if (!myStudy->_is_nil() && aItem)
1378   {
1379     SALOMEDS::SObject_var Object = myStudy->FindObjectID(aItem->getEntry());
1380     if (!Object->_is_nil())
1381     {
1382       SALOMEDS::StudyBuilder_var StudyBuilder = myStudy->NewBuilder();
1383       SALOMEDS::AttributeOpened_var  anAttr = SALOMEDS::AttributeOpened::_narrow(
1384                    StudyBuilder->FindOrCreateAttribute(Object, "AttributeOpened") );
1385       anAttr->SetOpened(true);
1386     }
1387   }
1388 }
1389
1390 /*!
1391   Called when item is collapsed
1392 */
1393 void QAD_ObjectBrowser::onCollapsed(QListViewItem* item)
1394 {
1395   QAD_ObjectBrowserItem* aItem = (QAD_ObjectBrowserItem*)item;
1396   if (!myStudy->_is_nil() && aItem)
1397   {
1398     SALOMEDS::SObject_var Object = myStudy->FindObjectID(aItem->getEntry());
1399     if (!Object->_is_nil())
1400     {
1401       SALOMEDS::StudyBuilder_var StudyBuilder = myStudy->NewBuilder();
1402       SALOMEDS::AttributeOpened_var  anAttr = SALOMEDS::AttributeOpened::_narrow(
1403                    StudyBuilder->FindOrCreateAttribute(Object, "AttributeOpened") );
1404       anAttr->SetOpened(false);
1405     }
1406   }
1407 }
1408
1409 /*!
1410   Find and returns value for the object
1411   Warning: object can have several values attributes, search is done in the following order:
1412   [integer], [real], [table of integer], [table of real], [comment]
1413 */
1414 QString QAD_ObjectBrowser::getValueFromObject( SALOMEDS::SObject_ptr SO )
1415 {
1416   if ( SO->_is_nil() )
1417     return QString::null;
1418   SALOMEDS::SComponent_var isComponent = SALOMEDS::SComponent::_narrow( SO );
1419   if ( !isComponent->_is_nil() )
1420     return QString::null; // no values to show for components
1421
1422   SALOMEDS::GenericAttribute_var        anAttr;
1423   SALOMEDS::AttributeInteger_var        anInt;
1424   SALOMEDS::AttributeReal_var           aReal;
1425   SALOMEDS::AttributeTableOfInteger_var aTableInt;
1426   SALOMEDS::AttributeTableOfReal_var    aTableReal;
1427   SALOMEDS::AttributeComment_var        aComment;
1428
1429   // Integer
1430   if ( SO->FindAttribute( anAttr, "AttributeInteger" ) ) {
1431     anInt = SALOMEDS::AttributeInteger::_narrow( anAttr );
1432     QString val = QString::number( anInt->Value() );
1433     return val;
1434   }
1435   // Real
1436   if ( SO->FindAttribute( anAttr, "AttributeReal" ) ) {
1437     aReal = SALOMEDS::AttributeReal::_narrow( anAttr );
1438     QString val = QString::number( aReal->Value() );
1439     return val;
1440   } 
1441   // Table of integer
1442   if ( SO->FindAttribute( anAttr, "AttributeTableOfInteger" ) ) {
1443     aTableInt = SALOMEDS::AttributeTableOfInteger::_narrow( anAttr );
1444     QString tlt = QString( strdup( aTableInt->GetTitle() ) );
1445     if ( !tlt.isEmpty() )
1446       tlt += " ";
1447     int nbRows  = aTableInt->GetNbRows() ; 
1448     int nbCols  = aTableInt->GetNbColumns();
1449     QString val = tlt + QString( "[" ) + QString::number( nbRows ) + QString( "," ) + QString::number( nbCols ) + QString( "]" );
1450     return val;
1451   }
1452   // Table of real
1453   if ( SO->FindAttribute( anAttr, "AttributeTableOfReal" ) ) {
1454     aTableReal = SALOMEDS::AttributeTableOfReal::_narrow( anAttr );
1455     QString tlt = QString( strdup( aTableReal->GetTitle() ) );
1456     if ( !tlt.isEmpty() )
1457       tlt += " ";
1458     int nbRows  = aTableReal->GetNbRows() ; 
1459     int nbCols  = aTableReal->GetNbColumns();
1460     QString val = tlt + QString( "[" ) + QString::number( nbRows ) + QString( "," ) + QString::number( nbCols ) + QString( "]" );
1461     return val;
1462   }
1463   // Comment
1464   if ( SO->FindAttribute(anAttr, "AttributeComment") ) {
1465     aComment = SALOMEDS::AttributeComment::_narrow( anAttr );
1466     QString val = QString( strdup( aComment->Value() ) );
1467     return val;
1468   }
1469   return QString::null;
1470 }
1471
1472 /*!
1473   Shows/hides IAPP sub-tree in ObjectBrowser
1474   Current implementation just udpates browser
1475 */
1476 void QAD_ObjectBrowser::setShowIAPP( bool show )
1477 {
1478   Update();
1479 }
1480
1481 /*!
1482   Shows/hides info columns: Entry, IOR, Reference
1483 */
1484 void QAD_ObjectBrowser::setShowInfoColumns( bool show )
1485 {
1486   bool shown = myListView->header()->isResizeEnabled( 2 );
1487   if ( show != shown ) {
1488     if ( show ) {
1489       myListView->header()->setResizeEnabled( true, 2 );
1490       myListView->header()->setResizeEnabled( true, 3 );
1491       myListView->header()->setResizeEnabled( true, 4 );
1492       myListView->setColumnWidthMode( 2, QListView::Maximum );
1493       myListView->setColumnWidthMode( 3, QListView::Maximum );
1494       myListView->setColumnWidthMode( 4, QListView::Maximum );
1495       if ( myListView->columnWidth( 2 ) <= 0 )
1496         myListView->header()->resizeSection( 2, 50 );
1497       if ( myListView->columnWidth( 3 ) <= 0 )
1498         myListView->header()->resizeSection( 3, 50 );
1499       if ( myListView->columnWidth( 4 ) <= 0 )
1500         myListView->header()->resizeSection( 4, 50 );
1501     }
1502     else {
1503       myListView->setColumnWidthMode( 2, QListView::Manual );
1504       myListView->setColumnWidthMode( 3, QListView::Manual );
1505       myListView->setColumnWidthMode( 4, QListView::Manual );
1506       myListView->header()->resizeSection( 2, 0 );
1507       myListView->header()->resizeSection( 3, 0 );
1508       myListView->header()->resizeSection( 4, 0 );
1509       myListView->header()->setResizeEnabled( false, 2 );
1510       myListView->header()->setResizeEnabled( false, 3 );
1511       myListView->header()->setResizeEnabled( false, 4 );
1512     }
1513   }
1514 }
1515
1516 /*!
1517   Shows/hides Value column
1518 */
1519 void QAD_ObjectBrowser::setShowValueColumn( bool show )
1520 {
1521   bool shown = myListView->header()->isResizeEnabled( 1 );
1522   if ( show != shown ) {
1523     if ( show ) {
1524       myListView->header()->setResizeEnabled( true, 1 );
1525       myListView->setColumnWidthMode( 1, QListView::Maximum );
1526       if ( myListView->columnWidth( 1 ) <= 0 )
1527         myListView->header()->resizeSection( 1, 50 );
1528     }
1529     else {
1530       myListView->setColumnWidthMode( 1, QListView::Manual );
1531       myListView->header()->resizeSection( 1, 0 );
1532       myListView->header()->setResizeEnabled( false, 1 );
1533     }
1534   }
1535 }
1536
1537 /*!
1538   Sets CHRONO sorting enabled/disabled
1539   Note: when CHRONO sorting is enabled items are sorted by Entry value and column headers 
1540         become unclickable to prohibit another sort type;
1541         when CHRONO sorting is disabled column headers become clickable - this allows
1542         to sort data by any column
1543 */
1544 void QAD_ObjectBrowser::setEnableChronoSort( bool enable )
1545 {
1546   if ( enable ) {
1547     // if CHRONO sorting is enabled set clickable header disabled ...
1548     myListView->header()->setClickEnabled( false );
1549     // ... and then sort by column 2 - OCAF doc entry
1550     myListView->setSorting( 2, TRUE ) ;
1551   }
1552   else {
1553     // if CHRONO sorting is enabled set clickable header enabled ...
1554     myListView->header()->setClickEnabled( true );
1555     // and clear sorting by column 2
1556     myListView->setSorting( 10, TRUE );
1557   }
1558 //  myListView->sort( ) ;  
1559 }
1560
1561 /*!
1562   Slot, called to edit value
1563 */
1564 void QAD_ObjectBrowser::onEditAttribute()
1565 {
1566   QAD_Study* myActiveStudy = QAD_Application::getDesktop()->getActiveStudy();
1567   SALOME_Selection*    Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1568   QString       ActiveComp = QAD_Application::getDesktop()->getActiveComponent();
1569   if ( myStudy->_is_nil() )
1570     return;
1571
1572   if ( Sel->IObjectCount() == 1 ) {
1573     SALOMEDS::SObject_var SO = myStudy->FindObjectID( Sel->firstIObject()->getEntry() );
1574     SALOMEDS::SComponent_var isComponent = SALOMEDS::SComponent::_narrow( SO );
1575     if ( !SO->_is_nil() && isComponent->_is_nil() ) { // no values to show for components
1576       SALOMEDS::GenericAttribute_var        anAttr;
1577       SALOMEDS::AttributeInteger_var        anInt;
1578       SALOMEDS::AttributeReal_var           aReal;
1579       SALOMEDS::AttributeTableOfInteger_var aTableInt;
1580       SALOMEDS::AttributeTableOfReal_var    aTableReal;
1581       SALOMEDS::AttributeComment_var        aComment;
1582       bool bOk = false;
1583         
1584       // if Integer
1585       if ( SO->FindAttribute( anAttr, "AttributeInteger" ) ) {
1586         anInt = SALOMEDS::AttributeInteger::_narrow( anAttr );
1587         int val = SALOMEGUI_SetValueDlg::getInteger( tr( "SET_VALUE_INT_TLT" ),
1588                                                      tr( "SET_VALUE_INT_LBL" ),
1589                                                      anInt->Value(),
1590                                                      &bOk,
1591                                                      QAD_Application::getDesktop() );
1592         if ( bOk ) {
1593           anInt->SetValue( val );
1594         }
1595       }
1596       // if Real
1597       else 
1598       if ( SO->FindAttribute( anAttr, "AttributeReal" ) ) {
1599         aReal = SALOMEDS::AttributeReal::_narrow( anAttr );
1600         double val = SALOMEGUI_SetValueDlg::getDouble( tr( "SET_VALUE_REAL_TLT" ),
1601                                                        tr( "SET_VALUE_REAL_LBL" ),
1602                                                        aReal->Value(),
1603                                                        &bOk,
1604                                                        QAD_Application::getDesktop() );
1605         if ( bOk ) {
1606           aReal->SetValue( val );
1607         }
1608       }
1609       // if Table of integer
1610       else
1611       if ( SO->FindAttribute( anAttr, "AttributeTableOfInteger" ) ) {
1612         SALOMEGUI_TableDlg* dlg = new SALOMEGUI_TableDlg( QAD_Application::getDesktop(),
1613                                                           SO, 
1614                                                           true, 
1615                                                           SALOMEGUI_TableDlg::ttInt );
1616         bOk = ( dlg->exec() == QDialog::Accepted );
1617       }
1618       // if Table of real
1619       else
1620       if ( SO->FindAttribute( anAttr, "AttributeTableOfReal" ) ) {
1621         SALOMEGUI_TableDlg* dlg = new SALOMEGUI_TableDlg( QAD_Application::getDesktop(),
1622                                                           SO, 
1623                                                           true, 
1624                                                           SALOMEGUI_TableDlg::ttReal );
1625         bOk = ( dlg->exec() == QDialog::Accepted );
1626       }
1627       // if Comment
1628       else
1629       if ( SO->FindAttribute(anAttr, "AttributeComment") ) {
1630         aComment = SALOMEDS::AttributeComment::_narrow( anAttr );
1631         QString val = SALOMEGUI_SetValueDlg::getString( tr( "SET_VALUE_COMMENT_TLT" ),
1632                                                         tr( "SET_VALUE_COMMENT_LBL" ),
1633                                                         aComment->Value(),
1634                                                         &bOk,
1635                                                         QAD_Application::getDesktop() );
1636         if ( bOk ) {
1637           aComment->SetValue( val );
1638         }
1639       }
1640       if ( bOk ) {
1641         Update();
1642       }
1643     }
1644   }
1645 }
1646
1647 /*!
1648   Returns true if object has editable attrubute : 
1649   integer, real, table or comment
1650 */
1651 bool QAD_ObjectBrowser::hasEditableAttribute( const Handle(SALOME_InteractiveObject)& object )
1652 {
1653   if ( !myStudy->_is_nil() ) {
1654     SALOMEDS::SObject_var obj  = myStudy->FindObjectID( object->getEntry() );
1655     SALOMEDS::SComponent_var comp = myStudy->FindComponentID( object->getEntry() );
1656     if ( !comp->_is_nil() || obj->_is_nil() )
1657       return false;
1658     QString val = getValueFromObject( obj );
1659     return ( !val.isNull() );
1660   }
1661   return false;
1662 }
1663
1664 /*!
1665   Returns true if object has table attrubute ( integer and/or real )
1666 */
1667 bool QAD_ObjectBrowser::hasTable( const Handle(SALOME_InteractiveObject)& object )
1668 {
1669   SALOMEDS::GenericAttribute_var anAttr;
1670   if ( !myStudy->_is_nil() ) {
1671     SALOMEDS::SObject_var obj  = myStudy->FindObjectID( object->getEntry() );
1672     SALOMEDS::SComponent_var comp = myStudy->FindComponentID( object->getEntry() );
1673     if ( !comp->_is_nil() || obj->_is_nil() )
1674       return false;
1675     if ( obj->FindAttribute( anAttr, "AttributeTableOfInteger" ) )
1676       return true;
1677     if ( obj->FindAttribute( anAttr, "AttributeTableOfReal" ) )
1678       return true;
1679   }
1680   return false;
1681 }
1682
1683 /*!
1684   Slot, called when one of the UseCase Browser menu command is called
1685 */
1686 void QAD_ObjectBrowser::onUseCasePopupMenu( int action )
1687 {
1688   if ( myStudy->_is_nil() )
1689     return;
1690   QAD_Desktop* Desktop     = (QAD_Desktop*) QAD_Application::getDesktop();
1691   QAD_Study* myActiveStudy = Desktop->getActiveStudy();
1692   SALOME_Selection* Sel    = SALOME_Selection::Selection( myActiveStudy->getSelection() );
1693   SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
1694   SALOMEDS::SObject_var Current = UCBuilder->GetCurrentObject();
1695
1696   QList<QListViewItem> ucSelected; 
1697   ucSelected.setAutoDelete( false );
1698   getSelectedParents( myUseCaseView, ucSelected );
1699
1700   if ( action == UC_NEW_EMPTY_ID ) {
1701     if ( ucSelected.count() == 1 ) {
1702       if ( isRootItem( ucSelected.at(0) ) )
1703         UCBuilder->SetRootCurrent();
1704       else
1705         UCBuilder->SetCurrentObject( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) );
1706       UCBuilder->AddUseCase( tr( "NEW_OBJECT" ) ); 
1707       myActiveStudy->updateUseCaseBrowser();
1708     }
1709   }
1710   else
1711   if ( action == UC_SET_CURRENT_ID ) {
1712     if ( ucSelected.count() > 0 ) {
1713       if ( isRootItem( ucSelected.at(0) ) )
1714         UCBuilder->SetRootCurrent();
1715       else
1716         UCBuilder->SetCurrentObject( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) );
1717     }
1718     myActiveStudy->updateUseCaseBrowser( );
1719   }
1720   else
1721   if ( action == UC_RENAME_ID ) {
1722     if ( ucSelected.count() == 1 ) {
1723       QAD_ObjectBrowserItem* useCaseItem = ( QAD_ObjectBrowserItem* )( ucSelected.at( 0 ) );
1724       if ( isRootItem( useCaseItem ) ) {
1725         QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), strdup( UCBuilder->GetName() ) );
1726         if ( !name.isEmpty() ) {
1727           bool ok = UCBuilder->SetName( strdup( name.latin1() ) );
1728           myActiveStudy->updateUseCaseBrowser( );
1729         }
1730       }
1731       else/* if ( UCBuilder->IsUseCase( myStudy->FindObjectID( (( QAD_ObjectBrowserItem* )( ucSelected.at(0) ))->getEntry() ) ) )*/ {
1732         QString name = SALOMEGUI_NameDlg::getName( QAD_Application::getDesktop(), strdup( useCaseItem->getName() ) );
1733         if ( !name.isEmpty() ) {
1734           myActiveStudy->renameIObject( Sel->firstIObject(), name );
1735         }
1736       }
1737     }
1738   }
1739   else 
1740   if ( action == UC_APPEND_ID ) {
1741     if ( Sel->IObjectCount() > 0 ) {
1742       SALOME_ListIO SelIO; SelIO = Sel->StoredIObjects();
1743       SALOME_ListIteratorOfListIO SelIt( SelIO );
1744       for( ; SelIt.More(); SelIt.Next() ) {
1745         SALOMEDS::SObject_var selSO = myStudy->FindObjectID( SelIt.Value()->getEntry() );
1746         if ( !selSO->_is_nil() && strcmp( SelIt.Value()->getEntry(), ( "0:2" ) ) != 0 ) {
1747           UCBuilder->Remove( selSO );  // first remove object for sure ...
1748           UCBuilder->Append( selSO );  // ... and now re-append it
1749         }
1750       }
1751       myActiveStudy->updateUseCaseBrowser( true );
1752     }
1753   }
1754   else 
1755   if ( action == UC_REMOVE_ID ) {
1756     ucSelected.clear();
1757     getSelectedParents( myUseCaseView, ucSelected, true );
1758     for ( int i = 0; i < ucSelected.count(); i++ ) {
1759       QAD_ObjectBrowserItem* item = ( QAD_ObjectBrowserItem* )ucSelected.at( i );
1760       if ( !isRootItem( item ) ) {
1761         // SObject selected
1762         SALOMEDS::SObject_var SO = myStudy->FindObjectID( item->getEntry() );
1763         if ( !SO->_is_nil() ) {
1764           UCBuilder->Remove( SO );
1765         }
1766       }
1767       else {
1768       }
1769     }
1770     Sel->ClearIObjects();
1771     myActiveStudy->updateUseCaseBrowser( true );
1772   }
1773   else 
1774   if ( action == UC_CLEAR_ID ) {
1775     if ( myUseCaseView->childCount() > 0 && myUseCaseView->firstChild()->childCount() > 0) {
1776       QAD_ObjectBrowserItem* child = ( QAD_ObjectBrowserItem* )myUseCaseView->firstChild()->firstChild();
1777       while ( child ) {
1778         UCBuilder->Remove( myStudy->FindObjectID( child->getEntry().latin1() ) );
1779         child = ( QAD_ObjectBrowserItem* )( child->nextSibling() );
1780       }
1781       Sel->ClearIObjects();
1782       myActiveStudy->updateUseCaseBrowser();
1783     }
1784   }
1785 }
1786 /*!
1787   Use Case browser buttons slot
1788 */
1789 void QAD_ObjectBrowser::onUseCaseBtn()
1790 {
1791   if ( sender() == myNewBtn ) {
1792     QAD_Desktop* Desktop     = (QAD_Desktop*) QAD_Application::getDesktop();
1793     QAD_Study* myActiveStudy = Desktop->getActiveStudy();
1794     SALOMEDS::UseCaseBuilder_var UCBuilder = myStudy->GetUseCaseBuilder();
1795     UCBuilder->AddUseCase( tr( "NEW_OBJECT" ) ); 
1796     myActiveStudy->updateUseCaseBrowser();
1797   }
1798   if ( sender() == myAddBtn )
1799     onUseCasePopupMenu( UC_APPEND_ID );
1800   if ( sender() == myDelBtn )
1801     onUseCasePopupMenu( UC_REMOVE_ID );
1802   if ( sender() == myClearBtn )
1803     onUseCasePopupMenu( UC_CLEAR_ID );
1804   if ( sender() == myCurrentBtn )
1805     onUseCasePopupMenu( UC_SET_CURRENT_ID );
1806 }