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 }