Subversion Repositories Scribus

Rev

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

Rev Author Line No. Line
103 Franz 1
#include "cmdtext.h"
2
#include "cmdutil.h"
3829 cbradney 3
#include "pageitem_textframe.h"
2834 cbradney 4
#include "prefsmanager.h"
82 Franz 5
 
2790 craig 6
PyObject *scribus_getfontsize(PyObject* /* self */, PyObject* args)
82 Franz 7
{
934 subik 8
        char *Name = const_cast<char*>("");
900 cbradney 9
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
82 Franz 10
                return NULL;
649 fschmid 11
        if(!checkHaveDocument())
12
                return NULL;
900 cbradney 13
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 14
        if (it == NULL)
15
                return NULL;
3625 avox 16
        if (!(it->asTextFrame()) && !(it->asPathText()))
853 subik 17
        {
18
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get font size of non-text frame.","python error"));
19
                return NULL;
20
        }
720 subik 21
        if (it->HasSel)
213 Franz 22
        {
1065 cbradney 23
                for (uint b = 0; b < it->itemText.count(); b++)
24
                        if (it->itemText.at(b)->cselect)
25
                                return PyFloat_FromDouble(static_cast<double>(it->itemText.at(b)->csize / 10.0));
1162 cbradney 26
                return NULL;
213 Franz 27
        }
720 subik 28
        else
29
                return PyFloat_FromDouble(static_cast<long>(it->ISize / 10.0));
82 Franz 30
}
31
 
2790 craig 32
PyObject *scribus_getfont(PyObject* /* self */, PyObject* args)
82 Franz 33
{
934 subik 34
        char *Name = const_cast<char*>("");
900 cbradney 35
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
82 Franz 36
                return NULL;
649 fschmid 37
        if(!checkHaveDocument())
38
                return NULL;
900 cbradney 39
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 40
        if (it == NULL)
41
                return NULL;
3625 avox 42
        if (!(it->asTextFrame()) && !(it->asPathText()))
853 subik 43
        {
44
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get font of non-text frame.","python error"));
45
                return NULL;
46
        }
720 subik 47
        if (it->HasSel)
213 Franz 48
        {
1065 cbradney 49
                for (uint b = 0; b < it->itemText.count(); b++)
50
                        if (it->itemText.at(b)->cselect)
3544 avox 51
                                return PyString_FromString(it->itemText.at(b)->cfont->scName().utf8());
1162 cbradney 52
                return NULL;
213 Franz 53
        }
720 subik 54
        else
900 cbradney 55
                return PyString_FromString(it->IFont.utf8());
82 Franz 56
}
57
 
2790 craig 58
PyObject *scribus_gettextsize(PyObject* /* self */, PyObject* args)
82 Franz 59
{
934 subik 60
        char *Name = const_cast<char*>("");
900 cbradney 61
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
82 Franz 62
                return NULL;
649 fschmid 63
        if(!checkHaveDocument())
64
                return NULL;
900 cbradney 65
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
853 subik 66
        if (i == NULL)
67
                return NULL;
3625 avox 68
        if (!(i->asTextFrame()) && !(i->asPathText()))
853 subik 69
        {
70
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get text size of non-text frame.","python error"));
71
                return NULL;
72
        }
1065 cbradney 73
        return PyInt_FromLong(static_cast<long>(i->itemText.count()));
82 Franz 74
}
75
 
2790 craig 76
PyObject *scribus_getcolumns(PyObject* /* self */, PyObject* args)
138 Franz 77
{
934 subik 78
        char *Name = const_cast<char*>("");
900 cbradney 79
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
138 Franz 80
                return NULL;
649 fschmid 81
        if(!checkHaveDocument())
82
                return NULL;
900 cbradney 83
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
853 subik 84
        if (i == NULL)
85
                return NULL;
3625 avox 86
        if (!i->asTextFrame())
853 subik 87
        {
88
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get column count of non-text frame.","python error"));
89
                return NULL;
90
        }
91
        return PyInt_FromLong(static_cast<long>(i->Cols));
138 Franz 92
}
93
 
2790 craig 94
PyObject *scribus_getlinespace(PyObject* /* self */, PyObject* args)
82 Franz 95
{
934 subik 96
        char *Name = const_cast<char*>("");
900 cbradney 97
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
82 Franz 98
                return NULL;
649 fschmid 99
        if(!checkHaveDocument())
100
                return NULL;
900 cbradney 101
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
853 subik 102
        if (i == NULL)
103
                return NULL;
3625 avox 104
        if (!i->asTextFrame())
853 subik 105
        {
106
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get line space of non-text frame.","python error"));
107
                return NULL;
108
        }
109
        return PyFloat_FromDouble(static_cast<double>(i->LineSp));
82 Franz 110
}
111
 
2790 craig 112
PyObject *scribus_getcolumngap(PyObject* /* self */, PyObject* args)
138 Franz 113
{
934 subik 114
        char *Name = const_cast<char*>("");
900 cbradney 115
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
138 Franz 116
                return NULL;
649 fschmid 117
        if(!checkHaveDocument())
118
                return NULL;
900 cbradney 119
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
853 subik 120
        if (i == NULL)
121
                return NULL;
3625 avox 122
        if (!i->asTextFrame())
853 subik 123
        {
124
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get column gap of non-text frame.","python error"));
125
                return NULL;
126
        }
1512 craig 127
        return PyFloat_FromDouble(PointToValue(static_cast<double>(i->ColGap)));
138 Franz 128
}
129
 
