#include "UINetworkController.h"
#include "UIDocumentController.h"
#include "UINodeController.h"
#include "UITerminalController.h"
#include "UINetTerminalController.h"
#include "UILinkController.h"
#include <iostream>
#include "QtNetwork.h"
#include "UILink.h"
#include "UINote.h"

namespace FD {
    
	using namespace std;
    
	UINetworkController::UINetworkController()
    :	UINetwork(NULL,NULL,false), m_QtNetwork(NULL)
	{
        
        
	}
    
	UINetworkController::UINetworkController(UIDocumentController *_doc, xmlNodePtr net)
    : UINetwork(_doc,net,false), m_QtNetwork(NULL)
	{
		//Load XML		
		load(net);	
	}
	
	UINetworkController::UINetworkController(UIDocumentController *doc, const std::string &_name, UINetwork::Type type)
    : UINetwork(doc,_name,type), m_QtNetwork(NULL)
	{
        
        
	}
	
	UINode* UINetworkController::newNode(UINetwork* _net, std::string _name, 
    std::string _type, double _x, double _y, bool doInit)
	{
        
		cerr<<"UINode* UINetworkController::newNode "<<endl;
        getDocument()->updateAllNetworks();
		//CREATE MODEL & CONTROLLER
		UINodeController *nodeController = new UINodeController(dynamic_cast<UINetworkController*>(_net),_name,_type,_x,_y);
        
		//UPDATE VIEW
		//TO DO, UPDATE MULTIPLE VIEWS?
		if (m_QtNetwork)
		{
			//QtNode *qtNode = m_QtNetwork->addNode(nodeController);
            //nodeController->setQtNode(qtNode);
		}
        
        nodeController->updateView(m_QtNetwork);	
        
        
        //UPDATE VIEW 
        //nodeController->updateTerminals();
        //nodeController->updateParameters();
        
        
		return nodeController;
	}
    
    UINode* UINetworkController::newNode(UINetwork* _net, xmlNodePtr def)
    {
		cerr<<"UINode* UINetworkController::newNode (XML)"<<endl;
        
		//CREATE MODEL & CONTROLLER
		UINodeController *nodeController = new UINodeController(dynamic_cast<UINetworkController*>(_net),def);
        
		//UPDATE VIEW
		//TO DO, UPDATE MULTIPLE VIEWS?
		if (m_QtNetwork)
		{
            nodeController->updateView(m_QtNetwork);
			//QtNode *qtNode = m_QtNetwork->addNode(nodeController);
            //nodeController->setQtNode(qtNode);
		}
        else
        {
            cerr<<"WARNING :  UINode* UINetworkController::newNode --> No QtNetwork defined."<<endl;
        }
        
        //UPDATE VIEW 
        //nodeController->updateTerminals();
        //nodeController->updateParameters();
        
        return nodeController;
    }
    
    
    
	UILink* UINetworkController::newLink (UITerminal *_from, UITerminal *_to,const char *str)
	{
		cerr<<"UILink* UINetworkController::newLink"<<endl;
		
		//CREATE MODEL & CONTROLLER
		//UILinkController *linkController = new UILinkController(dynamic_cast<UITerminalController*>(_from),
		//														);
        UILinkController *linkController = new UILinkController(dynamic_cast<UITerminalController*>(_from),dynamic_cast<UITerminalController*>(_to),str);
        linkController->updateView( m_QtNetwork );
		return linkController;
	}
    
	UINote* UINetworkController::newNote(const std::string &text, double x, double y, bool visible)
	{
		return new UINote(text,x,y,visible);	
	}
    
	UINetTerminal * UINetworkController::newNetTerminal (UITerminal *_terminal, UINetTerminal::NetTermType _type, const std::string &_name, 
    const std::string &_objType, const std::string &_description)
	{
		return new UINetTerminalController(dynamic_cast<UITerminalController*>(_terminal),_type,_name,_objType,_description);		  
	}
	
	UINodeController* UINetworkController::createNode(std::string type, double x, double y, bool doInit)
	{
		UINodeController* myNode = dynamic_cast<UINodeController*>(newNode(this,"name",type,x,y,doInit));
		addNode(myNode);	
		return myNode;
	}
    
    void UINetworkController::removeNode(UINodeController* node)
    {        
        cerr<<"UINetworkController::removeNode(UINodeController* node)"<<endl;
        std::vector<UITerminal*> terminal = node->getInputs();
        for( unsigned int i = 0; i < terminal.size();i++ )
        {       
            node->removeTerminal( dynamic_cast<UITerminalController*>(terminal[i]) );
        }
        terminal = node->getOutputs();
        for( unsigned int i = 0; i < terminal.size();i++ )
        {       
            node->removeTerminal( dynamic_cast<UITerminalController*>(terminal[i]) );
        }
        
        m_QtNetwork->removeNode(node->getQtNode());
        UINetwork::removeNode(node);
        cerr<<"UINetworkController::removeNode(UINodeController* node) END"<<endl;
    }
    
    void UINetworkController::removeLink(UILinkController* link)
    {
        m_QtNetwork->removeLink(link->getQtLink());
        UINetwork::removeLink(link);
    }
	
    void UINetworkController::updateView(QtDocument *doc)
    {        
        getDocument()->updateAllNetworks();
        if (doc)
        {
            //CREATE VIEW IF REQUIRED
            if (!m_QtNetwork)
            {
                m_QtNetwork = doc->addNetwork(this);
            }
            
            //UPDATE VIEW FOR EACH NODES
            for (unsigned int i =0; i < nodes.size(); i++)
            {
                UINodeController *nodeCtrl = dynamic_cast<UINodeController*>(nodes[i]);
                
                if (nodeCtrl)
                {                    
                    nodeCtrl->updateView(m_QtNetwork);
                }
                
            }
            
            //UPDATE VIEW FOR EACH LINKS
            for (unsigned int i = 0; i < links.size(); i++)
            {
                UILinkController *linkCtrl = dynamic_cast<UILinkController*>(links[i]);
                
                if (linkCtrl)
                {
                    linkCtrl->updateView(m_QtNetwork);
                }
                
            }
        }//if doc
    }
    
} //namespace FD



syntax highlighted by Code2HTML, v. 0.9.1