Index: /Vago/trunk/Vago/Vago.pro
===================================================================
--- /Vago/trunk/Vago/Vago.pro	(revision 1060)
+++ /Vago/trunk/Vago/Vago.pro	(revision 1061)
@@ -13,9 +13,10 @@
 CONFIG   += c++14
 
-#INCLUDEPATH += ./libs
 INCLUDEPATH += ./packageWizard
 INCLUDEPATH += ./soundWizard
 INCLUDEPATH += ./bgImageWizard
+INCLUDEPATH += ./bgImageWizard
 INCLUDEPATH += ./xmlToolsInterface
+INCLUDEPATH += ./windowMessagesWizard
 
 # Used this great tutorial to build zlib and quazip:
@@ -36,4 +37,8 @@
 }
 
+INCLUDEPATH += ./libs/DropTableWidget
+INCLUDEPATH += ./libs/DropLineEdit
+INCLUDEPATH += ../Libs/pugixml
+
 win32 {
 RC_FILE = icon_resource.rc #for windows explorer icon
@@ -50,5 +55,4 @@
     main.cpp \
     logger.cpp \
-    droptablewidget.cpp \
     converter.cpp \
     about.cpp \
@@ -66,5 +70,4 @@
     bgImageWizard/bgimagepage2.cpp \
     xmlprocessor.cpp \
-    libs/pugixml/pugixml.cpp \
     utilvago.cpp \
     bgImageWizard/bgimagewizard.cpp \
@@ -74,5 +77,14 @@
     libs/BasicXMLSyntaxHighlighter/BasicXMLSyntaxHighlighter.cpp \
     xmlToolsInterface/xmltoolsinterfacecommandpreview.cpp \
-    libs/LineNumberDisplay/LineNumberDisplay.cpp
+    libs/LineNumberDisplay/LineNumberDisplay.cpp \
+    abstractwizard.cpp \
+    windowMessagesWizard/wmsetuppage.cpp \
+    windowMessagesWizard/wmformatpage.cpp \
+    windowMessagesWizard/wmpage.cpp \
+    windowMessagesWizard/wmwizard.cpp \
+    windowMessagesWizard/wmfinalpage.cpp \
+    ./libs/DropTableWidget/droptablewidget.cpp \
+    ./libs/DropLineEdit/droplineedit.cpp \
+    ../Libs/pugixml/pugixml.cpp
 
 HEADERS  += \
@@ -82,5 +94,4 @@
     mainwindow.h \
     logger.h \
-    droptablewidget.h \
     converter.h \
     about.h \
@@ -98,5 +109,4 @@
     bgImageWizard/bgimagepage2.h \
     xmlprocessor.h \
-    libs/pugixml/pugixml.hpp \
     utilvago.h \
     bgImageWizard/bgimagewizard.h \
@@ -106,5 +116,15 @@
     libs/BasicXMLSyntaxHighlighter/BasicXMLSyntaxHighlighter.h \
     xmlToolsInterface/xmltoolsinterfacecommandpreview.h \
-    libs/LineNumberDisplay/LineNumberDisplay.h
+    libs/LineNumberDisplay/LineNumberDisplay.h \
+    wizardfactory.h \
+    abstractwizard.h \
+    windowMessagesWizard/wmsetuppage.h \
+    windowMessagesWizard/wmformatpage.h \
+    windowMessagesWizard/wmpage.h \
+    windowMessagesWizard/wmwizard.h \
+    windowMessagesWizard/wmfinalpage.h \
+    ./libs/DropTableWidget/droptablewidget.h \
+    ./libs/DropLineEdit/droplineedit.h \
+    ../Libs/pugixml/pugixml.hpp
 
 FORMS    += \
@@ -126,5 +146,8 @@
     bgImageWizard/bgimagepagefinal.ui \
     xmlToolsInterface/xmltoolsinterface.ui \
-    xmlToolsInterface/xmltoolsinterfacecommandpreview.ui
+    xmlToolsInterface/xmltoolsinterfacecommandpreview.ui \
+    windowMessagesWizard/wmsetuppage.ui \
+    windowMessagesWizard/wmformatpage.ui \
+    windowMessagesWizard/wmfinalpage.ui
 
 RESOURCES += \
Index: /Vago/trunk/Vago/about.cpp
===================================================================
--- /Vago/trunk/Vago/about.cpp	(revision 1060)
+++ /Vago/trunk/Vago/about.cpp	(revision 1061)
@@ -8,9 +8,7 @@
     ui->setupUi(this);
     this->setAttribute(Qt::WA_DeleteOnClose,true ); //destroy itself once finished.
-    this->layout()->setSizeConstraint( QLayout::SetFixedSize ); //fixed size
-    ui->lbAbout->setOpenExternalLinks(true); //allow navigate to oni central
     ui->lbAbout->setText("<html>"
-                         "<b>Vago GUI "+GlobalVars::AppVersion+"</b>"
-                         "<p style='font-size:small;'>"
+                         "<p style='font-size:x-large;'><b>Vago GUI " + GlobalVars::AppVersion + "</b></p>"
+                         "<p style='font-size:large;line-height: 18px;'>"
                          "Written by s10k<br /><br/>"
                          "Build Date " + __DATE__ + " " + __TIME__ + "<br /><br />"
@@ -32,15 +30,21 @@
                          "Arseny Kapoulkine (and contributors)for pugixml library<br />"
                          "smashingmagazine for the folder icon :)<br />"
-                         "Freepik and Flaticon by the background image wizard icon<br />"
+                         "Freepik and Flaticon by the background image wizard and text editing icons<br />"
                          "qtiplot authors for line numbers in QTextEdit<br />"
                          "d1vanov for basic-xml-syntax-highlighter class <br />"
-                         "<center>"
-                         "Visit us at:<br />"
-                         "<a href='http://oni.bungie.org'>"
-                         "oni.bungie.org"
-                         "</center>"
-                         "</a>"
                          "</p>"
                          "</html>"); // Don't use rich text in qtdesigner because it generates platform dependent code
+
+    ui->lbOniCommunity->setText("<html>"
+                                "<p style='font-size:large;'>"
+                                "<center>"
+                                "Visit us at:<br />"
+                                "<a href='http://oni.bungie.org'>"
+                                "oni.bungie.org"
+                                "</a>"
+                                "</center>"
+                                "</p>"
+                                "</html>"
+                                );
 }
 
Index: /Vago/trunk/Vago/about.ui
===================================================================
--- /Vago/trunk/Vago/about.ui	(revision 1060)
+++ /Vago/trunk/Vago/about.ui	(revision 1061)
@@ -45,19 +45,72 @@
       <layout class="QVBoxLayout" name="verticalLayout">
        <item>
-        <widget class="QLabel" name="lbAbout">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
+        <widget class="QScrollArea" name="scrollArea">
+         <property name="widgetResizable">
+          <bool>true</bool>
          </property>
-         <property name="text">
-          <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+         <widget class="QWidget" name="scrollAreaWidgetContents">
+          <property name="geometry">
+           <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>341</width>
+            <height>283</height>
+           </rect>
+          </property>
+          <layout class="QVBoxLayout" name="verticalLayout_3">
+           <item>
+            <widget class="QLabel" name="lbAbout">
+             <property name="sizePolicy">
+              <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+               <horstretch>0</horstretch>
+               <verstretch>0</verstretch>
+              </sizepolicy>
+             </property>
+             <property name="text">
+              <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
 &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
 p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt; font-weight:600;&quot;&gt;Vago GUI&lt;/span&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;
-&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Written by s10k&lt;br /&gt;&lt;br /&gt;Thanks to:&lt;br /&gt;Edit in About.cpp&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
-&lt;p align=&quot;center&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Visit us at:&lt;br /&gt;&lt;/span&gt;&lt;a href=&quot;http://oni.bungie.org&quot;&gt;&lt;span style=&quot; font-size:8pt; text-decoration: underline; color:#0000ff;&quot;&gt;oni.bungie.org &lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Vago GUI&lt;/span&gt; &lt;/p&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Written by s10k&lt;br /&gt;&lt;br /&gt;Thanks to:&lt;br /&gt;Edit in About.cpp&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+             </property>
+             <property name="wordWrap">
+              <bool>true</bool>
+             </property>
+             <property name="openExternalLinks">
+              <bool>true</bool>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </widget>
+        </widget>
+       </item>
+       <item>
+        <spacer name="verticalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeType">
+          <enum>QSizePolicy::Fixed</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>10</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QLabel" name="lbOniCommunity">
+         <property name="text">
+          <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;Visit us at:&lt;br/&gt;&lt;a href=&quot;http://oni.bungie.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;oni.bungie.org &lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+         </property>
+         <property name="wordWrap">
+          <bool>true</bool>
+         </property>
+         <property name="openExternalLinks">
+          <bool>true</bool>
          </property>
         </widget>
@@ -67,4 +120,7 @@
          <property name="orientation">
           <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeType">
+          <enum>QSizePolicy::Fixed</enum>
          </property>
          <property name="sizeHint" stdset="0">
Index: /Vago/trunk/Vago/abstractwizard.cpp
===================================================================
--- /Vago/trunk/Vago/abstractwizard.cpp	(revision 1061)
+++ /Vago/trunk/Vago/abstractwizard.cpp	(revision 1061)
@@ -0,0 +1,80 @@
+#include "abstractwizard.h"
+
+AbstractWizard::AbstractWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger, const bool hasRestartButton)
+{
+    this->appDir = appDir;
+    this->workspaceWizardLocation=workspaceWizardLocation;
+    this->vagoSettings=vagoSettings;
+    this->myLogger=myLogger;
+    this->hasRestartButton = hasRestartButton;
+    this->myWizard.setWindowFlags(Qt::Window); // add minimize button in QWizard
+}
+
+void AbstractWizard::showWizard(const QString &windowsTitle, const QString &windowsIcon){
+    // Connect finished signal to our function
+    QObject::connect(&myWizard, SIGNAL(finished(int)), this, SLOT(wizardFinished(int)));
+
+    // If it has a restart button setup it
+    if(this->hasRestartButton){
+        QPushButton *restartButton = new QPushButton("Restart");
+        this->myWizard.setButton(QWizard::CustomButton1,restartButton);
+        this->myWizard.setOption(QWizard::HaveCustomButton1, true);
+
+        connect(&this->myWizard, SIGNAL(currentIdChanged(int)), this, SLOT(pageChanged(int)));
+        connect(restartButton, SIGNAL(clicked(bool)), this, SLOT(restartWizard()));
+    }
+
+    myWizard.setWindowIcon(QIcon(windowsIcon));
+    myWizard.setWindowTitle(windowsTitle);
+
+    //Center and resize QWizard (http://www.thedazzlersinc.com/source/2012/06/04/qt-center-window-in-screen/)
+#ifdef Q_OS_WIN
+    myWizard.resize(640,480);
+#else
+    myWizard.resize(800,600); // Mac OS pcs should be able to render this resolution without any problem. It's also better
+    // because the components on mac use more space
+#endif
+    QRect position = myWizard.frameGeometry();
+    position.moveCenter(QDesktopWidget().availableGeometry().center());
+    myWizard.move(position.topLeft());
+    //
+
+    // Show non modal window
+    myWizard.show();
+}
+
+QWizardPage* AbstractWizard::createIntroPage(const QString &text) {
+    QWizardPage *page = new QWizardPage;
+    page->setTitle("Introduction");
+
+    QLabel *label = new QLabel(text);
+    label->setWordWrap(true);
+
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->addWidget(label);
+    page->setLayout(layout);
+
+    return page;
+}
+
+void AbstractWizard::wizardFinished(int resultStatus){
+    beforeClose(static_cast<QDialog::DialogCode>(resultStatus));
+
+    // delete itself
+    delete this;
+}
+
+void AbstractWizard::restartWizard(){
+    this->myWizard.restart();
+}
+
+void AbstractWizard::pageChanged(int pageId){
+    // Last page?
+    if(pageId==this->myWizard.pageIds().size()-1){
+        this->myWizard.setOption(QWizard::HaveCustomButton1, true); // set visible
+        this->myWizard.button(QWizard::BackButton)->setEnabled(false); // disable back button, use restart if needed
+        return;
+    }
+    this->myWizard.setOption(QWizard::HaveCustomButton1, false); // set invisible
+    this->myWizard.button(QWizard::BackButton)->setEnabled(true); // set enable back button
+}
Index: /Vago/trunk/Vago/abstractwizard.h
===================================================================
--- /Vago/trunk/Vago/abstractwizard.h	(revision 1061)
+++ /Vago/trunk/Vago/abstractwizard.h	(revision 1061)
@@ -0,0 +1,43 @@
+#ifndef ABSTRACTWIZARD_H
+#define ABSTRACTWIZARD_H
+
+#include "logger.h"
+
+#include <QLabel>
+#include <QVBoxLayout>
+#include <QLineEdit>
+#include <QRect>
+#include <QDesktopWidget>
+#include <QTextStream>
+#include <QSettings>
+#include <QWizard>
+#include <QIcon>
+#include <QPushButton>
+
+// This abstract class allow us to re-use most of the code used in wizards.
+// To create wizard use the WizardFactory class available in "wizardfactory.h"
+class AbstractWizard: public QObject // for signals and slots
+{
+    Q_OBJECT // for signals and slots
+protected:
+	QWizard myWizard;
+    QString workspaceWizardLocation;
+	QSettings *vagoSettings;
+	Logger *myLogger;
+    QString appDir;
+protected:
+    AbstractWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger, const bool hasRestartButton);
+    virtual void exec()=0;
+	void showWizard(const QString &windowsTitle, const QString &windowsIcon);
+    QWizardPage* createIntroPage(const QString &text);
+    virtual void beforeClose(QDialog::DialogCode resultStatus)=0;
+protected slots:
+    void wizardFinished(int resultStatus);
+private:
+    bool hasRestartButton;
+private slots:
+    void pageChanged(int pageId);
+    void restartWizard();
+};
+
+#endif // ABSTRACTWIZARD_H
Index: /Vago/trunk/Vago/bgImageWizard/bgimagepagefinal.h
===================================================================
--- /Vago/trunk/Vago/bgImageWizard/bgimagepagefinal.h	(revision 1060)
+++ /Vago/trunk/Vago/bgImageWizard/bgimagepagefinal.h	(revision 1061)
@@ -4,6 +4,7 @@
 #include <QWizardPage>
 #include <QImage>
+#include <pugixml.hpp>
+
 #include "utilvago.h"
-#include "libs/pugixml/pugixml.hpp"
 #include "converter.h"
 
Index: /Vago/trunk/Vago/bgImageWizard/bgimagewizard.cpp
===================================================================
--- /Vago/trunk/Vago/bgImageWizard/bgimagewizard.cpp	(revision 1060)
+++ /Vago/trunk/Vago/bgImageWizard/bgimagewizard.cpp	(revision 1061)
@@ -2,4 +2,5 @@
 
 BGImageWizard::BGImageWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger)
+:AbstractWizard(appDir, workspaceWizardLocation, vagoSettings, myLogger, true)
 {
     this->appDir = appDir;
@@ -10,26 +11,5 @@
 }
 
