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 }