Subversion Repositories Scribus

Rev

Rev 17219 | Rev 17810 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4430 cbradney 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
*/
103 Franz 7
#include "cmdtext.h"
8
#include "cmdutil.h"
3829 cbradney 9
#include "pageitem_textframe.h"
2834 cbradney 10
#include "prefsmanager.h"
3934 cbradney 11
#include "selection.h"
5569 avox 12
#include "util.h"
5781 cbradney 13
#include "scribuscore.h"
13805 jghali 14
#include "scribusdoc.h"
11223 subik 15
#include "hyphenator.h"
82 Franz 16
 
2790 craig 17
PyObject *scribus_getfontsize(PyObject* /* self */, PyObject* args)
82 Franz 18
{
934 subik 19
        char *Name = const_cast<char*>("");
900 cbradney 20
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
82 Franz 21
                return NULL;
649 fschmid 22
        if(!checkHaveDocument())
23
                return NULL;
900 cbradney 24
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 25
        if (it == NULL)
26
                return NULL;
3625 avox 27
        if (!(it->asTextFrame()) && !(it->asPathText()))
853 subik 28
        {
10598 cbradney 29
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get font size of non-text frame.","python error").toLocal8Bit().constData());
853 subik 30
                return NULL;
31
        }
720 subik 32
        if (it->HasSel)
213 Franz 33
        {
5753 jghali 34
                for (int b = 0; b < it->itemText.length(); b++)
5721 avox 35
                        if (it->itemText.selected(b))
36
                                return PyFloat_FromDouble(static_cast<double>(it->itemText.charStyle(b).fontSize() / 10.0));
1162 cbradney 37
                return NULL;
213 Franz 38
        }
720 subik 39
        else
5559 avox 40
                return PyFloat_FromDouble(static_cast<long>(it->currentCharStyle().fontSize() / 10.0));
82 Franz 41
}
42
 
2790 craig 43
PyObject *scribus_getfont(PyObject* /* self */, PyObject* args)
82 Franz 44
{
934 subik 45
        char *Name = const_cast<char*>("");
900 cbradney 46
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
82 Franz 47
                return NULL;
649 fschmid 48
        if(!checkHaveDocument())
49
                return NULL;
900 cbradney 50
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 51
        if (it == NULL)
52
                return NULL;
3625 avox 53
        if (!(it->asTextFrame()) && !(it->asPathText()))
853 subik 54
        {
10598 cbradney 55
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get font of non-text frame.","python error").toLocal8Bit().constData());
853 subik 56
                return NULL;
57
        }
720 subik 58
        if (it->HasSel)
213 Franz 59
        {
5753 jghali 60
                for (int b = 0; b < it->itemText.length(); b++)
5721 avox 61
                        if (it->itemText.selected(b))
10493 fschmid 62
                                return PyString_FromString(it->itemText.charStyle(b).font().scName().toUtf8());
1162 cbradney 63
                return NULL;
213 Franz 64
        }
720 subik 65
        else
10493 fschmid 66
                return PyString_FromString(it->currentCharStyle().font().scName().toUtf8());
82 Franz 67
}
68
 
2790 craig 69
PyObject *scribus_gettextsize(PyObject* /* self */, PyObject* args)
82 Franz 70
{
934 subik 71
        char *Name = const_cast<char*>("");
900 cbradney 72
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
82 Franz 73
                return NULL;
649 fschmid 74
        if(!checkHaveDocument())
75
                return NULL;
900 cbradney 76
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
853 subik 77
        if (i == NULL)
78
                return NULL;
3625 avox 79
        if (!(i->asTextFrame()) && !(i->asPathText()))
853 subik 80
        {
10598 cbradney 81
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get text size of non-text frame.","python error").toLocal8Bit().constData());
853 subik 82
                return NULL;
83
        }
5721 avox 84
        return PyInt_FromLong(static_cast<long>(i->itemText.length()));
82 Franz 85
}
86
 
6298 fschmid 87
PyObject *scribus_gettextlines(PyObject* /* self */, PyObject* args)
88
{
89
        char *Name = const_cast<char*>("");
90
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
91
                return NULL;
92
        if(!checkHaveDocument())
93
                return NULL;
94
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
95
        if (i == NULL)
96
                return NULL;
97
        if (!(i->asTextFrame()) && !(i->asPathText()))
98
        {
10598 cbradney 99
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get number of lines of non-text frame.","python error").toLocal8Bit().constData());
6298 fschmid 100
                return NULL;
101
        }
102
        return PyInt_FromLong(static_cast<long>(i->itemText.lines()));
103
}
104
 
2790 craig 105
PyObject *scribus_getcolumns(PyObject* /* self */, PyObject* args)
138 Franz 106
{
934 subik 107
        char *Name = const_cast<char*>("");
900 cbradney 108
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
138 Franz 109
                return NULL;
649 fschmid 110
        if(!checkHaveDocument())
111
                return NULL;
900 cbradney 112
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
853 subik 113
        if (i == NULL)
114
                return NULL;
3625 avox 115
        if (!i->asTextFrame())
853 subik 116
        {
10598 cbradney 117
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get column count of non-text frame.","python error").toLocal8Bit().constData());
853 subik 118
                return NULL;
119
        }
120
        return PyInt_FromLong(static_cast<long>(i->Cols));
138 Franz 121
}
122
 
2790 craig 123
PyObject *scribus_getlinespace(PyObject* /* self */, PyObject* args)
82 Franz 124
{
934 subik 125
        char *Name = const_cast<char*>("");
900 cbradney 126
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
82 Franz 127
                return NULL;
649 fschmid 128
        if(!checkHaveDocument())
129
                return NULL;
900 cbradney 130
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
853 subik 131
        if (i == NULL)
132
                return NULL;
3625 avox 133
        if (!i->asTextFrame())
853 subik 134
        {
10598 cbradney 135
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get line space of non-text frame.","python error").toLocal8Bit().constData());
853 subik 136
                return NULL;
137
        }
5559 avox 138
        return PyFloat_FromDouble(static_cast<double>(i->currentStyle().lineSpacing()));
82 Franz 139
}
140
 
12332 jghali 141
PyObject *scribus_gettextdistances(PyObject* /* self */, PyObject* args)
142
{
143
        char *Name = const_cast<char*>("");
144
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
145
                return NULL;
146
        if(!checkHaveDocument())
147
                return NULL;
148
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
149
        if (i == NULL)
150
                return NULL;
151
        if (!i->asTextFrame())
152
        {
153
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get text distances of non-text frame.","python error").toLocal8Bit().constData());
154
                return NULL;
155
        }
156
        return Py_BuildValue("(dddd)",
157
            PointToValue(i->textToFrameDistLeft()),
158
            PointToValue(i->textToFrameDistRight()),
159
            PointToValue(i->textToFrameDistTop()),
160
            PointToValue(i->textToFrameDistBottom()));
161
}
162
 