-int BGImageWizard::exec(){
-
-    QPushButton *restartButton = new QPushButton("Restart");
-    this->myWizard.setButton(QWizard::CustomButton1,restartButton);
-    this->myWizard.setOption(QWizard::HaveCustomButton1, true);
-
-    connect(&this->myWizard, SIGNAL(currentIdChanged(int)), this, SLOT(pageChanged(int)));
-    connect(restartButton, SIGNAL(clicked(bool)), this, SLOT(restartWizard()));
-
-    this->myWizard.setWindowIcon(QIcon(":/new/icons/background_image.png"));
-
-    //Center and resize QWizard (http://www.thedazzlersinc.com/source/2012/06/04/qt-center-window-in-screen/)
-#ifdef Q_OS_WIN
-    this->myWizard.resize(640,480);
-#else
-    this->myWizard.resize(800,600); // Mac OS pcs should be able to render this resolution without any problem. It's also better
-    // because the components on mac use more space
-#endif
-    QRect position = this->myWizard.frameGeometry();
-    position.moveCenter(QDesktopWidget().availableGeometry().center());
-    this->myWizard.move(position.topLeft());
-    //
+void BGImageWizard::exec(){
 
     BGImagePage2 *page2 = new BGImagePage2(this->myLogger);
@@ -37,46 +17,22 @@
     BGImagePageFinal *pageFinal = new BGImagePageFinal(this->appDir, this->myLogger, this->bgImagesLocation);
 
-    this->myWizard.addPage(createIntroPage());
+    this->myWizard.addPage
+    (
+        createIntroPage
+        (
+            "Welcome to the Oni Background Image Wizard.\n"
+            "This wizard will allow you to create in a few and simple steps Oni background images (TXMB) "
+            "that can be used in the menus or as backgrounds screens for the levels."
+        )
+    );
+
     this->myWizard.addPage(page2);
     this->myWizard.addPage(page3);
     this->myWizard.addPage(pageFinal);
 
-    this->myWizard.setWindowTitle("Background Image Wizard");
-
-    if(this->myWizard.exec()){ //modal and wait for finalization
-
-    }
-
-    return 0;
+    showWizard("Background Image Wizard", ":/new/icons/background_image.png");
 }
 
-QWizardPage* BGImageWizard::createIntroPage() {
-    QWizardPage *page = new QWizardPage;
-    page->setTitle("Introduction");
+void BGImageWizard::beforeClose(QDialog::DialogCode){
 
-    QLabel *label = new QLabel("Welcome to the Oni Background Image Wizard.\n"
-                               "This wizard will allow you to create in a few and simple steps Oni background images (TXMB) "
-                               "that can be used in the menus or as backgrounds screens for the levels.");
-    label->setWordWrap(true);
-
-    QVBoxLayout *layout = new QVBoxLayout;
-    layout->addWidget(label);
-    page->setLayout(layout);
-
-    return page;
 }
-
-void BGImageWizard::restartWizard(){
-    this->myWizard.restart();
-}
-
-void BGImageWizard::pageChanged(int pageId){
-    // Last page?
-    if(pageId==3){
-       this->myWizard.setOption(QWizard::HaveCustomButton1, true); // set visible
-       this->myWizard.button(QWizard::BackButton)->setEnabled(false); // disable back button, use restart if needed
-        return;
-    }
-   this->myWizard.setOption(QWizard::HaveCustomButton1, false); // set invisible
-   this->myWizard.button(QWizard::BackButton)->setEnabled(true); // set enable back button
-}
Index: /Vago/trunk/Vago/bgImageWizard/bgimagewizard.h
===================================================================
--- /Vago/trunk/Vago/bgImageWizard/bgimagewizard.h	(revision 1060)
+++ /Vago/trunk/Vago/bgImageWizard/bgimagewizard.h	(revision 1061)
@@ -2,36 +2,19 @@
 #define BGIMAGEWIZARD_H
 
-// System includes
-#include <QString>
-#include <QWizard>
-#include <QWizardPage>
-#include <QLabel>
-#include <QDesktopWidget>
-#include <QVBoxLayout>
-#include <QPushButton>
-
 // Local includes
+#include "abstractwizard.h"
 #include "bgimagepage2.h"
 #include "bgimagepage3.h"
 #include "bgimagepagefinal.h"
 
-class BGImageWizard: public QObject // for signals and slots
+class BGImageWizard: public AbstractWizard // for signals and slots
 {
-    Q_OBJECT // for signals and slots
-public:
+protected:
     BGImageWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger);
-    int exec();
+    void exec();
 private:
-    QWizard myWizard;
-    QWizardPage *createIntroPage();
-
-    Logger *myLogger;
-    QString workspaceWizardLocation;
     QString bgImagesLocation;
-    QString appDir;
-    QSettings *vagoSettings;
-private slots:
-    void restartWizard();
-    void pageChanged(int pageId);
+private:
+    void beforeClose(QDialog::DialogCode resultStatus);
 };
 
Index: go/trunk/Vago/droptablewidget.cpp
===================================================================
--- /Vago/trunk/Vago/droptablewidget.cpp	(revision 1060)
+++ 	(revision )
@@ -1,174 +1,0 @@
-#include "droptablewidget.h"
-
-//Original dn'd from here: http://www.qtcentre.org/threads/17536-Drag-and-Drop-QTableWidget-in-UI-file
-//This constructor also initialize c++ constants (http://stackoverflow.com/questions/1423696/how-to-initialize-a-const-field-in-constructor)
-
-DropTableWidget::DropTableWidget(QWidget *parent, QBrush _disabledBackStyle,
-                                 QBrush _disabledTextStyle) : QTableWidget(parent),
-    disabledBackStyle(_disabledBackStyle),
-    disabledTextStyle(_disabledTextStyle){
-
-    //set widget default properties:
-    //    setFrameStyle(QFrame::Sunken | QFrame::StyledPanel);
-    //    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
-    setEditTriggers(QAbstractItemView::NoEditTriggers);
-    setDragDropMode(QAbstractItemView::DropOnly);
-    setAlternatingRowColors(true);
-    //    setSelectionMode(QAbstractItemView::NoSelection);
-    //    setShowGrid(false);
-    //    setWordWrap(false);
-    setAcceptDrops(true);
-
-    //Custom added for Vago
-    setColumnCount(3);
-
-    //set Header of tables
-    setHorizontalHeaderLabels(QStringList()<<"File/Folder"<<"From/To"<<"Command");
-    horizontalHeader()->setStretchLastSection(true);
-}
-
-void DropTableWidget::dragEnterEvent(QDragEnterEvent *event) {
-    event->acceptProposedAction();
-    emit changed(event->mimeData());
-}
-
-void DropTableWidget::dragMoveEvent(QDragMoveEvent *event) {
-    event->acceptProposedAction();
-}
-
-void DropTableWidget::dropEvent(QDropEvent *event) {
-
-    const QMimeData* mimeData = event->mimeData();
-
-    event->acceptProposedAction();
-
-    QStringList pathList = QStringList();
-
-    // check for our needed mime type, here a file or a list of files
-    if (mimeData->hasUrls())
-    {
-        QList<QUrl> urlList = mimeData->urls();
-
-        // extract the local paths of the files
-        for (int i = 0; i < urlList.size() && i < 2048; ++i)
-        {
-            pathList.append(urlList.at(i).toLocalFile());
-        }
-    }
-
-    emit dropped(this, pathList);
-}
-
-void DropTableWidget::dragLeaveEvent(QDragLeaveEvent *event) {
-    event->accept();
-}
-
-void DropTableWidget::clear() {
-    emit changed();
-}
-
-//Context menu actions
-void DropTableWidget::contextMenuEvent(QContextMenuEvent *event){
-    //All the context menu is processed at the mainwindow class
-    emit dtContextMenu(this,event);
-}
-
-//Custom function to swap items positions in the table
-void DropTableWidget::swapPositions(QList<int> rowsSelected, int numUnitsToMove){
-    QList<tableRowProperties> orderedList = QList<tableRowProperties>();
-
-    //Make a copy of the actual list to swap
-    for(int i=0; i<this->rowCount(); i++){
-        orderedList.append(tableRowProperties()); //Add each row property (initialize)
-        for(int j=0; j<this->columnCount(); j++){
-            orderedList[i].cells.append(this->item(i,j)->text());
-
-            if(this->item(i,j)->background()==this->disabledBackStyle){ //Is it disabled?
-                orderedList[i].isDisabled=true;
-            }
-
-        }
-    }
-
-    //Swap the copied list for each item
-    if(numUnitsToMove<0){ //if going up we need to start from the first item
-        for(int i=0; i<rowsSelected.size(); i++){
-            orderedList.swap(rowsSelected.at(i),rowsSelected.at(i)+numUnitsToMove);
-        }
-    }
-    else{ //if going down we need to start from the last item
-        for(int i=rowsSelected.size()-1; i>=0; i--){
-            orderedList.swap(rowsSelected.at(i),rowsSelected.at(i)+numUnitsToMove);
-        }
-    }
-
-    this->clear(); //clear previous selections
-
-    //Switch with the ordered one
-    for(int i=0; i<this->rowCount(); i++){
-        for(int j=0; j<this->columnCount(); j++){
-            QTableWidgetItem *orderedItem = new QTableWidgetItem(orderedList[i].cells.at(j));
-            this->setItem(i,j,orderedItem);
-
-            if(orderedList[i].isDisabled){ //Restored disabled style
-                setDisableStyleWidgetItem(orderedItem);
-            }
-        }
-        this->updateTableToolTips(i);
-    }
-
-    this->clearSelection(); //clear previous selections
-
-    //Select the moved rows
-    this->setRangeSelected(QTableWidgetSelectionRange(rowsSelected.at(0)+numUnitsToMove,this->columnCount()-1,rowsSelected.at(rowsSelected.size()-1)+numUnitsToMove,0),true);
-    //Top > top row number, Left > num colums to select to left, Bottom > bottom row number, Right > start at each column (from right)
-}
-
-//Reset a item to its initial style
-void DropTableWidget::resetStyleWidgetItem(QTableWidgetItem *currentItem){
-    if((currentItem->row()+1)%2==0){ //if the row number is par it use the alternate color scheme
-        currentItem->setBackground(QPalette().brush(QPalette::Normal,QPalette::AlternateBase));
-    }
-    else{
-        currentItem->setBackground(QPalette().brush(QPalette::Normal,QPalette::Base));
-    }
-    currentItem->setForeground(QPalette().brush(QPalette::Normal,QPalette::WindowText));
-}
-
-//Disable a table widget item
-void DropTableWidget::setDisableStyleWidgetItem(QTableWidgetItem *currentItem){
-    currentItem->setBackground(this->disabledBackStyle);
-    currentItem->setForeground(this->disabledTextStyle);
-}
-
-QString DropTableWidget::getFileAbsolute(int row){
-    QString fileCommand=this->item(row,2)->text();
-
-    int idxFileName=fileCommand.indexOf(this->item(row,0)->text()); //Search first for the file name
-    int fileAbsoluteStartIdx=Util::indexOfBackward(fileCommand,"\"",idxFileName);
-
-    fileCommand.remove(0,fileAbsoluteStartIdx);
-    int fileAbsoluteEndIdx=fileCommand.indexOf('"',1); //1 to find the end quoate and not the start
-
-    return fileCommand.remove(fileAbsoluteEndIdx,(fileCommand.size()-1)-fileAbsoluteEndIdx);
-}
-
-QString DropTableWidget::getOutputAbsolute(int row){
-    QString command=this->item(row,2)->text();
-
-    int fileAbsoluteEndIdx=command.indexOf("/\"",0); //let's find the /" (end of path)
-
-    command.remove(fileAbsoluteEndIdx,command.size()-1);
-
-    int fileAbsoluteStartIdx=Util::indexOfBackward(command,"\"",command.size()-1)+1;
-
-    return command.remove(0,fileAbsoluteStartIdx);
-}
-
-
-void DropTableWidget::updateTableToolTips(int row){
-    for(int i=0; i<this->columnCount(); i++){
-        this->item(row,i)->setToolTip(this->item(row,i)->text());
-    }
-}
-
Index: go/trunk/Vago/droptablewidget.h
===================================================================
--- /Vago/trunk/Vago/droptablewidget.h	(revision 1060)
+++ 	(revision )
@@ -1,63 +1,0 @@
-#ifndef DROPTABLEWIDGET_H
-#define DROPTABLEWIDGET_H
-
-#include <QTableWidget>
-#include <QtWidgets>
-
-#include "utilvago.h"
-
-
-//Used in swapPositions function, for switching orders and maintain the disabled style
-struct tableRowProperties{ //No need for typedef in c++ :)
-    QStringList cells;
-    bool isDisabled;
-
-    tableRowProperties(){
-        cells = QStringList(); //initialize the list on the constructor
-        isDisabled=false; //if you don't initialize a variable at c++ it is random assigned!
-    }
-};
-
-class QMimeData;
-
-class DropTableWidget : public QTableWidget {
-
-    Q_OBJECT
-
-public:
-    DropTableWidget(QWidget *parent = 0,
-                    QBrush _disabledBackStyle = QPalette().brush(QPalette::Disabled,QPalette::Base),
-                    QBrush _disabledTextStyle = QPalette().brush(QPalette::Disabled,QPalette::WindowText));
-
-    const QBrush disabledBackStyle;
-    const QBrush disabledTextStyle;
-
-    void swapPositions(QList<int> rowsSelected, int numUnitsToMove);
-    void resetStyleWidgetItem(QTableWidgetItem *currentItem);
-    void setDisableStyleWidgetItem(QTableWidgetItem *currentItem);
-    void updateTableToolTips(int row);
-    QString getFileAbsolute(int row);
-    QString getOutputAbsolute(int row);
-
-public slots:
-    void clear();
-
-signals:
-    void changed(const QMimeData *mimeData = 0);
-    void dropped(DropTableWidget *myTable, QStringList pathList);
-    QString getTypeConversion(DropTableWidget *thisTable);
-    void changeToCurrentSettings(int rows[], DropTableWidget* thisTable);
-    void dtContextMenu(DropTableWidget* thisTable, QContextMenuEvent *event);
-
-protected:
-    void dragEnterEvent(QDragEnterEvent *event);
-    void dragMoveEvent(QDragMoveEvent *event);
-    void dragLeaveEvent(QDragLeaveEvent *event);
-    void dropEvent(QDropEvent *event);
-    void contextMenuEvent(QContextMenuEvent * event);
-
-private:
-    QTableWidget *tablewidget;
-};
-
-#endif // DROPTABLEWIDGET_H
Index: /Vago/trunk/Vago/libs/DropLineEdit/droplineedit.cpp
===================================================================
--- /Vago/trunk/Vago/libs/DropLineEdit/droplineedit.cpp	(revision 1061)
+++ /Vago/trunk/Vago/libs/DropLineEdit/droplineedit.cpp	(revision 1061)
@@ -0,0 +1,49 @@
+#include "DropLineEdit.h"
+
+DropLineEdit::DropLineEdit(QWidget *parent) : QLineEdit(parent)
+{
+    //setDragDropMode(QAbstractItemView::DropOnly);
+    setAcceptDrops(true);
+}
+
+void DropLineEdit::dragEnterEvent(QDragEnterEvent *event) {
+
+    const QMimeData* mimeData = event->mimeData();
+
+    // We only accept if our widget is enabled and it is only one file
+    if(
+            !this->isEnabled() ||
+            mimeData->urls().size() != 1 ||
+            // checks if it is a file (folders are ignored)
+            QDir(mimeData->urls().at(0).toLocalFile()).exists()
+    )
+    {
+        event->ignore();
+    }
+    else{
+        event->acceptProposedAction();
+    }
+}
+
+void DropLineEdit::dragMoveEvent(QDragMoveEvent *event) {
+    event->acceptProposedAction();
+}
+
+void DropLineEdit::dropEvent(QDropEvent *event) {
+
+    const QMimeData* mimeData = event->mimeData();
+
+    event->acceptProposedAction();
+
+    QStringList pathList = QStringList();
+
+    if (mimeData->hasUrls())
+    {
+        this->setText(mimeData->urls().at(0).toLocalFile());
+    }
+
+}
+
+void DropLineEdit::dragLeaveEvent(QDragLeaveEvent *event) {
+    event->accept();
+}
Index: /Vago/trunk/Vago/libs/DropLineEdit/droplineedit.h
===================================================================
--- /Vago/trunk/Vago/libs/DropLineEdit/droplineedit.h	(revision 1061)
+++ /Vago/trunk/Vago/libs/DropLineEdit/droplineedit.h	(revision 1061)
@@ -0,0 +1,21 @@
+#ifndef DROPLINEEDIT_H
+#define DROPLINEEDIT_H
+
+#include <QLineEdit>
+#include <QtWidgets>
+
+class DropLineEdit : public QLineEdit {
+
+    Q_OBJECT
+
+public:
+    DropLineEdit(QWidget *parent = 0);
+
+protected:
+    void dragEnterEvent(QDragEnterEvent *event);
+    void dragMoveEvent(QDragMoveEvent *event);
+    void dragLeaveEvent(QDragLeaveEvent *event);
+    void dropEvent(QDropEvent *event);
+};
+
+#endif // DROPLINEEDIT_H
Index: /Vago/trunk/Vago/libs/DropTableWidget/droptablewidget.cpp
===================================================================
--- /Vago/trunk/Vago/libs/DropTableWidget/droptablewidget.cpp	(revision 1061)
+++ /Vago/trunk/Vago/libs/DropTableWidget/droptablewidget.cpp	(revision 1061)
@@ -0,0 +1,174 @@
+#include "droptablewidget.h"
+
+//Original dn'd from here: http://www.qtcentre.org/threads/17536-Drag-and-Drop-QTableWidget-in-UI-file
+//This constructor also initialize c++ constants (http://stackoverflow.com/questions/1423696/how-to-initialize-a-const-field-in-constructor)
+
+DropTableWidget::DropTableWidget(QWidget *parent, QBrush _disabledBackStyle,
+                                 QBrush _disabledTextStyle) : QTableWidget(parent),
+    disabledBackStyle(_disabledBackStyle),
+    disabledTextStyle(_disabledTextStyle){
+
+    //set widget default properties:
+    //    setFrameStyle(QFrame::Sunken | QFrame::StyledPanel);
+    //    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    setEditTriggers(QAbstractItemView::NoEditTriggers);
+    setDragDropMode(QAbstractItemView::DropOnly);
+    setAlternatingRowColors(true);
+    //    setSelectionMode(QAbstractItemView::NoSelection);
+    //    setShowGrid(false);
+    //    setWordWrap(false);
+    setAcceptDrops(true);
+
+    //Custom added for Vago
+    setColumnCount(3);
+
+    //set Header of tables
+    setHorizontalHeaderLabels(QStringList()<<"File/Folder"<<"From/To"<<"Command");
+    horizontalHeader()->setStretchLastSection(true);
+}
+
+void DropTableWidget::dragEnterEvent(QDragEnterEvent *event) {
+    event->acceptProposedAction();
+    emit changed(event->mimeData());
+}
+
+void DropTableWidget::dragMoveEvent(QDragMoveEvent *event) {
+    event->acceptProposedAction();
+}
+
+void DropTableWidget::dropEvent(QDropEvent *event) {
+
+    const QMimeData* mimeData = event->mimeData();
+
+    event->acceptProposedAction();
+
+    QStringList pathList = QStringList();
+
+    // check for our needed mime type, here a file or a list of files
+    if (mimeData->hasUrls())
+    {
+        QList<QUrl> urlList = mimeData->urls();
+
+        // extract the local paths of the files
+        for (int i = 0; i < urlList.size() && i < 2048; ++i)
+        {
+            pathList.append(urlList.at(i).toLocalFile());
+        }
+    }
+
+    emit dropped(this, pathList);
+}
+
+void DropTableWidget::dragLeaveEvent(QDragLeaveEvent *event) {
+    event->accept();
+}
+
+void DropTableWidget::clear() {
+    emit changed();
+}
+
+//Context menu actions
+void DropTableWidget::contextMenuEvent(QContextMenuEvent *event){
+    //All the context menu is processed at the mainwindow class
+    emit dtContextMenu(this,event);
+}
+
+//Custom function to swap items positions in the table
+void DropTableWidget::swapPositions(QList<int> rowsSelected, int numUnitsToMove){
+    QList<tableRowProperties> orderedList = QList<tableRowProperties>();
+
+    //Make a copy of the actual list to swap
+    for(int i=0; i<this->rowCount(); i++){
+        orderedList.append(tableRowProperties()); //Add each row property (initialize)
+        for(int j=0; j<this->columnCount(); j++){
+            orderedList[i].cells.append(this->item(i,j)->text());
+
+            if(this->item(i,j)->background()==this->disabledBackStyle){ //Is it disabled?
+                orderedList[i].isDisabled=true;
+            }
+
+        }
+    }
+
+    //Swap the copied list for each item
+    if(numUnitsToMove<0){ //if going up we need to start from the first item
+        for(int i=0; i<rowsSelected.size(); i++){
+            orderedList.swap(rowsSelected.at(i),rowsSelected.at(i)+numUnitsToMove);
+        }
+    }
+    else{ //if going down we need to start from the last item
+        for(int i=rowsSelected.size()-1; i>=0; i--){
+            orderedList.swap(rowsSelected.at(i),rowsSelected.at(i)+numUnitsToMove);
+        }
+    }
+
+    this->clear(); //clear previous selections
+
+    //Switch with the ordered one
+    for(int i=0; i<this->rowCount(); i++){
+        for(int j=0; j<this->columnCount(); j++){
+            QTableWidgetItem *orderedItem = new QTableWidgetItem(orderedList[i].cells.at(j));
+            this->setItem(i,j,orderedItem);
+
+            if(orderedList[i].isDisabled){ //Restored disabled style
+                setDisableStyleWidgetItem(orderedItem);
+            }
+        }
+        this->updateTableToolTips(i);
+    }
+
+    this->clearSelection(); //clear previous selections
+
+    //Select the moved rows
+    this->setRangeSelected(QTableWidgetSelectionRange(rowsSelected.at(0)+numUnitsToMove,this->columnCount()-1,rowsSelected.at(rowsSelected.size()-1)+numUnitsToMove,0),true);
+    //Top > top row number, Left > num colums to select to left, Bottom > bottom row number, Right > start at each column (from right)
+}
+
+//Reset a item to its initial style
+void DropTableWidget::resetStyleWidgetItem(QTableWidgetItem *currentItem){
+    if((currentItem->row()+1)%2==0){ //if the row number is par it use the alternate color scheme
+        currentItem->setBackground(QPalette().brush(QPalette::Normal,QPalette::AlternateBase));
+    }
+    else{
+        currentItem->setBackground(QPalette().brush(QPalette::Normal,QPalette::Base));
+    }
+    currentItem->setForeground(QPalette().brush(QPalette::Normal,QPalette::WindowText));
+}
+
+//Disable a table widget item
+void DropTableWidget::setDisableStyleWidgetItem(QTableWidgetItem *currentItem){
+    currentItem->setBackground(this->disabledBackStyle);
+    currentItem->setForeground(this->disabledTextStyle);
+}
+
+QString DropTableWidget::getFileAbsolute(int row){
+    QString fileCommand=this->item(row,2)->text();
+
+    int idxFileName=fileCommand.indexOf(this->item(row,0)->text()); //Search first for the file name
+    int fileAbsoluteStartIdx=Util::indexOfBackward(fileCommand,"\"",idxFileName);
+
+    fileCommand.remove(0,fileAbsoluteStartIdx);
+    int fileAbsoluteEndIdx=fileCommand.indexOf('"',1); //1 to find the end quoate and not the start
+
+    return fileCommand.remove(fileAbsoluteEndIdx,(fileCommand.size()-1)-fileAbsoluteEndIdx);
+}
+
+QString DropTableWidget::getOutputAbsolute(int row){
+    QString command=this->item(row,2)->text();
+
+    int fileAbsoluteEndIdx=command.indexOf("/\"",0); //let's find the /" (end of path)
+
+    command.remove(fileAbsoluteEndIdx,command.size()-1);
+
+    int fileAbsoluteStartIdx=Util::indexOfBackward(command,"\"",command.size()-1)+1;
+
+    return command.remove(0,fileAbsoluteStartIdx);
+}
+
+
+void DropTableWidget::updateTableToolTips(int row){
+    for(int i=0; i<this->columnCount(); i++){
+        this->item(row,i)->setToolTip(this->item(row,i)->text());
+    }
+}
+
Index: /Vago/trunk/Vago/libs/DropTableWidget/droptablewidget.h
===================================================================
--- /Vago/trunk/Vago/libs/DropTableWidget/droptablewidget.h	(revision 1061)
+++ /Vago/trunk/Vago/libs/DropTableWidget/droptablewidget.h	(revision 1061)
@@ -0,0 +1,63 @@
+#ifndef DROPTABLEWIDGET_H
+#define DROPTABLEWIDGET_H
+
+#include <QTableWidget>
+#include <QtWidgets>
+
+#include "utilvago.h"
+
+
+//Used in swapPositions function, for switching orders and maintain the disabled style
+struct tableRowProperties{ //No need for typedef in c++ :)
+    QStringList cells;
+    bool isDisabled;
+
+    tableRowProperties(){
+        cells = QStringList(); //initialize the list on the constructor
+        isDisabled=false; //if you don't initialize a variable at c++ it is random assigned!
+    }
+};
+
+class QMimeData;
+
+class DropTableWidget : public QTableWidget {
+
+    Q_OBJECT
+
+public:
+    DropTableWidget(QWidget *parent = 0,
+                    QBrush _disabledBackStyle = QPalette().brush(QPalette::Disabled,QPalette::Base),
+                    QBrush _disabledTextStyle = QPalette().brush(QPalette::Disabled,QPalette::WindowText));
+
+    const QBrush disabledBackStyle;
+    const QBrush disabledTextStyle;
+
+    void swapPositions(QList<int> rowsSelected, int numUnitsToMove);
+    void resetStyleWidgetItem(QTableWidgetItem *currentItem);
+    void setDisableStyleWidgetItem(QTableWidgetItem *currentItem);
+    void updateTableToolTips(int row);
+    QString getFileAbsolute(int row);
+    QString getOutputAbsolute(int row);
+
+public slots:
+    void clear();
+
+signals:
+    void changed(const QMimeData *mimeData = 0);
+    void dropped(DropTableWidget *myTable, QStringList pathList);
+    QString getTypeConversion(DropTableWidget *thisTable);
+    void changeToCurrentSettings(int rows[], DropTableWidget* thisTable);
+    void dtContextMenu(DropTableWidget* thisTable, QContextMenuEvent *event);
+
+protected:
+    void dragEnterEvent(QDragEnterEvent *event);
+    void dragMoveEvent(QDragMoveEvent *event);
+    void dragLeaveEvent(QDragLeaveEvent *event);
+    void dropEvent(QDropEvent *event);
+    void contextMenuEvent(QContextMenuEvent * event);
+
+private:
+    QTableWidget *tablewidget;
+};
+
+#endif // DROPTABLEWIDGET_H
Index: /Vago/trunk/Vago/main.cpp
===================================================================
--- /Vago/trunk/Vago/main.cpp	(revision 1060)
+++ /Vago/trunk/Vago/main.cpp	(revision 1061)
@@ -2,5 +2,6 @@
 #include "mainwindow.h"
 
-
+// TODO add lineedit to other lineedits that can receive files or folders, create additional funtions in lineedit where we can specify what kind of argument it accepts
+// Example: setAllowFolders(), setAllowFiles() or setAcceptedTypes(Enum from QtFiles)
 int main(int argc, char *argv[])
 {
@@ -11,7 +12,4 @@
     a.setStyleSheet("QStatusBar::item { border: 0px; }"); //hide QLabels border in status bar //http://qt-project.org/forums/viewthread/18743
 
-//    XmlToolsInterface *xmlToolsWindow = new XmlToolsInterface(new Logger(UtilVago::getAppPath(), GlobalVars::AppLogName));
-//    xmlToolsWindow->show(); //it destroys itself when finished.
-
     return a.exec();
 }
Index: /Vago/trunk/Vago/mainwindow.cpp
===================================================================
--- /Vago/trunk/Vago/mainwindow.cpp	(revision 1060)
+++ /Vago/trunk/Vago/mainwindow.cpp	(revision 1061)
@@ -242,18 +242,24 @@
 void MainWindow::on_actionAE_Package_Creator_triggered()
 {
-    PackageWizard myWizard = PackageWizard(this->workspaceWizardsLocation, this->vagoSettings, this->myLogger);
-    myWizard.exec();
+    // it deletes itself once closed
+    WizardFactory<PackageWizard>::startInstance(UtilVago::getAppPath(), this->workspaceWizardsLocation, this->vagoSettings, this->myLogger);
 }
 
 void MainWindow::on_actionSound_Wizard_triggered()
 {
-    SoundWizard myWizard (UtilVago::getAppPath(), this->workspaceWizardsLocation, this->myLogger, &this->commandMap);
-    myWizard.exec();
+    // it deletes itself once closed
+    WizardFactory<SoundWizard>::startInstance(UtilVago::getAppPath(), this->workspaceWizardsLocation, this->vagoSettings, this->myLogger, &this->commandMap);
 }
 
 void MainWindow::on_actionBackground_Image_Wizard_triggered()
 {
-    BGImageWizard myWizard (UtilVago::getAppPath(), this->workspaceWizardsLocation, this->vagoSettings, this->myLogger);
-    myWizard.exec();
+    // it deletes itself once closed
+    WizardFactory<BGImageWizard>::startInstance(UtilVago::getAppPath(), this->workspaceWizardsLocation, this->vagoSettings, this->myLogger);
+}
+
+void MainWindow::on_actionWindow_Messages_Wizard_triggered()
+{
+    // it deletes itself once closed
+    WizardFactory<WmWizard>::startInstance(UtilVago::getAppPath(), this->workspaceWizardsLocation, this->vagoSettings, this->myLogger);
 }
 
@@ -557,5 +563,4 @@
     QString command=this->commandMap.value(tabTitle+"->"+from+"->"+to)+" "+myOutputFolder;
 
-    //TODO: This can be optimized. When some are not enable others are.
     if(ui->cbTexture->isChecked()){
         if(ui->leTextureName->text().isEmpty()){
@@ -979,5 +984,5 @@
         ui->cbNormals->setEnabled(false);
         ui->cbNormals->setChecked(false);
-
+//#error add drag and drop to Extract TRAM with TRBS/ONCC
         if(QString::compare(arg1,"TRAM ONI",Qt::CaseSensitive)==0){ //case sensitive is faster
             ui->cbWithTRBS_ONCC->setEnabled(true);
Index: /Vago/trunk/Vago/mainwindow.h
===================================================================
--- /Vago/trunk/Vago/mainwindow.h	(revision 1060)
+++ /Vago/trunk/Vago/mainwindow.h	(revision 1061)
@@ -9,7 +9,8 @@
 #include "soundwizard.h"
 #include "bgimagewizard.h"
+#include "wmwizard.h"
 #include "converter.h"
-#include "droptablewidget.h"
 #include "xmltoolsinterface.h"
+#include "wizardfactory.h"
 
 #include <QMainWindow>
@@ -31,4 +32,6 @@
 #include <QScriptEngine>
 #include <QScriptValueIterator>
+#include <droptablewidget.h>
+#include <pugixml.hpp>
 #ifdef Q_OS_WIN
 #include <QWinTaskbarProgress>
@@ -36,6 +39,4 @@
 #endif
 
-#include "libs/pugixml/pugixml.hpp"
-
 namespace Ui {
 class MainWindow;
@@ -200,4 +201,6 @@
 
     void on_tbXmlToolsInterface_clicked();
+
+    void on_actionWindow_Messages_Wizard_triggered();
 
 private:
Index: /Vago/trunk/Vago/mainwindow.ui
===================================================================
--- /Vago/trunk/Vago/mainwindow.ui	(revision 1060)
+++ /Vago/trunk/Vago/mainwindow.ui	(revision 1061)
@@ -727,5 +727,6 @@
              <property name="toolTip">
               <string>Extract a TRAM (animation) with character's TRBS / ONCC
-For example extract a Muro's TRAM  with Konoko's ONCC</string>
+For example extract a Muro's TRAM  with Konoko's ONCC
+(input the full path for the TRBS / ONCC.oni file)</string>
              </property>
              <property name="text">
@@ -735,5 +736,5 @@
            </item>
            <item>
-            <widget class="QLineEdit" name="leTRBS_ONCC">
+            <widget class="DropLineEdit" name="leTRBS_ONCC">
              <property name="enabled">
               <bool>false</bool>
@@ -741,8 +742,9 @@
              <property name="toolTip">
               <string>Extract a TRAM (animation) with character's TRBS / ONCC
-For example extract a Muro's TRAM  with Konoko's ONCC</string>
+For example extract a Muro's TRAM  with Konoko's ONCC
+(input the full path for the TRBS / ONCC.oni file)</string>
              </property>
              <property name="placeholderText">
-              <string>TRBS / ONCC.oni source file</string>
+              <string>Full path to TRBS / ONCC.oni source file</string>
              </property>
             </widget>
@@ -1464,5 +1466,5 @@
     <addaction name="actionSound_Wizard"/>
     <addaction name="actionBackground_Image_Wizard"/>
-    <addaction name="separator"/>
+    <addaction name="actionWindow_Messages_Wizard"/>
    </widget>
    <addaction name="menuFile"/>
@@ -1679,4 +1681,13 @@
    </property>
   </action>
+  <action name="actionWindow_Messages_Wizard">
+   <property name="icon">
+    <iconset resource="resources.qrc">
+     <normaloff>:/new/icons/windowmessages.png</normaloff>:/new/icons/windowmessages.png</iconset>
+   </property>
+   <property name="text">
+    <string>Window Messages Wizard</string>
+   </property>
+  </action>
  </widget>
  <layoutdefault spacing="6" margin="11"/>
@@ -1685,5 +1696,10 @@
    <class>DropTableWidget</class>
    <extends>QTableWidget</extends>
-   <header>droptablewidget.h</header>
+   <header location="global">droptablewidget.h</header>
+  </customwidget>
+  <customwidget>
+   <class>DropLineEdit</class>
+   <extends>QLineEdit</extends>
+   <header location="global">droplineedit.h</header>
   </customwidget>
  </customwidgets>
Index: /Vago/trunk/Vago/packageWizard/packagepage4.h
===================================================================
--- /Vago/trunk/Vago/packageWizard/packagepage4.h	(revision 1060)
+++ /Vago/trunk/Vago/packageWizard/packagepage4.h	(revision 1061)
@@ -3,6 +3,5 @@
 
 #include <QWizardPage>
-
-#include "droptablewidget.h"
+#include <droptablewidget.h>
 
 namespace Ui {
Index: /Vago/trunk/Vago/packageWizard/packagewizard.cpp
===================================================================
--- /Vago/trunk/Vago/packageWizard/packagewizard.cpp	(revision 1060)
+++ /Vago/trunk/Vago/packageWizard/packagewizard.cpp	(revision 1061)
@@ -1,35 +1,24 @@
 #include "packagewizard.h"
 
-PackageWizard::PackageWizard(QString workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger)
+PackageWizard::PackageWizard(const QString &appDir, QString workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger)
+    :AbstractWizard(appDir, workspaceWizardLocation, vagoSettings, myLogger, false)
 {
-    this->workspaceWizardLocation=workspaceWizardLocation;
-    this->vagoSettings=vagoSettings;
-    this->myLogger=myLogger;
     this->packagesLocation=this->workspaceWizardLocation+"/Packages";
 }
 
-int PackageWizard::exec(){
-    QWizard myWizard;
-
-    myWizard.setWindowIcon(QIcon(":/new/icons/package.png"));
-
-    //Center and resize QWizard (http://www.thedazzlersinc.com/source/2012/06/04/qt-center-window-in-screen/)
-#ifdef Q_OS_WIN
-    myWizard.resize(640,480);
-#else
-    myWizard.resize(800,600); // Mac OS pcs should be able to render this resolution without any problem. It's also better
-    // because the components on mac use more space
-#endif
-    QRect position = myWizard.frameGeometry();
-    position.moveCenter(QDesktopWidget().availableGeometry().center());
-    myWizard.move(position.topLeft());
-    //
-
+void PackageWizard::exec(){
     PackagePage2 *page2 = new PackagePage2(this->myLogger);
     PackagePage3 *page3 = new PackagePage3();
     PackagePage4 *page4 = new PackagePage4();
+    this->page4Pointer = page4; // save the pointer in class variable
     PackagePageFinal *pageFinal = new PackagePageFinal(this->vagoSettings);
 
-    myWizard.addPage(createIntroPage());
+    myWizard.addPage(
+        createIntroPage(
+                        "Welcome to the Anniversary Edition Installer 2 (AIE2) package"
+                         " creator wizard.\n"
+                         "This wizard will allow you to create in a few and simple steps a package for AIE2."
+                        )
+   );
     myWizard.addPage(page2);
     myWizard.addPage(page3);
@@ -37,54 +26,32 @@
     myWizard.addPage(pageFinal);
 
-    myWizard.setWindowTitle("AIE2 Package Creator");
-
-    //If wizard finished with sucess
-    if(myWizard.exec()){ //modal and wait for finalization
-        createPackage(myWizard, page4);
-    }
-
-    return 0;
+    showWizard("AIE2 Package Creator", ":/new/icons/package.png");
 }
 
-QWizardPage* PackageWizard::createIntroPage() {
-    QWizardPage *page = new QWizardPage;
-    page->setTitle("Introduction");
 
-    QLabel *label = new QLabel("Welcome to the Anniversary Edition Installer 2 (AIE2) package"
-                               " creator wizard.\n"
-                               "This wizard will allow you to create in a few and simple steps a package for AIE2.");
-    label->setWordWrap(true);
-
-    QVBoxLayout *layout = new QVBoxLayout;
-    layout->addWidget(label);
-    page->setLayout(layout);
-
-    return page;
-}
-
-void PackageWizard::createPackage(const QWizard &myWizard, PackagePage4 *page4){
+void PackageWizard::createPackage(){
     const QString aeVersion="2.0";
 
     //Get info page 2
-    QString modName=myWizard.field("leModName").toString();
-    QString authors=myWizard.field("leAuthors").toString();
-    QString version=myWizard.field("leVersion").toString();
-    QString description=myWizard.field("ptDescription").toString();
-    QString packageNumber=myWizard.field("lePackageNumber").toString();
-    bool bslReplace=myWizard.field("rbReplace").toBool();
+    QString modName=this->myWizard.field("leModName").toString();
+    QString authors=this->myWizard.field("leAuthors").toString();
+    QString version=this->myWizard.field("leVersion").toString();
+    QString description=this->myWizard.field("ptDescription").toString();
+    QString packageNumber=this->myWizard.field("lePackageNumber").toString();
+    bool bslReplace=this->myWizard.field("rbReplace").toBool();
 
     //Get info page 3
-    QString dependentPackages=myWizard.field("leDependentPackages").toString();
-    QString incompatiblePackages=myWizard.field("leIncompatiblePackages").toString();
-    QString unlockLevels=myWizard.field("leUnlockLevels").toString();
+    QString dependentPackages=this->myWizard.field("leDependentPackages").toString();
+    QString incompatiblePackages=this->myWizard.field("leIncompatiblePackages").toString();
+    QString unlockLevels=this->myWizard.field("leUnlockLevels").toString();
 
     //Get info page 4
-    const DropTableWidget *commonTable=page4->commonTable;
-    const DropTableWidget *windowsTable=page4->windowsTable;
-    const DropTableWidget *macTable=page4->macTable;
+    const DropTableWidget *commonTable=this->page4Pointer->commonTable;
+    const DropTableWidget *windowsTable=this->page4Pointer->windowsTable;
+    const DropTableWidget *macTable=this->page4Pointer->macTable;
 
     //Get info from final page
-    bool openFolder=myWizard.field("cbOpenFolder").toBool();
-    bool createZip=myWizard.field("cbCreateZip").toBool();
+    bool openFolder=this->myWizard.field("cbOpenFolder").toBool();
+    bool createZip=this->myWizard.field("cbCreateZip").toBool();
     //Remember the final page choices to next time
     this->vagoSettings->setValue("PackageCreator/OpenFolder",openFolder);
@@ -202,2 +169,11 @@
     }
 }
+
+void PackageWizard::beforeClose(QDialog::DialogCode resultStatus){
+
+    //If wizard finished with sucess, create the package
+    if(resultStatus == QDialog::Accepted){
+        createPackage();
+    }
+}
+
Index: /Vago/trunk/Vago/packageWizard/packagewizard.h
===================================================================
--- /Vago/trunk/Vago/packageWizard/packagewizard.h	(revision 1060)
+++ /Vago/trunk/Vago/packageWizard/packagewizard.h	(revision 1061)
@@ -2,5 +2,5 @@
 #define PACKAGEWIZARD_H
 
-#include "logger.h"
+#include "abstractwizard.h"
 #include "packagepage2.h"
 #include "packagepage3.h"
@@ -8,27 +8,18 @@
 #include "packagepagefinal.h"
 
-#include <QLabel>
-#include <QVBoxLayout>
-#include <QLineEdit>
-#include <QRect>
-#include <QDesktopWidget>
-#include <QTextStream>
-#include <QSettings>
 #include <JlCompress.h>
 
-class PackageWizard
+class PackageWizard: public AbstractWizard // for signals and slots
 {
-public:
-    PackageWizard(QString workspaceWizardLocation,QSettings *vagoSettings, Logger *myLogger);
-    int exec();
 private:
-    QWizardPage *createIntroPage();
+    QString packagesLocation;
+    PackagePage4 *page4Pointer = nullptr;
+private:
     void copyPackageFolders(const DropTableWidget *myTable, QString tableDir, QString modDir, bool &bslExist);
-    void createPackage(const QWizard &myWizard, PackagePage4 *page4);
-
-    Logger *myLogger;
-    QString workspaceWizardLocation;
-    QString packagesLocation;
-    QSettings *vagoSettings;
+    void createPackage();
+    void beforeClose(QDialog::DialogCode resultStatus);
+protected:
+    PackageWizard(const QString &appDir, QString workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger);
+    void exec();
 };
 
Index: /Vago/trunk/Vago/readme.txt
===================================================================
--- /Vago/trunk/Vago/readme.txt	(revision 1060)
+++ /Vago/trunk/Vago/readme.txt	(revision 1061)
@@ -1,5 +1,5 @@
 Readme.txt
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Vago GUI v1.2
+Vago GUI v1.3
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -37,4 +37,12 @@
 ----------------------------------
 Change Log:
+----------------------------------
+1.3, 08-12-2016
+- Changed Sound Wizard default settings to create files that are playable as music ingame
+- Now wizard have no longer modal windows. You can minimize and open multiple at the same time
+- Added some tooltips to XmlTools interface
+- Added wizard to create ingame pages like weapon / item pages or text for consoles
+- Added drag and drop support to Extract TRAM with TRBS/ONCC
+- Changed how about window displays the information
 ----------------------------------
 1.2, 30-10-2016
Index: /Vago/trunk/Vago/resources.qrc
===================================================================
--- /Vago/trunk/Vago/resources.qrc	(revision 1060)
+++ /Vago/trunk/Vago/resources.qrc	(revision 1061)
@@ -17,4 +17,9 @@
         <file>background_image.png</file>
         <file>xmltoolsinterface.png</file>
+        <file>windowmessages.png</file>
+        <file>formatting_bold.png</file>
+        <file>formatting_color.png</file>
+        <file>formatting_italic.png</file>
+        <file>formatting_underline.png</file>
     </qresource>
     <qresource prefix="/new/about">
Index: /Vago/trunk/Vago/sampleFiles/OSBDsample_file.amb.xml
===================================================================
--- /Vago/trunk/Vago/sampleFiles/OSBDsample_file.amb.xml	(revision 1060)
+++ /Vago/trunk/Vago/sampleFiles/OSBDsample_file.amb.xml	(revision 1061)
@@ -22,5 +22,5 @@
         <InSound></InSound>
         <OutSound></OutSound>
-        <Treshold>3</Treshold>
+        <Treshold>1</Treshold>
         <MinOcclusion>0</MinOcclusion>
     </AmbientSound>
Index: /Vago/trunk/Vago/sampleFiles/OSBDsample_file.grp.xml
===================================================================
--- /Vago/trunk/Vago/sampleFiles/OSBDsample_file.grp.xml	(revision 1060)
+++ /Vago/trunk/Vago/sampleFiles/OSBDsample_file.grp.xml	(revision 1061)
@@ -3,10 +3,10 @@
     <SoundGroup>
         <Volume>1</Volume>
-        <Pitch>1</Pitch>
-        <Flags>PreventRepeat</Flags>
+        <Pitch>0</Pitch>
+        <Flags></Flags>
         <NumberOfChannels>2</NumberOfChannels>
         <Permutations>
             <Permutation>
-                <Weight>10</Weight>
+                <Weight>1</Weight>
                 <Volume>
                     <Min>1</Min>
@@ -14,6 +14,6 @@
                 </Volume>
                 <Pitch>
-                    <Min>1</Min>
-                    <Max>1</Max>
+                    <Min>0</Min>
+                    <Max>0</Max>
                 </Pitch>
                 <Sound>sample_file.wav</Sound>
Index: /Vago/trunk/Vago/soundWizard/soundpage2.h
===================================================================
--- /Vago/trunk/Vago/soundWizard/soundpage2.h	(revision 1060)
+++ /Vago/trunk/Vago/soundWizard/soundpage2.h	(revision 1061)
@@ -3,7 +3,7 @@
 
 #include <QWizardPage>
+#include <droptablewidget.h>
 
 #include "util.h"
-#include "droptablewidget.h"
 
 namespace Ui {
Index: /Vago/trunk/Vago/soundWizard/soundpage3.ui
===================================================================
--- /Vago/trunk/Vago/soundWizard/soundpage3.ui	(revision 1060)
+++ /Vago/trunk/Vago/soundWizard/soundpage3.ui	(revision 1061)
@@ -181,5 +181,5 @@
        <widget class="QLineEdit" name="leMinOcclusion">
         <property name="text">
-         <string>3</string>
+         <string>0</string>
         </property>
        </widget>
@@ -195,5 +195,5 @@
        <widget class="QLineEdit" name="leTreshold">
         <property name="text">
-         <string>0</string>
+         <string>1</string>
         </property>
        </widget>
Index: /Vago/trunk/Vago/soundWizard/soundpage4.ui
===================================================================
--- /Vago/trunk/Vago/soundWizard/soundpage4.ui	(revision 1060)
+++ /Vago/trunk/Vago/soundWizard/soundpage4.ui	(revision 1061)
@@ -76,5 +76,5 @@
        <widget class="QLineEdit" name="lePitch">
         <property name="text">
-         <string>1</string>
+         <string>0</string>
         </property>
        </widget>
@@ -90,5 +90,5 @@
        <widget class="QLineEdit" name="leMinPitch">
         <property name="text">
-         <string>1</string>
+         <string>0</string>
         </property>
        </widget>
@@ -104,5 +104,5 @@
        <widget class="QLineEdit" name="leMaxPitch">
         <property name="text">
-         <string>1</string>
+         <string>0</string>
         </property>
        </widget>
@@ -118,5 +118,5 @@
        <widget class="QLineEdit" name="leWeight">
         <property name="text">
-         <string>10</string>
+         <string>1</string>
         </property>
        </widget>
Index: /Vago/trunk/Vago/soundWizard/soundpagefinal.cpp
===================================================================
--- /Vago/trunk/Vago/soundWizard/soundpagefinal.cpp	(revision 1060)
+++ /Vago/trunk/Vago/soundWizard/soundpagefinal.cpp	(revision 1061)
@@ -97,33 +97,32 @@
     priorityHigh=field("rbPriorityHigh").toBool();
     priorityHighest=field("rbPriorityHighest").toBool();
-
-    if(priorityNormal){
-        priority="Normal";
-    }
-    else if(priorityLow){
-        priority="Low";
-    }
-    else if(priorityHigh){
-        priority="High";
-    }
-    else if(priorityHighest){
-        priority="Highest";
-    }
-
-    if(interruptOnStop){
-        flags << "InterruptTracksOnStop";
-    }
-
-    if(playOnce){
-        flags << "PlayOnce";
-    }
-
-    if(canPan){
-        flags << "CanPan";
-    }
-
     interruptOnStop=field("cbInterruptOnStop").toBool();
     playOnce=field("cbPlayOnce").toBool();
     canPan=field("cbCanPan").toBool();
+
+    if(priorityNormal){
+        priority="Normal";
+    }
+    else if(priorityLow){
+        priority="Low";
+    }
+    else if(priorityHigh){
+        priority="High";
+    }
+    else if(priorityHighest){
+        priority="Highest";
+    }
+
+    if(interruptOnStop){
+        flags << "InterruptTracksOnStop";
+    }
+
+    if(playOnce){
+        flags << "PlayOnce";
+    }
+
+    if(canPan){
+        flags << "CanPan";
+    }
 
     sphereRadious=Util::normalizeDecimalSeparator(field("leSphereRadious").toString());
@@ -207,5 +206,5 @@
     (*this->xmlCommands)
      << "--replace-all-values -e Priority -n "+Util::insertQuotes(priority)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
-     << "--replace-all-values -e Flags -n "+(flags.join(" ").isEmpty() ? "\" \"" : Util::insertQuotes(flags.join(" ")))+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
+     << "--replace-all-values -e Flags -n "+(flags.join(" ").isEmpty() ? Util::insertQuotes("") : Util::insertQuotes(flags.join(" ")))+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
      << "--replace-all-values -e SphereRadius -n "+Util::insertQuotes(sphereRadious)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
      << "--replace-all-values -e Treshold -n "+Util::insertQuotes(treshold)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
Index: /Vago/trunk/Vago/soundWizard/soundpagefinal.h
===================================================================
--- /Vago/trunk/Vago/soundWizard/soundpagefinal.h	(revision 1060)
+++ /Vago/trunk/Vago/soundWizard/soundpagefinal.h	(revision 1061)
@@ -5,6 +5,6 @@
 #include <QDesktopServices>
 #include <QUrl>
+#include <droptablewidget.h>
 
-#include "droptablewidget.h"
 #include "logger.h"
 #include "xmlprocessor.h"
Index: /Vago/trunk/Vago/soundWizard/soundwizard.cpp
===================================================================
--- /Vago/trunk/Vago/soundWizard/soundwizard.cpp	(revision 1060)
+++ /Vago/trunk/Vago/soundWizard/soundwizard.cpp	(revision 1061)
@@ -1,42 +1,28 @@
 #include "soundwizard.h"
 
-SoundWizard::SoundWizard(QString AppDir, QString workspaceWizardLocation, Logger *myLogger, QHash<QString, QString> *commandMap)
+SoundWizard::SoundWizard(QString appDir, QString workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger, QHash<QString, QString> *commandMap)
+    :AbstractWizard(appDir, workspaceWizardLocation, vagoSettings, myLogger, true)
 {
-    this->appLocation=AppDir;
-    this->workspaceWizardLocation=workspaceWizardLocation;
-    this->myLogger=myLogger;
+    this->appDir=appDir;
     this->soundsLocation=this->workspaceWizardLocation+"/Sounds";
     this->commandMap=commandMap;
 }
+void SoundWizard::exec(){
 
-int SoundWizard::exec(){
-    QPushButton *restartButton = new QPushButton("Restart");
-    this->myWizard.setButton(QWizard::CustomButton1,restartButton);
-    this->myWizard.setOption(QWizard::HaveCustomButton1, true);
-
-    connect(&this->myWizard, SIGNAL(currentIdChanged(int)), this, SLOT(pageChanged(int)));
-    connect(restartButton, SIGNAL(clicked(bool)), this, SLOT(restartWizard()));
-
-    this->myWizard.setWindowIcon(QIcon(":/new/icons/sound.png"));
-
-    //Center and resize QWizard (http://www.thedazzlersinc.com/source/2012/06/04/qt-center-window-in-screen/)
-#ifdef Q_OS_WIN
-    this->myWizard.resize(640,480);
-#else
-    this->myWizard.resize(800,600); // Mac OS pcs should be able to render this resolution without any problem. It's also better
-    // because the components on mac use more space
-#endif
-    QRect position =this->myWizard.frameGeometry();
-    position.moveCenter(QDesktopWidget().availableGeometry().center());
-    this->myWizard.move(position.topLeft());
-    //
-
-    SoundPage2 *page2 = new SoundPage2(this->appLocation);
+    SoundPage2 *page2 = new SoundPage2(this->appDir);
     SoundPage3 *page3 = new SoundPage3();
     SoundPage4 *page4 = new SoundPage4();
     SoundPage5 *page5 = new SoundPage5();
-    SoundPageFinal *pageFinal = new SoundPageFinal(this->appLocation, this->soundsLocation,page2->soundTable,this->myLogger, this->commandMap);
+    SoundPageFinal *pageFinal = new SoundPageFinal(this->appDir, this->soundsLocation,page2->soundTable,this->myLogger, this->commandMap);
 
-    this->myWizard.addPage(createIntroPage());
+    this->myWizard.addPage
+    (
+        createIntroPage
+        (
+            "Welcome to the Oni Sound wizard.\n"
+            "This wizard will allow you to convert in a few and simple steps sounds to oni format."
+        )
+    );
+
     this->myWizard.addPage(page2);
     this->myWizard.addPage(page3);
@@ -47,39 +33,8 @@
     this->myWizard.setWindowTitle("Sound wizard");
 
-    //If wizard finished with sucess
-    if(myWizard.exec()){ //modal and wait for finalization
-        //createPackage(this->myWizard, page4);
-    }
-
-    return 0;
+    showWizard("Sound wizard", ":/new/icons/sound.png");
 }
 
-QWizardPage* SoundWizard::createIntroPage() {
-    QWizardPage *page = new QWizardPage;
-    page->setTitle("Introduction");
+void SoundWizard::beforeClose(QDialog::DialogCode){
 
-    QLabel *label = new QLabel("Welcome to the Oni Sound wizard.\n"
-                               "This wizard will allow you to convert in a few and simple steps sounds to oni format.");
-    label->setWordWrap(true);
-
-    QVBoxLayout *layout = new QVBoxLayout;
-    layout->addWidget(label);
-    page->setLayout(layout);
-
-    return page;
 }
-
-void SoundWizard::restartWizard(){
-    this->myWizard.restart();
-}
-
-void SoundWizard::pageChanged(int pageId){
-    // Last page?
-    if(pageId==5){
-        this->myWizard.setOption(QWizard::HaveCustomButton1, true); // set visible
-        this->myWizard.button(QWizard::BackButton)->setEnabled(false); // disable back button, use restart if needed
-        return;
-    }
-    this->myWizard.setOption(QWizard::HaveCustomButton1, false); // set invisible
-    this->myWizard.button(QWizard::BackButton)->setEnabled(true); // set enable back button
-}
Index: /Vago/trunk/Vago/soundWizard/soundwizard.h
===================================================================
--- /Vago/trunk/Vago/soundWizard/soundwizard.h	(revision 1060)
+++ /Vago/trunk/Vago/soundWizard/soundwizard.h	(revision 1061)
@@ -13,4 +13,5 @@
 // Local includes
 #include "util.h"
+#include "abstractwizard.h"
 #include "logger.h"
 #include "soundpage2.h"
@@ -20,22 +21,13 @@
 #include "soundpagefinal.h"
 
-class SoundWizard: public QObject // for signals and slots
+class SoundWizard: public AbstractWizard
 {
-    Q_OBJECT // for signals and slots
-public:
-    SoundWizard(QString appLocation, QString workspaceWizardLocation, Logger *myLogger, QHash<QString, QString> *commandMap);
-    int exec();
+protected:
+    SoundWizard(QString appLocation, QString workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger, QHash<QString, QString> *commandMap);
+    void exec();
+    QHash<QString, QString> *commandMap;
 private:
-    QWizard myWizard;
-    QWizardPage* createIntroPage();
-
-    QString workspaceWizardLocation;
     QString soundsLocation;
-    QString appLocation;
-    Logger *myLogger;
-    QHash<QString, QString> *commandMap;
-private slots:
-    void restartWizard();
-    void pageChanged(int pageId);
+    void beforeClose(QDialog::DialogCode resultStatus);
 };
 
Index: /Vago/trunk/Vago/utilvago.h
===================================================================
--- /Vago/trunk/Vago/utilvago.h	(revision 1060)
+++ /Vago/trunk/Vago/utilvago.h	(revision 1061)
@@ -7,5 +7,5 @@
 namespace GlobalVars{
 
-const QString AppVersion="1.2";
+const QString AppVersion="1.3";
 const QString LastCompatibleVersion = "1.0";
 const QString ToolsFolder = "tools";
Index: /Vago/trunk/Vago/windowMessagesWizard/wmfinalpage.cpp
===================================================================
--- /Vago/trunk/Vago/windowMessagesWizard/wmfinalpage.cpp	(revision 1061)
+++ /Vago/trunk/Vago/windowMessagesWizard/wmfinalpage.cpp	(revision 1061)
@@ -0,0 +1,259 @@
+#include "wmfinalpage.h"
+#include "ui_wmfinalpage.h"
+
+WmFinalPage::WmFinalPage(QString AppDir, QString wmLocation, Logger *myLogger, QList<std::shared_ptr<WmPage> > &pages, QWidget *parent) :
+    QWizardPage(parent), ui(new Ui::wmfinalpage), pages(pages)
+{
+    ui->setupUi(this);
+    this->wmLocation=wmLocation;
+    this->myLogger=myLogger;
+
+    this->oniSplitCommands = new QStringList();
+    this->myConverter = new Converter(AppDir, this->myLogger,this->oniSplitCommands);
+
+    ui->lbComplete->setText("<html>The wizard is now complete. The window messages have been converted. "
+                            "You can view all converted files clicking <a href=' '>here.</a><br />"
+                            "<br />Click restart to create more window messages from the wizard beggining, "
+                            "otherwise click finish.</html>"); // Don't use rich text in qtdesigner because it generates platform dependent code
+
+    connectSlots();
+}
+
+void WmFinalPage::openSoundsFolder(){
+    QDesktopServices::openUrl(QUrl("file:///"+this->wmLocation));
+}
+
+void WmFinalPage::initializePage(){
+    startProcessing();
+}
+
+void WmFinalPage::startProcessing(){
+    // Check if images folder exists and create it if necessary
+    QDir saveDir(this->wmLocation);
+
+    if(!saveDir.exists())
+    {
+        saveDir.mkpath("."); // http://stackoverflow.com/questions/2241808/checking-if-a-folder-exists-and-creating-folders-in-qt-c thanks Petrucio
+    }
+
+    QString filePath = this->wmLocation + "/" + field("leFileName").toString() + ".xml";
+
+    int globalSectionCounter = -1;
+    int currentIGPGId = globalSectionCounter;
+    int currentIGSAId = globalSectionCounter;
+    int currentIGSTId = globalSectionCounter;
+
+    pugi::xml_document doc;
+
+    pugi::xml_node rootNode = doc.append_child("Oni");
+    pugi::xml_node typeNode;
+
+    // Define type node
+    switch(static_cast<WINDOW_TYPE>(field("cbWindowType").toInt())){
+    case WINDOW_TYPE::OBJECTIVE:
+    {
+        typeNode = rootNode.append_child("OPge");
+        typeNode.append_attribute("id").set_value(++globalSectionCounter);
+        typeNode.append_child("LevelNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(field("leLevelId").toString()));
+        typeNode.append_child("Pages").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(QString("#") + QString::number(++globalSectionCounter)));
+        pugi::xml_node igpaNode = rootNode.append_child("IGPA");
+        igpaNode.append_attribute("id").set_value(globalSectionCounter);
+        pugi::xml_node pagesNode = igpaNode.append_child("Pages");
+        currentIGPGId = globalSectionCounter;
+        for(int i=0; i<this->pages.size(); i++){
+            pagesNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+        }
+        break;
+    }
+    case  WINDOW_TYPE::DIARY:
+        typeNode = rootNode.append_child("DPge");
+        typeNode.append_attribute("id").set_value(++globalSectionCounter);
+        typeNode.append_child("LevelNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(field("leLevelId").toString()));
+        typeNode.append_child("PageNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(field("lePageNumber").toString()));
+        typeNode.append_child("IsLearnedMove").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(QString::number(static_cast<int>(field("cbIsLearnedMove").toBool()))));
+        currentIGPGId = globalSectionCounter;
+        typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+        break;
+    case  WINDOW_TYPE::HELP:
+        typeNode = rootNode.append_child("HPge");
+        typeNode.append_attribute("id").set_value(++globalSectionCounter);
+        currentIGPGId = globalSectionCounter;
+        typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+        break;
+    case  WINDOW_TYPE::TEXT_CONSOLE:
+    {
+        typeNode = rootNode.append_child("TxtC");
+        typeNode.append_attribute("id").set_value(++globalSectionCounter);
+        typeNode.append_child("Pages").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(Util::qStrToCstr("#" + QString::number(++globalSectionCounter))));
+        pugi::xml_node igpaNode = rootNode.append_child("IGPA");
+        igpaNode.append_attribute("id").set_value(globalSectionCounter);
+        currentIGPGId = globalSectionCounter;
+        pugi::xml_node pagesNode = igpaNode.append_child("Pages");
+        for(int i=0; i<this->pages.size(); i++){
+            pagesNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+        }
+        break;
+    }
+    case  WINDOW_TYPE::WEAPON:
+        typeNode = rootNode.append_child("WPge");
+        typeNode.append_attribute("id").set_value(++globalSectionCounter);
+        typeNode.append_child("WeaponClass").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(field("leWeaponClassName").toString()));
+        currentIGPGId = globalSectionCounter;
+        typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(Util::qStrToCstr("#" + QString::number(++globalSectionCounter))));
+        break;
+    case  WINDOW_TYPE::ITEM:
+        typeNode = rootNode.append_child("IPge");
+        typeNode.append_attribute("id").set_value(++globalSectionCounter);
+        typeNode.append_child("PageNumber").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(field("lePageNumber").toString()));
+        currentIGPGId = globalSectionCounter;
+        typeNode.append_child("Page").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(Util::qStrToCstr("#" + QString::number(++globalSectionCounter))));
+        break;
+    case WINDOW_TYPE::ENUM_END:
+        UtilVago::showAndLogErrorPopUp(this->myLogger, "An error ocurred: WmFinalPage::startProcessing invalid WINDOW_TYPE");
+        break;
+    }
+
+    // Write pages text
+    for(int i=0; i<this->pages.size(); i++){
+
+        QTextEdit &mainText = this->pages[i]->getMainText();
+        int mainTextNumberOfRows = mainText.toPlainText().split("\n").size();
+
+        QTextEdit &footerText = this->pages[i]->getFooterText();
+        int footerTextNumberOfRows = footerText.toPlainText().split("\n").size();
+
+        // Create TXMP image if exists
+        QString imageLocation = this->pages[i]->getMiddleImage().toolTip();
+        QString imageTXMPName;
+
+        if(!imageLocation.isEmpty()){
+
+            imageTXMPName = "TXMP" + QFileInfo(imageLocation).baseName();
+
+            this->oniSplitCommands->clear();
+            this->oniSplitCommands->append("-create:txmp " + Util::insertQuotes(this->wmLocation) + " -format:bgr32 " + Util::insertQuotes(imageLocation));
+
+            this->myConverter->start(); // finally process the onisplit commands
+            this->myConverter->wait(); // wait for it to complete
+        }
+
+        // IGPG
+        pugi::xml_node igpgNode = rootNode.append_child("IGPG");
+
+        igpgNode.append_attribute("id").set_value(++currentIGPGId);
+
+        pugi::xml_node igpgFontNode = igpgNode.append_child("Font");
+        igpgFontNode.append_child("Family").append_child(pugi::xml_node_type::node_pcdata).set_value("TSFFTahoma");
+        igpgFontNode.append_child("Style").append_child(pugi::xml_node_type::node_pcdata).set_value("Bold");
+        igpgFontNode.append_child("Color").append_child(pugi::xml_node_type::node_pcdata).set_value("255 127 0");
+        igpgFontNode.append_child("Size").append_child(pugi::xml_node_type::node_pcdata).set_value("12");
+        igpgFontNode.append_child("Flags").append_child(pugi::xml_node_type::node_pcdata).set_value("Family Style Color Size");
+
+        currentIGSAId = globalSectionCounter;
+
+        igpgNode.append_child("Image").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(imageTXMPName));
+        igpgNode.append_child("Text1").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+        igpgNode.append_child("Text2").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+
+        // IGSA
+
+        ////// Main Text
+        pugi::xml_node igsaMainTextNode = rootNode.append_child("IGSA");
+        igsaMainTextNode.append_attribute("id").set_value(++currentIGSAId);
+        pugi::xml_node igsaMainTextStringsNode = igsaMainTextNode.append_child("Strings");
+
+        currentIGSTId = globalSectionCounter;
+
+        for(int i=0; i<mainTextNumberOfRows; i++){
+            igsaMainTextStringsNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+        }
+
+        ////// Footer
+        pugi::xml_node igsaFooterTextNode = rootNode.append_child("IGSA");
+        igsaFooterTextNode.append_attribute("id").set_value(++currentIGSAId);
+        pugi::xml_node igsaFooterTextStringsNode = igsaFooterTextNode.append_child("Strings");
+        for(int i=0; i<footerTextNumberOfRows; i++){
+            igsaFooterTextStringsNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("#" + QString::number(++globalSectionCounter)));
+        }
+
+        // IGSt
+
+        auto setIGStXmlSection = [&rootNode, &currentIGSTId](QTextEdit &currentTextEdit, int numberOfRows){
+
+            for(int i=0; i<numberOfRows; i++){
+
+                QTextCursor currentCursor = currentTextEdit.textCursor();
+                currentCursor.setPosition(currentTextEdit.document()->findBlockByLineNumber(i).position());
+                currentCursor.movePosition(QTextCursor::StartOfLine);
+                currentCursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor);
+                QTextCharFormat format = currentCursor.charFormat();
+                QString colorRGB =  QString::number(format.foreground().color().red()) + " " +
+                        QString::number(format.foreground().color().green()) + " " +
+                        QString::number(format.foreground().color().blue());
+                QString style = (QString(format.fontItalic() ? "Italic " : "") + (format.fontWeight() == QFont::Bold ? "Bold " : "")).trimmed();
+
+                if(style.isEmpty()){
+                    style = "Normal";
+                }
+
+
+                pugi::xml_node igstMainTextNode = rootNode.append_child("IGSt");
+                igstMainTextNode.append_attribute("id").set_value(++currentIGSTId);
+
+                pugi::xml_node igstMainTextFontNode = igstMainTextNode.append_child("Font");
+                igstMainTextFontNode.append_child("Family").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr("TSFF" + format.font().family()));
+                igstMainTextFontNode.append_child("Style").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(style));
+                igstMainTextFontNode.append_child("Color").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(colorRGB));
+                igstMainTextFontNode.append_child("Size").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(QString::number(format.font().pointSize())));
+                igstMainTextFontNode.append_child("Flags").append_child(pugi::xml_node_type::node_pcdata).set_value("Family Style Color Size");
+
+                igstMainTextNode.append_child("Text").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(currentCursor.selection().toPlainText()));
+            }
+
+        };
+
+        //////  Main Text
+        setIGStXmlSection(mainText, mainTextNumberOfRows);
+
+        ////// Footer
+        setIGStXmlSection(footerText, footerTextNumberOfRows);
+    }
+
+    if(!doc.save_file(Util::qStrToCstr(filePath))){
+        UtilVago::showAndLogErrorPopUpLogButton(this->myLogger, "Couldn't create " + filePath + " file!");
+        return;
+    }
+
+    // Convert XML file to Oni
+    this->oniSplitCommands->clear();
+    this->oniSplitCommands->append("-create " + Util::insertQuotes(this->wmLocation) + " " +  Util::insertQuotes(filePath));
+
+    this->myConverter->start(); // finally process the onisplit commands
+    this->myConverter->wait(); // wait for it to complete
+}
+
+void WmFinalPage::catchOSplitProcessingErrors(QString result, int numErrors){
+
+    if(numErrors!=0){
+        QString sNumErrors=QString::number(numErrors);
+        if(numErrors>1){
+            UtilVago::showErrorPopUpLogButton(result+"\n This is the last of " + sNumErrors + " errors.");
+        }
+        else{
+            UtilVago::showErrorPopUpLogButton(result);
+        }
+    }
+}
+
+void WmFinalPage::connectSlots(){
+    //This signal is for thread that is working setup the progress bar (make it visible and set it's min-max)
+    connect(this->myConverter, SIGNAL(resultConversion(QString, int)), this, SLOT(catchOSplitProcessingErrors(QString, int)));
+    connect(ui->lbComplete, SIGNAL(linkActivated(const QString & )), this, SLOT(openSoundsFolder()));
+}
+
+WmFinalPage::~WmFinalPage()
+{
+    delete this->oniSplitCommands;
+    delete this->myConverter;
+    delete ui;
+}
Index: /Vago/trunk/Vago/windowMessagesWizard/wmfinalpage.h
===================================================================
--- /Vago/trunk/Vago/windowMessagesWizard/wmfinalpage.h	(revision 1061)
+++ /Vago/trunk/Vago/windowMessagesWizard/wmfinalpage.h	(revision 1061)
@@ -0,0 +1,48 @@
+#ifndef WMFINALPAGE_H
+#define WMFINALPAGE_H
+
+#include <QWizardPage>
+#include <QDesktopServices>
+#include <QUrl>
+#include <droptablewidget.h>
+#include <pugixml.hpp>
+
+#include "logger.h"
+#include "xmlprocessor.h"
+#include "converter.h"
+#include "wmpage.h"
+#include "wmsetuppage.h"
+
+namespace Ui {
+class wmfinalpage;
+}
+
+class WmFinalPage : public QWizardPage
+{
+    Q_OBJECT
+    
+public:
+    explicit WmFinalPage(QString AppDir, QString wmLocation, Logger *myLogger, QList<std::shared_ptr<WmPage> > &pages, QWidget *parent = 0);
+    ~WmFinalPage();
+    
+private:
+    QString wmLocation;
+    Ui::wmfinalpage *ui;
+    Logger *myLogger;
+    Converter *myConverter;
+    QStringList *oniSplitCommands;
+    // We use shared_ptr because we need the signal and slot mechanism in WmPage,
+    // which require inheritance from QObject, which doesn't support copy constructors
+    QList<std::shared_ptr<WmPage>> &pages;
+
+private:
+    void initializePage();
+    void startProcessing();
+    void connectSlots();
+
+private slots:
+    void openSoundsFolder();
+    void catchOSplitProcessingErrors(QString result, int numErrors);
+};
+
+#endif // WMFINALPAGE_H
Index: /Vago/trunk/Vago/windowMessagesWizard/wmfinalpage.ui
===================================================================
--- /Vago/trunk/Vago/windowMessagesWizard/wmfinalpage.ui	(revision 1061)
+++ /Vago/trunk/Vago/windowMessagesWizard/wmfinalpage.ui	(revision 1061)
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>wmfinalpage</class>
+ <widget class="QWizardPage" name="wmfinalpage">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>640</width>
+    <height>480</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>WizardPage</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="lbComplete">
+     <property name="text">
+      <string>The wizard is now complete. Edit this text in wmfinalpage.cpp</string>
+     </property>
+     <property name="wordWrap">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Fixed</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>30</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
Index: /Vago/trunk/Vago/windowMessagesWizard/wmformatpage.cpp
===================================================================
--- /Vago/trunk/Vago/windowMessagesWizard/wmformatpage.cpp	(revision 1061)
+++ /Vago/trunk/Vago/windowMessagesWizard/wmformatpage.cpp	(revision 1061)
@@ -0,0 +1,342 @@
+#include "wmformatpage.h"
+#include "ui_wmformatpage.h"
+
+WmFormatPage::WmFormatPage(Logger *myLogger, QWidget *parent) :
+    QWizardPage(parent),
+    ui(new Ui::WmFormatPage)
+{
+    ui->setupUi(this);
+
+    this->myLogger = myLogger;
+
+    this->setTitle("Pages Formatting");
+    this->setSubTitle("Create and format the pages here.\nNote that Oni doesn't support partial words formatting so the whole line will be formatted.");
+    setupComboBoxTextSize();
+
+    ui->cbTextSize->setCurrentText("12");
+
+    // Oni only has Tahoma as default, the user however can type any additional font which he has imported into Oni
+    ui->fcbFont->clear();
+    ui->fcbFont->addItem("Tahoma");
+}
+
+void WmFormatPage::initializePage()
+{
+    // Put here code that is dependent from previous pages
+
+    // Clean old pages
+    this->currentPages.clear();
+    ui->twPages->clear();
+
+    addPage();
+
+    setDefaultOniFont(0);
+
+    // If the type is diary page we disable the pages adding and removing
+    // To add extra pages to diary is necessary to create additional files
+    switch(static_cast<WINDOW_TYPE>(field("cbWindowType").toInt())){
+    case WINDOW_TYPE::DIARY:
+    case WINDOW_TYPE::HELP:
+    case WINDOW_TYPE::WEAPON:
+    case WINDOW_TYPE::ITEM:
+        ui->pbAddPageAfter->setEnabled(false);
+        ui->pbAddPageBefore->setEnabled(false);
+        ui->pbDeleteCurrentPage->setEnabled(false);
+        break;
+    case WINDOW_TYPE::OBJECTIVE:
+    case WINDOW_TYPE::TEXT_CONSOLE:
+        ui->pbAddPageAfter->setEnabled(true);
+        ui->pbAddPageBefore->setEnabled(true);
+        ui->pbDeleteCurrentPage->setEnabled(true);
+        break;
+    case WINDOW_TYPE::ENUM_END:
+        UtilVago::showAndLogErrorPopUp(this->myLogger, "An error ocurred: WmFormatPage::initializePage invalid WINDOW_TYPE");
+        break;
+    }
+
+    windowsIsInitialized = true;
+}
+
+WmFormatPage::~WmFormatPage()
+{
+    delete ui;
+}
+
+bool WmFormatPage::validatePage(){
+
+    for(const std::shared_ptr<WmPage> &currentPage : this->currentPages){
+
+        if(
+                currentPage->getMainText().toPlainText().trimmed() == "" &&
+                currentPage->getFooterText().toPlainText().trimmed() == ""
+                )
+        {
+            Util::showErrorPopUp("You need to fill at least one text section in all pages!");
+            return false;
+        }
+
+    }
+
+    // If we can add more than one page, ask the user if he already added them all
+    if(ui->pbAddPageAfter->isEnabled()){
+        return Util::showQuestionPopUp(this, "Have you added all the window pages?");
+    }
+
+    return true;
+
+}
+
+void WmFormatPage::addPage(bool afterCurrentPage){
+
+    int indexForInsertion = 0;
+
+    if(ui->twPages->currentWidget() != nullptr){
+        if(afterCurrentPage){
+            indexForInsertion = ui->twPages->currentIndex() + 1;
+        }
+        else{
+            indexForInsertion = ui->twPages->currentIndex();
+        }
+    }
+
+    ui->twPages->insertTab(indexForInsertion, new QWidget(ui->twPages), "Page " + QString::number(indexForInsertion+1));
+    currentPages.insert(indexForInsertion, std::make_shared<WmPage>(ui->twPages->widget(indexForInsertion)));
+    // Update all other tab texts
+    updateTabNames(indexForInsertion+1);
+
+    // Set the tab added as current tab
+    ui->twPages->setCurrentIndex(indexForInsertion);
+
+    // Set the default font
+    setDefaultOniFont(indexForInsertion);
+    // Make the current selected font the default for new tab
+    setCurrentFormatting(indexForInsertion);
+
+    switch(static_cast<WINDOW_TYPE>(field("cbWindowType").toInt())){
+    case WINDOW_TYPE::HELP:
+    case WINDOW_TYPE::TEXT_CONSOLE:
+        // these types of page doesn't use the footer
+        this->currentPages[indexForInsertion]->hideFooterText();
+        break;
+    case WINDOW_TYPE::DIARY:
+    case WINDOW_TYPE::ITEM:
+    case WINDOW_TYPE::OBJECTIVE:
+    case WINDOW_TYPE::WEAPON:
+        this->currentPages[indexForInsertion]->showFooterText();
+        break;
+    case WINDOW_TYPE::ENUM_END:
+        UtilVago::showAndLogErrorPopUp(this->myLogger, "An error ocurred: WmFormatPage::addPage invalid WINDOW_TYPE");
+        break;
+    }
+
+}
+
+void WmFormatPage::setupComboBoxTextSize(){
+
+    // Setup text size combobox
+    for(int i=8; i<=12; i++){
+        ui->cbTextSize->addItem(QString::number(i));
+    }
+
+    for(int i=14; i<=28; i+=2){
+        ui->cbTextSize->addItem(QString::number(i));
+    }
+
+    ui->cbTextSize->addItem(QString::number(36));
+
+}
+
+void WmFormatPage::on_tbBold_clicked()
+{
+    formatText(FormatType::BOLD);
+}
+
+void WmFormatPage::on_tbItalic_clicked()
+{
+    formatText(FormatType::ITALIC);
+}
+
+void WmFormatPage::on_tbFontColor_clicked()
+{
+    formatText(FormatType::COLOR);
+}
+
+void WmFormatPage::on_fcbFont_currentFontChanged(const QFont&)
+{
+    if(windowsIsInitialized){
+        formatText(FormatType::FONT_TYPE);
+    }
+}
+
+void WmFormatPage::on_cbTextSize_currentTextChanged(const QString&)
+{
+    if(windowsIsInitialized){
+        formatText(FormatType::FONT_SIZE);
+    }
+}
+
+void WmFormatPage::formatText(FormatType desiredFormatType){
+
+    int tabIndex = ui->twPages->currentIndex();
+
+    QVector<QTextEdit*> textEdits;
+
+    if(currentPages[tabIndex]->getMainText().textCursor().hasSelection()){
+        textEdits << &currentPages[tabIndex]->getMainText();
+    }
+    if(currentPages[tabIndex]->getFooterText().textCursor().hasSelection()){
+        textEdits << &currentPages[tabIndex]->getFooterText();
+    }
+
+    if(textEdits.size() == 0){
+        Util::showPopUp("Select some text first.");
+        return;
+    }
+
+    for(QTextEdit* const currentTextEdit : textEdits){
+        QTextCursor currentCursor = currentTextEdit->textCursor();
+
+        // Select entire row(s) (oni only supports formatting the entire row)
+        int selectionStart = currentCursor.selectionStart();
+        int selectionEnd = currentCursor.selectionEnd();
+        int initialRowNumber = 0;
+        int finalRowNumber = 0;
+
+        // If we have no selection skip
+        if(selectionStart == selectionEnd){
+            continue;
+        }
+
+        currentCursor.setPosition(selectionStart);
+        initialRowNumber = currentCursor.blockNumber();
+        currentCursor.setPosition(selectionEnd);
+        finalRowNumber = currentCursor.blockNumber();
+
+        // Apply the style individually for each row (this allow us to apply the same font family to all rows keeping the individual row formatting. e.g. color)
+        for(int i=initialRowNumber; i<=finalRowNumber; i++){
+
+            currentCursor.setPosition(currentTextEdit->document()->findBlockByLineNumber(i).position());
+            currentCursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor);
+
+            QTextCharFormat format = currentCursor.charFormat();
+
+            if(desiredFormatType == FormatType::BOLD){
+                if(format.fontWeight() == QFont::Bold){
+                    format.setFontWeight(QFont::Normal);
+                }
+                else{
+                    format.setFontWeight(QFont::Bold);
+                }
+            }
+            else if(desiredFormatType == FormatType::ITALIC){
+                if(format.fontItalic()){
+                    format.setFontItalic(false);
+                }
+                else{
+                    format.setFontItalic(true);
+                }
+            }
+            else if(desiredFormatType == FormatType::COLOR){
+                QColor pickedColor = QColorDialog::getColor(Qt::green);
+
+                if(pickedColor.isValid()){
+                    format.setForeground(pickedColor);
+                }
+            }
+            else if(desiredFormatType == FormatType::FONT_TYPE){
+                format.setFontFamily(ui->fcbFont->currentFont().family());
+            }
+            else if(desiredFormatType == FormatType::FONT_SIZE){
+                bool ok;
+                double newFontSize = ui->cbTextSize->currentText().toDouble(&ok);
+
+                if(!ok){
+                    Util::showErrorPopUp("The inputted font size is not valid!");
+                    ui->cbTextSize->setCurrentIndex(0); // reset to default number
+                    return;
+                }
+
+                format.setFontPointSize(static_cast<qreal>(newFontSize));
+            }
+
+            currentCursor.mergeCharFormat(format);
+        }
+    }
+}
+
+
+void WmFormatPage::on_pbAddPageAfter_clicked()
+{
+    addPage(true);
+}
+
+void WmFormatPage::on_pbAddPageBefore_clicked()
+{
+    addPage(false);
+}
+
+void WmFormatPage::on_pbDeleteCurrentPage_clicked()
+{
+    if(ui->twPages->count() <= 1){
+        Util::showErrorPopUp("You must have at least one page!");
+        return;
+    }
+
+    if(Util::showQuestionPopUp(this, "Are you sure do you want to delete the current page?")){
+        int indexToDelete = ui->twPages->currentIndex();
+
+        currentPages.removeAt(indexToDelete);
+        ui->twPages->removeTab(indexToDelete);
+        updateTabNames(indexToDelete);
+    }
+}
+
+void WmFormatPage::updateTabNames(int startIndex){
+    // Update all other tab texts
+    for(int i=startIndex; i<ui->twPages->count(); i++){
+        ui->twPages->setTabText(i, "Page " + QString::number(i+1));
+    }
+}
+
+void WmFormatPage::setCurrentFormatting(int index){
+
+    QFont defaultFont;
+    defaultFont.setFamily(ui->fcbFont->currentText());
+    defaultFont.setPointSize(ui->cbTextSize->currentText().toInt());
+
+    this->currentPages[index]->getMainText().setFont(defaultFont);
+    this->currentPages[index]->getFooterText().setFont(defaultFont);
+}
+
+void WmFormatPage::setDefaultOniFont(int index){
+
+    QFont defaultFont;
+    defaultFont.setFamily("Tahoma");
+    defaultFont.setPointSize(12);
+
+    this->currentPages[index]->getMainText().setFont(defaultFont);
+    defaultFont.setPointSize(10);
+    this->currentPages[index]->getFooterText().setFont(defaultFont);
+
+    this->currentPages[index]->getMainText().setTextColor(Qt::green);
+    this->currentPages[index]->getMainText().setFontWeight(QFont::Bold);
+    this->currentPages[index]->getFooterText().setTextColor(Qt::green);
+    this->currentPages[index]->getFooterText().setFontWeight(QFont::Bold);
+}
+
+QList<std::shared_ptr<WmPage> >& WmFormatPage::getCurrentPages(){
+    return this->currentPages;
+}
+
+// Ignore enter key in this page, so user can do enter after write the custom font
+void WmFormatPage::keyPressEvent(QKeyEvent * event){
+
+    if(event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter){
+        return;
+    }
+
+
+    QWizardPage::keyPressEvent(event);
+}
+
+
Index: /Vago/trunk/Vago/windowMessagesWizard/wmformatpage.h
===================================================================
--- /Vago/trunk/Vago/windowMessagesWizard/wmformatpage.h	(revision 1061)
+++ /Vago/trunk/Vago/windowMessagesWizard/wmformatpage.h	(revision 1061)
@@ -0,0 +1,71 @@
+#ifndef WMFORMATPAGE_H
+#define WMFORMATPAGE_H
+
+#include <QWizardPage>
+#include <QColorDialog>
+#include <QKeyEvent>
+#include <QTextBlock>
+
+#include "utilvago.h"
+#include "WmPage.h"
+#include "wmsetuppage.h"
+
+namespace Ui {
+class WmFormatPage;
+}
+
+class WmFormatPage : public QWizardPage
+{
+    Q_OBJECT
+    
+public:
+    explicit WmFormatPage(Logger *myLogger, QWidget *parent = 0);
+    QList<std::shared_ptr<WmPage> >& getCurrentPages();
+
+    ~WmFormatPage();
+    
+private slots:
+    bool validatePage();
+
+    void on_tbBold_clicked();
+
+    void on_pbAddPageAfter_clicked();
+
+    void on_pbAddPageBefore_clicked();
+
+    void on_pbDeleteCurrentPage_clicked();
+
+    void on_tbItalic_clicked();
+
+    void on_tbFontColor_clicked();
+
+    void on_fcbFont_currentFontChanged(const QFont &f);
+
+    void on_cbTextSize_currentTextChanged(const QString &arg1);
+
+private:
+    enum class FormatType{
+        BOLD,
+        ITALIC,
+        COLOR,
+        FONT_TYPE,
+        FONT_SIZE
+    };
+
+    Ui::WmFormatPage *ui;
+    QList<std::shared_ptr<WmPage>> currentPages;
+    bool windowsIsInitialized = false;
+    Logger *myLogger;
+
+private:
+    void setupComboBoxTextSize();
+    void addPage(bool afterCurrentPage = true);
+    void updateTabNames(int startIndex);
+    void setCurrentFormatting(int index);
+    void setDefaultOniFont(int index);
+    void formatText(FormatType desiredFormatType);
+    void initializePage();
+    void keyPressEvent (QKeyEvent * event);
+};
+
+#endif // WMFORMATPAGE_H
Index: /Vago/trunk/Vago/windowMessagesWizard/wmformatpage.ui
===================================================================
--- /Vago/trunk/Vago/windowMessagesWizard/wmformatpage.ui	(revision 1061)
+++ /Vago/trunk/Vago/windowMessagesWizard/wmformatpage.ui	(revision 1061)
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>WmFormatPage</class>
+ <widget class="QWizardPage" name="WmFormatPage">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>451</width>
+    <height>287</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>WizardPage</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <property name="bottomMargin">
+      <number>5</number>
+     </property>
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="pbAddPageBefore">
+       <property name="text">
+        <string>Add page before</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../resources.qrc">
+         <normaloff>:/new/icons/plus.png</normaloff>:/new/icons/plus.png</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="pbAddPageAfter">
+       <property name="text">
+        <string>Add page after</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../resources.qrc">
+         <normaloff>:/new/icons/plus.png</normaloff>:/new/icons/plus.png</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="pbDeleteCurrentPage">
+       <property name="enabled">
+        <bool>true</bool>
+       </property>
+       <property name="text">
+        <string>Delete current page</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../resources.qrc">
+         <normaloff>:/new/icons/minus.png</normaloff>:/new/icons/minus.png</iconset>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QToolButton" name="tbBold">
+       <property name="toolTip">
+        <string>Bold</string>
+       </property>
+       <property name="text">
+        <string>...</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../resources.qrc">
+         <normaloff>:/new/icons/formatting_bold.png</normaloff>:/new/icons/formatting_bold.png</iconset>
+       </property>
+       <property name="shortcut">
+        <string>Ctrl+B</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="tbItalic">
+       <property name="toolTip">
+        <string>Italic</string>
+       </property>
+       <property name="text">
+        <string>...</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../resources.qrc">
+         <normaloff>:/new/icons/formatting_italic.png</normaloff>:/new/icons/formatting_italic.png</iconset>
+       </property>
+       <property name="shortcut">
+        <string>Ctrl+I</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="tbFontColor">
+       <property name="toolTip">
+        <string>Font Color</string>
+       </property>
+       <property name="text">
+        <string>...</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../resources.qrc">
+         <normaloff>:/new/icons/formatting_color.png</normaloff>:/new/icons/formatting_color.png</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QFontComboBox" name="fcbFont">
+       <property name="currentFont">
+        <font>
+         <family>Tahoma</family>
+        </font>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QComboBox" name="cbTextSize">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>80</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="editable">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QTabWidget" name="twPages">
+     <property name="currentIndex">
+      <number>-1</number>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="../resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
Index: /Vago/trunk/Vago/windowMessagesWizard/wmpage.cpp
===================================================================
--- /Vago/trunk/Vago/windowMessagesWizard/wmpage.cpp	(revision 1061)
+++ /Vago/trunk/Vago/windowMessagesWizard/wmpage.cpp	(revision 1061)
@@ -0,0 +1,123 @@
+#include "wmpage.h"
+
+WmPage::WmPage(QWidget *currentTab)
+{
+    createAndAddPageToTab(currentTab);
+}
+
+void WmPage::createAndAddPageToTab(QWidget *currentTab){
+    // Adapted from here: http://stackoverflow.com/questions/5258665/how-to-set-number-of-lines-for-an-qtextedit
+    // Thanks TonyK
+    // Note: not working totally as expected. It isnt resizing correctly for the number of rows.
+    std::function<void(QTextEdit*, int)> setNumberOfRows = [](QTextEdit* textEdit, int rows){
+        textEdit->setFixedHeight(QFontMetrics(textEdit->font()).lineSpacing() * rows);
+    };
+
+    this->pageTab = currentTab;
+
+    QGroupBox *mainTextGroupBox = new QGroupBox(this->pageTab);
+    mainTextGroupBox->setTitle("Main Text");
+
+    this->mainText = new QTextEdit(this->pageTab);
+    setNumberOfRows(this->mainText, 8);
+    this->mainText->setAcceptRichText(false); // block pasting of external formatting
+    this->mainText->setWordWrapMode(QTextOption::NoWrap);
+    QPalette auxPalette = this->mainText->palette();
+    auxPalette.setColor(QPalette::Base, QColor(64,64,64));
+    this->mainText->setPalette(auxPalette);
+
+    QVBoxLayout *mainTextGroupBoxLayout = new QVBoxLayout();
+    mainTextGroupBoxLayout->addWidget(this->mainText);
+    mainTextGroupBox->setLayout(mainTextGroupBoxLayout);
+
+    footerTextGroupBox = new QGroupBox(this->pageTab);
+    footerTextGroupBox->setTitle("Footer Text");
+
+    this->footerText = new QTextEdit(footerTextGroupBox);
+    setNumberOfRows(this->footerText, 4);
+    this->footerText->setAcceptRichText(false); // block pasting of external formatting
+    this->footerText->setWordWrapMode(QTextOption::NoWrap);
+    this->footerText->setPalette(auxPalette);
+
+
+    QVBoxLayout *footerTextGroupBoxLayout = new QVBoxLayout();
+    footerTextGroupBoxLayout->addWidget(this->footerText);
+    footerTextGroupBox->setLayout(footerTextGroupBoxLayout);
+
+    this->middleImage = new QLabel(this->pageTab);
+    this->middleImage->setText("No image selected");
+    this->middleImage->setFixedSize(140,100);
+    this->middleImage->setFrameShape(QFrame::StyledPanel);
+    this->middleImage->setWordWrap(true); // allows us to have text in multiple rows
+    this->middleImage->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter); // align text at center
+
+    this->addRemoveImageButton = new QToolButton(this->pageTab);
+    this->addRemoveImageButton->setToolTip("Click to add an image");
+    this->addRemoveImageButton->setIcon(QIcon(":/new/icons/plus.png"));
+
+    QHBoxLayout *imageLayoutCenter = new QHBoxLayout();
+    imageLayoutCenter->addSpacerItem(new QSpacerItem(1,1, QSizePolicy::Expanding, QSizePolicy::Fixed));
+    imageLayoutCenter->addWidget(this->middleImage);
+    imageLayoutCenter->addWidget(this->addRemoveImageButton);
+    imageLayoutCenter->addSpacerItem(new QSpacerItem(1,1, QSizePolicy::Expanding, QSizePolicy::Fixed));
+
+    QVBoxLayout *pageLayout = new QVBoxLayout();
+    pageLayout->addWidget(mainTextGroupBox);
+    pageLayout->addLayout(imageLayoutCenter);
+    pageLayout->addWidget(footerTextGroupBox);
+
+    this->pageTab->setLayout(pageLayout);
+
+    // Connect addRemoveImageButton to our slot
+    connect(this->addRemoveImageButton, SIGNAL(clicked(bool)), this, SLOT(addRemoveImageButtonTriggered()));
+}
+
+
+QTextEdit& WmPage::getMainText(){
+    return *this->mainText;
+}
+
+QTextEdit& WmPage::getFooterText(){
+    return *this->footerText;
+}
+
+QLabel& WmPage::getMiddleImage(){
+    return *this->middleImage;
+}
+
+void WmPage::hideFooterText(){
+    this->footerTextGroupBox->hide();
+}
+
+void WmPage::showFooterText(){
+    this->footerTextGroupBox->show();
+}
+
+void WmPage::addRemoveImageButtonTriggered(){
+
+    if(this->middleImage->pixmap() == nullptr){
+
+        QString selectedImage = QFileDialog::getOpenFileName(this->pageTab,"Choose the image file...","./" , "Image (*.JPG *.JPEG *.PNG)");
+
+        if(!selectedImage.isEmpty()){
+
+            this->middleImage->setText(selectedImage);
+            this->middleImage->setToolTip(selectedImage);
+
+            this->middleImage->setPixmap( selectedImage );
+
+            // Thanks bukkfa!
+            // http://stackoverflow.com/questions/5653114/display-image-in-qt-to-fit-label-size
+            this->middleImage->setScaledContents( true );
+            this->addRemoveImageButton->setToolTip("Click to remove the image");
+            this->addRemoveImageButton->setIcon(QIcon(":/new/icons/abort.png"));
+        }
+    }
+    else{
+        this->middleImage->setToolTip("");
+        this->middleImage->clear();
+        this->middleImage->setText("No image selected");
+        this->addRemoveImageButton->setToolTip("Click to add an image");
+        this->addRemoveImageButton->setIcon(QIcon(":/new/icons/plus.png"));
+    }
+}
Index: /Vago/trunk/Vago/windowMessagesWizard/wmpage.h
===================================================================
--- /Vago/trunk/Vago/windowMessagesWizard/wmpage.h	(revision 1061)
+++ /Vago/trunk/Vago/windowMessagesWizard/wmpage.h	(revision 1061)
@@ -0,0 +1,39 @@
+#ifndef WMPAGE_H
+#define WMPAGE_H
+
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QTextEdit>
+#include <QGroupBox>
+#include <QLabel>
+#include <QSpacerItem>
+#include <QToolButton>
+#include <QFileDialog>
+#include <functional>
+
+#include "utilvago.h"
+
+class WmPage : public QObject // for signals and slots
+{
+    Q_OBJECT
+public:
+    WmPage(QWidget *currentTab);
+    QTextEdit& getMainText();
+    QTextEdit& getFooterText();
+    QLabel& getMiddleImage();
+    void hideFooterText();
+    void showFooterText();
+private:
+    QTextEdit* mainText;
+    QTextEdit* footerText;
+    QLabel* middleImage;
+    QToolButton* addRemoveImageButton;
+    QWidget *pageTab;
+    QGroupBox *footerTextGroupBox;
+private:
+    void createAndAddPageToTab(QWidget *currentTab);
+private slots:
+    void addRemoveImageButtonTriggered();
+};
+
+#endif // WMPAGE_H
Index: /Vago/trunk/Vago/windowMessagesWizard/wmsetuppage.cpp
===================================================================
--- /Vago/trunk/Vago/windowMessagesWizard/wmsetuppage.cpp	(revision 1061)
+++ /Vago/trunk/Vago/windowMessagesWizard/wmsetuppage.cpp	(revision 1061)
@@ -0,0 +1,171 @@
+#include "wmsetuppage.h"
+#include "ui_wmsetuppage.h"
+
+WmSetupPage::WmSetupPage(QWidget *parent) :
+    QWizardPage(parent),
+    ui(new Ui::WmSetupPage)
+{
+    ui->setupUi(this);
+
+    this->setTitle("Type of Window");
+    this->setSubTitle("Choose here what kind of pages do you want to create, to be displayed in the game.");
+
+    // Initialize combobox (hacky!)
+    for(int i=0; i<static_cast<int>(WINDOW_TYPE::ENUM_END); i++){
+        ui->cbWindowType->addItem(getWindowTypeDescription(static_cast<WINDOW_TYPE>(i)));
+    }
+
+    //Register fields to be accessible in another pages //Not using mandatory field, it would require empty verification too...
+    registerField("cbWindowType", ui->cbWindowType);
+    registerField("leLevelId", ui->leLevelId);
+    registerField("leFileName", ui->leFileName);
+    registerField("lePageNumber", ui->lePageNumber);
+    registerField("leWeaponClassName", ui->leWeaponClassName);
+    registerField("cbIsLearnedMove", ui->cbIsLearnedMove);
+}
+
+WmSetupPage::~WmSetupPage()
+{
+    delete ui;
+}
+
+bool WmSetupPage::validatePage(){
+
+    QStringList stringsToCheck;
+
+    stringsToCheck << ui->leFileName->text();
+
+    if((ui->lePageNumber->isEnabled())){
+        stringsToCheck << ui->lePageNumber->text();
+    }
+    if((ui->leLevelId->isEnabled())){
+        stringsToCheck << ui->leLevelId->text();
+    }
+    if((ui->leWeaponClassName->isEnabled())){
+        stringsToCheck << ui->leWeaponClassName->text();
+    }
+
+    if(Util::checkEmptySpaces(stringsToCheck)){
+        Util::showErrorPopUp("You need to fill all fields first!");
+        return false;
+    }
+
+    return true;
+}
+
+
+
+void WmSetupPage::on_leLevelId_textChanged(const QString &arg1)
+{
+    if(arg1.trimmed().isEmpty()){
+        return;
+    }
+
+    if(!Util::isStringInteger(arg1)){
+        Util::showErrorPopUp("The level id inputted is invalid! It must be a number.");
+        return;
+    }
+
+    switch(static_cast<WINDOW_TYPE>(ui->cbWindowType->currentIndex())){
+    case WINDOW_TYPE::OBJECTIVE:
+        ui->leFileName->setText(QString("OPgelevel_") + arg1.trimmed());
+        break;
+    case  WINDOW_TYPE::DIARY:
+        generateDiaryFileName();
+        break;
+    case  WINDOW_TYPE::TEXT_CONSOLE:
+        ui->leFileName->setText(QString("TxtClevel_") + arg1.trimmed());
+        break;
+    case  WINDOW_TYPE::HELP:
+    case  WINDOW_TYPE::WEAPON:
+    case  WINDOW_TYPE::ITEM:
+    case  WINDOW_TYPE::ENUM_END:
+        break;
+    }
+}
+
+void WmSetupPage::on_lePageNumber_textChanged(const QString &arg1)
+{
+    if(arg1.trimmed().isEmpty()){
+        return;
+    }
+
+    if(!Util::isStringInteger(arg1)){
+        Util::showErrorPopUp("The page number inputted is invalid! It must be a number.");
+        return;
+    }
+
+    switch(static_cast<WINDOW_TYPE>(ui->cbWindowType->currentIndex())){
+    case  WINDOW_TYPE::DIARY:
+        generateDiaryFileName();
+        break;
+    case  WINDOW_TYPE::ITEM:
+        ui->leFileName->setText("IPge");
+        break;
+    case  WINDOW_TYPE::OBJECTIVE:
+    case  WINDOW_TYPE::TEXT_CONSOLE:
+    case  WINDOW_TYPE::HELP:
+    case  WINDOW_TYPE::WEAPON:
+    case  WINDOW_TYPE::ENUM_END:
+        break;
+    }
+
+}
+
+void WmSetupPage::on_cbWindowType_currentTextChanged(const QString &arg1)
+{
+    // when we hide the widgets qt will left some empty space, to remove this space we remove and add also the widgets:
+    // http://stackoverflow.com/questions/17986164/how-to-removing-remaining-spacing-after-hide-a-row-in-qformlayout
+
+    ui->leLevelId->setEnabled(false);
+    ui->lePageNumber->setEnabled(false);
+    ui->leWeaponClassName->setEnabled(false);
+    ui->cbIsLearnedMove->setEnabled(false);
+
+    if(arg1 == getWindowTypeDescription(WINDOW_TYPE::DIARY)){
+        ui->leLevelId->setEnabled(true);
+        ui->lePageNumber->setEnabled(true);
+        ui->cbIsLearnedMove->setEnabled(true);
+    }
+    else if(arg1 == getWindowTypeDescription(WINDOW_TYPE::WEAPON)){
+        ui->leWeaponClassName->setEnabled(true);
+    }
+    else if(arg1 == getWindowTypeDescription(WINDOW_TYPE::ITEM)){
+        ui->lePageNumber->setEnabled(true);
+    }
+    else if(arg1 == getWindowTypeDescription(WINDOW_TYPE::HELP)){
+        ui->leFileName->setText("HPgehelp_pg_01");
+    }
+    else{
+        ui->leLevelId->setEnabled(true);
+    }
+}
+
+void WmSetupPage::on_leWeaponClassName_textChanged(const QString &arg1)
+{
+    ui->leFileName->setText(QString("WPge") + arg1.trimmed().replace("ONWC",""));
+}
+
+QString WmSetupPage::getWindowTypeDescription(const WINDOW_TYPE wt){
+    switch(wt){
+    case WINDOW_TYPE::OBJECTIVE:
+        return "Objective Page(s) [OPge]";
+    case WINDOW_TYPE::TEXT_CONSOLE:
+        return "Text Console Pages(s) [TxtC]";
+    case WINDOW_TYPE::WEAPON:
+        return "Weapon Page(s) [WPge]";
+    case WINDOW_TYPE::ITEM:
+        return "Item Pages(s) [IPge]";
+    case WINDOW_TYPE::DIARY:
+        return "Diary Page  [DPge]";
+    case WINDOW_TYPE::HELP:
+        return "Help Page(s) [HPge]";
+    default:
+        return "ERROR WINDOW_TYPE ENUM";
+    }
+
+}
+
+void WmSetupPage::generateDiaryFileName(){
+    ui->leFileName->setText(QString("DPgelev_") + (ui->leLevelId->text().trimmed().length() == 1 ? "0" : "") + ui->leLevelId->text() + "_" + ui->lePageNumber->text());
+}
Index: /Vago/trunk/Vago/windowMessagesWizard/wmsetuppage.h
===================================================================
--- /Vago/trunk/Vago/windowMessagesWizard/wmsetuppage.h	(revision 1061)
+++ /Vago/trunk/Vago/windowMessagesWizard/wmsetuppage.h	(revision 1061)
@@ -0,0 +1,47 @@
+#ifndef WMSETUPPAGE_H
+#define WMSETUPPAGE_H
+
+#include <QWizardPage>
+
+#include "utilvago.h"
+
+namespace Ui {
+class WmSetupPage;
+}
+
+enum class WINDOW_TYPE{
+    OBJECTIVE = 0,
+    TEXT_CONSOLE,
+    WEAPON,
+    ITEM,
+    DIARY,
+    HELP,
+    ENUM_END
+};
+
+class WmSetupPage : public QWizardPage
+{
+    Q_OBJECT
+public:
+    explicit WmSetupPage(QWidget *parent = 0);
+    ~WmSetupPage();
+    
+private slots:
+    bool validatePage();
+
+    void on_leLevelId_textChanged(const QString &arg1);
+
+    void on_lePageNumber_textChanged(const QString &arg1);
+
+    void on_cbWindowType_currentTextChanged(const QString &arg1);
+
+    void on_leWeaponClassName_textChanged(const QString &arg1);
+
+private:
+    Ui::WmSetupPage *ui;
+private:
+    void generateDiaryFileName();
+    QString getWindowTypeDescription(const WINDOW_TYPE wt);
+};
+
+#endif // WMSETUPPAGE_H
Index: /Vago/trunk/Vago/windowMessagesWizard/wmsetuppage.ui
===================================================================
--- /Vago/trunk/Vago/windowMessagesWizard/wmsetuppage.ui	(revision 1061)
+++ /Vago/trunk/Vago/windowMessagesWizard/wmsetuppage.ui	(revision 1061)
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>WmSetupPage</class>
+ <widget class="QWizardPage" name="WmSetupPage">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>451</width>
+    <height>314</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>WizardPage</string>
+  </property>
+  <layout class="QFormLayout" name="formLayout">
+   <item row="0" column="0">
+    <widget class="QLabel" name="label_5">
+     <property name="text">
+      <string>Window Type:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <widget class="QComboBox" name="cbWindowType"/>
+   </item>
+   <item row="1" column="0">
+    <widget class="QLabel" name="lbLevelId">
+     <property name="text">
+      <string>Level ID:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="QLineEdit" name="leLevelId"/>
+   </item>
+   <item row="2" column="0">
+    <widget class="QLabel" name="lbDiaryPageNumber">
+     <property name="text">
+      <string>Page Number:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="1">
+    <widget class="QLineEdit" name="lePageNumber"/>
+   </item>
+   <item row="3" column="0">
+    <widget class="QLabel" name="lbWeaponClassName">
+     <property name="toolTip">
+      <string>Weapon class name for example: ONWCw1_tap</string>
+     </property>
+     <property name="text">
+      <string>Weapon Class Name:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="1">
+    <widget class="QLineEdit" name="leWeaponClassName">
+     <property name="toolTip">
+      <string>Weapon class name for example: ONWCw1_tap</string>
+     </property>
+    </widget>
+   </item>
+   <item row="4" column="0">
+    <widget class="QLabel" name="label_7">
+     <property name="text">
+      <string>Filename:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="4" column="1">
+    <widget class="QLineEdit" name="leFileName"/>
+   </item>
+   <item row="5" column="0">
+    <widget class="QCheckBox" name="cbIsLearnedMove">
+     <property name="text">
+      <string>Is Learned Move</string>
+     </property>
+    </widget>
+   </item>
+   <item row="6" column="0">
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Expanding</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
Index: /Vago/trunk/Vago/windowMessagesWizard/wmwizard.cpp
===================================================================
--- /Vago/trunk/Vago/windowMessagesWizard/wmwizard.cpp	(revision 1061)
+++ /Vago/trunk/Vago/windowMessagesWizard/wmwizard.cpp	(revision 1061)
@@ -0,0 +1,33 @@
+#include "wmwizard.h"
+
+WmWizard::WmWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger)
+:AbstractWizard(appDir, workspaceWizardLocation, vagoSettings, myLogger, true)
+{
+    this->bgImagesLocation=this->workspaceWizardLocation+"/WindowMessages";
+}
+
+void WmWizard::exec(){
+
+    WmSetupPage *setupPage = new WmSetupPage();
+    WmFormatPage *formatPage = new WmFormatPage(this->myLogger);
+    WmFinalPage *finalPage = new WmFinalPage(this->appDir, this->bgImagesLocation, this->myLogger, formatPage->getCurrentPages());
+
+    this->myWizard.addPage
+    (
+        createIntroPage
+        (
+            "Welcome to the Oni Window Messages Wizard.\n"
+            "This wizard will allow you to create in a few and simple steps Oni Window Messages (DPge, HPge etc).\n"
+            "This Window Messages are used to display information to the player in consoles, diary, help, item / weapon pages etc."
+        )
+    );
+    this->myWizard.addPage(setupPage);
+    this->myWizard.addPage(formatPage);
+    this->myWizard.addPage(finalPage);
+
+    showWizard("Window Messages Wizard", ":/new/icons/windowmessages.png");
+}
+
+void WmWizard::beforeClose(QDialog::DialogCode){
+
+}
Index: /Vago/trunk/Vago/windowMessagesWizard/wmwizard.h
===================================================================
--- /Vago/trunk/Vago/windowMessagesWizard/wmwizard.h	(revision 1061)
+++ /Vago/trunk/Vago/windowMessagesWizard/wmwizard.h	(revision 1061)
@@ -0,0 +1,21 @@
+#ifndef WMWIZARD_H
+#define WMWIZARD_H
+
+// Local includes
+#include "abstractwizard.h"
+#include "wmsetuppage.h"
+#include "wmformatpage.h"
+#include "wmfinalpage.h"
+
+class WmWizard: public AbstractWizard // for signals and slots
+{
+protected:
+    WmWizard(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger);
+    void exec();
+private:
+    QString bgImagesLocation;
+private:
+    void beforeClose(QDialog::DialogCode resultStatus);
+};
+
+#endif // WMWIZARD_H
Index: /Vago/trunk/Vago/wizardfactory.h
===================================================================
--- /Vago/trunk/Vago/wizardfactory.h	(revision 1061)
+++ /Vago/trunk/Vago/wizardfactory.h	(revision 1061)
@@ -0,0 +1,48 @@
+#ifndef WIZARDFACTORY_H
+#define WIZARDFACTORY_H
+
+#include "soundwizard.h"
+
+// This template class allows us to create wizards in the heap which auto-delete themselves once finished
+template<typename T>
+class WizardFactory : public T
+{
+public:
+    static void startInstance(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger){
+        (new WizardFactory<T>(appDir, workspaceWizardLocation, vagoSettings, myLogger))->exec();
+    }
+private:
+    // We need to have a constructor to be able to acess "exec" protected function
+    WizardFactory
+    (
+            const QString &appDir,
+            const QString &workspaceWizardLocation,
+            QSettings *vagoSettings,
+            Logger *myLogger
+    ):T(appDir, workspaceWizardLocation, vagoSettings, myLogger){}
+};
+
+// Specialization for SoundWizard (it receives extra variables)
+template<>
+class WizardFactory<SoundWizard> : public SoundWizard
+{
+public:
+    static void startInstance(const QString &appDir, const QString &workspaceWizardLocation, QSettings *vagoSettings, Logger *myLogger, QHash<QString, QString> *commandMap){
+        (new WizardFactory(appDir, workspaceWizardLocation, vagoSettings, myLogger, commandMap))->exec();
+    }
+private:
+    WizardFactory
+    (
+            const QString &appDir,
+            const QString &workspaceWizardLocation,
+            QSettings *vagoSettings,
+            Logger *myLogger,
+            QHash<QString, QString> *commandMap
+    ):SoundWizard(appDir, workspaceWizardLocation, vagoSettings, myLogger, commandMap){}
+};
+
+
+
+
+
+#endif // WIZARDFACTORY_H
Index: /Vago/trunk/Vago/xmlToolsInterface/xmltoolsinterface.ui
===================================================================
--- /Vago/trunk/Vago/xmlToolsInterface/xmltoolsinterface.ui	(revision 1060)
+++ /Vago/trunk/Vago/xmlToolsInterface/xmltoolsinterface.ui	(revision 1061)
@@ -33,4 +33,9 @@
       <item row="0" column="0">
        <widget class="QLabel" name="label">
