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