00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
00043 : KDialogBase(Tabbed, i18n("Edit Listview Contents"), Ok|Cancel, Ok, parent, "editlistview_dialog", true , 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
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
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
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
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
00194 int r = KDialogBase::exec();
00195 if(r == QDialog::Accepted)
00196 {
00197 listview->clear();
00198
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);
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);
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
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
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"