+        <property name="toolTip">
+         <string>XmlTools Operation that you want to perform.
+Learn more about them in XmlTools documentation page:
+http://wiki.oni2.net/XmlTools</string>
+        </property>
         <property name="text">
          <string>XmlTools Operation:</string>
@@ -40,4 +45,9 @@
       <item row="0" column="1">
        <widget class="QComboBox" name="cbXmlToolsOperation">
+        <property name="toolTip">
+         <string>XmlTools Operation that you want to perform.
+Learn more about them in XmlTools documentation page:
+http://wiki.oni2.net/XmlTools</string>
+        </property>
         <item>
          <property name="text">
@@ -226,4 +236,9 @@
             </sizepolicy>
            </property>
+           <property name="toolTip">
+            <string>XML files to process (wildcards supported)
+
+If you are processing only one file you can also drag and drop it here.</string>
+           </property>
            <property name="text">
             <string>Input File(s):</string>
@@ -241,4 +256,9 @@
               </size>
              </property>
+             <property name="toolTip">
+              <string>XML files to process (wildcards supported)
+
+If you are processing only one file you can also drag and drop it here.</string>
+             </property>
             </widget>
            </item>
@@ -260,4 +280,7 @@
             </sizepolicy>
            </property>
+           <property name="toolTip">
+            <string>Value to be replaced or removed (use space as separator)</string>
+           </property>
            <property name="text">
             <string>Current Value(s):</string>
