RedPanda-CPP/RedPandaIDE/qsynedit/exporter/synexporter.cpp

253 lines
5.9 KiB
C++
Raw Normal View History

2021-06-10 09:34:59 +08:00
#include "synexporter.h"
#include <QClipboard>
#include <QGuiApplication>
#include <QMimeData>
#include <QTextCodec>
SynExporter::SynExporter()
{
mClipboardFormat = "text/plain";
mFont = QGuiApplication::font();
mBackgroundColor = QGuiApplication::palette().color(QPalette::Base);
mForegroundColor = QGuiApplication::palette().color(QPalette::Text);
mUseBackground = false;
mExportAsText = false;
clear();
setTitle("");
}
void SynExporter::clear()
{
mBuffer.clear();
mLastStyle = SynFontStyle::fsNone;
mLastBG = QGuiApplication::palette().color(QPalette::Base);
mLastFG = QGuiApplication::palette().color(QPalette::Text);
}
void SynExporter::CopyToClipboard()
{
if (mExportAsText) {
CopyToClipboardFormat("text/plain");
} else
CopyToClipboardFormat(clipboardFormat());
}
bool SynExporter::exportAsText() const
{
return mExportAsText;
}
void SynExporter::setExportAsText(bool Value)
{
if (mExportAsText != Value) {
mExportAsText = Value;
clear();
}
}
QFont SynExporter::font() const
{
return mFont;
}
void SynExporter::setFont(const QFont &font)
{
mFont = font;
}
PSynHighlighter SynExporter::highlighter() const
{
return mHighlighter;
}
void SynExporter::setHighlighter(PSynHighlighter Value)
{
if (mHighlighter != Value) {
mHighlighter = Value;
clear();
if ((mHighlighter) && (mHighlighter->whitespaceAttribute()) && mUseBackground)
mBackgroundColor = mHighlighter->whitespaceAttribute()->background();
}
}
QString SynExporter::title() const
{
return mTitle;
}
void SynExporter::setTitle(const QString &Value)
{
if (mTitle != Value) {
if (!Value.isEmpty())
mTitle = Value;
else
mTitle = QObject::tr("Untitled");
}
}
bool SynExporter::useBackground() const
{
return mUseBackground;
}
void SynExporter::setUseBackground(bool Value)
{
if (mUseBackground != Value) {
mUseBackground = Value;
clear();
if ((mHighlighter) && (mHighlighter->whitespaceAttribute()) && mUseBackground)
mBackgroundColor = mHighlighter->whitespaceAttribute()->background();
}
}
FileEndingType SynExporter::fileEndingType() const
{
return mFileEndingType;
}
void SynExporter::setFileEndingType(const FileEndingType &fileEndingType)
{
mFileEndingType = fileEndingType;
}
QColor SynExporter::foregroundColor() const
{
return mForegroundColor;
}
void SynExporter::setForegroundColor(const QColor &value)
{
if (mForegroundColor != value) {
mForegroundColor = value;
}
}
QColor SynExporter::backgroundColor() const
{
return mBackgroundColor;
}
void SynExporter::setBackgroundColor(const QColor &value)
{
if (mBackgroundColor != value) {
mBackgroundColor = value;
}
}
QByteArray SynExporter::charset() const
{
return mCharset;
}
void SynExporter::setCharset(const QByteArray &charset)
{
mCharset = charset;
}
void SynExporter::AddData(const QString &AText)
{
if (!AText.isEmpty()) {
QTextCodec* codec = QTextCodec::codecForName(mCharset);
mBuffer.append(codec->fromUnicode(AText));
}
}
void SynExporter::AddDataNewLine(const QString &AText)
{
AddData(AText);
AddNewLine();
}
void SynExporter::AddNewLine()
{
switch(mFileEndingType) {
case FileEndingType::Linux:
AddData("\n");
case FileEndingType::Windows:
AddData("\r\n");
case FileEndingType::Mac:
AddData("\r");
}
}
void SynExporter::CopyToClipboardFormat(QByteArray AFormat)
{
QClipboard* clipboard = QGuiApplication::clipboard();
QMimeData * mimeData = new QMimeData();
mimeData->setData(AFormat,mBuffer);
clipboard->setMimeData(mimeData);
}
void SynExporter::FormatToken(QString &Token)
{
AddData(Token);
}
int SynExporter::GetBufferSize()
{
return mBuffer.size();
}
void SynExporter::InsertData(int APos, const QString &AText)
{
if (!AText.isEmpty()) {
QTextCodec* codec = QTextCodec::codecForName(mCharset);
mBuffer.insert(APos,codec->fromUnicode(AText));
}
}
QString SynExporter::ReplaceReservedChars(QString &AToken)
{
if (AToken.isEmpty())
return "";
QString result;
for (QChar ch:AToken) {
if (mReplaceReserved.contains(ch)) {
result += mReplaceReserved[ch];
} else {
result += ch;
}
}
return result;
}
static QColor ValidatedColor(const QColor& color, const QColor& defaultColor) {
if (color.isValid())
return color;
else
return defaultColor;
}
void SynExporter::SetTokenAttribute(PSynHighlighterAttribute Attri)
{
if (mFirstAttribute) {
mFirstAttribute = false;
mLastBG = ValidatedColor(Attri->background(), mBackgroundColor);
mLastFG = ValidatedColor(Attri->foreground(), mForegroundColor);
mLastStyle = Attri->styles();
FormatBeforeFirstAttribute(
mUseBackground && (mLastBG != mBackgroundColor),
mLastFG != mForegroundColor, Attri->styles());
} else {
bool ChangedBG = mUseBackground &&
(mLastBG != ValidatedColor(Attri->background(), mBackgroundColor));
bool ChangedFG = (mLastFG != ValidatedColor(Attri->foreground(), mForegroundColor));
if (ChangedBG || ChangedFG || (mLastStyle != Attri->styles())) {
// which font style bits are to reset?
SynFontStyles ChangedStyles = mLastStyle & ~(Attri->styles());
FormatAttributeDone(ChangedBG, ChangedFG, ChangedStyles);
// which font style bits are to set?
ChangedStyles = Attri->styles() & ~(mLastStyle);
mLastBG = ValidatedColor(Attri->background(), mBackgroundColor);
mLastFG = ValidatedColor(Attri->foreground(), mForegroundColor);
mLastStyle = Attri->styles();
FormatAttributeInit(ChangedBG, ChangedFG, ChangedStyles);
}
}
}
QByteArray SynExporter::clipboardFormat()
{
return this->mClipboardFormat;
}