2790 craig 163
PyObject *scribus_getcolumngap(PyObject* /* self */, PyObject* args)
138 Franz 164
{
934 subik 165
        char *Name = const_cast<char*>("");
900 cbradney 166
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
138 Franz 167
                return NULL;
649 fschmid 168
        if(!checkHaveDocument())
169
                return NULL;
900 cbradney 170
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
853 subik 171
        if (i == NULL)
172
                return NULL;
3625 avox 173
        if (!i->asTextFrame())
853 subik 174
        {
10598 cbradney 175
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get column gap of non-text frame.","python error").toLocal8Bit().constData());
853 subik 176
                return NULL;
177
        }
1512 craig 178
        return PyFloat_FromDouble(PointToValue(static_cast<double>(i->ColGap)));
138 Franz 179
}
180
 
2790 craig 181
PyObject *scribus_getframetext(PyObject* /* self */, PyObject* args)
95 Franz 182
{
934 subik 183
        char *Name = const_cast<char*>("");
900 cbradney 184
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
95 Franz 185
                return NULL;
649 fschmid 186
        if(!checkHaveDocument())
187
                return NULL;
95 Franz 188
        QString text = "";
900 cbradney 189
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 190
        if (it == NULL)
191
                return NULL;
3625 avox 192
        if (!(it->asTextFrame()) && !(it->asPathText()))
853 subik 193
        {
10598 cbradney 194
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get text of non-text frame.","python error").toLocal8Bit().constData());
853 subik 195
                return NULL;
196
        }
11634 jghali 197
        for (int a = it->firstInFrame(); a <= it->lastInFrame(); ++a)
213 Franz 198
        {
720 subik 199
                if (it->HasSel)
213 Franz 200
                {
5721 avox 201
                        if (it->itemText.selected(a))
202
                                text += it->itemText.text(a);
213 Franz 203
                }
720 subik 204
                else
205
                {
5721 avox 206
                        text += it->itemText.text(a);
720 subik 207
                }
213 Franz 208
        }
10493 fschmid 209
        return PyString_FromString(text.toUtf8());
95 Franz 210
}
211
 
2790 craig 212
PyObject *scribus_gettext(PyObject* /* self */, PyObject* args)
82 Franz 213
{
934 subik 214
        char *Name = const_cast<char*>("");
900 cbradney 215
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
82 Franz 216
                return NULL;
649 fschmid 217
        if(!checkHaveDocument())
218
                return NULL;
87 Franz 219
        QString text = "";
900 cbradney 220
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 221
        if (it == NULL)
222
                return NULL;
3625 avox 223
        if (!(it->asTextFrame()) && !(it->asPathText()))
853 subik 224
        {
10598 cbradney 225
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get text of non-text frame.","python error").toLocal8Bit().constData());
853 subik 226
                return NULL;
227
        }
5721 avox 228
 
229
        // collect all chars from a storytext
5753 jghali 230
        for (int a = 0; a < it->itemText.length(); a++)
213 Franz 231
        {
720 subik 232
                if (it->HasSel)
233
                {
5721 avox 234
                        if (it->itemText.selected(a))
235
                                text += it->itemText.text(a);
720 subik 236
                }
237
                else
238
                {
5721 avox 239
                        text += it->itemText.text(a);
720 subik 240
                }
241
        } // for
10493 fschmid 242
        return PyString_FromString(text.toUtf8());
82 Franz 243
}
244
 
2790 craig 245
PyObject *scribus_setboxtext(PyObject* /* self */, PyObject* args)
82 Franz 246
{
934 subik 247
        char *Name = const_cast<char*>("");
82 Franz 248
        char *Text;
900 cbradney 249
        if (!PyArg_ParseTuple(args, "es|es", "utf-8", &Text, "utf-8", &Name))
82 Franz 250
                return NULL;
649 fschmid 251
        if(!checkHaveDocument())
252
                return NULL;
1957 cbradney 253
        PageItem *currItem = GetUniqueItem(QString::fromUtf8(Name));
254
        if (currItem == NULL)
720 subik 255
                return NULL;
3625 avox 256
        if (!(currItem->asTextFrame()) && !(currItem->asPathText()))
853 subik 257
        {
10598 cbradney 258
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text of non-text frame.","python error").toLocal8Bit().constData());
853 subik 259
                return NULL;
260
        }
391 Franz 261
        QString Daten = QString::fromUtf8(Text);
11961 jghali 262
        Daten.replace("\r\n", SpecialChars::PARSEP);
263
        Daten.replace(QChar('\n') , SpecialChars::PARSEP);
391 Franz 264
        PyMem_Free(Text);
1957 cbradney 265
        currItem->itemText.clear();
5721 avox 266
        currItem->itemText.insertChars(0, Daten);
13788 jghali 267
        currItem->invalidateLayout();
2703 fschmid 268
        currItem->Dirty = false;
8319 fschmid 269
//      Py_INCREF(Py_None);
270
//      return Py_None;
271
        Py_RETURN_NONE;
82 Franz 272
}
273
 
2790 craig 274
PyObject *scribus_inserttext(PyObject* /* self */, PyObject* args)
82 Franz 275
{
934 subik 276
        char *Name = const_cast<char*>("");
82 Franz 277
        char *Text;
87 Franz 278
        int pos;
900 cbradney 279
        if (!PyArg_ParseTuple(args, "esi|es", "utf-8", &Text, &pos, "utf-8", &Name))
82 Franz 280
                return NULL;
649 fschmid 281
        if(!checkHaveDocument())
282
                return NULL;
900 cbradney 283
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 284
        if (it == NULL)
285
                return NULL;
3625 avox 286
        if (!(it->asTextFrame()) && !(it->asPathText()))
853 subik 287
        {
10598 cbradney 288
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot insert text into non-text frame.","python error").toLocal8Bit().constData());
853 subik 289
                return NULL;
290
        }
391 Franz 291
        QString Daten = QString::fromUtf8(Text);
11774 jghali 292
        Daten.replace("\r\n", SpecialChars::PARSEP);
293
        Daten.replace(QChar('\n') , SpecialChars::PARSEP);
391 Franz 294
        PyMem_Free(Text);
5721 avox 295
        if ((pos < -1) || (pos > static_cast<int>(it->itemText.length())))
213 Franz 296
        {
10598 cbradney 297
                PyErr_SetString(PyExc_IndexError, QObject::tr("Insert index out of bounds.","python error").toLocal8Bit().constData());
720 subik 298
                return NULL;
213 Franz 299
        }
1977 craig 300
        if (pos == -1)
5721 avox 301
                pos = it->itemText.length();
5559 avox 302
        it->itemText.insertChars(pos, Daten);
4210 subik 303
        it->Dirty = true;
5781 cbradney 304
        if (ScCore->primaryMainWindow()->doc->DoDrawing)
4211 subik 305
        {
9343 fschmid 306
// FIXME adapt to Qt-4 painting style
4211 subik 307
                it->Dirty = false;
308
        }
8319 fschmid 309
//      Py_INCREF(Py_None);
310
//      return Py_None;
311
        Py_RETURN_NONE;
82 Franz 312
}
313
 