2790 craig 130
PyObject *scribus_getframetext(PyObject* /* self */, PyObject* args)
95 Franz 131
{
934 subik 132
        char *Name = const_cast<char*>("");
900 cbradney 133
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
95 Franz 134
                return NULL;
649 fschmid 135
        if(!checkHaveDocument())
136
                return NULL;
95 Franz 137
        QString text = "";
900 cbradney 138
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 139
        if (it == NULL)
140
                return NULL;
3625 avox 141
        if (!(it->asTextFrame()) && !(it->asPathText()))
853 subik 142
        {
143
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get text of non-text frame.","python error"));
144
                return NULL;
145
        }
1065 cbradney 146
        for (uint a = 0; a < it->itemText.count(); a++)
213 Franz 147
        {
720 subik 148
                if (it->HasSel)
213 Franz 149
                {
1065 cbradney 150
                        if (it->itemText.at(a)->cselect)
151
                                text += it->itemText.at(a)->ch;
213 Franz 152
                }
720 subik 153
                else
154
                {
1065 cbradney 155
                        text += it->itemText.at(a)->ch;
720 subik 156
                }
213 Franz 157
        }
900 cbradney 158
        return PyString_FromString(text.utf8());
95 Franz 159
}
160
 
2790 craig 161
PyObject *scribus_gettext(PyObject* /* self */, PyObject* args)
82 Franz 162
{
934 subik 163
        char *Name = const_cast<char*>("");
900 cbradney 164
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
82 Franz 165
                return NULL;
649 fschmid 166
        if(!checkHaveDocument())
167
                return NULL;
87 Franz 168
        QString text = "";
900 cbradney 169
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 170
        if (it == NULL)
171
                return NULL;
3625 avox 172
        if (!(it->asTextFrame()) && !(it->asPathText()))
853 subik 173
        {
174
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get text of non-text frame.","python error"));
175
                return NULL;
176
        }
720 subik 177
        PageItem *is = NULL;
178
        // Scan backwards to find the first frame in a linked series
179
        while (it->BackBox != 0)
213 Franz 180
        {
1361 tsoots 181
                is = GetUniqueItem(it->BackBox->itemName());
720 subik 182
                if (is == NULL)
213 Franz 183
                {
720 subik 184
                        // While GetUniqueItem has already set an exception, we'll
185
                        // overwrite that with a more suitable one for this particular case.
853 subik 186
                        // Not making this translatable, since it shouldnt' be seen and it's more important for
187
                        // us to be able to understand the error if it's reported.
188
                        PyErr_SetString(ScribusException, QString("(System Error) Broken linked frame series when scanning back"));
720 subik 189
                        return NULL;
190
                }
191
                it = is;
192
        } // while
193
        ///FIXME: What does this do? Could use a comment for explanation
1065 cbradney 194
        for (uint a = 0; a < it->itemText.count(); a++)
720 subik 195
        {
196
                if (it->HasSel)
197
                {
1065 cbradney 198
                        if (it->itemText.at(a)->cselect)
199
                                text += it->itemText.at(a)->ch;
720 subik 200
                }
201
                else
202
                {
1065 cbradney 203
                        text += it->itemText.at(a)->ch;
720 subik 204
                }
205
        } // for
206
        // Scan forward through linked frames and ... what?
207
        while (it->NextBox != 0)
208
        {
1361 tsoots 209
                is = GetUniqueItem(it->NextBox->itemName());
720 subik 210
                if (is == NULL)
211
                {
212
                        // While GetUniqueItem has already set an exception, we'll
213
                        // overwrite that with a more suitable one for this particular case.
853 subik 214
                        // Not making this translatable, since it shouldnt' be seen and it's more important for
215
                        // us to be able to understand the error if it's reported.
720 subik 216
                        PyErr_SetString(ScribusException, QString("(System Error) Broken linked frame series when scanning forward"));
217
                        return NULL;
218
                }
219
                it = is;
220
                assert(it != NULL);
1065 cbradney 221
                for (uint a = 0; a < it->itemText.count(); a++)
213 Franz 222
                {
223
                        if (it->HasSel)
82 Franz 224
                        {
1065 cbradney 225
                                if (it->itemText.at(a)->cselect)
226
                                        text += it->itemText.at(a)->ch;
213 Franz 227
                        }
82 Franz 228
                        else
332 Franz 229
                        {
1065 cbradney 230
                                text += it->itemText.at(a)->ch;
332 Franz 231
                        }
232
                } // for
720 subik 233
        } // while
900 cbradney 234
        return PyString_FromString(text.utf8());
82 Franz 235
}
236
 
