File indexing completed on 2024-04-28 04:32:42

0001 /*
0002     SPDX-FileCopyrightText: 2007 Pino Toscano <pino@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "form.h"
0008 #include "form_p.h"
0009 
0010 // qt includes
0011 #include <QVariant>
0012 
0013 #include "action.h"
0014 
0015 using namespace Okular;
0016 
0017 FormFieldPrivate::FormFieldPrivate(FormField::FieldType type)
0018     : m_type(type)
0019     , m_activateAction(nullptr)
0020     , q_ptr(nullptr)
0021 {
0022 }
0023 
0024 FormFieldPrivate::~FormFieldPrivate()
0025 {
0026     delete m_activateAction;
0027     qDeleteAll(m_additionalActions);
0028     qDeleteAll(m_additionalAnnotActions);
0029 }
0030 
0031 void FormFieldPrivate::setDefault()
0032 {
0033     m_default = value();
0034 }
0035 
0036 FormField::FormField(FormFieldPrivate &dd)
0037     : d_ptr(&dd)
0038 {
0039     d_ptr->q_ptr = this;
0040 }
0041 
0042 FormField::~FormField()
0043 {
0044     delete d_ptr;
0045 }
0046 
0047 FormField::FieldType FormField::type() const
0048 {
0049     Q_D(const FormField);
0050     return d->m_type;
0051 }
0052 
0053 bool FormField::isReadOnly() const
0054 {
0055     return false;
0056 }
0057 
0058 void FormField::setReadOnly(bool)
0059 {
0060 }
0061 
0062 bool FormField::isVisible() const
0063 {
0064     return true;
0065 }
0066 
0067 void FormField::setVisible(bool)
0068 {
0069 }
0070 
0071 bool FormField::isPrintable() const
0072 {
0073     return true;
0074 }
0075 
0076 void FormField::setPrintable(bool)
0077 {
0078 }
0079 
0080 Action *FormField::activationAction() const
0081 {
0082     Q_D(const FormField);
0083     return d->m_activateAction;
0084 }
0085 
0086 void FormField::setActivationAction(Action *action)
0087 {
0088     Q_D(FormField);
0089     delete d->m_activateAction;
0090     d->m_activateAction = action;
0091 }
0092 
0093 Action *FormField::additionalAction(AdditionalActionType type) const
0094 {
0095     Q_D(const FormField);
0096     return d->m_additionalActions.value(type);
0097 }
0098 
0099 void FormField::setAdditionalAction(AdditionalActionType type, Action *action)
0100 {
0101     Q_D(FormField);
0102     delete d->m_additionalActions.value(type);
0103     d->m_additionalActions[type] = action;
0104 }
0105 
0106 Action *FormField::additionalAction(Annotation::AdditionalActionType type) const
0107 {
0108     Q_D(const FormField);
0109     return d->m_additionalAnnotActions.value(type);
0110 }
0111 
0112 void FormField::setAdditionalAction(Annotation::AdditionalActionType type, Action *action)
0113 {
0114     Q_D(FormField);
0115     delete d->m_additionalAnnotActions.value(type);
0116     d->m_additionalAnnotActions[type] = action;
0117 }
0118 
0119 QList<Action *> FormField::additionalActions() const
0120 {
0121     Q_D(const FormField);
0122     // yes, calling values() is not great but it's a list of ~10 elements, we can live with that
0123     return d->m_additionalAnnotActions.values() + d->m_additionalActions.values(); // clazy:exclude=container-anti-pattern
0124 }
0125 
0126 Page *FormField::page() const
0127 {
0128     Q_D(const FormField);
0129     return d->m_page;
0130 }
0131 
0132 class Okular::FormFieldButtonPrivate : public Okular::FormFieldPrivate
0133 {
0134 public:
0135     FormFieldButtonPrivate()
0136         : FormFieldPrivate(FormField::FormButton)
0137     {
0138     }
0139 
0140     Q_DECLARE_PUBLIC(FormFieldButton)
0141 
0142     void setValue(const QString &v) override
0143     {
0144         Q_Q(FormFieldButton);
0145         q->setState(QVariant(v).toBool());
0146     }
0147 
0148     QString value() const override
0149     {
0150         Q_Q(const FormFieldButton);
0151         return QVariant::fromValue<bool>(q->state()).toString();
0152     }
0153 };
0154 
0155 FormFieldButton::FormFieldButton()
0156     : FormField(*new FormFieldButtonPrivate())
0157 {
0158 }
0159 
0160 FormFieldButton::~FormFieldButton()
0161 {
0162 }
0163 
0164 void FormFieldButton::setState(bool)
0165 {
0166 }
0167 
0168 void FormFieldButton::setIcon(Okular::FormField *)
0169 {
0170 }
0171 
0172 class Okular::FormFieldTextPrivate : public Okular::FormFieldPrivate
0173 {
0174 public:
0175     FormFieldTextPrivate()
0176         : FormFieldPrivate(FormField::FormText)
0177     {
0178     }
0179 
0180     Q_DECLARE_PUBLIC(FormFieldText)
0181 
0182     void setValue(const QString &v) override
0183     {
0184         Q_Q(FormFieldText);
0185         q->setText(v);
0186     }
0187 
0188     QString value() const override
0189     {
0190         Q_Q(const FormFieldText);
0191         return q->text();
0192     }
0193 };
0194 
0195 FormFieldText::FormFieldText()
0196     : FormField(*new FormFieldTextPrivate())
0197 {
0198 }
0199 
0200 FormFieldText::~FormFieldText()
0201 {
0202 }
0203 
0204 void FormFieldText::setText(const QString &)
0205 {
0206 }
0207 
0208 bool FormFieldText::isPassword() const
0209 {
0210     return false;
0211 }
0212 
0213 bool FormFieldText::isRichText() const
0214 {
0215     return false;
0216 }
0217 
0218 int FormFieldText::maximumLength() const
0219 {
0220     return -1;
0221 }
0222 
0223 Qt::Alignment FormFieldText::textAlignment() const
0224 {
0225     return Qt::AlignVCenter | Qt::AlignLeft;
0226 }
0227 
0228 bool FormFieldText::canBeSpellChecked() const
0229 {
0230     return false;
0231 }
0232 
0233 class Okular::FormFieldChoicePrivate : public Okular::FormFieldPrivate
0234 {
0235 public:
0236     FormFieldChoicePrivate()
0237         : FormFieldPrivate(FormField::FormChoice)
0238     {
0239     }
0240 
0241     Q_DECLARE_PUBLIC(FormFieldChoice)
0242 
0243     void setValue(const QString &v) override
0244     {
0245         Q_Q(FormFieldChoice);
0246         const QStringList choices = v.split(QLatin1Char(';'), Qt::SkipEmptyParts);
0247         QList<int> newchoices;
0248         for (const QString &str : choices) {
0249             bool ok = true;
0250             int val = str.toInt(&ok);
0251             if (ok) {
0252                 newchoices.append(val);
0253             }
0254         }
0255         if (!newchoices.isEmpty()) {
0256             q->setCurrentChoices(newchoices);
0257         }
0258     }
0259 
0260     QString value() const override
0261     {
0262         Q_Q(const FormFieldChoice);
0263         QList<int> choices = q->currentChoices();
0264         std::sort(choices.begin(), choices.end());
0265         QStringList list;
0266         for (const int c : std::as_const(choices)) {
0267             list.append(QString::number(c));
0268         }
0269         return list.join(QStringLiteral(";"));
0270     }
0271 
0272     QMap<QString, QString> exportValues;
0273 };
0274 
0275 FormFieldChoice::FormFieldChoice()
0276     : FormField(*new FormFieldChoicePrivate())
0277 {
0278 }
0279 
0280 FormFieldChoice::~FormFieldChoice()
0281 {
0282 }
0283 
0284 bool FormFieldChoice::isEditable() const
0285 {
0286     return false;
0287 }
0288 
0289 bool FormFieldChoice::multiSelect() const
0290 {
0291     return false;
0292 }
0293 
0294 void FormFieldChoice::setCurrentChoices(const QList<int> &)
0295 {
0296 }
0297 
0298 QString FormFieldChoice::editChoice() const
0299 {
0300     return QString();
0301 }
0302 
0303 void FormFieldChoice::setEditChoice(const QString &)
0304 {
0305 }
0306 
0307 Qt::Alignment FormFieldChoice::textAlignment() const
0308 {
0309     return Qt::AlignVCenter | Qt::AlignLeft;
0310 }
0311 
0312 bool FormFieldChoice::canBeSpellChecked() const
0313 {
0314     return false;
0315 }
0316 
0317 void FormFieldChoice::setExportValues(const QMap<QString, QString> &values)
0318 {
0319     Q_D(FormFieldChoice);
0320     d->exportValues = values;
0321 }
0322 
0323 QString FormFieldChoice::exportValueForChoice(const QString &choice) const
0324 {
0325     Q_D(const FormFieldChoice);
0326     return d->exportValues.value(choice, choice);
0327 }
0328 
0329 class Okular::FormFieldSignaturePrivate : public Okular::FormFieldPrivate
0330 {
0331 public:
0332     FormFieldSignaturePrivate()
0333         : FormFieldPrivate(FormField::FormSignature)
0334     {
0335     }
0336 
0337     Q_DECLARE_PUBLIC(FormFieldSignature)
0338 
0339     void setValue(const QString &v) override
0340     {
0341         Q_UNUSED(v)
0342     }
0343 
0344     QString value() const override
0345     {
0346         return QString();
0347     }
0348 };
0349 
0350 FormFieldSignature::FormFieldSignature()
0351     : FormField(*new FormFieldSignaturePrivate())
0352 {
0353 }
0354 
0355 FormFieldSignature::~FormFieldSignature()
0356 {
0357 }