17795 jghali 314
PyObject *scribus_inserthtmltext(PyObject* /* self */, PyObject* args)
315
{
316
    char *name = const_cast<char*>("");
317
    char *file;
318
    QString data;
319
 
320
    if (!PyArg_ParseTuple(args, "es|es", "utf-8", &file, "utf-8", &name)) {
321
        return NULL;
322
    }
323
 
324
    if(!checkHaveDocument()) {
325
        return NULL;
326
    }
327
 
328
    PageItem *it = GetUniqueItem(QString::fromUtf8(name));
329
    if (it == NULL) {
330
        return NULL;
331
    }
332
 
333
    if (!(it->asTextFrame()) && !(it->asPathText())) {
334
        PyErr_SetString(WrongFrameTypeError,
335
                QObject::tr("Cannot insert text into non-text frame.",
336
                    "python error").toLocal8Bit().constData());
337
        return NULL;
338
    }
339
 
340
        QString fileName = QString::fromUtf8(file);
341
 
342
    gtGetText gt(ScCore->primaryMainWindow()->doc);
343
    gt.launchImporter(-1, fileName, false, QString("utf-8"), false, it);
344
 
345
    // FIXME: PyMem_Free() - are any needed??
346
    Py_RETURN_NONE;
347
}
348
 
2790 craig 349
PyObject *scribus_setalign(PyObject* /* self */, PyObject* args)
82 Franz 350
{
934 subik 351
        char *Name = const_cast<char*>("");
720 subik 352
        int alignment;
900 cbradney 353
        if (!PyArg_ParseTuple(args, "i|es", &alignment, "utf-8", &Name))
82 Franz 354
                return NULL;
649 fschmid 355
        if(!checkHaveDocument())
356
                return NULL;
816 subik 357
        if ((alignment > 4) || (alignment < 0))
647 fschmid 358
        {
10598 cbradney 359
                PyErr_SetString(PyExc_ValueError, QObject::tr("Alignment out of range. Use one of the scribus.ALIGN* constants.","python error").toLocal8Bit().constData());
720 subik 360
                return NULL;
647 fschmid 361
        }
900 cbradney 362
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
720 subik 363
        if (i == NULL)
364
                return NULL;
3625 avox 365
        if (!i->asTextFrame())
213 Franz 366
        {
10598 cbradney 367
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text alignment on a non-text frame.","python error").toLocal8Bit().constData());
720 subik 368
                return NULL;
213 Franz 369
        }
5781 cbradney 370
        int Apm = ScCore->primaryMainWindow()->doc->appMode;
371
        ScCore->primaryMainWindow()->doc->m_Selection->clear();
372
        ScCore->primaryMainWindow()->doc->m_Selection->addItem(i);
720 subik 373
        if (i->HasSel)
5781 cbradney 374
                ScCore->primaryMainWindow()->doc->appMode = modeEdit;
375
        ScCore->primaryMainWindow()->setNewAlignment(alignment);
376
        ScCore->primaryMainWindow()->doc->appMode = Apm;
377
        ScCore->primaryMainWindow()->view->Deselect();
8319 fschmid 378
//      Py_INCREF(Py_None);
379
//      return Py_None;
380
        Py_RETURN_NONE;
82 Franz 381
}
382
 
2790 craig 383
PyObject *scribus_setfontsize(PyObject* /* self */, PyObject* args)
82 Franz 384
{
934 subik 385
        char *Name = const_cast<char*>("");
111 Franz 386
        double size;
900 cbradney 387
        if (!PyArg_ParseTuple(args, "d|es", &size, "utf-8", &Name))
82 Franz 388
                return NULL;
649 fschmid 389
        if(!checkHaveDocument())
390
                return NULL;
82 Franz 391
        if ((size > 512) || (size < 1))
647 fschmid 392
        {
10598 cbradney 393
                PyErr_SetString(PyExc_ValueError, QObject::tr("Font size out of bounds - must be 1 <= size <= 512.","python error").toLocal8Bit().constData());
720 subik 394
                return NULL;
647 fschmid 395
        }
900 cbradney 396
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
720 subik 397
        if (i == NULL)
398
                return NULL;
1217 subik 399
 
3625 avox 400
        if (!i->asTextFrame())
213 Franz 401
        {
10598 cbradney 402
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set font size on a non-text frame.","python error").toLocal8Bit().constData());
720 subik 403
                return NULL;
213 Franz 404
        }
5781 cbradney 405
        int Apm = ScCore->primaryMainWindow()->doc->appMode;
406
        ScCore->primaryMainWindow()->doc->m_Selection->clear();
407
        ScCore->primaryMainWindow()->doc->m_Selection->addItem(i);
720 subik 408
        if (i->HasSel)
5781 cbradney 409
                ScCore->primaryMainWindow()->doc->appMode = modeEdit;
6733 avox 410
        ScCore->primaryMainWindow()->doc->itemSelection_SetFontSize(qRound(size * 10.0));
5781 cbradney 411
        ScCore->primaryMainWindow()->doc->appMode = Apm;
412
        ScCore->primaryMainWindow()->view->Deselect();
8319 fschmid 413
//      Py_INCREF(Py_None);
414
//      return Py_None;
415
        Py_RETURN_NONE;
82 Franz 416
}
417
 
2790 craig 418
PyObject *scribus_setfont(PyObject* /* self */, PyObject* args)
82 Franz 419
{
934 subik 420
        char *Name = const_cast<char*>("");
421
        char *Font = const_cast<char*>("");
900 cbradney 422
        if (!PyArg_ParseTuple(args, "es|es", "utf-8", &Font, "utf-8", &Name))
82 Franz 423
                return NULL;
649 fschmid 424
        if(!checkHaveDocument())
425
                return NULL;
900 cbradney 426
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
720 subik 427
        if (i == NULL)
428
                return NULL;
3625 avox 429
        if (!(i->asTextFrame()) && !(i->asPathText()))
213 Franz 430
        {
10598 cbradney 431
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set font on a non-text frame.","python error").toLocal8Bit().constData());
720 subik 432
                return NULL;
433
        }
13955 cbradney 434
        if (PrefsManager::instance()->appPrefs.fontPrefs.AvailFonts.contains(QString::fromUtf8(Font)))
720 subik 435
        {
5781 cbradney 436
                int Apm = ScCore->primaryMainWindow()->doc->appMode;
437
                ScCore->primaryMainWindow()->doc->m_Selection->clear();
438
                ScCore->primaryMainWindow()->doc->m_Selection->addItem(i);
332 Franz 439
                if (i->HasSel)
5781 cbradney 440
                        ScCore->primaryMainWindow()->doc->appMode = modeEdit;
441
                ScCore->primaryMainWindow()->SetNewFont(QString::fromUtf8(Font));
442
                ScCore->primaryMainWindow()->doc->appMode = Apm;
443
                ScCore->primaryMainWindow()->view->Deselect();
213 Franz 444
        }
720 subik 445
        else
446
        {
10598 cbradney 447
                PyErr_SetString(PyExc_ValueError, QObject::tr("Font not found.","python error").toLocal8Bit().constData());
720 subik 448
                return NULL;
449
        }
8319 fschmid 450
//      Py_INCREF(Py_None);
451
//      return Py_None;
452
        Py_RETURN_NONE;
82 Franz 453
}
454
 
