You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdevelop/kdevdesigner/designer/listvieweditorimpl.cpp

651 lines
18 KiB

/**********************************************************************
** 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, TQ_SIGNAL( clicked() ), MainWindow::self, TQ_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, TQ_SIGNAL( dropped( TQListViewItem * ) ),
itemsDnd, TQ_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,
TQ_SIGNAL( itemRenamed( TQListViewItem*, int, const TQString & ) ),
this,
TQ_SLOT( emitItemRenamed(TQListViewItem*, int, const TQString&) ) );
// Connect signal-relay to TQLineEdit "itemText"
TQObjectList *l = parent->queryList( "TQLineEdit", "itemText" );
TQObject *obj;
TQObjectListIt itemsLineEditIt( *l );
while ( (obj = itemsLineEditIt.current()) != 0 ) {
++itemsLineEditIt;
TQObject::connect( this,
TQ_SIGNAL( itemRenamed( const TQString & ) ),
obj,
TQ_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, TQ_SIGNAL( dropped( TQListBoxItem * ) ),
columnsDnd, TQ_SLOT( confirmDrop( TQListBoxItem * ) ) );
// Clamp on rename to TQListBox
ListBoxRename *columnsRename = new ListBoxRename( colPreview );
TQObject::connect( columnsRename,
TQ_SIGNAL( itemTextChanged( const TQString & ) ),
this,
TQ_SLOT( columnTextChanged( const TQString & ) ) );
// Find TQLineEdit "colText" and connect
l = parent->queryList( "TQLineEdit", "colText" );
TQObjectListIt columnsLineEditIt( *l );
while ( (obj = columnsLineEditIt.current()) != 0 ) {
++columnsLineEditIt;
TQObject::connect( columnsRename,
TQ_SIGNAL( itemTextChanged( const TQString & ) ),
obj,
TQ_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 )
}