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_group_stencil.cpp

749 lines
16 KiB

/*
* Kivio - Visual Modelling and Flowcharting
* Copyright (C) 2000-2004 theKompany.com & Dave Marotti
* Peter Simonsson
*
* 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_group_stencil.h"
#include "kivio_intra_stencil_data.h"
#include "kivio_layer.h"
#include <kdebug.h>
#include <KoGlobal.h>
KivioGroupStencil::KivioGroupStencil()
: KivioStencil(),
m_pGroupList(NULL)
{
m_pGroupList = new TQPtrList<KivioStencil>;
m_pGroupList->setAutoDelete(true);
m_x = m_y = 1000000000000.0f;
m_w = m_h = -10000000000.0f;
setType(kstGroup);
}
KivioGroupStencil::~KivioGroupStencil()
{
if( m_pGroupList )
{
delete m_pGroupList;
m_pGroupList = NULL;
}
}
void KivioGroupStencil::paint( KivioIntraStencilData *pData )
{
// Draw the group
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
pStencil->paint(pData);
pStencil = m_pGroupList->next();
}
}
void KivioGroupStencil::paintOutline( KivioIntraStencilData *pData )
{
// Draw the group in outline mode
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
pStencil->paintOutline(pData);
pStencil = m_pGroupList->next();
}
}
void KivioGroupStencil::paintConnectorTargets( KivioIntraStencilData *pData )
{
// Draw the group in outline mode
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
pStencil->paintConnectorTargets(pData);
pStencil = m_pGroupList->next();
}
}
void KivioGroupStencil::setFGColor( TQColor c )
{
// Draw the group in outline mode
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
pStencil->setFGColor(c);
pStencil = m_pGroupList->next();
}
}
void KivioGroupStencil::setBGColor( TQColor c )
{
// Draw the group in outline mode
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
pStencil->setBGColor(c);
pStencil = m_pGroupList->next();
}
}
void KivioGroupStencil::setLineWidth( double f )
{
// Draw the group in outline mode
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
pStencil->setLineWidth(f);
pStencil = m_pGroupList->next();
}
}
KivioCollisionType KivioGroupStencil::checkForCollision( KoPoint *p, double threshold )
{
KivioCollisionType colType;
// Draw the group in outline mode
KivioStencil *pStencil = m_pGroupList->last();
while( pStencil )
{
colType = pStencil->checkForCollision( p, threshold );
if( colType != kctNone && pStencil->type()!=kstConnector) {
return colType;
}
pStencil = m_pGroupList->prev();
}
return kctNone;
}
void KivioGroupStencil::addToGroup( KivioStencil *pStencil )
{
double left, right, top, bottom;
m_pGroupList->append(pStencil);
// Special case it
if( m_pGroupList->count() == 1 )
{
m_x = pStencil->x();
m_y = pStencil->y();
m_w = pStencil->w();
m_h = pStencil->h();
}
else
{
right = pStencil->x() + pStencil->w();
left = pStencil->x();
top = pStencil->y();
bottom = pStencil->y() + pStencil->h();
// Adjust the borders to new limits
if( left < m_x )
{
m_w = m_w + (m_x - left);
m_x = left;
}
if( right > m_x + m_w )
{
m_w = right - m_x;
}
if( top < m_y )
{
m_h = m_h + (m_y - top);
m_y = top;
}
if( bottom > m_y + m_h )
{
m_h = bottom - m_y;
}
}
}
KivioStencil *KivioGroupStencil::duplicate()
{
KivioGroupStencil *pGroup;
KivioStencil *pStencil;
pGroup = new KivioGroupStencil();
pStencil = m_pGroupList->first();
while( pStencil )
{
pGroup->addToGroup( pStencil->duplicate() );
pStencil = m_pGroupList->next();
}
*(pGroup->protection()) = *m_pProtection;
return pGroup;
}
bool KivioGroupStencil::loadXML( const TQDomElement &e, KivioLayer *pLayer )
{
TQDomNode node;
KivioStencil *pStencil;
node = e.firstChild();
while( !node.isNull() )
{
TQString name = node.nodeName();
if( name == "KivioGroupStencil" )
{
pStencil = pLayer->loadGroupStencil( node.toElement() );
if( pStencil )
{
addToGroup( pStencil );
}
else
{
kdDebug(43000) << "KivioGroupStencil::loadXML() - Error loading group stencil" << endl;
}
}
else if( name == "KivioSMLStencil" || name == "KivioPyStencil" )
{
pStencil = pLayer->loadSMLStencil( node.toElement() );
if( pStencil )
{
addToGroup( pStencil );
}
else
{
kdDebug(43000) << "KivioGroupStencil::loadXML() - Error loading group stencil" << endl;
}
}
else if( name == "KivioPluginStencil" )
{
KivioStencil *pStencil = pLayer->loadPluginStencil( node.toElement() );
if( pStencil )
{
addToGroup( pStencil );
}
else
{
kdDebug(43000) << "KivioGroupStencil::loadXML() - Error loading group stencil" << endl;
}
}
node = node.nextSibling();
}
return true;
}
TQDomElement KivioGroupStencil::saveXML( TQDomDocument &doc )
{
TQDomElement e = doc.createElement("KivioGroupStencil");
TQDomElement stencilE;
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
stencilE = pStencil->saveXML( doc );
e.appendChild( stencilE );
pStencil = m_pGroupList->next();
}
return e;
}
void KivioGroupStencil::setX( double newX )
{
double dx = newX - m_x;
m_x = newX;
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
if( pStencil->protection()->at(kpX)==false )
{
pStencil->setX( pStencil->x() + dx );
}
pStencil = m_pGroupList->next();
}
}
void KivioGroupStencil::setY( double newY )
{
double dy = newY - m_y;
m_y = newY;
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
if( pStencil->protection()->at(kpY)==false )
{
pStencil->setY( pStencil->y() + dy );
}
pStencil = m_pGroupList->next();
}
}
void KivioGroupStencil::setPosition( double newX, double newY )
{
double dx = newX - m_x;
double dy = newY - m_y;
double newX2, newY2;
m_x = newX;
m_y = newY;
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
if(((pStencil->type() == kstConnector) && !pStencil->connected()) ||
pStencil->type() != kstConnector)
{
if( pStencil->protection()->at(kpX)==false ) {
newX2 = pStencil->x() + dx;
} else {
newX2 = pStencil->x();
}
if( pStencil->protection()->at(kpY)==false ) {
newY2 = pStencil->y() + dy;
} else {
newY2 = pStencil->y();
}
pStencil->setPosition( newX2, newY2 );
}
pStencil = m_pGroupList->next();
}
}
void KivioGroupStencil::setW( double newW )
{
double percInc = newW / m_w;
if( newW > 0.0f ) {
m_w = newW;
}
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
if(((pStencil->type() == kstConnector) && !pStencil->connected()) ||
pStencil->type() != kstConnector)
{
if( pStencil->protection()->at(kpX)==false ) {
pStencil->setX( ((pStencil->x() - m_x) * percInc) + m_x );
}
if( pStencil->protection()->at(kpWidth)==false ) {
pStencil->setW( pStencil->w() * percInc );
}
}
pStencil = m_pGroupList->next();
}
}
void KivioGroupStencil::setH( double newH )
{
double percInc = newH / m_h;
if( newH > 0.0f ) {
m_h = newH;
}
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
if(((pStencil->type() == kstConnector) && !pStencil->connected()) ||
pStencil->type() != kstConnector)
{
if( pStencil->protection()->at(kpY)==false ) {
pStencil->setY( ((pStencil->y() - m_y) * percInc) + m_y );
}
if( pStencil->protection()->at(kpHeight)==false ) {
pStencil->setH( pStencil->h() * percInc );
}
}
pStencil = m_pGroupList->next();
}
}
void KivioGroupStencil::setDimensions( double newW, double newH )
{
double percIncX = newW / m_w;
double percIncY = newH / m_h;
if( newW > 0.0f ) {
m_w = newW;
}
if( newH > 0.0f ) {
m_h = newH;
}
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
if(((pStencil->type() == kstConnector) && !pStencil->connected()) ||
pStencil->type() != kstConnector)
{
if( newW > 0.0f ) {
if( pStencil->protection()->at(kpX)==false ) {
pStencil->setX( ((pStencil->x() - m_x) * percIncX) + m_x );
}
if( pStencil->protection()->at(kpWidth)==false ) {
pStencil->setW( pStencil->w() * percIncX );
}
}
if( newH > 0.0f ) {
if( pStencil->protection()->at(kpY)==false ) {
pStencil->setY( ((pStencil->y() - m_y) * percIncY) + m_y );
}
if( pStencil->protection()->at(kpHeight)==false ) {
pStencil->setH( pStencil->h() * percIncY );
}
}
}
pStencil = m_pGroupList->next();
}
}
int KivioGroupStencil::generateIds( int next )
{
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
next = pStencil->generateIds( next );
pStencil = m_pGroupList->next();
}
return next;
}
KivioConnectorTarget *KivioGroupStencil::connectToTarget( KivioConnectorPoint *p, double thresh)
{
KivioConnectorTarget *pTarget;
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
pTarget = pStencil->connectToTarget( p, thresh );
if( pTarget )
return pTarget;
pStencil = m_pGroupList->next();
}
return NULL;
}
KivioConnectorTarget *KivioGroupStencil::connectToTarget( KivioConnectorPoint *p, int id )
{
KivioConnectorTarget *pTarget;
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
pTarget = pStencil->connectToTarget( p, id );
if( pTarget )
return pTarget;
pStencil = m_pGroupList->next();
}
return NULL;
}
void KivioGroupStencil::searchForConnections( KivioPage *p )
{
KivioStencil *pCur = 0;
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
// Backup the current list position
pCur = pStencil;
pStencil->searchForConnections( p );
// Restore it
m_pGroupList->tqfind( pCur );
pStencil = m_pGroupList->next();
}
}
void KivioGroupStencil::setTextColor( TQColor c )
{
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
pStencil->setTextColor(c);
pStencil = m_pGroupList->next();
}
}
void KivioGroupStencil::setText( const TQString &text )
{
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
pStencil->setText(text);
pStencil = m_pGroupList->next();
}
}
TQString KivioGroupStencil::text()
{
KivioStencil *pStencil = m_pGroupList->first();
if( !pStencil )
return TQString("");
return pStencil->text();
}
void KivioGroupStencil::setHTextAlign( int a )
{
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
pStencil->setHTextAlign(a);
pStencil = m_pGroupList->next();
}
}
int KivioGroupStencil::hTextAlign()
{
KivioStencil *pStencil = m_pGroupList->first();
if( !pStencil )
return TQt::AlignHCenter;
return pStencil->hTextAlign();
}
void KivioGroupStencil::setVTextAlign( int a )
{
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
pStencil->setVTextAlign(a);
pStencil = m_pGroupList->next();
}
}
int KivioGroupStencil::vTextAlign()
{
KivioStencil *pStencil = m_pGroupList->first();
if( !pStencil )
return TQt::AlignVCenter;
return pStencil->vTextAlign();
}
void KivioGroupStencil::setTextFont( const TQFont &f )
{
KivioStencil *pStencil = m_pGroupList->first();
while( pStencil )
{
pStencil->setTextFont(f);
pStencil = m_pGroupList->next();
}
}
TQFont KivioGroupStencil::textFont()
{
KivioStencil *pStencil = m_pGroupList->first();
if( !pStencil )
return KoGlobal::defaultFont();
return pStencil->textFont();
}
TQColor KivioGroupStencil::textColor()
{
KivioStencil *pStencil = m_pGroupList->first();
if( !pStencil )
return TQColor(0, 0, 0);
return pStencil->textColor();
}
int KivioGroupStencil::resizeHandlePositions()
{
return KIVIO_RESIZE_HANDLE_POSITION_ALL;
}
TQString KivioGroupStencil::getTextBoxName(const KoPoint& p)
{
int id = checkForCollision(p);
if(id < 0) {
return TQString();
}
KivioStencil* pStencil = m_pGroupList->at(id);
TQString name = TQString::number(id) + "-" + pStencil->getTextBoxName(p);
return name;
}
void KivioGroupStencil::setText(const TQString& text, const TQString& name)
{
int id = name.section("-", 0, 0).toInt();
TQString n = name.section("-", 1);
m_pGroupList->at(id)->setText(text, n);
}
TQString KivioGroupStencil::text(const TQString& name)
{
int id = name.section("-", 0, 0).toInt();
TQString n = name.section("-", 1);
return m_pGroupList->at(id)->text(n);
}
int KivioGroupStencil::checkForCollision(const KoPoint& p)
{
KivioStencil *pStencil = m_pGroupList->first();
KoPoint pos = p;
int id = 0;
while(pStencil)
{
if(pStencil->checkForCollision(&pos, 4.0) != kctNone) {
return id;
}
pStencil = m_pGroupList->next();
id++;
}
return -1;
}
bool KivioGroupStencil::hasTextBox() const
{
KivioStencil *pStencil = m_pGroupList->first();
while(pStencil)
{
if(pStencil->hasTextBox()) {
return true;
}
pStencil = m_pGroupList->next();
}
return false;
}
TQColor KivioGroupStencil::textColor(const TQString& textBoxName)
{
int id = textBoxName.section("-", 0, 0).toInt();
TQString n = textBoxName.section("-", 1);
return m_pGroupList->at(id)->textColor(n);
}
void KivioGroupStencil::setTextColor(const TQString& textBoxName, const TQColor& color)
{
int id = textBoxName.section("-", 0, 0).toInt();
TQString n = textBoxName.section("-", 1);
m_pGroupList->at(id)->setTextColor(n, color);
}
TQFont KivioGroupStencil::textFont(const TQString& textBoxName)
{
int id = textBoxName.section("-", 0, 0).toInt();
TQString n = textBoxName.section("-", 1);
return m_pGroupList->at(id)->textFont(n);
}
void KivioGroupStencil::setTextFont(const TQString& textBoxName, const TQFont& font)
{
int id = textBoxName.section("-", 0, 0).toInt();
TQString n = textBoxName.section("-", 1);
m_pGroupList->at(id)->setTextFont(n, font);
}
int KivioGroupStencil::hTextAlign(const TQString& textBoxName)
{
int id = textBoxName.section("-", 0, 0).toInt();
TQString n = textBoxName.section("-", 1);
return m_pGroupList->at(id)->hTextAlign(n);
}
int KivioGroupStencil::vTextAlign(const TQString& textBoxName)
{
int id = textBoxName.section("-", 0, 0).toInt();
TQString n = textBoxName.section("-", 1);
return m_pGroupList->at(id)->vTextAlign(n);
}
void KivioGroupStencil::setHTextAlign(const TQString& textBoxName, int align)
{
int id = textBoxName.section("-", 0, 0).toInt();
TQString n = textBoxName.section("-", 1);
m_pGroupList->at(id)->setHTextAlign(n, align);
}
void KivioGroupStencil::setVTextAlign(const TQString& textBoxName, int align)
{
int id = textBoxName.section("-", 0, 0).toInt();
TQString n = textBoxName.section("-", 1);
m_pGroupList->at(id)->setVTextAlign(n, align);
}