You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/kivio/kiviopart/kiviosdk/kivio_connector_target.cpp

286 lines
6.6 KiB

/*
* Kivio - Visual Modelling and Flowcharting
* Copyright (C) 2000-2001 theKompany.com & Dave Marotti
*
* 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.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "kivio_common.h"
#include "kivio_connector_point.h"
#include "kivio_connector_target.h"
#include "kivio_point.h"
#include "kivio_stencil.h"
#include "kivio_intra_stencil_data.h"
#include <kdebug.h>
KivioConnectorTarget::KivioConnectorTarget()
: m_pConnectors(NULL)
{
m_position.setX( 0.0f );
m_position.setY( 0.0f );
m_pConnectors = new TQPtrList<KivioConnectorPoint>;
m_pConnectors->setAutoDelete(false);
m_id = -1;
m_xOffset = m_yOffset = 0;
}
KivioConnectorTarget::KivioConnectorTarget(double x, double y)
{
m_position.setX( x );
m_position.setY( y );
m_pConnectors = new TQPtrList<KivioConnectorPoint>;
m_pConnectors->setAutoDelete(false);
m_id = -1;
m_xOffset = m_yOffset = 0;
}
KivioConnectorTarget::KivioConnectorTarget(double x, double y, double xOffset, double yOffset)
{
m_position.setX( x );
m_position.setY( y );
m_pConnectors = new TQPtrList<KivioConnectorPoint>;
m_pConnectors->setAutoDelete(false);
m_id = -1;
setOffsets(xOffset, yOffset);
}
/**
* Duplicates this target.
*
* Duplicates this target, only the position. The connections
* are not preserved.
*/
KivioConnectorTarget *KivioConnectorTarget::duplicate()
{
KivioConnectorTarget *pTarget = new KivioConnectorTarget( m_position.x(), m_position.y(), m_xOffset, m_yOffset );
return pTarget;
}
/**
* Kill this object and disconnects all KivioConnectorPoints from this.
*
* This is a slightly odd function in that it does not call the disconnect() method
* of KivioConnectorPoint. The reason for this is that FIX ME DAVE!
*/
KivioConnectorTarget::~KivioConnectorTarget()
{
// Iterate through all connectors diconnecting them from this
KivioConnectorPoint *point;
if( m_pConnectors )
{
point = m_pConnectors->first();
point = m_pConnectors->take();
while( point )
{
kdDebug(43000) << "KivioConnectorTarget:: -> diconnecting" << endl;
// Disconnect the point. But tell the point to not call
// KivioConnectorTarget::removeConnectorFromList() because it will cause our
// position in the list to be screwed up.
point->disconnect( false );
point = m_pConnectors->take();
}
delete m_pConnectors;
m_pConnectors = NULL;
}
}
/**
* Loads this object from an XML file.
*/
bool KivioConnectorTarget::loadXML( const TQDomElement &e )
{
if( e.tagName().compare( "KivioConnectorTarget" ) != 0 )
{
kdDebug(43000) << "Attempted to load KivioConnectorTarget from non-KivioConnectorTarget element" << endl;
return false;
}
m_position.setX(XmlReadFloat( e, "x", 1.0f ));
m_position.setY(XmlReadFloat( e, "y", 1.0f ));
m_id = XmlReadInt( e, "id", -1 );
return true;
}
/**
* Saves this object to an XML file.
*/
TQDomElement KivioConnectorTarget::saveXML( TQDomDocument &doc )
{
TQDomElement e;
e = doc.createElement("KivioConnectorTarget");
XmlWriteFloat( e, "x", m_position.x() );
XmlWriteFloat( e, "y", m_position.y() );
if( m_id != -1 )
XmlWriteInt( e, "id", m_id );
return e;
}
/**
* Adds a KivioConnectorPoint to the list of connections.
*/
void KivioConnectorTarget::addConnectorPointToList( KivioConnectorPoint *p )
{
if( p )
m_pConnectors->append(p);
}
/**
* Removes a KivioConnectorPoint from the list of connections.
*
* Removes a KivioConnectorPoint from the list of connections. Note, it does
* not disconnect the point on the KivioConnectorPoint side. This function
* is mainly used by KivioConnectorPoint, and probably shouldn't be used by
* anything/one else unless you really know what you are doing.
*/
bool KivioConnectorTarget::removeConnectorPointFromList( KivioConnectorPoint *p )
{
if( !p )
return false;
return m_pConnectors->remove(p);
}
/**
* Sets a new position and updates all connected points.
*/
void KivioConnectorTarget::setX( float _x )
{
m_position.setX(_x);
KivioConnectorPoint *pPoint = m_pConnectors->first();
while( pPoint )
{
pPoint->setX( _x, true );
pPoint = m_pConnectors->next();
}
}
/**
* Sets a new position and updates all connected points.
*/
void KivioConnectorTarget::setY( float _y )
{
m_position.setY(_y);
KivioConnectorPoint *pPoint = m_pConnectors->first();
while( pPoint )
{
pPoint->setY( _y, true );
pPoint = m_pConnectors->next();
}
}
/**
* Sets a new position and updates all connected points.
*/
void KivioConnectorTarget::setPosition( float _x, float _y )
{
m_position.setX( _x );
m_position.setY( _y );
KivioConnectorPoint *pPoint = m_pConnectors->first();
while( pPoint )
{
pPoint->setPosition( _x, _y, true );
pPoint = m_pConnectors->next();
}
}
/**
* Issues paintOutline requests to all connected stencils.
*/
void KivioConnectorTarget::paintOutline( KivioIntraStencilData *pData )
{
KivioConnectorPoint *pPoint;
KivioStencil *pStencil;
pPoint = m_pConnectors->first();
while( pPoint )
{
pStencil = pPoint->stencil();
if( pStencil )
pStencil->paintOutline( pData );
pPoint = m_pConnectors->next();
}
}
/**
* Tests is this target has any connections.
*/
bool KivioConnectorTarget::hasConnections()
{
KivioConnectorPoint *pPoint = m_pConnectors->first();
if( pPoint )
return true;
return false;
}
/**
* Sets this target's unique ID, for generateIds() during a saveXML().
*/
void KivioConnectorTarget::setId( int i )
{
KivioConnectorPoint *pPoint = m_pConnectors->first();
m_id= i;
while( pPoint )
{
pPoint->setTargetId( i );
pPoint = m_pConnectors->next();
}
}
void KivioConnectorTarget::setOffsets(double x, double y)
{
m_xOffset = x;
m_yOffset = y;
}