#include "ui_main_window_v2.h"
#include "archived_session.h"
#include "mtadvancedgroupbox.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 *);
bool saveChangesBeforeProceeding(QString, bool);
void setProgress(int); void setNullProgress();
uint searchListWidgetItems(QString, QListWidget *, QLineEdit *);
uint searchTableWidgetItems(QString, QTableWidget *, QLineEdit *);
void checkForUpdates(); void httpRequestFinished(bool);
void openDocumentation();
void changeLanguage(); void langChanged();
void hideArchive();
void previewSvg(QListWidgetItem *);
void enableAll(); void enableSQ();
void enableLQTools(); void enableEQTools();
void enableSMSC(); void enableSMTools();
void enableVSSTools();
void disableAll(); void disableSQ();
void disableLQTools(); void disableEQTools();
void disableSMSC();
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 searchStatistics(const QString &);
void showPrintQuestionsDialogue();
void toggleAddRemoveQuestionToPrintEnabled();
void searchQuestionsNotToPrint(const QString &);
void searchQuestionsToPrint(const QString &);
void addQuestionToPrint(); void removeQuestionToPrint();
void addAllQuestionsToPrint();
void togglePrintSelection(QAbstractButton *);
void setupFlagsPage();
void setFlags(); void loadFlags(); void applyFlags(); void discardFlags();
void setFlagLineEditPalettes(); void updateFlags(QAbstractButton *);
void updateFlagQnums(); void checkForUnflaggedQuestions();
static QColor backgroundColourForFlag(int);
static QColor foregroundColourForFlag(int, bool = false);
void clearAll(); void clearSQ(); void clearSQNoFlags(); void clearDBI();
void clearCurrentValues(); static QString removeLineBreaks(QString);
void clearSMSC(); static QString substituteHtmlTags(QString);
void clearSM(); void clearVSS(); void clearLQ();
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 updateTestQnum(); 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 setMaximumQuestions();
void searchAvailableItems(const QString &); void updateTestTime();
void searchUsedItems(const QString &); int numIdentifiedClients();
void toggleSaveSessionEnabled(); void setMaximumPassMark(int);
void addToList(); void removeFromList(); void toggleAddRemoveEnabled();
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> *, QTableWidget *);
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);
void print(); void quickPrint(); void togglePrintEnabled();
void printAll(); void printSessionSummary();
bool printSessionSummary(Session *, QPrinter *);
void printQuestions();
QString htmlForQuestion(QuestionItem *, QTextDocument &, bool = false, bool = true, bool = true, bool = false);
void setupSessionViewer(); void setCurrentSession(QListWidgetItem *);
void setCurrentStudent(); void selectSessionItem(QListWidgetItem *);
void loadStudentResults(QMap<QString, QuestionAnswer> *, QTableWidget *);
void deleteLog(); void archiveSession(); void restoreSession();
void copyToArchive(); void copyFromArchive();
void searchVSSLS(const QString &); void clearVSSSC();
void searchPassMarkDetails(const QString &);
void openArchive(); void showPassMarkDetails();
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 *, Student *> current_db_students;
QMap<int, int> current_db_flagentries;
Session * current_db_session;
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;
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;
QTableWidget * stats_tw;
QPushButton * stats_btn_adjustall;
QMap<QAbstractButton *, QuestionItem *> stats_qmap;
QMap<QAbstractButton *, int> stats_twmap;
QMap<QAbstractButton *, int> stats_lwmap;
QButtonGroup * btngrpStatsAdjust;
ExtendedLineEdit * stats_search;
QListWidget * printq_excludelist;
QListWidget * printq_includelist;
ExtendedLineEdit * printq_search_excluded;
ExtendedLineEdit * printq_search_included;
QPushButton * printq_btn_print;
QPushButton * printq_add;
QPushButton * printq_remove;
QButtonGroup * rbtngrpPrintqSelect;
QCheckBox * printq_advanced_statistics;
QCheckBox * printq_advanced_formatting;
QCheckBox * printq_advanced_test;
QCheckBox * printq_advanced_graphics;
QLineEdit * editsvg_lineedit_name;
QString editsvg_svgpath;
QComboBox * langComboBox;
QLineEdit * EFFlagLineEdit[20];
QCheckBox * EFFlagCheckBox[20];
QLabel * EFFlagQnumLabel[20];
QPalette search_active_palette;
QPalette search_noresults_palette;
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;
};