//Copyright (C) 2006 Dominic Letourneau (Dominic.Letourneau@USherbrooke.ca)

#include "QtFlowDesigner.h"
#include "QtNetwork.h"
#include "QtNodeTreeView.h"
#include <QFileDialog>
#include <QMessageBox>
#include "UINetworkController.h"
#include <iostream>



namespace FD
{
    
    using namespace std;
    
    QtFlowDesigner::QtFlowDesigner (QWidget* parent)
    : QMainWindow(parent)
    {
        setupUiv2();
        //setupUi(this);
        //setupUi(this);
        
        connect(actionNewNetwork, SIGNAL(triggered()),this,SLOT(newNetworkClicked()));
        connect(actionNewIteratorNetwork, SIGNAL(triggered()),this,SLOT(newIteratorNetworkClicked()));
        connect(actionLoad_Document, SIGNAL(triggered()),this,SLOT(openDocumentClicked()));
		connect(actionSave_Document, SIGNAL(triggered()),this,SLOT(saveDocumentClicked()));
    }
    
    QtFlowDesigner::~QtFlowDesigner()
    {
    }
    
    void QtFlowDesigner::setupUiv2()
    {
        //Action menus
        setObjectName(QString::fromUtf8("QtFlowDesigner"));
        actionLoad_Document = new QAction(this);
        actionLoad_Document->setObjectName(QString::fromUtf8("actionSave_Document"));
		actionSave_Document = new QAction(this);
        actionSave_Document->setObjectName(QString::fromUtf8("actionSave_Document"));
		
        actionNewNetwork = new QAction(this);
        actionNewNetwork->setObjectName(QString::fromUtf8("actionNewNetwork"));
        actionNewIteratorNetwork = new QAction(this);
        actionNewIteratorNetwork->setObjectName(QString::fromUtf8("actionNewIteratorNetwork"));
        
        
        //Workspace
        m_workspace = new QWorkspace(this);
        m_workspace->setObjectName(QString::fromUtf8("workspace"));
        
        std::cerr<<"workspace created"<<std::endl;
        //vboxMainLayout = new QVBoxLayout(centralwidget);
        //vboxMainLayout->setObjectName(QString::fromUtf8("vboxMainLayout"));
        //vboxMainLayout->setSpacing(6);
        //vboxMainLayout->setMargin(1);
        
        
        
        //hboxLayout = new QHBoxLayout(NULL);
        //hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
        //hboxLayout->setSpacing(6);
        //hboxLayout->setMargin(1);
        //vboxMainLayout->addLayout(hboxLayout);
        
        
        
        //Text edit
        m_textEdit = new QTextEdit(this);
        m_textEdit->setLineWrapMode (QTextEdit::NoWrap);
        m_textEdit->setReadOnly(true);
        m_textEdit->setText(QString("<b> FlowDesigner ") + QString("FLOWDESIGNER_VERSION") +
        QString(" by Jean-Marc Valin & Dominic Letourneau <br>") +
        QString("(C) Copyright 1999-2006 <b><br>----<br>"));
        QWidget *window = m_workspace->addWindow(m_textEdit);
        window->show();
        
        /*
        verticalLayout = new QWidget(centralwidget);
        verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
        QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(7), static_cast<QSizePolicy::Policy>(7));
        sizePolicy.setHorizontalStretch(0);
        sizePolicy.setVerticalStretch(0);
        sizePolicy.setHeightForWidth(verticalLayout->sizePolicy().hasHeightForWidth());
        verticalLayout->setSizePolicy(sizePolicy);
        vboxLayout = new QVBoxLayout(verticalLayout);
        vboxLayout->setSpacing(6);
        vboxLayout->setMargin(9);
        vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
        horizontalLayout_2 = new QWidget(verticalLayout);
        horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
        hboxLayout1 = new QHBoxLayout(horizontalLayout_2);
        hboxLayout1->setSpacing(6);
        hboxLayout1->setMargin(0);
        hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
        */
        
        //tree view
        treeView = new QtNodeTreeView(this);
        treeView->setObjectName(QString::fromUtf8("treeView"));
        m_workspace->addWindow(treeView);
        //hboxLayout->addWidget(treeView);
        
        //tab widget
        //tabWidget = new QTabWidget(this);
        //tabWidget->setObjectName(QString::fromUtf8("tabWidget"));
        //tab = new QWidget();
        //tab->setObjectName(QString::fromUtf8("tab"));
        //tabWidget->addTab(tab, QApplication::translate("this", "Tab 1", 0, QApplication::UnicodeUTF8));
        //tab_2 = new QWidget();
        //tab_2->setObjectName(QString::fromUtf8("tab_2"));
        //tabWidget->addTab(tab_2, QApplication::translate("this", "Tab 2", 0, QApplication::UnicodeUTF8));
        
        //hboxLayout->addWidget(tabWidget);
        
        
        //vboxLayout->addWidget(horizontalLayout_2);
        
        
        //hboxLayout->addWidget(verticalLayout);
        
        this->setCentralWidget(m_workspace);
        
        
        
        
        
        
        
        //SETUP MENUS
        
        menubar = new QMenuBar(this);
        menubar->setObjectName(QString::fromUtf8("menubar"));
        menubar->setGeometry(QRect(0, 0, 800, 26));
        menu_About = new QMenu(menubar);
        menu_About->setObjectName(QString::fromUtf8("menu_About"));
        menuFile = new QMenu(menubar);
        menuFile->setObjectName(QString::fromUtf8("menuFile"));
        menuPreferences = new QMenu(menubar);
        menuPreferences->setObjectName(QString::fromUtf8("menuPreferences"));
        menuNetwork = new QMenu(menubar);
        menuNetwork->setObjectName(QString::fromUtf8("menuNetwork"));
        this->setMenuBar(menubar);
        statusbar = new QStatusBar(this);
        statusbar->setObjectName(QString::fromUtf8("statusbar"));
        this->setStatusBar(statusbar);
        
        menubar->addAction(menuFile->menuAction());
        menubar->addAction(menuNetwork->menuAction());
        menubar->addAction(menuPreferences->menuAction());
        menubar->addAction(menu_About->menuAction());
        menuFile->addAction(actionLoad_Document);
		menuFile->addAction(actionSave_Document);
        menuNetwork->addAction(actionNewNetwork);      
        menuNetwork->addAction(actionNewIteratorNetwork);
        //menuNetwork->addSeparator();
        
        
        
        
        retranslateUi();
        
        QSize size(1024, 768);
        size = size.expandedTo(this->minimumSizeHint());
        resize(size);
        
        QMetaObject::connectSlotsByName(this);
        
        cerr<<"setup done"<<endl;
        
    }
    
    
    void QtFlowDesigner::setupUi()
    {
        
        //Action menus
        setObjectName(QString::fromUtf8("QtFlowDesigner"));
        actionLoad_Document = new QAction(this);
        actionLoad_Document->setObjectName(QString::fromUtf8("actionLoad_Document"));
        actionSave_Document = new QAction(this);		
        actionSave_Document->setObjectName(QString::fromUtf8("actionSave_Document"));
        
        actionNewNetwork = new QAction(this);
        actionNewNetwork->setObjectName(QString::fromUtf8("actionNewNetwork"));
        
        
        //CentralWidget
        centralwidget = new QWidget(this);
        centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
        
        
        vboxMainLayout = new QVBoxLayout(centralwidget);
        vboxMainLayout->setObjectName(QString::fromUtf8("vboxMainLayout"));
        vboxMainLayout->setSpacing(6);
        vboxMainLayout->setMargin(1);
        
        
        
        hboxLayout = new QHBoxLayout(NULL);
        hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
        hboxLayout->setSpacing(6);
        hboxLayout->setMargin(1);
        vboxMainLayout->addLayout(hboxLayout);
        
        
        
        //Text edit
        m_textEdit = new QTextEdit(this);
        vboxMainLayout->addWidget(m_textEdit);
        m_textEdit->setLineWrapMode (QTextEdit::NoWrap);
        m_textEdit->setReadOnly(true);
        m_textEdit->setText(QString("<b> FlowDesigner ") + QString("FLOWDESIGNER_VERSION") +
        QString(" by Jean-Marc Valin & Dominic Letourneau <br>") +
        QString("(C) Copyright 1999-2006 <b><br>----<br>"));
        
        /*
        verticalLayout = new QWidget(centralwidget);
        verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
        QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(7), static_cast<QSizePolicy::Policy>(7));
        sizePolicy.setHorizontalStretch(0);
        sizePolicy.setVerticalStretch(0);
        sizePolicy.setHeightForWidth(verticalLayout->sizePolicy().hasHeightForWidth());
        verticalLayout->setSizePolicy(sizePolicy);
        vboxLayout = new QVBoxLayout(verticalLayout);
        vboxLayout->setSpacing(6);
        vboxLayout->setMargin(9);
        vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
        horizontalLayout_2 = new QWidget(verticalLayout);
        horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
        hboxLayout1 = new QHBoxLayout(horizontalLayout_2);
        hboxLayout1->setSpacing(6);
        hboxLayout1->setMargin(0);
        hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
        */
        
        //tree view
        treeView = new QtNodeTreeView(this);
        treeView->setObjectName(QString::fromUtf8("treeView"));
        hboxLayout->addWidget(treeView);
        
        //tab widget
        tabWidget = new QTabWidget(this);
        tabWidget->setObjectName(QString::fromUtf8("tabWidget"));
        tab = new QWidget();
        tab->setObjectName(QString::fromUtf8("tab"));
        tabWidget->addTab(tab, QApplication::translate("this", "Tab 1", 0, QApplication::UnicodeUTF8));
        tab_2 = new QWidget();
        tab_2->setObjectName(QString::fromUtf8("tab_2"));
        tabWidget->addTab(tab_2, QApplication::translate("this", "Tab 2", 0, QApplication::UnicodeUTF8));
        
        hboxLayout->addWidget(tabWidget);
        
        
        //vboxLayout->addWidget(horizontalLayout_2);
        
        
        //hboxLayout->addWidget(verticalLayout);
        
        this->setCentralWidget(centralwidget);
        
        //SETUP MENUS
        menubar = new QMenuBar(this);
        menubar->setObjectName(QString::fromUtf8("menubar"));
        menubar->setGeometry(QRect(0, 0, 800, 26));
        menu_About = new QMenu(menubar);
        menu_About->setObjectName(QString::fromUtf8("menu_About"));
        menuFile = new QMenu(menubar);
        menuFile->setObjectName(QString::fromUtf8("menuFile"));
        menuPreferences = new QMenu(menubar);
        menuPreferences->setObjectName(QString::fromUtf8("menuPreferences"));
        menuNetwork = new QMenu(menubar);
        menuNetwork->setObjectName(QString::fromUtf8("menuNetwork"));
        this->setMenuBar(menubar);
        statusbar = new QStatusBar(this);
        statusbar->setObjectName(QString::fromUtf8("statusbar"));
        this->setStatusBar(statusbar);
        
        menubar->addAction(menuFile->menuAction());
        menubar->addAction(menuNetwork->menuAction());
        menubar->addAction(menuPreferences->menuAction());
        menubar->addAction(menu_About->menuAction());
        menuFile->addAction(actionLoad_Document);
		menuFile->addAction(actionSave_Document);
        menuNetwork->addAction(actionNewNetwork);
        menuNetwork->addSeparator();
        
        retranslateUi();
        
        QSize size(1024, 768);
        size = size.expandedTo(this->minimumSizeHint());
        resize(size);
        
        //QMetaObject::connectSlotsByName(this);
    }
    