2790 craig 455
PyObject *scribus_setlinespace(PyObject* /* self */, PyObject* args)
82 Franz 456
{
934 subik 457
        char *Name = const_cast<char*>("");
82 Franz 458
        double w;
900 cbradney 459
        if (!PyArg_ParseTuple(args, "d|es", &w, "utf-8", &Name))
82 Franz 460
                return NULL;
649 fschmid 461
        if(!checkHaveDocument())
462
                return NULL;
647 fschmid 463
        if (w < 0.1)
464
        {
10598 cbradney 465
                PyErr_SetString(PyExc_ValueError, QObject::tr("Line space out of bounds, must be >= 0.1.","python error").toLocal8Bit().constData());
720 subik 466
                return NULL;
647 fschmid 467
        }
900 cbradney 468
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
720 subik 469
        if (i == NULL)
470
                return NULL;
3625 avox 471
        if (!i->asTextFrame())
853 subik 472
        {
10598 cbradney 473
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set line spacing on a non-text frame.","python error").toLocal8Bit().constData());
853 subik 474
                return NULL;
475
        }
13199 jghali 476
 
477
        int Apm = ScCore->primaryMainWindow()->doc->appMode;
478
        ScCore->primaryMainWindow()->doc->m_Selection->clear();
479
        ScCore->primaryMainWindow()->doc->m_Selection->addItem(i);
480
        if (i->HasSel)
481
                ScCore->primaryMainWindow()->doc->appMode = modeEdit;
482
        ScCore->primaryMainWindow()->doc->itemSelection_SetLineSpacing(w);
483
        ScCore->primaryMainWindow()->doc->appMode = Apm;
484
        ScCore->primaryMainWindow()->view->Deselect();
485
 
5559 avox 486
//      i->setLineSpacing(w);
8319 fschmid 487
//      Py_INCREF(Py_None);
488
//      return Py_None;
489
        Py_RETURN_NONE;
82 Franz 490
}
491
 
14427 jghali 492
PyObject *scribus_setlinespacemode(PyObject* /* self */, PyObject* args)
493
{
494
        char *Name = const_cast<char*>("");
495
        int w;
496
        if (!PyArg_ParseTuple(args, "i|es", &w, "utf-8", &Name))
497
                return NULL;
498
        if(!checkHaveDocument())
499
                return NULL;
500
        if (w < 0 || w > 3) // Use constants?
501
        {
502
                PyErr_SetString(PyExc_ValueError, QObject::tr("Line space mode invalid, must be 0, 1 or 2","python error").toLocal8Bit().constData());
503
                return NULL;
504
        }
505
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
506
        if (i == NULL)
507
                return NULL;
508
        if (!i->asTextFrame())
509
        {
510
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set line spacing mode on a non-text frame.","python error").toLocal8Bit().constData());
511
                return NULL;
512
        }
513
 
514
        int Apm = ScCore->primaryMainWindow()->doc->appMode;
515
        ScCore->primaryMainWindow()->doc->m_Selection->clear();
516
        ScCore->primaryMainWindow()->doc->m_Selection->addItem(i);
517
        if (i->HasSel)
518
                ScCore->primaryMainWindow()->doc->appMode = modeEdit;
519
        ScCore->primaryMainWindow()->doc->itemSelection_SetLineSpacingMode(w);
520
        ScCore->primaryMainWindow()->doc->appMode = Apm;
521
        ScCore->primaryMainWindow()->view->Deselect();
522
 
523
        Py_RETURN_NONE;
524
}
525
 
12332 jghali 526
PyObject *scribus_settextdistances(PyObject* /* self */, PyObject* args)
527
{
528
        char *Name = const_cast<char*>("");
529
        double l,r,t,b;
530
        if (!PyArg_ParseTuple(args, "dddd|es", &l, &r, &t, &b, "utf-8", &Name))
531
                return NULL;
532
        if(!checkHaveDocument())
533
                return NULL;
534
        if (l < 0.0 || r < 0.0 || t < 0.0 || b < 0.0)
535
        {
536
                PyErr_SetString(PyExc_ValueError, QObject::tr("Text distances out of bounds, must be positive.","python error").toLocal8Bit().constData());
537
                return NULL;
538
        }
539
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
540
        if (i == NULL)
541
                return NULL;
542
        if (!i->asTextFrame())
543
        {
544
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text distances on a non-text frame.","python error").toLocal8Bit().constData());
545
                return NULL;
546
        }
547
        i->setTextToFrameDist(ValueToPoint(l), ValueToPoint(r), ValueToPoint(t), ValueToPoint(b));
548
        Py_INCREF(Py_None);
549
        return Py_None;
550
}
551
 
2790 craig 552
PyObject *scribus_setcolumngap(PyObject* /* self */, PyObject* args)
138 Franz 553
{
934 subik 554
        char *Name = const_cast<char*>("");
138 Franz 555
        double w;
900 cbradney 556
        if (!PyArg_ParseTuple(args, "d|es", &w, "utf-8", &Name))
138 Franz 557
                return NULL;
649 fschmid 558
        if(!checkHaveDocument())
559
                return NULL;
647 fschmid 560
        if (w < 0.0)
561
        {
10598 cbradney 562
                PyErr_SetString(PyExc_ValueError, QObject::tr("Column gap out of bounds, must be positive.","python error").toLocal8Bit().constData());
720 subik 563
                return NULL;
647 fschmid 564
        }
900 cbradney 565
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
720 subik 566
        if (i == NULL)
567
                return NULL;
3625 avox 568
        if (!i->asTextFrame())
853 subik 569
        {
10598 cbradney 570
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set column gap on a non-text frame.","python error").toLocal8Bit().constData());
853 subik 571
                return NULL;
572
        }
1512 craig 573
        i->ColGap = ValueToPoint(w);
8319 fschmid 574
//      Py_INCREF(Py_None);
575
//      return Py_None;
576
        Py_RETURN_NONE;
138 Franz 577
}
578
 
