kexi

editlistviewdialog.cpp

00001 /* This file is part of the KDE project
00002    Copyright (C) 2004 Cedric Pasteur <cedric.pasteur@free.fr>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License as published by the Free Software Foundation; either
00007    version 2 of the License, or (at your option) any later version.
00008 
00009    This library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this library; see the file COPYING.LIB.  If not, write to
00016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017  * Boston, MA 02110-1301, USA.
00018 */
00019 #include <qheader.h>
00020 #include <qlayout.h>
00021 
00022 #include <klistview.h>
00023 #include <ktabwidget.h>
00024 #include <klistbox.h>
00025 #include <kiconloader.h>
00026 #include <kdebug.h>
00027 #include <klocale.h>
00028 
00029 #include <koproperty/editor.h>
00030 #include <koproperty/set.h>
00031 #include <koproperty/property.h>
00032 
00033 #include "editlistviewdialog.h"
00034 
00035 namespace KFormDesigner {
00036 
00040 
00041 EditListViewDialog::EditListViewDialog(QWidget *parent)
00042 //js(kde3.2 dependent) : KDialogBase(Tabbed, 0/* WFlags */, parent, "editlistview_dialog", true, i18n("Edit listview contents"), Ok|Cancel, Ok, false)
00043 : KDialogBase(Tabbed, i18n("Edit Listview Contents"), Ok|Cancel, Ok, parent, "editlistview_dialog", true /* modal */, false)
00044 {
00045     m_column = addPage(i18n("Columns"));
00046     m_contents = addPage(i18n("Contents"));
00047 
00049     QHBoxLayout *layout = new QHBoxLayout(m_contents, 0, 6);
00050 
00052     QVBoxLayout *vlayout = new QVBoxLayout(layout, 3);
00053     QToolButton *newRow = new QToolButton(m_contents);
00054     newRow->setIconSet(BarIconSet("edit_add"));
00055     newRow->setTextLabel(i18n("&Add Item"), true);
00056     vlayout->addWidget(newRow);
00057     m_buttons.insert(BNewRow, newRow);
00058     connect(newRow, SIGNAL(clicked()), this, SLOT(newRow()));
00059 
00060     QToolButton *newChild = new QToolButton(m_contents);
00061     newChild->setIconSet(BarIconSet("1rightarrow"));
00062     newChild->setTextLabel(i18n("New &Subitem"), true);
00063     vlayout->addWidget(newChild);
00064     m_buttons.insert(BNewChild, newChild);
00065     connect(newChild, SIGNAL(clicked()), this, SLOT(newChildRow()));
00066 
00067     QToolButton *delRow = new QToolButton(m_contents);
00068     delRow->setIconSet(BarIconSet("edit_remove"));
00069     delRow->setTextLabel(i18n("&Remove Item"), true);
00070     vlayout->addWidget(delRow);
00071     m_buttons.insert(BRemRow, delRow);
00072     connect(delRow, SIGNAL(clicked()), this, SLOT(removeRow()));
00073 
00074     QToolButton *rowUp = new QToolButton(m_contents);
00075     rowUp->setIconSet(BarIconSet("1uparrow"));
00076     rowUp->setTextLabel(i18n("Move Item &Up"), true);
00077     vlayout->addWidget(rowUp);
00078     m_buttons.insert(BRowUp, rowUp);
00079     connect(rowUp, SIGNAL(clicked()), this, SLOT(MoveRowUp()));
00080 
00081     QToolButton *rowDown = new QToolButton(m_contents);
00082     rowDown->setIconSet(BarIconSet("1downarrow"));
00083     rowDown->setTextLabel(i18n("Move Item &Down"), true);
00084     vlayout->addWidget(rowDown);
00085     m_buttons.insert(BRowDown, rowDown);
00086     connect(rowDown, SIGNAL(clicked()), this, SLOT(MoveRowDown()));
00087     vlayout->addStretch();
00088 
00090     m_listview = new KListView(m_contents, "editlistview_listview");
00091     m_listview->setItemsRenameable(true);
00092     m_listview->setItemsMovable(true);
00093     m_listview->setDragEnabled(true);
00094     m_listview->setAllColumnsShowFocus(true);
00095     m_listview->setRootIsDecorated(true);
00096     m_listview->setDropVisualizer(true);
00097     m_listview->setAcceptDrops(true);
00098     m_listview->setSorting(-1);
00099     layout->addWidget(m_listview);
00100     m_listview->setFocus();
00101     connect(m_listview, SIGNAL(currentChanged(QListViewItem*)), this, SLOT(updateButtons(QListViewItem*)));
00102     connect(m_listview, SIGNAL(moved(QListViewItem*, QListViewItem*, QListViewItem*)), this, SLOT(updateButtons(QListViewItem*)));
00103 
00105     QHBoxLayout *hbox = new QHBoxLayout(m_column, 0, 6);
00106 
00107     // The "item properties" field
00108     m_editor = new KoProperty::Editor(m_column, "editcolumn_propeditor");
00109     m_propSet = new KoProperty::Set(this, "columns");
00110     m_propSet->addProperty(new KoProperty::Property("caption", "Caption", i18n("Caption"),i18n("Caption")));
00111     m_propSet->addProperty(new KoProperty::Property("width", 100, i18n("Width"), i18n("Width")));
00112     m_propSet->addProperty(new KoProperty::Property("clickable", QVariant(true, 3), i18n("Clickable"), i18n("Clickable") ));
00113     m_propSet->addProperty(new KoProperty::Property("resizable", QVariant(true, 3), i18n("Resizable"), i18n("Resizable") ));
00114     m_propSet->addProperty(new KoProperty::Property("fullwidth", QVariant(false, 3), i18n("Full Width"), i18n("Full Width") ));
00115     m_editor->changeSet(m_propSet);
00116     connect(m_propSet, SIGNAL(propertyChanged(KoProperty::Set & KoProperty::Property&)),
00117         this, SLOT(changeProperty(KoProperty::Set & KoProperty::Property&)));
00118 
00119     // Setup the icon toolbar //////////
00120     QVBoxLayout *vbox = new QVBoxLayout(hbox, 3);
00121     QToolButton *add = new QToolButton(m_column);
00122     add->setIconSet(BarIconSet("edit_add"));
00123     add->setTextLabel(i18n("&Add Item"), true);
00124     vbox->addWidget(add);
00125     m_buttons.insert(BColAdd, add);
00126     connect(add, SIGNAL(clicked()), this, SLOT(newItem()));
00127 
00128     QToolButton *remove = new QToolButton(m_column);
00129     remove->setIconSet(BarIconSet("edit_remove"));
00130     remove->setTextLabel(i18n("&Remove Item"), true);
00131     vbox->addWidget(remove);
00132     m_buttons.insert(BColRem, remove);
00133     connect(remove, SIGNAL(clicked()), this, SLOT(removeItem()));
00134 
00135     QToolButton *up = new QToolButton(m_column);
00136     up->setIconSet(BarIconSet("1uparrow"));
00137     up->setTextLabel(i18n("Move Item &Up"), true);
00138     vbox->addWidget(up);
00139     m_buttons.insert(BColUp, up);
00140     connect(up, SIGNAL(clicked()), this, SLOT(MoveItemUp()));
00141 
00142     QToolButton *down = new QToolButton(m_column);
00143     down->setIconSet(BarIconSet("1downarrow"));
00144     down->setTextLabel(i18n("Move Item &Down"), true);
00145     vbox->addWidget(down);
00146     m_buttons.insert(BColDown, down);
00147     connect(down, SIGNAL(clicked()), this, SLOT(MoveItemDown()));
00148     vbox->addStretch();
00149 
00150     // The listbox with columns name /////
00151     m_listbox = new KListBox(m_column, "editlistview_columns");
00152     m_listbox->setFocus();
00153     hbox->insertWidget(0, m_listbox);
00154     hbox->addWidget(m_editor);
00155     connect(m_listbox, SIGNAL(currentChanged(QListBoxItem*)), this, SLOT(updateItemProperties(QListBoxItem*)));
00156 
00158     setInitialSize(QSize(500, 300), true);
00159 }
00160 
00161 int
00162 EditListViewDialog::exec(QListView *listview)
00163 {
00164     if(!listview)
00165     {
00166         kdDebug() << "EditListViewDialog ERROR: no listview " << endl;
00167         return 0;
00168     }
00169 
00170     // We copy the contents of the listview into our listview
00171     for(int i = 0; i < listview->columns(); i++)
00172     {
00173         m_listview->addColumn(listview->columnText(i), listview->columnWidth(i));
00174         m_listview->header()->setClickEnabled(listview->header()->isClickEnabled(i), i);
00175         m_listview->header()->setResizeEnabled(listview->header()->isResizeEnabled(i), i);
00176         m_listview->header()->setStretchEnabled(listview->header()->isStretchEnabled(i), i);
00177         m_listview->setRenameable(i, true);
00178     }
00179     QListViewItem *item = listview->firstChild();
00180     while(item)  {
00181         loadChildNodes(m_listview, item, 0);
00182         item = item->nextSibling();
00183     }
00184 
00185     m_listview->setSelected(m_listview->firstChild(), true);
00186     if(!m_listview->firstChild())
00187         updateButtons(0);
00188 
00189     for(int i = 0; i < listview->columns(); i++)
00190         m_listbox->insertItem(listview->columnText(i));
00191     m_listbox->setSelected(0, true);
00192 
00193     // and we exec the dialog
00194     int r =  KDialogBase::exec();
00195     if(r == QDialog::Accepted)
00196     {
00197         listview->clear();
00198         // We copy the contents of our listview back in the listview
00199         for(int i = 0; i < m_listview->columns(); i++)
00200         {
00201             if(listview->columns() <= i)
00202                 listview->addColumn(m_listview->columnText(i), m_listview->columnWidth(i));
00203             else
00204             {
00205                 listview->setColumnText(i, m_listview->columnText(i));
00206                 listview->setColumnWidth(i, m_listview->columnWidth(i));
00207             }
00208             listview->header()->setClickEnabled(m_listview->header()->isClickEnabled(i), i);
00209             listview->header()->setResizeEnabled(m_listview->header()->isResizeEnabled(i), i);
00210             listview->header()->setStretchEnabled(m_listview->header()->isStretchEnabled(i), i);
00211         }
00212 
00213         QListViewItem *item = m_listview->firstChild();
00214         while(item)
00215         {
00216             loadChildNodes(listview, item, 0);
00217             item = item->nextSibling();
00218         }
00219     }
00220     return r;
00221 }
00222 
00224 void
00225 EditListViewDialog::changeProperty(KoProperty::Set& set, KoProperty::Property& property)
00226 {
00227     if(&set != m_propSet)
00228         return;
00229 
00230     QString name = property.name();
00231     QVariant value = property.value();
00232     if(name == "caption") {
00233         m_propSet->blockSignals(true); // we need to block signals because changeItem will modify selection, and call updateItemProperties
00234         m_listbox->changeItem(value.toString(), m_listbox->currentItem());
00235         m_listview->setColumnText(m_listbox->currentItem(), value.toString());
00236         m_propSet->blockSignals(false);
00237     }
00238     else if(name == "width")
00239         m_listview->setColumnWidth(m_listbox->currentItem(), value.toInt());
00240     else if(name == "resizable")
00241         m_listview->header()->setResizeEnabled(value.toBool(), m_listbox->currentItem());
00242     else if(name == "clickable")
00243         m_listview->header()->setClickEnabled(value.toBool(), m_listbox->currentItem());
00244     else if(name == "fullwidth")
00245         m_listview->header()->setStretchEnabled(value.toBool(), m_listbox->currentItem());
00246 }
00247 
00248 void
00249 EditListViewDialog::updateItemProperties(QListBoxItem *item)
00250 {
00251     if(!item)
00252         return;
00253 
00254     int id = m_listbox->index(item);
00255     if(m_propSet) {
00256         m_propSet->blockSignals(true); // we don't want changeProperty to be called
00257         (*m_propSet)["caption"].setValue(m_listview->columnText(id), false);
00258         (*m_propSet)["width"].setValue(m_listview->columnWidth(id), false);
00259         (*m_propSet)["clickable"].setValue(QVariant(m_listview->header()->isClickEnabled(id), 4), false);
00260         (*m_propSet)["resizable"].setValue(QVariant(m_listview->header()->isResizeEnabled(id), 4), false);
00261         (*m_propSet)["fullwidth"].setValue(QVariant(m_listview->header()->isStretchEnabled(id), 4), false);
00262         m_propSet->blockSignals(false);
00263         m_editor->changeSet(m_propSet);
00264     }
00265 
00266     m_buttons[BColUp]->setEnabled(item->prev());
00267     m_buttons[BColDown]->setEnabled(item->next());
00268 }
00269 
00270 void
00271 EditListViewDialog::newItem()
00272 {
00273     m_listbox->insertItem(i18n("New Column"));
00274     m_listview->addColumn(i18n("New Column"));
00275     m_listview->setRenameable(m_listview->columns() - 1, true);
00276     m_listbox->setCurrentItem(m_listbox->count() - 1);
00277     m_buttons[BColRem]->setEnabled(true);
00278 }
00279 
00280 void
00281 EditListViewDialog::removeItem()
00282 {
00283     int current = m_listbox->currentItem();
00284     if(m_listbox->item(current + 1))
00285         m_listbox->setCurrentItem(current +1);
00286     else
00287         m_listbox->setCurrentItem(current - 1);
00288 
00289     m_listview->removeColumn(current);
00290     m_listbox->removeItem(current);
00291     if(m_listbox->count() == 0)
00292         m_buttons[BColRem]->setEnabled(false);
00293 }
00294 
00295 void
00296 EditListViewDialog::MoveItemUp()
00297 {
00298     int current = m_listbox->currentItem();
00299     QString text = m_listbox->text(current);
00300     m_listbox->blockSignals(true);
00301 
00302     m_listbox->changeItem(m_listbox->text(current - 1), current);
00303     m_listview->setColumnText(current, m_listview->columnText(current - 1));
00304     m_listview->setColumnWidth(current, m_listview->columnWidth(current - 1));
00305     m_listview->header()->setClickEnabled(m_listview->header()->isClickEnabled(current - 1), current);
00306     m_listview->header()->setResizeEnabled(m_listview->header()->isResizeEnabled(current - 1), current);
00307     m_listview->header()->setStretchEnabled(m_listview->header()->isStretchEnabled(current - 1), current);
00308 
00309     m_listbox->changeItem(text, current - 1);
00310     m_listview->setColumnText(current - 1, (*m_propSet)["caption"].value().toString());
00311     m_listview->setColumnWidth(current - 1,(*m_propSet)["width"].value().toBool());
00312     m_listview->header()->setClickEnabled((*m_propSet)["clickable"].value().toBool(), current - 1);
00313     m_listview->header()->setResizeEnabled((*m_propSet)["resizable"].value().toBool(), current - 1);
00314     m_listview->header()->setStretchEnabled((*m_propSet)["fullwidth"].value().toBool(), current - 1);
00315 
00316     m_listbox->blockSignals(false);
00317     m_listbox->setCurrentItem(current - 1);
00318 }
00319 
00320 void
00321 EditListViewDialog::MoveItemDown()
00322 {
00323     int current = m_listbox->currentItem();
00324     QString text = m_listbox->text(current);
00325     m_listbox->blockSignals(true);
00326 
00327     m_listbox->changeItem(m_listbox->text(current+1), current);
00328     m_listview->setColumnText(current, m_listview->columnText(current + 1));
00329     m_listview->setColumnWidth(current, m_listview->columnWidth(current + 1));
00330     m_listview->header()->setClickEnabled(m_listview->header()->isClickEnabled(current + 1), current);
00331     m_listview->header()->setResizeEnabled(m_listview->header()->isResizeEnabled(current + 1), current);
00332     m_listview->header()->setStretchEnabled(m_listview->header()->isStretchEnabled(current + 1), current);
00333 
00334     m_listbox->changeItem(text, current+1);
00335     m_listview->setColumnText(current + 1, (*m_propSet)["caption"].value().toString());
00336     m_listview->setColumnWidth(current + 1,(*m_propSet)["width"].value().toBool());
00337     m_listview->header()->setClickEnabled((*m_propSet)["clickable"].value().toBool(), current + 1);
00338     m_listview->header()->setResizeEnabled((*m_propSet)["resizable"].value().toBool(), current + 1);
00339     m_listview->header()->setStretchEnabled((*m_propSet)["fullwidth"].value().toBool(), current + 1);
00340 
00341     m_listbox->blockSignals(false);
00342     m_listbox->setCurrentItem(current + 1);
00343 }
00344 
00345 
00347 void
00348 EditListViewDialog::updateButtons(QListViewItem *item)
00349 {
00350     if(!item)
00351     {
00352         for(int i = BNewChild; i <= BRowDown; i++)
00353             m_buttons[i]->setEnabled(false);
00354         return;
00355     }
00356 
00357     m_buttons[BNewChild]->setEnabled(true);
00358     m_buttons[BRemRow]->setEnabled(true);
00359     m_buttons[BRowUp]->setEnabled( (item->itemAbove() && (item->itemAbove()->parent() == item->parent())) );
00360     m_buttons[BRowDown]->setEnabled(item->nextSibling());
00361 }
00362 
00363 void
00364 EditListViewDialog::loadChildNodes(QListView *listview, QListViewItem *item, QListViewItem *parent)
00365 {
00366     QListViewItem *newItem;
00367     if(listview->inherits("KListView"))
00368     {
00369         if(parent)
00370             newItem = new KListViewItem(parent);
00371         else
00372             newItem = new KListViewItem(listview);
00373     }
00374     else
00375     {
00376         if(parent)
00377             newItem = new QListViewItem(parent);
00378         else
00379             newItem = new QListViewItem(listview);
00380     }
00381 
00382     // We need to move the item at the end, which is the expected behaviour (by default it is inserted at the beginning)
00383     QListViewItem *last;
00384     if(parent)
00385         last = parent->firstChild();
00386     else
00387         last = listview->firstChild();
00388 
00389     while(last->nextSibling())
00390         last = last->nextSibling();
00391     newItem->moveItem(last);
00392 
00393     // We copy the text of all the columns
00394     for(int i = 0; i < listview->columns(); i++)
00395         newItem->setText(i, item->text(i));
00396 
00397     QListViewItem *child = item->firstChild();
00398     if(child)
00399         newItem->setOpen(true);
00400     while(child)  {
00401         loadChildNodes(listview, child, newItem);
00402         child = child->nextSibling();
00403     }
00404 }
00405 
00406 void
00407 EditListViewDialog::newRow()
00408 {
00409     KListViewItem *parent = (KListViewItem*)m_listview->selectedItem();
00410     if(parent)
00411         parent = (KListViewItem*)parent->parent();
00412     KListViewItem *item;
00413     if(parent)
00414         item = new KListViewItem(parent, m_listview->selectedItem());
00415     else
00416         item = new KListViewItem(m_listview, m_listview->selectedItem());
00417     item->setText(0, i18n("New Item"));
00418     m_listview->setCurrentItem(item);
00419 }
00420 
00421 void
00422 EditListViewDialog::newChildRow()
00423 {
00424     KListViewItem *parent = (KListViewItem*)m_listview->currentItem();
00425     KListViewItem *item;
00426     if(parent)
00427         item = new KListViewItem(parent);
00428     else
00429         item = new KListViewItem(m_listview, m_listview->currentItem());
00430     item->setText(0, i18n("Sub Item"));
00431 
00432     m_listview->setCurrentItem(item);
00433     parent->setOpen(true);
00434 }
00435 
00436 void
00437 EditListViewDialog::removeRow()
00438 {
00439     delete m_listview->currentItem();
00440 }
00441 
00442 void
00443 EditListViewDialog::MoveRowUp()
00444 {
00445     QListViewItem *item = m_listview->currentItem()->itemAbove();
00446     item->moveItem(m_listview->currentItem());
00447     updateButtons(m_listview->currentItem());
00448 }
00449 
00450 void
00451 EditListViewDialog::MoveRowDown()
00452 {
00453     QListViewItem *before = m_listview->currentItem();
00454     before->moveItem(before->nextSibling());
00455     updateButtons(before);
00456 }
00457 
00458 }
00459 
00460 #include "editlistviewdialog.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys