#include "ui_main_window_v2.h"
#include "print_engine.h"
#include "mtadvancedgroupbox.h"
#include "mtprogressbar.h"
#include <QFile>
#include <QInputDialog>
#include <QFileDialog>
#include <QMessageBox>
#include <QAction>
#include <QDir>
#include <QSet>
#include <QList>
#include <QListWidgetItem>
#include <QTableWidgetItem>
#include <QStatusBar>
#include <QProgressBar>
#include <QTimer>
#include <QCloseEvent>
#include <QMap>
#include <QColorDialog>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDataStream>
#include <QByteArray>
#include <QPrinter>
#include <QPrintDialog>
#include <QHttp>
#include <QBuffer>
#include <QDesktopServices>
#include <QHeaderView>
#include <QTranslator>
#include <QQueue>
#include <QProcess>
#include <QSvgWidget>
#include <QUrl>
#include <QtAlgorithms>
class MainWindow : public QMainWindow, private Ui::MainWindow
{
Q_OBJECT
public:
MainWindow();
private slots:
void varinit();
void quit(); void about(); void addRecent(QString);
void loadSettings(); void saveSettings();
void onInfoDisplayChange(bool); void setPage(QAction *);
void currentPageChanged(int);
bool saveChangesBeforeProceeding(QString, bool);
void setProgress(int); void setNullProgress();
void checkForUpdates(); void httpRequestFinished(bool);
void openDocumentation();
void changeLanguage(); void langChanged();
void hideArchive();
void previewSvg(QListWidgetItem *);
void setAllEnabled(bool); void setSQEnabled(bool);
void setLQToolsEnabled(bool); void setEQToolsEnabled(bool);
void setSMSCEnabled(bool); void enableSMTools();
void enableSVTools(); void enableTools();
void setCLSCEnabled(bool); void setCLSSEnabled(bool);
void newDB(); void closeDB();
void openDB(QString, bool = false); void open();
void openRecent(); void openRecent(QListWidgetItem *);
void saveDB(QString, bool = false, bool = false);
void save(); void saveAs(); void saveCopy(); void saveBackup();
void setDatabaseModified();
void overallStatistics(); void statsAdjustAll();
void statsAdjust(QAbstractButton *); void statsWidgetClosed();
void showPrintQuestionsDialogue();
void setupFlagsPage();
void setFlags(); void loadFlags(); void applyFlags(); void discardFlags();
void setFlagLineEditPalettes(); void updateFlags(QAbstractButton *);
void updateFlagQnums(); void checkForUnflaggedQuestions();
int qnumForFlag(int, bool = false);
static QColor backgroundColourForFlag(int);
static QColor foregroundColourForFlag(int, bool = false);
void clearAll(); void clearCurrentValues(); void clearDBI();
void clearLQ(); void clearSQ(); void clearSQNoFlags();
void clearSM(); void clearSMSC(); void clearSV();
void clearCL(); void clearCLSC(); void clearCLSS();
void setCurrentQuestion();
void addQuestion(); void deleteQuestion(); void duplicateQuestion();
void applyQuestionChanges(); void discardQuestionChanges();
static void setQuestionItemColour(QListWidgetItem *, int);
static void setQuestionItemIcon(QListWidgetItem *, int);
static QIcon iconForDifficulty(int);
void sortQuestionsAscending(); void sortQuestionsDescending();
void sortQuestions(Qt::SortOrder);
void hideQuestion(); void hideQuestion(QListWidgetItem *, QuestionItem *);
void moveUp(); void moveDown(); void moveToTop(); void moveToBottom();
void moveQuestion(int); void adjustQuestionDifficulty();
void filterLQ(QAbstractButton *); void filterLQFlagChanged();
void filterLQAction(QAction *); void filterLQSearch();
void searchByGroup();
uint numOccurrences(QString); uint replaceAllOccurrences(QString, QString);
void addSvg(); void removeSvg(); void exportSvg();
void editSvg(); void browseForSvg(); void applySvgChanges();
void currentSvgChanged();
void setupServer(); void reloadAvailableItems();
void updateTestQnum(); void updateTestQnum(bool, bool, bool, QSpinBox *, QTableWidget *);
void updateTestTime(); int numIdentifiedClients(); void toggleStartServerEnabled();
void toggleSaveSessionEnabled(); void resetScoringSystemValues(bool);
static QTableWidgetItem * toTableItem(QListWidgetItem *, bool = false);
static QListWidgetItem * toListItem(QTableWidgetItem *);
void addToList(); void removeFromList();
void startServer(); void stopServer(); void addClient();
void setCurrentClient(); void setClientStatus(QAbstractSocket::SocketState);
void clientIdentified(Client *); void clientFinished(Client *);
void clientResultsLoaded(Client *); void clientDisconnected(Client *);
void loadClientResults(QMap<QString, QuestionAnswer> *);
void loadClientResults(QMap<QString, QuestionAnswer> *, QTableWidget *, ScoringSystem);
void addOfflineClient(); bool addOfflineClient(QString);
void addOfflineClients();
void updateLC(Client *); void sendCorrectAnswers(Client *);
void exportTest(); void exportLog();
void runTestWriter();
bool loadPrinterSettings(); void savePrinterSettings();
bool printerConfiguration(QString &); bool configurePrinter(bool);
bool loadPrinterConfiguration();
bool printClientResults(Client *, QPrinter *);
bool printStudentResults(Student *, QPrinter *, QString, ScoringSystem);
void print(); void quickPrint(); void togglePrintEnabled();
void printAll(); void printSessionSummary();
bool printSessionSummary(Session *, QPrinter *);
void printQuestions(PrintQuestionsDialogue *); void printClassSummary();
bool printClassSummary(Class *, QPrinter *);
QString htmlForQuestion(QuestionItem *, int, QTextDocument &, bool = false, bool = true, bool = true, bool = false);
QString htmlForClassMember(ClassMember *);
void setupSessionViewer(); void setCurrentSession(QListWidgetItem *);
void setCurrentStudent(); void selectSessionItem(QListWidgetItem *);
void loadStudentResults(QMap<QString, QuestionAnswer> *);
void deleteLog(); void archiveSession(); void restoreSession();
void copyToArchive(); void copyFromArchive();
void searchSVLS(const QString &); void clearSVSC();
void openArchive(); void showSelectedStudentTab();
void setupClassViewer();
void setCurrentClass(QListWidgetItem *);
void setCurrentClassMember(QListWidgetItem *);
void updateClassProperties(); void updateClassMemberName();
void addClass(); void deleteClass();
void addStudent(); void deleteStudent();
void addSession(); void deleteSession();
void viewSession(QListWidgetItem *);
void viewSessionAndStudent(QTableWidgetItem *);
void toggleAddSessionToMemberEnabled();
void addSessionToMember();
void removeSessionFromMember();
QDialog * createAddSessionDialogue(QString, MTListWidget * = NULL);
void errorInvalidDBFile(QString, QString);
void setupTextEdits();
void textBold(); void textUnderline(); void textItalic();
void textFamily(const QString &f); void textSize(const QString &p);
void textColor(); void textAlign(QAbstractButton *);
void currentCharFormatChanged(const QTextCharFormat &format);
void cursorPositionChanged();
private:
bool current_db_open;
QString current_db_file;
QString current_db_name;
QString current_db_date;
QString current_db_comments;
QString current_db_question;
QMap<QListWidgetItem *, QuestionItem *> current_db_questions;
QMap<QDateTime, Session *> current_db_sessions;
QMap<QDateTime, ArchivedSession *> current_db_archivedsessions;
QMap<QListWidgetItem *, Class *> current_db_classes;
QMap<QListWidgetItem *, Student *> current_db_students;
QMap<int, int> current_db_flagentries;
Session * current_db_session;
Class * current_db_class;
QQueue<ArchivedSession *> current_db_queued_sessions;
PassMark current_db_passmark;
bool current_db_fe[20]; QString current_db_f[20];
void closeEvent(QCloseEvent *);
QHttp * http; QBuffer * http_buffer;
void mergeFormatOnWordOrSelection(const QTextCharFormat &format);
void fontChanged(const QFont &f);
void colorChanged(const QColor &c);
void alignmentChanged(Qt::Alignment a);
QButtonGroup * tbtngrpAlign;
QButtonGroup * tbtngrpECAlign;
QTcpServer * tcpServer;
QMap<QListWidgetItem *, Client *> current_db_clients;
QList<QByteArray> current_db_test;
QString current_db_testdate;
QString current_db_testname;
ScoringSystem current_db_scoringsystem;
QPrinter * default_printer; bool printer_configured;
int printer_colorMode; bool printer_doubleSidedPrinting;
bool printer_fontEmbeddingEnabled; int printer_numCopies;
int printer_orientation; QString printer_outputFileName;
int printer_outputFormat; int printer_pageOrder;
int printer_pageSize; int printer_paperSource;
int printer_printRange; QString printer_printerName;
int printer_resolution;
QProgressBar * progressBar;
QButtonGroup * rbtngrpFilterLQ;
QActionGroup * actgrpFilterLQ;
QActionGroup * actgrpPage;
QButtonGroup * rbtngrpAdvSelect;
QButtonGroup * rbtngrpTestTime;
QPushButton * btnApply; QPushButton * btnDiscard;
MTTableWidget * stats_tw;
QPushButton * stats_btn_adjustall;
QMap<QAbstractButton *, QuestionItem *> stats_qmap;
QMap<QAbstractButton *, int> stats_twmap;
QMap<QAbstractButton *, int> stats_lwmap;
QButtonGroup * btngrpStatsAdjust;
QLineEdit * editsvg_lineedit_name;
QString editsvg_svgpath;
QComboBox * langComboBox;
QLineEdit * EFFlagLineEdit[20];
QCheckBox * EFFlagCheckBox[20];
QLabel * EFFlagQnumLabel[20];
SearchLineEditPalettes searchLineEditPalettes;
QString ver; float f_ver;
QString itdb_ver; float f_itdb_ver;
QString itos_ver; float f_itos_ver;
QString itest_url; QString docs_url;
QMap<QString, QString> itest_i18n;
class xInvalidDBFile {};
friend class Client;
friend class Session;
friend class ArchivedSession;
friend class PrintQuestionsDialogue;
};