diff options
Diffstat (limited to 'kpovmodeler/pmoutputdevice.cpp')
-rw-r--r-- | kpovmodeler/pmoutputdevice.cpp | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/kpovmodeler/pmoutputdevice.cpp b/kpovmodeler/pmoutputdevice.cpp new file mode 100644 index 00000000..5feb8ec2 --- /dev/null +++ b/kpovmodeler/pmoutputdevice.cpp @@ -0,0 +1,203 @@ +/* +************************************************************************** + 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 "pmoutputdevice.h" +#include "pmpovrayformat.h" +#include <qtextstream.h> +#include <klocale.h> + +unsigned int PMOutputDevice::s_indentOffset = 3; +bool PMOutputDevice::s_bracketBehindType = true; + +PMOutputDevice::PMOutputDevice( QIODevice* dev, PMPovrayFormat* format ) + : PMSerializer( dev ), m_stream( dev ) +{ + m_pFormat = format; + m_indentation = 0; + m_lastWasComment = false; + m_pendingNewLine = false; + m_objectSeparation = false; +} + +PMOutputDevice::~PMOutputDevice( ) +{ +} + +QString PMOutputDevice::description( ) const +{ + return QString( "POV-Ray" ); +} + +void PMOutputDevice::callSerialization( const PMObject* o, const PMMetaObject* mo ) +{ + if( !mo ) + return; + + const PMPovraySerializeMethodInfo* info = + m_pFormat->serializationMethod( mo->className( ) ); + + if( info ) + info->call( o, mo, this ); + else + { + if( mo == o->metaObject( ) ) + { + printError( i18n( "The object \"%1\" doesn't support %2." ) + .arg( o->description( ) ).arg( description( ) ) ); + } + else + { + printError( i18n( "The class \"%1\" doesn't support %2." ) + .arg( o->description( ) ).arg( mo->className( ) ) ); + } + } +} + +void PMOutputDevice::serialize( PMObject* o ) +{ + callSerialization( o, o->metaObject( ) ); +} + +void PMOutputDevice::close( ) +{ +// m_stream << ( char ) 0; +} + +void PMOutputDevice::objectBegin( const QString& type ) +{ + if( m_pendingNewLine ) + newLine( ); + if( m_objectSeparation ) + newLine( ); + m_stream << type; + if( s_bracketBehindType ) + m_stream << " "; + else + newLine( ); + + m_stream << "{"; + m_indentation++; + m_indentString.fill( ' ', s_indentOffset * m_indentation ); + m_pendingNewLine = true; + m_objectSeparation = false; +} + +void PMOutputDevice::declareBegin( const QString& id ) +{ + if( m_pendingNewLine ) + newLine( ); + if( m_objectSeparation ) + newLine( ); + m_stream << "#declare " << id << " = "; + + m_objectSeparation = false; +} + +void PMOutputDevice::objectEnd( ) +{ + m_indentation--; + m_indentString.fill( ' ', s_indentOffset * m_indentation ); + newLine( ); + m_stream << "}"; + m_pendingNewLine = true; + m_objectSeparation = true; +} + +void PMOutputDevice::writeLine( const QString& str ) +{ + if( m_pendingNewLine ) + newLine( ); + m_stream << str; + m_pendingNewLine = true; + m_objectSeparation = true; +} + +void PMOutputDevice::write( const QString& str ) +{ + if( m_pendingNewLine ) + newLine( ); + m_stream << str; + m_objectSeparation = false; +} + +void PMOutputDevice::newLine( ) +{ + m_lastWasComment = false; + m_pendingNewLine = false; + m_stream << '\n' << m_indentString; +} + +void PMOutputDevice::writeComment( const QString& text ) +{ + QString s( text ); + QTextStream str( &s, IO_ReadOnly ); + + bool lwc = m_lastWasComment; + if( m_pendingNewLine ) + newLine( ); + if( lwc ) + newLine( ); + if( m_objectSeparation ) + newLine( ); + if( str.atEnd( ) ) + writeLine( "//" ); + else + while( !str.atEnd( ) ) + writeLine( QString( "// " ) + str.readLine( ) ); + m_lastWasComment = true; + m_objectSeparation = false; +} + +void PMOutputDevice::writeSemicolon( ) +{ + // does not change m_pendingNewLine! + m_stream << ';'; +} + +void PMOutputDevice::writeName( const QString& name ) +{ + if( !name.isEmpty( ) ) + writeLine( QString( "//*PMName " ) + name ); +} + +QString PMOutputDevice::escapeAndQuoteString( const QString& s ) +{ + QString result = "\""; + QString tmp = s; + QTextStream stream( &tmp, IO_ReadOnly ); + QChar current, last; + + while( !stream.atEnd( ) ) + { + stream >> current ; + // not escaped quotation mark + if( ( current == '"' ) && ( last != '\\' ) ) + result += '\\'; + result += current; + // correctly quoted backslash + if( ( last == '\\' ) && ( current == '\\' ) ) + current = QChar( 0 ); // clear the last char + last = current; + } + // backslash at the end + if( last == '\\' ) + result += '\\'; + result += '"'; + + return result; +} |