2790 craig 237
PyObject *scribus_setboxtext(PyObject* /* self */, PyObject* args)
82 Franz 238
{
934 subik 239
        char *Name = const_cast<char*>("");
82 Franz 240
        char *Text;
900 cbradney 241
        if (!PyArg_ParseTuple(args, "es|es", "utf-8", &Text, "utf-8", &Name))
82 Franz 242
                return NULL;
649 fschmid 243
        if(!checkHaveDocument())
244
                return NULL;
1957 cbradney 245
        PageItem *currItem = GetUniqueItem(QString::fromUtf8(Name));
246
        if (currItem == NULL)
720 subik 247
                return NULL;
3625 avox 248
        if (!(currItem->asTextFrame()) && !(currItem->asPathText()))
853 subik 249
        {
250
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text of non-text frame.","python error"));
251
                return NULL;
252
        }
391 Franz 253
        QString Daten = QString::fromUtf8(Text);
254
        PyMem_Free(Text);
1957 cbradney 255
        if (currItem->NextBox != 0)
213 Franz 256
        {
1957 cbradney 257
                PageItem *nextItem = currItem->NextBox;
258
                while (nextItem != 0)
213 Franz 259
                {
2447 fschmid 260
                        for (ScText *itx = nextItem->itemText.first(); itx != 0; itx = nextItem->itemText.next())
261
                        {
262
                                if ((itx->ch == QChar(25)) && (itx->cembedded != 0))
2499 fschmid 263
                                {
3207 craig 264
                                        ScApp->doc->FrameItems.remove(itx->cembedded);
2499 fschmid 265
                                        delete itx->cembedded;
266
                                }
2447 fschmid 267
                        }
1957 cbradney 268
                        nextItem->itemText.clear();
269
                        nextItem->CPos = 0;
270
                        nextItem = nextItem->NextBox;
213 Franz 271
                }
272
        }
2447 fschmid 273
        for (ScText *itx = currItem->itemText.first(); itx != 0; itx = currItem->itemText.next())
274
        {
275
                if ((itx->ch == QChar(25)) && (itx->cembedded != 0))
2499 fschmid 276
                {
3207 craig 277
                        ScApp->doc->FrameItems.remove(itx->cembedded);
2499 fschmid 278
                        delete itx->cembedded;
279
                }
2447 fschmid 280
        }
1957 cbradney 281
        currItem->itemText.clear();
282
        currItem->CPos = 0;
3207 craig 283
        for (uint a = 0; a < ScApp->doc->FrameItems.count(); ++a)
2447 fschmid 284
        {
3207 craig 285
                ScApp->doc->FrameItems.at(a)->ItemNr = a;
2447 fschmid 286
        }
720 subik 287
        for (uint a = 0; a < Daten.length(); ++a)
288
        {
1065 cbradney 289
                struct ScText *hg = new ScText;
720 subik 290
                hg->ch = Daten.at(a);
291
                if (hg->ch == QChar(10))
292
                        hg->ch = QChar(13);
3207 craig 293
                hg->cfont = (*ScApp->doc->AllFonts)[currItem->IFont];
1957 cbradney 294
                hg->csize = currItem->ISize;
295
                hg->ccolor = currItem->TxtFill;
296
                hg->cshade = currItem->ShTxtFill;
297
                hg->cstroke = currItem->TxtStroke;
298
                hg->cshade2 = currItem->ShTxtStroke;
299
                hg->cscale = currItem->TxtScale;
2233 fschmid 300
                hg->cscalev = currItem->TxtScaleV;
2234 fschmid 301
                hg->cbase = currItem->TxtBase;
2247 fschmid 302
                hg->cshadowx = currItem->TxtShadowX;
303
                hg->cshadowy = currItem->TxtShadowY;
2257 fschmid 304
                hg->coutline = currItem->TxtOutline;
2262 fschmid 305
                hg->cunderpos = currItem->TxtUnderPos;
306
                hg->cunderwidth = currItem->TxtUnderWidth;
2272 fschmid 307
                hg->cstrikepos = currItem->TxtStrikePos;
308
                hg->cstrikewidth = currItem->TxtStrikeWidth;
720 subik 309
                hg->cextra = 0;
310
                hg->cselect = false;
311
                hg->cstyle = 0;
3207 craig 312
                hg->cab = ScApp->doc->currentParaStyle;
720 subik 313
                hg->xp = 0;
314
                hg->yp = 0;
315
                hg->PRot = 0;
316
                hg->PtransX = 0;
317
                hg->PtransY = 0;
2434 fschmid 318
                hg->cembedded = 0;
1957 cbradney 319
                currItem->itemText.append(hg);
720 subik 320
        }
2703 fschmid 321
        currItem->Dirty = false;
647 fschmid 322
        Py_INCREF(Py_None);
82 Franz 323
        return Py_None;
324
}
325
 
2790 craig 326
PyObject *scribus_inserttext(PyObject* /* self */, PyObject* args)
82 Franz 327
{
934 subik 328
        char *Name = const_cast<char*>("");
82 Franz 329
        char *Text;
87 Franz 330
        int pos;
900 cbradney 331
        if (!PyArg_ParseTuple(args, "esi|es", "utf-8", &Text, &pos, "utf-8", &Name))
82 Franz 332
                return NULL;
649 fschmid 333
        if(!checkHaveDocument())
334
                return NULL;
900 cbradney 335
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 336
        if (it == NULL)
337
                return NULL;
3625 avox 338
        if (!(it->asTextFrame()) && !(it->asPathText()))
853 subik 339
        {
340
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot insert text into non-text frame.","python error"));
341
                return NULL;
342
        }
391 Franz 343
        QString Daten = QString::fromUtf8(Text);
344
        PyMem_Free(Text);
1977 craig 345
        if ((pos < -1) || (pos > static_cast<int>(it->itemText.count())))
213 Franz 346
        {
1525 cbradney 347
                PyErr_SetString(PyExc_IndexError, QObject::tr("Insert index out of bounds.","python error"));
720 subik 348
                return NULL;
213 Franz 349
        }
1977 craig 350
        if (pos == -1)
351
                pos = it->itemText.count();
720 subik 352
        for (uint a = 0; a < Daten.length(); ++a)
353
        {
1065 cbradney 354
                struct ScText *hg = new ScText;
720 subik 355
                hg->ch = Daten.at(Daten.length()-1-a);
356
                if (hg->ch == QChar(10))
357
                        hg->ch = QChar(13);
3207 craig 358
                hg->cfont = (*ScApp->doc->AllFonts)[it->IFont];
720 subik 359
                hg->csize = it->ISize;
360
                hg->ccolor = it->TxtFill;
361
                hg->cshade = it->ShTxtFill;
362
                hg->cstroke = it->TxtStroke;
363
                hg->cshade2 = it->ShTxtStroke;
364
                hg->cscale = it->TxtScale;
2233 fschmid 365
                hg->cscalev = it->TxtScaleV;
2234 fschmid 366
                hg->cbase = it->TxtBase;
2247 fschmid 367
                hg->cshadowx = it->TxtShadowX;
368
                hg->cshadowy = it->TxtShadowY;
2257 fschmid 369
                hg->coutline = it->TxtOutline;
2262 fschmid 370
                hg->cunderpos = it->TxtUnderPos;
371
                hg->cunderwidth = it->TxtUnderWidth;
2272 fschmid 372
                hg->cstrikepos = it->TxtStrikePos;
373
                hg->cstrikewidth = it->TxtStrikeWidth;
720 subik 374
                hg->cextra = 0;
375
                hg->cselect = false;
376
                hg->cstyle = 0;
3207 craig 377
                hg->cab = ScApp->doc->currentParaStyle;
720 subik 378
                hg->xp = 0;
379
                hg->yp = 0;
380
                hg->PRot = 0;
381
                hg->PtransX = 0;
382
                hg->PtransY = 0;
2434 fschmid 383
                hg->cembedded = 0;
1065 cbradney 384
                it->itemText.insert(pos, hg);
720 subik 385
        }
386
        it->CPos = pos + Daten.length();
387
        it->paintObj();
2703 fschmid 388
        it->Dirty = false;
647 fschmid 389
        Py_INCREF(Py_None);
82 Franz 390
        return Py_None;
391
}
392
 
