if ( !parentWidget() || !myBrowser || !myBrowser->isShowToolTips() )
return;
- QListView* lv = myBrowser->getListView();
+ QListView* lv = myBrowser->listView();
QListViewItem* item = lv->itemAt( pos );
SUIT_DataObject* obj = myBrowser->dataObject( item );
myAutoDelObjs( false ),
myRootDecorated( true )
{
- myView = new OB_ListView( this );
- myView->addColumn( "Data" );
+ myView = new OB_ListView( QtxListView::HeaderAuto, this );
+ myView->setAppropriate( myView->addColumn( "Data" ), false );
myView->setSorting( -1 );
myView->setRootIsDecorated( true );
myView->setSelectionMode( QListView::Extended );
myView->installEventFilter( this );
+ myView->viewport()->installEventFilter( this );
QVBoxLayout* main = new QVBoxLayout( this );
main->addWidget( myView );
if ( theRoot )
curObj = storeState( selObjs, openObjs, selKeys, openKeys, curKey );
+ removeConnections( myRoot );
if ( myRoot != theRoot && isAutoDeleteObjects() )
delete myRoot;
if ( myRoot )
updateView( myRoot );
- else if ( getListView() )
+ else if ( listView() )
{
myItems.clear();
- getListView()->clear();
+ listView()->clear();
}
restoreState( selObjs, openObjs, curObj, selKeys, openKeys, curKey );
int OB_Browser::numberOfSelected() const
{
int count = 0;
- if ( getListView() )
+ if ( listView() )
{
- for ( QListViewItemIterator it( getListView() ); it.current(); ++it )
+ for ( QListViewItemIterator it( listView() ); it.current(); ++it )
if ( it.current()->isSelected() )
count++;
}
{
theObjList.clear();
- if ( !getListView() )
+ if ( !listView() )
return;
- for ( QListViewItemIterator it( getListView() ); it.current(); ++it )
+ for ( QListViewItemIterator it( listView() ); it.current(); ++it )
{
if ( it.current()->isSelected() )
{
SUIT_DataObject* obj = dataObject( it.current() );
if ( obj )
- theObjList.append( obj );
+ theObjList.append( obj );
}
}
}
void OB_Browser::setSelected( const DataObjectList& theObjLst, const bool append )
{
- QListView* lv = getListView();
+ QListView* lv = listView();
if ( !lv )
return;
bool OB_Browser::isOpen( SUIT_DataObject* theObject ) const
{
bool res = false;
- if ( getListView() )
- res = getListView()->isOpen( listViewItem( theObject ) );
+ if ( listView() )
+ res = listView()->isOpen( listViewItem( theObject ) );
return res;
}
void OB_Browser::setOpen( SUIT_DataObject* theObject, const bool theOpen )
{
- if ( getListView() )
- getListView()->setOpen( listViewItem( theObject ), theOpen );
+ if ( listView() )
+ listView()->setOpen( listViewItem( theObject ), theOpen );
}
SUIT_DataObject* OB_Browser::dataObjectAt( const QPoint& pos ) const
{
SUIT_DataObject* obj = 0;
- QListView* lv = getListView();
+ QListView* lv = listView();
if ( lv )
obj = dataObject( lv->itemAt( pos ) );
myView->setFilter( f );
}
-int OB_Browser::addColumn( const QString & label, int width, int index )
+int OB_Browser::addColumn( const QString& label, const int id, const int width )
{
- int id = -1;
- if ( !myView )
- return id;
- if ( index != -1 && myColumnIds.contains( index ) )
- return id; // can not reuse index
-
- int trueId = index;
- id = myView->addColumn( label, width );
- if ( trueId == -1 )
- trueId = id;
- myColumnIds.insert( trueId, id );
- updateText();
-
- return trueId;
+ return addColumn( QIconSet(), label, id, width );
}
-int OB_Browser::addColumn( const QIconSet & iconset, const QString & label, int width, int index )
+int OB_Browser::addColumn( const QIconSet& icon, const QString& label, const int id, const int width )
{
- int id = -1;
- if ( !myView )
- return id;
- if ( index != -1 && myColumnIds.contains( index ) )
- return id; // can not reuse index
+ QListView* lv = listView();
+ if ( !lv )
+ return -1;
+
+ int theId = id;
+ if ( theId < 0 )
+ {
+ while ( myColumnIds.contains( theId ) )
+ theId++;
+ }
- int trueId = index;
- id = myView->addColumn( iconset, label, width );
- if ( trueId == -1 )
- trueId = id;
- myColumnIds.insert( trueId, id );
+ if ( myColumnIds.contains( theId ) )
+ return -1; // can not reuse id
+
+ int sec = -1;
+ if ( icon.isNull() )
+ sec = lv->addColumn( label, width );
+ else
+ sec = lv->addColumn( icon, label, width );
+
+ if ( sec == -1 )
+ return -1;
+
+ myColumnIds.insert( theId, sec );
updateText();
- return trueId;
+ return theId;
}
-void OB_Browser::removeColumn( int index )
+void OB_Browser::removeColumn( const int id )
{
- if ( !myView || !myColumnIds.contains( index ) )
+ QListView* lv = listView();
+ if ( !lv || !myColumnIds.contains( id ) )
return;
- int id = myColumnIds[ index ];
- myView->removeColumn( id );
+ int sec = myColumnIds[id];
+ lv->removeColumn( sec );
// update map of column indeces
- myColumnIds.remove( index );
+ myColumnIds.remove( id );
for ( QMap<int, int>::iterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
{
- if ( it.key() > index )
+ if ( it.key() > id )
it.data()--;
}
updateText();
}
-void OB_Browser::updateTree( SUIT_DataObject* o )
+void OB_Browser::setNameTitle( const QString& label )
{
- SUIT_DataObject* obj = o ? o : getRootObject();
- if ( !obj )
+ setNameTitle( QIconSet(), label );
+}
+
+void OB_Browser::setNameTitle( const QIconSet& icon, const QString& label )
+{
+ QListView* lv = listView();
+ if ( !lv )
+ return;
+
+ if ( icon.isNull() )
+ lv->setColumnText( 0, label );
+ else
+ lv->setColumnText( 0, icon, label );
+}
+
+void OB_Browser::setColumnTitle( const int id, const QString& label )
+{
+ setColumnTitle( id, QIconSet(), label );
+}
+
+void OB_Browser::setColumnTitle( const int id, const QIconSet& icon, const QString& label )
+{
+ QListView* lv = listView();
+ if ( !lv || !myColumnIds.contains( id ) )
+ return;
+
+ if ( icon.isNull() )
+ lv->setColumnText( myColumnIds[id], label );
+ else
+ lv->setColumnText( myColumnIds[id], icon, label );
+}
+
+QString OB_Browser::nameTitle() const
+{
+ return myView->columnText( 0 );
+}
+
+QString OB_Browser::columnTitle( const int id ) const
+{
+ QString txt;
+ if ( myColumnIds.contains( id ) )
+ txt = myView->columnText( myColumnIds[id] );
+ return txt;
+}
+
+bool OB_Browser::isColumnVisible( const int id ) const
+{
+ return myColumnIds.contains( id ) && myView->isShown( myColumnIds[id] );
+}
+
+void OB_Browser::setColumnShown( const int id, const bool on )
+{
+ if ( !myColumnIds.contains( id ) )
+ return;
+
+ myView->setShown( myColumnIds[id], on );
+}
+
+void OB_Browser::setWidthMode( QListView::WidthMode mode )
+{
+ for ( int i = 0, n = myView->columns(); i < n; i++ )
+ myView->setColumnWidthMode( i, mode );
+}
+
+QValueList<int> OB_Browser::columns() const
+{
+ QValueList<int> lst;
+ for ( QMap<int, int>::ConstIterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
+ lst.append( it.key() );
+ return lst;
+}
+
+bool OB_Browser::appropriateColumn( const int id ) const
+{
+ bool res = false;
+ if ( myColumnIds.contains( id ) )
+ res = myView->appropriate( myColumnIds[id] );
+ return res;
+}
+
+void OB_Browser::setAppropriateColumn( const int id, const bool on )
+{
+ if ( !myColumnIds.contains( id ) )
+ return;
+
+ myView->setAppropriate( myColumnIds[id], on );
+}
+
+void OB_Browser::updateTree( SUIT_DataObject* obj )
+{
+ if ( !obj && !(obj = getRootObject()) )
return;
DataObjectKey curKey;
void OB_Browser::replaceTree( SUIT_DataObject* src, SUIT_DataObject* trg )
{
- if ( !src || !trg || src->root() != getRootObject() )
+ if ( !src || !trg || src == trg || src->root() != getRootObject() )
return;
DataObjectKey curKey;
src->setParent( 0 );
- if ( src != trg && isAutoDeleteObjects() )
+ removeConnections( src );
+ if ( isAutoDeleteObjects() )
delete src;
if ( parent && pos != -1 )
void OB_Browser::updateView( const SUIT_DataObject* theStartObj )
{
- QListView* lv = getListView();
+ QListView* lv = listView();
if ( !lv )
return;
createTree( it.current(), 0, 0 );
}
else
- createTree( theStartObj, parent, after );
+ createTree( theStartObj, parent, after ? after : parent );
}
QListViewItem* OB_Browser::createTree( const SUIT_DataObject* obj,
- QListViewItem* parent, QListViewItem* after )
+ QListViewItem* parent, QListViewItem* after )
{
if ( !obj )
return 0;
for ( DataObjectListIterator it ( lst ); it.current(); ++it )
createTree( it.current(), item );
+ if ( item )
+ item->setOpen( obj->isOpen() );
+
return item;
}
QListViewItem* OB_Browser::createItem( const SUIT_DataObject* o,
QListViewItem* parent, QListViewItem* after )
{
- QListView* lv = getListView();
+ QListView* lv = listView();
if ( !lv || !o )
return 0;
myItems.insert( obj, item );
+ updateText( item );
+
return item;
}
void OB_Browser::adjustWidth()
{
- if ( !getListView() )
+ if ( !listView() )
return;
- getListView()->setColumnWidth( 0, 0 );
- if ( getListView()->firstChild() )
- adjustWidth( getListView()->firstChild() );
+ listView()->setColumnWidth( 0, 0 );
+ if ( listView()->firstChild() )
+ adjustWidth( listView()->firstChild() );
}
void OB_Browser::adjustWidth( QListViewItem* item )
return item;
}
-QListView* OB_Browser::getListView() const
+QListView* OB_Browser::listView() const
{
return myView;
}
return;
SUIT_DataObject* obj = dataObject( item );
+ obj->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
myItems.remove( obj );
QListViewItem* i = item->firstChild();
it.current()->connect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
}
+void OB_Browser::removeConnections( SUIT_DataObject* obj )
+{
+ if ( !obj )
+ return;
+
+ DataObjectList childList;
+ obj->children( childList, true );
+
+ childList.prepend( obj );
+
+ for ( DataObjectListIterator it( childList ); it.current(); ++it )
+ it.current()->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
+}
+
SUIT_DataObject* OB_Browser::storeState( DataObjectMap& selObjs, DataObjectMap& openObjs,
DataObjectKeyMap& selKeys, DataObjectKeyMap& openKeys,
DataObjectKey& curKey ) const
{
- QListView* lv = getListView();
+ QListView* lv = listView();
if ( !lv )
return 0;
const SUIT_DataObject* curObj, const DataObjectKeyMap& selKeys,
const DataObjectKeyMap& openKeys, const DataObjectKey& curKey )
{
- QListView* lv = getListView();
+ QListView* lv = listView();
if ( !lv )
return;
expand( listViewItem( itr.current() ) );
}
-void OB_Browser::onRefresh()
+void OB_Browser::onColumnVisible( int id )
{
- updateTree();
+ setColumnShown( id, !isColumnVisible( id ) );
}
void OB_Browser::onDestroyed( SUIT_DataObject* obj )
void OB_Browser::updateText()
{
- if ( !myView )
+ if ( myColumnIds.isEmpty() )
return;
-
- if ( myColumnIds.size() )
+
+ QListView* lv = listView();
+ if ( !lv )
+ return;
+
+ for ( QListViewItemIterator it( lv ); it.current(); ++it )
{
- QListViewItemIterator it( myView );
- for ( ; it.current() != 0; ++it )
- {
- QListViewItem* item = it.current();
- SUIT_DataObject* obj = dataObject( item );
- if ( !item || !obj )
- continue;
- QMap<int, int>::iterator it = myColumnIds.begin();
- for( ; it != myColumnIds.end(); ++it )
- item->setText( it.data(), obj->text( it.key() ) );
- }
+ SUIT_DataObject* obj = dataObject( it.current() );
+ if ( !obj )
+ continue;
+
+ for( QMap<int, int>::iterator itr = myColumnIds.begin(); itr != myColumnIds.end(); ++itr )
+ it.current()->setText( itr.data(), obj->text( itr.key() ) );
}
- updateView();
}
-bool OB_Browser::eventFilter(QObject* watched, QEvent* e)
+void OB_Browser::updateText( QListViewItem* item )
+{
+ SUIT_DataObject* obj = dataObject( item );
+ if ( !obj )
+ return;
+
+ for( QMap<int, int>::iterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
+ item->setText( it.data(), obj->text( it.key() ) );
+}
+
+bool OB_Browser::eventFilter( QObject* o, QEvent* e )
{
- if ( watched == myView && e->type() == QEvent::ContextMenu )
+ if ( o == myView && e->type() == QEvent::ContextMenu )
{
- contextMenuRequest( (QContextMenuEvent*)e );
+ QContextMenuEvent* ce = (QContextMenuEvent*)e;
+ if ( ce->reason() != QContextMenuEvent::Mouse )
+ contextMenuRequest( ce );
return true;
}
- return QFrame::eventFilter(watched, e);
+ if ( o == myView->viewport() && e->type() == QEvent::MouseButtonRelease )
+ {
+ QMouseEvent* me = (QMouseEvent*)e;
+ if ( me->button() == RightButton )
+ {
+ QContextMenuEvent ce( QContextMenuEvent::Mouse, me->pos(), me->globalPos(), me->state() );
+ contextMenuRequest( &ce );
+ return true;
+ }
+ }
+
+ return QFrame::eventFilter( o, e );
}
void OB_Browser::contextMenuPopup( QPopupMenu* menu )
{
+/* QValueList<int> cols;
+ for ( QMap<int, int>::ConstIterator it = myColumnIds.begin(); it != myColumnIds.end(); ++it )
+ {
+ if ( appropriateColumn( it.key() ) )
+ cols.append( it.key() );
+ }
+
+ uint num = menu->count();
+ menu->setCheckable( true );
+ for ( QValueList<int>::const_iterator iter = cols.begin(); iter != cols.end(); ++iter )
+ {
+ QString name = columnTitle( *iter );
+ if ( name.isEmpty() )
+ continue;
+
+ int id = menu->insertItem( name, this, SLOT( onColumnVisible( int ) ) );
+ menu->setItemChecked( id, isColumnVisible( *iter ) );
+ menu->setItemParameter( id, *iter );
+ }
+ if ( menu->count() != num )
+ menu->insertSeparator();*/
+
DataObjectList selected;
getSelected( selected );
menu->insertItem( tr( "MEN_EXPAND_ALL" ), this, SLOT( onExpand() ) );
menu->insertSeparator();
}
- menu->insertItem( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
}
void OB_Browser::expand( QListViewItem* item )
QListViewItem* item = listViewItem( obj );
+ obj->disconnect( this, SLOT( onDestroyed( SUIT_DataObject* ) ) );
myItems.remove( obj );
if ( obj == myRoot )
void OB_Browser::autoOpenBranches()
{
int level = autoOpenLevel();
- QListView* lv = getListView();
+ QListView* lv = listView();
if ( !lv || level < 1 )
return;
if ( !item || level < 1 || !item->childCount() )
return;
- item->setOpen( true );
while ( item )
{
- openBranch( item, level - 1 );
+ item->setOpen( true );
+ openBranch( item->firstChild(), level - 1 );
item = item->nextSibling();
}
}