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.
tdegraphics/kpovmodeler/pmobject.cpp

284 lines
6.6 KiB

/*
**************************************************************************
description
--------------------
copyright : (C) 2000-2003 by Andreas Zehender
email : zehender@kde.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. *
* *
**************************************************************************/
#include "pmobject.h"
#include "pmcontrolpoint.h"
#include "pmdialogeditbase.h"
#include "pmmemento.h"
#include "pmprototypemanager.h"
#include "pminsertrulesystem.h"
#include "pmpart.h"
PMDefinePropertyClass( PMObject, PMObjectProperty );
PMMetaObject* PMObject::s_pMetaObject = 0;
PMObject::PMObject( PMPart* part )
{
m_pParent = 0;
m_selected = false;
m_pPrevSibling = 0;
m_pNextSibling = 0;
m_pMemento = 0;
m_readOnly = false;
m_pPart = part;
if( !m_pPart )
kdError( PMArea ) << "PMObject::PMObject: The part may not be null" << endl;
}
PMObject::PMObject( const PMObject& o )
{
m_pParent = 0;
m_selected = false;
m_pPrevSibling = 0;
m_pNextSibling = 0;
m_pMemento = 0;
m_readOnly = false;
m_pPart = o.m_pPart;
}
PMObject::~PMObject( )
{
}
PMMetaObject* PMObject::metaObject( ) const
{
if( !s_pMetaObject )
{
s_pMetaObject = new PMMetaObject( "Object", 0 );
s_pMetaObject->addProperty(
new PMObjectProperty( "readOnly", &PMObject::setReadOnly, &PMObject::isReadOnly ) );
s_pMetaObject->addProperty(
new PMObjectProperty( "numberOfChildren", 0, &PMObject::countChildren ) );
}
return s_pMetaObject;
}
PMObject* PMObject::newObject( ) const
{
return metaObject( )->newObject( m_pPart );
}
bool PMObject::insertChildAfter( PMObject*, PMObject* )
{
kdError( PMArea ) << "Tried to insert object into a non composite object" << "\n";
return false;
}
bool PMObject::insertChildBefore( PMObject*, PMObject* )
{
kdError( PMArea ) << "Tried to insert object into a non composite object" << "\n";
return false;
}
void PMObject::setSelected( bool s )
{
if( m_selected != s )
{
if( s )
{
if( isSelectable( ) )
{
m_selected = true;
if( m_pParent )
m_pParent->adjustSelectedChildren( 1 );
}
}
else
{
m_selected = false;
if( m_pParent )
m_pParent->adjustSelectedChildren( -1 );
}
}
}
bool PMObject::isSelectable( )
{
bool is = true;
PMObject* o;
for( o = m_pParent; o && is; o = o->m_pParent )
if( o->isSelected( ) )
is = false;
return is;
}
bool PMObject::isReadOnly( ) const
{
if( m_readOnly )
return true;
if( m_pParent )
return m_pParent->isReadOnly( );
return false;
}
bool PMObject::takeChild( PMObject* )
{
kdError( PMArea ) << "Tried to remove object out of a non composite object" << "\n";
return false;
}
bool PMObject::takeChild( uint )
{
kdError( PMArea ) << "Tried to remove object out of a non composite object" << "\n";
return false;
}
PMDialogEditBase* PMObject::editWidget( TQWidget* parent ) const
{
return new PMDialogEditBase( parent );
// return 0;
}
void PMObject::createMemento( )
{
if( m_pMemento )
delete m_pMemento;
m_pMemento = new PMMemento( this );
}
PMMemento* PMObject::takeMemento( )
{
PMMemento* tmp = m_pMemento;
m_pMemento = 0;
return tmp;
}
void PMObject::restoreMemento( PMMemento* /* s */ )
{
// nothing to be done at the moment
}
PMMatrix PMObject::transformedWith( ) const
{
PMMatrix result = PMMatrix::identity( );
const PMObject* o = this;
if( o->firstChild( ) )
o = o->firstChild( );
else if( o->nextSibling( ) )
o = o->nextSibling( );
else
o = o->parent( );
while( o )
{
if( o->hasTransformationMatrix( ) )
result = o->transformationMatrix( ) * result;
if( o->nextSibling( ) )
o = o->nextSibling( );
else
o = o->parent( );
}
return result;
}
TQDomElement PMObject::serialize( TQDomDocument& doc ) const
{
TQDomElement e = doc.createElement( className( ).lower( ) );
serialize( e, doc );
return e;
}
void PMObject::readAttributes( const PMXMLHelper& )
{
}
void PMObject::cleanUp( ) const
{
if( s_pMetaObject )
{
delete s_pMetaObject;
s_pMetaObject = 0;
}
}
bool PMObject::setProperty( const TQString& name, const PMVariant& v )
{
PMPropertyBase* p = metaObject( )->property( name );
if( !p )
return false;
return p->setProperty( this, v );
}
TQStringList PMObject::properties( ) const
{
TQStringList lst;
PMPropertyIterator it = metaObject( )->properties( );
for( ; it.current( ); ++it )
lst.append( it.current( )->name( ) );
return lst;
}
PMVariant PMObject::property( const TQString& name ) const
{
PMPropertyBase* p = metaObject( )->property( name );
if( !p )
return PMVariant( );
return p->getProperty( this );
}
bool PMObject::isA( const TQString& className ) const
{
if( !m_pPart )
return false;
return m_pPart->prototypeManager( )->isA( metaObject( ), className );
}
TQString PMObject::type( ) const
{
return metaObject( )->className( );
}
bool PMObject::canInsert( const TQString& className, const PMObject* after,
const PMObjectList* objectsBetween ) const
{
if( !m_pPart )
return false;
return m_pPart->insertRuleSystem( )->canInsert( this, className, after, objectsBetween );
}
bool PMObject::canInsert( const PMObject* o, const PMObject* after,
const PMObjectList* objectsBetween ) const
{
if( !m_pPart )
return false;
return m_pPart->insertRuleSystem( )->canInsert( this, o, after, objectsBetween );
}
int PMObject::canInsert( const PMObjectList& list, const PMObject* after ) const
{
if( !m_pPart )
return false;
return m_pPart->insertRuleSystem( )->canInsert( this, list, after );
}
int PMObject::canInsert( const TQStringList& classes, const PMObject* after ) const
{
if( !m_pPart )
return false;
return m_pPart->insertRuleSystem( )->canInsert( this, classes, after );
}