Files
storyWriter/cdocumentwriter.cpp
T
Herwig Birke 8b0ccd20fa .
2018-03-27 15:01:39 +02:00

621 lines
22 KiB
C++

#include "cdocumentwriter.h"
#include "ctextdocument.h"
#include <QDebug>
cDocumentWriter::cDocumentWriter(const QString &szFileName) :
m_szFileName(szFileName)
{
}
cDocumentWriter::~cDocumentWriter()
{
close();
}
bool cDocumentWriter::open()
{
if(m_szFileName.isEmpty())
return(false);
m_file.setFileName(m_szFileName);
if(!m_file.open(QFile::WriteOnly | QFile::Text))
return(false);
setDevice(&m_file);
setAutoFormatting(true);
setAutoFormattingIndent(-1);
writeStartDocument();
writeStartElement("document");
return(true);
}
bool cDocumentWriter::close()
{
if(m_file.isOpen())
{
writeEndElement();
writeEndDocument();
m_file.close();
}
return(true);
}
bool cDocumentWriter::writeDocument(cTextDocument *lpDocument)
{
QList<QPair<int, QTextBlockFormat>> textBlockFormats;
QTextBlock textBlock = lpDocument->firstBlock();
while(textBlock.isValid())
{
int x;
for(x = 0;x < textBlockFormats.count();x++)
{
if(textBlockFormats[x].first == textBlock.blockFormatIndex())
break;
}
if(x >= textBlockFormats.count())
textBlockFormats.append(QPair<int, QTextBlockFormat>(textBlock.blockFormatIndex(), textBlock.blockFormat()));
textBlock = textBlock.next();
}
writeStartElement("documentSettings");
writeAttribute("documentMargin", QString::number(lpDocument->documentMargin()));
writeAttribute("indentWidth", QString::number(lpDocument->indentWidth()));
writeAttribute("textWidth", QString::number(lpDocument->textWidth()));
writeAttribute("useDesignMetrics", lpDocument->useDesignMetrics() == true ? "true" : "false");
writeStartElement("metaInformation");
writeAttribute("documentTitle", lpDocument->metaInformation(QTextDocument::DocumentTitle));
writeAttribute("documentUrl", lpDocument->metaInformation(QTextDocument::DocumentUrl));
writeEndElement();
writeStartElement("baseUrl");
writeAttribute("authority", lpDocument->baseUrl().authority());
writeAttribute("fragment", lpDocument->baseUrl().fragment());
writeAttribute("host", lpDocument->baseUrl().host());
writeAttribute("password", lpDocument->baseUrl().password());
writeAttribute("path", lpDocument->baseUrl().path());
writeAttribute("port", QString::number(lpDocument->baseUrl().port()));
writeAttribute("query", lpDocument->baseUrl().query());
writeAttribute("scheme", lpDocument->baseUrl().scheme());
writeAttribute("url", lpDocument->baseUrl().url());
writeAttribute("userInfo", lpDocument->baseUrl().userInfo());
writeAttribute("userName", lpDocument->baseUrl().userName());
writeEndElement();
writeStartElement("pageSize");
writeAttribute("width", QString::number(lpDocument->pageSize().width()));
writeAttribute("height", QString::number(lpDocument->pageSize().height()));
writeEndElement();
writeEndElement();
writeStartElement("defaults");
writeAttribute("defaultCursorMoveStyle", QString::number(lpDocument->defaultCursorMoveStyle()));
writeAttribute("defaultStyleSheet", lpDocument->defaultStyleSheet());
writeStartElement("defaultFont");
writeFont(lpDocument->defaultFont());
writeEndElement();
writeStartElement("defaultTextOption");
writeTextOption(lpDocument->defaultTextOption());
writeEndElement();
writeEndElement();
writeFormats(lpDocument->allFormats());
writeTextBlockFormats(textBlockFormats);
textBlock = lpDocument->firstBlock();
writeTextBlocks(textBlock);
return(true);
}
void cDocumentWriter::writeTextBlockFormats(const QList<QPair<int, QTextBlockFormat>> textBlockFormats)
{
writeStartElement("textBlockFormats");
for(int x = 0;x < textBlockFormats.count();x++)
{
writeStartElement("format");
writeFormat(textBlockFormats[x].second, textBlockFormats[x].first);
writeEndElement();
}
writeEndElement();
}
void cDocumentWriter::writeTextBlocks(QTextBlock& textBlock)
{
writeStartElement("textBlocks");
while(textBlock.isValid())
{
writeStartElement("textBlock");
writeTextBlock(textBlock);
writeEndElement();
textBlock = textBlock.next();
}
writeEndElement();
}
#include <QTextList>
#include <QTextTable>
void cDocumentWriter::writeTextBlock(const QTextBlock& textBlock)
{
QTextCursor cursor(textBlock);
QTextList* lpTextList = cursor.currentList();
QTextTable* lpTextTable = cursor.currentTable();
writeAttribute("blockFormatIndex", QString::number(textBlock.blockFormatIndex()));
writeAttribute("charFormatIndex", QString::number(textBlock.charFormatIndex()));
writeAttribute("listFormatIndex", QString::number(lpTextList == 0 ? -1 : lpTextList->formatIndex()));
writeAttribute("tableFormatIndex", QString::number(lpTextTable == 0 ? -1 : lpTextTable->formatIndex()));
QVector<QTextLayout::FormatRange> textFormats = textBlock.textFormats();
writeStartElement("textFormats");
for(int x = 0;x < textFormats.count();x++)
{
QTextLayout::FormatRange range = textFormats[x];
QTextCharFormat format = range.format;
writeStartElement("range");
writeAttribute("start", QString::number(range.start));
writeAttribute("length", QString::number(range.length));
writeTextCharFormat((QTextCharFormat*)&format, -1, WriteAttribute);
writeTextFormat((QTextFormat*)&format, -1, WriteAll);
writeTextCharFormat((QTextCharFormat*)&format, -1, WriteElements);
writeEndElement();
}
writeEndElement();
writeTextElement("text", textBlock.text());
}
void cDocumentWriter::writeColor(QColor color)
{
writeAttribute("alpha", QString::number(color.alpha()));
writeAttribute("r", QString::number(color.red()));
writeAttribute("g", QString::number(color.green()));
writeAttribute("b", QString::number(color.blue()));
}
void cDocumentWriter::writeGradient(const QGradient* lpGradient)
{
writeAttribute("type", QString::number(lpGradient->type()));
writeTextElement("spread", QString::number(lpGradient->spread()));
for(int x = 0;x < lpGradient->stops().count();x++)
{
writeStartElement("stop");
writeAttribute("pos", QString::number(lpGradient->stops()[x].first));
writeStartElement("color");
writeColor(lpGradient->stops()[x].second);
writeEndElement();
writeEndElement();
}
}
void cDocumentWriter::writePen(const QPen& pen)
{
writeAttribute("capStyle", QString::number(pen.capStyle()));
writeAttribute("dashOffset", QString::number(pen.dashOffset()));
writeAttribute("isCosmetic", pen.isCosmetic() == true ? "true" : "false");
writeAttribute("joinStyle", QString::number(pen.joinStyle()));
writeAttribute("miterLimit", QString::number(pen.miterLimit()));
writeAttribute("style", QString::number(pen.style()));
writeAttribute("width", QString::number(pen.width()));
writeAttribute("widthF", QString::number(pen.widthF()));
writeStartElement("brush");
writeBrush(pen.brush());
writeEndElement();
writeStartElement("color");
writeColor(pen.color());
writeEndElement();
if(pen.dashPattern().count())
{
writeStartElement("dashPattern");
for(int x = 0;x < pen.dashPattern().count();x++)
writeTextElement("pattern", QString::number(pen.dashPattern()[x]));
writeEndElement();
}
}
void cDocumentWriter::writeBrush(const QBrush& brush)
{
writeAttribute("style", QString::number(brush.style()));
writeStartElement("color");
writeColor(brush.color());
writeEndElement();
if(brush.gradient())
{
writeStartElement("gradient");
writeGradient(brush.gradient());
writeEndElement();
}
//matrix
//texture oder textureImage
}
void cDocumentWriter::writeFont(const QFont& font)
{
writeAttribute("bold", font.bold() == true ? "true" : "false");
writeAttribute("capitalization", QString::number(font.capitalization()));
// writeAttribute("defaultFamily", font.defaultFamily());
// writeAttribute("exactMatch", font.exactMatch() == true ? "true" : "false");
writeAttribute("family", font.family());
writeAttribute("fixedPitch", font.fixedPitch() == true ? "true" : "false");
writeAttribute("hintingPreference", QString::number(font.hintingPreference()));
writeAttribute("italic", font.italic() == true ? "true" : "false");
writeAttribute("kerning", font.kerning() == true ? "true" : "false");
writeAttribute("letterSpacing", QString::number(font.letterSpacing()));
writeAttribute("letterSpacingType", QString::number(font.letterSpacingType()));
writeAttribute("overline", QString::number(font.overline()));
writeAttribute("pixelSize", QString::number(font.pixelSize()));
writeAttribute("pointSize", QString::number(font.pointSize()));
writeAttribute("pointSizeF", QString::number(font.pointSizeF()));
writeAttribute("stretch", QString::number(font.stretch()));
writeAttribute("strikeOut", font.strikeOut() == true ? "true" : "false");
writeAttribute("style", QString::number(font.style()));
writeAttribute("styleHint", QString::number(font.styleHint()));
writeAttribute("styleName", font.styleName());
writeAttribute("styleStrategy", QString::number(font.styleStrategy()));
writeAttribute("underline", font.underline() == true ? "true" : "false");
writeAttribute("weight", QString::number(font.weight()));
writeAttribute("wordSpacing", QString::number(font.wordSpacing()));
}
void cDocumentWriter::writeFormat(const QTextFormat& textFormat, int id)
{
writeAttribute("type", QString::number(textFormat.type()));
if(textFormat.isTableCellFormat())
{
writeAttribute("typeText", "tableCellFormat");
writeTextTableCellFormat((QTextTableCellFormat*)&textFormat, id, WriteAttribute);
writeTextCharFormat((QTextCharFormat*)&textFormat, id, WriteAttribute);
writeTextFormat((QTextFormat*)&textFormat, id, WriteAll);
writeTextTableCellFormat((QTextTableCellFormat*)&textFormat, id, WriteElements);
writeTextCharFormat((QTextCharFormat*)&textFormat, id, WriteElements);
}
else if(textFormat.isTableFormat())
{
writeAttribute("typeText", "tableFormat");
writeTextTableFormat((QTextTableFormat*)&textFormat, id, WriteAttribute);
writeTextFrameFormat((QTextFrameFormat*)&textFormat, id, WriteAttribute);
writeTextFormat((QTextFormat*)&textFormat, id, WriteAll);
writeTextTableFormat((QTextTableFormat*)&textFormat, id, WriteElements);
writeTextFrameFormat((QTextFrameFormat*)&textFormat, id, WriteElements);
}
else if(textFormat.isImageFormat())
{
writeAttribute("typeText", "imageFormat");
writeTextImageFormat((QTextImageFormat*)&textFormat, id, WriteAttribute);
writeTextCharFormat((QTextCharFormat*)&textFormat, id, WriteAttribute);
writeTextFormat((QTextFormat*)&textFormat, id, WriteAll);
writeTextImageFormat((QTextImageFormat*)&textFormat, id, WriteElements);
writeTextCharFormat((QTextCharFormat*)&textFormat, id, WriteElements);
}
else if(textFormat.isFrameFormat())
{
writeAttribute("typeText", "frameFormat");
writeTextFrameFormat((QTextFrameFormat*)&textFormat, id, WriteAttribute);
writeTextFormat((QTextFormat*)&textFormat, id, WriteAll);
writeTextFrameFormat((QTextFrameFormat*)&textFormat, id, WriteElements);
}
else if(textFormat.isListFormat())
{
writeAttribute("typeText", "listFormat");
writeTextListFormat((QTextListFormat*)&textFormat, id, WriteAttribute);
writeTextFormat((QTextFormat*)&textFormat, id, WriteAll);
writeTextListFormat((QTextListFormat*)&textFormat, id, WriteElements);
}
else if(textFormat.isBlockFormat())
{
writeAttribute("typeText", "blockFormat");
writeTextBlockFormat((QTextBlockFormat*)&textFormat, id, WriteAttribute);
writeTextFormat((QTextFormat*)&textFormat, id, WriteAll);
writeTextBlockFormat((QTextBlockFormat*)&textFormat, id, WriteElements);
}
else if(textFormat.isCharFormat())
{
writeAttribute("typeText", "charFormat");
writeTextCharFormat((QTextCharFormat*)&textFormat, id, WriteAttribute);
writeTextFormat((QTextFormat*)&textFormat, id, WriteAll);
writeTextCharFormat((QTextCharFormat*)&textFormat, id, WriteElements);
}
}
void cDocumentWriter::writeTextFormat(QTextFormat* lpTextFormat, int /*id*/, WritePart part)
{
if(lpTextFormat->isValid())
{
if(part & WriteAttribute)
{
writeAttribute("layoutDirection", QString::number(lpTextFormat->layoutDirection()));
}
if(part & WriteElements)
{
writeStartElement("background");
writeBrush(lpTextFormat->background());
writeEndElement();
writeStartElement("foreground");
writeBrush(lpTextFormat->foreground());
writeEndElement();
writeStartElement("properties");
QMap<int, QVariant> properties = lpTextFormat->properties();
QMapIterator<int, QVariant> property(properties);
while(property.hasNext())
{
property.next();
writeStartElement("property");
writeAttribute("key", QString::number(property.key()));
writeAttribute("type", QString::number(property.value().type()));
writeTextElement("value", property.value().toString());
writeEndElement();
}
writeEndElement();
}
}
}
void cDocumentWriter::writeFormats(const QVector<QTextFormat> formats)
{
writeStartElement("allFormats");
for(int x = 0;x < formats.count();x++)
{
writeStartElement("format");
writeAttribute("id", QString::number(x));
writeFormat(formats[x]);
writeEndElement();
}
writeEndElement();
}
void cDocumentWriter::writeTabPositions(const QList<QTextOption::Tab> tabs)
{
for(int x = 0;x < tabs.count();x++)
{
QTextOption::Tab tab = tabs[x];
writeStartElement("tabPosition");
writeAttribute("delimiter", tab.delimiter);
writeAttribute("position", QString::number(tab.position));
writeAttribute("type", QString::number(tab.type));
writeEndElement();
}
}
void cDocumentWriter::writeTextBlockFormat(QTextBlockFormat* lpTextBlockFormat, int id, WritePart part)
{
if(part & WriteAttribute && id != -1)
writeAttribute("id", QString::number(id));
if(lpTextBlockFormat->isValid())
{
if(part & WriteAttribute)
{
writeAttribute("alignment", QString::number(lpTextBlockFormat->alignment()));
writeAttribute("topMargin", QString::number(lpTextBlockFormat->topMargin()));
writeAttribute("leftMargin", QString::number(lpTextBlockFormat->leftMargin()));
writeAttribute("bottomMargin", QString::number(lpTextBlockFormat->bottomMargin()));
writeAttribute("rightMargin", QString::number(lpTextBlockFormat->rightMargin()));
writeAttribute("indent", QString::number(lpTextBlockFormat->indent()));
writeAttribute("lineHeight", QString::number(lpTextBlockFormat->lineHeight()));
writeAttribute("lineHeightType", QString::number(lpTextBlockFormat->lineHeightType()));
writeAttribute("nonBreakableLines", lpTextBlockFormat->nonBreakableLines() == true ? "true" : "false");
writeAttribute("pageBreakPolicy", QString::number(lpTextBlockFormat->pageBreakPolicy()));
writeAttribute("textIndent", QString::number(lpTextBlockFormat->textIndent()));
}
if(part & WriteElements)
{
writeStartElement("tabPositions");
writeTabPositions(lpTextBlockFormat->tabPositions());
writeEndElement();
}
}
}
void cDocumentWriter::writeTextCharFormat(QTextCharFormat* lpTextCharFormat, int id, WritePart part)
{
if(part & WriteAttribute && id != -1)
writeAttribute("id", QString::number(id));
if(lpTextCharFormat->isValid())
{
if(part & WriteAttribute)
{
writeAttribute("anchorHref", lpTextCharFormat->anchorHref());
// writeAttribute("fontCapitalization", QString::number(lpTextCharFormat->fontCapitalization()));
// writeAttribute("fontFamily", lpTextCharFormat->fontFamily());
// writeAttribute("fontFixedPitch", lpTextCharFormat->fontFixedPitch() == true ? "true" : "false");
// writeAttribute("fontHintingPreference", QString::number(lpTextCharFormat->fontHintingPreference()));
// writeAttribute("fontItalic", lpTextCharFormat->fontItalic() == true ? "true" : "false");
// writeAttribute("fontKerning", lpTextCharFormat->fontKerning() == true ? "true" : "false");
// writeAttribute("fontLetterSpacing", QString::number(lpTextCharFormat->fontLetterSpacing()));
// writeAttribute("fontLetterSpacingType", QString::number(lpTextCharFormat->fontLetterSpacingType()));
// writeAttribute("fontOverline", QString::number(lpTextCharFormat->fontOverline()));
// writeAttribute("fontPointSize", QString::number(lpTextCharFormat->fontPointSize()));
// writeAttribute("fontStretch", QString::number(lpTextCharFormat->fontStretch()));
// writeAttribute("fontStrikeOut", lpTextCharFormat->fontStrikeOut() == true ? "true" : "false");
// writeAttribute("fontStyleHint", QString::number(lpTextCharFormat->fontStyleHint()));
// writeAttribute("fontStyleStrategy", QString::number(lpTextCharFormat->fontStyleStrategy()));
// writeAttribute("fontUnderline", lpTextCharFormat->fontUnderline() == true ? "true" : "false");
// writeAttribute("fontWeight", QString::number(lpTextCharFormat->fontWeight()));
// writeAttribute("fontWordSpacing", QString::number(lpTextCharFormat->fontWordSpacing()));
writeAttribute("isAnchor", lpTextCharFormat->isAnchor() == true ? "true" : "false");
writeAttribute("toolTip", lpTextCharFormat->toolTip());
writeAttribute("verticalAlignment", QString::number(lpTextCharFormat->verticalAlignment()));
}
if(part & WriteElements)
{
writeStartElement("textOutline");
writePen(lpTextCharFormat->textOutline());
writeEndElement();
writeStartElement("anchorNames");
for(int x = 0;x < lpTextCharFormat->anchorNames().count();x++)
writeTextElement("anchor", lpTextCharFormat->anchorNames()[x]);
writeEndElement();
writeStartElement("font");
writeFont(lpTextCharFormat->font());
writeEndElement();
writeStartElement("underlineColor");
writeColor(lpTextCharFormat->underlineColor());
writeEndElement();
}
}
}
void cDocumentWriter::writeTextFrameFormat(QTextFrameFormat* lpTextFrameFormat, int id, WritePart part)
{
if(part & WriteAttribute && id != -1)
writeAttribute("id", QString::number(id));
if(lpTextFrameFormat->isValid())
{
if(part & WriteAttribute)
{
writeAttribute("border", QString::number(lpTextFrameFormat->border()));
writeAttribute("borderStyle", QString::number(lpTextFrameFormat->borderStyle()));
writeAttribute("margin", QString::number(lpTextFrameFormat->margin()));
writeAttribute("leftMargin", QString::number(lpTextFrameFormat->leftMargin()));
writeAttribute("topMargin", QString::number(lpTextFrameFormat->topMargin()));
writeAttribute("rightMargin", QString::number(lpTextFrameFormat->rightMargin()));
writeAttribute("bottomMargin", QString::number(lpTextFrameFormat->bottomMargin()));
writeAttribute("width", QString::number(lpTextFrameFormat->width().rawValue()));
writeAttribute("height", QString::number(lpTextFrameFormat->height().rawValue()));
writeAttribute("padding", QString::number(lpTextFrameFormat->padding()));
writeAttribute("pageBreakPolicy", QString::number(lpTextFrameFormat->pageBreakPolicy()));
writeAttribute("position", QString::number(lpTextFrameFormat->position()));
}
if(part & WriteElements)
{
writeStartElement("borderBrush");
writeBrush(lpTextFrameFormat->borderBrush());
writeEndElement();
}
}
}
void cDocumentWriter::writeTextImageFormat(QTextImageFormat* lpTextImageFormat, int id, WritePart part)
{
if(part & WriteAttribute && id != -1)
writeAttribute("id", QString::number(id));
if(lpTextImageFormat->isValid())
{
if(part & WriteAttribute)
{
writeAttribute("name", lpTextImageFormat->name());
writeAttribute("height", QString::number(lpTextImageFormat->height()));
writeAttribute("width", QString::number(lpTextImageFormat->width()));
}
}
}
void cDocumentWriter::writeTextListFormat(QTextListFormat* lpTextListFormat, int id, WritePart part)
{
if(part & WriteAttribute && id != -1)
writeAttribute("id", QString::number(id));
if(lpTextListFormat->isValid())
{
if(part & WriteAttribute)
{
writeAttribute("indent", QString::number(lpTextListFormat->indent()));
writeAttribute("numberPrefix", lpTextListFormat->numberPrefix());
writeAttribute("numberSuffix", lpTextListFormat->numberSuffix());
writeAttribute("style", QString::number(lpTextListFormat->style()));
}
}
}
void cDocumentWriter::writeTextTableCellFormat(QTextTableCellFormat* lpTextTableCellFormat, int id, WritePart part)
{
if(part & WriteAttribute && id != -1)
writeAttribute("id", QString::number(id));
if(lpTextTableCellFormat->isValid())
{
if(part & WriteAttribute)
{
writeAttribute("leftPadding", QString::number(lpTextTableCellFormat->leftPadding()));
writeAttribute("topPadding", QString::number(lpTextTableCellFormat->topPadding()));
writeAttribute("rightPadding", QString::number(lpTextTableCellFormat->rightPadding()));
writeAttribute("bottomPadding", QString::number(lpTextTableCellFormat->bottomPadding()));
}
}
}
void cDocumentWriter::writeTextTableFormat(QTextTableFormat* lpTextTableFormat, int id, WritePart part)
{
if(part & WriteAttribute && id != -1)
writeAttribute("id", QString::number(id));
if(lpTextTableFormat->isValid())
{
if(part & WriteAttribute)
{
writeAttribute("alignment", QString::number(lpTextTableFormat->alignment()));
writeAttribute("cellPadding", QString::number(lpTextTableFormat->cellPadding()));
writeAttribute("cellSpacing", QString::number(lpTextTableFormat->cellSpacing()));
writeAttribute("columns", QString::number(lpTextTableFormat->columns()));
writeAttribute("headerRowCount", QString::number(lpTextTableFormat->headerRowCount()));
}
if(part & WriteElements)
{
if(lpTextTableFormat->columnWidthConstraints().count())
{
writeStartElement("columnWidthConstraints");
for(int x = 0;x < lpTextTableFormat->columnWidthConstraints().count();x++)
{
writeStartElement("columnWidthConstraint");
writeAttribute("rawValue", QString::number(lpTextTableFormat->columnWidthConstraints()[x].rawValue()));
writeAttribute("type", QString::number(lpTextTableFormat->columnWidthConstraints()[x].type()));
writeEndElement();
}
writeEndElement();
}
}
}
}
void cDocumentWriter::writeTextOption(const QTextOption& textOption)
{
writeAttribute("alignment", QString::number(textOption.alignment()));
writeAttribute("flags", QString::number(textOption.flags()));
writeAttribute("tabStopDistance", QString::number(textOption.tabStopDistance()));
writeAttribute("textDirection", QString::number(textOption.textDirection()));
writeAttribute("useDesignMetrics", textOption.useDesignMetrics() == true ? "true" : "false");
writeAttribute("wrapMode", QString::number(textOption.wrapMode()));
writeStartElement("tabArray");
for(int x = 0;x < textOption.tabArray().count();x++)
writeTextElement("tab", QString::number(textOption.tabArray()[x]));
writeEndElement();
writeStartElement("tabs");
writeTabPositions(textOption.tabs());
writeEndElement();
}