2790 craig 393
PyObject *scribus_setalign(PyObject* /* self */, PyObject* args)
82 Franz 394
{
934 subik 395
        char *Name = const_cast<char*>("");
720 subik 396
        int alignment;
900 cbradney 397
        if (!PyArg_ParseTuple(args, "i|es", &alignment, "utf-8", &Name))
82 Franz 398
                return NULL;
649 fschmid 399
        if(!checkHaveDocument())
400
                return NULL;
816 subik 401
        if ((alignment > 4) || (alignment < 0))
647 fschmid 402
        {
853 subik 403
                PyErr_SetString(PyExc_ValueError, QObject::tr("Alignment out of range. Use one of the scribus.ALIGN* constants.","python error"));
720 subik 404
                return NULL;
647 fschmid 405
        }
900 cbradney 406
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
720 subik 407
        if (i == NULL)
408
                return NULL;
3625 avox 409
        if (!i->asTextFrame())
213 Franz 410
        {
1525 cbradney 411
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text alignment on a non-text frame.","python error"));
720 subik 412
                return NULL;
213 Franz 413
        }
3207 craig 414
        int Apm = ScApp->doc->appMode;
415
        ScApp->view->SelItem.clear();
416
        ScApp->view->SelItem.append(i);
720 subik 417
        if (i->HasSel)
3207 craig 418
                ScApp->doc->appMode = modeEdit;
419
        ScApp->setNewAbStyle(alignment);
420
        ScApp->doc->appMode = Apm;
421
        ScApp->view->Deselect();
647 fschmid 422
        Py_INCREF(Py_None);
82 Franz 423
        return Py_None;
424
}
425
 
2790 craig 426
PyObject *scribus_setfontsize(PyObject* /* self */, PyObject* args)
82 Franz 427
{
934 subik 428
        char *Name = const_cast<char*>("");
111 Franz 429
        double size;
900 cbradney 430
        if (!PyArg_ParseTuple(args, "d|es", &size, "utf-8", &Name))
82 Franz 431
                return NULL;
649 fschmid 432
        if(!checkHaveDocument())
433
                return NULL;
82 Franz 434
        if ((size > 512) || (size < 1))
647 fschmid 435
        {
1525 cbradney 436
                PyErr_SetString(PyExc_ValueError, QObject::tr("Font size out of bounds - must be 1 <= size <= 512.","python error"));
720 subik 437
                return NULL;
647 fschmid 438
        }
900 cbradney 439
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
720 subik 440
        if (i == NULL)
441
                return NULL;
1217 subik 442
 
3625 avox 443
        if (!i->asTextFrame())
213 Franz 444
        {
1525 cbradney 445
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set font size on a non-text frame.","python error"));
720 subik 446
                return NULL;
213 Franz 447
        }
3207 craig 448
        int Apm = ScApp->doc->appMode;
449
        ScApp->view->SelItem.clear();
450
        ScApp->view->SelItem.append(i);
720 subik 451
        if (i->HasSel)
3207 craig 452
                ScApp->doc->appMode = modeEdit;
453
        ScApp->view->chFSize(qRound(size * 10.0));
454
        ScApp->doc->appMode = Apm;
455
        ScApp->view->Deselect();
647 fschmid 456
        Py_INCREF(Py_None);
82 Franz 457
        return Py_None;
458
}
459
 
2790 craig 460
PyObject *scribus_setfont(PyObject* /* self */, PyObject* args)
82 Franz 461
{
934 subik 462
        char *Name = const_cast<char*>("");
463
        char *Font = const_cast<char*>("");
900 cbradney 464
        if (!PyArg_ParseTuple(args, "es|es", "utf-8", &Font, "utf-8", &Name))
82 Franz 465
                return NULL;
649 fschmid 466
        if(!checkHaveDocument())
467
                return NULL;
900 cbradney 468
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
720 subik 469
        if (i == NULL)
470
                return NULL;
3625 avox 471
        if (!(i->asTextFrame()) && !(i->asPathText()))
213 Franz 472
        {
1525 cbradney 473
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set font on a non-text frame.","python error"));
720 subik 474
                return NULL;
475
        }
2834 cbradney 476
        if (PrefsManager::instance()->appPrefs.AvailFonts.find(QString::fromUtf8(Font)))
720 subik 477
        {
3207 craig 478
                int Apm = ScApp->doc->appMode;
479
                ScApp->view->SelItem.clear();
480
                ScApp->view->SelItem.append(i);
332 Franz 481
                if (i->HasSel)
3207 craig 482
                        ScApp->doc->appMode = modeEdit;
483
                ScApp->SetNewFont(QString::fromUtf8(Font));
484
                ScApp->doc->appMode = Apm;
485
                ScApp->view->Deselect();
213 Franz 486
        }
720 subik 487
        else
488
        {
1525 cbradney 489
                PyErr_SetString(PyExc_ValueError, QObject::tr("Font not found.","python error"));
720 subik 490
                return NULL;
491
        }
647 fschmid 492
        Py_INCREF(Py_None);
82 Franz 493
        return Py_None;
494
}
495
 
