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