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.
 
 
 
 
 

453 lines
11 KiB

/***************************************************************************
* 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;
}