    void QtFlowDesigner::retranslateUi()
    {
        setWindowTitle(QApplication::translate("QtFlowDesigner", "FlowDesigner", 0, QApplication::UnicodeUTF8));
        
        actionLoad_Document->setText(QApplication::translate("QtFlowDesigner", "Load Document", 0, QApplication::UnicodeUTF8));
		actionSave_Document->setText(QApplication::translate("QtFlowDesigner", "Save Document", 0, QApplication::UnicodeUTF8));
        actionNewNetwork->setText(QApplication::translate("QtFlowDesigner", "newNetwork", 0, QApplication::UnicodeUTF8));
        actionNewIteratorNetwork->setText(QApplication::translate("QtFlowDesigner", "newIteratorNetwork", 0, QApplication::UnicodeUTF8));
        //tabWidget->setTabText(tabWidget->indexOf(tab), QApplication::translate("QtFlowDesigner", "Tab 1", 0, QApplication::UnicodeUTF8));
        //tabWidget->setTabText(tabWidget->indexOf(tab_2), QApplication::translate("QtFlowDesigner", "Tab 2", 0, QApplication::UnicodeUTF8));
        menu_About->setTitle(QApplication::translate("QtFlowDesigner", "&About", 0, QApplication::UnicodeUTF8));
        menuFile->setTitle(QApplication::translate("QtFlowDesigner", "&File", 0, QApplication::UnicodeUTF8));
        menuPreferences->setTitle(QApplication::translate("QtFlowDesigner", "&Preferences", 0, QApplication::UnicodeUTF8));
        menuNetwork->setTitle(QApplication::translate("QtFlowDesigner", "Network", 0, QApplication::UnicodeUTF8));
        
    } // retranslateUi
    
