File indexing completed on 2025-02-23 04:42:18
0001 /*************************************************************************** 0002 * SPDX-License-Identifier: GPL-2.0-or-later 0003 * * 0004 * SPDX-FileCopyrightText: 2004-2019 Thomas Fischer <fischer@unix-ag.uni-kl.de> 0005 * * 0006 * This program is free software; you can redistribute it and/or modify * 0007 * it under the terms of the GNU General Public License as published by * 0008 * the Free Software Foundation; either version 2 of the License, or * 0009 * (at your option) any later version. * 0010 * * 0011 * This program is distributed in the hope that it will be useful, * 0012 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 0013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 0014 * GNU General Public License for more details. * 0015 * * 0016 * You should have received a copy of the GNU General Public License * 0017 * along with this program; if not, see <https://www.gnu.org/licenses/>. * 0018 ***************************************************************************/ 0019 0020 #include "entrylayout.h" 0021 0022 #include <QStandardPaths> 0023 0024 #include <KSharedConfig> 0025 #include <KConfigGroup> 0026 #include <KLocalizedString> 0027 0028 #include <Preferences> 0029 #include "logging_gui.h" 0030 0031 static const int entryLayoutMaxTabCount = 256; 0032 static const int entryLayoutMaxFieldPerTabCount = 256; 0033 0034 class EntryLayout::EntryLayoutPrivate 0035 { 0036 public: 0037 EntryLayout *p; 0038 0039 EntryLayoutPrivate(EntryLayout *parent) 0040 : p(parent) { 0041 /// nothing 0042 } 0043 0044 static QString convert(KBibTeX::FieldInputType fil) { 0045 switch (fil) { 0046 case KBibTeX::FieldInputType::SingleLine : return QStringLiteral("SingleLine"); 0047 case KBibTeX::FieldInputType::MultiLine : return QStringLiteral("MultiLine"); 0048 case KBibTeX::FieldInputType::List : return QStringLiteral("List"); 0049 case KBibTeX::FieldInputType::Url : return QStringLiteral("URL"); 0050 case KBibTeX::FieldInputType::Month : return QStringLiteral("Month"); 0051 case KBibTeX::FieldInputType::Edition : return QStringLiteral("Edition"); 0052 case KBibTeX::FieldInputType::Color : return QStringLiteral("Color"); 0053 case KBibTeX::FieldInputType::PersonList : return QStringLiteral("PersonList"); 0054 case KBibTeX::FieldInputType::KeywordList : return QStringLiteral("KeywordList"); 0055 case KBibTeX::FieldInputType::CrossRef : return QStringLiteral("CrossRef"); 0056 case KBibTeX::FieldInputType::StarRating : return QStringLiteral("StarRating"); 0057 case KBibTeX::FieldInputType::UrlList : return QStringLiteral("UrlList"); 0058 } 0059 return QString(); 0060 } 0061 0062 static KBibTeX::FieldInputType convert(const QString &text) { 0063 if (text == QStringLiteral("List")) 0064 return KBibTeX::FieldInputType::List; 0065 else if (text == QStringLiteral("MultiLine")) 0066 return KBibTeX::FieldInputType::MultiLine; 0067 else if (text == QStringLiteral("URL")) 0068 return KBibTeX::FieldInputType::Url; 0069 else if (text == QStringLiteral("UrlList")) 0070 return KBibTeX::FieldInputType::UrlList; 0071 else if (text == QStringLiteral("Month")) 0072 return KBibTeX::FieldInputType::Month; 0073 else if (text == QStringLiteral("Edition")) 0074 return KBibTeX::FieldInputType::Edition; 0075 else if (text == QStringLiteral("Color")) 0076 return KBibTeX::FieldInputType::Color; 0077 else if (text == QStringLiteral("PersonList")) 0078 return KBibTeX::FieldInputType::PersonList; 0079 else if (text == QStringLiteral("KeywordList")) 0080 return KBibTeX::FieldInputType::KeywordList; 0081 else if (text == QStringLiteral("CrossRef")) 0082 return KBibTeX::FieldInputType::CrossRef; 0083 else if (text == QStringLiteral("StarRating")) 0084 return KBibTeX::FieldInputType::StarRating; 0085 else 0086 return KBibTeX::FieldInputType::SingleLine; 0087 } 0088 0089 void load(const QString &style) 0090 { 0091 p->clear(); 0092 0093 const QString stylefile = QStringLiteral("kbibtex/") + style + QStringLiteral(".kbstyle"); 0094 KSharedConfigPtr layoutConfig = KSharedConfig::openConfig(stylefile, KConfig::FullConfig, QStandardPaths::GenericDataLocation); 0095 static const QString groupName = QStringLiteral("EntryLayoutTab"); 0096 const KConfigGroup configGroup(layoutConfig, groupName); 0097 const int tabCount = qMin(configGroup.readEntry("count", 0), entryLayoutMaxTabCount); 0098 0099 for (int tab = 1; tab <= tabCount; ++tab) { 0100 const QString groupName = QString(QStringLiteral("EntryLayoutTab%1")).arg(tab); 0101 const KConfigGroup configGroup(layoutConfig, groupName); 0102 0103 QSharedPointer<EntryTabLayout> etl = QSharedPointer<EntryTabLayout>(new EntryTabLayout); 0104 etl->identifier = configGroup.readEntry("identifier", QString(QStringLiteral("etl%1")).arg(tab)); 0105 etl->uiCaption = i18n(configGroup.readEntry("uiCaption", QString()).toUtf8().constData()); 0106 etl->iconName = configGroup.readEntry("iconName", "entry"); 0107 etl->columns = configGroup.readEntry("columns", 1); 0108 if (etl->uiCaption.isEmpty()) 0109 continue; 0110 0111 const int fieldCount = qMin(configGroup.readEntry("count", 0), entryLayoutMaxFieldPerTabCount); 0112 for (int field = 1; field <= fieldCount; ++field) { 0113 SingleFieldLayout sfl; 0114 sfl.bibtexLabel = configGroup.readEntry(QString(QStringLiteral("bibtexLabel%1")).arg(field), QString()); 0115 sfl.uiLabel = i18n(configGroup.readEntry(QString(QStringLiteral("uiLabel%1")).arg(field), QString()).toUtf8().constData()); 0116 sfl.fieldInputLayout = EntryLayoutPrivate::convert(configGroup.readEntry(QString(QStringLiteral("fieldInputLayout%1")).arg(field), "SingleLine")); 0117 if (sfl.bibtexLabel.isEmpty() || sfl.uiLabel.isEmpty()) 0118 continue; 0119 0120 etl->singleFieldLayouts.append(sfl); 0121 } 0122 0123 const QString untranslatedInfoMessage = configGroup.readEntry("infoMessage", QString()); 0124 if (!untranslatedInfoMessage.isEmpty()) { 0125 const QString infoMessagePipeSeparated = i18n(untranslatedInfoMessage.toUtf8().constData()); 0126 if (!infoMessagePipeSeparated.isEmpty()) 0127 etl->infoMessages = infoMessagePipeSeparated.split(QLatin1Char('|')); 0128 } 0129 0130 p->append(etl); 0131 } 0132 0133 if (p->isEmpty()) qCWarning(LOG_KBIBTEX_GUI) << "List of entry layouts is empty"; 0134 } 0135 }; 0136 0137 EntryLayout::EntryLayout(const QString &style) 0138 : QVector<QSharedPointer<EntryTabLayout> >(), d(new EntryLayoutPrivate(this)) 0139 { 0140 d->load(style); 0141 } 0142 0143 EntryLayout::~EntryLayout() 0144 { 0145 delete d; 0146 } 0147 0148 const EntryLayout &EntryLayout::instance() 0149 { 0150 static const EntryLayout singletonBibTeX(QStringLiteral("bibtex")), singletonBibLaTeX(QStringLiteral("biblatex")); 0151 return Preferences::instance().bibliographySystem() == Preferences::BibliographySystem::BibLaTeX ? singletonBibLaTeX : singletonBibTeX; 0152 }