poppler/Annot.cc | 58 ++++++++++++++++++++++++++++++++++++++----------------- poppler/Annot.h | 2 + poppler/Form.cc | 7 ++++++ poppler/Form.h | 3 +- poppler/Link.cc | 9 ++++++++ poppler/Link.h | 2 + 6 files changed, 63 insertions(+), 18 deletions(-)
New commits: commit a4d3db87c3bae5e2a364c828479a6cbb0277069e Author: Albert Astals Cid <[email protected]> Date: Sun Jun 9 20:18:54 2019 +0200 Add AnnotWidget::setFormAdditionalAction And the corresponding Form helper refactor the code that gets the char * from Annot::FormAdditionalActionsType to a function diff --git a/poppler/Annot.cc b/poppler/Annot.cc index eb902591..8a0c261d 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -232,6 +232,14 @@ static LinkAction* getAdditionalAction(Annot::AdditionalActionsType type, Object return linkAction; } +static const char *getFormAdditionalActionKey(Annot::FormAdditionalActionsType type) +{ + return (type == Annot::actionFieldModified ? "K" : + type == Annot::actionFormatField ? "F" : + type == Annot::actionValidateField ? "V" : + type == Annot::actionCalculateField ? "C" : nullptr); +} + //------------------------------------------------------------------------ // AnnotBorderEffect //------------------------------------------------------------------------ @@ -3777,10 +3785,7 @@ LinkAction* AnnotWidget::getFormAdditionalAction(FormAdditionalActionsType formA Object additionalActionsObject = additionalActions.fetch(doc->getXRef()); if (additionalActionsObject.isDict()) { - const char *key = (formAdditionalActionType == Annot::actionFieldModified ? "K" : - formAdditionalActionType == Annot::actionFormatField ? "F" : - formAdditionalActionType == Annot::actionValidateField ? "V" : - formAdditionalActionType == Annot::actionCalculateField ? "C" : nullptr); + const char *key = getFormAdditionalActionKey(formAdditionalActionType); Object actionObject = additionalActionsObject.dictLookup(key); if (actionObject.isDict()) @@ -3790,6 +3795,29 @@ LinkAction* AnnotWidget::getFormAdditionalAction(FormAdditionalActionsType formA return linkAction; } +bool AnnotWidget::setFormAdditionalAction(FormAdditionalActionsType formAdditionalActionType, const GooString &js) +{ + Object additionalActionsObject = additionalActions.fetch(doc->getXRef()); + + if (!additionalActionsObject.isDict()) { + additionalActionsObject = Object(new Dict(doc->getXRef())); + annotObj.dictSet("AA", additionalActionsObject.copy()); + } + + additionalActionsObject.dictSet(getFormAdditionalActionKey(formAdditionalActionType), + LinkJavaScript::createObject(doc->getXRef(), js)); + + if (additionalActions.isRef()) { + doc->getXRef()->setModifiedObject(&additionalActionsObject, additionalActions.getRef()); + } else if (hasRef) { + doc->getXRef()->setModifiedObject(&annotObj, ref); + } else { + error(errInternal, -1, "AnnotWidget::setFormAdditionalAction, where neither additionalActions is ref nor annotobj itself is ref"); + return false; + } + return true; +} + // Grand unified handler for preparing text strings to be drawn into form // fields. Takes as input a text string (in PDFDocEncoding or UTF-16). // Converts some or all of this string to the appropriate encoding for the diff --git a/poppler/Annot.h b/poppler/Annot.h index 96a46c7f..88c165f2 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -1410,6 +1410,8 @@ public: LinkAction *getFormAdditionalAction(FormAdditionalActionsType type); // The caller should delete the result Dict *getParent() { return parent; } + bool setFormAdditionalAction(FormAdditionalActionsType type, const GooString &js); + private: void initialize(PDFDoc *docA, Dict *dict); diff --git a/poppler/Form.cc b/poppler/Form.cc index 3efa6b4f..258d235e 100644 --- a/poppler/Form.cc +++ b/poppler/Form.cc @@ -177,6 +177,13 @@ LinkAction *FormWidget::getAdditionalAction(Annot::FormAdditionalActionsType t) return widget ? widget->getFormAdditionalAction(t) : nullptr; } +bool FormWidget::setAdditionalAction(Annot::FormAdditionalActionsType t, const GooString &js) { + if (!widget) + return false; + + return widget->setFormAdditionalAction(t, js); +} + FormWidgetButton::FormWidgetButton (PDFDoc *docA, Object *aobj, unsigned num, Ref refA, FormField *p) : FormWidget(docA, aobj, num, refA, p) { diff --git a/poppler/Form.h b/poppler/Form.h index 9cc82fc8..923b6c8f 100644 --- a/poppler/Form.h +++ b/poppler/Form.h @@ -6,7 +6,7 @@ // // Copyright 2006 Julien Rebetez <[email protected]> // Copyright 2007, 2008, 2011 Carlos Garcia Campos <[email protected]> -// Copyright 2007-2010, 2012, 2015-2018 Albert Astals Cid <[email protected]> +// Copyright 2007-2010, 2012, 2015-2019 Albert Astals Cid <[email protected]> // Copyright 2010 Mark Riedesel <[email protected]> // Copyright 2011 Pino Toscano <[email protected]> // Copyright 2012 Fabio D'Urso <[email protected]> @@ -119,6 +119,7 @@ public: LinkAction *getActivationAction(); // The caller should not delete the result LinkAction *getAdditionalAction(Annot::FormAdditionalActionsType type); // The caller should delete the result + bool setAdditionalAction(Annot::FormAdditionalActionsType t, const GooString &js); // return the unique ID corresponding to pageNum/fieldNum static int encodeID (unsigned pageNum, unsigned fieldNum); commit f5e49ed4c604e735ee26427eb1a46536938ed80c Author: Albert Astals Cid <[email protected]> Date: Sun Jun 9 20:15:47 2019 +0200 Add LinkJavaScript::createObject Creates an Object that represents a a LinkJavaScript with the given text diff --git a/poppler/Link.cc b/poppler/Link.cc index 5a5e8682..bbba89c9 100644 --- a/poppler/Link.cc +++ b/poppler/Link.cc @@ -823,6 +823,15 @@ LinkJavaScript::~LinkJavaScript() { } } +Object LinkJavaScript::createObject(XRef *xref, const GooString &js) +{ + Dict *linkDict = new Dict(xref); + linkDict->add("S", Object(objName, "JavaScript")); + linkDict->add("JS", Object(js.copy())); + + return Object(linkDict); +} + //------------------------------------------------------------------------ // LinkOCGState //------------------------------------------------------------------------ diff --git a/poppler/Link.h b/poppler/Link.h index c1079bd5..d610fad0 100644 --- a/poppler/Link.h +++ b/poppler/Link.h @@ -427,6 +427,8 @@ public: LinkActionKind getKind() const override { return actionJavaScript; } const GooString *getScript() const { return js; } + static Object createObject(XRef *xref, const GooString &js); + private: GooString *js; commit 4867583bf4a26566fd20345c45280ea21254c89c Author: Albert Astals Cid <[email protected]> Date: Sun Jun 9 18:43:24 2019 +0200 Annot: Move implementation of getFormAdditionalAction No idea why it was implemented as a static, it's not reused or anything diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 5993d30e..eb902591 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -232,24 +232,6 @@ static LinkAction* getAdditionalAction(Annot::AdditionalActionsType type, Object return linkAction; } -static LinkAction* getFormAdditionalAction(Annot::FormAdditionalActionsType type, Object *additionalActions, PDFDoc *doc) { - LinkAction *linkAction = nullptr; - Object additionalActionsObject = additionalActions->fetch(doc->getXRef()); - - if (additionalActionsObject.isDict()) { - const char *key = (type == Annot::actionFieldModified ? "K" : - type == Annot::actionFormatField ? "F" : - type == Annot::actionValidateField ? "V" : - type == Annot::actionCalculateField ? "C" : nullptr); - - Object actionObject = additionalActionsObject.dictLookup(key); - if (actionObject.isDict()) - linkAction = LinkAction::parseAction(&actionObject, doc->getCatalog()->getBaseURI()); - } - - return linkAction; -} - //------------------------------------------------------------------------ // AnnotBorderEffect //------------------------------------------------------------------------ @@ -3791,7 +3773,21 @@ LinkAction* AnnotWidget::getAdditionalAction(AdditionalActionsType additionalAct LinkAction* AnnotWidget::getFormAdditionalAction(FormAdditionalActionsType formAdditionalActionType) { - return ::getFormAdditionalAction(formAdditionalActionType, &additionalActions, doc); + LinkAction *linkAction = nullptr; + Object additionalActionsObject = additionalActions.fetch(doc->getXRef()); + + if (additionalActionsObject.isDict()) { + const char *key = (formAdditionalActionType == Annot::actionFieldModified ? "K" : + formAdditionalActionType == Annot::actionFormatField ? "F" : + formAdditionalActionType == Annot::actionValidateField ? "V" : + formAdditionalActionType == Annot::actionCalculateField ? "C" : nullptr); + + Object actionObject = additionalActionsObject.dictLookup(key); + if (actionObject.isDict()) + linkAction = LinkAction::parseAction(&actionObject, doc->getCatalog()->getBaseURI()); + } + + return linkAction; } // Grand unified handler for preparing text strings to be drawn into form _______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
