#include "frozen.h"
#include <QApplication>
#include <QMenuBar>
#include <QPushButton>
#include <QButtonGroup>
#include <QRadioButton>
#include <QVBoxLayout>
#include <QicsTable.h>
#include <QicsRowHeader.h>
#include <QicsCell.h>
#include <QicsColumnHeader.h>
#include <QicsSelection.h>
#include <QicsDataModelDefault.h>
#include "QicsFrozenConfigDialog.h"
FrozenUI::FrozenUI(QicsDataModel *dm, QWidget *parent) :
QMainWindow(parent)
{
myTable = new QicsTable(dm, this);
int i;
for (i = 0; i < dm->numRows(); i++)
myTable->rowHeaderRef().cellRef(i,0).setLabel(QString("Row %1").arg(i));
for (i = 0; i < dm->numColumns(); i++)
myTable->columnHeaderRef().cellRef(0,i).setLabel(QString("Col %1").arg(i));
setCentralWidget(myTable);
myFrozenDialog = new QicsFrozenConfigDialog(this);
myMoveDialog = new MoveDialog(this);
QMenuBar *menu = menuBar();
QMenu *file = new QMenu("&File",this);
file->addAction("E&xit", qApp, SLOT(quit()));
menu->addMenu(file);
QMenu *view = new QMenu("&View",this);
view->addAction("F&reeze...", this, SLOT(doFrozenConfig()));
view->addAction("&Move...", this, SLOT(doMoveConfig()));
menu->addMenu(view);
}
void
FrozenUI::doFrozenConfig(void)
{
myFrozenDialog->exec();
if (myFrozenDialog->freezeTopRows())
myTable->freezeTopRows(myFrozenDialog->numTopFrozenRows());
else
myTable->unfreezeTopRows();
if (myFrozenDialog->freezeBottomRows())
myTable->freezeBottomRows(myFrozenDialog->numBottomFrozenRows());
else
myTable->unfreezeBottomRows();
if (myFrozenDialog->freezeLeftColumns())
myTable->freezeLeftColumns(myFrozenDialog->numLeftFrozenCols());
else
myTable->unfreezeLeftColumns();
if (myFrozenDialog->freezeRightColumns())
myTable->freezeRightColumns(myFrozenDialog->numRightFrozenCols());
else
myTable->unfreezeRightColumns();
}
void
FrozenUI::doMoveConfig(void)
{
myMoveDialog->exec();
if (myMoveDialog->moveToTop() || myMoveDialog->moveToBottom())
{
QVector<int> rows_to_move;
QicsSelectionList *slist = myTable->selectionList();
QicsSelectionList::iterator iter;
for (iter = slist->begin(); iter != slist->end(); ++iter)
{
const QicsSelection &sel = *iter;
if ((sel.leftColumn() == 0) &&
(sel.rightColumn() == Qics::QicsLAST_COLUMN))
{
int nrows = rows_to_move.size();
rows_to_move.resize(nrows + (sel.bottomRow() - sel.topRow() + 1));
for (int i = sel.topRow(); i <= sel.bottomRow(); ++i)
{
rows_to_move[nrows++] = i;
}
}
}
qSort(rows_to_move.begin(),rows_to_move.end());
myTable->moveRows((myMoveDialog->moveToTop() ? 0 : myTable->bottomRow() + 1),
rows_to_move);
delete slist;
}
if (myMoveDialog->moveToLeft() || myMoveDialog->moveToRight())
{
QVector<int> cols_to_move;
QicsSelectionList *slist = myTable->selectionList();
QicsSelectionList::iterator iter;
for (iter = slist->begin(); iter != slist->end(); ++iter)
{
const QicsSelection &sel = *iter;
if ((sel.topRow() == 0) &&
(sel.bottomRow() == Qics::QicsLAST_ROW))
{
int ncols = cols_to_move.size();
cols_to_move.resize(ncols +
(sel.rightColumn() - sel.leftColumn() + 1));
for (int i = sel.leftColumn(); i <= sel.rightColumn(); ++i)
{
cols_to_move[ncols++] = i;
}
}
}
qSort(cols_to_move.begin(),cols_to_move.end());
myTable->moveColumns((myMoveDialog->moveToLeft() ? 0 :
myTable->rightColumn() + 1),
cols_to_move);
delete slist;
}
}
MoveDialog::MoveDialog(QWidget *parent) :
QDialog(parent)
{
QVBoxLayout *box = new QVBoxLayout(this);
QButtonGroup *bg = new QButtonGroup(box);
_mTop = new QRadioButton();
_mTop->setText("Move Rows to Top");
_mBottom = new QRadioButton();
_mBottom->setText("Move Rows to Bottom");
_mLeft = new QRadioButton();
_mLeft->setText("Move Columns to Left");
_mRight = new QRadioButton();
_mRight->setText("Move Columns to Right");
bg->addButton(_mTop);
bg->addButton(_mBottom);
bg->addButton(_mLeft);
bg->addButton(_mRight);
box->addWidget(_mTop);
box->addWidget(_mBottom);
box->addWidget(_mRight);
box->addWidget(_mLeft);
QHBoxLayout *row = new QHBoxLayout();
QPushButton *ok = new QPushButton("OkButton",this);
ok->setText("OK");
row->addWidget(ok);
connect(ok, SIGNAL(clicked()),
this, SLOT(accept()) );
QPushButton *cancel = new QPushButton("CancelButton",this);
cancel->setText("Cancel");
row->addWidget(cancel);
connect(cancel, SIGNAL(clicked()),
this, SLOT(reject()) );
box->addLayout(row);
setLayout(box);
}
void MoveDialog::exec()
{
_moveToTop = false;
_moveToBottom = false;
_moveToLeft = false;
_moveToRight = false;
if (QDialog::exec() == QDialog::Accepted)
{
if (_mTop->isChecked())
_moveToTop = true;
if (_mBottom->isChecked())
_moveToBottom = true;
if (_mLeft->isChecked())
_moveToLeft = true;
if (_mRight->isChecked())
_moveToRight = true;
}
}
int main(int argc, char *argv[])
{
QApplication app(argc,argv);
int nrows = 50;
int ncols = 50;
QicsDataModel *dm = new QicsDataModelDefault(nrows, ncols);
for (int i = 0; i < nrows; ++i)
{
for (int j = 0; j < ncols; ++j)
{
dm->setItem(i, j, (i+j));
}
}
FrozenUI *myUI = new FrozenUI(dm);
myUI->show();
return app.exec();
}