Files
storyWriter/cdocumentreader.h
T
Herwig Birke d3fd815599 .
2018-03-28 17:39:53 +02:00

213 lines
5.9 KiB
C++

#ifndef CDOCUMENTREADER_H
#define CDOCUMENTREADER_H
#include <QXmlStreamReader>
#include <QFile>
#include <QDomDocument>
#include <QDomElement>
#include <QDomNode>
#include <QFont>
#include <QTextOption>
#include <QTextFormat>
#include <QBrush>
#include <QColor>
#include <QTextTableCellFormat>
#include <QTextTableFormat>
#include <QTextImageFormat>
#include <QTextFrameFormat>
#include <QTextListFormat>
#include <QTextBlockFormat>
#include <QTextCharFormat>
#include <QTextLayout>
#include <QTextBlock>
#include <QTextCursor>
#include <JlCompress.h>
class cTextDocument;
class cTextFormat
{
public:
enum TextFormatType
{
TextFormatTypeUnknown = 0,
TextFormatTypeTableCell = 1,
TextFormatTypeTable = 2,
TextFormatTypeImage = 3,
TextFormatTypeFrame = 4,
TextFormatTypeList = 5,
TextFormatTypeBlock = 6,
TextFormatTypeChar = 7,
};
cTextFormat(TextFormatType type = TextFormatTypeUnknown) : m_type(type) {}
cTextFormat(const QString& szType) : m_type(TextFormatTypeUnknown)
{
if(szType.compare("tableCellFormat", Qt::CaseInsensitive))
m_type = TextFormatTypeTableCell;
else if(szType.compare("tableFormat", Qt::CaseInsensitive))
m_type = TextFormatTypeTable;
else if(szType.compare("imageFormat", Qt::CaseInsensitive))
m_type = TextFormatTypeImage;
else if(szType.compare("frameFormat", Qt::CaseInsensitive))
m_type = TextFormatTypeFrame;
else if(szType.compare("listFormat", Qt::CaseInsensitive))
m_type = TextFormatTypeList;
else if(szType.compare("blockFormat", Qt::CaseInsensitive))
m_type = TextFormatTypeBlock;
else if(szType.compare("charFormat", Qt::CaseInsensitive))
m_type = TextFormatTypeChar;
}
void setTableCellFormat(const QTextTableCellFormat& format)
{
tableCellFormat = format;
m_type = TextFormatTypeTableCell;
}
void setTableFormat(const QTextTableFormat& format)
{
tableFormat = format;
m_type = TextFormatTypeTable;
}
void setImageFormat(const QTextImageFormat& format)
{
imageFormat = format;
m_type = TextFormatTypeImage;
}
void setFrameFormat(const QTextFrameFormat& format)
{
frameFormat = format;
m_type = TextFormatTypeFrame;
}
void setListFormat(const QTextListFormat& format)
{
listFormat = format;
m_type = TextFormatTypeList;
}
void setBlockFormat(const QTextBlockFormat& format)
{
blockFormat = format;
m_type = TextFormatTypeBlock;
}
void setCharFormat(const QTextCharFormat& format)
{
charFormat = format;
m_type = TextFormatTypeChar;
}
bool isValid()
{
switch(m_type)
{
case TextFormatTypeTableCell:
return(tableCellFormat.isValid());
case TextFormatTypeTable:
return(tableFormat.isValid());
case TextFormatTypeImage:
return(imageFormat.isValid());
case TextFormatTypeFrame:
return(frameFormat.isValid());
case TextFormatTypeList:
return(listFormat.isValid());
case TextFormatTypeBlock:
return(blockFormat.isValid());
case TextFormatTypeChar:
return(charFormat.isValid());
case TextFormatTypeUnknown:
return(false);
}
return(false);
}
void setLayoutDirection(Qt::LayoutDirection layoutDirection)
{
switch(m_type)
{
case TextFormatTypeTableCell:
tableCellFormat.setLayoutDirection(layoutDirection);
break;
case TextFormatTypeTable:
tableFormat.setLayoutDirection(layoutDirection);
break;
case TextFormatTypeImage:
imageFormat.setLayoutDirection(layoutDirection);
break;
case TextFormatTypeFrame:
frameFormat.setLayoutDirection(layoutDirection);
break;
case TextFormatTypeList:
listFormat.setLayoutDirection(layoutDirection);
break;
case TextFormatTypeBlock:
blockFormat.setLayoutDirection(layoutDirection);
break;
case TextFormatTypeChar:
charFormat.setLayoutDirection(layoutDirection);
break;
case TextFormatTypeUnknown:
break;
}
}
QTextTableCellFormat tableCellFormat;
QTextTableFormat tableFormat;
QTextImageFormat imageFormat;
QTextFrameFormat frameFormat;
QTextListFormat listFormat;
QTextBlockFormat blockFormat;
QTextCharFormat charFormat;
TextFormatType m_type;
};
class cDocumentReader : public QXmlStreamReader
{
public:
cDocumentReader(const QString& szFileName, bool bZip = true);
~cDocumentReader();
bool open();
bool close();
cTextDocument* readDocument();
private:
bool m_bFirstBlock;
bool m_bZip;
QString m_szFileName;
QFile m_file;
QuaZip m_zip;
QuaZipFile m_zipFile;
QMap<int, QTextList*> m_textLists;
void parseSettings(const QDomElement& element, cTextDocument* lpDocument);
void parseDefaults(const QDomElement& element, cTextDocument* lpDocument);
void parseTextBlock(const QDomElement& element, QTextCursor *lpCursor, const QVector<cTextFormat>& allFormats);
QVector<QTextLayout::FormatRange> parseTextFormats(const QDomElement& element);
QTextLayout::FormatRange parseRange(const QDomElement& element);
QFont parseFont(const QDomElement& element);
QTextOption parseDefaultTextOption(const QDomElement& element);
QList<QTextOption::Tab> parseTabPositions(const QDomElement& element);
QVector<cTextFormat> parseAllFormats(const QDomElement& element);
cTextFormat parseFormat(const QDomElement& element);
QPen parsePen(const QDomElement& element);
QBrush parseBrush(const QDomElement& element);
QColor parseColor(const QDomElement& element);
QTextTableCellFormat parseTextTableCellFormat(const QDomElement& element);
QTextTableFormat parseTextTableFormat(const QDomElement& element);
QTextImageFormat parseTextImageFormat(const QDomElement& element);
QTextFrameFormat parseTextFrameFormat(const QDomElement& element);
QTextListFormat parseTextListFormat(const QDomElement& element);
QTextBlockFormat parseTextBlockFormat(const QDomElement& element);
QTextCharFormat parseTextCharFormat(const QDomElement& element);
};
#endif // CDOCUMENTREADER_H