00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kptwbsdefinitionpanel.h"
00021 #include "kptwbsdefinition.h"
00022 #include "kptcommand.h"
00023 #include "kptpart.h"
00024
00025 #include <klocale.h>
00026 #include <kdebug.h>
00027
00028 #include <QComboBox>
00029 #include <QLineEdit>
00030 #include <QCheckBox>
00031 #include <QGroupBox>
00032 #include <QPushButton>
00033 #include <QComboBox>
00034 #include <QSpinBox>
00035 #include <QTableWidget>
00036 #include <QHeaderView>
00037 #include <QStringList>
00038
00039 namespace KPlato
00040 {
00041
00042 ComboBoxDelegate::ComboBoxDelegate(QStringList &list, QObject *parent)
00043 : QItemDelegate(parent)
00044 {
00045 kDebug()<<k_funcinfo<<endl;
00046 setObjectName("ComboBoxDelegate");
00047 m_list = list;
00048 }
00049
00050 QWidget *ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const
00051 {
00052 kDebug()<<k_funcinfo<<endl;
00053 QComboBox *editor = new QComboBox(parent);
00054 editor->installEventFilter(const_cast<ComboBoxDelegate*>(this));
00055 return editor;
00056 }
00057
00058 void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
00059 {
00060 QString value = index.model()->data(index, Qt::DisplayRole).toString();
00061 kDebug()<<k_funcinfo<<value<<": "<<m_list<<endl;
00062 QComboBox *comboBox = static_cast<QComboBox*>(editor);
00063
00064 comboBox->insertItems(0, m_list);
00065 comboBox->setCurrentIndex(comboBox->findText(value));
00066 }
00067
00068 void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
00069 {
00070 QComboBox *comboBox = static_cast<QComboBox*>(editor);
00071 kDebug()<<k_funcinfo<<comboBox->currentText()<<endl;
00072 model->setData(index, comboBox->currentText());
00073 }
00074
00075 void ComboBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const
00076 {
00077 editor->setGeometry(option.rect);
00078 }
00079
00080
00081
00082 WBSDefinitionPanel::WBSDefinitionPanel(WBSDefinition &def, QWidget *p, const char *n)
00083 : QWidget(p),
00084 selectedRow(-1),
00085 m_def(def)
00086 {
00087 setObjectName(n);
00088 setupUi(this);
00089
00090 QStringList codeList = def.codeList();
00091 kDebug()<<k_funcinfo<<codeList<<endl;
00092 defaultSeparator->setText(def.defaultSeparator());
00093 defaultCode->addItems(codeList);
00094 defaultCode->setCurrentIndex(def.defaultCodeIndex());
00095 defaultCode->setFocus();
00096 levelsTable->setItemDelegateForColumn(0, new ComboBoxDelegate(codeList, this));
00097 levelsGroup->setChecked(def.isLevelsDefEnabled());
00098 int i = 0;
00099 const QMap<int, WBSDefinition::CodeDef> &lev = def.levelsDef();
00100 levelsTable->setRowCount(lev.count());
00101 QStringList sl;
00102 kDebug()<<"Map size="<<lev.count()<<endl;
00103 QMap<int, WBSDefinition::CodeDef>::const_iterator it;
00104 for (it = lev.begin(); it != lev.end(); ++it) {
00105 sl << QString("%1").arg(it.key());
00106 QTableWidgetItem *item = new QTableWidgetItem();
00107 item->setData(Qt::DisplayRole, it.value().code);
00108 levelsTable->setItem(i, 0, item);
00109 item = new QTableWidgetItem();
00110 item->setText(it.value().separator);
00111 levelsTable->setItem(i, 1, item);
00112 i++;
00113 }
00114 levelsTable->setVerticalHeaderLabels(sl);
00115
00116 slotLevelChanged(level->value());
00117
00118 connect(defaultCode, SIGNAL(activated(int)), SLOT(slotChanged()));
00119 connect(defaultSeparator, SIGNAL(textChanged(const QString&)), SLOT(slotChanged()));
00120 connect(levelsGroup, SIGNAL(toggled(bool)), SLOT(slotLevelsGroupToggled(bool)));
00121 connect(levelsTable, SIGNAL(cellChanged(int, int)), SLOT(slotChanged()));
00122 connect(levelsTable, SIGNAL(itemSelectionChanged()), SLOT(slotSelectionChanged()));
00123 connect(level, SIGNAL(valueChanged(int)), SLOT(slotLevelChanged(int)));
00124 connect(removeBtn, SIGNAL(clicked(bool)), SLOT(slotRemoveBtnClicked()));
00125 connect(addBtn, SIGNAL(clicked(bool)), SLOT(slotAddBtnClicked()));
00126
00127 removeBtn->setEnabled(false);
00128 }
00129
00130 void WBSDefinitionPanel::setStartValues(Part *) {
00131 }
00132
00133 KMacroCommand *WBSDefinitionPanel::buildCommand(Part *) {
00134 KMacroCommand *cmd = new KMacroCommand(i18n("Modify WBS Definition"));
00135
00136 return cmd;
00137 }
00138
00139 bool WBSDefinitionPanel::ok() {
00140 kDebug()<<k_funcinfo<<endl;
00141 m_def.setDefaultCode(defaultCode->currentIndex());
00142 m_def.setDefaultSeparator(defaultSeparator->text());
00143
00144 m_def.setLevelsDefEnabled(levelsGroup->isChecked());
00145
00146 m_def.clearLevelsDef();
00147 for (int i = 0; i < levelsTable->rowCount(); ++i) {
00148 m_def.setLevelsDef(levelsTable->verticalHeaderItem(i)->text().toInt(), levelsTable->item(i, 0)->text(), levelsTable->item(i, 1)->text());
00149 }
00150 return true;
00151 }
00152
00153 void WBSDefinitionPanel::slotChanged() {
00154 emit changed(true);
00155 }
00156
00157 void WBSDefinitionPanel::slotSelectionChanged() {
00158 QString s;
00159 selectedRow = -1;
00160 QList<QTableWidgetItem *> items = levelsTable->selectedItems();
00161 if (items.count() == 2 && items[0]->row() == items[1]->row()) {
00162 selectedRow = items[0]->row();
00163 s = QString("Row[%1]=selected ").arg(selectedRow);
00164 } else {
00165 s = "None selected";
00166 }
00167 removeBtn->setEnabled(selectedRow != -1);
00168 kDebug()<<k_funcinfo<<s<<endl;
00169 }
00170
00171 void WBSDefinitionPanel::slotRemoveBtnClicked() {
00172 kDebug()<<k_funcinfo<<selectedRow<<endl;
00173 if (selectedRow == -1) {
00174 return;
00175 }
00176 levelsTable->removeRow(selectedRow);
00177 removeBtn->setEnabled(false);
00178 slotLevelChanged(level->value());
00179 }
00180
00181 void WBSDefinitionPanel::slotAddBtnClicked() {
00182 kDebug()<<k_funcinfo<<endl;
00183 int i=levelsTable->rowCount()-1;
00184 for (; i >= 0; --i) {
00185 kDebug()<<k_funcinfo<<"Checking row["<<i<<"]="<<levelsTable->verticalHeaderItem(i)->text()<<" with "<<level->value()<<endl;
00186 if (level->value() > levelsTable->verticalHeaderItem(i)->text().toInt()) {
00187 break;
00188 }
00189 }
00190 i++;
00191 levelsTable->insertRow(i);
00192 levelsTable->setVerticalHeaderItem(i, new QTableWidgetItem(QString("%1").arg(level->value())));
00193 QTableWidgetItem *item = new QTableWidgetItem();
00194 item->setData(Qt::DisplayRole, (m_def.codeList())[m_def.defaultCodeIndex()]);
00195 levelsTable->setItem(i, 0, item);
00196 item = new QTableWidgetItem();
00197 item->setText(m_def.defaultSeparator());
00198 levelsTable->setItem(i, 1, item);
00199
00200 addBtn->setEnabled(false);
00201 slotChanged();
00202
00203 kDebug()<<k_funcinfo<<"Added row="<<i<<" level="<<level->value()<<endl;
00204 }
00205
00206 void WBSDefinitionPanel::slotLevelChanged(int value) {
00207 for (int i=0; i < levelsTable->rowCount(); ++i) {
00208 if (value == levelsTable->verticalHeaderItem(i)->text().toInt()) {
00209 addBtn->setEnabled(false);
00210 return;
00211 }
00212 }
00213 addBtn->setEnabled(levelsGroup->isChecked());
00214 slotChanged();
00215 }
00216 void WBSDefinitionPanel::slotLevelsGroupToggled(bool ) {
00217 kDebug()<<k_funcinfo<<endl;
00218 slotLevelChanged(level->value());
00219 }
00220
00221
00222 }
00223
00224 #include "kptwbsdefinitionpanel.moc"