    /*void QtFlowDesigner::newNetwork(const std::string name)
    {
        
        //tabWidget->addTab (new QtNetwork(), name.c_str());
        
        //get active window
        QWidget *window =  m_workspace->activeWindow ();
        
        QtDocument *doc = dynamic_cast<QtDocument*>(window);
        
        if (doc)
        {
            cerr<<"Will create a new network"<<endl;
        }
        
        
    }*/
    
    void QtFlowDesigner::newNetwork(UINetwork::Type type)
    {
        QtDocument *doc =  new QtDocument(this,type,NULL);	   	  
        QWidget *window = m_workspace->addWindow(doc);
        window->setWindowTitle("QtDocument - untitled");
        m_workspace->setActiveWindow(window);
        window->show();
    }   
    
    void QtFlowDesigner::newNetworkClicked()
    {
        QtDocument* activeDoc = activeDocument();
        if(activeDoc==0)
            newNetwork(UINetwork::subnet);
        else
        {
            bool ok;
            QString name = QInputDialog::getText ( NULL,QString ( "New network" ),
            QString ( "Network name : " ),QLineEdit::Normal, "subnet",&ok ); 
            if(name=="")      
            {
                QMessageBox::critical( this
                , tr("New Network ERROR")
                , tr("Name NULL"));
                return;
            }
            if(activeDoc->isNetworkExist(name))
            {
                QMessageBox::critical( this
                , tr("New Network ERROR")
                , tr("This name is already used"));
                return;
            }
            activeDoc->addNetwork(name, UINetwork::subnet);
        }
    }
    
    
    
