1 /*************************************************************************** 2 * Copyright (C) 2004-2019 by Thomas Fischer <fischer@unix-ag.uni-kl.de> * 3 * * 4 * This program is free software; you can redistribute it and/or modify * 5 * it under the terms of the GNU General Public License as published by * 6 * the Free Software Foundation; either version 2 of the License, or * 7 * (at your option) any later version. * 8 * * 9 * This program is distributed in the hope that it will be useful, * 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 12 * GNU General Public License for more details. * 13 * * 14 * You should have received a copy of the GNU General Public License * 15 * along with this program; if not, see <https://www.gnu.org/licenses/>. * 16 ***************************************************************************/ 17 18 #include "entrylayout.h" 19 20 #include <QStandardPaths> 21 22 #include <KSharedConfig> 23 #include <KConfigGroup> 24 #include <KLocalizedString> 25 26 #include "preferences.h" 27 #include "logging_gui.h" 28 29 static const int entryLayoutMaxTabCount = 256; 30 static const int entryLayoutMaxFieldPerTabCount = 256; 31 32 class EntryLayout::EntryLayoutPrivate 33 { 34 public: 35 EntryLayout *p; 36 37 EntryLayoutPrivate(EntryLayout *parent) 38 : p(parent) { 39 /// nothing 40 } 41 42 static QString convert(KBibTeX::FieldInputType fil) { 43 switch (fil) { 44 case KBibTeX::SingleLine : return QStringLiteral("SingleLine"); 45 case KBibTeX::MultiLine : return QStringLiteral("MultiLine"); 46 case KBibTeX::List : return QStringLiteral("List"); 47 case KBibTeX::URL : return QStringLiteral("URL"); 48 case KBibTeX::Month : return QStringLiteral("Month"); 49 case KBibTeX::Edition : return QStringLiteral("Edition"); 50 case KBibTeX::Color : return QStringLiteral("Color"); 51 case KBibTeX::PersonList : return QStringLiteral("PersonList"); 52 case KBibTeX::KeywordList : return QStringLiteral("KeywordList"); 53 case KBibTeX::CrossRef : return QStringLiteral("CrossRef"); 54 case KBibTeX::StarRating : return QStringLiteral("StarRating"); 55 case KBibTeX::UrlList : return QStringLiteral("UrlList"); 56 } 57 return QString(); 58 } 59 60 static KBibTeX::FieldInputType convert(const QString &text) { 61 if (text == QStringLiteral("List")) 62 return KBibTeX::List; 63 else if (text == QStringLiteral("MultiLine")) 64 return KBibTeX::MultiLine; 65 else if (text == QStringLiteral("URL")) 66 return KBibTeX::URL; 67 else if (text == QStringLiteral("UrlList")) 68 return KBibTeX::UrlList; 69 else if (text == QStringLiteral("Month")) 70 return KBibTeX::Month; 71 else if (text == QStringLiteral("Edition")) 72 return KBibTeX::Edition; 73 else if (text == QStringLiteral("Color")) 74 return KBibTeX::Color; 75 else if (text == QStringLiteral("PersonList")) 76 return KBibTeX::PersonList; 77 else if (text == QStringLiteral("KeywordList")) 78 return KBibTeX::KeywordList; 79 else if (text == QStringLiteral("CrossRef")) 80 return KBibTeX::CrossRef; 81 else if (text == QStringLiteral("StarRating")) 82 return KBibTeX::StarRating; 83 else 84 return KBibTeX::SingleLine; 85 } 86 }; 87 88 EntryLayout::EntryLayout(const QString &style) 89 : QVector<QSharedPointer<EntryTabLayout> >(), d(new EntryLayoutPrivate(this)) 90 { 91 load(style); 92 } 93 94 EntryLayout::~EntryLayout() 95 { 96 delete d; 97 } 98 99 const EntryLayout &EntryLayout::instance() 100 { 101 static const EntryLayout singletonBibTeX(QStringLiteral("bibtex")), singletonBibLaTeX(QStringLiteral("biblatex")); 102 return Preferences::instance().bibliographySystem() == Preferences::BibLaTeX ? singletonBibLaTeX : singletonBibTeX; 103 } 104 105 void EntryLayout::load(const QString &style) 106 { 107 clear(); 108 109 const QString stylefile = QStringLiteral("kbibtex/") + style + QStringLiteral(".kbstyle"); 110 KSharedConfigPtr layoutConfig = KSharedConfig::openConfig(stylefile, KConfig::FullConfig, QStandardPaths::GenericDataLocation); 111 static const QString groupName = QStringLiteral("EntryLayoutTab"); 112 const KConfigGroup configGroup(layoutConfig, groupName); 113 const int tabCount = qMin(configGroup.readEntry("count", 0), entryLayoutMaxTabCount); 114 115 for (int tab = 1; tab <= tabCount; ++tab) { 116 const QString groupName = QString(QStringLiteral("EntryLayoutTab%1")).arg(tab); 117 const KConfigGroup configGroup(layoutConfig, groupName); 118 119 QSharedPointer<EntryTabLayout> etl = QSharedPointer<EntryTabLayout>(new EntryTabLayout); 120 etl->uiCaption = i18n(configGroup.readEntry("uiCaption", QString()).toUtf8().constData()); 121 etl->iconName = configGroup.readEntry("iconName", "entry"); 122 etl->columns = configGroup.readEntry("columns", 1); 123 if (etl->uiCaption.isEmpty()) 124 continue; 125 126 const int fieldCount = qMin(configGroup.readEntry("count", 0), entryLayoutMaxFieldPerTabCount); 127 for (int field = 1; field <= fieldCount; ++field) { 128 SingleFieldLayout sfl; 129 sfl.bibtexLabel = configGroup.readEntry(QString(QStringLiteral("bibtexLabel%1")).arg(field), QString()); 130 sfl.uiLabel = i18n(configGroup.readEntry(QString(QStringLiteral("uiLabel%1")).arg(field), QString()).toUtf8().constData()); 131 sfl.fieldInputLayout = EntryLayoutPrivate::convert(configGroup.readEntry(QString(QStringLiteral("fieldInputLayout%1")).arg(field), "SingleLine")); 132 if (sfl.bibtexLabel.isEmpty() || sfl.uiLabel.isEmpty()) 133 continue; 134 r_mark_regions(struct SN_env * z)135 etl->singleFieldLayouts.append(sfl); 136 } 137 append(etl); 138 } 139 140 if (isEmpty()) qCWarning(LOG_KBIBTEX_GUI) << "List of entry layouts is empty"; 141 } 142