@@ -267,4 +290,7 @@
          <item row="1" column="1">
           <widget class="QLineEdit" name="leInputCurrentValues">
+           <property name="toolTip">
+            <string>Value to be replaced or removed (use space as separator)</string>
+           </property>
            <property name="text">
             <string/>
@@ -280,4 +306,7 @@
             </sizepolicy>
            </property>
+           <property name="toolTip">
+            <string>New value(s) to add or replace current value (use space as separator)</string>
+           </property>
            <property name="text">
             <string>New Value(s):</string>
@@ -286,5 +315,9 @@
          </item>
          <item row="2" column="1">
-          <widget class="QLineEdit" name="leInputNewValues"/>
+          <widget class="QLineEdit" name="leInputNewValues">
+           <property name="toolTip">
+            <string>New value(s) to add or replace current value (use space as separator)</string>
+           </property>
+          </widget>
          </item>
          <item row="3" column="0">
@@ -296,4 +329,7 @@
             </sizepolicy>
            </property>
+           <property name="toolTip">
+            <string>Positions to be replaced [use space as separator] (zero-based index)</string>
+           </property>
            <property name="text">
             <string>Position(s):</string>
@@ -303,4 +339,7 @@
          <item row="3" column="1">
           <widget class="QLineEdit" name="leInputPositions">
