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