1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7
8 #include "cmdannotations.h"
9 #include "cmdutil.h"
10 #include "util.h"
11 #include "scribuscore.h"
12
13 static PyObject *getLinkData(PyObject *rv, int page, const QString& action);
14 static void prepareannotation(PageItem *item);
15 static void setactioncoords(Annotation &a, int x, int y);
16 static bool testPageItem(PageItem *item);
17 static void add_text_to_dict(PyObject *drv, PageItem *item);
18
scribus_setjsactionscript(PyObject *,PyObject * args)19 PyObject *scribus_setjsactionscript(PyObject * /*self*/, PyObject* args)
20 {
21 /*
22 Java_ReleaseButton = 0,
23 Java_PressButton = 1,
24 Java_EnterWidget = 2,
25 Java_LeaveWidget = 3,
26 Java_FocusIn = 4,
27 Java_FocusOut = 5,
28 Java_SelectionChg = 6,
29 Java_FieldFormat = 7,
30 Java_FieldValidate = 8,
31 Java_FieldCalculate = 9
32 */
33 int action;
34 char *script = const_cast<char*>("");
35 char *name = const_cast<char*>("");
36
37 if (!PyArg_ParseTuple(args, "is|es",&action,&script,"utf-8", &name))
38 return nullptr;
39
40 if (action < 0 || action > 9)
41 {
42 QString qnum = QString("%1").arg(action);
43 PyErr_SetString(PyExc_RuntimeError,
44 QObject::tr("Action must be an integer in range 0-9 " + qnum.toUtf8(), "python error").toLocal8Bit().constData());
45 return nullptr;
46 }
47
48 if (!checkHaveDocument())
49 return nullptr;
50
51 PageItem *item = GetUniqueItem(QString::fromUtf8(name));
52 if (item == nullptr)
53 return nullptr;
54
55 if (!item->isAnnotation())
56 {
57 PyErr_SetString(PyExc_RuntimeError,
58 QObject::tr("Page item must be an annotation", "python error").toLocal8Bit().constData());
59 return nullptr;
60 }
61
62 Annotation &annotation = item->annotation();
63 annotation.setActionType(Annotation::Action_JavaScript);
64 QString javascript = QString::fromUtf8(script);
65
66 switch (action)
67 {
68 case Annotation::Java_ReleaseButton:
69 annotation.setAction(javascript);
70 break;
71 case Annotation::Java_PressButton:
72 annotation.setD_act(javascript);
73 break;
74 case Annotation::Java_EnterWidget:
75 annotation.setE_act(javascript);
76 break;
77 case Annotation::Java_LeaveWidget:
78 annotation.setX_act(javascript);
79 break;
80 case Annotation::Java_FocusIn:
81 annotation.setFo_act(javascript);
82 break;
83 case Annotation::Java_FocusOut:
84 annotation.setBl_act(javascript);
85 break;
86 case Annotation::Java_SelectionChg:
87 annotation.setK_act(javascript);
88 break;
89 case Annotation::Java_FieldFormat:
90 annotation.setF_act(javascript);
91 break;
92 case Annotation::Java_FieldValidate:
93 annotation.setV_act(javascript);
94 break;
95 case Annotation::Java_FieldCalculate:
96 annotation.setC_act(javascript);
97 break;
98 }
99
100 Py_RETURN_NONE;
101 }
102
scribus_getjsactionscript(PyObject *,PyObject * args)103 PyObject *scribus_getjsactionscript(PyObject * /*self*/, PyObject* args)
104 {
105 int action;
106 char *name = const_cast<char*>("");
107
108 if (!PyArg_ParseTuple(args, "i|es",&action,"utf-8", &name))
109 return nullptr;
110
111 if (action < 0 || action > 9)
112 {
113 QString qnum = QString("%1").arg(action);
114 PyErr_SetString(PyExc_RuntimeError,
115 QObject::tr("Action must be 0-9 " + qnum.toUtf8(), "python error").toLocal8Bit().constData());
116 return nullptr;
117 }
118
119 if (!checkHaveDocument())
120 return nullptr;
121
122 PageItem *item = GetUniqueItem(QString::fromUtf8(name));
123 if (item == nullptr)
124 return nullptr;
125
126 if (!item->isAnnotation())
127 {
128 PyErr_SetString(PyExc_RuntimeError,
129 QObject::tr("Page item must be an annotation", "python error").toLocal8Bit().constData());
130 return nullptr;
131 }
132
133 Annotation &annotation = item->annotation();
134 if (annotation.ActionType() != Annotation::Action_JavaScript)
135 Py_RETURN_NONE;
136
137 QString rv;
138 switch (action)
139 {
140 case Annotation::Java_ReleaseButton:
141 rv = annotation.Action();
142 break;
143 case Annotation::Java_PressButton:
144 rv = annotation.D_act();
145 break;
146 case Annotation::Java_EnterWidget:
147 rv = annotation.E_act();
148 break;
149 case Annotation::Java_LeaveWidget:
150 rv = annotation.X_act();
151 break;
152 case Annotation::Java_FocusIn:
153 rv = annotation.Fo_act();
154 break;
155 case Annotation::Java_FocusOut:
156 rv = annotation.Bl_act();
157 break;
158 case Annotation::Java_SelectionChg:
159 rv = annotation.K_act();
160 break;
161 case Annotation::Java_FieldFormat:
162 rv = annotation.F_act();
163 break;
164 case Annotation::Java_FieldValidate:
165 rv = annotation.V_act();
166 break;
167 case Annotation::Java_FieldCalculate:
168 rv = annotation.C_act();
169 break;
170 }
171
172 PyObject *rstr = PyString_FromString(rv.toUtf8());
173 return rstr;
174 }
175
scribus_isannotated(PyObject *,PyObject * args,PyObject * keywds)176 PyObject *scribus_isannotated(PyObject * /*self*/, PyObject* args, PyObject *keywds)
177 {
178 char *name = const_cast<char*>("");
179 PyObject *deannotate = Py_False;
180 char *kwlist[] = {const_cast<char*>(""),const_cast<char*>("deannotate"), nullptr};
181
182 if (!PyArg_ParseTupleAndKeywords(args, keywds, "|esO", kwlist, "utf-8", &name, &deannotate))
183 return nullptr;
184 if (!checkHaveDocument())
185 return nullptr;
186
187 PageItem *item = GetUniqueItem(QString::fromUtf8(name));
188 if (item == nullptr)
189 return nullptr;
190
191 if (item->isAnnotation())
192 {
193 if (PyObject_IsTrue(deannotate)==1)
194 {
195 item->setIsAnnotation(false);
196 Py_RETURN_NONE;
197 }
198
199 Annotation a = item->annotation();
200 int atype = a.Type();
201 int actype = a.ActionType();
202
203 PyObject *drv = PyDict_New();
204 if (atype == Annotation::Link && (actype == Annotation::Action_GoToR_FileAbs || actype == Annotation::Action_GoToR_FileRel))
205 {
206 char *name3;
207 if (actype== Annotation::Action_GoToR_FileAbs)
208 name3 =const_cast<char*>("Link File Absolute");
209 else
210 name3 =const_cast<char*>("Link File Relative");
211
212 getLinkData(drv, a.Ziel(), a.Action());
213 const char path[] = "path";
214 PyObject *pathkey = PyString_FromString(path);
215 PyObject *pathvalue = PyString_FromString(a.Extern().toUtf8());
216 PyDict_SetItem(drv, pathkey, pathvalue);
217 add_text_to_dict(drv, item);
218 PyObject *rv = Py_BuildValue("(sO)", name3, drv);
219 return rv;
220 }
221 if (atype == Annotation::Link && actype == Annotation::Action_URI)
222 {
223 const char uri[] = "uri";
224 PyObject *ukey = PyString_FromString(uri);
225 PyObject *uval = PyString_FromString(a.Extern().toUtf8());
226 PyDict_SetItem(drv, ukey, uval);
227 add_text_to_dict(drv, item);
228 char *name4= const_cast<char*>("Link URI");
229 PyObject *rv = Py_BuildValue("(sO)", name4, drv);
230 return rv;
231 }
232 if (atype == Annotation::Link)
233 {
234 getLinkData(drv, a.Ziel(), a.Action());
235 const char name2[] = "Link";
236 add_text_to_dict(drv, item);
237 PyObject *rv = Py_BuildValue("(sO)", name2, drv);
238 return rv;
239 }
240 if (atype == Annotation::Button)
241 {
242 const char name5[] = "Button";
243 add_text_to_dict(drv, item);
244 PyObject *rv = Py_BuildValue("(sO)", name5, drv);
245 return rv;
246 }
247 if (atype == Annotation::RadioButton)
248 {
249 const char name4[] = "RadioButton";
250 add_text_to_dict(drv, item);
251 PyObject *rv = Py_BuildValue("(sO)", name4, drv);
252 return rv;
253 }
254 if (atype == Annotation::Textfield)
255 {
256 const char name6[] = "Textfield";
257 add_text_to_dict(drv, item);
258 PyObject *rv = Py_BuildValue("(sO)", name6, drv);
259 return rv;
260 }
261 if (atype == Annotation::Checkbox)
262 {
263 const char name7[] = "Checkbox";
264 add_text_to_dict(drv, item);
265 PyObject *rv = Py_BuildValue("(sO)", name7, drv);
266 return rv;
267 }
268 if (atype == Annotation::Combobox)
269 {
270 const char name4[] = "Combobox";
271 add_text_to_dict(drv, item);
272 PyObject *rv = Py_BuildValue("(sO)", name4, drv);
273 return rv;
274 }
275 if (atype == Annotation::Listbox)
276 {
277 const char name8[] = "Listbox";
278 add_text_to_dict(drv, item);
279 PyObject *rv = Py_BuildValue("(sO)", name8, drv);
280 return rv;
281 }
282 if (atype == Annotation::Text)
283 {
284 /** icons: 0 "Note", 1 "Comment", 2 "Key",
285 3 "Help", 4 "NewParagraph", 5 "Paragraph", 6 "Insert",
286 7 "Cross", 8 "Circle"
287 */
288 const char name9[] = "Text";
289 int icon = a.Icon();
290 const char *icons[] = {"Note","Comment",
291 "Key", "Help",
292 "NewParagraph","Paragraph",
293 "Insert","Cross",
294 "Circle", nullptr
295 };
296 if (icon >= 0 && icon < 9)
297 {
298 PyObject *iconkey = PyString_FromString("icon");
299 PyObject *iconvalue = PyString_FromString(icons[icon]);
300 PyDict_SetItem(drv, iconkey, iconvalue);
301 }
302
303 PyObject *openkey = PyString_FromString("open");
304 PyObject *open = Py_False;
305 if (a.IsAnOpen())
306 open = Py_True;
307 PyDict_SetItem(drv, openkey, open);
308
309 add_text_to_dict(drv, item);
310 PyObject *rv = Py_BuildValue("(sO)", name9, drv);
311 return rv;
312 }
313 if (atype == Annotation::Annot3D)
314 {
315 const char a3dname[] = "Annot3D";
316 PyObject *rv = Py_BuildValue("(sO)",a3dname, drv);
317 return rv;
318 }
319 const char unknown[] = "Unknown Annotation";
320 PyObject *rv = Py_BuildValue("(sO)", unknown, drv);
321 return rv;
322 }
323
324 Py_RETURN_NONE;
325 }
326
327
scribus_setlinkannotation(PyObject *,PyObject * args)328 PyObject *scribus_setlinkannotation(PyObject* /* self */, PyObject* args)
329 {
330 char *name = const_cast<char*>("");
331 int page, x, y;
332
333 if (!PyArg_ParseTuple(args, "iii|es", &page, &x, &y, "utf-8", &name))
334 return nullptr;
335 if (!checkHaveDocument())
336 return nullptr;
337
338 PageItem *item = GetUniqueItem(QString::fromUtf8(name));
339 if (!testPageItem(item))
340 return nullptr;
341
342 int numpages = ScCore->primaryMainWindow()->doc->Pages->count();
343 if (page <= 0 || page > numpages){
344 QString qnum = QString("%1").arg(numpages);
345 PyErr_SetString(PyExc_RuntimeError,
346 QObject::tr("which must be 1 to " + qnum.toUtf8(), "python error").toLocal8Bit().constData());
347 return nullptr;
348 }
349
350 prepareannotation(item);
351 Annotation &a = item->annotation();
352 a.setType(Annotation::Link);
353 page -= 1;
354 a.setZiel(page);
355 setactioncoords(a, x, y);
356 a.setExtern(QString::fromUtf8(""));
357 a.setActionType(Annotation::Action_GoTo);
358
359 Py_RETURN_NONE;
360 }
361
362
scribus_setfileannotation(PyObject *,PyObject * args,PyObject * keywds)363 PyObject *scribus_setfileannotation(PyObject * /*self*/, PyObject* args, PyObject *keywds)
364 {
365 char *path;
366 int page, x, y;
367 char *name = const_cast<char*>("");
368 PyObject *absolute = Py_True;
369
370 char *kwlist[] = {const_cast<char*>("path"), const_cast<char*>("page"),
371 const_cast<char*>("x"), const_cast<char*>("y"),
372 const_cast<char*>("name"),const_cast<char*>("absolute"), nullptr};
373
374 if (!PyArg_ParseTupleAndKeywords(args, keywds, "esiii|esO", kwlist,
375 "utf-8", &path, &page, &x, &y,
376 "utf-8", &name, &absolute))
377 return nullptr;
378 if (!checkHaveDocument())
379 return nullptr;
380
381 PageItem *item = GetUniqueItem(QString::fromUtf8(name));
382 if (!testPageItem(item))
383 return nullptr;
384
385 prepareannotation(item);
386 Annotation &a = item->annotation();
387 a.setType(Annotation::Link);
388 a.setZiel(page - 1);
389 a.setExtern(QString::fromUtf8(path));
390 setactioncoords(a, x, y);
391
392 if (PyObject_IsTrue(absolute)==1)
393 a.setActionType(Annotation::Action_GoToR_FileAbs);
394 else
395 a.setActionType(Annotation::Action_GoToR_FileRel);
396
397 Py_RETURN_NONE;
398 }
399
scribus_seturiannotation(PyObject *,PyObject * args)400 PyObject *scribus_seturiannotation(PyObject * /*self*/, PyObject* args)
401 {
402 char *uri;
403 char *name = const_cast<char*>("");
404
405 if (!PyArg_ParseTuple(args, "es|es","utf-8" ,&uri,"utf-8", &name))
406 return nullptr;
407 if (!checkHaveDocument())
408 return nullptr;
409
410 PageItem *item = GetUniqueItem(QString::fromUtf8(name));
411 if (!testPageItem(item))
412 return nullptr;
413
414 prepareannotation(item);
415 Annotation &a = item->annotation();
416 a.setAction(QString::fromUtf8(""));
417 a.setExtern(QString::fromUtf8(uri));
418 a.setActionType(Annotation::Action_URI);
419 a.setType(Annotation::Link);
420
421 Py_RETURN_NONE;
422 }
423
424
scribus_settextannotation(PyObject *,PyObject * args)425 PyObject *scribus_settextannotation(PyObject * /*self*/, PyObject* args)
426 {
427 /** icons: 0 "Note", 1 "Comment", 2 "Key",
428 3 "Help", 4 "NewParagraph", 5 "Paragraph",
429 6 "Insert", 7 "Cross", 8 "Circle"
430 */
431 int icon;
432 PyObject *isopen = Py_False;
433 char *name = const_cast<char*>("");
434 /** icons: 0 "Note", 1 "Comment", 2 "Key",
435 3 "Help", 4 "NewParagraph", 5 "Paragraph", 6 "Insert",
436 7 "Cross", 8 "Circle"
437
438 */
439
440 if (!PyArg_ParseTuple(args, "iO|es",&icon,&isopen,"utf-8", &name))
441 return nullptr;
442 if (!checkHaveDocument())
443 return nullptr;
444 if (icon < 0 || icon > 8)
445 {
446 PyErr_SetString(PyExc_RuntimeError,
447 QObject::tr("Icon must be 0 to 8", "python error").toLocal8Bit().constData());
448 return nullptr;
449 }
450
451 PageItem *item = GetUniqueItem(QString::fromUtf8(name));
452 if (!testPageItem(item))
453 return nullptr;
454
455 prepareannotation(item);
456
457 Annotation &a = item->annotation();
458 a.setAnOpen(PyObject_IsTrue(isopen));
459 a.setActionType(Annotation::Action_None);
460 a.setIcon(icon);
461 a.setExtern(QString::fromUtf8(""));
462 a.setAction(QString::fromUtf8(""));
463 a.setType(Annotation::Text);
464
465 Py_RETURN_NONE;
466 }
467
468
469
scribus_createpdfannotation(PyObject *,PyObject * args)470 PyObject *scribus_createpdfannotation(PyObject * /*self*/, PyObject* args)
471 {
472 enum{PDFBUTTON, PDFRADIOBUTTON, PDFTEXTFIELD, PDFCHECKBOX, PDFCOMBOBOX, PDFLISTBOX,
473 PDFTEXTANNOTATION, PDFLINKANNOTATION, PDF3DANNOTATION};
474
475 int which;
476 double x, y, w, h;
477 char *name = const_cast<char*>("");
478
479 if (!PyArg_ParseTuple(args, "idddd|es", &which, &x, &y, &w, &h, "utf-8", &name))
480 return nullptr;
481 if (!checkHaveDocument())
482 return nullptr;
483
484 if (which < 0 || which > 8){
485 PyErr_SetString(PyExc_RuntimeError,
486 QObject::tr("which must be 0 to 8", "python error").toLocal8Bit().constData());
487 return nullptr;
488 }
489
490 ScribusDoc *m_doc = ScCore->primaryMainWindow()->doc;
491
492 int i;
493 if (which < 8)
494 {
495 i = m_doc->itemAdd(PageItem::TextFrame,
496 PageItem::Unspecified,
497 pageUnitXToDocX(x),
498 pageUnitYToDocY(y),
499 ValueToPoint(w),
500 ValueToPoint(h),
501 m_doc->itemToolPrefs().shapeLineWidth,
502 CommonStrings::None,
503 m_doc->itemToolPrefs().textColor);
504 }
505 else
506 {
507 bool hasOSG = false;
508 #ifdef HAVE_OSG
509 hasOSG = true;
510 #endif
511 if (hasOSG)
512 {
513 i = m_doc->itemAdd(PageItem::OSGFrame,
514 PageItem::Unspecified,
515 pageUnitXToDocX(x),
516 pageUnitYToDocY(y),
517 ValueToPoint(w),
518 ValueToPoint(h),
519 m_doc->itemToolPrefs().shapeLineWidth,
520 m_doc->itemToolPrefs().imageFillColor,
521 m_doc->itemToolPrefs().imageStrokeColor);
522 }
523 else
524 {
525 PyErr_SetString(PyExc_RuntimeError,
526 QObject::tr("Doesn't have OSG can't create 3DAnnotation", "python error").toLocal8Bit().constData());
527 return nullptr;
528 }
529 }
530
531 PageItem *pi = m_doc->Items->at(i);
532 pi->AutoName=false;
533
534 if (strlen(name) > 0)
535 {
536 QString objName = QString::fromUtf8(name);
537 if (!ItemExists(objName))
538 m_doc->Items->at(i)->setItemName(objName);
539 }
540 else
541 {
542 QString inames[] = {
543 CommonStrings::itemName_PushButton,
544 CommonStrings::itemName_RadioButton,
545 CommonStrings::itemName_TextField,
546 CommonStrings::itemName_CheckBox,
547 CommonStrings::itemName_ComboBox,
548 CommonStrings::itemName_ListBox,
549 CommonStrings::itemName_TextAnnotation,
550 CommonStrings::itemName_LinkAnnotation,
551 QObject::tr("3DAnnot")
552 };
553 QString iname = inames[which] + QString("%1").arg(m_doc->TotalItems);
554 pi->setItemName(iname);
555 }
556
557
558 pi->setIsAnnotation(true);
559 Annotation &a = pi->annotation();
560
561 Annotation::AnnotationType atypes[] = {
562 Annotation::Button, Annotation::RadioButton,
563 Annotation::Textfield, Annotation::Checkbox,
564 Annotation::Checkbox, Annotation::Combobox,
565 Annotation::Listbox, Annotation::Text,
566 Annotation::Link, Annotation::Annot3D
567 };
568 a.setType(atypes[which]);
569
570 switch (which)
571 {
572 case PDFBUTTON:
573 a.setFlag(Annotation::Flag_PushButton);
574 break;
575 case PDFRADIOBUTTON:
576 a.setFlag(Annotation::Flag_Radio | Annotation::Flag_NoToggleToOff);
577 break;
578 case PDFCOMBOBOX:
579 a.setFlag(Annotation::Flag_Combo);
580 break;
581 case PDFLINKANNOTATION:
582 a.setZiel(m_doc->currentPage()->pageNr());
583 a.setAction("0 0");
584 a.setActionType(Annotation::Action_GoTo);
585 pi->setTextFlowMode(PageItem::TextFlowDisabled);
586 break;
587 }
588
589 return PyString_FromString(m_doc->Items->at(i)->itemName().toUtf8());
590 }
591
592
593 /*! HACK: this removes "warning: 'blah' defined but not used" compiler warnings
594 with header files structure untouched (docstrings are kept near declarations)
595 PV */
cmdannotationsdocwarnings()596 void cmdannotationsdocwarnings()
597 {
598 QStringList s;
599 s << scribus_setlinkannotation__doc__
600 << scribus_isannotated__doc__
601 << scribus_setfileannotation__doc__
602 << scribus_seturiannotation__doc__
603 << scribus_settextannotation__doc__
604 << scribus_createpdfannotation__doc__
605 << scribus_setjsactionscript__doc__
606 << scribus_getjsactionscript__doc__;
607 }
608
609
610 //HELPER FUNCTIONS
611
getLinkData(PyObject * rv,int page,const QString & action)612 PyObject *getLinkData(PyObject *rv,int page, const QString& action)
613 {
614 int x, y;
615
616 const char pagenum[] = "page";
617 PyObject *pagekey = PyString_FromString(pagenum);
618 PyObject *pagevalue = PyInt_FromLong((long)page);
619 PyDict_SetItem(rv, pagekey, pagevalue);
620
621 QStringList qsl = action.split(" ", Qt::SkipEmptyParts);
622
623 x = qsl[0].toInt();
624 const char x2[] = "x";
625 PyObject *xkey = PyString_FromString(x2);
626 PyObject *xvalue = PyInt_FromLong((long)x);
627 PyDict_SetItem(rv, xkey, xvalue);
628
629 int height =ScCore->primaryMainWindow()->doc->pageHeight();
630 y = height - qsl[1].toInt();
631 const char y2[] = "y";
632 PyObject *ykey = PyString_FromString(y2);
633 PyObject *yvalue = PyInt_FromLong((long)y);
634 PyDict_SetItem(rv, ykey, yvalue);
635
636 return rv;
637
638 }
639
prepareannotation(PageItem * item)640 static void prepareannotation(PageItem *item)
641 {
642 if (item->isBookmark)
643 {
644 item->isBookmark = false;
645 ScCore->primaryMainWindow()->DelBookMark(item);
646 }
647 item->setIsAnnotation(true);
648 }
649
setactioncoords(Annotation & a,int x,int y)650 static void setactioncoords(Annotation &a, int x, int y)
651 {
652 QString xstring, ystring;
653 int height =ScCore->primaryMainWindow()->doc->pageHeight();
654 a.setAction(xstring.setNum(x) + " " + ystring.setNum(height - y) + " 0");
655 }
656
testPageItem(PageItem * item)657 static bool testPageItem(PageItem *item)
658 {
659 if (item == nullptr)
660 return false;
661 if (!item->isTextFrame())
662 {
663 PyErr_SetString(WrongFrameTypeError,
664 QObject::tr("Can't set annotation on a non-text frame", "python error").toLocal8Bit().constData());
665 return false;
666 }
667
668 return true;
669 }
670
add_text_to_dict(PyObject * drv,PageItem * item)671 static void add_text_to_dict(PyObject *drv, PageItem * item)
672 {
673 const char text[] = "text";
674 PyObject *textkey = PyString_FromString(text);
675 QString txt = item->itemText.text(0, item->itemText.length());
676 PyObject *textvalue = PyString_FromString(txt.toUtf8());
677 PyDict_SetItem(drv, textkey, textvalue);
678
679 Annotation &a = item->annotation();
680 int actype = a.ActionType();
681
682 if (actype == Annotation::Action_JavaScript)
683 {
684 const char text[] = "javascript";
685 PyObject *jskey = PyString_FromString(text);
686 PyObject *jsvalue = PyString_FromString(item->annotation().Action().toUtf8());
687 PyDict_SetItem(drv, jskey, jsvalue);
688 }
689
690 const char *aactions[] = { "None", "JavaScript",
691 "Goto", "Submit Form",
692 "Reset Form", "Import Data",
693 "Unknown", "Goto File Relative",
694 "URI", "Goto File Relative" ,
695 "Named", nullptr };
696
697 const char action[] = "action";
698 PyObject *akey = PyString_FromString(action);
699 if (actype > 10)
700 actype = 6;
701 PyObject *avalue = PyString_FromString(aactions[actype]);
702 PyDict_SetItem(drv, akey, avalue);
703
704 int atype = a.Type();
705 if (atype == Annotation::Checkbox || atype == Annotation::RadioButton)
706 {
707 const char checked[] = "checked";
708 PyObject *checkkey = PyString_FromString(checked);
709 PyObject *checkvalue = Py_False;
710 if (a.IsChk())
711 checkvalue = Py_True;
712 PyDict_SetItem(drv, checkkey, checkvalue);
713 }
714
715 if (atype == Annotation::Combobox || atype == Annotation::Listbox)
716 {
717 const char editable[] = "editable";
718 PyObject *ekey = PyString_FromString(editable);
719
720 PyObject *edit = Py_False;
721 int result = Annotation::Flag_Edit & a.Flag();
722 if (result == Annotation::Flag_Edit)
723 edit = Py_True;
724 PyDict_SetItem(drv, ekey, edit);
725 }
726 }
727
728
729