+           <property name="toolTip">
+            <string>Positions to be replaced [use space as separator] (zero-based index)</string>
+           </property>
            <property name="text">
             <string/>
@@ -310,4 +349,15 @@
          <item row="4" column="0">
           <widget class="QLabel" name="lbInputDiffOldNewValue">
+           <property name="toolTip">
+            <string>Difference to adjust values by.
+
+For instance if the current value is 1 and you want it to become 3 (new value), you should input -2:
+
+1 (current value) - 3 (new value) = -2
+
+---
+
+You can also update multi dimensional values like &quot;1 2 3&quot;, type the difference here like &quot;-1 -1 -1&quot;. Result would be &quot;2 3 4&quot;.</string>
+           </property>
            <property name="text">
             <string>Diff between old and new value:</string>
@@ -316,5 +366,17 @@
          </item>
          <item row="4" column="1">
-          <widget class="QLineEdit" name="leInputDiffOldNewValue"/>
+          <widget class="QLineEdit" name="leInputDiffOldNewValue">
+           <property name="toolTip">
+            <string>Difference to adjust values by.
+
+For instance if the current value is 1 and you want it to become 3 (new value), you should input -2:
+
+1 (current value) - 3 (new value) = -2
+
+---
+
+You can also update multi dimensional values like &quot;1 2 3&quot;, type the difference here like &quot;-1 -1 -1&quot;. Result would be &quot;2 3 4&quot;.</string>
+           </property>
+          </widget>
          </item>
         </layout>
@@ -344,4 +406,7 @@
        <item>
         <widget class="QCheckBox" name="cbOptionsNoBackups">
+         <property name="toolTip">
+          <string>Don't make backups of XML files (faster processing)</string>
+         </property>
          <property name="text">
           <string>No Backups</string>
@@ -375,4 +440,7 @@
          <property name="enabled">
           <bool>true</bool>
+         </property>
+         <property name="toolTip">
+          <string>Command for XmlTools generated by this interface, you can copy it, to later input directly in XmlTools</string>
          </property>
          <property name="readOnly">
@@ -427,4 +495,9 @@
          </size>
         </property>
+        <property name="toolTip">
+         <string>Opens a windows which previews your operation. It does NOT make any changes to the input files.
+
+(only available when exists only one file as input)</string>
+        </property>
         <property name="text">
          <string>Preview Operation</string>
@@ -456,4 +529,7 @@
          </size>
         </property>
+        <property name="toolTip">
+         <string>Applies the operation to the input files</string>
+        </property>
         <property name="text">
          <string>Apply Operation</string>