2790 craig 496
PyObject *scribus_setlinespace(PyObject* /* self */, PyObject* args)
82 Franz 497
{
934 subik 498
        char *Name = const_cast<char*>("");
82 Franz 499
        double w;
900 cbradney 500
        if (!PyArg_ParseTuple(args, "d|es", &w, "utf-8", &Name))
82 Franz 501
                return NULL;
649 fschmid 502
        if(!checkHaveDocument())
503
                return NULL;
647 fschmid 504
        if (w < 0.1)
505
        {
1525 cbradney 506
                PyErr_SetString(PyExc_ValueError, QObject::tr("Line space out of bounds, must be >= 0.1.","python error"));
720 subik 507
                return NULL;
647 fschmid 508
        }
900 cbradney 509
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
720 subik 510
        if (i == NULL)
511
                return NULL;
3625 avox 512
        if (!i->asTextFrame())
853 subik 513
        {
1525 cbradney 514
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set line spacing on a non-text frame.","python error"));
853 subik 515
                return NULL;
516
        }
720 subik 517
        i->LineSp = w;
647 fschmid 518
        Py_INCREF(Py_None);
82 Franz 519
        return Py_None;
520
}
521
 
2790 craig 522
PyObject *scribus_setcolumngap(PyObject* /* self */, PyObject* args)
138 Franz 523
{
934 subik 524
        char *Name = const_cast<char*>("");
138 Franz 525
        double w;
900 cbradney 526
        if (!PyArg_ParseTuple(args, "d|es", &w, "utf-8", &Name))
138 Franz 527
                return NULL;
649 fschmid 528
        if(!checkHaveDocument())
529
                return NULL;
647 fschmid 530
        if (w < 0.0)
531
        {
1525 cbradney 532
                PyErr_SetString(PyExc_ValueError, QObject::tr("Column gap out of bounds, must be positive.","python error"));
720 subik 533
                return NULL;
647 fschmid 534
        }
900 cbradney 535
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
720 subik 536
        if (i == NULL)
537
                return NULL;
3625 avox 538
        if (!i->asTextFrame())
853 subik 539
        {
1525 cbradney 540
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set column gap on a non-text frame.","python error"));
853 subik 541
                return NULL;
542
        }
1512 craig 543
        i->ColGap = ValueToPoint(w);
647 fschmid 544
        Py_INCREF(Py_None);
138 Franz 545
        return Py_None;
546
}
547
 
2790 craig 548
PyObject *scribus_setcolumns(PyObject* /* self */, PyObject* args)
138 Franz 549
{
934 subik 550
        char *Name = const_cast<char*>("");
138 Franz 551
        int w;
900 cbradney 552
        if (!PyArg_ParseTuple(args, "i|es", &w, "utf-8", &Name))
138 Franz 553
                return NULL;
649 fschmid 554
        if(!checkHaveDocument())
555
                return NULL;
647 fschmid 556
        if (w < 1)
557
        {
1525 cbradney 558
                PyErr_SetString(PyExc_ValueError, QObject::tr("Column count out of bounds, must be > 1.","python error"));
720 subik 559
                return NULL;
647 fschmid 560
        }
900 cbradney 561
        PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
720 subik 562
        if (i == NULL)
563
                return NULL;
3625 avox 564
        if (!i->asTextFrame())
853 subik 565
        {
1525 cbradney 566
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set number of columns on a non-text frame.","python error"));
853 subik 567
                return NULL;
568
        }
720 subik 569
        i->Cols = w;
647 fschmid 570
        Py_INCREF(Py_None);
138 Franz 571
        return Py_None;
572
}
573
 
2790 craig 574
PyObject *scribus_selecttext(PyObject* /* self */, PyObject* args)
82 Franz 575
{
934 subik 576
        char *Name = const_cast<char*>("");
1217 subik 577
        int start, selcount;
578
        if (!PyArg_ParseTuple(args, "ii|es", &start, &selcount, "utf-8", &Name))
82 Franz 579
                return NULL;
649 fschmid 580
        if(!checkHaveDocument())
581
                return NULL;
900 cbradney 582
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 583
        if (it == NULL)
584
                return NULL;
1217 subik 585
        if (selcount == -1)
213 Franz 586
        {
1217 subik 587
                // user wants to select all after the start point -- CR
588
                selcount = it->itemText.count() - start;
589
                if (selcount < 0)
590
                        // user passed start that's > text in the frame
591
                        selcount = 0;
592
        }
593
        // cr 2005-01-18 fixed off-by-one with end bound that made selecting the last char impossible
594
        if ((start < 0) || ((start + selcount) > static_cast<int>(it->itemText.count())))
595
        {
596
                PyErr_SetString(PyExc_IndexError, QObject::tr("Selection index out of bounds", "python error"));
720 subik 597
                return NULL;
213 Franz 598
        }
3625 avox 599
        if (!(it->asTextFrame()) && !(it->asPathText()))
853 subik 600
        {
1525 cbradney 601
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot select text in a non-text frame", "python error"));
853 subik 602
                return NULL;
603
        }
720 subik 604
        /* FIXME: not sure if we should make this check or not
605
        if (start > ende)
606
        {
607
                PyErr_SetString(PyExc_ValueError, QString("Selection start > selection end"));
608
                return NULL;
609
        }
610
        */
1065 cbradney 611
        for (uint a = 0; a < it->itemText.count(); ++a)
612
                it->itemText.at(a)->cselect = false;
1217 subik 613
        if (selcount == 0)
720 subik 614
        {
615
                it->HasSel = false;
616
                Py_INCREF(Py_None);
617
                return Py_None;
618
        }
1217 subik 619
        for (int aa = start; aa < (start + selcount); ++aa)
1065 cbradney 620
                it->itemText.at(aa)->cselect = true;
720 subik 621
        it->HasSel = true;
647 fschmid 622
        Py_INCREF(Py_None);
623
        return Py_None;
82 Franz 624
}
625
 
