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/pmoutputdevice.cpp

204 lines
4.9 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 "pmoutputdevice.h"
#include "pmpovrayformat.h"
#include <textstream.h>
#include <klocale.h>
unsigned int PMOutputDevice::s_indentOffset = 3;
bool PMOutputDevice::s_bracketBehindType = true;
PMOutputDevice::PMOutputDevice( TQIODevice* 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( )
{
}
TQString PMOutputDevice::description( ) const
{
return TQString( "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 TQString& 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 TQString& 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 TQString& str )
{
if( m_pendingNewLine )
newLine( );
m_stream << str;
m_pendingNewLine = true;
m_objectSeparation = true;
}
void PMOutputDevice::write( const TQString& 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 TQString& text )
{
TQString s( text );
TQTextStream 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( TQString( "// " ) + str.readLine( ) );
m_lastWasComment = true;
m_objectSeparation = false;
}
void PMOutputDevice::writeSemicolon( )
{
// does not change m_pendingNewLine!
m_stream << ';';
}
void PMOutputDevice::writeName( const TQString& name )
{
if( !name.isEmpty( ) )
writeLine( TQString( "//*PMName " ) + name );
}
TQString PMOutputDevice::escapeAndQuoteString( const TQString& s )
{
TQString result = "\"";
TQString tmp = s;
TQTextStream stream( &tmp, IO_ReadOnly );
TQChar current, last;
while( !stream.atEnd( ) )
{
stream >> current ;
// not escaped quotation mark
if( ( current == '"' ) && ( last != '\\' ) )
result += '\\';
result += current;
// correctly quoted backslash
if( ( last == '\\' ) && ( current == '\\' ) )
current = TQChar( 0 ); // clear the last char
last = current;
}
// backslash at the end
if( last == '\\' )
result += '\\';
result += '"';
return result;
}