diff options
Diffstat (limited to 'kdevdesigner/designer/listvieweditorimpl.cpp')
| -rw-r--r-- | kdevdesigner/designer/listvieweditorimpl.cpp | 650 | 
1 files changed, 650 insertions, 0 deletions
| diff --git a/kdevdesigner/designer/listvieweditorimpl.cpp b/kdevdesigner/designer/listvieweditorimpl.cpp new file mode 100644 index 00000000..c5ec7498 --- /dev/null +++ b/kdevdesigner/designer/listvieweditorimpl.cpp @@ -0,0 +1,650 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS.  All rights reserved. +** +** This file is part of TQt Designer. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition +** licenses may use this file in accordance with the TQt Commercial License +** Agreement provided with the Software. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +**   information about TQt Commercial License Agreements. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +#include "formwindow.h" +#include "mainwindow.h" +#include "listvieweditorimpl.h" +#include "pixmapchooser.h" +#include "command.h" +#include "listviewdnd.h" +#include "listboxdnd.h" +#include "listboxrename.h" + +#include <tqlistview.h> +#include <tqheader.h> +#include <tqlistbox.h> +#include <tqlineedit.h> +#include <tqcheckbox.h> +#include <tqlabel.h> +#include <tqtabwidget.h> +#include <tqspinbox.h> +#include <tqpushbutton.h> +#include <tqptrstack.h> + +#include <tdelocale.h> + +ListViewEditor::ListViewEditor( TQWidget *parent, TQListView *lv, FormWindow *fw ) +    : ListViewEditorBase( parent, 0, TRUE ), listview( lv ), formwindow( fw ) +{ +    connect( helpButton, TQT_SIGNAL( clicked() ), MainWindow::self, TQT_SLOT( showDialogHelp() ) ); +    itemText->setEnabled( FALSE ); +    itemChoosePixmap->setEnabled( FALSE ); +    itemDeletePixmap->setEnabled( FALSE ); +    itemColumn->setEnabled( FALSE ); + +    setupColumns(); +    PopulateListViewCommand::transferItems( listview, itemsPreview ); +    setupItems(); + +    itemsPreview->setShowSortIndicator( listview->showSortIndicator() ); +    itemsPreview->setAllColumnsShowFocus( listview->allColumnsShowFocus() ); +    itemsPreview->setRootIsDecorated( listview->rootIsDecorated() ); + +    if ( itemsPreview->firstChild() ) { +	itemsPreview->setCurrentItem( itemsPreview->firstChild() ); +	itemsPreview->setSelected( itemsPreview->firstChild(), TRUE ); +    } + +    // Clamp on drag and drop to TQListView +    ListViewDnd *itemsDnd = new ListViewDnd( itemsPreview ); +    itemsDnd->setDragMode( ListViewDnd::Internal | ListViewDnd::Move ); +    TQObject::connect( itemsDnd, TQT_SIGNAL( dropped( TQListViewItem * ) ), +		      itemsDnd, TQT_SLOT( confirmDrop( TQListViewItem * ) ) ); + +    // Enable rename for all TQListViewItems +    TQListViewItemIterator it = ((TQListView *)itemsPreview)->firstChild(); +    for ( ; *it; it++ ) +	(*it)->setRenameEnabled( 0, TRUE ); + +    // Connect listview signal to signal-relay +    TQObject::connect( itemsPreview, +		      TQT_SIGNAL( itemRenamed( TQListViewItem*, int, const TQString & ) ), +		      this, +		      TQT_SLOT( emitItemRenamed(TQListViewItem*, int, const TQString&) ) ); + +    // Connect signal-relay to TQLineEdit "itemText" +    TQObjectList *l = parent->queryList( TQLINEEDIT_OBJECT_NAME_STRING, "itemText" ); +    TQObject *obj; +    TQObjectListIt itemsLineEditIt( *l ); +    while ( (obj = itemsLineEditIt.current()) != 0 ) { +        ++itemsLineEditIt; +	TQObject::connect( this, +			  TQT_SIGNAL( itemRenamed( const TQString & ) ), +			  obj, +			  TQT_SLOT( setText( const TQString & ) ) ); +    } +    delete l; + +    // Clamp on drag and drop to TQListBox +    ListBoxDnd *columnsDnd = new ListBoxDnd( colPreview ); +    columnsDnd->setDragMode( ListBoxDnd::Internal | ListBoxDnd::Move ); +    TQObject::connect( columnsDnd, TQT_SIGNAL( dropped( TQListBoxItem * ) ), +		      columnsDnd, TQT_SLOT( confirmDrop( TQListBoxItem * ) ) ); + +    // Clamp on rename to TQListBox +    ListBoxRename *columnsRename = new ListBoxRename( colPreview ); +    TQObject::connect( columnsRename, +		      TQT_SIGNAL( itemTextChanged( const TQString & ) ), +		      this, +		      TQT_SLOT( columnTextChanged( const TQString & ) ) ); + +    // Find TQLineEdit "colText" and connect +    l = parent->queryList( TQLINEEDIT_OBJECT_NAME_STRING, "colText" ); +    TQObjectListIt columnsLineEditIt( *l ); +    while ( (obj = columnsLineEditIt.current()) != 0 ) { +        ++columnsLineEditIt; +	TQObject::connect( columnsRename, +			  TQT_SIGNAL( itemTextChanged( const TQString & ) ), +			  obj, +			  TQT_SLOT( setText( const TQString & ) ) ); +    } +    delete l; +} + +void ListViewEditor::applyClicked() +{ +    setupItems(); +    PopulateListViewCommand *cmd = new PopulateListViewCommand( i18n( "Edit the Items and Columns of '%1'" ).arg( listview->name() ), +								formwindow, listview, itemsPreview ); +    cmd->execute(); +    formwindow->commandHistory()->addCommand( cmd ); +} + +void ListViewEditor::okClicked() +{ +    applyClicked(); +    accept(); +} + +void ListViewEditor::columnClickable( bool b ) +{ +    Column *c = findColumn( colPreview->item( colPreview->currentItem() ) ); +    if ( !c ) +	return; +    c->clickable = b; +} + +void ListViewEditor::columnDownClicked() +{ +    if ( colPreview->currentItem() == -1 || +	 colPreview->currentItem() > (int)colPreview->count() - 2 ) +	return; + +    colPreview->clearSelection(); +    TQListBoxItem *i = colPreview->item( colPreview->currentItem() ); +    TQListBoxItem *below = i->next(); + +    colPreview->takeItem( i ); +    colPreview->insertItem( i, below ); + +    colPreview->setCurrentItem( i ); +    colPreview->setSelected( i, TRUE ); +} + +void ListViewEditor::columnPixmapChosen() +{ +    Column *c = findColumn( colPreview->item( colPreview->currentItem() ) ); +    if ( !c ) +	return; + +    TQPixmap pix; +    if ( colPixmap->pixmap() ) +	pix = qChoosePixmap( this, formwindow, *colPixmap->pixmap() ); +    else +	pix = qChoosePixmap( this, formwindow, TQPixmap() ); + +    if ( pix.isNull() ) +	return; + +    c->pixmap = pix; +    colPreview->blockSignals( TRUE ); +    if ( !c->pixmap.isNull() ) +	colPreview->changeItem( c->pixmap, c->text, colPreview->index( c->item ) ); +    else +	colPreview->changeItem( c->text, colPreview->index( c->item ) ); +    c->item = colPreview->item( colPreview->currentItem() ); +    colPixmap->setPixmap( c->pixmap ); +    colPreview->blockSignals( FALSE ); +    colDeletePixmap->setEnabled( TRUE ); +} + +void ListViewEditor::columnPixmapDeleted() +{ +    Column *c = findColumn( colPreview->item( colPreview->currentItem() ) ); +    if ( !c ) +	return; + +    c->pixmap = TQPixmap(); +    colPreview->blockSignals( TRUE ); +    if ( !c->pixmap.isNull() ) +	colPreview->changeItem( c->pixmap, c->text, colPreview->index( c->item ) ); +    else +	colPreview->changeItem( c->text, colPreview->index( c->item ) ); +    c->item = colPreview->item( colPreview->currentItem() ); +    colPixmap->setText( "" ); +    colPreview->blockSignals( FALSE ); +    colDeletePixmap->setEnabled( FALSE ); +} + +void ListViewEditor::columnResizable( bool b ) +{ +    Column *c = findColumn( colPreview->item( colPreview->currentItem() ) ); +    if ( !c ) +	return; +    c->resizable = b; +} + +void ListViewEditor::columnTextChanged( const TQString &txt ) +{ +    Column *c = findColumn( colPreview->item( colPreview->currentItem() ) ); +    if ( !c ) +	return; + +    c->text = txt; +    colPreview->blockSignals( TRUE ); +    if ( !c->pixmap.isNull() ) +	colPreview->changeItem( c->pixmap, c->text, colPreview->index( c->item ) ); +    else +	colPreview->changeItem( c->text, colPreview->index( c->item ) ); +    c->item = colPreview->item( colPreview->currentItem() ); +    colPreview->blockSignals( FALSE ); +} + +void ListViewEditor::columnUpClicked() +{ +    if ( colPreview->currentItem() <= 0 ) +	return; + +    colPreview->clearSelection(); +    TQListBoxItem *i = colPreview->item( colPreview->currentItem() ); +    TQListBoxItem *above = i->prev(); + +    colPreview->takeItem( above ); +    colPreview->insertItem( above, i ); + +    colPreview->setCurrentItem( i ); +    colPreview->setSelected( i, TRUE ); +} + +void ListViewEditor::currentColumnChanged( TQListBoxItem *i ) +{ +    Column *c = findColumn( i ); +    if ( !i || !c ) { +	colText->setEnabled( FALSE ); +	colPixmap->setEnabled( FALSE ); +	colDeletePixmap->setEnabled( FALSE ); +	colText->blockSignals( TRUE ); +	colText->setText( "" ); +	colText->blockSignals( FALSE ); +	colClickable->setEnabled( FALSE ); +	colResizable->setEnabled( FALSE ); +	return; +    } + +    colText->setEnabled( TRUE ); +    colPixmap->setEnabled( TRUE ); +    colDeletePixmap->setEnabled( i->pixmap() && !i->pixmap()->isNull() ); +    colClickable->setEnabled( TRUE ); +    colResizable->setEnabled( TRUE ); + +    colText->blockSignals( TRUE ); +    colText->setText( c->text ); +    colText->blockSignals( FALSE ); +    if ( !c->pixmap.isNull() ) +	colPixmap->setPixmap( c->pixmap ); +    else +	colPixmap->setText( "" ); +    colClickable->setChecked( c->clickable ); +    colResizable->setChecked( c->resizable ); +} + +void ListViewEditor::newColumnClicked() +{ +    Column col; +    col.text = i18n( "New Column" ); +    col.pixmap = TQPixmap(); +    col.clickable = TRUE; +    col.resizable = TRUE; +    if ( !col.pixmap.isNull() ) +	col.item = new TQListBoxPixmap( colPreview, col.pixmap, col.text ); +    else +	col.item = new TQListBoxText( colPreview, col.text ); +    columns.append( col ); +    colPreview->setCurrentItem( col.item ); +    colPreview->setSelected( col.item, TRUE ); +} + +void ListViewEditor::deleteColumnClicked() +{ +    TQListBoxItem *i = colPreview->item( colPreview->currentItem() ); +    if ( !i ) +	return; + +    for ( TQValueList<Column>::Iterator it = columns.begin(); it != columns.end(); ++it ) { +	if ( ( *it ).item == i ) { +	    delete (*it).item; +	    columns.remove( it ); +	    break; +	} +    } + +    if ( colPreview->currentItem() != -1 ) +	colPreview->setSelected( colPreview->currentItem(), TRUE ); +} + +void ListViewEditor::currentItemChanged( TQListViewItem *i ) +{ +    if ( !i ) { +	itemText->setEnabled( FALSE ); +	itemChoosePixmap->setEnabled( FALSE ); +	itemDeletePixmap->setEnabled( FALSE ); +	itemColumn->setEnabled( FALSE ); +	return; +    } + +    itemText->setEnabled( TRUE ); +    itemChoosePixmap->setEnabled( TRUE ); +    itemDeletePixmap->setEnabled( i->pixmap( itemColumn->value() ) && +				  !i->pixmap( itemColumn->value() )->isNull() ); +    itemColumn->setEnabled( TRUE ); + +    displayItem( i, itemColumn->value() ); +} + +void ListViewEditor::displayItem( TQListViewItem *i, int col ) +{ +    itemText->blockSignals( TRUE ); +    itemText->setText( i->text( col ) ); +    itemText->blockSignals( FALSE ); + +    itemPixmap->blockSignals( TRUE ); +    if ( i->pixmap( col ) ) +	itemPixmap->setPixmap( *i->pixmap( col ) ); +    else +	itemPixmap->setText( "" ); +    itemPixmap->blockSignals( FALSE ); +} + +void ListViewEditor::itemColChanged( int col ) +{ +    TQListViewItem *i = itemsPreview->currentItem(); +    if ( !i ) +	return; + +    displayItem( i, col ); +    itemDeletePixmap->setEnabled( i->pixmap( col ) && !i->pixmap( col )->isNull() ); +} + +void ListViewEditor::itemDeleteClicked() +{ +    TQListViewItem *i = itemsPreview->currentItem(); +    if ( !i ) +	return; + +    delete i; +    if ( itemsPreview->firstChild() ) { +	itemsPreview->setCurrentItem( itemsPreview->firstChild() ); +	itemsPreview->setSelected( itemsPreview->firstChild(), TRUE ); +    } +} + +void ListViewEditor::itemDownClicked() +{ +    TQListViewItem *i = itemsPreview->currentItem(); +    if ( !i ) +	return; + +    TQListViewItemIterator it( i ); +    TQListViewItem *parent = i->parent(); +    it++; +    while ( it.current() ) { +	if ( it.current()->parent() == parent ) +	    break; +	it++; +    } + +    if ( !it.current() ) +	return; +    TQListViewItem *other = it.current(); + +    i->moveItem( other ); +} + +void ListViewEditor::itemNewClicked() +{ +    TQListViewItem *item = new TQListViewItem( itemsPreview ); +    item->setText( 0, i18n( "Item" ) ); +    item->setRenameEnabled( 0, TRUE ); +    itemsPreview->setCurrentItem( item ); +    itemsPreview->setSelected( item, TRUE ); +    itemText->setFocus(); +    itemText->selectAll(); +} + +void ListViewEditor::itemNewSubClicked() +{ +    TQListViewItem *parent = itemsPreview->currentItem(); +    TQListViewItem *item = 0; +    if ( parent ) { +	item = new TQListViewItem( parent ); +	parent->setOpen( TRUE ); +    } else { +	item = new TQListViewItem( itemsPreview ); +    } +    item->setText( 0, i18n( "Subitem" ) ); +    item->setRenameEnabled( 0, TRUE ); +    itemsPreview->setCurrentItem( item ); +    itemsPreview->setSelected( item, TRUE ); +} + +void ListViewEditor::itemPixmapChoosen() +{ +    TQListViewItem *i = itemsPreview->currentItem(); +    if ( !i ) +	return; + +    TQPixmap pix; +    if ( itemPixmap->pixmap() ) +	pix = qChoosePixmap( this, formwindow, *itemPixmap->pixmap() ); +    else +	pix = qChoosePixmap( this, formwindow, TQPixmap() ); + +    if ( pix.isNull() ) +	return; + +    i->setPixmap( itemColumn->value(), TQPixmap( pix ) ); +    itemPixmap->setPixmap( pix ); +    itemDeletePixmap->setEnabled( TRUE ); +} + +void ListViewEditor::itemPixmapDeleted() +{ +    TQListViewItem *i = itemsPreview->currentItem(); +    if ( !i ) +	return; + +    i->setPixmap( itemColumn->value(), TQPixmap() ); +    itemPixmap->setText( "" ); +    itemDeletePixmap->setEnabled( FALSE ); +} + +void ListViewEditor::itemTextChanged( const TQString &txt ) +{ +    TQListViewItem *i = itemsPreview->currentItem(); +    if ( !i ) +	return; +    i->setText( itemColumn->value(), txt ); +} + +void ListViewEditor::itemUpClicked() +{ +    TQListViewItem *i = itemsPreview->currentItem(); +    if ( !i ) +	return; + +    TQListViewItemIterator it( i ); +    TQListViewItem *parent = i->parent(); +    --it; +    while ( it.current() ) { +	if ( it.current()->parent() == parent ) +	    break; +	--it; +    } + +    if ( !it.current() ) +	return; +    TQListViewItem *other = it.current(); + +    other->moveItem( i ); +} + +void ListViewEditor::itemRightClicked() +{ +    TQListViewItem *i = itemsPreview->currentItem(); +    if ( !i ) +	return; + +    TQListViewItemIterator it( i ); +    TQListViewItem *parent = i->parent(); +    parent = parent ? parent->firstChild() : itemsPreview->firstChild(); +    if ( !parent ) +	return; +    it++; +    while ( it.current() ) { +	if ( it.current()->parent() == parent ) +	    break; +	it++; +    } + +    if ( !it.current() ) +	return; +    TQListViewItem *other = it.current(); + +    for ( int c = 0; c < itemsPreview->columns(); ++c ) { +	TQString s = i->text( c ); +	i->setText( c, other->text( c ) ); +	other->setText( c, s ); +	TQPixmap pix; +	if ( i->pixmap( c ) ) +	    pix = *i->pixmap( c ); +	if ( other->pixmap( c ) ) +	    i->setPixmap( c, *other->pixmap( c ) ); +	else +	    i->setPixmap( c, TQPixmap() ); +	other->setPixmap( c, pix ); +    } + +    itemsPreview->setCurrentItem( other ); +    itemsPreview->setSelected( other, TRUE ); +} + +void ListViewEditor::itemLeftClicked() +{ +    TQListViewItem *i = itemsPreview->currentItem(); +    if ( !i ) +	return; + +    TQListViewItemIterator it( i ); +    TQListViewItem *parent = i->parent(); +    if ( !parent ) +	return; +    parent = parent->parent(); +    --it; +    while ( it.current() ) { +	if ( it.current()->parent() == parent ) +	    break; +	--it; +    } + +    if ( !it.current() ) +	return; +    TQListViewItem *other = it.current(); + +    for ( int c = 0; c < itemsPreview->columns(); ++c ) { +	TQString s = i->text( c ); +	i->setText( c, other->text( c ) ); +	other->setText( c, s ); +	TQPixmap pix; +	if ( i->pixmap( c ) ) +	    pix = *i->pixmap( c ); +	if ( other->pixmap( c ) ) +	    i->setPixmap( c, *other->pixmap( c ) ); +	else +	    i->setPixmap( c, TQPixmap() ); +	other->setPixmap( c, pix ); +    } + +    itemsPreview->setCurrentItem( other ); +    itemsPreview->setSelected( other, TRUE ); +} + +void ListViewEditor::setupColumns() +{ +    TQHeader *h = listview->header(); +    for ( int i = 0; i < (int)h->count(); ++i ) { +	Column col; +	col.text = h->label( i ); +	col.pixmap = TQPixmap(); +	if ( h->iconSet( i ) ) +	    col.pixmap = h->iconSet( i )->pixmap(); +	col.clickable = h->isClickEnabled( i ); +	col.resizable = h->isResizeEnabled( i ); +	if ( !col.pixmap.isNull() ) +	    col.item = new TQListBoxPixmap( colPreview, col.pixmap, col.text ); +	else +	    col.item = new TQListBoxText( colPreview, col.text ); +	columns.append( col ); +    } + +    colText->setEnabled( FALSE ); +    colPixmap->setEnabled( FALSE ); +    colClickable->setEnabled( FALSE ); +    colResizable->setEnabled( FALSE ); + +    if ( colPreview->firstItem() ) +	colPreview->setCurrentItem( colPreview->firstItem() ); +    numColumns = colPreview->count(); +} + +void ListViewEditor::setupItems() +{ +    itemColumn->setMinValue( 0 ); +    itemColumn->setMaxValue( TQMAX( numColumns - 1, 0 ) ); +    int i = 0; +    TQHeader *header = itemsPreview->header(); +    for ( TQListBoxItem *item = colPreview->firstItem(); item; item = item->next() ) { +	Column *col = findColumn( item ); +	if ( !col ) +	    continue; +	if ( i >= itemsPreview->columns() ) +	    itemsPreview->addColumn( col->text ); +	header->setLabel( i, col->pixmap, col->text ); +	header->setResizeEnabled( col->resizable, i ); +	header->setClickEnabled( col->clickable, i ); +	++i; +    } +    while ( itemsPreview->columns() > i ) +	itemsPreview->removeColumn( i ); + +    itemColumn->setValue( TQMIN( numColumns - 1, itemColumn->value() ) ); +} + +ListViewEditor::Column *ListViewEditor::findColumn( TQListBoxItem *i ) +{ +    if ( !i ) +	return 0; + +    for ( TQValueList<Column>::Iterator it = columns.begin(); it != columns.end(); ++it ) { +	if ( ( *it ).item == i ) +	    return &( *it ); +    } + +    return 0; +} + +void ListViewEditor::initTabPage( const TQString &page ) +{ +    numColumns = colPreview->count(); +    if ( page == i18n( "&Items" ) ) { +	setupItems(); +	if ( numColumns == 0 ) { +	    itemNew->setEnabled( FALSE ); +	    itemNewSub->setEnabled( FALSE ); +	    itemText->setEnabled( FALSE ); +	    itemChoosePixmap->setEnabled( FALSE ); +	    itemDeletePixmap->setEnabled( FALSE ); +	    itemColumn->setEnabled( FALSE ); +	} else { +	    itemNew->setEnabled( TRUE ); +	    itemNewSub->setEnabled( TRUE ); +	} +    } +} + +void ListViewEditor::emitItemRenamed( TQListViewItem *, int, const TQString & text ) +{ +    emit itemRenamed( text ); // Relay signal ( to TQLineEdit ) +} | 
