00001 #include <QSortFilterProxyModel>
00002 #include <QHeaderView>
00003 #include <QCloseEvent>
00004 #include <QTableView>
00005 #include <QVBoxLayout>
00006 #include <QMessageBox>
00007 #include <QAction>
00008 #include <QItemEditorFactory>
00009 #include <QComboBox>
00010 #include <QItemDelegate>
00011
00012 #include "costcentrechild.h"
00013 #include "../Data/project.h"
00014 #include "../Data/datadefinitions.h"
00015
00016 CostCentreChild::CostCentreChild() : ChildWindow()
00017 {
00018 setType(WindowType::CostCentre);
00019 createActions();
00020 }
00021
00022 void CostCentreChild::setModel(CostCentreModel *model)
00023 {
00024 table = model;
00025
00026 connect(table, SIGNAL(rowChangedWarning(int)), this, SLOT(costTypeRowChanged(int)));
00027 connect(table, SIGNAL(rowRemovedWarning(int)), this, SLOT(costTypeRowRemoved(int)));
00028 }
00029
00030 void CostCentreChild::setCostTypeModel(CostTypeModel *costtype)
00031 {
00032 table->setCostTypeModel(costtype);
00033 }
00034
00035 void CostCentreChild::setProxyModel(CostCentreFilterModel *model)
00036 {
00037 filterModel = model;
00038 }
00039
00040 bool CostCentreChild::loadDocument(const QDomElement document)
00041 {
00042 table->loadDocument(document);
00043 tableView->resizeColumnsToContents();
00044 return true;
00045 }
00046
00047 void CostCentreChild::newFile()
00048 {
00049 QVBoxLayout *layout = new QVBoxLayout;
00050
00051 if(table)
00052 {
00053 filterModel = new CostCentreFilterModel(this);
00054 filterModel->setSourceModel(table);
00055 filterModel->setDynamicSortFilter(true);
00056
00057 tableView = new QTableView;
00058 tableView->setModel(filterModel);
00059 tableView->setSortingEnabled(true);
00060 tableView->horizontalHeader()->setSortIndicatorShown(false);
00061 tableView->horizontalHeader()->setClickable(false);
00062 tableView->sortByColumn(0, Qt::AscendingOrder);
00063
00064 tableView->setSelectionBehavior(QAbstractItemView::SelectColumns);
00065 tableView->setSelectionMode(QAbstractItemView::SingleSelection);
00066 tableView->horizontalHeader()->setStretchLastSection(true);
00067 tableView->verticalHeader()->hide();
00068 tableView->setEditTriggers(QAbstractItemView::CurrentChanged);
00069 tableView->addAction(editAction);
00070 tableView->addAction(deleteAction);
00071 tableView->setContextMenuPolicy(Qt::ActionsContextMenu);
00072
00073 createCostCentreTypeDelegate();
00074
00075 setWindowTitle(table->fileName());
00076
00077 layout->addWidget(tableView);
00078 setLayout(layout);
00079 }
00080 }
00081
00082 void CostCentreChild::enableEditRemoveActions(bool state)
00083 {
00084 editAction->setEnabled(state);
00085 deleteAction->setEnabled(state);
00086 }
00087
00088 void CostCentreChild::createCostCentreTypeDelegate()
00089 {
00090 QItemEditorFactory *factory = new QItemEditorFactory;
00091
00092 QItemEditorCreatorBase *costTypeCreator = new QStandardItemEditorCreator<CostCentreTypeComboBox>();
00093
00094 factory->registerEditor(QVariant::String, costTypeCreator);
00095
00096 QItemDelegate *delegate = new QItemDelegate();
00097 delegate->setItemEditorFactory(factory);
00098
00099 tableView->setItemDelegate(delegate);
00100 }
00101
00102 void CostCentreChild::closeEvent(QCloseEvent *event)
00103 {
00104 if(maybeSave() != false)
00105 {
00106 event->accept();
00107 }
00108 else
00109 {
00110 event->ignore();
00111 }
00112 }
00113
00114 bool CostCentreChild::maybeSave()
00115 {
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131 return true;
00132 }
00133
00134 void CostCentreChild::removeSelection()
00135 {
00136 if(tableView->selectionBehavior() == QAbstractItemView::SelectColumns)
00137 {
00138 removeCostCentre();
00139 }
00140 else
00141 {
00142 removePosition();
00143 }
00144 }
00145
00146 void CostCentreChild::removeCostCentre()
00147 {
00148 if(table->rowCount(QModelIndex()) > 7)
00149 {
00150 QMessageBox::warning(this, tr("Fehler"), tr("Kostenstellen können nur entfernt werden, solange keine Positionen hinzugefügt wurden!"));
00151 }
00152 else
00153 {
00154 QTableView *temp = static_cast<QTableView*>(tableView);
00155 QItemSelectionModel *selectionModel = temp->selectionModel();
00156
00157 QItemSelection selection = ((CostCentreFilterModel*)(temp->model()))->mapSelectionToSource(selectionModel->selection());
00158
00159 int column = selection.indexes().value(0).column();
00160 int columnCount = table->columnCount(QModelIndex());
00161 if(column != 0 && column != 1 && column != columnCount - 1 && column != columnCount - 2 && column != columnCount - 3 && column != columnCount - 4 && column != columnCount - 5 && column != columnCount - 6)
00162 {
00163 table->removeColumns(column, 1, QModelIndex());
00164 table->refreshSums();
00165 }
00166 else
00167 {
00168 QMessageBox::critical(this, "Fehler beim Entfernen der Spalten", "Diese Spalten können nicht gelöscht werden!");
00169 }
00170 }
00171 }
00172
00173 void CostCentreChild::removePosition()
00174 {
00175 QTableView *temp = static_cast<QTableView*>(tableView);
00176 QItemSelectionModel *selectionModel = temp->selectionModel();
00177
00178 QItemSelection selection = ((CostCentreFilterModel*)(temp->model()))->mapSelectionToSource(selectionModel->selection());
00179
00180 table->removeRows(selection.indexes().value(0).row(), 1, QModelIndex());
00181 table->refreshSums();
00182 }
00183
00184 void CostCentreChild::editEntry()
00185 {
00186
00187 QTableView *temp = static_cast<QTableView*>(tableView);
00188 QItemSelectionModel *selectionModel = temp->selectionModel();
00189 QItemSelection selection = ((CostCentreFilterModel*)(temp->model()))->mapSelectionToSource(selectionModel->selection());
00190
00191 QModelIndexList indexes = selection.indexes();
00192
00193 emit setMdiAreaEnabled(false);
00194 emit editInformationAvailable(table, indexes);
00195 }
00196
00197 void CostCentreChild::setBase(QString columnName, QString base)
00198 {
00199 table->setBase(columnName, base);
00200 }
00201
00202 void CostCentreChild::setBase(int column, QString base)
00203 {
00204 table->setBase(column, base);
00205 }
00206
00207 void CostCentreChild::createActions()
00208 {
00209 deleteAction = new QAction(this);
00210 deleteAction->setIcon(QIcon(":/project/DeleteDocument"));
00211 deleteAction->setText(tr("Löschen"));
00212 connect(deleteAction, SIGNAL(triggered()), this, SLOT(removeSelection()));
00213
00214 editAction = new QAction(this);
00215 editAction->setIcon(QIcon(":/edit/SelectAll"));
00216 editAction->setText(tr("Bearbeiten"));
00217 connect(editAction, SIGNAL(triggered()), this, SLOT(editEntry()));
00218 }
00219
00220 void CostCentreChild::addCostCentre(QString name, int type)
00221 {
00222 if(!table->addCostCentre(name, type))
00223 {
00224 QMessageBox::warning(this, tr("Fehler"), tr("Die Kostenstelle existiert bereits! Bitte wählen Sie einen anderen Namen!"));
00225 }
00226 }
00227
00228 void CostCentreChild::addPosition(QStringList items)
00229 {
00230 table->addPosition(items);
00231 }
00232
00233 void CostCentreChild::costTypeRowChanged(int rowid)
00234 {
00235
00236 QMessageBox::warning(this, "Zeilen wurden verändert", "Es wurden Zeilen in der Kostenartenrechnung verändert, die in diesem Dokument verwendet werden! Bitte überprüfen Sie Ihre Eingaben!");
00237 }
00238
00239 void CostCentreChild::costTypeRowRemoved(int rowid)
00240 {
00241
00242 QMessageBox::critical(this, "Zeilen wurden gelöscht", "Es wurden Zeilen in der Kostenartenrechnung gelöscht, die in diesem Dokument verwendet werden! Bitte korrigieren Sie diesen Fehler!");
00243 }
00244
00245 CostCentreTypeComboBox::CostCentreTypeComboBox(QWidget *widget) : QComboBox(widget)
00246 {
00247 populateList();
00248 }
00249
00250 QString CostCentreTypeComboBox::type() const
00251 {
00252 return qVariantValue<QString>(itemData(currentIndex(), Qt::DisplayRole));
00253 }
00254
00255 void CostCentreTypeComboBox::setType(QString type)
00256 {
00257 setCurrentIndex(findData(type, Qt::DisplayRole));
00258 }
00259
00260 void CostCentreTypeComboBox::populateList()
00261 {
00262 QStringList types;
00263 CostCentre *costcentre = new CostCentre();
00264 types<<costcentre->costcentre(CostCentre::PrimaryCostCentre);
00265 types<<costcentre->costcentre(CostCentre::ServiceCostCentre);
00266
00267 for (int i = 0; i < types.count(); i++)
00268 {
00269 insertItem(i, types.value(i));
00270 setItemData(i, types.value(i), Qt::DisplayRole);
00271 }
00272 }