2790 craig 579
PyObject *scribus_setcolumns(PyObject* /* self */, PyObject* args)
138 Franz 580
{
934 subik 581
        char *Name = const_cast<char*>("");
138 Franz 582
        int w;
900 cbradney 583
        if (!PyArg_ParseTuple(args, "i|es", &w, "utf-8", &Name))
138 Franz 584
                return NULL;
649 fschmid 585
        if(!checkHaveDocument())
586
                return NULL;
647 fschmid 587
        if (w < 1)
588
        {
10598 cbradney 589
                PyErr_SetString(PyExc_ValueError, QObject::tr("Column count out of bounds, must be > 1.","python error").toLocal8Bit().constData());
720 subik 590
                return NULL;
647 fschmid 591
        }
900 cbradney 592
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
720 subik 593
        if (i == NULL)
594
                return NULL;
3625 avox 595
        if (!i->asTextFrame())
853 subik 596
        {
10598 cbradney 597
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set number of columns on a non-text frame.","python error").toLocal8Bit().constData());
853 subik 598
                return NULL;
599
        }
720 subik 600
        i->Cols = w;
8319 fschmid 601
//      Py_INCREF(Py_None);
602
//      return Py_None;
603
        Py_RETURN_NONE;
138 Franz 604
}
605
 
2790 craig 606
PyObject *scribus_selecttext(PyObject* /* self */, PyObject* args)
82 Franz 607
{
934 subik 608
        char *Name = const_cast<char*>("");
1217 subik 609
        int start, selcount;
610
        if (!PyArg_ParseTuple(args, "ii|es", &start, &selcount, "utf-8", &Name))
82 Franz 611
                return NULL;
649 fschmid 612
        if(!checkHaveDocument())
613
                return NULL;
900 cbradney 614
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 615
        if (it == NULL)
616
                return NULL;
1217 subik 617
        if (selcount == -1)
213 Franz 618
        {
1217 subik 619
                // user wants to select all after the start point -- CR
5721 avox 620
                selcount = it->itemText.length() - start;
1217 subik 621
                if (selcount < 0)
622
                        // user passed start that's > text in the frame
623
                        selcount = 0;
624
        }
625
        // cr 2005-01-18 fixed off-by-one with end bound that made selecting the last char impossible
5721 avox 626
        if ((start < 0) || ((start + selcount) > static_cast<int>(it->itemText.length())))
1217 subik 627
        {
10598 cbradney 628
                PyErr_SetString(PyExc_IndexError, QObject::tr("Selection index out of bounds", "python error").toLocal8Bit().constData());
720 subik 629
                return NULL;
213 Franz 630
        }
3625 avox 631
        if (!(it->asTextFrame()) && !(it->asPathText()))
853 subik 632
        {
10598 cbradney 633
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot select text in a non-text frame", "python error").toLocal8Bit().constData());
853 subik 634
                return NULL;
635
        }
720 subik 636
        /* FIXME: not sure if we should make this check or not
637
        if (start > ende)
638
        {
10598 cbradney 639
                PyErr_SetString(PyExc_ValueError, QString("Selection start > selection end").toLocal8Bit().constData());
720 subik 640
                return NULL;
641
        }
642
        */
5721 avox 643
        it->itemText.deselectAll();
1217 subik 644
        if (selcount == 0)
720 subik 645
        {
646
                it->HasSel = false;
8319 fschmid 647
//              Py_INCREF(Py_None);
648
//              return Py_None;
649
                Py_RETURN_NONE;
720 subik 650
        }
5721 avox 651
        it->itemText.select(start, selcount, true);
720 subik 652
        it->HasSel = true;
8319 fschmid 653
//      Py_INCREF(Py_None);
654
//      return Py_None;
655
        Py_RETURN_NONE;
82 Franz 656
}
657
 
2790 craig 658
PyObject *scribus_deletetext(PyObject* /* self */, PyObject* args)
82 Franz 659
{
934 subik 660
        char *Name = const_cast<char*>("");
900 cbradney 661
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
82 Franz 662
                return NULL;
649 fschmid 663
        if(!checkHaveDocument())
664
                return NULL;
900 cbradney 665
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 666
        if (it == NULL)
667
                return NULL;
3625 avox 668
        if (!(it->asTextFrame()) && !(it->asPathText()))
853 subik 669
        {
10598 cbradney 670
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot delete text from a non-text frame.","python error").toLocal8Bit().constData());
853 subik 671
                return NULL;
672
        }
720 subik 673
        if (it->HasSel)
3829 cbradney 674
                dynamic_cast<PageItem_TextFrame*>(it)->deleteSelectedTextFromFrame();
720 subik 675
        else
213 Franz 676
        {
1065 cbradney 677
                it->itemText.clear();
213 Franz 678
        }
8319 fschmid 679
//      Py_INCREF(Py_None);
680
//      return Py_None;
681
        Py_RETURN_NONE;
82 Franz 682
}
683
 
2790 craig 684
PyObject *scribus_settextfill(PyObject* /* self */, PyObject* args)
82 Franz 685
{
934 subik 686
        char *Name = const_cast<char*>("");
82 Franz 687
        char *Color;
900 cbradney 688
        if (!PyArg_ParseTuple(args, "es|es", "utf-8", &Color, "utf-8", &Name))
82 Franz 689
                return NULL;
649 fschmid 690
        if(!checkHaveDocument())
691
                return NULL;
900 cbradney 692
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 693
        if (it == NULL)
694
                return NULL;
3625 avox 695
        if (!(it->asTextFrame()) && !(it->asPathText()))
213 Franz 696
        {
10598 cbradney 697
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text fill on a non-text frame.","python error").toLocal8Bit().constData());
853 subik 698
                return NULL;
699
        }
700
        else
701
        {
5753 jghali 702
                for (int b = 0; b < it->itemText.length(); b++)
213 Franz 703
                {
5721 avox 704
                        //FIXME: doc method
332 Franz 705
                        if (it->HasSel)
82 Franz 706
                        {
5721 avox 707
                                if (it->itemText.selected(b))
708
                                        it->itemText.item(b)->setFillColor(QString::fromUtf8(Color));
213 Franz 709
                        }
332 Franz 710
                        else
5721 avox 711
                                it->itemText.item(b)->setFillColor(QString::fromUtf8(Color));
82 Franz 712
                }
5559 avox 713
//              it->TxtFill = QString::fromUtf8(Color);
720 subik 714
        }
8319 fschmid 715
//      Py_INCREF(Py_None);
716
//      return Py_None;
717
        Py_RETURN_NONE;
82 Franz 718
}
719
 
2790 craig 720
PyObject *scribus_settextstroke(PyObject* /* self */, PyObject* args)
82 Franz 721
{
934 subik 722
        char *Name = const_cast<char*>("");
82 Franz 723
        char *Color;
900 cbradney 724
        if (!PyArg_ParseTuple(args, "es|es", "utf-8", &Color, "utf-8", &Name))
82 Franz 725
                return NULL;
649 fschmid 726
        if(!checkHaveDocument())
727
                return NULL;
900 cbradney 728
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 729
        if (it == NULL)
730
                return NULL;
3625 avox 731
        if (!(it->asTextFrame()) && (it->asPathText()))
213 Franz 732
        {
10598 cbradney 733
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text stroke on a non-text frame.","python error").toLocal8Bit().constData());
853 subik 734
                return NULL;
735
        }
736
        else
737
        {
5753 jghali 738
                for (int b = 0; b < it->itemText.length(); b++)
213 Franz 739
                {
5721 avox 740
                        //FIXME:NLS use document method for this
332 Franz 741
                        if (it->HasSel)
82 Franz 742
                        {
5721 avox 743
                                if (it->itemText.selected(b))
744
                                        it->itemText.item(b)->setStrokeColor(QString::fromUtf8(Color));
213 Franz 745
                        }
332 Franz 746
                        else
5721 avox 747
                                it->itemText.item(b)->setStrokeColor(QString::fromUtf8(Color));
82 Franz 748
                }
5559 avox 749
//              it->TxtStroke = QString::fromUtf8(Color);
720 subik 750
        }
8319 fschmid 751
//      Py_INCREF(Py_None);
752
//      return Py_None;
753
        Py_RETURN_NONE;
82 Franz 754
}
755
 
