diff --git a/src/plugins/texteditor/colorscheme.cpp b/src/plugins/texteditor/colorscheme.cpp new file mode 100644 index 0000000000000000000000000000000000000000..364342904ed2c67fd32c15e6a53719da7f4bab93 --- /dev/null +++ b/src/plugins/texteditor/colorscheme.cpp @@ -0,0 +1,189 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#include "colorscheme.h" + +#include <QtCore/QFile> +#include <QtXml/QXmlStreamWriter> + +using namespace TextEditor; + +static const char *trueString = "true"; +static const char *falseString = "false"; + +// Format + +Format::Format() : + m_foreground(Qt::black), + m_background(Qt::white), + m_bold(false), + m_italic(false) +{ +} + +void Format::setForeground(const QColor &foreground) +{ + m_foreground = foreground; +} + +void Format::setBackground(const QColor &background) +{ + m_background = background; +} + +void Format::setBold(bool bold) +{ + m_bold = bold; +} + +void Format::setItalic(bool italic) +{ + m_italic = italic; +} + +static QString colorToString(const QColor &color) +{ + if (color.isValid()) + return color.name(); + return QLatin1String("invalid"); +} + +static QColor stringToColor(const QString &string) +{ + if (string == QLatin1String("invalid")) + return QColor(); + return QColor(string); +} + +bool Format::equals(const Format &f) const +{ + return m_foreground == f.m_foreground && m_background == f.m_background && + m_bold == f.m_bold && m_italic == f.m_italic; +} + +QString Format::toString() const +{ + const QChar delimiter = QLatin1Char(';'); + QString s = colorToString(m_foreground); + s += delimiter; + s += colorToString(m_background); + s += delimiter; + s += m_bold ? QLatin1String(trueString) : QLatin1String(falseString); + s += delimiter; + s += m_italic ? QLatin1String(trueString) : QLatin1String(falseString); + return s; +} + +bool Format::fromString(const QString &str) +{ + *this = Format(); + + const QStringList lst = str.split(QLatin1Char(';')); + if (lst.count() != 4) + return false; + + m_foreground = stringToColor(lst.at(0)); + m_background = stringToColor(lst.at(1)); + m_bold = lst.at(2) == QLatin1String(trueString); + m_italic = lst.at(3) == QLatin1String(trueString); + return true; +} + + +// ColorScheme + +ColorScheme::ColorScheme() +{ +} + +bool ColorScheme::contains(const QString &category) const +{ + return m_formats.contains(category); +} + +Format &ColorScheme::formatFor(const QString &category) +{ + return m_formats[category]; +} + +Format ColorScheme::formatFor(const QString &category) const +{ + return m_formats.value(category); +} + +void ColorScheme::setFormatFor(const QString &category, const Format &format) +{ + m_formats[category] = format; +} + +void ColorScheme::clear() +{ + m_formats.clear(); +} + +bool ColorScheme::save(const QString &fileName) +{ + QFile file(fileName); + if (!file.open(QIODevice::WriteOnly)) + return false; + + QXmlStreamWriter w(&file); + w.setAutoFormatting(true); + w.setAutoFormattingIndent(2); + + w.writeStartDocument(); + w.writeStartElement(QLatin1String("style-scheme")); + w.writeAttribute(QLatin1String("version"), QLatin1String("1.0")); + + QMapIterator<QString, Format> i(m_formats); + while (i.hasNext()) { + const Format &format = i.next().value(); + w.writeStartElement(QLatin1String("style")); + w.writeAttribute(QLatin1String("name"), i.key()); + w.writeAttribute(QLatin1String("foreground"), format.foreground().name().toLower()); + if (format.background().isValid()) + w.writeAttribute(QLatin1String("background"), format.background().name().toLower()); + if (format.bold()) + w.writeAttribute(QLatin1String("bold"), QLatin1String(trueString)); + if (format.italic()) + w.writeAttribute(QLatin1String("italic"), QLatin1String(trueString)); + w.writeEndElement(); + } + + w.writeEndElement(); + w.writeEndDocument(); + + return true; +} + +bool ColorScheme::load(const QString &fileName) +{ + Q_UNUSED(fileName) + return false; +} diff --git a/src/plugins/texteditor/colorscheme.h b/src/plugins/texteditor/colorscheme.h new file mode 100644 index 0000000000000000000000000000000000000000..e333d6b128a969988f7cc55cfb7a14a4b2c59070 --- /dev/null +++ b/src/plugins/texteditor/colorscheme.h @@ -0,0 +1,108 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#ifndef COLORSCHEME_H +#define COLORSCHEME_H + +#include "texteditor_global.h" + +#include <QtCore/QMap> +#include <QtCore/QString> +#include <QtGui/QColor> +#include <QtGui/QTextCharFormat> + +namespace TextEditor { + +/*! Format for a particular piece of text (text/comment, etc). */ +class TEXTEDITOR_EXPORT Format +{ +public: + Format(); + + QColor foreground() const { return m_foreground; } + void setForeground(const QColor &foreground); + + QColor background() const { return m_background; } + void setBackground(const QColor &background); + + bool bold() const { return m_bold; } + void setBold(bool bold); + + bool italic() const { return m_italic; } + void setItalic(bool italic); + + bool equals(const Format &f) const; + + QString toString() const; + bool fromString(const QString &str); + +private: + QColor m_foreground; + QColor m_background; + bool m_bold; + bool m_italic; +}; + +inline bool operator==(const Format &f1, const Format &f2) { return f1.equals(f2); } +inline bool operator!=(const Format &f1, const Format &f2) { return !f1.equals(f2); } + + +/*! A color scheme combines a set of formats for different highlighting + categories. It also provides saving and loading of the scheme to a file. + */ +class ColorScheme +{ +public: + ColorScheme(); + + bool contains(const QString &category) const; + + Format &formatFor(const QString &category); + Format formatFor(const QString &category) const; + + void setFormatFor(const QString &category, const Format &format); + + void clear(); + + bool save(const QString &fileName); + bool load(const QString &fileName); + + inline bool equals(const ColorScheme &cs) const + { return m_formats == cs.m_formats; } + +private: + QMap<QString, Format> m_formats; +}; + +inline bool operator==(const ColorScheme &cs1, const ColorScheme &cs2) { return cs1.equals(cs2); } +inline bool operator!=(const ColorScheme &cs1, const ColorScheme &cs2) { return !cs1.equals(cs2); } + +} // namespace TextEditor + +#endif // COLORSCHEME_H diff --git a/src/plugins/texteditor/fontsettings.cpp b/src/plugins/texteditor/fontsettings.cpp index e8c2bcd1047e06f82e50f770ff185f6d841541f3..cd0fd2586c90874380d23eacb1655a155d543b5d 100644 --- a/src/plugins/texteditor/fontsettings.cpp +++ b/src/plugins/texteditor/fontsettings.cpp @@ -38,8 +38,6 @@ static const char *fontFamilyKey = "FontFamily"; static const char *fontSizeKey = "FontSize"; static const char *antialiasKey = "FontAntialias"; -static const char *trueString = "true"; -static const char *falseString = "false"; namespace { static const bool DEFAULT_ANTIALIAS = true; @@ -60,81 +58,6 @@ static const bool DEFAULT_ANTIALIAS = true; namespace TextEditor { -// Format -- -Format::Format() : - m_foreground(Qt::black), - m_background(Qt::white), - m_bold(false), - m_italic(false) -{ -} - -void Format::setForeground(const QColor &foreground) -{ - m_foreground = foreground; -} - -void Format::setBackground(const QColor &background) -{ - m_background = background; -} - -void Format::setBold(bool bold) -{ - m_bold = bold; -} - -void Format::setItalic(bool italic) -{ - m_italic = italic; -} - -static QString colorToString(const QColor &color) { - if (color.isValid()) - return color.name(); - return QLatin1String("invalid"); -} - -static QColor stringToColor(const QString &string) { - if (string == QLatin1String("invalid")) - return QColor(); - return QColor(string); -} - -QString Format::toString() const -{ - const QChar delimiter = QLatin1Char(';'); - QString s = colorToString(m_foreground); - s += delimiter; - s += colorToString(m_background); - s += delimiter; - s += m_bold ? QLatin1String(trueString) : QLatin1String(falseString); - s += delimiter; - s += m_italic ? QLatin1String(trueString) : QLatin1String(falseString); - return s; -} - -bool Format::fromString(const QString &str) -{ - *this = Format(); - - const QStringList lst = str.split(QLatin1Char(';')); - if (lst.count() != 4) - return false; - - m_foreground = stringToColor(lst.at(0)); - m_background = stringToColor(lst.at(1)); - m_bold = lst.at(2) == QLatin1String(trueString); - m_italic = lst.at(3) == QLatin1String(trueString); - return true; -} - -bool Format::equals(const Format &f) const -{ - return m_foreground == f.m_foreground && m_background == f.m_background && - m_bold == f.m_bold && m_italic == f.m_italic; -} - // -- FontSettings FontSettings::FontSettings() : m_family(defaultFixedFontFamily()), @@ -148,16 +71,13 @@ void FontSettings::clear() m_family = defaultFixedFontFamily(); m_fontSize = DEFAULT_FONT_SIZE; m_antialias = DEFAULT_ANTIALIAS; - m_formats.clear(); - //qFill(m_formats.begin(), m_formats.end(), Format()); + m_scheme.clear(); } void FontSettings::toSettings(const QString &category, const FormatDescriptions &descriptions, QSettings *s) const { - const int numFormats = m_formats.size(); - QTC_ASSERT(descriptions.size() == numFormats, /**/); s->beginGroup(category); if (m_family != defaultFixedFontFamily() || s->contains(QLatin1String(fontFamilyKey))) s->setValue(QLatin1String(fontFamilyKey), m_family); @@ -171,9 +91,11 @@ void FontSettings::toSettings(const QString &category, const Format defaultFormat; foreach (const FormatDescription &desc, descriptions) { - QMap<QString, Format>::const_iterator i = m_formats.find(desc.name()); - if (i != m_formats.end() && ((*i) != defaultFormat || s->contains(desc.name()))) { - s->setValue(desc.name(), (*i).toString()); + const QString name = desc.name(); + if (m_scheme.contains(name)) { + const Format &f = m_scheme.formatFor(name); + if (f != defaultFormat || s->contains(name)) + s->setValue(name, f.toString()); } } s->endGroup(); @@ -198,14 +120,16 @@ bool FontSettings::fromSettings(const QString &category, foreach (const FormatDescription &desc, descriptions) { const QString name = desc.name(); const QString fmt = s->value(group + name, QString()).toString(); + Format format; if (fmt.isEmpty()) { - m_formats[name].setForeground(desc.foreground()); - m_formats[name].setBackground(desc.background()); - m_formats[name].setBold(desc.format().bold()); - m_formats[name].setItalic(desc.format().italic()); + format.setForeground(desc.foreground()); + format.setBackground(desc.background()); + format.setBold(desc.format().bold()); + format.setItalic(desc.format().italic()); } else { - m_formats[name].fromString(fmt); + format.fromString(fmt); } + m_scheme.setFormatFor(name, format); } return true; } @@ -215,14 +139,17 @@ bool FontSettings::equals(const FontSettings &f) const return m_family == f.m_family && m_fontSize == f.m_fontSize && m_antialias == f.m_antialias - && m_formats == f.m_formats; + && m_scheme == f.m_scheme; } QTextCharFormat FontSettings::toTextCharFormat(const QString &category) const { - const Format f = m_formats.value(category); + const Format &f = m_scheme.formatFor(category); + const QLatin1String textCategory("Text"); + QTextCharFormat tf; - if (category == QLatin1String("Text")) { + + if (category == textCategory) { tf.setFontFamily(m_family); tf.setFontPointSize(m_fontSize); tf.setFontStyleStrategy(m_antialias ? QFont::PreferAntialias : QFont::NoAntialias); @@ -230,7 +157,7 @@ QTextCharFormat FontSettings::toTextCharFormat(const QString &category) const if (f.foreground().isValid()) tf.setForeground(f.foreground()); - if (f.background().isValid() && (category == QLatin1String("Text") || f.background() != m_formats.value(QLatin1String("Text")).background())) + if (f.background().isValid() && (category == textCategory || f.background() != m_scheme.formatFor(textCategory).background())) tf.setBackground(f.background()); tf.setFontWeight(f.bold() ? QFont::Bold : QFont::Normal); tf.setFontItalic(f.italic()); @@ -280,7 +207,7 @@ void FontSettings::setAntialias(bool antialias) Format &FontSettings::formatFor(const QString &category) { - return m_formats[category]; + return m_scheme.formatFor(category); } QString FontSettings::defaultFixedFontFamily() diff --git a/src/plugins/texteditor/fontsettings.h b/src/plugins/texteditor/fontsettings.h index fb4d4c01038e9f30071190f9041b460c277dd629..20eb325bebf646fed8cb1718cd0fe61e18620789 100644 --- a/src/plugins/texteditor/fontsettings.h +++ b/src/plugins/texteditor/fontsettings.h @@ -32,6 +32,8 @@ #include "texteditor_global.h" +#include "colorscheme.h" + #include <QtCore/QString> #include <QtCore/QList> #include <QtCore/QMap> @@ -47,39 +49,6 @@ namespace TextEditor { class FormatDescription; -// Format for a particular piece of text (text/comment, etc). -class TEXTEDITOR_EXPORT Format -{ -public: - Format(); - - QColor foreground() const { return m_foreground; } - void setForeground(const QColor &foreground); - - QColor background() const { return m_background; } - void setBackground(const QColor &background); - - bool bold() const { return m_bold; } - void setBold(bool bold); - - bool italic() const { return m_italic; } - void setItalic(bool italic); - - bool equals(const Format &f) const; - - QString toString() const; - bool fromString(const QString &str); - -private: - QColor m_foreground; - QColor m_background; - bool m_bold; - bool m_italic; -}; - -inline bool operator==(const Format &f1, const Format &f2) { return f1.equals(f2); } -inline bool operator!=(const Format &f1, const Format &f2) { return !f1.equals(f2); } - /** * Font settings (default font and enumerated list of formats). */ @@ -143,7 +112,7 @@ private: QString m_family; int m_fontSize; bool m_antialias; - QMap<QString, Format> m_formats; + ColorScheme m_scheme; }; inline bool operator==(const FontSettings &f1, const FontSettings &f2) { return f1.equals(f2); } diff --git a/src/plugins/texteditor/fontsettingspage.cpp b/src/plugins/texteditor/fontsettingspage.cpp index d61e91f74689574b2a5178961a920d3403126510..c19d950f51796564aad513356e21485bb391ec47 100644 --- a/src/plugins/texteditor/fontsettingspage.cpp +++ b/src/plugins/texteditor/fontsettingspage.cpp @@ -129,16 +129,6 @@ FormatDescription::FormatDescription(const QString &name, const QString &trName, m_format.setForeground(color); } -QString FormatDescription::name() const -{ - return m_name; -} - -QString FormatDescription::trName() const -{ - return m_trName; -} - QColor FormatDescription::foreground() const { if (m_name == QLatin1String(Constants::C_LINE_NUMBER)) { diff --git a/src/plugins/texteditor/fontsettingspage.h b/src/plugins/texteditor/fontsettingspage.h index 21fbbb7d2514e8d216e369ba4c169c0c79ac491f..c9d1c3dcaa1206c63b2943484c912b3ae56b07df 100644 --- a/src/plugins/texteditor/fontsettingspage.h +++ b/src/plugins/texteditor/fontsettingspage.h @@ -59,8 +59,12 @@ public: FormatDescription(const QString &name, const QString &trName, const QColor &foreground = Qt::black); - QString name() const; - QString trName() const; + QString name() const + { return m_name; } + + QString trName() const + { return m_trName; } + QColor foreground() const; QColor background() const; diff --git a/src/plugins/texteditor/texteditor.pro b/src/plugins/texteditor/texteditor.pro index 639ac2acce36daeb1900e11f356d226060fb3ae0..32a0867755bff837a7f4505af1f167bac566e9a5 100644 --- a/src/plugins/texteditor/texteditor.pro +++ b/src/plugins/texteditor/texteditor.pro @@ -26,7 +26,8 @@ SOURCES += texteditorplugin.cpp \ basefilefind.cpp \ texteditorsettings.cpp \ codecselector.cpp \ - findincurrentfile.cpp + findincurrentfile.cpp \ + colorscheme.cpp HEADERS += texteditorplugin.h \ textfilewizard.h \ plaintexteditor.h \ @@ -56,7 +57,8 @@ HEADERS += texteditorplugin.h \ basefilefind.h \ texteditorsettings.h \ codecselector.h \ - findincurrentfile.h + findincurrentfile.h \ + colorscheme.h FORMS += behaviorsettingspage.ui \ displaysettingspage.ui \ fontsettingspage.ui