/*************************************************************************** * Copyright (C) 2003-2005 by David Saxton * * david@bluehaze.org * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * ***************************************************************************/ #ifndef NODE_H #define NODE_H #include #include class CNItem; class Item; class ICNDocument; class ICNDocument; class Connector; class Node; class NodeData; class NodeGroup; class TQTimer; typedef TQValueList > ConnectorList; typedef TQValueList > NodeList; /** @short A standard node that can be associated with a Connector or a CNItem @author David Saxton */ class Node : public TQObject, public TQCanvasPolygon { Q_OBJECT public: /** * Used for run-time identification of the node: * Can be electronic node (so has values of current, voltage, etc) * or a pic part node */ enum node_type { ec_pin, ec_junction, fp_in, fp_out, fp_junction }; enum node_dir { dir_up = 270, dir_right = 0, dir_down = 90, dir_left = 180 }; Node( ICNDocument *icnDocument, Node::node_type type, node_dir dir, const TQPoint &pos, TQString *id = 0L ); virtual ~Node(); /** * Sets the node's visibility, as well as updating the visibility of the * attached connectors as appropriate */ virtual void setVisible( bool yes ); /** * Returns the global id, that is unique to the node * amongst all the nodes on the canvas */ const TQString id() const { return m_id; } /** * Returns the id that is internal to the CNItem to which the * node belongs to. Returns a null TQString if no parentitem */ const TQString childId() const { return m_childId; } /** * Use this function to set the child-id, that is unique to the node * amongst the other nodes associated with its parent CNItem */ void setChildId( const TQString &id ) { m_childId = id; } /** * Returns the run-time-type-identifier of ICNDocument::RTTI::Node */ virtual int rtti() const; /** * Sets the "level" of the node. By default, the level is 0. The level of * the node tells the node what CNItems it can be connected to through * a connector. * @see level */ virtual void setLevel( const int level ); /** * Returns the level of the nodes * @see setLevel */ int level() const { return m_level; } /** * Use this to identify the type of node - eg ECNode or FPNode */ node_type type() const { return m_type; } /** * Returns true if the node can accept input connections. This will depend * on the node type and number of input / output connections. */ bool acceptInput() const; /** * Returns true if the node can accept output connections. This will depend * on the node type and number of input / output connections. */ bool acceptOutput() const; /** * Sets the orientation of the node. */ void setOrientation( node_dir dir ); /** * Associates a CNItem with the node - ie the node belongs to the CNItem, * and hence gets deleted when the CNItem gets deleted.s */ virtual void setParentItem( CNItem *parentItem ); /** * Returns true if the node is part of a CNItem * (i.e. not between multiple connectors) */ bool isChildNode() const { return (p_parentItem != 0L); } /** * Returns a pointer to the CNItem to which the node belongs, * or Null if it doesn't. */ CNItem *parentItem() const { return p_parentItem; } /** * Remove a specific connector */ void removeConnector( Connector *connector ); /** * Creates a new connector, sets this as the end node to the connector * (i.e. this node is the connector's input node), and returns a pointer * to the connector. */ Connector* createInputConnector( Node * startNode ); /** * Registers an input connector (i.e. this is the end node) as connected * to this node. */ void addInputConnector( Connector * const connector ); /** * Registers an input connector (i.e. this is the start node) as connected * to this node. */ void addOutputConnector( Connector * const connector ); /** * Returns the total number of connections to the node. This is the number * of input connectors, the number of output connectors, and the parent * item connector if it exists and is requested. * @param includeParentItem Count the parent item as a connector if it exists * @param includeHiddenConnectors hidden connectors are those as e.g. part of a subcircuit */ int numCon( bool includeParentItem, bool includeHiddenConnectors ) const; NodeData nodeData() const; ConnectorList inputConnectorList() const { return m_inputConnectorList; } ConnectorList outputConnectorList() const { return m_outputConnectorList; } void setNodeGroup( NodeGroup *ng ) { p_nodeGroup = ng; } NodeGroup *nodeGroup() const { return p_nodeGroup; } /** * Returns true if this node is connected (or is the same as) the node given * by other connectors or nodes (although not through CNItems) * checkedNodes is a list of nodes that have already been checked for * being the connected nodes, and so can simply return if they are in there. * If it is null, it will assume that it is the first ndoe & will create a list */ bool isConnected( Node *node, NodeList *checkedNodes = 0L ); void removeNullConnectors(); /** * Draw shape. Note that this has to remain public. */ virtual void drawShape( TQPainter &p ) = 0; public slots: void moveBy( double dx, double dy ); void removeNode(Item*) { removeNode(); } void removeNode(); void checkForRemoval( Connector *connector ); void setNodeSelected( bool yes ); signals: void moved( Node *node ); /** * Emitted when the CNItem is removed. Normally, this signal is caught by associated * nodes, who will remove themselves as well. */ void removed( Node* node ); protected: /** If this node has precisely two connectors emerging from it, then this * function will trace thw two connectors until the point where they * diverge; this point is returned. */ TQPoint findConnectorDivergePoint( bool * found ); void initPoints(); bool handleNewConnector( Connector * newConnector ); node_type m_type; TQString m_id; TQString m_childId; node_dir m_dir; ICNDocument *p_icnDocument; CNItem *p_parentItem; ConnectorList m_inputConnectorList; ConnectorList m_outputConnectorList; int m_level; NodeGroup *p_nodeGroup; TQColor m_selectedColor; private: bool b_deleted; }; #endif