okular/generators/ooo/formatproperty.cpp
2018-08-31 12:23:45 +03:00

441 lines
10 KiB
C++

/***************************************************************************
* Copyright (C) 2006 by Tobias Koenig <tokoe@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 "formatproperty.h"
#include <QTextFormat>
#include "styleinformation.h"
using namespace OOO;
FontFormatProperty::FontFormatProperty()
: mFamily( QStringLiteral("Nimbus Sans L") )
{
}
void FontFormatProperty::apply( QTextFormat *format ) const
{
format->setProperty( QTextFormat::FontFamily, mFamily );
}
void FontFormatProperty::setFamily( const QString &name )
{
mFamily = name;
}
ParagraphFormatProperty::ParagraphFormatProperty()
: mPageNumber( 0 ), mWritingMode( LRTB ), mAlignment( Qt::AlignLeft ),
mHasAlignment( false )
{
}
void ParagraphFormatProperty::apply( QTextFormat *format ) const
{
if ( mWritingMode == LRTB || mWritingMode == TBLR || mWritingMode == LR || mWritingMode == TB )
format->setLayoutDirection( Qt::LeftToRight );
else
format->setLayoutDirection( Qt::RightToLeft );
if ( mHasAlignment ) {
static_cast<QTextBlockFormat*>( format )->setAlignment( mAlignment );
}
format->setProperty( QTextFormat::FrameWidth, 595 );
static_cast<QTextBlockFormat*>( format )->setLeftMargin( mLeftMargin );
if ( mBackgroundColor.isValid() )
format->setBackground( mBackgroundColor );
}
void ParagraphFormatProperty::setPageNumber( int number )
{
mPageNumber = number;
}
void ParagraphFormatProperty::setWritingMode( WritingMode mode )
{
mWritingMode = mode;
}
bool ParagraphFormatProperty::writingModeIsRightToLeft() const
{
return ( ( mWritingMode == RLTB ) || ( mWritingMode == TBRL ) || ( mWritingMode == RL ) );
}
void ParagraphFormatProperty::setTextAlignment( Qt::Alignment alignment )
{
mHasAlignment = true;
mAlignment = alignment;
}
void ParagraphFormatProperty::setBackgroundColor( const QColor &color )
{
mBackgroundColor = color;
}
void ParagraphFormatProperty::setLeftMargin( const qreal margin )
{
mLeftMargin = margin;
}
TextFormatProperty::TextFormatProperty()
: mStyleInformation( nullptr ), mHasFontSize( false ),
mFontWeight( -1 ), mFontStyle( -1 ), mTextPosition( 0 )
{
}
TextFormatProperty::TextFormatProperty( const StyleInformation *information )
: mStyleInformation( information ), mHasFontSize( false ),
mFontWeight( -1 ), mFontStyle( -1 ), mTextPosition( 0 )
{
}
void TextFormatProperty::apply( QTextCharFormat *format ) const
{
if ( !mFontName.isEmpty() ) {
if ( mStyleInformation ) {
const FontFormatProperty property = mStyleInformation->fontProperty( mFontName );
property.apply( format );
}
}
if ( mFontWeight != -1 ) {
QFont font = format->font();
font.setWeight( mFontWeight );
format->setFont( font );
}
if ( mHasFontSize ) {
QFont font = format->font();
font.setPointSize( mFontSize );
format->setFont( font );
}
if ( mFontStyle != -1 ) {
QFont font = format->font();
font.setStyle( (QFont::Style)mFontStyle );
format->setFont( font );
}
if ( mColor.isValid() )
format->setForeground( mColor );
if ( mBackgroundColor.isValid() )
format->setBackground( mBackgroundColor );
// TODO: get FontFormatProperty and apply it
// TODO: how to set the base line?!?
}
void TextFormatProperty::setFontSize( int size )
{
mHasFontSize = true;
mFontSize = size;
}
void TextFormatProperty::setFontName( const QString &name )
{
mFontName = name;
}
void TextFormatProperty::setFontWeight( int weight )
{
mFontWeight = weight;
}
void TextFormatProperty::setFontStyle( int style )
{
mFontStyle = style;
}
void TextFormatProperty::setTextPosition( int position )
{
mTextPosition = position;
}
void TextFormatProperty::setColor( const QColor &color )
{
mColor = color;
}
void TextFormatProperty::setBackgroundColor( const QColor &color )
{
mBackgroundColor = color;
}
StyleFormatProperty::StyleFormatProperty()
: mStyleInformation( nullptr ), mDefaultStyle( false )
{
}
StyleFormatProperty::StyleFormatProperty( const StyleInformation *information )
: mStyleInformation( information ), mDefaultStyle( false )
{
}
void StyleFormatProperty::applyBlock( QTextBlockFormat *format ) const
{
if ( !mDefaultStyle && !mFamily.isEmpty() && mStyleInformation ) {
const StyleFormatProperty property = mStyleInformation->styleProperty( mFamily );
property.applyBlock( format );
}
if ( !mParentStyleName.isEmpty() && mStyleInformation ) {
const StyleFormatProperty property = mStyleInformation->styleProperty( mParentStyleName );
property.applyBlock( format );
}
mParagraphFormat.apply( format );
}
void StyleFormatProperty::applyText( QTextCharFormat *format ) const
{
if ( !mDefaultStyle && !mFamily.isEmpty() && mStyleInformation ) {
const StyleFormatProperty property = mStyleInformation->styleProperty( mFamily );
property.applyText( format );
}
if ( !mParentStyleName.isEmpty() && mStyleInformation ) {
const StyleFormatProperty property = mStyleInformation->styleProperty( mParentStyleName );
property.applyText( format );
}
mTextFormat.apply( format );
}
void StyleFormatProperty::applyTableColumn( QTextTableFormat *format ) const
{
if ( !mDefaultStyle && !mFamily.isEmpty() && mStyleInformation ) {
const StyleFormatProperty property = mStyleInformation->styleProperty( mFamily );
property.applyTableColumn( format );
}
if ( !mParentStyleName.isEmpty() && mStyleInformation ) {
const StyleFormatProperty property = mStyleInformation->styleProperty( mParentStyleName );
property.applyTableColumn( format );
}
mTableColumnFormat.apply( format );
}
void StyleFormatProperty::applyTableCell( QTextBlockFormat *format ) const
{
if ( !mDefaultStyle && !mFamily.isEmpty() && mStyleInformation ) {
const StyleFormatProperty property = mStyleInformation->styleProperty( mFamily );
property.applyTableCell( format );
}
if ( !mParentStyleName.isEmpty() && mStyleInformation ) {
const StyleFormatProperty property = mStyleInformation->styleProperty( mParentStyleName );
property.applyTableCell( format );
}
mTableCellFormat.apply( format );
}
void StyleFormatProperty::setParentStyleName( const QString &parentStyleName )
{
mParentStyleName = parentStyleName;
}
QString StyleFormatProperty::parentStyleName() const
{
return mParentStyleName;
}
void StyleFormatProperty::setFamily( const QString &family )
{
mFamily = family;
}
void StyleFormatProperty::setDefaultStyle( bool defaultStyle )
{
mDefaultStyle = defaultStyle;
}
void StyleFormatProperty::setMasterPageName( const QString &masterPageName )
{
mMasterPageName = masterPageName;
}
void StyleFormatProperty::setParagraphFormat( const ParagraphFormatProperty &format )
{
mParagraphFormat = format;
}
void StyleFormatProperty::setTextFormat( const TextFormatProperty &format )
{
mTextFormat = format;
}
void StyleFormatProperty::setTableColumnFormat( const TableColumnFormatProperty &format )
{
mTableColumnFormat = format;
}
void StyleFormatProperty::setTableCellFormat( const TableCellFormatProperty &format )
{
mTableCellFormat = format;
}
PageFormatProperty::PageFormatProperty()
: mHeight( 0.0 ), mWidth( 0.0 )
{
}
void PageFormatProperty::apply( QTextFormat *format ) const
{
format->setProperty( QTextFormat::BlockBottomMargin, mBottomMargin );
format->setProperty( QTextFormat::BlockLeftMargin, mLeftMargin );
format->setProperty( QTextFormat::BlockTopMargin, mTopMargin );
format->setProperty( QTextFormat::BlockRightMargin, mRightMargin );
format->setProperty( QTextFormat::FrameWidth, mWidth );
format->setProperty( QTextFormat::FrameHeight, mHeight );
}
void PageFormatProperty::setPageUsage( PageUsage usage )
{
mPageUsage = usage;
}
void PageFormatProperty::setBottomMargin( double margin )
{
mBottomMargin = margin;
}
void PageFormatProperty::setLeftMargin( double margin )
{
mLeftMargin = margin;
}
void PageFormatProperty::setTopMargin( double margin )
{
mTopMargin = margin;
}
void PageFormatProperty::setRightMargin( double margin )
{
mRightMargin = margin;
}
void PageFormatProperty::setHeight( double height )
{
mHeight = height;
}
void PageFormatProperty::setWidth( double width )
{
mWidth = width;
}
void PageFormatProperty::setPrintOrientation( PrintOrientation orientation )
{
mPrintOrientation = orientation;
}
double PageFormatProperty::width() const
{
return mWidth;
}
double PageFormatProperty::height() const
{
return mHeight;
}
double PageFormatProperty::margin() const
{
return mLeftMargin;
}
ListFormatProperty::ListFormatProperty()
: mType( Number )
{
mIndents.resize( 10 );
}
ListFormatProperty::ListFormatProperty( Type type )
: mType( type )
{
mIndents.resize( 10 );
}
void ListFormatProperty::apply( QTextListFormat *format, int level ) const
{
if ( mType == Number )
format->setStyle( QTextListFormat::ListDecimal );
else {
format->setStyle( QTextListFormat::ListDisc );
if ( level > 0 && level < 10 )
format->setIndent( qRound( mIndents[ level ] ) );
}
}
void ListFormatProperty::addItem( int level, double indent )
{
if ( level < 0 || level >= 10 )
return;
mIndents[ level ] = indent;
}
TableColumnFormatProperty::TableColumnFormatProperty()
: mWidth( 0 ), isValid( false )
{
}
void TableColumnFormatProperty::apply( QTextTableFormat *format ) const
{
if ( ! isValid ) {
return;
}
QVector<QTextLength> lengths = format->columnWidthConstraints();
lengths.append( QTextLength( QTextLength::FixedLength, mWidth ) );
format->setColumnWidthConstraints( lengths );
}
void TableColumnFormatProperty::setWidth( double width )
{
mWidth = width;
isValid = true;
}
TableCellFormatProperty::TableCellFormatProperty()
: mPadding( 0 ), mHasAlignment( false )
{
}
void TableCellFormatProperty::apply( QTextBlockFormat *format ) const
{
if ( mBackgroundColor.isValid() )
format->setBackground( mBackgroundColor );
if ( mHasAlignment )
format->setAlignment( mAlignment );
}
void TableCellFormatProperty::setBackgroundColor( const QColor &color )
{
mBackgroundColor = color;
}
void TableCellFormatProperty::setPadding( double padding )
{
mPadding = padding;
}
void TableCellFormatProperty::setAlignment( Qt::Alignment alignment )
{
mAlignment = alignment;
mHasAlignment = true;
}