    void QtFlowDesigner::newIteratorNetworkClicked()
    {
        QtDocument* activeDoc = activeDocument();
        if(activeDoc==0)
            newNetwork(UINetwork::iterator);
        else
        {
            bool ok;
            QString name = QInputDialog::getText ( NULL,QString ( "New iterator network" ),
            QString ( "Network name : " ),QLineEdit::Normal, "loop",&ok ); 
            if(name=="")      
            {
                QMessageBox::critical( this
                , tr("New Network ERROR")
                , tr("Name NULL"));
                return;
            }
            else if(activeDoc->isNetworkExist(name))
            {
                QMessageBox::critical( this
                , tr("New Network ERROR")
                , tr("This name is already used"));
                return;
            }
            activeDoc->addNetwork(name, UINetwork::iterator);
        }
    }
    
    QtDocument *QtFlowDesigner::activeDocument()
    {
        QWidget *window =  m_workspace->activeWindow ();      
        QtDocument *doc = dynamic_cast<QtDocument*>(window);
        return doc;    
    }
    
    void QtFlowDesigner::openDocumentClicked()
    {
        cerr<<"Open document clicked"<<endl;
        QFileDialog dialog(this);
        dialog.setFileMode(QFileDialog::ExistingFiles);
        
        QStringList filters;
        filters << "FlowDesigner Document (*.n)"
        << "Any files (*)";
        
        dialog.setFilters(filters);      
        
        if (dialog.exec())
        {
            QStringList fileNames = dialog.selectedFiles();
            
            for (QStringList::iterator iter = fileNames.begin();
            iter != fileNames.end(); iter++)
            {
                loadDocument((*iter).toStdString());                                 
            }
            m_workspace->tile();
        }         
    }
    
    
    void QtFlowDesigner::saveDocumentClicked()
    {
        cerr<<"Save document clicked"<<endl;
        
        QtDocument *activeDocument = dynamic_cast<QtDocument*>(m_workspace->activeWindow());
        
        if (activeDocument)
        {
            cerr<<"ACTIVE DOCUMENT FOUND"<<endl;
            QFileDialog dialog(this);
            dialog.setFileMode(QFileDialog::AnyFile);
            
            QStringList filters;
            filters << "FlowDesigner Document (*.n)"
            << "Any files (*)";
            
            dialog.setFilters(filters); 
            dialog.setAcceptMode(QFileDialog::AcceptSave);
            if (dialog.exec())
            {
                QStringList fileNames = dialog.selectedFiles();
                
                for (QStringList::iterator iter = fileNames.begin();
                iter != fileNames.end(); iter++)
                {
                    activeDocument->save((*iter).toStdString());                                 
                }
            }
        }
        else
        {
            cerr<<"ACTIVE DOCUMENT NOT FOUND"<<endl;
		}
        
        
    }
    
    void QtFlowDesigner::loadDocument(const std::string &path)
    {
        QtDocument *doc =  new QtDocument(this,path);
        QWidget *window = m_workspace->addWindow(doc);
        window->setWindowTitle("test");
        m_workspace->setActiveWindow(window);
        window->show();            
        
    }      
    
}//namespace FD


syntax highlighted by Code2HTML, v. 0.9.1