2790 craig 626
PyObject *scribus_deletetext(PyObject* /* self */, PyObject* args)
82 Franz 627
{
934 subik 628
        char *Name = const_cast<char*>("");
900 cbradney 629
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
82 Franz 630
                return NULL;
649 fschmid 631
        if(!checkHaveDocument())
632
                return NULL;
900 cbradney 633
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 634
        if (it == NULL)
635
                return NULL;
3625 avox 636
        if (!(it->asTextFrame()) && !(it->asPathText()))
853 subik 637
        {
1525 cbradney 638
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot delete text from a non-text frame.","python error"));
853 subik 639
                return NULL;
640
        }
720 subik 641
        if (it->HasSel)
3829 cbradney 642
                dynamic_cast<PageItem_TextFrame*>(it)->deleteSelectedTextFromFrame();
720 subik 643
        else
213 Franz 644
        {
2447 fschmid 645
                for (ScText *itx = it->itemText.first(); itx != 0; itx = it->itemText.next())
646
                {
647
                        if ((itx->ch == QChar(25)) && (itx->cembedded != 0))
2499 fschmid 648
                        {
3207 craig 649
                                ScApp->doc->FrameItems.remove(itx->cembedded);
2499 fschmid 650
                                delete itx->cembedded;
651
                        }
2447 fschmid 652
                }
1065 cbradney 653
                it->itemText.clear();
720 subik 654
                it->CPos = 0;
3207 craig 655
                for (uint a = 0; a < ScApp->doc->FrameItems.count(); ++a)
2447 fschmid 656
                {
3207 craig 657
                        ScApp->doc->FrameItems.at(a)->ItemNr = a;
2447 fschmid 658
                }
213 Franz 659
        }
647 fschmid 660
        Py_INCREF(Py_None);
82 Franz 661
        return Py_None;
662
}
663
 
2790 craig 664
PyObject *scribus_settextfill(PyObject* /* self */, PyObject* args)
82 Franz 665
{
934 subik 666
        char *Name = const_cast<char*>("");
82 Franz 667
        char *Color;
900 cbradney 668
        if (!PyArg_ParseTuple(args, "es|es", "utf-8", &Color, "utf-8", &Name))
82 Franz 669
                return NULL;
649 fschmid 670
        if(!checkHaveDocument())
671
                return NULL;
900 cbradney 672
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 673
        if (it == NULL)
674
                return NULL;
3625 avox 675
        if (!(it->asTextFrame()) && !(it->asPathText()))
213 Franz 676
        {
1525 cbradney 677
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text fill on a non-text frame.","python error"));
853 subik 678
                return NULL;
679
        }
680
        else
681
        {
1065 cbradney 682
                for (uint b = 0; b < it->itemText.count(); b++)
213 Franz 683
                {
332 Franz 684
                        if (it->HasSel)
82 Franz 685
                        {
1065 cbradney 686
                                if (it->itemText.at(b)->cselect)
687
                                        it->itemText.at(b)->ccolor = QString::fromUtf8(Color);
213 Franz 688
                        }
332 Franz 689
                        else
1065 cbradney 690
                                it->itemText.at(b)->ccolor = QString::fromUtf8(Color);
82 Franz 691
                }
900 cbradney 692
                it->TxtFill = QString::fromUtf8(Color);
720 subik 693
        }
647 fschmid 694
        Py_INCREF(Py_None);
82 Franz 695
        return Py_None;
696
}
697
 
2790 craig 698
PyObject *scribus_settextstroke(PyObject* /* self */, PyObject* args)
82 Franz 699
{
934 subik 700
        char *Name = const_cast<char*>("");
82 Franz 701
        char *Color;
900 cbradney 702
        if (!PyArg_ParseTuple(args, "es|es", "utf-8", &Color, "utf-8", &Name))
82 Franz 703
                return NULL;
649 fschmid 704
        if(!checkHaveDocument())
705
                return NULL;
900 cbradney 706
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 707
        if (it == NULL)
708
                return NULL;
3625 avox 709
        if (!(it->asTextFrame()) && (it->asPathText()))
213 Franz 710
        {
1525 cbradney 711
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text stroke on a non-text frame.","python error"));
853 subik 712
                return NULL;
713
        }
714
        else
715
        {
1065 cbradney 716
                for (uint b = 0; b < it->itemText.count(); b++)
213 Franz 717
                {
332 Franz 718
                        if (it->HasSel)
82 Franz 719
                        {
1065 cbradney 720
                                if (it->itemText.at(b)->cselect)
721
                                        it->itemText.at(b)->cstroke = QString::fromUtf8(Color);
213 Franz 722
                        }
332 Franz 723
                        else
1065 cbradney 724
                                it->itemText.at(b)->cstroke = QString::fromUtf8(Color);
82 Franz 725
                }
900 cbradney 726
                it->TxtStroke = QString::fromUtf8(Color);
720 subik 727
        }
647 fschmid 728
        Py_INCREF(Py_None);
82 Franz 729
        return Py_None;
730
}
731
 
