summaryrefslogtreecommitdiff
path: root/client/macrowindow.cc
diff options
context:
space:
mode:
authordeva <deva>2008-06-02 13:03:33 +0000
committerdeva <deva>2008-06-02 13:03:33 +0000
commit322a83c48618b2f58e1014daff6f3956af8070ea (patch)
treeaa6124cd9f13ee2308e28d33175dc31eb1d34984 /client/macrowindow.cc
parentf9f04013fca46fa256664bbf1f983c966f253400 (diff)
A large number of small changes in widgets, primarily validation oriented.
Diffstat (limited to 'client/macrowindow.cc')
-rw-r--r--client/macrowindow.cc256
1 files changed, 256 insertions, 0 deletions
diff --git a/client/macrowindow.cc b/client/macrowindow.cc
new file mode 100644
index 0000000..74e8d54
--- /dev/null
+++ b/client/macrowindow.cc
@@ -0,0 +1,256 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * macrowindow.cc
+ *
+ * Fri Aug 31 12:27:45 CEST 2007
+ * Copyright 2007 Lars Bisballe Jensen and Bent Bisballe Nyeng
+ * elsenator@gmail.com and deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of Pracro.
+ *
+ * Pracro is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Pracro is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Pracro; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "macrowindow.h"
+#include "sendrecieve.h"
+#include "widgets.h"
+#include "macro.h"
+#include <QVBoxLayout>
+#include <QMessageBox>
+#include <QDomDocument>
+#include <QDomElement>
+#include <QDomNode>
+#include <QByteArray>
+
+extern QString cpr;
+extern QString user;
+extern QString host;
+extern quint16 port;
+
+MacroWindow::MacroWindow(QDomDocument *xml_doc)
+ : QObject()
+{
+ isclosed = false;
+
+ // Execute the recursive function with documentElement
+ recurser(xml_doc->documentElement(), NULL);
+}
+
+MacroWindow::~MacroWindow()
+{
+}
+
+void MacroWindow::recurser(QDomNode xml_node, QWidget *parent)
+{
+ QWidget *widget = NULL;
+ QDomElement xml_elem = xml_node.toElement();
+
+ if(xml_elem.tagName() == "macro") {
+ // Assign the macro name and version to QStrings for use when comitting
+ if(xml_elem.hasAttribute("name")) macro = xml_elem.attribute("name");
+ if(xml_elem.hasAttribute("version")) version = xml_elem.attribute("version");
+
+ } else if(xml_elem.tagName() == "window") {
+ Window *window = new Window(xml_elem);
+ widget = window;
+ mainwidget = window;
+
+ } else if(xml_elem.tagName() == "frame") {
+ if(xml_elem.hasAttribute("caption")) {
+ GroupBox *frame = new GroupBox(xml_elem);
+ widget = frame;
+ } else {
+ Frame *frame = new Frame(xml_elem);
+ widget = frame;
+ }
+
+ } else if(xml_elem.tagName() == "label") {
+ Label *label = new Label(xml_elem);
+ widget = label;
+
+ } else if(xml_elem.tagName() == "lineedit") {
+ LineEdit *lineedit = new LineEdit(xml_elem);
+ widgets.push_back(lineedit);
+ widget = lineedit;
+
+ } else if(xml_elem.tagName() == "button") {
+ PushButton *pushbutton = new PushButton(xml_elem);
+ //connect(pushbutton, SIGNAL(act_continue()), main, SLOT(get_macro()));
+ connect(pushbutton, SIGNAL(act_commit()), this, SLOT(commit()));
+ connect(pushbutton, SIGNAL(act_reset()), this, SLOT(reset()));
+ connect(pushbutton, SIGNAL(act_cancel()), this, SLOT(cancel()));
+ connect(pushbutton, SIGNAL(act_continue(QString)), this, SLOT(cont(QString)));
+ widget = pushbutton;
+
+ } else if(xml_elem.tagName() == "textedit") {
+ TextEdit *textedit = new TextEdit(xml_elem);
+ widgets.push_back(textedit);
+ widget = textedit;
+
+ } else if(xml_elem.tagName() == "checkbox") {
+ CheckBox *checkbox = new CheckBox(xml_elem);
+ widgets.push_back(checkbox);
+ widget = checkbox;
+
+ } else if(xml_elem.tagName() == "radiobuttons") {
+ RadioButtons *radiobuttons = new RadioButtons(xml_elem);
+ widgets.push_back(radiobuttons);
+ widget = radiobuttons;
+ //return; // Don't iterate children
+
+ } else if(xml_elem.tagName() == "combobox") {
+ ComboBox *combobox = new ComboBox(xml_elem);
+ widgets.push_back(combobox);
+ widget = combobox;
+ //return; // Don't iterate children
+
+ } else if(xml_elem.tagName() == "listbox") {
+ ListBox *listbox = new ListBox(xml_elem);
+ widgets.push_back(listbox);
+ widget = listbox;
+ //return; // Don't iterate children
+ }
+
+ QDomNodeList children = xml_node.childNodes();
+
+ for (int i=0; i<children.count();i++) {
+ QDomNode child = children.at(i);
+ recurser(child, widget);
+ }
+
+ if(parent != NULL && widget != NULL) parent->layout()->addWidget(widget);
+ if(widget != NULL) widget->show();
+}
+
+bool MacroWindow::doCommit()
+{
+ // Check for, and count, errors on all entries before comitting
+ int faulty = 0; // 0 initial errors
+
+ QVector< Widget* >::iterator i = widgets.begin();
+ while (i != widgets.end()) {
+ Widget* w = *i;
+ if(!w->isValid()) faulty++; // Regexp check, returns valid if entry passed
+ i++;
+ }
+
+ // If all entries passed validation, continue commit
+ if(faulty == 0) {
+ printf("MacroWindow -> committing...\n");
+
+ // Build the XML commit
+ QString xml_string;
+ xml_string.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+ xml_string.append("<pracro version=\"1.0\" cpr=\"" + cpr + "\" user=\"" + user + "\">\n");
+ xml_string.append(" <commit macro=\"" + macro + "\" version=\"" +
+ version + "\">\n");
+
+ // Iterate the different entries, and append their results to the commit string
+ QVector< Widget* >::iterator i=widgets.begin();
+ while (i != widgets.end()) {
+ Widget* w = *i;
+
+ xml_string.append(" <field name=\"" + w->getName()
+ + "\" value=\"" + w->getValue() + "\"/>\n");
+ i++;
+ }
+
+ xml_string.append(" </commit>\n");
+ xml_string.append("</pracro>\n");
+
+ // Print commit to stdout for debug purposes
+ printf("%s\n", xml_string.toStdString().c_str());
+
+ // Convert the commit to Utf-8 charset
+ QByteArray xml_array = xml_string.toUtf8();
+ QDomDocument xml_result;
+
+ // Use setContent of QDomDocument to validate the xml commit
+ if (!xml_result.setContent(xml_array)) {
+ printf("Parse error: Invalid XML\n");
+ }
+
+ // Commit the xml data to the server
+ SendRecieve macro_commit(host, port);
+ macro_commit.makeConnection(&xml_result);
+ // Recieve answer from server whether successful or not
+ //QByteArray ba = macro_commit.getResult();
+ QString ba = macro_commit.getResult();
+ printf("Server returned result: %s", ba.toStdString().c_str());
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void MacroWindow::close()
+{
+ mainwidget->close();
+ isclosed = true;
+}
+
+void MacroWindow::commit()
+{
+ if(doCommit()) {
+ close();
+ } else {
+ QMessageBox::critical(NULL, "Fejl",
+ "Makroen er ikke udfyldt korrekt, prøv igen.\n"
+ , QMessageBox::Ok);
+ }
+}
+
+void MacroWindow::reset()
+{
+ QMessageBox::warning(NULL, tr("Reset"),
+ tr("Du har valgt at nulstille de indtastede data.\n"
+ "Er du sikker?"),
+ QMessageBox::Yes | QMessageBox::Cancel);
+ printf("MacroWindow -> resetting...\n");
+}
+
+void MacroWindow::cancel()
+{
+ printf("MacroWindow -> cancelling...\n");
+ close();
+}
+
+void MacroWindow::cont(QString name)
+{
+ QString macro;
+ QVector< Widget* >::iterator i=widgets.begin();
+ while (i != widgets.end()) {
+ Widget* w = *i;
+ if(w->getName() == name) {
+ macro = w->getValue();
+ }
+ i++;
+ }
+ if(doCommit()) {
+ new_macro("FIXME", macro);
+ close();
+ } else {
+ QMessageBox::critical(NULL, "Fejl",
+ "Makroen er ikke udfyldt korrekt, prøv igen.\n",
+ QMessageBox::Ok);
+ }
+ printf("%s : MacroWindow -> continuing...\n", macro.toStdString().c_str());
+}
+
+bool MacroWindow::isClosed()
+{
+ return isclosed;
+}