#include "consultant.h"
#include <QFileDialog>
#include <QApplication>
#include <QLabel>
#include <QMenuBar>
#include <QicsColumnHeader.h>
#include <QicsDateTimeCellDisplay.h>
#include <QicsCell.h>
#include <QicsColumn.h>
#include <QicsDataItemFormatter.h>
#include <QicsTable.h>
#include <QicsDataModelDefault.h>
#include <QicsComboCellDisplay.h>
#include <QicsCheckCellDisplay.h>
#define NUM_COLUMNS 7
QValidator::State SSNValidator::validate( QString& text, int& pos ) const
{
if( text == QString::null )
{
return Intermediate;
}
if( pos > text.length() )
{
return Intermediate;
}
if( ( pos-1 >= 0 ) && !text[pos-1].isDigit() && ( text[pos-1] != '-' ) )
{
return Invalid;
}
int numDigits = text.length();
int numDashes = 0;
for (int i=0; i < text.length(); i++)
{
if(text.at(i) == QChar('-'))
{
numDigits--;
numDashes++;
}
}
if( numDigits < 9 )
{
return Intermediate;
}
if( numDigits > 9 )
{
return Invalid;
}
if (numDashes != 0)
{
return Intermediate;
}
return Acceptable;
}
void
SSNValidator::fixup( QString& text ) const
{
QString inString = text;
int inLength = inString.length();
for ( int i=inLength; i > 0; i--)
{
if( inString[i] == '-' )
{
text.remove(i,1);
qDebug ("Removing dash. \n");
}
}
}
Consultant::Consultant(QWidget *parent) :
QMainWindow(parent)
{
dataModel = new QicsDataModelDefault(0,NUM_COLUMNS);
table = new QicsTable(dataModel, this);
setCentralWidget(table);
table->columnHeaderRef().setAlignment(Qt::AlignCenter);
table->columnHeaderRef().cellRef(0,0).setLabel(QString("First Name"));
table->columnHeaderRef().cellRef(0,1).setLabel(QString("Last Name"));
table->columnHeaderRef().cellRef(0,2).setLabel(QString("S.S. Number"));
table->columnHeaderRef().cellRef(0,3).setLabel(QString("Date of Birth"));
table->columnHeaderRef().cellRef(0,4).setLabel(QString("Office"));
table->columnHeaderRef().cellRef(0,5).setLabel(QString("Sec. Clearance"));
table->columnHeaderRef().cellRef(0,6).setLabel(QString("Billable Rate"));
SSNValidator* ssnValidator = new SSNValidator();
table->columnRef(2).setValidator(ssnValidator);
QicsComboCellDisplay *officeComboDisplay = new QicsComboCellDisplay(table);
officeComboDisplay->addItem(QString("Boston"));
officeComboDisplay->addItem(QString("Cambridge"));
officeComboDisplay->addItem(QString("Helsinki"));
officeComboDisplay->setAddValueToList(false);
table->columnRef(4).setDisplayer(officeComboDisplay);
QicsCheckCellDisplay *columnHeaderCheckDisp = new QicsCheckCellDisplay(table);
table->columnRef(5).setDisplayer(columnHeaderCheckDisp);
QicsDateTimeCellDisplay* dt = new QicsDateTimeCellDisplay(table);
dt->setDisplayFormat("dd/MM/yyyy");
table->columnRef(3).setDisplayer(dt);
QicsDataItemSprintfFormatter *brFormatter = new QicsDataItemSprintfFormatter();
brFormatter->addFormatString(QicsDataItem_Float, "$%.2f");
brFormatter->addFormatString(QicsDataItem_Int, "$%d.00");
table->columnRef(6).setFormatter(brFormatter);
table->columnRef(6).setValidator(new QDoubleValidator(table));
QLabel *label = new QLabel(QString("Consultants"), table);
label->setAlignment(Qt::AlignCenter);
table->setTopTitleWidget(label);
for (int i = 0; i < NUM_COLUMNS; i++)
{
table->columnRef(i).setWidthInChars(7);
}
table->setVisibleColumns(NUM_COLUMNS);
QMenu *filemenu = new QMenu("File",this);
QAction *save = filemenu->addAction( "Save..." );
connect(save,SIGNAL(triggered()),this,SLOT ( fileSave()));
QAction *open = filemenu->addAction( "Open..." );
connect(open,SIGNAL(triggered()),this,SLOT ( fileOpen()));
QAction *quit = filemenu->addAction( "Quit" );
connect(quit,SIGNAL(triggered()),qApp,SLOT(quit()));
QMenu *toolsmenu = new QMenu("Tools",this);
QAction *addConsultant = toolsmenu->addAction( "Add Consultant");
connect(addConsultant,SIGNAL(triggered()),this,SLOT(addRow()));
QAction *deleteConsultant = toolsmenu->addAction( "Delete Consultant");
connect(deleteConsultant,SIGNAL(triggered()),this,SLOT(deleteRow()));
QAction *sortAscending = toolsmenu->addAction("Sort Ascending");
connect(sortAscending,SIGNAL(triggered()),this,SLOT(sortAscending()));
QAction *sortDescending = toolsmenu->addAction("Sort Descending");
connect(sortDescending,SIGNAL(triggered()),this,SLOT(sortDescending()));
QMenuBar *menubar = menuBar();
menubar->addMenu(filemenu);
menubar->addMenu(toolsmenu);
QObject::connect( &(table->columnHeaderRef()),
SIGNAL( doubleClicked(int , int , int , const QPoint&) ),
this,
SLOT( autoSort(int, int , int , const QPoint&) ) );
_autoSortCol = -1;
_autoSortOrder = Qics::Descending;
}
void Consultant::fileSave()
{
QString outFileName = QFileDialog::getSaveFileName(this,"Choose a file", "./",
"Serialized data files (*.dat)");
QFile file(outFileName);
if(!file.open(QIODevice::WriteOnly))
{
qWarning("error opening file for writing...");
return;
}
QDataStream ds(&file);
int nrows = table->dataModel()->numRows();
int ncols = table->dataModel()->numColumns();
ds<< nrows << ncols;
for(int i = 0;i < nrows;i++)
{
for(int j = 0;j < ncols;j++)
{
const QicsDataItem* itm = table->dataModel()->item(i,j);
if(itm)
itm->encode(ds);
else
{
QicsDataString str;
str.encode(ds);
}
}
}
file.close();
}
void Consultant::fileOpen()
{
QString inFileName = QFileDialog::getOpenFileName(this,"Choose a filename", "./",
"Serialized data files (*.dat)");
if (inFileName.isEmpty())
return;
QFile file(inFileName);
if(!file.open(QIODevice::ReadOnly))
{
qWarning("error opening file for reading...");
return;
}
QDataStream ds(&file);
int rows;
int columns;
ds>>rows;
ds>>columns;
table->setIgnoreModelSizeChanges(true);
table->setRepaintBehavior(Qics::RepaintOff);
table->dataModel()->clearModel();
table->dataModel()->addRows(rows);
table->dataModel()->addColumns(columns);
table->clearSelectionList();
for(int i = 0;i<rows;i++)
{
for(int j = 0;j<columns;j++)
{
QicsDataItem *it = QicsDataItem::decode(ds);
if(it)
table->dataModel()->setItem(i,j, *it);
}
}
table->setIgnoreModelSizeChanges(false);
table->setRepaintBehavior(Qics::RepaintOn);
file.close();
}
void
Consultant::addRow()
{
table->addRows(1);
}
void
Consultant::deleteRow()
{
table->deleteRow(table->currentCell()->rowIndex());
}
void
Consultant::sortAscending()
{
table->sortRows(table->currentCell()->columnIndex(), Qics::Ascending);
}
void
Consultant::sortDescending()
{
table->sortRows(table->currentCell()->columnIndex(), Qics::Descending);
}
void
Consultant::autoSort(int , int col, int , const QPoint &)
{
if (_autoSortCol == col)
{
if (_autoSortOrder == Qics::Ascending)
_autoSortOrder = Qics::Descending;
else
_autoSortOrder = Qics::Ascending;
}
else
{
_autoSortCol = col;
_autoSortOrder = Qics::Ascending;
}
table->sortRows(col, _autoSortOrder);
}