2790 craig 732
PyObject *scribus_settextshade(PyObject* /* self */, PyObject* args)
82 Franz 733
{
934 subik 734
        char *Name = const_cast<char*>("");
87 Franz 735
        int w;
900 cbradney 736
        if (!PyArg_ParseTuple(args, "i|es", &w, "utf-8", &Name))
82 Franz 737
                return NULL;
649 fschmid 738
        if(!checkHaveDocument())
739
                return NULL;
647 fschmid 740
        if ((w < 0) || (w > 100))
741
        {
742
                Py_INCREF(Py_None);
82 Franz 743
                return Py_None;
647 fschmid 744
        }
900 cbradney 745
        PageItem *it = GetUniqueItem(QString::fromUtf8(Name));
720 subik 746
        if (it == NULL)
747
                return NULL;
3625 avox 748
        if (!(it->asTextFrame()) && !(it->asPathText()))
213 Franz 749
        {
1525 cbradney 750
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text shade on a non-text frame.","python error"));
853 subik 751
                return NULL;
752
        }
753
        else
754
        {
1065 cbradney 755
                for (uint b = 0; b < it->itemText.count(); ++b)
213 Franz 756
                {
332 Franz 757
                        if (it->HasSel)
82 Franz 758
                        {
1065 cbradney 759
                                if (it->itemText.at(b)->cselect)
760
                                        it->itemText.at(b)->cshade = w;
82 Franz 761
                        }
332 Franz 762
                        else
1065 cbradney 763
                                it->itemText.at(b)->cshade = w;
213 Franz 764
                }
332 Franz 765
        it->ShTxtFill = w;
213 Franz 766
        }
647 fschmid 767
        Py_INCREF(Py_None);
82 Franz 768
        return Py_None;
769
}
770
 
2790 craig 771
PyObject *scribus_linktextframes(PyObject* /* self */, PyObject* args)
213 Franz 772
{
773
        char *name1;
774
        char *name2;
775
 
900 cbradney 776
        if (!PyArg_ParseTuple(args, "eses", "utf-8", &name1, "utf-8", &name2))
213 Franz 777
                return NULL;
649 fschmid 778
        if(!checkHaveDocument())
779
                return NULL;
900 cbradney 780
        PageItem *fromitem = GetUniqueItem(QString::fromUtf8(name1));
720 subik 781
        if (fromitem == NULL)
782
                return NULL;
900 cbradney 783
        PageItem *toitem = GetUniqueItem(QString::fromUtf8(name2));
720 subik 784
        if (toitem == NULL)
785
                return NULL;
3625 avox 786
        if (!(fromitem->asTextFrame()) || !(toitem->asTextFrame()))
853 subik 787
        {
1525 cbradney 788
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Can only link text frames.","python error"));
853 subik 789
                return NULL;
790
        }
1065 cbradney 791
        if (toitem->itemText.count())
647 fschmid 792
        {
1525 cbradney 793
                PyErr_SetString(ScribusException, QObject::tr("Target frame must be empty.","python error"));
720 subik 794
                return NULL;
647 fschmid 795
        }
720 subik 796
        if (toitem->NextBox != 0)
647 fschmid 797
        {
1525 cbradney 798
                PyErr_SetString(ScribusException, QObject::tr("Target frame links to another frame.","python error"));
720 subik 799
                return NULL;
647 fschmid 800
        }
720 subik 801
        if (toitem->BackBox != 0)
213 Franz 802
        {
1525 cbradney 803
                PyErr_SetString(ScribusException, QObject::tr("Target frame is linked to by another frame.","python error"));
720 subik 804
                return NULL;
805
        }
806
        if (toitem == fromitem)
807
        {
1525 cbradney 808
                PyErr_SetString(ScribusException, QObject::tr("Source and target are the same object.","python error"));
720 subik 809
                return NULL;
810
        }
811
        // references to the others boxes
812
        fromitem->NextBox = toitem;
813
        toitem->BackBox = fromitem;
3207 craig 814
        ScApp->view->DrawNew();
720 subik 815
        // enable 'save icon' stuff
3207 craig 816
        ScApp->slotDocCh();
647 fschmid 817
        Py_INCREF(Py_None);
213 Franz 818
        return Py_None;
819
}
820
 
2790 craig 821
PyObject *scribus_unlinktextframes(PyObject* /* self */, PyObject* args)
213 Franz 822
{
823
        char *name;
900 cbradney 824
        if (!PyArg_ParseTuple(args, "es", "utf-8", &name))
213 Franz 825
                return NULL;
649 fschmid 826
        if(!checkHaveDocument())
827
                return NULL;
900 cbradney 828
        PageItem *item = GetUniqueItem(QString::fromUtf8(name));
720 subik 829
        if (item == NULL)
830
                return NULL;
3625 avox 831
        if (!item->asTextFrame())
853 subik 832
        {
1525 cbradney 833
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot unlink a non-text frame.","python error"));
853 subik 834
                return NULL;
835
        }
720 subik 836
        // only linked
837
        if (item->BackBox == 0)
647 fschmid 838
        {
853 subik 839
                PyErr_SetString(ScribusException, QObject::tr("Object is not a linked text frame, can't unlink.","python error"));
720 subik 840
                return NULL;
647 fschmid 841
        }
720 subik 842
        if (item->NextBox == 0)
213 Franz 843
        {
853 subik 844
                PyErr_SetString(ScribusException, QObject::tr("Object the last frame in a series, can't unlink. Unlink the previous frame instead.","python error"));
720 subik 845
                return NULL;
846
        }
847
        PageItem* nextbox = item->NextBox;
848
        while (nextbox != 0)
849
        {
1065 cbradney 850
                uint a = nextbox->itemText.count();
720 subik 851
                for (uint s=0; s<a; ++s)
1065 cbradney 852
                        item->itemText.append(nextbox->itemText.take(0));
720 subik 853
                nextbox = nextbox->NextBox;
854
        } // while
1065 cbradney 855
        uint a2 = item->itemText.count();
720 subik 856
        for (uint s = 0; s < a2; ++s)
1065 cbradney 857
                item->BackBox->itemText.append(item->itemText.take(0));
720 subik 858
        item->BackBox->NextBox = 0;
859
        item->BackBox = 0;
213 Franz 860
        // enable 'save icon' stuff
3207 craig 861
        ScApp->slotDocCh();
862
        ScApp->view->DrawNew();
647 fschmid 863
        Py_INCREF(Py_None);
213 Franz 864
        return Py_None;
865
}
866
 
