Subversion Repositories Scribus

Rev

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