summaryrefslogtreecommitdiffstats
path: root/scribus/plugins/scriptplugin/cmdtext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scribus/plugins/scriptplugin/cmdtext.cpp')
-rw-r--r--scribus/plugins/scriptplugin/cmdtext.cpp1109
1 files changed, 1109 insertions, 0 deletions
diff --git a/scribus/plugins/scriptplugin/cmdtext.cpp b/scribus/plugins/scriptplugin/cmdtext.cpp
new file mode 100644
index 0000000..fff491b
--- /dev/null
+++ b/scribus/plugins/scriptplugin/cmdtext.cpp
@@ -0,0 +1,1109 @@
+/*
+For general Scribus (>=1.3.2) copyright and licensing information please refer
+to the COPYING file provided with the program. Following this notice may exist
+a copyright and/or license notice that predates the release of Scribus 1.3.2
+for which a new license (GPL+exception) is in place.
+*/
+#include "cmdtext.h"
+#include "cmdutil.h"
+#include "pageitem_textframe.h"
+#include "prefsmanager.h"
+#include "selection.h"
+#include "util.h"
+#include "scribuscore.h"
+#include "hyphenator.h"
+
+PyObject *scribus_getfontsize(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
+ if (it == NULL)
+ return NULL;
+ if (!(it->asTextFrame()) && !(it->asPathText()))
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get font size of non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ if (it->HasSel)
+ {
+ for (int b = 0; b < it->itemText.length(); b++)
+ if (it->itemText.selected(b))
+ return PyFloat_FromDouble(static_cast<double>(it->itemText.charStyle(b).fontSize() / 10.0));
+ return NULL;
+ }
+ else
+ return PyFloat_FromDouble(static_cast<long>(it->currentCharStyle().fontSize() / 10.0));
+}
+
+PyObject *scribus_getfont(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
+ if (it == NULL)
+ return NULL;
+ if (!(it->asTextFrame()) && !(it->asPathText()))
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get font of non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ if (it->HasSel)
+ {
+ for (int b = 0; b < it->itemText.length(); b++)
+ if (it->itemText.selected(b))
+ return PyString_FromString(it->itemText.charStyle(b).font().scName().toUtf8());
+ return NULL;
+ }
+ else
+ return PyString_FromString(it->currentCharStyle().font().scName().toUtf8());
+}
+
+PyObject *scribus_gettextsize(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
+ if (i == NULL)
+ return NULL;
+ if (!(i->asTextFrame()) && !(i->asPathText()))
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get text size of non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ return PyInt_FromLong(static_cast<long>(i->itemText.length()));
+}
+
+PyObject *scribus_gettextlines(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
+ if (i == NULL)
+ return NULL;
+ if (!(i->asTextFrame()) && !(i->asPathText()))
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get number of lines of non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ return PyInt_FromLong(static_cast<long>(i->itemText.lines()));
+}
+
+PyObject *scribus_getcolumns(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
+ if (i == NULL)
+ return NULL;
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get column count of non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ return PyInt_FromLong(static_cast<long>(i->Cols));
+}
+
+PyObject *scribus_getlinespace(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
+ if (i == NULL)
+ return NULL;
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get line space of non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ return PyFloat_FromDouble(static_cast<double>(i->currentStyle().lineSpacing()));
+}
+
+PyObject *scribus_gettextdistances(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
+ if (i == NULL)
+ return NULL;
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get text distances of non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ return Py_BuildValue("(dddd)",
+ PointToValue(i->textToFrameDistLeft()),
+ PointToValue(i->textToFrameDistRight()),
+ PointToValue(i->textToFrameDistTop()),
+ PointToValue(i->textToFrameDistBottom()));
+}
+
+PyObject *scribus_getcolumngap(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
+ if (i == NULL)
+ return NULL;
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get column gap of non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ return PyFloat_FromDouble(PointToValue(static_cast<double>(i->ColGap)));
+}
+
+PyObject *scribus_getframetext(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ QString text = "";
+ PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
+ if (it == NULL)
+ return NULL;
+ if (!(it->asTextFrame()) && !(it->asPathText()))
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get text of non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ for (int a = it->firstInFrame(); a <= it->lastInFrame(); ++a)
+ {
+ if (it->HasSel)
+ {
+ if (it->itemText.selected(a))
+ text += it->itemText.text(a);
+ }
+ else
+ {
+ text += it->itemText.text(a);
+ }
+ }
+ return PyString_FromString(text.toUtf8());
+}
+
+PyObject *scribus_gettext(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ QString text = "";
+ PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
+ if (it == NULL)
+ return NULL;
+ if (!(it->asTextFrame()) && !(it->asPathText()))
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get text of non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+
+ // collect all chars from a storytext
+ for (int a = 0; a < it->itemText.length(); a++)
+ {
+ if (it->HasSel)
+ {
+ if (it->itemText.selected(a))
+ text += it->itemText.text(a);
+ }
+ else
+ {
+ text += it->itemText.text(a);
+ }
+ } // for
+ return PyString_FromString(text.toUtf8());
+}
+
+PyObject *scribus_setboxtext(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ char *Text;
+ if (!PyArg_ParseTuple(args, "es|es", "utf-8", &Text, "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *currItem = GetUniqueItem(QString::fromUtf8(Name));
+ if (currItem == NULL)
+ return NULL;
+ if (!(currItem->asTextFrame()) && !(currItem->asPathText()))
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text of non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ QString Daten = QString::fromUtf8(Text);
+ Daten.replace("\r\n", SpecialChars::PARSEP);
+ Daten.replace(QChar('\n') , SpecialChars::PARSEP);
+ PyMem_Free(Text);
+ currItem->itemText.clear();
+ for (int a = 0; a < ScCore->primaryMainWindow()->doc->FrameItems.count(); ++a)
+ {
+ ScCore->primaryMainWindow()->doc->FrameItems.at(a)->ItemNr = a;
+ }
+ currItem->itemText.insertChars(0, Daten);
+ currItem->invalidateLayout();
+ currItem->Dirty = false;
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+PyObject *scribus_inserttext(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ char *Text;
+ int pos;
+ if (!PyArg_ParseTuple(args, "esi|es", "utf-8", &Text, &pos, "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
+ if (it == NULL)
+ return NULL;
+ if (!(it->asTextFrame()) && !(it->asPathText()))
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot insert text into non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ QString Daten = QString::fromUtf8(Text);
+ Daten.replace("\r\n", SpecialChars::PARSEP);
+ Daten.replace(QChar('\n') , SpecialChars::PARSEP);
+ PyMem_Free(Text);
+ if ((pos < -1) || (pos > static_cast<int>(it->itemText.length())))
+ {
+ PyErr_SetString(PyExc_IndexError, QObject::tr("Insert index out of bounds.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ if (pos == -1)
+ pos = it->itemText.length();
+ it->itemText.insertChars(pos, Daten);
+ it->Dirty = true;
+ if (ScCore->primaryMainWindow()->doc->DoDrawing)
+ {
+// FIXME adapt to Qt-4 painting style
+// it->paintObj();
+ it->Dirty = false;
+ }
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+PyObject *scribus_setalign(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ int alignment;
+ if (!PyArg_ParseTuple(args, "i|es", &alignment, "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ if ((alignment > 4) || (alignment < 0))
+ {
+ PyErr_SetString(PyExc_ValueError, QObject::tr("Alignment out of range. Use one of the scribus.ALIGN* constants.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
+ if (i == NULL)
+ return NULL;
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text alignment on a non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ int Apm = ScCore->primaryMainWindow()->doc->appMode;
+ ScCore->primaryMainWindow()->doc->m_Selection->clear();
+ ScCore->primaryMainWindow()->doc->m_Selection->addItem(i);
+ if (i->HasSel)
+ ScCore->primaryMainWindow()->doc->appMode = modeEdit;
+ ScCore->primaryMainWindow()->setNewAlignment(alignment);
+ ScCore->primaryMainWindow()->doc->appMode = Apm;
+ ScCore->primaryMainWindow()->view->Deselect();
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+PyObject *scribus_setfontsize(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ double size;
+ if (!PyArg_ParseTuple(args, "d|es", &size, "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ if ((size > 512) || (size < 1))
+ {
+ PyErr_SetString(PyExc_ValueError, QObject::tr("Font size out of bounds - must be 1 <= size <= 512.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
+ if (i == NULL)
+ return NULL;
+
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set font size on a non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ int Apm = ScCore->primaryMainWindow()->doc->appMode;
+ ScCore->primaryMainWindow()->doc->m_Selection->clear();
+ ScCore->primaryMainWindow()->doc->m_Selection->addItem(i);
+ if (i->HasSel)
+ ScCore->primaryMainWindow()->doc->appMode = modeEdit;
+ ScCore->primaryMainWindow()->doc->itemSelection_SetFontSize(qRound(size * 10.0));
+ ScCore->primaryMainWindow()->doc->appMode = Apm;
+ ScCore->primaryMainWindow()->view->Deselect();
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+PyObject *scribus_setfont(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ char *Font = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "es|es", "utf-8", &Font, "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
+ if (i == NULL)
+ return NULL;
+ if (!(i->asTextFrame()) && !(i->asPathText()))
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set font on a non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ if (PrefsManager::instance()->appPrefs.AvailFonts.contains(QString::fromUtf8(Font)))
+ {
+ int Apm = ScCore->primaryMainWindow()->doc->appMode;
+ ScCore->primaryMainWindow()->doc->m_Selection->clear();
+ ScCore->primaryMainWindow()->doc->m_Selection->addItem(i);
+ if (i->HasSel)
+ ScCore->primaryMainWindow()->doc->appMode = modeEdit;
+ ScCore->primaryMainWindow()->SetNewFont(QString::fromUtf8(Font));
+ ScCore->primaryMainWindow()->doc->appMode = Apm;
+ ScCore->primaryMainWindow()->view->Deselect();
+ }
+ else
+ {
+ PyErr_SetString(PyExc_ValueError, QObject::tr("Font not found.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+PyObject *scribus_setlinespace(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ double w;
+ if (!PyArg_ParseTuple(args, "d|es", &w, "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ if (w < 0.1)
+ {
+ PyErr_SetString(PyExc_ValueError, QObject::tr("Line space out of bounds, must be >= 0.1.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
+ if (i == NULL)
+ return NULL;
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set line spacing on a non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+
+ int Apm = ScCore->primaryMainWindow()->doc->appMode;
+ ScCore->primaryMainWindow()->doc->m_Selection->clear();
+ ScCore->primaryMainWindow()->doc->m_Selection->addItem(i);
+ if (i->HasSel)
+ ScCore->primaryMainWindow()->doc->appMode = modeEdit;
+ ScCore->primaryMainWindow()->doc->itemSelection_SetLineSpacing(w);
+ ScCore->primaryMainWindow()->doc->appMode = Apm;
+ ScCore->primaryMainWindow()->view->Deselect();
+
+// i->setLineSpacing(w);
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+PyObject *scribus_settextdistances(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ double l,r,t,b;
+ if (!PyArg_ParseTuple(args, "dddd|es", &l, &r, &t, &b, "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ if (l < 0.0 || r < 0.0 || t < 0.0 || b < 0.0)
+ {
+ PyErr_SetString(PyExc_ValueError, QObject::tr("Text distances out of bounds, must be positive.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
+ if (i == NULL)
+ return NULL;
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text distances on a non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ i->setTextToFrameDist(ValueToPoint(l), ValueToPoint(r), ValueToPoint(t), ValueToPoint(b));
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+PyObject *scribus_setcolumngap(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ double w;
+ if (!PyArg_ParseTuple(args, "d|es", &w, "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ if (w < 0.0)
+ {
+ PyErr_SetString(PyExc_ValueError, QObject::tr("Column gap out of bounds, must be positive.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
+ if (i == NULL)
+ return NULL;
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set column gap on a non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ i->ColGap = ValueToPoint(w);
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+PyObject *scribus_setcolumns(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ int w;
+ if (!PyArg_ParseTuple(args, "i|es", &w, "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ if (w < 1)
+ {
+ PyErr_SetString(PyExc_ValueError, QObject::tr("Column count out of bounds, must be > 1.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
+ if (i == NULL)
+ return NULL;
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set number of columns on a non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ i->Cols = w;
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+PyObject *scribus_selecttext(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ int start, selcount;
+ if (!PyArg_ParseTuple(args, "ii|es", &start, &selcount, "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
+ if (it == NULL)
+ return NULL;
+ if (selcount == -1)
+ {
+ // user wants to select all after the start point -- CR
+ selcount = it->itemText.length() - start;
+ if (selcount < 0)
+ // user passed start that's > text in the frame
+ selcount = 0;
+ }
+ // cr 2005-01-18 fixed off-by-one with end bound that made selecting the last char impossible
+ if ((start < 0) || ((start + selcount) > static_cast<int>(it->itemText.length())))
+ {
+ PyErr_SetString(PyExc_IndexError, QObject::tr("Selection index out of bounds", "python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ if (!(it->asTextFrame()) && !(it->asPathText()))
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot select text in a non-text frame", "python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ /* FIXME: not sure if we should make this check or not
+ if (start > ende)
+ {
+ PyErr_SetString(PyExc_ValueError, QString("Selection start > selection end").toLocal8Bit().constData());
+ return NULL;
+ }
+ */
+ it->itemText.deselectAll();
+ if (selcount == 0)
+ {
+ it->HasSel = false;
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+ }
+ it->itemText.select(start, selcount, true);
+ it->HasSel = true;
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+PyObject *scribus_deletetext(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
+ if (it == NULL)
+ return NULL;
+ if (!(it->asTextFrame()) && !(it->asPathText()))
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot delete text from a non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ if (it->HasSel)
+ dynamic_cast<PageItem_TextFrame*>(it)->deleteSelectedTextFromFrame();
+ else
+ {
+ it->itemText.clear();
+ for (int a = 0; a < ScCore->primaryMainWindow()->doc->FrameItems.count(); ++a)
+ {
+ ScCore->primaryMainWindow()->doc->FrameItems.at(a)->ItemNr = a;
+ }
+ }
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+PyObject *scribus_settextfill(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ char *Color;
+ if (!PyArg_ParseTuple(args, "es|es", "utf-8", &Color, "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
+ if (it == NULL)
+ return NULL;
+ if (!(it->asTextFrame()) && !(it->asPathText()))
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text fill on a non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ else
+ {
+ for (int b = 0; b < it->itemText.length(); b++)
+ {
+ //FIXME: doc method
+ if (it->HasSel)
+ {
+ if (it->itemText.selected(b))
+ it->itemText.item(b)->setFillColor(QString::fromUtf8(Color));
+ }
+ else
+ it->itemText.item(b)->setFillColor(QString::fromUtf8(Color));
+ }
+// it->TxtFill = QString::fromUtf8(Color);
+ }
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+PyObject *scribus_settextstroke(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ char *Color;
+ if (!PyArg_ParseTuple(args, "es|es", "utf-8", &Color, "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
+ if (it == NULL)
+ return NULL;
+ if (!(it->asTextFrame()) && (it->asPathText()))
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text stroke on a non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ else
+ {
+ for (int b = 0; b < it->itemText.length(); b++)
+ {
+ //FIXME:NLS use document method for this
+ if (it->HasSel)
+ {
+ if (it->itemText.selected(b))
+ it->itemText.item(b)->setStrokeColor(QString::fromUtf8(Color));
+ }
+ else
+ it->itemText.item(b)->setStrokeColor(QString::fromUtf8(Color));
+ }
+// it->TxtStroke = QString::fromUtf8(Color);
+ }
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+
+PyObject *scribus_settextscalingh(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ double sc;
+ if (!PyArg_ParseTuple(args, "d|es", &sc, "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ if (sc < 10)
+ {
+ PyErr_SetString(PyExc_ValueError, QObject::tr("Character scaling out of bounds, must be >= 10","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
+ if (i == NULL)
+ return NULL;
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set character scaling on a non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+
+ int Apm = ScCore->primaryMainWindow()->doc->appMode;
+ ScCore->primaryMainWindow()->doc->m_Selection->clear();
+ ScCore->primaryMainWindow()->doc->m_Selection->addItem(i);
+ if (i->HasSel)
+ ScCore->primaryMainWindow()->doc->appMode = modeEdit;
+ ScCore->primaryMainWindow()->doc->itemSelection_SetScaleH(qRound(sc * 10));
+ ScCore->primaryMainWindow()->doc->appMode = Apm;
+ ScCore->primaryMainWindow()->view->Deselect();
+
+ Py_RETURN_NONE;
+}
+
+
+PyObject *scribus_settextscalingv(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ double sc;
+ if (!PyArg_ParseTuple(args, "d|es", &sc, "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ if (sc < 10)
+ {
+ PyErr_SetString(PyExc_ValueError, QObject::tr("Character scaling out of bounds, must be >= 10","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
+ if (i == NULL)
+ return NULL;
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set character scaling on a non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+
+ int Apm = ScCore->primaryMainWindow()->doc->appMode;
+ ScCore->primaryMainWindow()->doc->m_Selection->clear();
+ ScCore->primaryMainWindow()->doc->m_Selection->addItem(i);
+ if (i->HasSel)
+ ScCore->primaryMainWindow()->doc->appMode = modeEdit;
+ ScCore->primaryMainWindow()->doc->itemSelection_SetScaleV(qRound(sc * 10));
+ ScCore->primaryMainWindow()->doc->appMode = Apm;
+ ScCore->primaryMainWindow()->view->Deselect();
+
+ Py_RETURN_NONE;
+}
+
+
+PyObject *scribus_settextshade(PyObject* /* self */, PyObject* args)
+{
+ char *Name = const_cast<char*>("");
+ int w;
+ if (!PyArg_ParseTuple(args, "i|es", &w, "utf-8", &Name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ if ((w < 0) || (w > 100))
+ {
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+ }
+ PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
+ if (it == NULL)
+ return NULL;
+ if (!(it->asTextFrame()) && !(it->asPathText()))
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text shade on a non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ else
+ {
+ //FIXME:NLS use document method for that
+ for (int b = 0; b < it->itemText.length(); ++b)
+ {
+ if (it->HasSel)
+ {
+ if (it->itemText.selected(b))
+ it->itemText.item(b)->setFillShade(w);
+ }
+ else
+ it->itemText.item(b)->setFillShade(w);
+ }
+// it->ShTxtFill = w;
+ }
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+PyObject *scribus_linktextframes(PyObject* /* self */, PyObject* args)
+{
+ char *name1;
+ char *name2;
+
+ if (!PyArg_ParseTuple(args, "eses", "utf-8", &name1, "utf-8", &name2))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *fromitem = GetUniqueItem(QString::fromUtf8(name1));
+ if (fromitem == NULL)
+ return NULL;
+ PageItem *toitem = GetUniqueItem(QString::fromUtf8(name2));
+ if (toitem == NULL)
+ return NULL;
+ if (!(fromitem->asTextFrame()) || !(toitem->asTextFrame()))
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Can only link text frames.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+/* if (toitem->itemText.length() > 0)
+ {
+ PyErr_SetString(ScribusException, QObject::tr("Target frame must be empty.","python error").toLocal8Bit().constData());
+ return NULL;
+ }*/
+ if (toitem->nextInChain() != 0)
+ {
+ PyErr_SetString(ScribusException, QObject::tr("Target frame links to another frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ if (toitem->prevInChain() != 0)
+ {
+ PyErr_SetString(ScribusException, QObject::tr("Target frame is linked to by another frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ if (toitem == fromitem)
+ {
+ PyErr_SetString(ScribusException, QObject::tr("Source and target are the same object.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ // references to the others boxes
+ fromitem->link(toitem);
+ ScCore->primaryMainWindow()->view->DrawNew();
+ // enable 'save icon' stuff
+ ScCore->primaryMainWindow()->slotDocCh();
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+PyObject *scribus_unlinktextframes(PyObject* /* self */, PyObject* args)
+{
+ char *name;
+ if (!PyArg_ParseTuple(args, "es", "utf-8", &name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *item = GetUniqueItem(QString::fromUtf8(name));
+ if (item == NULL)
+ return NULL;
+ if (!item->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot unlink a non-text frame.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ // only linked
+ if (item->prevInChain() == 0)
+ {
+ PyErr_SetString(ScribusException, QObject::tr("Object is not a linked text frame, can't unlink.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+/* if (item->NextBox == 0)
+ {
+ PyErr_SetString(ScribusException, QObject::tr("Object the last frame in a series, can't unlink. Unlink the previous frame instead.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ */
+/* PageItem* nextbox = item->NextBox;
+
+ while (nextbox != 0)
+ {
+ uint a = nextbox->itemText.count();
+ for (uint s=0; s<a; ++s)
+ item->itemText.append(nextbox->itemText.take(0));
+ nextbox = nextbox->NextBox;
+ } // while
+ uint a2 = item->itemText.count();
+ for (uint s = 0; s < a2; ++s)
+ item->BackBox->itemText.append(item->itemText.take(0));
+*/
+ item->prevInChain()->unlink();
+ // enable 'save icon' stuff
+ ScCore->primaryMainWindow()->slotDocCh();
+ ScCore->primaryMainWindow()->view->DrawNew();
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+/*
+ * Convert the selected text frame to outlines.
+ *
+ * 2004-09-07 (Craig Ringer)
+ * 2004-09-14 pv frame type, optional frame name param
+ */
+PyObject *scribus_tracetext(PyObject* /* self */, PyObject* args)
+{
+ char *name = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "|es", "utf-8", &name))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *item = GetUniqueItem(QString::fromUtf8(name));
+ if (item == NULL)
+ return NULL;
+ if (!item->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot convert a non-text frame to outlines.","python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ if (item->invalid)
+ item->layout();
+ ScCore->primaryMainWindow()->view->Deselect(true);
+ ScCore->primaryMainWindow()->view->SelectItemNr(item->ItemNr);
+ ScCore->primaryMainWindow()->view->TextToPath();
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+PyObject *scribus_istextoverflowing(PyObject * self, PyObject* args, PyObject* kw)
+{
+ char *name = const_cast<char*>("");
+ bool nolinks = false;
+ char *kwargs[] = {const_cast<char*>("name"), const_cast<char*>("nolinks"), NULL};
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "|esi", kwargs, "utf-8", &name, &nolinks))
+ return NULL;
+ if(!checkHaveDocument())
+ return NULL;
+ PageItem *item = GetUniqueItem(QString::fromUtf8(name));
+ if (item == NULL)
+ return NULL;
+ if (!item->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Only text frames can be checked for overflowing", "python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ /* original solution
+ if (item->itemText.count() > item->MaxChars)
+ return PyBool_FromLong(static_cast<long>(true));
+ return PyBool_FromLong(static_cast<long>(false)); */
+ /*
+ uint firstFrame = 0;
+ if (nolinks)
+ firstFrame = item->itemText.count();
+ uint chars = item->itemText.count();
+ uint maxchars = item->MaxChars;
+ while (item->NextBox != 0) {
+ item = item->NextBox;
+ chars += item->itemText.count();
+ maxchars += item->MaxChars;
+ }
+ // no overrun
+ if (nolinks)
+ return PyInt_FromLong(maxchars - firstFrame);
+
+ if (maxchars > chars)
+ return PyInt_FromLong(0);
+ // number of overrunning letters
+ return PyInt_FromLong(static_cast<long>(chars - maxchars));
+ */
+ // refresh overflow information
+ item->invalidateLayout();
+ item->layout();
+ return PyInt_FromLong(static_cast<long>(item->frameOverflows()));
+}
+
+/*
+ * Does hyphenation on the given text frame.
+ * 08.12.2007: Joachim Neu
+ */
+PyObject *scribus_hyphenatetext(PyObject*, PyObject* args)
+{
+ char *name = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "|es", "utf-8", &name))
+ return NULL;
+ if (!checkHaveDocument())
+ return NULL;
+ PageItem *i = GetUniqueItem(QString::fromUtf8(name));
+ if (i == NULL)
+ return NULL;
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Can only hyphenate text frame", "python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ ScCore->primaryMainWindow()->doc->docHyphenator->slotHyphenate(i);
+ return PyBool_FromLong(1);
+}
+
+/*
+ * Does dehyphenation on the given text frame.
+ * 13.12.2007: Joachim Neu
+ */
+PyObject *scribus_dehyphenatetext(PyObject*, PyObject* args)
+{
+ char *name = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "|es", "utf-8", &name))
+ return NULL;
+ if (!checkHaveDocument())
+ return NULL;
+ PageItem *i = GetUniqueItem(QString::fromUtf8(name));
+ if (i == NULL)
+ return NULL;
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Can only dehyphenate text frame", "python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ ScCore->primaryMainWindow()->doc->docHyphenator->slotDeHyphenate(i);
+ return PyBool_FromLong(1);
+}
+
+PyObject *scribus_setpdfbookmark(PyObject* /* self */, PyObject* args)
+{
+ char *name = const_cast<char*>("");
+ bool toggle;
+ if (!PyArg_ParseTuple(args, "b|es", &toggle, "utf-8", &name))
+ return NULL;
+ if (!checkHaveDocument())
+ return NULL;
+ PageItem *i = GetUniqueItem(QString::fromUtf8(name));
+ if (i == NULL)
+ return NULL;
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Can't set bookmark on a non-text frame", "python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ if (i->isBookmark == toggle)
+ {
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+ }
+ if (toggle)
+ {
+ i->setIsAnnotation(false);
+ ScCore->primaryMainWindow()->AddBookMark(i);
+ }
+ else
+ ScCore->primaryMainWindow()->DelBookMark(i);
+ i->isBookmark = toggle;
+// Py_INCREF(Py_None);
+// return Py_None;
+ Py_RETURN_NONE;
+}
+
+PyObject *scribus_ispdfbookmark(PyObject* /* self */, PyObject* args)
+{
+ char *name = const_cast<char*>("");
+ if (!PyArg_ParseTuple(args, "|es", "utf-8", &name))
+ return NULL;
+ if (!checkHaveDocument())
+ return NULL;
+ PageItem *i = GetUniqueItem(QString::fromUtf8(name));
+ if (i == NULL)
+ return NULL;
+ if (!i->asTextFrame())
+ {
+ PyErr_SetString(WrongFrameTypeError, QObject::tr("Can't get info from a non-text frame", "python error").toLocal8Bit().constData());
+ return NULL;
+ }
+ if (i->isBookmark)
+ return PyBool_FromLong(1);
+ return PyBool_FromLong(0);
+}
+
+/*! HACK: this removes "warning: 'blah' defined but not used" compiler warnings
+with header files structure untouched (docstrings are kept near declarations)
+PV */
+void cmdtextdocwarnings()
+{
+ QStringList s;
+ s << scribus_getfontsize__doc__ << scribus_getfont__doc__
+ << scribus_gettextlines__doc__ << scribus_gettextsize__doc__
+ << scribus_getframetext__doc__ << scribus_gettext__doc__
+ << scribus_getlinespace__doc__ << scribus_getcolumngap__doc__
+ << scribus_getcolumns__doc__ << scribus_setboxtext__doc__
+ << scribus_inserttext__doc__ << scribus_setfont__doc__
+ << scribus_setfontsize__doc__ << scribus_setlinespace__doc__
+ << scribus_setcolumngap__doc__ << scribus_setcolumns__doc__
+ << scribus_setalign__doc__ << scribus_selecttext__doc__
+ << scribus_deletetext__doc__ << scribus_settextfill__doc__
+ << scribus_settextstroke__doc__ << scribus_settextshade__doc__
+ << scribus_linktextframes__doc__ << scribus_unlinktextframes__doc__
+ << scribus_tracetext__doc__ << scribus_istextoverflowing__doc__
+ << scribus_setpdfbookmark__doc__ << scribus_ispdfbookmark__doc__
+ << scribus_hyphenatetext__doc__ << scribus_dehyphenatetext__doc__
+ << scribus_gettextdistances__doc__ << scribus_settextdistances__doc__
+ << scribus_settextscalingh__doc__ << scribus_settextscalingv__doc__;
+}