13199 jghali 756
 
757
PyObject *scribus_settextscalingh(PyObject* /* self */, PyObject* args)
758
{
759
        char *Name = const_cast<char*>("");
760
        double sc;
761
        if (!PyArg_ParseTuple(args, "d|es", &sc, "utf-8", &Name))
762
                return NULL;
763
        if(!checkHaveDocument())
764
                return NULL;
765
        if (sc < 10)
766
        {
767
                PyErr_SetString(PyExc_ValueError, QObject::tr("Character scaling out of bounds, must be >= 10","python error").toLocal8Bit().constData());
768
                return NULL;
769
        }
770
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
771
        if (i == NULL)
772
                return NULL;
773
        if (!i->asTextFrame())
774
        {
775
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set character scaling on a non-text frame.","python error").toLocal8Bit().constData());
776
                return NULL;
777
        }
778
 
779
        int Apm = ScCore->primaryMainWindow()->doc->appMode;
780
        ScCore->primaryMainWindow()->doc->m_Selection->clear();
781
        ScCore->primaryMainWindow()->doc->m_Selection->addItem(i);
782
        if (i->HasSel)
783
                ScCore->primaryMainWindow()->doc->appMode = modeEdit;
784
        ScCore->primaryMainWindow()->doc->itemSelection_SetScaleH(qRound(sc * 10));
785
        ScCore->primaryMainWindow()->doc->appMode = Apm;
786
        ScCore->primaryMainWindow()->view->Deselect();
787
 
788
        Py_RETURN_NONE;
789
}
790
 
791
 
792
PyObject *scribus_settextscalingv(PyObject* /* self */, PyObject* args)
793
{
794
        char *Name = const_cast<char*>("");
795
        double sc;
796
        if (!PyArg_ParseTuple(args, "d|es", &sc, "utf-8", &Name))
797
                return NULL;
798
        if(!checkHaveDocument())
799
                return NULL;
800
        if (sc < 10)
801
        {
802
                PyErr_SetString(PyExc_ValueError, QObject::tr("Character scaling out of bounds, must be >= 10","python error").toLocal8Bit().constData());
803
                return NULL;
804
        }
805
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
806
        if (i == NULL)
807
                return NULL;
808
        if (!i->asTextFrame())
809
        {
810
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set character scaling on a non-text frame.","python error").toLocal8Bit().constData());
811
                return NULL;
812
        }
813
 
814
        int Apm = ScCore->primaryMainWindow()->doc->appMode;
815
        ScCore->primaryMainWindow()->doc->m_Selection->clear();
816
        ScCore->primaryMainWindow()->doc->m_Selection->addItem(i);
817
        if (i->HasSel)
818
                ScCore->primaryMainWindow()->doc->appMode = modeEdit;
819
        ScCore->primaryMainWindow()->doc->itemSelection_SetScaleV(qRound(sc * 10));
820
        ScCore->primaryMainWindow()->doc->appMode = Apm;
821
        ScCore->primaryMainWindow()->view->Deselect();
822
 
823
        Py_RETURN_NONE;
824
}
825
 
826
 
2790 craig 827
PyObject *scribus_settextshade(PyObject* /* self */, PyObject* args)
82 Franz 828
{
934 subik 829
        char *Name = const_cast<char*>("");
87 Franz 830
        int w;
900 cbradney 831
        if (!PyArg_ParseTuple(args, "i|es", &w, "utf-8", &Name))
82 Franz 832
                return NULL;
649 fschmid 833
        if(!checkHaveDocument())
834
                return NULL;
647 fschmid 835
        if ((w < 0) || (w > 100))
836
        {
8319 fschmid 837
//              Py_INCREF(Py_None);
838
//              return Py_None;
839
                Py_RETURN_NONE;
647 fschmid 840
        }
900 cbradney 841
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 842
        if (it == NULL)
843
                return NULL;
3625 avox 844
        if (!(it->asTextFrame()) && !(it->asPathText()))
213 Franz 845
        {
10598 cbradney 846
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text shade on a non-text frame.","python error").toLocal8Bit().constData());
853 subik 847
                return NULL;
848
        }
849
        else
850
        {
5721 avox 851
                //FIXME:NLS use document method for that
5753 jghali 852
                for (int b = 0; b < it->itemText.length(); ++b)
213 Franz 853
                {
332 Franz 854
                        if (it->HasSel)
82 Franz 855
                        {
5721 avox 856
                                if (it->itemText.selected(b))
857
                                        it->itemText.item(b)->setFillShade(w);
82 Franz 858
                        }
332 Franz 859
                        else
5721 avox 860
                                it->itemText.item(b)->setFillShade(w);
213 Franz 861
                }
5559 avox 862
//      it->ShTxtFill = w;
213 Franz 863
        }
8319 fschmid 864
//      Py_INCREF(Py_None);
865
//      return Py_None;
866
        Py_RETURN_NONE;
82 Franz 867
}
868
 
2790 craig 869
PyObject *scribus_linktextframes(PyObject* /* self */, PyObject* args)
213 Franz 870
{
871
        char *name1;
872
        char *name2;
873
 
900 cbradney 874
        if (!PyArg_ParseTuple(args, "eses", "utf-8", &name1, "utf-8", &name2))
213 Franz 875
                return NULL;
649 fschmid 876
        if(!checkHaveDocument())
877
                return NULL;
900 cbradney 878
        PageItem *fromitem = GetUniqueItem(QString::fromUtf8(name1));
720 subik 879
        if (fromitem == NULL)
880
                return NULL;
900 cbradney 881
        PageItem *toitem = GetUniqueItem(QString::fromUtf8(name2));
720 subik 882
        if (toitem == NULL)
883
                return NULL;
3625 avox 884
        if (!(fromitem->asTextFrame()) || !(toitem->asTextFrame()))
853 subik 885
        {
10598 cbradney 886
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Can only link text frames.","python error").toLocal8Bit().constData());
853 subik 887
                return NULL;
888
        }
7994 avox 889
/*      if (toitem->itemText.length() > 0)
647 fschmid 890
        {
10598 cbradney 891
                PyErr_SetString(ScribusException, QObject::tr("Target frame must be empty.","python error").toLocal8Bit().constData());
720 subik 892
                return NULL;
7994 avox 893
        }*/
894
        if (toitem->nextInChain() != 0)
647 fschmid 895
        {
10598 cbradney 896
                PyErr_SetString(ScribusException, QObject::tr("Target frame links to another frame.","python error").toLocal8Bit().constData());
720 subik 897
                return NULL;
647 fschmid 898
        }
7994 avox 899
        if (toitem->prevInChain() != 0)
213 Franz 900
        {
10598 cbradney 901
                PyErr_SetString(ScribusException, QObject::tr("Target frame is linked to by another frame.","python error").toLocal8Bit().constData());
720 subik 902
                return NULL;
903
        }
904
        if (toitem == fromitem)
905
        {
10598 cbradney 906
                PyErr_SetString(ScribusException, QObject::tr("Source and target are the same object.","python error").toLocal8Bit().constData());
720 subik 907
                return NULL;
908
        }
909
        // references to the others boxes
7994 avox 910
        fromitem->link(toitem);
5781 cbradney 911
        ScCore->primaryMainWindow()->view->DrawNew();
720 subik 912
        // enable 'save icon' stuff
5781 cbradney 913
        ScCore->primaryMainWindow()->slotDocCh();
8319 fschmid 914
//      Py_INCREF(Py_None);
915
//      return Py_None;
916
        Py_RETURN_NONE;
213 Franz 917
}
918
 
