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.
341 lines
10 KiB
341 lines
10 KiB
/* Copyright (C) 2000 David Faure <faure@kde.org>, Alexander Neundorf <neundorf@kde.org>
|
|
2000, 2002 Carsten Pfeiffer <pfeiffer@kde.org>
|
|
Copyright (C) 2006-2007 Nicolas Hadacek <hadacek@kde.org>
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Boston, MA 02110-1301, USA.
|
|
*/
|
|
#include "editlistbox.h"
|
|
|
|
#include <tqstringlist.h>
|
|
#include <tqlabel.h>
|
|
#include <tqheader.h>
|
|
|
|
#include <kdialog.h>
|
|
#include <klocale.h>
|
|
#include <kapplication.h>
|
|
#include <knotifyclient.h>
|
|
#include <kiconloader.h>
|
|
#include <kstdguiitem.h>
|
|
|
|
EditListBox::EditListBox(uint nbColumns, TQWidget *tqparent, const char *name, Mode mode, Buttons buttons)
|
|
: TQFrame(tqparent, name), _mode(mode), _buttons(buttons)
|
|
{
|
|
m_lineEdit = new KLineEdit;
|
|
init(nbColumns, m_lineEdit);
|
|
}
|
|
|
|
EditListBox::EditListBox(uint nbColumns, TQWidget *view, KLineEdit *lineEdit, TQWidget *tqparent, const char *name,
|
|
Mode mode, Buttons buttons)
|
|
: TQFrame(tqparent, name), _mode(mode), _buttons(buttons)
|
|
{
|
|
m_lineEdit = lineEdit;
|
|
init(nbColumns, view);
|
|
}
|
|
|
|
void EditListBox::init(uint nbColumns, TQWidget *view)
|
|
{
|
|
_addButton = 0;
|
|
_removeButton = 0;
|
|
_moveUpButton = 0;
|
|
_moveDownButton = 0;
|
|
_removeAllButton = 0;
|
|
_resetButton = 0;
|
|
tqsetSizePolicy(TQSizePolicy(TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding));
|
|
|
|
TQGridLayout *grid = new TQGridLayout(this, 1, 1, 0, KDialog::spacingHint());
|
|
uint row = 0;
|
|
if (view) {
|
|
TQHBoxLayout *hbox = new TQHBoxLayout(KDialog::spacingHint());
|
|
grid->addMultiCellLayout(hbox, row,row, 0,1);
|
|
if (m_lineEdit) {
|
|
KIconLoader loader;
|
|
TQIconSet iconset = loader.loadIcon("locationbar_erase", KIcon::Toolbar);
|
|
KPushButton *button = new KPushButton(iconset, TQString(), this);
|
|
connect(button, TQT_SIGNAL(clicked()), TQT_SLOT(clearEdit()));
|
|
hbox->addWidget(button);
|
|
}
|
|
view->reparent( this, TQPoint(0,0) );
|
|
hbox->addWidget(view);
|
|
row++;
|
|
}
|
|
_listView= new KListView(this);
|
|
for (uint i=0; i<nbColumns; i++) _listView->addColumn(TQString());
|
|
_listView->header()->hide();
|
|
_listView->setSorting(-1);
|
|
_listView->setResizeMode(KListView::LastColumn);
|
|
_listView->setColumnWidthMode(nbColumns-1, KListView::Maximum);
|
|
grid->addWidget(_listView, row, 0);
|
|
TQVBoxLayout *vbox = new TQVBoxLayout(10);
|
|
grid->addLayout(vbox, row, 1);
|
|
_buttonsLayout = new TQVBoxLayout(10);
|
|
vbox->addLayout(_buttonsLayout);
|
|
vbox->addStretch(1);
|
|
|
|
setButtons(_buttons);
|
|
|
|
if (m_lineEdit) {
|
|
connect(m_lineEdit,TQT_SIGNAL(textChanged(const TQString&)),this,TQT_SLOT(typedSomething(const TQString&)));
|
|
m_lineEdit->setTrapReturnKey(true);
|
|
connect(m_lineEdit,TQT_SIGNAL(returnPressed()),this,TQT_SLOT(addItem()));
|
|
}
|
|
connect(_listView, TQT_SIGNAL(selectionChanged()), TQT_SLOT(selectionChanged()));
|
|
|
|
// maybe supplied lineedit has some text already
|
|
typedSomething(m_lineEdit ? m_lineEdit->text() : TQString());
|
|
}
|
|
|
|
void EditListBox::setButtons(Buttons buttons)
|
|
{
|
|
_buttons = buttons;
|
|
|
|
delete _addButton;
|
|
_addButton = 0;
|
|
if ( buttons & Add ) {
|
|
#if KDE_VERSION < KDE_MAKE_VERSION(3,4,0)
|
|
_addButton = new KPushButton(KGuiItem(i18n("Add"), "edit_add"), this);
|
|
#else
|
|
_addButton = new KPushButton(KStdGuiItem::add(), this);
|
|
#endif
|
|
_addButton->setEnabled(false);
|
|
_addButton->show();
|
|
connect(_addButton, TQT_SIGNAL(clicked()), TQT_SLOT(addItem()));
|
|
_buttonsLayout->addWidget(_addButton);
|
|
}
|
|
|
|
delete _removeButton;
|
|
_removeButton = 0;
|
|
if ( buttons & Remove ) {
|
|
_removeButton = new KPushButton(KGuiItem(i18n("Remove"), "clear"), this);
|
|
_removeButton->setEnabled(false);
|
|
_removeButton->show();
|
|
connect(_removeButton, TQT_SIGNAL(clicked()), TQT_SLOT(removeItem()));
|
|
_buttonsLayout->addWidget(_removeButton);
|
|
}
|
|
|
|
delete _removeAllButton;
|
|
_removeAllButton = 0;
|
|
if ( buttons & RemoveAll ) {
|
|
_removeAllButton = new KPushButton(KGuiItem(i18n("Remove All"), "delete"), this);
|
|
_removeAllButton->show();
|
|
connect(_removeAllButton, TQT_SIGNAL(clicked()), TQT_SLOT(clear()));
|
|
_buttonsLayout->addWidget(_removeAllButton);
|
|
}
|
|
|
|
delete _moveUpButton;
|
|
_moveUpButton = 0;
|
|
delete _moveDownButton;
|
|
_moveDownButton = 0;
|
|
if ( buttons & UpDown ) {
|
|
_moveUpButton = new KPushButton(KGuiItem(i18n("Move &Up"), "up"), this);
|
|
_moveUpButton->setEnabled(false);
|
|
_moveUpButton->show();
|
|
connect(_moveUpButton, TQT_SIGNAL(clicked()), TQT_SLOT(moveItemUp()));
|
|
_buttonsLayout->addWidget(_moveUpButton);
|
|
_moveDownButton = new KPushButton(KGuiItem(i18n("Move &Down"), "down"), this);
|
|
_moveDownButton->setEnabled(false);
|
|
_moveDownButton->show();
|
|
connect(_moveDownButton, TQT_SIGNAL(clicked()), TQT_SLOT(moveItemDown()));
|
|
_buttonsLayout->addWidget(_moveDownButton);
|
|
}
|
|
|
|
delete _resetButton;
|
|
_resetButton = 0;
|
|
if ( buttons & Reset ) {
|
|
_resetButton = new KPushButton(KStdGuiItem::reset(), this);
|
|
_resetButton->show();
|
|
connect(_resetButton, TQT_SIGNAL(clicked()), TQT_SIGNAL(reset()));
|
|
_buttonsLayout->addWidget(_resetButton);
|
|
}
|
|
}
|
|
|
|
void EditListBox::typedSomething(const TQString& text)
|
|
{
|
|
TQListViewItem *item = _listView->selectedItem();
|
|
if (item) {
|
|
if( selectedText()!=text ) {
|
|
item->setText(textColumn(), text);
|
|
emit changed();
|
|
}
|
|
}
|
|
updateButtons();
|
|
}
|
|
|
|
void EditListBox::moveItemUp()
|
|
{
|
|
TQListViewItem *item = _listView->selectedItem();
|
|
if ( item==0 || item->itemAbove()==0 ) return;
|
|
item->itemAbove()->moveItem(item);
|
|
updateButtons();
|
|
emit changed();
|
|
}
|
|
|
|
void EditListBox::moveItemDown()
|
|
{
|
|
TQListViewItem *item = _listView->selectedItem();
|
|
if ( item==0 || item->itemBelow()==0 ) return;
|
|
item->moveItem(item->itemBelow());
|
|
updateButtons();
|
|
emit changed();
|
|
}
|
|
|
|
void EditListBox::addItem()
|
|
{
|
|
// when m_checkAtEntering is true, the add-button is disabled, but this
|
|
// slot can still be called through Key_Return/Key_Enter. So we guard
|
|
// against this.
|
|
if ( !_addButton || !_addButton->isEnabled() || m_lineEdit==0 ) return;
|
|
|
|
addItem(m_lineEdit->text());
|
|
}
|
|
|
|
void EditListBox::addItem(const TQString &text)
|
|
{
|
|
bool alreadyInList(false);
|
|
//if we didn't check for dupes at the inserting we have to do it now
|
|
if ( _mode==DuplicatesDisallowed ) alreadyInList = _listView->findItem(text, textColumn());
|
|
|
|
if (m_lineEdit) {
|
|
bool block = m_lineEdit->signalsBlocked();
|
|
m_lineEdit->blockSignals(true);
|
|
m_lineEdit->clear();
|
|
m_lineEdit->blockSignals(block);
|
|
}
|
|
_listView->clearSelection();
|
|
|
|
if (!alreadyInList) {
|
|
TQListViewItem *item = createItem();
|
|
item->setText(textColumn(), text);
|
|
if ( _listView->lastItem() ) item->moveItem(_listView->lastItem());
|
|
emit changed();
|
|
emit added(text);
|
|
}
|
|
updateButtons();
|
|
}
|
|
|
|
void EditListBox::clearEdit()
|
|
{
|
|
_listView->clearSelection();
|
|
if (m_lineEdit) {
|
|
m_lineEdit->clear();
|
|
m_lineEdit->setFocus();
|
|
}
|
|
updateButtons();
|
|
}
|
|
|
|
void EditListBox::removeItem()
|
|
{
|
|
TQListViewItem *item = _listView->selectedItem();
|
|
if (item) {
|
|
TQString text = item->text(textColumn());
|
|
delete item;
|
|
emit changed();
|
|
emit removed(text);
|
|
updateButtons();
|
|
}
|
|
}
|
|
|
|
void EditListBox::selectionChanged()
|
|
{
|
|
if (m_lineEdit) m_lineEdit->setText(selectedText());
|
|
updateButtons();
|
|
}
|
|
|
|
void EditListBox::clear()
|
|
{
|
|
_listView->clear();
|
|
if (m_lineEdit) {
|
|
m_lineEdit->clear();
|
|
m_lineEdit->setFocus();
|
|
}
|
|
updateButtons();
|
|
emit changed();
|
|
}
|
|
|
|
uint EditListBox::count() const
|
|
{
|
|
uint nb = 0;
|
|
TQListViewItemIterator it(_listView);
|
|
for (; it.current(); ++it) nb++;
|
|
return nb;
|
|
}
|
|
|
|
const TQListViewItem *EditListBox::item(uint i) const
|
|
{
|
|
uint k = 0;
|
|
TQListViewItemIterator it(_listView);
|
|
for (; it.current(); ++it) {
|
|
if ( k==i ) return it.current();
|
|
k++;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
TQStringList EditListBox::texts() const
|
|
{
|
|
TQStringList list;
|
|
TQListViewItemIterator it(_listView);
|
|
for (; it.current(); ++it) list.append(it.current()->text(textColumn()));
|
|
return list;
|
|
}
|
|
|
|
void EditListBox::setTexts(const TQStringList& items)
|
|
{
|
|
_listView->clear();
|
|
for (int i=items.count()-1; i>=0; i--) {
|
|
TQListViewItem *item = createItem();
|
|
item->setText(textColumn(), items[i]);
|
|
}
|
|
if (m_lineEdit) m_lineEdit->clear();
|
|
updateButtons();
|
|
}
|
|
|
|
void EditListBox::updateButtons()
|
|
{
|
|
TQListViewItem *item = _listView->selectedItem();
|
|
if (_addButton) {
|
|
if ( m_lineEdit==0 ) _addButton->setEnabled(true);
|
|
else {
|
|
TQString text = m_lineEdit->text();
|
|
if ( _mode!=DuplicatesCheckedAtEntering ) _addButton->setEnabled(!text.isEmpty());
|
|
else if ( text.isEmpty() ) _addButton->setEnabled(false);
|
|
else _addButton->setEnabled(!_listView->findItem(text, textColumn()));
|
|
}
|
|
}
|
|
if (_removeButton) _removeButton->setEnabled(item);
|
|
if (_moveUpButton) _moveUpButton->setEnabled(item && item->itemAbove());
|
|
if (_moveDownButton) _moveDownButton->setEnabled(item && item->itemBelow());
|
|
if (_removeAllButton) _removeAllButton->setEnabled(_listView->firstChild());
|
|
}
|
|
|
|
void EditListBox::setEditText(const TQString &text)
|
|
{
|
|
_listView->clearSelection();
|
|
if (m_lineEdit) m_lineEdit->setText(text);
|
|
updateButtons();
|
|
}
|
|
|
|
TQListViewItem *EditListBox::createItem()
|
|
{
|
|
return new KListViewItem(_listView);
|
|
}
|
|
|
|
TQString EditListBox::selectedText() const
|
|
{
|
|
TQListViewItem *item = _listView->selectedItem();
|
|
if ( item==0 ) return TQString();
|
|
return item->text(textColumn());
|
|
}
|