411 Franz 867
/*
720 subik 868
 * Convert the selected text frame to outlines.
411 Franz 869
 *
870
 * 2004-09-07 (Craig Ringer)
720 subik 871
 * 2004-09-14 pv frame type, optional frame name param
411 Franz 872
 */
2790 craig 873
PyObject *scribus_tracetext(PyObject* /* self */, PyObject* args)
411 Franz 874
{
934 subik 875
        char *name = const_cast<char*>("");
900 cbradney 876
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &name))
411 Franz 877
                return NULL;
649 fschmid 878
        if(!checkHaveDocument())
879
                return NULL;
900 cbradney 880
        PageItem *item = GetUniqueItem(QString::fromUtf8(name));
720 subik 881
        if (item == NULL)
882
                return NULL;
3625 avox 883
        if (!item->asTextFrame())
411 Franz 884
        {
1525 cbradney 885
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot convert a non-text frame to outlines.","python error"));
720 subik 886
                return NULL;
411 Franz 887
        }
3207 craig 888
        ScApp->view->Deselect(true);
889
        ScApp->view->SelectItemNr(item->ItemNr);
890
        ScApp->view->TextToPath();
647 fschmid 891
        Py_INCREF(Py_None);
411 Franz 892
        return Py_None;
893
}
1419 subik 894
 
1607 subik 895
PyObject *scribus_istextoverflowing(PyObject * self, PyObject* args, PyObject* kw)
1419 subik 896
{
897
        char *name = const_cast<char*>("");
1607 subik 898
        bool nolinks = false;
899
        char *kwargs[] = {const_cast<char*>("name"), const_cast<char*>("nolinks"), NULL};
900
        if (!PyArg_ParseTupleAndKeywords(args, kw, "|esi", kwargs, "utf-8", &name, &nolinks))
1419 subik 901
                return NULL;
902
        if(!checkHaveDocument())
903
                return NULL;
904
        PageItem *item = GetUniqueItem(QString::fromUtf8(name));
905
        if (item == NULL)
906
                return NULL;
3625 avox 907
        if (!item->asTextFrame())
1419 subik 908
        {
909
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Only text frames can be checked for overflowing", "python error"));
910
                return NULL;
911
        }
1607 subik 912
        /* original solution
913
        if (item->itemText.count() > item->MaxChars)
914
        return PyBool_FromLong(static_cast<long>(true));
915
        return PyBool_FromLong(static_cast<long>(false)); */
916
        uint firstFrame = 0;
917
        if (nolinks)
918
                firstFrame = item->itemText.count();
919
        uint chars = item->itemText.count();
920
        uint maxchars = item->MaxChars;
921
        while (item->NextBox != 0) {
922
                item = item->NextBox;
923
                chars += item->itemText.count();
924
                maxchars += item->MaxChars;
925
        }
926
        // no overrun
927
        if (nolinks)
928
                return PyInt_FromLong(maxchars - firstFrame);
929
 
930
        if (maxchars > chars)
931
                return PyInt_FromLong(0);
932
        // number of overrunning letters
933
        return PyInt_FromLong(static_cast<long>(chars - maxchars));
1419 subik 934
}
1534 subik 935
 
2790 craig 936
PyObject *scribus_setpdfbookmark(PyObject* /* self */, PyObject* args)
1534 subik 937
{
938
        char *name = const_cast<char*>("");
939
        bool toggle;
940
        if (!PyArg_ParseTuple(args, "b|es", &toggle, "utf-8", &name))
941
                return NULL;
942
        if (!checkHaveDocument())
943
                return NULL;
944
        PageItem *i = GetUniqueItem(QString::fromUtf8(name));
945
        if (i == NULL)
946
                return NULL;
3625 avox 947
        if (!i->asTextFrame())
1534 subik 948
        {
949
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Can't set bookmark on a non-text frame", "python error"));
950
                return NULL;
951
        }
952
        if (i->isBookmark == toggle)
953
        {
954
                Py_INCREF(Py_None);
955
                return Py_None;
956
        }
957
        if (toggle)
958
        {
959
                i->isAnnotation = false;
3207 craig 960
                ScApp->AddBookMark(i);
1534 subik 961
        }
962
        else
3207 craig 963
                ScApp->DelBookMark(i);
1534 subik 964
        i->isBookmark = toggle;
965
        Py_INCREF(Py_None);
966
        return Py_None;
967
}
968
 
2790 craig 969
PyObject *scribus_ispdfbookmark(PyObject* /* self */, PyObject* args)
1534 subik 970
{
971
        char *name = const_cast<char*>("");
972
        if (!PyArg_ParseTuple(args, "|es", "utf-8", &name))
973
                return NULL;
974
        if (!checkHaveDocument())
975
                return NULL;
976
        PageItem *i = GetUniqueItem(QString::fromUtf8(name));
977
        if (i == NULL)
978
                return NULL;
3625 avox 979
        if (i->asTextFrame())
1534 subik 980
        {
981
                PyErr_SetString(WrongFrameTypeError, QObject::tr("Can't get info from a non-text frame", "python error"));
982
                return NULL;
983
        }
984
        if (i->isBookmark)
985
                return PyBool_FromLong(1);
986
        return PyBool_FromLong(0);
987
}