2790 craig 919
PyObject *scribus_unlinktextframes(PyObject* /* self */, PyObject* args)
213 Franz 920
{
921
        char *name;
900 cbradney 922
        if (!PyArg_ParseTuple(args, "es", "utf-8", &name))
213 Franz 923
                return NULL;
649 fschmid 924
        if(!checkHaveDocument())
925
                return NULL;
900 cbradney 926
        PageItem *item = GetUniqueItem(QString::fromUtf8(name));
720 subik 927
        if (item == NULL)
928
                return NULL;
3625 avox 929
        if (!item->asTextFrame())
853 subik 930
        {
10598 cbradney 931
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot unlink a non-text frame.","python error").toLocal8Bit().constData());
853 subik 932
                return NULL;
933
        }
720 subik 934
        // only linked
7994 avox 935
        if (item->prevInChain() == 0)
647 fschmid 936
        {
10598 cbradney 937
                PyErr_SetString(ScribusException, QObject::tr("Object is not a linked text frame, can't unlink.","python error").toLocal8Bit().constData());
720 subik 938
                return NULL;
647 fschmid 939
        }
7994 avox 940
/*      if (item->NextBox == 0)
213 Franz 941
        {
10598 cbradney 942
                PyErr_SetString(ScribusException, QObject::tr("Object the last frame in a series, can't unlink. Unlink the previous frame instead.","python error").toLocal8Bit().constData());
720 subik 943
                return NULL;
944
        }
7994 avox 945
        */
5721 avox 946
/*      PageItem* nextbox = item->NextBox;
947
 
720 subik 948
        while (nextbox != 0)
949
        {
1065 cbradney 950
                uint a = nextbox->itemText.count();
720 subik 951
                for (uint s=0; s<a; ++s)
1065 cbradney 952
                        item->itemText.append(nextbox->itemText.take(0));
720 subik 953
                nextbox = nextbox->NextBox;
954
        } // while
1065 cbradney 955
        uint a2 = item->itemText.count();
720 subik 956
        for (uint s = 0; s < a2; ++s)
1065 cbradney 957
                item->BackBox->itemText.append(item->itemText.take(0));
5721 avox 958
*/
7994 avox 959
        item->prevInChain()->unlink();
213 Franz 960
        // enable 'save icon' stuff
5781 cbradney 961
        ScCore->primaryMainWindow()->slotDocCh();
962
        ScCore->primaryMainWindow()->view->DrawNew();
8319 fschmid 963
//      Py_INCREF(Py_None);
964
//      return Py_None;
965
        Py_RETURN_NONE;
213 Franz 966
}
967
 
411 Franz 968
/*
720 subik 969
 * Convert the selected text frame to outlines.
411 Franz 970
 *
971
 * 2004-09-07 (Craig Ringer)
720 subik 972
 * 2004-09-14 pv frame type, optional frame name param
411 Franz 973
 */
2790 craig 974
PyObject *scribus_tracetext(PyObject* /* self */, PyObject* args)
411 Franz 975
{
934 subik 976
        char *name = const_cast<char*>("");
900 cbradney 977
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &name))
411 Franz 978
                return NULL;
649 fschmid 979
        if(!checkHaveDocument())
980
                return NULL;
900 cbradney 981
        PageItem *item = GetUniqueItem(QString::fromUtf8(name));
720 subik 982
        if (item == NULL)
983
                return NULL;
3625 avox 984
        if (!item->asTextFrame())
411 Franz 985
        {
10598 cbradney 986
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot convert a non-text frame to outlines.","python error").toLocal8Bit().constData());
720 subik 987
                return NULL;
411 Franz 988
        }
13788 jghali 989
        if (item->invalid)
990
                item->layout();
5781 cbradney 991
        ScCore->primaryMainWindow()->view->Deselect(true);
16943 fschmid 992
        ScCore->primaryMainWindow()->view->SelectItem(item);
5781 cbradney 993
        ScCore->primaryMainWindow()->view->TextToPath();
8319 fschmid 994
//      Py_INCREF(Py_None);
995
//      return Py_None;
996
        Py_RETURN_NONE;
411 Franz 997
}
1419 subik 998
 
1607 subik 999
PyObject *scribus_istextoverflowing(PyObject * self, PyObject* args, PyObject* kw)
1419 subik 1000
{
17219 jghali 1001
        int nolinks = 0;
1419 subik 1002
        char *name = const_cast<char*>("");
1607 subik 1003
        char *kwargs[] = {const_cast<char*>("name"), const_cast<char*>("nolinks"), NULL};
1004
        if (!PyArg_ParseTupleAndKeywords(args, kw, "|esi", kwargs, "utf-8", &name, &nolinks))
1419 subik 1005
                return NULL;
1006
        if(!checkHaveDocument())
1007
                return NULL;
1008
        PageItem *item = GetUniqueItem(QString::fromUtf8(name));
1009
        if (item == NULL)
1010
                return NULL;
3625 avox 1011
        if (!item->asTextFrame())
1419 subik 1012
        {
10598 cbradney 1013
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Only text frames can be checked for overflowing", "python error").toLocal8Bit().constData());
1419 subik 1014
                return NULL;
1015
        }
1607 subik 1016
        /* original solution
1017
        if (item->itemText.count() > item->MaxChars)
1018
        return PyBool_FromLong(static_cast<long>(true));
1019
        return PyBool_FromLong(static_cast<long>(false)); */
5559 avox 1020
        /*
1021
         uint firstFrame = 0;
1607 subik 1022
        if (nolinks)
1023
                firstFrame = item->itemText.count();
1024
        uint chars = item->itemText.count();
1025
        uint maxchars = item->MaxChars;
1026
        while (item->NextBox != 0) {
1027
                item = item->NextBox;
1028
                chars += item->itemText.count();
1029
                maxchars += item->MaxChars;
1030
        }
1031
        // no overrun
1032
        if (nolinks)
1033
                return PyInt_FromLong(maxchars - firstFrame);
1034
 
1035
        if (maxchars > chars)
1036
                return PyInt_FromLong(0);
1037
        // number of overrunning letters
1038
        return PyInt_FromLong(static_cast<long>(chars - maxchars));
5559 avox 1039
         */
11203 subik 1040
        // refresh overflow information
1041
        item->invalidateLayout();
1042
        item->layout();
5559 avox 1043
        return PyInt_FromLong(static_cast<long>(item->frameOverflows()));
1419 subik 1044
}
1534 subik 1045
 
11223 subik 1046
/*
1047
 * Does hyphenation on the given text frame.
1048
 * 08.12.2007: Joachim Neu
1049
 */
1050
PyObject *scribus_hyphenatetext(PyObject*, PyObject* args)
1051
{
1052
        char *name = const_cast<char*>("");
1053
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &name))
1054
                return NULL;
1055
        if (!checkHaveDocument())
1056
                return NULL;
1057
        PageItem *i = GetUniqueItem(QString::fromUtf8(name));
1058
        if (i == NULL)
1059
                return NULL;
1060
        if (!i->asTextFrame())
1061
        {
1062
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Can only hyphenate text frame", "python error").toLocal8Bit().constData());
1063
                return NULL;
1064
        }
1065
        ScCore->primaryMainWindow()->doc->docHyphenator->slotHyphenate(i);
1066
        return PyBool_FromLong(1);
1067
}
1068
 
1069
/*
1070
 * Does dehyphenation on the given text frame.
1071
 * 13.12.2007: Joachim Neu
1072
 */
1073
PyObject *scribus_dehyphenatetext(PyObject*, PyObject* args)
1074
{
1075
        char *name = const_cast<char*>("");
1076
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &name))
1077
                return NULL;
1078
        if (!checkHaveDocument())
1079
                return NULL;
1080
        PageItem *i = GetUniqueItem(QString::fromUtf8(name));
1081
        if (i == NULL)
1082
                return NULL;
1083
        if (!i->asTextFrame())
1084
        {
1085
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Can only dehyphenate text frame", "python error").toLocal8Bit().constData());
1086
                return NULL;
1087
        }
1088
        ScCore->primaryMainWindow()->doc->docHyphenator->slotDeHyphenate(i);
1089
        return PyBool_FromLong(1);
1090
}
1091
 
2790 craig 1092
PyObject *scribus_setpdfbookmark(PyObject* /* self */, PyObject* args)
1534 subik 1093
{
1094
        char *name = const_cast<char*>("");
1095
        bool toggle;
1096
        if (!PyArg_ParseTuple(args, "b|es", &toggle, "utf-8", &name))
1097
                return NULL;
1098
        if (!checkHaveDocument())
1099
                return NULL;
1100
        PageItem *i = GetUniqueItem(QString::fromUtf8(name));
1101
        if (i == NULL)
1102
                return NULL;
3625 avox 1103
        if (!i->asTextFrame())
1534 subik 1104
        {
10598 cbradney 1105
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Can't set bookmark on a non-text frame", "python error").toLocal8Bit().constData());
1534 subik 1106
                return NULL;
1107
        }
1108
        if (i->isBookmark == toggle)
1109
        {
8319 fschmid 1110
//              Py_INCREF(Py_None);
1111
//              return Py_None;
1112
                Py_RETURN_NONE;
1534 subik 1113
        }
1114
        if (toggle)
1115
        {
4084 cbradney 1116
                i->setIsAnnotation(false);
5781 cbradney 1117
                ScCore->primaryMainWindow()->AddBookMark(i);
1534 subik 1118
        }
1119
        else
5781 cbradney 1120
                ScCore->primaryMainWindow()->DelBookMark(i);
1534 subik 1121
        i->isBookmark = toggle;
8319 fschmid 1122
//      Py_INCREF(Py_None);
1123
//      return Py_None;
1124
        Py_RETURN_NONE;
1534 subik 1125
}
1126
 
2790 craig 1127
PyObject *scribus_ispdfbookmark(PyObject* /* self */, PyObject* args)
1534 subik 1128
{
1129
        char *name = const_cast<char*>("");
1130
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &name))
1131
                return NULL;
1132
        if (!checkHaveDocument())
1133
                return NULL;
1134
        PageItem *i = GetUniqueItem(QString::fromUtf8(name));
1135
        if (i == NULL)
1136
                return NULL;
13150 jghali 1137
        if (!i->asTextFrame())
1534 subik 1138
        {
10598 cbradney 1139
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Can't get info from a non-text frame", "python error").toLocal8Bit().constData());
1534 subik 1140
                return NULL;
1141
        }
1142
        if (i->isBookmark)
1143
                return PyBool_FromLong(1);
1144
        return PyBool_FromLong(0);
1145
}
6200 subik 1146
 
1147
/*! HACK: this removes "warning: 'blah' defined but not used" compiler warnings
1148
with header files structure untouched (docstrings are kept near declarations)
1149
PV */
1150
void cmdtextdocwarnings()
1151
{
1152
    QStringList s;
11203 subik 1153
    s << scribus_getfontsize__doc__    << scribus_getfont__doc__
10598 cbradney 1154
          << scribus_gettextlines__doc__   << scribus_gettextsize__doc__
1155
          << scribus_getframetext__doc__   << scribus_gettext__doc__
1156
          << scribus_getlinespace__doc__   << scribus_getcolumngap__doc__
1157
          << scribus_getcolumns__doc__     << scribus_setboxtext__doc__
1158
          << scribus_inserttext__doc__     << scribus_setfont__doc__
11203 subik 1159
          << scribus_setfontsize__doc__    << scribus_setlinespace__doc__
10598 cbradney 1160
          << scribus_setcolumngap__doc__   << scribus_setcolumns__doc__
1161
          << scribus_setalign__doc__       << scribus_selecttext__doc__
1162
          << scribus_deletetext__doc__     << scribus_settextfill__doc__
1163
          << scribus_settextstroke__doc__  << scribus_settextshade__doc__
1164
          << scribus_linktextframes__doc__ << scribus_unlinktextframes__doc__
1165
          << scribus_tracetext__doc__      << scribus_istextoverflowing__doc__
11223 subik 1166
          << scribus_setpdfbookmark__doc__ << scribus_ispdfbookmark__doc__
13393 cbradney 1167
          << scribus_hyphenatetext__doc__ << scribus_dehyphenatetext__doc__
1168
          << scribus_gettextdistances__doc__ << scribus_settextdistances__doc__
14634 subik 1169
          << scribus_settextscalingh__doc__ << scribus_settextscalingv__doc__
1170
          << scribus_setlinespacemode__doc__;
6200 subik 1171
}