Subversion Repositories Scribus

Rev

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

Rev Author Line No. Line
3 paul 1
/***************************************************************************
2
                          pageitem.cpp  -  description
3
                             -------------------
4
    begin                : Sat Apr 7 2001
5
    copyright            : (C) 2001 by Franz Schmid
6
    email                : Franz.Schmid@altmuehlnet.de
7
 ***************************************************************************/
8
 
9
/***************************************************************************
10
 *                                                                         *
11
 *   This program is free software; you can redistribute it and/or modify  *
12
 *   it under the terms of the GNU General Public License as published by  *
13
 *   the Free Software Foundation; either version 2 of the License, or     *
14
 *   (at your option) any later version.                                   *
15
 *                                                                         *
16
 ***************************************************************************/
136 Franz 17
 
3 paul 18
#include "pageitem.h"
270 Franz 19
#include "pageitem.moc"
3 paul 20
#include <qpainter.h>
21
#include <qpen.h>
68 Franz 22
#include <qfont.h>
3 paul 23
#include <qregion.h>
24
#include <qpoint.h>
25
#include <qfileinfo.h>
26
#include <qdrawutil.h>
27
#include <qbitmap.h>
28
#include <cmath>
29
#include "page.h"
243 Franz 30
#include "scribus.h"
128 Franz 31
 
32
#if (_MSC_VER >= 1200)
33
 #include "win-config.h"
34
#else
35
 #include "config.h"
36
#endif
37
 
68 Franz 38
#include <ft2build.h>
39
#include FT_GLYPH_H
80 Franz 40
extern double Cwidth(ScribusDoc *doc, QString name, QString ch, int Siz, QString ch2 = " ");
220 Franz 41
extern double RealCWidth(ScribusDoc *doc, QString name, QString ch, int Siz);
3 paul 42
extern QPointArray FlattenPath(FPointArray ina, QValueList<uint> &Segs);
80 Franz 43
extern double xy2Deg(double x, double y);
3 paul 44
extern void BezierPoints(QPointArray *ar, QPoint n1, QPoint n2, QPoint n3, QPoint n4);
243 Franz 45
extern ScribusApp* ScApp;
3 paul 46
 
80 Franz 47
PageItem::PageItem(Page *pa, int art, double x, double y, double w, double h, double w2, QString fill, QString outline, ScribusDoc *doc) : QObject(pa)
3 paul 48
{
49
        QString tmp;
50
        BackBox = 0;
51
        NextBox = 0;
52
        Locked = false;
205 Franz 53
        LockRes = false;
3 paul 54
        Xpos = x;
55
        Ypos = y;
56
        Width = w;
57
        Height = h;
58
        OldB = Width;
59
        OldH = Height;
60
        OldB2 = Width;
61
        OldH2 = Height;
62
        PType = art;
63
        Rot = 0;
64
        Parent = pa;
65
        Doc = doc;
66
        Pcolor = fill;
167 Franz 67
        Pcolor2 = PType == 4 ? fill : outline;
68 Franz 68
        TxtFill = Doc->DpenText;
69
        TxtStroke = TxtFill;
70
        ShTxtStroke = 100;
71
        ShTxtFill = 100;
72
        TxtScale = 100;
73
        TxTStyle = 0;
3 paul 74
        Shade = 100;
75
        Shade2 = 100;
76
        GrType = 0;
292 Franz 77
        GrStartX = 0;
78
        GrStartY = 0;
294 Franz 79
        GrEndX = w;
292 Franz 80
        GrEndY = 0;
3 paul 81
        Pwidth = w2;
263 Franz 82
        OldPwidth = w2;
3 paul 83
        PLineArt = Doc->DLineArt;
84
        PLineEnd = FlatCap;
85
        PLineJoin = MiterJoin;
86
        Select = false;
87
        FrameOnly = false;
88
        ClipEdited = false;
89
        FrameType = 0;
90
        IFont = Doc->Dfont;
91
        ISize = Doc->Dsize;
111 Franz 92
        LineSp = ((Doc->Dsize / 10.0) * static_cast<double>(Doc->AutoLine) / 100) + (Doc->Dsize / 10.0);
3 paul 93
        Doc->Vorlagen[0].LineSpa = LineSp;
94
        CurX = 0;
95
        CurY = 0;
96
        CPos = 0;
97
        Extra = 1;
98
        TExtra = 1;
99
        BExtra = 1;
100
        RExtra = 1;
101
        ExtraV = 0;
102
        Ptext.clear();
103
        Ptext.setAutoDelete(true);
104
        Pfile = "";
105
        pixm = QImage();
204 Franz 106
        pixmOrg = QImage();
3 paul 107
        Pfile2 = "";
108
        Pfile3 = "";
109
        LocalScX = 1;
110
        LocalScY = 1;
111
        LocalViewX = 1;
112
        LocalViewY = 1;
113
        OrigW = 0;
114
        OrigH = 0;
127 Franz 115
        dpiX = 72.0;
116
        dpiY = 72.0;
3 paul 117
        LocalX = 0;
118
        LocalY = 0;
119
        flippedH = 0;
120
        flippedV = 0;
121
        BBoxX = 0;
122
        BBoxH = 0;
123
        RadRect = 0;
124
        if ((art == 4) || (art == 2))
125
                Frame = true;
126
        else
127
                Frame = false;
128
        switch (art)
167 Franz 129
        {
3 paul 130
                case 6:
167 Franz 131
                        Clip.setPoints(4, static_cast<int>(w/2), 0,
132
                                                                static_cast<int>(w), static_cast<int>(h/2),
133
                                                                static_cast<int>(w/2), static_cast<int>(h),
134
                                                                0,static_cast<int>(h/2));
3 paul 135
                        break;
136
                default:
167 Franz 137
                        Clip.setPoints(4, 0,0, static_cast<int>(w),0, static_cast<int>(w),
138
                                                        static_cast<int>(h), 0,static_cast<int>(h));
3 paul 139
                        break;
167 Franz 140
        }
3 paul 141
        PoLine.resize(0);
142
        Segments.clear();
143
        PoShow = false;
144
        BaseOffs = 0;
145
        OwnPage = pa;
146
        PicArt = true;
147
        PicAvail = false;
148
        isPrintable = true;
149
        isBookmark = false;
167 Franz 150
        BMnr = 0;
3 paul 151
        isAnnotation = false;
152
        AnType = 0;
153
        AnActType = 0;
154
        AnBwid = 1;
155
        AnAction = "";
156
        An_E_act = "";
157
        An_X_act = "";
158
        An_D_act = "";
159
        An_Fo_act = "";
160
        An_Bl_act = "";
161
        An_K_act = "";
162
        An_F_act = "";
163
        An_V_act = "";
164
        An_C_act = "";
19 Franz 165
        An_Extern = "";
268 Franz 166
        switch (PType)
167
        {
168
        case 2:
169
                AnName = tr("Image");
170
                break;
171
        case 4:
172
                AnName = tr("Text");
173
                break;
174
        case 5:
175
                AnName = tr("Line");
176
                break;
177
        case 6:
178
                AnName = tr("Polygon");
179
                break;
180
        case 7:
181
                AnName = tr("Polyline");
182
                break;
183
        case 8:
184
                AnName = tr("PathText");
185
                break;
186
        default:
187
                AnName = "Item";
188
                break;
189
        }
270 Franz 190
        AnName += tmp.setNum(Doc->TotalItems); // +" "+QDateTime::currentDateTime().toString();
87 Franz 191
        AutoName = true;
3 paul 192
        Doc->TotalItems++;
193
        AnToolTip = "";
194
        AnRollOver = "";
195
        AnDown = "";
196
        AnBsty = 0;
197
        AnFeed = 1;
198
        AnFlag = 0;
199
        AnZiel = 0;
200
        AnVis = 0;
201
        AnChkStil = 0;
202
        AnFormat = 0;
203
        AnFont = 4;
204
        AnIsChk = false;
205
        AnAAact = false;
206
        AnHTML = false;
207
        AnUseIcons = false;
208
        AnIPlace = 1;
209
        AnScaleW = 0;
210
        AnMaxChar = -1;
211
        AnBColor = outline;
212
        HasSel = false;
213
        Textflow = true;
17 Franz 214
        Textflow2 = false;
3 paul 215
        Tinput = false;
216
        isAutoText = false;
217
        Ausrich = 0;
218
        Redrawn = false;
219
        isRaster = false;
220
        Sizing = false;
221
        toPixmap = false;
222
        UseEmbedded = true;
223
        EmProfile = "";
224
        Groups.clear();
225
        LayerNr = Doc->ActiveLayer;
226
        ScaleType = true;
227
        AspectRatio = true;
228
        Transparency = 0.0;
68 Franz 229
        TranspStroke = 0.0;
3 paul 230
        Reverse = false;
20 Franz 231
        InvPict = false;
27 Franz 232
        NamedLStyle = "";
68 Franz 233
        DashValues.clear();
139 Franz 234
        TabValues.clear();
68 Franz 235
        DashOffset = 0;
236
        fill_gradient = VGradient(VGradient::linear);
295 Franz 237
        fill_gradient.clearStops();
304 Franz 238
        if (Pcolor == "None")
239
                fill_gradient.addStop(Doc->PageColors[Doc->PageColors.begin().key()].getRGBColor(), 0.0, 0.5, 1.0, Doc->PageColors.begin().key(), 100);
240
        else
241
                fill_gradient.addStop(Doc->PageColors[Pcolor].getRGBColor(), 0.0, 0.5, 1.0, Pcolor, 100);
242
        if (Pcolor2 == "None")
243
                fill_gradient.addStop(Doc->PageColors[Doc->PageColors.begin().key()].getRGBColor(), 1.0, 0.5, 1.0, Doc->PageColors.begin().key(), 100);
244
        else
295 Franz 245
        fill_gradient.addStop(Doc->PageColors[Pcolor2].getRGBColor(), 1.0, 0.5, 1.0, Pcolor2, 100);
68 Franz 246
        Language = doc->Language;
139 Franz 247
        Cols = Doc->DCols;
248
        ColGap = Doc->DGap;
232 Franz 249
        LeftLink = 0;
250
        RightLink = 0;
251
        TopLink = 0;
252
        BottomLink = 0;
234 Franz 253
        LeftLinkID = 0;
254
        RightLinkID = 0;
255
        TopLinkID = 0;
256
        BottomLinkID = 0;
232 Franz 257
        LeftLine = 0;
258
        RightLine = false;
259
        TopLine = false;
260
        BottomLine = false;
261
        isTableItem = false;
262
        isSingleSel = false;
3 paul 263
}
264
 
265
/** Zeichnet das Item */
68 Franz 266
void PageItem::DrawObj(ScPainter *p, QRect e)
3 paul 267
{
68 Franz 268
        QColor tmp;
269
        FPointArray CL;
270
        QPointArray cl;
209 Franz 271
        QPainter pf, pp, pf2;
68 Franz 272
        PageItem *nb;
3 paul 273
        QPoint pt1, pt2;
134 Franz 274
        FPoint gv, ColBound;
3 paul 275
        QRegion cm;
251 Franz 276
        uint a, nrc, nrc2, zae, startLin;
310 Franz 277
        int desc, asce, absa, aSpa, chs, chsd, CurrCol;
251 Franz 278
        uint BuPos, LastSP, MaxText;
280 Franz 279
        double oldCurY, LastXp, EndX, OFs, OFs2, wide, rota, wid, lineCorr, ColWidth, kernVal, RTabX;
80 Franz 280
        double sc = Doc->Scale;
55 Franz 281
        QString chx, chx2, chx3;
3 paul 282
        struct Pti *hl;
283
        struct ZZ *Zli;
284
        struct ZZ *Zli2;
285
        QPtrList<ZZ> LiList;
68 Franz 286
        bool outs = false;
135 Franz 287
        bool fBorder = false;
140 Franz 288
        bool RTab = false;
289
        uint StartRT, StartRT2;
290
        int TabCode = 0;
249 Franz 291
        int HyphenCount = 0;
140 Franz 292
        QValueList<double> tTabValues;
153 Franz 293
        bool DropCmode = false;
154 Franz 294
        bool AbsHasDrop = false;
163 Franz 295
        double maxDY, firstDes, desc2, maxDX;
153 Franz 296
        int DropLines;
175 Franz 297
        bool StartOfCol = true;
140 Franz 298
        tTabValues.clear();
63 Franz 299
        if (!Doc->DoDrawing)
167 Franz 300
        {
63 Franz 301
                Redrawn = true;
302
                Tinput = false;
303
                FrameOnly = false;
304
                Dirty = false;
305
                return;
167 Franz 306
        }
3 paul 307
        LiList.setAutoDelete(true);
308
        for (int xxx=0; xxx<5; ++xxx)
167 Franz 309
        {
3 paul 310
                Doc->Vorlagen[xxx].LineSpa = LineSp;
175 Franz 311
                Doc->Vorlagen[xxx].FontSize = ISize;
3 paul 312
                Doc->Vorlagen[xxx].Indent = 0;
313
                Doc->Vorlagen[xxx].First = 0;
314
                Doc->Vorlagen[xxx].Avor = 0;
315
                Doc->Vorlagen[xxx].Anach = 0;
167 Franz 316
        }
3 paul 317
        Doc->Vorlagen[0].Ausri = Ausrich;
68 Franz 318
        pf.begin(Parent);
203 Franz 319
        pf.translate(Xpos*sc, Ypos*sc);
320
        pf.rotate(Rot);
182 Franz 321
        pf.scale(sc, sc);
68 Franz 322
        if (!Doc->RePos)
167 Franz 323
                pf.setClipRect(!e.isEmpty() ? e : OwnPage->ViewReg().boundingRect());
68 Franz 324
        bool doStroke = true;
325
        p->setZoomFactor(sc);
326
        p->save();
327
        p->translate(-e.x(), -e.y());
328
        p->translate(Xpos*sc, Ypos*sc);
182 Franz 329
        p->rotate(Rot);
68 Franz 330
        p->setLineWidth(Pwidth);
331
        if (GrType != 0)
167 Franz 332
        {
68 Franz 333
                p->setFillMode(2);
334
                p->fill_gradient = fill_gradient;
335
                QWMatrix grm;
336
                grm.rotate(Rot);
337
                FPointArray gra;
338
                switch (GrType)
167 Franz 339
                {
296 Franz 340
                        case 1:
341
                        case 2:
342
                        case 3:
343
                        case 4:
292 Franz 344
                        case 6:
345
                                gra.setPoints(2, GrStartX, GrStartY, GrEndX, GrEndY);
346
                                gra.map(grm);
347
                                p->setGradient(VGradient::linear, gra.point(0), gra.point(1));
348
                                break;
296 Franz 349
                        case 5:
295 Franz 350
                        case 7:
351
                                gra.setPoints(2, GrStartX, GrStartY, GrEndX, GrEndY);
352
                                p->setGradient(VGradient::radial, gra.point(0), gra.point(1), gra.point(0));
353
                                break;
68 Franz 354
                }
167 Franz 355
        }
237 Franz 356
        else
357
        {
358
                p->fill_gradient = VGradient(VGradient::linear);
359
                if (Pcolor != "None")
360
                {
361
                        SetFarbe(&tmp, Pcolor, Shade);
362
                        p->setBrush(tmp);
363
                        p->setFillMode(1);
364
                }
365
                else
366
                        p->setFillMode(0);
367
        }
3 paul 368
        if (Pcolor2 != "None")
167 Franz 369
        {
3 paul 370
                SetFarbe(&tmp, Pcolor2, Shade2);
371
                if ((Pwidth == 0) && (PType != 5))
68 Franz 372
                        p->setLineWidth(0);
3 paul 373
                else
167 Franz 374
                {
68 Franz 375
                        p->setPen(tmp, Pwidth, PLineArt, PLineEnd, PLineJoin);
376
                        if (DashValues.count() != 0)
377
                                p->setDash(DashValues, DashOffset);
3 paul 378
                }
167 Franz 379
        }
3 paul 380
        else
68 Franz 381
                p->setLineWidth(0);
382
        p->setBrushOpacity(1.0 - Transparency);
383
        p->setPenOpacity(1.0 - TranspStroke);
384
        switch (PType)
167 Franz 385
        {
68 Franz 386
                case 2:
387
                        if (Doc->RePos)
388
                                break;
389
                        if ((Pcolor != "None") || (GrType != 0))
167 Franz 390
                        {
68 Franz 391
                                p->setupPolygon(&PoLine);
392
                                p->drawPolygon();
167 Franz 393
                        }
68 Franz 394
                        if (Pfile == "")
167 Franz 395
                        {
310 Franz 396
                                if ((Frame) && (ScApp->Prefs.FramesShown))
397
                                {
398
                                        p->setPen(black, 1, SolidLine, FlatCap, MiterJoin);
399
                                        p->drawLine(FPoint(0, 0), FPoint(Width, Height));
400
                                        p->drawLine(FPoint(0, Height), FPoint(Width, 0));
401
                                }
167 Franz 402
                        }
68 Franz 403
                        else
167 Franz 404
                        {
68 Franz 405
                                if ((!PicArt) || (!PicAvail))
167 Franz 406
                                {
310 Franz 407
                                        if ((Frame) && (ScApp->Prefs.FramesShown))
408
                                        {
409
                                                p->setPen(red, 1, SolidLine, FlatCap, MiterJoin);
410
                                                p->drawLine(FPoint(0, 0), FPoint(Width, Height));
411
                                                p->drawLine(FPoint(0, Height), FPoint(Width, 0));
412
                                        }
167 Franz 413
                                }
3 paul 414
                                else
167 Franz 415
                                {
267 Franz 416
                                        p->setupPolygon(&PoLine);
417
                                        p->setClipPath();
418
                                        p->save();
419
                                        if (flippedH % 2 != 0)
167 Franz 420
                                                {
267 Franz 421
                                                p->translate(Width * sc, 0);
422
                                                p->scale(-1, 1);
3 paul 423
                                                }
68 Franz 424
                                        if (flippedV % 2 != 0)
267 Franz 425
                                                {
426
                                                p->translate(0, Height * sc);
427
                                                p->scale(1, -1);
428
                                                }
68 Franz 429
                                        if ((LocalViewX != 1) || (LocalViewY != 1))
267 Franz 430
                                                p->scale(LocalViewX, LocalViewY);
293 Franz 431
                                        p->translate(LocalX*LocalScX*sc, LocalY*LocalScY*sc);
68 Franz 432
                                        if (InvPict)
268 Franz 433
                                        {
434
                                                QImage ip = pixm.copy();
270 Franz 435
                                                p->drawImage(&ip);
268 Franz 436
                                        }
437
                                        else
270 Franz 438
                                                p->drawImage(&pixm);
267 Franz 439
                                        p->restore();
167 Franz 440
                                }
441
                        }
68 Franz 442
                        break;
443
                case 5:
444
                        if (Doc->RePos)
445
                                break;
446
                        if (NamedLStyle == "")
447
                                p->drawLine(FPoint(0, 0), FPoint(Width, 0));
448
                        else
167 Franz 449
                        {
68 Franz 450
                                multiLine ml = Doc->MLineStyles[NamedLStyle];
451
                                for (int it = ml.size()-1; it > -1; it--)
167 Franz 452
                                {
68 Franz 453
                                        SetFarbe(&tmp, ml[it].Color, ml[it].Shade);
454
                                        p->setPen(tmp, ml[it].Width,
455
                                                                         static_cast<PenStyle>(ml[it].Dash),
456
                                                                         static_cast<PenCapStyle>(ml[it].LineEnd),
457
                                                                         static_cast<PenJoinStyle>(ml[it].LineJoin));
458
                                        p->drawLine(FPoint(0, 0), FPoint(Width, 0));
167 Franz 459
                                }
68 Franz 460
                                doStroke = false;
167 Franz 461
                        }
68 Franz 462
                        break;
463
                case 1:
464
                case 3:
465
                case 6:
466
                        if (Doc->RePos)
3 paul 467
                                break;
68 Franz 468
                        p->setupPolygon(&PoLine);
469
                        p->drawPolygon();
470
                        break;
471
                case 7:
472
                        if (Doc->RePos)
473
                                break;
264 Franz 474
                        if ((Pcolor != "None") || (GrType != 0))
475
                        {
476
                                FPointArray cli;
477
                                for (uint n = 0; n < PoLine.size()-3; n += 4)
478
                                {
479
                                        if (PoLine.point(n).x() > 900000)
480
                                        {
481
                                                cli.addPoint(PoLine.point(n-2));
482
                                                cli.addPoint(PoLine.point(n-2));
483
                                                cli.addPoint(cli.point(0));
484
                                                cli.addPoint(cli.point(0));
485
                                                p->setupPolygon(&cli);
486
                                                p->drawPolygon();
487
                                                cli.resize(0);
488
                                                continue;
489
                                        }
490
                                        cli.addPoint(PoLine.point(n));
491
                                        cli.addPoint(PoLine.point(n+1));
492
                                        cli.addPoint(PoLine.point(n+2));
493
                                        cli.addPoint(PoLine.point(n+3));
494
                                }
495
                                if (cli.size() > 2)
496
                                {
497
                                        FPoint l1 = cli.point(cli.size()-2);
498
                                        cli.addPoint(l1);
499
                                        cli.addPoint(l1);
500
                                        cli.addPoint(cli.point(0));
501
                                        cli.addPoint(cli.point(0));
502
                                        p->setupPolygon(&cli);
503
                                        p->drawPolygon();
504
                                }
505
                        }
506
                        p->setupPolygon(&PoLine, false);
68 Franz 507
                        if (NamedLStyle == "")
508
                                p->drawPolyLine();
509
                        else
510
                                {
511
                                multiLine ml = Doc->MLineStyles[NamedLStyle];
512
                                for (int it = ml.size()-1; it > -1; it--)
3 paul 513
                                        {
68 Franz 514
                                        SetFarbe(&tmp, ml[it].Color, ml[it].Shade);
515
                                        p->setPen(tmp, ml[it].Width,
516
                                                                         static_cast<PenStyle>(ml[it].Dash),
517
                                                                         static_cast<PenCapStyle>(ml[it].LineEnd),
518
                                                                         static_cast<PenJoinStyle>(ml[it].LineJoin));
519
                                        p->drawPolyLine();
520
                                        }
521
                                }
522
                        doStroke = false;
523
                        break;
524
                case 4:
525
                        p->save();
209 Franz 526
                        pf2.begin(Parent);
527
                        pf2.translate(Xpos, Ypos);
528
                        pf2.rotate(Rot);
68 Franz 529
                        if ((Pcolor != "None") || (GrType != 0))
530
                                {
531
                                p->setupPolygon(&PoLine);
532
                                p->drawPolygon();
533
                                }
110 Franz 534
                        if (Pcolor2 != "None")
535
                                lineCorr = Pwidth / 2.0;
536
                        else
537
                                lineCorr = 0;
68 Franz 538
                        if ((isAnnotation) && (AnType == 2) && (Pfile != "") && (PicAvail) && (PicArt) && (AnUseIcons))
539
                                {
267 Franz 540
                                        p->setupPolygon(&PoLine);
541
                                        p->setClipPath();
542
                                        p->save();
543
                                        p->scale(LocalScX, LocalScY);
544
                                        p->translate(static_cast<int>(LocalX*LocalScX), static_cast<int>(LocalY*LocalScY));
545
                                        if (!pixm.isNull())
270 Franz 546
                                                p->drawImage(&pixm);
267 Franz 547
                                        p->restore();
68 Franz 548
                                }
549
                        if ((Ptext.count() != 0) || (Dirty) || (NextBox != 0))
550
                                {
551
                                if (NextBox != 0)
3 paul 552
                                        {
68 Franz 553
                                        nb = NextBox;
554
                                        while (nb != 0)
3 paul 555
                                                {
68 Franz 556
                                                a = nb->Ptext.count();
557
                                                for (uint s=0; s<a; ++s)
3 paul 558
                                                        {
68 Franz 559
                                                        Ptext.append(nb->Ptext.take(0));
3 paul 560
                                                        }
108 Franz 561
                                                nb->MaxChars = 0;
68 Franz 562
                                                nb->Dirty = true;
563
                                                nb = nb->NextBox;
3 paul 564
                                                }
68 Franz 565
                                        nb = NextBox;
3 paul 566
                                        }
68 Franz 567
                                Doc->Vorlagen[0].LineSpa = LineSp;
209 Franz 568
                                QRegion cl = QRegion(pf2.xForm(Clip));
68 Franz 569
                                for (a=0; a<OwnPage->Items.count(); ++a)
3 paul 570
                                        {
68 Franz 571
                                        if (((OwnPage->Items.at(a)->ItemNr > ItemNr)
572
                                                                && (OwnPage->Items.at(a)->LayerNr == LayerNr))
573
                                                        || (Doc->Layers[OwnPage->Items.at(a)->LayerNr].Level > Doc->Layers[LayerNr].Level))
3 paul 574
                                                {
68 Franz 575
                                                if (OwnPage->Items.at(a)->Textflow)
3 paul 576
                                                        {
68 Franz 577
                                                        pp.begin(Parent);
203 Franz 578
                                                        pp.translate(OwnPage->Items.at(a)->Xpos, OwnPage->Items.at(a)->Ypos);
68 Franz 579
                                                        pp.rotate(OwnPage->Items.at(a)->Rot);
580
                                                        if (OwnPage->Items.at(a)->Textflow2)
581
                                                                {
582
                                                                QPointArray tcli;
583
                                                                tcli.resize(4);
584
                                                                tcli.setPoint(0, QPoint(0,0));
585
                                                                tcli.setPoint(1, QPoint(qRound(OwnPage->Items.at(a)->Width), 0));
586
                                                                tcli.setPoint(2, QPoint(qRound(OwnPage->Items.at(a)->Width), qRound(OwnPage->Items.at(a)->Height)));
587
                                                                tcli.setPoint(3, QPoint(0, qRound(OwnPage->Items.at(a)->Height)));
588
                                                                cm = QRegion(pp.xForm(tcli));
589
                                                                }
590
                                                        else
591
                                                                cm = QRegion(pp.xForm(OwnPage->Items.at(a)->Clip));
592
                                                        pp.end();
593
                                                        cl = cl.subtract(cm);
3 paul 594
                                                        }
595
                                                }
596
                                        }
68 Franz 597
                                if (flippedH % 2 != 0)
3 paul 598
                                        {
68 Franz 599
                                        p->translate(Width * sc, 0);
600
                                        p->scale(-1, 1);
263 Franz 601
                                        pf2.translate(Width, 0);
262 Franz 602
                                        pf2.scale(-1, 1);
3 paul 603
                                        }
68 Franz 604
                                if (flippedV % 2 != 0)
3 paul 605
                                        {
68 Franz 606
                                        p->translate(0, Height * sc);
607
                                        p->scale(1, -1);
263 Franz 608
                                        pf2.translate(0, Height);
262 Franz 609
                                        pf2.scale(1, -1);
3 paul 610
                                        }
68 Franz 611
                                if ((Doc->AppMode == 7) && (Dirty))
612
                                        Dirty = false;
134 Franz 613
                                CurrCol = 0;
140 Franz 614
                                ColWidth = (Width - (ColGap * (Cols - 1)) - Extra - RExtra - 2*lineCorr) / Cols;
615
                                ColBound = FPoint((ColWidth + ColGap) * CurrCol+Extra + lineCorr, ColWidth * (CurrCol+1) + ColGap * CurrCol + Extra+lineCorr);
138 Franz 616
                                ColBound = FPoint(ColBound.x(), ColBound.y()+RExtra+lineCorr);
140 Franz 617
                                CurX = ColBound.x();
160 Franz 618
                                if (Ptext.count() > 0)
619
                                        {
620
                                        hl = Ptext.at(0);
621
                                        if (Doc->Vorlagen[hl->cab].Drop)
241 Franz 622
                                        {
623
                                                if (Doc->Vorlagen[hl->cab].BaseAdj)
624
                                                        chs = qRound(Doc->BaseGrid  * Doc->Vorlagen[hl->cab].DropLin * 10);
625
                                                else
626
                                                        chs = qRound(Doc->Vorlagen[hl->cab].LineSpa * Doc->Vorlagen[hl->cab].DropLin * 10);
627
                                        }
160 Franz 628
                                        else
629
                                                chs = hl->csize;
630
                                        desc2 = -(*Doc->AllFonts)[hl->cfont]->numDescender * (chs / 10.0);
175 Franz 631
                                        CurY = TExtra+lineCorr;
160 Franz 632
                                        }
633
                                else
634
                                        {
635
                                        desc2 = -(*Doc->AllFonts)[IFont]->numDescender * (ISize / 10.0);
636
                                        CurY = Doc->Vorlagen[0].LineSpa+TExtra+lineCorr-desc2;
637
                                        }
638
                                firstDes = desc2;
68 Franz 639
                                LiList.clear();
640
                                BuPos = 0;
641
                                LastSP = 0;
642
                                LastXp = 0;
643
                                outs = false;
644
                                OFs = 0;
645
                                OFs2 = 0;
646
                                aSpa = 0;
647
                                absa = 0;
209 Franz 648
                                MaxChars = 0;
114 Franz 649
                                MaxText = Ptext.count();
209 Franz 650
                                StartOfCol = true;
114 Franz 651
                                for (a = 0; a < MaxText; ++a)
3 paul 652
                                        {
68 Franz 653
                                        hl = Ptext.at(a);
654
                                        chx = hl->ch;
655
                                        if (hl->ch == QChar(30))
656
                                                chx = ExpandToken(a);
657
                                        absa = hl->cab;
658
                                        if (a == 0)
3 paul 659
                                                {
68 Franz 660
                                                if (BackBox != 0)
3 paul 661
                                                        {
68 Franz 662
                                                        nb = BackBox;
116 Franz 663
                                                        while (nb != 0)
3 paul 664
                                                                {
116 Franz 665
                                                                if (nb->Ptext.count() != 0)
3 paul 666
                                                                        {
116 Franz 667
                                                                        if (nb->Ptext.at(nb->Ptext.count()-1)->ch == QChar(13))
668
                                                                                {
669
                                                                                CurX += Doc->Vorlagen[absa].First;
670
                                                                                CurX += Doc->Vorlagen[absa].Indent;
671
                                                                                CurY += Doc->Vorlagen[absa].Avor;
153 Franz 672
                                                                                if (chx != QChar(13))
673
                                                                                        DropCmode = Doc->Vorlagen[absa].Drop;
175 Franz 674
                                                                                else
675
                                                                                        DropCmode = false;
153 Franz 676
                                                                                if (DropCmode)
677
                                                                                        DropLines = Doc->Vorlagen[absa].DropLin;
116 Franz 678
                                                                                break;
679
                                                                                }
680
                                                                        else
681
                                                                                {
682
                                                                                CurX += Doc->Vorlagen[absa].Indent;
683
                                                                                break;
684
                                                                                }
3 paul 685
                                                                        }
116 Franz 686
                                                                nb = nb->BackBox;
3 paul 687
                                                                }
688
                                                        }
689
                                                else
690
                                                        {
153 Franz 691
                                                        if (chx != QChar(13))
692
                                                                DropCmode = Doc->Vorlagen[absa].Drop;
175 Franz 693
                                                        else
694
                                                                DropCmode = false;
68 Franz 695
                                                        CurX += Doc->Vorlagen[absa].First;
696
                                                        CurX += Doc->Vorlagen[absa].Indent;
697
                                                        CurY += Doc->Vorlagen[absa].Avor;
153 Franz 698
                                                        if (DropCmode)
699
                                                                DropLines = Doc->Vorlagen[absa].DropLin;
3 paul 700
                                                        }
701
                                                }
316 Franz 702
                                        if (((Doc->Vorlagen[absa].Ausri == 3) || (Doc->Vorlagen[absa].Ausri == 4)) && (LiList.count() == 0) && (hl->ch == " "))
703
                                        {
317 Franz 704
                                                hl->cstyle |= 256;
316 Franz 705
                                                continue;
706
                                        }
707
                                        else
708
                                                hl->cstyle &= 255;
68 Franz 709
                                        if (LiList.count() == 0)
3 paul 710
                                                {
68 Franz 711
                                                if ((a > 0) && (Ptext.at(a-1)->ch == QChar(13)))
3 paul 712
                                                        {
163 Franz 713
                                                        CurX += Doc->Vorlagen[absa].First;
714
                                                        CurX += Doc->Vorlagen[absa].Indent;
715
                                                        CurY += Doc->Vorlagen[absa].Avor;
153 Franz 716
                                                        if (chx != QChar(13))
717
                                                                DropCmode = Doc->Vorlagen[absa].Drop;
175 Franz 718
                                                        else
719
                                                                DropCmode = false;
153 Franz 720
                                                        if (DropCmode)
721
                                                                {
722
                                                                DropLines = Doc->Vorlagen[absa].DropLin;
241 Franz 723
                                                                if (Doc->Vorlagen[hl->cab].BaseAdj)
724
                                                                        CurY += Doc->BaseGrid * (DropLines-1);
725
                                                                else
726
                                                                        CurY += Doc->Vorlagen[absa].LineSpa * (DropLines-1);
153 Franz 727
                                                                }
3 paul 728
                                                        }
68 Franz 729
                                                }
153 Franz 730
                                        if (DropCmode)
731
                                                {
241 Franz 732
                                                if (Doc->Vorlagen[hl->cab].BaseAdj)
310 Franz 733
                                                {
734
                                                        chsd = qRound(10 * ((Doc->BaseGrid * DropLines) / ((*Doc->AllFonts)[hl->cfont]->numAscent+(*Doc->AllFonts)[hl->cfont]->numDescender)));
241 Franz 735
                                                        chs = qRound(10 * ((Doc->BaseGrid * DropLines) / (*Doc->AllFonts)[hl->cfont]->numAscent));
310 Franz 736
                                                }
241 Franz 737
                                                else
310 Franz 738
                                                {
739
                                                        chsd = qRound(10 * ((Doc->Vorlagen[absa].LineSpa * DropLines) / ((*Doc->AllFonts)[hl->cfont]->numAscent+(*Doc->AllFonts)[hl->cfont]->numDescender)));
241 Franz 740
                                                        chs = qRound(10 * ((Doc->Vorlagen[absa].LineSpa * DropLines) / (*Doc->AllFonts)[hl->cfont]->numAscent));
153 Franz 741
                                                }
310 Franz 742
                                                hl->csize = chsd;
743
                                                }
153 Franz 744
                                        else
745
                                                chs = hl->csize;
157 Franz 746
                                        oldCurY = SetZeichAttr(hl, &chs, &chx);
68 Franz 747
                                        if (chx == QChar(29))
748
                                                chx2 = " ";
749
                                        else
750
                                                chx2 = chx;
114 Franz 751
                                        if (a < MaxText-1)
68 Franz 752
                                                {
753
                                                if (Ptext.at(a+1)->ch == QChar(29))
754
                                                        chx3 = " ";
3 paul 755
                                                else
68 Franz 756
                                                        chx3 = Ptext.at(a+1)->ch;
757
                                                wide = Cwidth(Doc, hl->cfont, chx2, chs, chx3);
758
                                                }
759
                                        else
760
                                                wide = Cwidth(Doc, hl->cfont, chx2, chs);
220 Franz 761
                                        if (DropCmode)
310 Franz 762
                                        {
763
                                                wide = RealCWidth(Doc, hl->cfont, chx2, chsd);
764
                                                desc2 = 0;
765
                                                desc = 0;
766
                                                asce = qRound((*Doc->AllFonts)[hl->cfont]->numAscent * (chs / 10.0));
767
                                        }
768
                                        else
769
                                        {
770
                                                desc2 = -(*Doc->AllFonts)[hl->cfont]->numDescender * (chs / 10.0);
771
                                                desc = qRound(-(*Doc->AllFonts)[hl->cfont]->numDescender * (chs / 10.0));
772
                                                asce = qRound((*Doc->AllFonts)[hl->cfont]->numAscent * (chs / 10.0));
773
                                        }
253 Franz 774
                                        wide = wide * (hl->cscale / 100.0);
138 Franz 775
                                        fBorder = false;
68 Franz 776
                                        if (LiList.isEmpty())
777
                                                {
251 Franz 778
                                                startLin = a;
246 Franz 779
                                                double TopOffset = asce;
780
                                                double BotOffset = desc2;
175 Franz 781
                                                if (StartOfCol)
204 Franz 782
                                                {
783
                                                        CurY = asce+TExtra+lineCorr+1;
244 Franz 784
                                                        if (((a > 0) && (Ptext.at(a-1)->ch == QChar(13))) || (a == 0))
785
                                                                CurY += Doc->Vorlagen[hl->cab].Avor;
204 Franz 786
                                                }
241 Franz 787
                                                if (Doc->Vorlagen[hl->cab].BaseAdj)
242 Franz 788
                                                {
789
                                                        int ol1 = qRound((Ypos + CurY - Doc->BaseOffs) * 10000.0);
790
                                                        int ol2 = static_cast<int>(ol1 / Doc->BaseGrid);
791
                                                        CurY = ceil(  ol2 / 10000.0 ) * Doc->BaseGrid + Doc->BaseOffs - Ypos;
792
                                                }
205 Franz 793
                                                pt1 = QPoint(static_cast<int>(ceil(CurX)), static_cast<int>(CurY+BotOffset));
204 Franz 794
                                                pt2 = QPoint(static_cast<int>(ceil(CurX)), static_cast<int>(ceil(CurY-TopOffset)));
209 Franz 795
                                                while ((!cl.contains(pf2.xForm(pt1))) || (!cl.contains(pf2.xForm(pt2))))
3 paul 796
                                                        {
135 Franz 797
                                                        fBorder = true;
68 Franz 798
                                                        CurX++;
134 Franz 799
                                                        if (CurX+RExtra+lineCorr > ColBound.y())
3 paul 800
                                                                {
158 Franz 801
                                                                fBorder = false;
175 Franz 802
                                                                if (StartOfCol)
803
                                                                        CurY++;
804
                                                                else
805
                                                                        CurY += Doc->Vorlagen[hl->cab].LineSpa;
241 Franz 806
                                                                if (Doc->Vorlagen[hl->cab].BaseAdj)
242 Franz 807
                                                                {
808
                                                                        int ol1 = qRound((Ypos + CurY - Doc->BaseOffs) * 10000.0);
809
                                                                        int ol2 = static_cast<int>(ol1 / Doc->BaseGrid);
810
                                                                        CurY = ceil(  ol2 / 10000.0 ) * Doc->BaseGrid + Doc->BaseOffs - Ypos;
811
                                                                }
134 Franz 812
                                                                CurX = ColBound.x();
110 Franz 813
                                                                if (CurY+BExtra+lineCorr > Height)
3 paul 814
                                                                        {
161 Franz 815
                                                                        StartOfCol = true;
135 Franz 816
                                                                        fBorder = false;
134 Franz 817
                                                                        CurrCol++;
818
                                                                        if (CurrCol < Cols)
819
                                                                                {
140 Franz 820
                                                                                ColWidth = (Width - (ColGap * (Cols - 1)) - Extra - RExtra - 2*lineCorr) / Cols;
136 Franz 821
                                                                                ColBound = FPoint((ColWidth + ColGap) * CurrCol + Extra+lineCorr, ColWidth * (CurrCol+1) + ColGap * CurrCol + Extra+lineCorr);
822
                                                                                CurX = ColBound.x();
823
                                                                                ColBound = FPoint(ColBound.x(), ColBound.y()+RExtra+lineCorr);
204 Franz 824
                                                                                CurY = asce+TExtra+lineCorr+1;
134 Franz 825
                                                                                if ((a > 0) && (Ptext.at(a-1)->ch == QChar(13)))
826
                                                                                        {
161 Franz 827
                                                                                        if (chx != QChar(13))
163 Franz 828
                                                                                                DropCmode = Doc->Vorlagen[hl->cab].Drop;
175 Franz 829
                                                                                        else
830
                                                                                                DropCmode = false;
134 Franz 831
                                                                                        CurX += Doc->Vorlagen[hl->cab].First;
832
                                                                                        CurX += Doc->Vorlagen[hl->cab].Indent;
161 Franz 833
                                                                                        if (DropCmode)
241 Franz 834
                                                                                        {
835
                                                                                                if (Doc->Vorlagen[hl->cab].BaseAdj)
836
                                                                                                        desc2 = -(*Doc->AllFonts)[hl->cfont]->numDescender * Doc->BaseGrid * Doc->Vorlagen[hl->cab].DropLin;
837
                                                                                                else
838
                                                                                                        desc2 = -(*Doc->AllFonts)[hl->cfont]->numDescender * Doc->Vorlagen[hl->cab].LineSpa * Doc->Vorlagen[hl->cab].DropLin;
839
                                                                                        }
134 Franz 840
                                                                                        CurY += Doc->Vorlagen[hl->cab].Avor;
153 Franz 841
                                                                                        if (DropCmode)
163 Franz 842
                                                                                                DropLines = Doc->Vorlagen[hl->cab].DropLin;
134 Franz 843
                                                                                        }
844
                                                                                else
163 Franz 845
                                                                                        CurX += Doc->Vorlagen[hl->cab].Indent;
241 Franz 846
                                                                                if (Doc->Vorlagen[hl->cab].BaseAdj)
242 Franz 847
                                                                                {
848
                                                                                        int ol1 = qRound((Ypos + CurY - Doc->BaseOffs) * 10000.0);
849
                                                                                        int ol2 = static_cast<int>(ol1 / Doc->BaseGrid);
850
                                                                                        CurY = ceil(  ol2 / 10000.0 ) * Doc->BaseGrid + Doc->BaseOffs - Ypos;
134 Franz 851
                                                                                }
242 Franz 852
                                                                                }
134 Franz 853
                                                                        else
854
                                                                                {
855
                                                                                nrc = a;
856
                                                                                goto NoRoom;
857
                                                                                }
3 paul 858
                                                                        }
859
                                                                }
205 Franz 860
                                                        pt1 = QPoint(static_cast<int>(ceil(CurX)), static_cast<int>(CurY+BotOffset));
204 Franz 861
                                                        pt2 = QPoint(static_cast<int>(ceil(CurX)), static_cast<int>(ceil(CurY-TopOffset)));
3 paul 862
                                                        }
161 Franz 863
                                                if ((fBorder) && (!AbsHasDrop))
864
                                                        CurX += Extra;
135 Franz 865
                                                fBorder = false;
68 Franz 866
                                                }
209 Franz 867
                                        StartOfCol = false;
163 Franz 868
                                        if (RTab)
140 Franz 869
                                                {
163 Franz 870
                                                if (((hl->ch == ".") && (TabCode == 2)) ||
871
                                                        ((hl->ch == ",") && (TabCode == 3)) ||
272 Franz 872
                                                        (hl->ch == QChar(9)))
163 Franz 873
                                                        {
874
                                                        RTab = false;
875
                                                        TabCode = 0;
876
                                                        }
140 Franz 877
                                                }
139 Franz 878
                                        if (hl->ch == QChar(9))
879
                                                {
140 Franz 880
                                                wide = 1;
881
                                                if (RTab)
882
                                                        RTab = false;
139 Franz 883
                                                else
884
                                                        {
280 Franz 885
                                                        RTabX = CurX+wide;
140 Franz 886
                                                        if (hl->cab < 5)
887
                                                                tTabValues = TabValues;
888
                                                        else
889
                                                                tTabValues = Doc->Vorlagen[hl->cab].TabValues;
890
                                                        if (tTabValues.isEmpty())
139 Franz 891
                                                                {
140 Franz 892
                                                                CurX = ColBound.x() + ceil((CurX-ColBound.x()) / 36.0) * 36.0;
893
                                                                TabCode = 0;
894
                                                                RTab = false;
895
                                                                }
896
                                                        else
897
                                                                {
898
                                                                double tCurX = CurX - ColBound.x();
899
                                                                double oCurX = CurX - ColBound.x();
900
                                                                for (int yg = static_cast<int>(tTabValues.count()-1); yg > 0; yg -= 2)
139 Franz 901
                                                                        {
140 Franz 902
                                                                        if (oCurX < tTabValues[yg])
903
                                                                                {
904
                                                                                tCurX = tTabValues[yg];
905
                                                                                TabCode = static_cast<int>(tTabValues[yg-1]);
906
                                                                                }
139 Franz 907
                                                                        }
140 Franz 908
                                                                if (TabCode == 0)
909
                                                                        RTab = false;
910
                                                                else
911
                                                                        RTab = true;
912
                                                                if (tCurX == oCurX)
913
                                                                        CurX = ColBound.x() + ceil((CurX-ColBound.x()) / 36.0) * 36.0;
914
                                                                else
915
                                                                        CurX = ColBound.x() + tCurX;
139 Franz 916
                                                                }
140 Franz 917
                                                        StartRT = LiList.count();
918
                                                        StartRT2 = a;
139 Franz 919
                                                        }
920
                                                }
157 Franz 921
                                        hl->yp = CurY + oldCurY;
238 Franz 922
                                        if (LiList.count() == 0)
923
                                                kernVal = 0;
924
                                        else
925
                                                kernVal = hl->cextra;
140 Franz 926
                                        if (!RTab)
927
                                                {
238 Franz 928
                                                hl->xp = CurX+kernVal;
929
                                                CurX += wide+kernVal;
140 Franz 930
                                                }
931
                                        else
932
                                                hl->xp = CurX;
158 Franz 933
                                        if ((TabCode == 4) && (RTab))
238 Franz 934
                                                CurX += (wide+kernVal) / 2;
246 Franz 935
                                        pt1 = QPoint(static_cast<int>(ceil(CurX+RExtra)), static_cast<int>(CurY+desc));
227 Franz 936
                                        pt2 = QPoint(static_cast<int>(ceil(CurX+RExtra)), static_cast<int>(ceil(CurY-asce)));
209 Franz 937
                                        if ((!cl.contains(pf2.xForm(pt1))) || (!cl.contains(pf2.xForm(pt2))) || (CurX+RExtra+lineCorr > ColBound.y()))
68 Franz 938
                                                outs = true;
246 Franz 939
                                        if (CurY > (Height - BExtra - lineCorr))
940
                                                outs = true;
68 Franz 941
                                        Zli = new ZZ;
942
                                        Zli->Zeich = chx;
943
                                        Zli->Farb = hl->ccolor;
944
                                        Zli->shade = hl->cshade;
945
                                        Zli->Farb2 = hl->cstroke;
946
                                        Zli->shade2 = hl->cshade2;
947
                                        Zli->xco = hl->xp;
175 Franz 948
                                        Zli->yco = hl->yp;
68 Franz 949
                                        Zli->Sele = hl->cselect;
310 Franz 950
                                        if (DropCmode)
951
                                                Zli->Siz = chsd;
952
                                        else
953
                                                Zli->Siz = chs;
68 Franz 954
                                        Zli->Style = hl->cstyle;
955
                                        Zli->ZFo = hl->cfont;
956
                                        Zli->wide = wide;
238 Franz 957
                                        Zli->kern = kernVal;
68 Franz 958
                                        Zli->scale = hl->cscale;
139 Franz 959
                                        if (((hl->ch == " ") || (hl->ch == QChar(9))) && (!outs))
244 Franz 960
                                        {
961
                                                if (a > 0)
68 Franz 962
                                                {
267 Franz 963
                                                        if (Ptext.at(a-1)->ch !=  " ")   // || ((Doc->AppMode == 7) && (Ptext.at(QMAX(CPos-1,0))->yp == hl->yp) && (Select)))
244 Franz 964
                                                        {
965
                                                        LastXp = hl->xp;
966
                                                        LastSP = BuPos;
967
                                                        }
68 Franz 968
                                                }
244 Franz 969
                                                else
970
                                                {
971
                                                        LastXp = hl->xp;
972
                                                        LastSP = BuPos;
973
                                                }
974
                                        }
249 Franz 975
                                        if (((hl->cstyle & 128) || (hl->ch == "-")) && (!outs))
68 Franz 976
                                                {
249 Franz 977
                                                if ((HyphenCount < Doc->HyCount) || (Doc->HyCount == 0))
978
                                                        {
979
                                                        if (hl->ch == "-")
980
                                                                LastXp = CurX;
981
                                                        else
982
                                                                LastXp = CurX + Cwidth(Doc, hl->cfont, "-", hl->csize);
983
                                                        LastSP = BuPos;
984
                                                        }
68 Franz 985
                                                }
986
                                        LiList.append(Zli);
140 Franz 987
                                        if (RTab)
988
                                                {
989
                                                uint rtx2 = 0;
147 Franz 990
                                                double cen = 1;
991
                                                if (TabCode == 4)
992
                                                        cen = 2;
140 Franz 993
                                                for (uint rtx = StartRT; rtx < LiList.count(); ++rtx)
994
                                                        {
280 Franz 995
                                                                LiList.at(rtx)->xco = QMAX(LiList.at(rtx)->xco-(wide+kernVal) / cen, 0.0);
996
                                                                Ptext.at(StartRT2+rtx2)->xp = QMAX(Ptext.at(StartRT2+rtx2)->xp-(wide+kernVal) / cen, 0.0);
997
                                                                if (Ptext.at(StartRT2+rtx2)->xp < RTabX)
998
                                                                {
999
                                                                        RTab = false;
1000
                                                                        TabCode = 0;
1001
                                                                }
1002
                                                                rtx2++;
140 Franz 1003
                                                        }
1004
                                                }
68 Franz 1005
                                        BuPos++;
153 Franz 1006
                                        if (DropCmode)
1007
                                                {
1008
                                                DropCmode = false;
154 Franz 1009
                                                AbsHasDrop = true;
153 Franz 1010
                                                maxDY = CurY;
161 Franz 1011
                                                maxDX = CurX;
182 Franz 1012
                                                QPointArray tcli;
1013
                                                tcli.resize(4);
241 Franz 1014
                                                if (Doc->Vorlagen[hl->cab].BaseAdj)
1015
                                                {
1016
                                                        CurY -= Doc->BaseGrid * (DropLines-1);
244 Franz 1017
                                                        int ol1 = qRound((Ypos + CurY - Doc->BaseOffs) * 10000.0);
1018
                                                        int ol2 = static_cast<int>(ol1 / Doc->BaseGrid);
1019
                                                        CurY = ceil(  ol2 / 10000.0 ) * Doc->BaseGrid + Doc->BaseOffs - Ypos;
241 Franz 1020
                                                        tcli.setPoint(0, QPoint(qRound(hl->xp), qRound(maxDY-DropLines*Doc->BaseGrid)));
1021
                                                        tcli.setPoint(1, QPoint(qRound(hl->xp+wide), qRound(maxDY-DropLines*Doc->BaseGrid)));
1022
                                                }
1023
                                                else
1024
                                                {
1025
                                                        CurY -= Doc->Vorlagen[absa].LineSpa * (DropLines-1);
1026
                                                        tcli.setPoint(0, QPoint(qRound(hl->xp), qRound(maxDY-DropLines*Doc->Vorlagen[absa].LineSpa)));
1027
                                                        tcli.setPoint(1, QPoint(qRound(hl->xp+wide), qRound(maxDY-DropLines*Doc->Vorlagen[absa].LineSpa)));
1028
                                                }
182 Franz 1029
                                                tcli.setPoint(2, QPoint(qRound(hl->xp+wide), qRound(maxDY)));
1030
                                                tcli.setPoint(3, QPoint(qRound(hl->xp), qRound(maxDY)));
209 Franz 1031
                                                cm = QRegion(pf2.xForm(tcli));
153 Franz 1032
                                                cl = cl.subtract(cm);
1033
                                                }
249 Franz 1034
                                        if ((hl->ch == QChar(13)) || (hl->ch == QChar(28)) || (outs))
68 Franz 1035
                                                {
140 Franz 1036
                                                RTab = false;
1037
                                                TabCode = 0;
68 Franz 1038
                                                if (outs)
3 paul 1039
                                                        {
114 Franz 1040
                                                        if (LastSP != 0)            // Hier koenen auch andere Trennungen eingebaut werden
3 paul 1041
                                                                {
68 Franz 1042
                                                                a -= BuPos - LastSP;
1043
                                                                a++;
1044
                                                                if (Ptext.at(a)->cstyle & 128)
251 Franz 1045
                                                                {
249 Franz 1046
                                                                        HyphenCount++;
317 Franz 1047
                                                                        Ptext.at(a)->cstyle |= 512;
68 Franz 1048
                                                                        Zli = new ZZ;
1049
                                                                        Zli->Zeich = "-";
1050
                                                                        Zli->Farb = Ptext.at(a)->ccolor;
1051
                                                                        Zli->Farb2 = Ptext.at(a)->cstroke;
1052
                                                                        Zli->shade = Ptext.at(a)->cshade;
1053
                                                                        Zli->shade2 = Ptext.at(a)->cshade2;
1054
                                                                        Zli->xco = LastXp - Cwidth(Doc, Ptext.at(a)->cfont, "-", Ptext.at(a)->csize);
1055
                                                                        Zli->yco = Ptext.at(a)->yp;
1056
                                                                        Zli->Sele = Ptext.at(a)->cselect;
1057
                                                                        Zli->Siz = Ptext.at(a)->csize;
1058
                                                                        Zli->Style = Ptext.at(a)->cstyle;
1059
                                                                        Zli->ZFo = Ptext.at(a)->cfont;
1060
                                                                        Zli->wide = Cwidth(Doc, Ptext.at(a)->cfont, "-", Ptext.at(a)->csize);
1061
                                                                        Zli->kern = Ptext.at(a)->cextra;
1062
                                                                        Zli->scale = Ptext.at(a)->cscale;
1063
                                                                        LiList.insert(LastSP+1, Zli);
1064
                                                                        LastSP += 1;
251 Franz 1065
                                                                }
249 Franz 1066
                                                                else
251 Franz 1067
                                                                {
249 Franz 1068
                                                                        HyphenCount = 0;
251 Franz 1069
                                                                        hl->cstyle &= 511;
1070
                                                                }
68 Franz 1071
                                                                BuPos = LastSP+1;
3 paul 1072
                                                                if (Doc->Vorlagen[absa].Ausri != 0)
1073
                                                                        {
68 Franz 1074
                                                                        EndX = LastXp;
3 paul 1075
                                                                        do
68 Franz 1076
                                                                                {
227 Franz 1077
                                                                                pt1 = QPoint(qRound(EndX+RExtra), static_cast<int>(CurY+desc));
1078
                                                                                pt2 = QPoint(qRound(EndX+RExtra), static_cast<int>(ceil(CurY-asce)));
3 paul 1079
                                                                                EndX++;
68 Franz 1080
                                                                                }
209 Franz 1081
                                                                        while ((cl.contains(pf2.xForm(pt1))) && (cl.contains(pf2.xForm(pt2))) && (EndX+RExtra+lineCorr < ColBound.y()));
3 paul 1082
                                                                        if (Doc->Vorlagen[absa].Ausri == 2)
68 Franz 1083
                                                                                OFs = EndX - LastXp;
3 paul 1084
                                                                        if (Doc->Vorlagen[absa].Ausri == 1)
68 Franz 1085
                                                                                OFs = (EndX - LastXp) / 2;
1086
                                                                        if ((Doc->Vorlagen[absa].Ausri == 3) || (Doc->Vorlagen[absa].Ausri == 4))
3 paul 1087
                                                                                {
1088
                                                                                aSpa = 0;
68 Franz 1089
                                                                                for (uint sof = 0; sof<BuPos-1; ++sof)
3 paul 1090
                                                                                        {
161 Franz 1091
                                                                                        if ((LiList.at(sof)->Zeich == QChar(32)) || (LiList.at(sof)->Zeich == QChar(29)))
3 paul 1092
                                                                                                aSpa++;
1093
                                                                                        }
68 Franz 1094
                                                                                if (aSpa > 1)
1095
                                                                                        OFs2 = (EndX - LastXp) / aSpa;
1096
                                                                                else
3 paul 1097
                                                                                        {
68 Franz 1098
                                                                                        if (aSpa == 0)
1099
                                                                                                OFs2 = 0;
1100
                                                                                        else
1101
                                                                                                OFs2 = (EndX - LastXp);
3 paul 1102
                                                                                        }
1103
                                                                                OFs = 0;
1104
                                                                                for (uint yof = 0; yof < LiList.count(); ++yof)
1105
                                                                                        {
1106
                                                                                        LiList.at(yof)->xco += OFs;
161 Franz 1107
                                                                                        if ((LiList.at(yof)->Zeich == QChar(32)) || (LiList.at(yof)->Zeich == QChar(29)))
68 Franz 1108
                                                                                                OFs += OFs2;
3 paul 1109
                                                                                        }
1110
                                                                                }
1111
                                                                        else
1112
                                                                                {
1113
                                                                                for (uint xof = 0; xof<LiList.count(); ++xof)
1114
                                                                                        {
1115
                                                                                        LiList.at(xof)->xco += OFs;
1116
                                                                                        }
1117
                                                                                }
68 Franz 1118
                                                                        }
3 paul 1119
                                                                }
1120
                                                        else
1121
                                                                {
68 Franz 1122
                                                                a--;
1123
                                                                BuPos--;
3 paul 1124
                                                                }
68 Franz 1125
                                                        }
1126
                                                else
1127
                                                        {
1128
                                                        if (Doc->Vorlagen[absa].Ausri != 0)
3 paul 1129
                                                                {
68 Franz 1130
                                                                EndX = CurX;
1131
                                                                do
3 paul 1132
                                                                        {
227 Franz 1133
                                                                        pt1 = QPoint(qRound(EndX+RExtra), static_cast<int>(CurY+desc));
1134
                                                                        pt2 = QPoint(qRound(EndX+RExtra), static_cast<int>(ceil(CurY-asce)));
68 Franz 1135
                                                                        EndX++;
3 paul 1136
                                                                        }
209 Franz 1137
                                                                while ((cl.contains(pf2.xForm(pt1))) && (cl.contains(pf2.xForm(pt2))) && (EndX+RExtra+lineCorr < ColBound.y()));
68 Franz 1138
                                                                if (Doc->Vorlagen[absa].Ausri == 2)
277 Franz 1139
                                                                        OFs = EndX - CurX;
68 Franz 1140
                                                                if (Doc->Vorlagen[absa].Ausri == 1)
277 Franz 1141
                                                                        OFs = (EndX - CurX) / 2;
68 Franz 1142
                                                                if (Doc->Vorlagen[absa].Ausri == 3)
1143
                                                                        OFs = 0;
1144
                                                                if (Doc->Vorlagen[absa].Ausri == 4)
3 paul 1145
                                                                        {
68 Franz 1146
                                                                        aSpa = 0;
1147
                                                                        for (uint sof = 0; sof<LiList.count(); ++sof)
3 paul 1148
                                                                                {
161 Franz 1149
                                                                                if ((LiList.at(sof)->Zeich == QChar(32)) || (LiList.at(sof)->Zeich == QChar(29)))
68 Franz 1150
                                                                                        aSpa++;
3 paul 1151
                                                                                }
68 Franz 1152
                                                                        if (aSpa != 0)
1153
                                                                                {
277 Franz 1154
                                                                                OFs2 = (EndX - CurX) / aSpa;
68 Franz 1155
                                                                                }
1156
                                                                        else
1157
                                                                                OFs2 = 0;
1158
                                                                        OFs = 0;
1159
                                                                        for (uint yof = 0; yof < LiList.count(); ++yof)
1160
                                                                                {
1161
                                                                                LiList.at(yof)->xco += OFs;
161 Franz 1162
                                                                                if ((LiList.at(yof)->Zeich == QChar(32)) || (LiList.at(yof)->Zeich == QChar(29)))
68 Franz 1163
                                                                                        OFs += OFs2;
1164
                                                                                }
3 paul 1165
                                                                        }
1166
                                                                else
1167
                                                                        {
68 Franz 1168
                                                                        for (uint xof = 0; xof<LiList.count(); ++xof)
1169
                                                                                {
3 paul 1170
                                                                                LiList.at(xof)->xco += OFs;
68 Franz 1171
                                                                                }
3 paul 1172
                                                                        }
1173
                                                                }
1174
                                                        }
68 Franz 1175
                                                uint BuPos3 = BuPos;
249 Franz 1176
                                                if ((outs) || (hl->ch == QChar(13)) || (hl->ch == QChar(28)))
3 paul 1177
                                                        {
138 Franz 1178
                                                        if ((outs) && (CurX+RExtra+lineCorr < ColBound.y()))
1179
                                                                {
249 Franz 1180
                                                                if (((hl->ch == QChar(13)) || (hl->ch == QChar(28))) && (AbsHasDrop))
153 Franz 1181
                                                                        {
154 Franz 1182
                                                                        AbsHasDrop = false;
153 Franz 1183
                                                                        if (CurY < maxDY)
1184
                                                                                CurY = maxDY;
1185
                                                                        }
138 Franz 1186
                                                                bool fromOut = true;
163 Franz 1187
                                                                double BotOffset = desc+BExtra+lineCorr;
227 Franz 1188
                                                                pt1 = QPoint(qRound(CurX+RExtra), static_cast<int>(CurY+BotOffset));
1189
                                                                pt2 = QPoint(qRound(CurX+RExtra), static_cast<int>(ceil(CurY-asce)));
209 Franz 1190
                                                                while ((!cl.contains(pf2.xForm(pt1))) || (!cl.contains(pf2.xForm(pt2))))
138 Franz 1191
                                                                        {
1192
                                                                        CurX++;
1193
                                                                        if (CurX+RExtra+lineCorr > ColBound.y())
1194
                                                                                {
1195
                                                                                fromOut = false;
145 Franz 1196
                                                                                CurY += Doc->Vorlagen[hl->cab].LineSpa;
205 Franz 1197
                                                                                if ((CurY+BExtra+lineCorr > Height) && (CurrCol+1 == Cols))
1198
                                                                                {
251 Franz 1199
                                                                                        nrc = a+1;
205 Franz 1200
                                                                                        goto NoRoom;
1201
                                                                                }
161 Franz 1202
                                                                                if (AbsHasDrop)
1203
                                                                                        {
1204
                                                                                        if (CurY > maxDY)
1205
                                                                                                {
1206
                                                                                                AbsHasDrop = false;
1207
                                                                                                CurX = ColBound.x();
1208
                                                                                                }
1209
                                                                                        else
1210
                                                                                                CurX = maxDX;
1211
                                                                                        }
1212
                                                                                else
1213
                                                                                        CurX = ColBound.x();
138 Franz 1214
                                                                                if (hl->ch != QChar(13))
1215
                                                                                        CurX += Doc->Vorlagen[hl->cab].Indent;
1216
                                                                                else
1217
                                                                                        {
1218
                                                                                        CurY += Doc->Vorlagen[hl->cab].Anach;
1219
                                                                                        if (BuPos3 > 0)
1220
                                                                                                BuPos3 -= 1;
1221
                                                                                        }
1222
                                                                                break;
1223
                                                                                }
227 Franz 1224
                                                                        pt1 = QPoint(qRound(CurX+RExtra), static_cast<int>(CurY+BotOffset));
1225
                                                                        pt2 = QPoint(qRound(CurX+RExtra), static_cast<int>(ceil(CurY-asce)));
138 Franz 1226
                                                                        }
140 Franz 1227
                                                                if (fromOut)
138 Franz 1228
                                                                        CurX--;
1229
                                                                }
1230
                                                        else
1231
                                                                {
249 Franz 1232
                                                                if (((hl->ch == QChar(13)) || (hl->ch == QChar(28))) && (AbsHasDrop))
153 Franz 1233
                                                                        {
154 Franz 1234
                                                                        AbsHasDrop = false;
153 Franz 1235
                                                                        if (CurY < maxDY)
1236
                                                                                CurY = maxDY;
1237
                                                                        }
1238
                                                                CurY += Doc->Vorlagen[hl->cab].LineSpa;
161 Franz 1239
                                                                if (AbsHasDrop)
1240
                                                                        {
1241
                                                                        if (CurY > maxDY)
1242
                                                                                {
1243
                                                                                AbsHasDrop = false;
1244
                                                                                CurX = ColBound.x();
1245
                                                                                }
1246
                                                                        else
1247
                                                                                CurX = maxDX;
1248
                                                                        }
1249
                                                                else
1250
                                                                        CurX = ColBound.x();
138 Franz 1251
                                                                if (hl->ch != QChar(13))
1252
                                                                        CurX += Doc->Vorlagen[hl->cab].Indent;
1253
                                                                else
1254
                                                                        {
1255
                                                                        CurY += Doc->Vorlagen[hl->cab].Anach;
1256
                                                                        if (BuPos3 > 0)
1257
                                                                                BuPos3 -= 1;
1258
                                                                        }
1259
                                                                }
68 Franz 1260
                                                        }
1261
                                                hl->xp = CurX;
1262
                                                hl->yp = CurY;
1263
                                                LiList.at(LiList.count()-1)->xco = hl->xp;
1264
                                                LiList.at(LiList.count()-1)->yco = hl->yp;
1265
                                                for (uint zc = 0; zc<BuPos3; ++zc)
1266
                                                        {
3 paul 1267
                                                        Zli2 = LiList.at(zc);
251 Franz 1268
                                                        Ptext.at(startLin+zc)->xp = Zli2->xco;
1269
                                                        Ptext.at(startLin+zc)->yp = Zli2->yco;
68 Franz 1270
                                                        if (Zli2->Farb != "None")
1271
                                                                {
1272
                                                                SetFarbe(&tmp, Zli2->Farb, Zli2->shade);
1273
                                                                p->setBrush(tmp);
1274
                                                                }
222 Franz 1275
                                                        if ((((Zli2->Sele) && (Select)) || (((NextBox != 0) || (BackBox != 0)) && (Zli2->Sele))) && (Doc->AppMode == 7))
3 paul 1276
                                                                {
1277
                                                                wide = Zli2->wide;
111 Franz 1278
                                                                desc = static_cast<int>((*Doc->AllFonts)[Zli2->ZFo]->numDescender * (-Zli2->Siz / 10.0));
1279
                                                                asce = static_cast<int>((*Doc->AllFonts)[Zli2->ZFo]->numAscent * (Zli2->Siz / 10.0));
68 Franz 1280
                                                                p->setFillMode(1);
163 Franz 1281
                                                                p->setBrush(darkBlue);
266 Franz 1282
                                                                p->setLineWidth(0);
3 paul 1283
                                                                if (!Doc->RePos)
163 Franz 1284
                                                                        p->drawRect(Zli2->xco, Zli2->yco-asce, wide+1, asce+desc);
68 Franz 1285
                                                                p->setBrush(white);
3 paul 1286
                                                                }
266 Franz 1287
                                                        if (Zli2->Farb2 != "None")
1288
                                                                {
1289
                                                                SetFarbe(&tmp, Zli2->Farb2, Zli2->shade2);
1290
                                                                p->setPen(tmp, 1, SolidLine, FlatCap, MiterJoin);
1291
                                                                }
68 Franz 1292
                                                        if (!Doc->RePos)
3 paul 1293
                                                                {
87 Franz 1294
                                                                if (e.intersects(pf.xForm(QRect(qRound(Zli2->xco),qRound(Zli2->yco-LineSp), qRound(Zli2->wide+1), qRound(LineSp)))))
68 Franz 1295
                                                                        DrawZeichenS(p, Zli2);
3 paul 1296
                                                                }
1297
                                                        }
1298
                                                LiList.clear();
1299
                                                BuPos = 0;
1300
                                                LastSP = 0;
68 Franz 1301
                                                LastXp = 0;
3 paul 1302
                                                outs = false;
68 Franz 1303
                                                }
1304
                                        }
1305
                                if (Doc->Vorlagen[absa].Ausri != 0)
1306
                                        {
1307
                                        EndX = CurX;
1308
                                        do
3 paul 1309
                                                {
277 Franz 1310
                                                pt1 = QPoint(qRound(EndX+RExtra), static_cast<int>(CurY+desc));
1311
                                                pt2 = QPoint(qRound(EndX+RExtra), static_cast<int>(ceil(CurY-asce)));
68 Franz 1312
                                                EndX++;
1313
                                                }
209 Franz 1314
                                        while ((cl.contains(pf2.xForm(pt1))) && (cl.contains(pf2.xForm(pt2))) && (EndX+RExtra+lineCorr < ColBound.y()));
68 Franz 1315
                                        if (Doc->Vorlagen[absa].Ausri == 2)
277 Franz 1316
                                                OFs = EndX - CurX;
68 Franz 1317
                                        if (Doc->Vorlagen[absa].Ausri == 1)
277 Franz 1318
                                                OFs = (EndX - CurX) / 2;
68 Franz 1319
                                        if (Doc->Vorlagen[absa].Ausri == 3)
1320
                                                OFs = 0;
1321
                                        if (Doc->Vorlagen[absa].Ausri == 4)
1322
                                                {
1323
                                                aSpa = 0;
1324
                                                for (uint sof = 0; sof<LiList.count(); ++sof)
3 paul 1325
                                                        {
161 Franz 1326
                                                        if ((LiList.at(sof)->Zeich == QChar(32)) || (LiList.at(sof)->Zeich == QChar(29)))
68 Franz 1327
                                                                aSpa++;
3 paul 1328
                                                        }
68 Franz 1329
                                                if (aSpa != 0)
3 paul 1330
                                                        {
277 Franz 1331
                                                        OFs2 = (EndX - CurX) / aSpa;
3 paul 1332
                                                        }
68 Franz 1333
                                                else
1334
                                                        OFs2 = 0;
1335
                                                OFs = 0;
1336
                                                for (uint yof = 0; yof < LiList.count(); ++yof)
57 Franz 1337
                                                        {
68 Franz 1338
                                                        LiList.at(yof)->xco += OFs;
161 Franz 1339
                                                        if ((LiList.at(yof)->Zeich == QChar(32)) || (LiList.at(yof)->Zeich == QChar(29)))
68 Franz 1340
                                                                OFs += OFs2;
57 Franz 1341
                                                        }
3 paul 1342
                                                }
1343
                                        else
1344
                                                {
68 Franz 1345
                                                for (uint xof = 0; xof<LiList.count(); ++xof)
3 paul 1346
                                                        {
68 Franz 1347
                                                        LiList.at(xof)->xco += OFs;
3 paul 1348
                                                        }
1349
                                                }
68 Franz 1350
                                        }
1351
                                for (uint zc = 0; zc<LiList.count(); ++zc)
27 Franz 1352
                                        {
68 Franz 1353
                                        Zli2 = LiList.at(zc);
251 Franz 1354
                                        Ptext.at(startLin+zc)->xp = Zli2->xco;
1355
                                        Ptext.at(startLin+zc)->yp = Zli2->yco;
68 Franz 1356
                                        if (Zli2->Farb != "None")
27 Franz 1357
                                                {
68 Franz 1358
                                                SetFarbe(&tmp, Zli2->Farb, Zli2->shade);
1359
                                                p->setBrush(tmp);
27 Franz 1360
                                                }
222 Franz 1361
                                        if ((((Zli2->Sele) && (Select)) || (((NextBox != 0) || (BackBox != 0)) && (Zli2->Sele))) && (Doc->AppMode == 7))
68 Franz 1362
                                                {
1363
                                                wide = Zli2->wide;
203 Franz 1364
                                                desc = qRound((*Doc->AllFonts)[Zli2->ZFo]->numDescender * (-Zli2->Siz / 10.0));
1365
                                                asce = qRound((*Doc->AllFonts)[Zli2->ZFo]->numAscent * (Zli2->Siz / 10.0));
68 Franz 1366
                                                p->setFillMode(1);
209 Franz 1367
                                                p->setBrush(darkBlue);
266 Franz 1368
                                                p->setLineWidth(0);
68 Franz 1369
                                                if (!Doc->RePos)
209 Franz 1370
                                                        p->drawRect(Zli2->xco, Zli2->yco-asce, wide+1, asce+desc);
68 Franz 1371
                                                p->setBrush(white);
1372
                                                }
266 Franz 1373
                                        if (Zli2->Farb2 != "None")
1374
                                                {
1375
                                                SetFarbe(&tmp, Zli2->Farb2, Zli2->shade2);
1376
                                                p->setPen(tmp, 1, SolidLine, FlatCap, MiterJoin);
1377
                                                }
3 paul 1378
                                        if (!Doc->RePos)
1379
                                                {
87 Franz 1380
                                                if (e.intersects(pf.xForm(QRect(qRound(Zli2->xco),qRound(Zli2->yco-LineSp), qRound(Zli2->wide+1), qRound(LineSp)))))
68 Franz 1381
                                                        DrawZeichenS(p, Zli2);
3 paul 1382
                                                }
1383
                                        }
68 Franz 1384
                                LiList.clear();
1385
                                BuPos = 0;
1386
                                LastSP = 0;
1387
                                outs = false;
1388
                                }
1389
                        MaxChars = Ptext.count();
1390
                        Redrawn = true;
209 Franz 1391
                        pf2.end();
68 Franz 1392
                        p->restore();
1393
                        break;
209 Franz 1394
NoRoom: pf2.end();
1395
                                if (NextBox != 0)
212 Franz 1396
                                {
68 Franz 1397
                                        nrc2 = Ptext.count();
1398
                                        for (uint ss=nrc; ss<nrc2; ++ss)
212 Franz 1399
                                        {
68 Franz 1400
                                                NextBox->Ptext.append(Ptext.take(nrc));
212 Franz 1401
                                        }
68 Franz 1402
                                        NextBox->Dirty = true;
1403
                                        if (uint(CPos) > nrc)
212 Franz 1404
                                        {
142 Franz 1405
                                                int nCP = CPos - nrc;
68 Franz 1406
                                                CPos = nrc;
1407
                                                if ((Doc->AppMode == 7) && (Tinput))
212 Franz 1408
                                                {
68 Franz 1409
                                                        OwnPage->Deselect(true);
142 Franz 1410
                                                        NextBox->CPos = QMAX(nCP, 1);
68 Franz 1411
                                                        Doc->ActPage = NextBox->OwnPage;
1412
                                                        NextBox->OwnPage->SelectItemNr(NextBox->ItemNr);
1413
                                                        break;
3 paul 1414
                                                }
212 Franz 1415
                                        }
79 Franz 1416
                                        if (NextBox->OwnPage != OwnPage)
212 Franz 1417
                                        {
231 Franz 1418
                                                if (Doc->RePos)
1419
                                                {
1420
                                                        p->save();
1421
                                                        QPixmap pgPix(1, 1);
1422
                                                        ScPainter *painter = new ScPainter(&pgPix, 1, 1);
1423
                                                        painter->translate(0.5, 0.5);
1424
                                                        NextBox->DrawObj(painter, QRect(0, 0, 1, 1));
1425
                                                        painter->end();
1426
                                                        delete painter;
1427
                                                        p->restore();
1428
                                                }
1429
                                                else
1430
                                                        NextBox->OwnPage->update();
212 Franz 1431
                                        }
79 Franz 1432
                                        else
212 Franz 1433
                                        {
142 Franz 1434
                                                if ((Doc->AppMode == 7) && (Tinput))
1435
                                                        NextBox->OwnPage->RefreshItem(NextBox, true);
1436
                                                else
212 Franz 1437
                                                {
142 Franz 1438
                                                        bool savre = Doc->RePos;
1439
                                                        Doc->RePos = true;
1440
                                                        p->save();
208 Franz 1441
                                                        QPixmap pgPix(1, 1);
1442
                                                        ScPainter *painter = new ScPainter(&pgPix, 1, 1);
1443
                                                        painter->translate(0.5, 0.5);
1444
                                                        NextBox->DrawObj(painter, QRect(0, 0, 1, 1));
1445
                                                        painter->end();
1446
                                                        delete painter;
142 Franz 1447
                                                        p->restore();
1448
                                                        Doc->RePos = savre;
79 Franz 1449
                                                }
3 paul 1450
                                        }
212 Franz 1451
                                }
68 Franz 1452
                                else
212 Franz 1453
                                {
1454
                                        if (!Doc->RePos)
3 paul 1455
                                        {
227 Franz 1456
                                                double scp = QMAX(Doc->Scale, 1);
1457
                                                p->setPen(black, 1 / scp, SolidLine, FlatCap, MiterJoin);
68 Franz 1458
                                                p->setBrush(white);
227 Franz 1459
                                                p->drawRect(Width-16 / scp, Height-16 / scp, 14 / scp, 14 / scp);
1460
                                                p->drawLine(FPoint(Width-16 / scp, Height-16 / scp), FPoint(Width-3 / scp, Height-3 / scp));
1461
                                                p->drawLine(FPoint(Width-16 / scp, Height-3 / scp), FPoint(Width-3 / scp, Height-16 / scp));
3 paul 1462
                                        }
212 Franz 1463
                                }
68 Franz 1464
                                MaxChars = nrc;
1465
                                Redrawn = true;
1466
                                p->restore();
1467
                                break;
1468
                case 8:
1469
                        if (!PoShow)
1470
                                doStroke = false;
1471
                        cl = FlattenPath(PoLine, Segments);
1472
                        CurX = Extra;
1473
                        if (Ptext.count() != 0)
1474
                                CurX += Ptext.at(0)->cextra;
1475
                        zae = 0;
1476
                        wid = sqrt(pow(cl.point(zae+1).x()-cl.point(zae).x(),2)+pow(cl.point(zae+1).y()-cl.point(zae).y(),2));
1477
                        while (wid < 1)
167 Franz 1478
                        {
68 Franz 1479
                                zae++;
97 Franz 1480
                                if (zae > cl.size()-2)
80 Franz 1481
                                {
1482
                                        MaxChars = Ptext.count();
1483
                                        break;
1484
                                }
167 Franz 1485
                                wid = sqrt(pow(cl.point(zae+1).x()-cl.point(zae).x(),2) +
1486
                                                        pow(cl.point(zae+1).y()-cl.point(zae).y(),2));
1487
                        }
68 Franz 1488
                        rota = xy2Deg(cl.point(zae+1).x()-cl.point(zae).x(),cl.point(zae+1).y()-cl.point(zae).y());
1489
                        for (a = 0; a < Ptext.count(); ++a)
167 Franz 1490
                        {
68 Franz 1491
                                CurY = 0;
1492
                                hl = Ptext.at(a);
1493
                                chx = hl->ch;
249 Franz 1494
                                if ((chx == QChar(30)) || (chx == QChar(13)) || (chx == QChar(9)) || (chx == QChar(28)))
68 Franz 1495
                                        continue;
1496
                                chs = hl->csize;
1497
                                SetZeichAttr(hl, &chs, &chx);
1498
                                if (chx == QChar(29))
1499
                                        chx2 = " ";
1500
                                else
1501
                                        chx2 = chx;
1502
                                if (a < Ptext.count()-1)
167 Franz 1503
                                {
68 Franz 1504
                                        if (Ptext.at(a+1)->ch == QChar(29))
1505
                                                chx3 = " ";
1506
                                        else
1507
                                                chx3 = Ptext.at(a+1)->ch;
1508
                                        wide = Cwidth(Doc, hl->cfont, chx2, chs, chx3);
167 Franz 1509
                                }
68 Franz 1510
                                else
1511
                                        wide = Cwidth(Doc, hl->cfont, chx2, chs);
1512
                                wide = wide * (hl->cscale / 100.0);
1513
                                if ((CurX+(wide+hl->cextra)/2) >= wid)
167 Franz 1514
                                {
1515
                                        if (zae < cl.size()-1)
3 paul 1516
                                        {
68 Franz 1517
                                                CurX = CurX - wid;
1518
                                                wid = 0;
1519
                                                EndX = CurX;
1520
                                                do
167 Franz 1521
                                                {
1522
                                                        do
3 paul 1523
                                                        {
68 Franz 1524
                                                                zae++;
97 Franz 1525
                                                                if (zae > cl.size()-2)
167 Franz 1526
                                                                {
97 Franz 1527
                                                                        MaxChars = a+1;
80 Franz 1528
                                                                        break;
3 paul 1529
                                                                }
167 Franz 1530
                                                                wid = sqrt(pow(cl.point(zae+1).x()-cl.point(zae).x(),2)+
1531
                                                                                        pow(cl.point(zae+1).y()-cl.point(zae).y(),2));
1532
                                                                rota = xy2Deg(cl.point(zae+1).x()-cl.point(zae).x(),
1533
                                                                                                cl.point(zae+1).y()-cl.point(zae).y());
1534
                                                        }
68 Franz 1535
                                                        while (wid == 0);
1536
                                                        EndX -= wid;
97 Franz 1537
                                                        if (zae > cl.size()-2)
167 Franz 1538
                                                        {
97 Franz 1539
                                                                MaxChars = a+1;
1540
                                                                break;
3 paul 1541
                                                        }
167 Franz 1542
                                                }
68 Franz 1543
                                                while (wid < EndX);
1544
                                                CurX = EndX + wid;
167 Franz 1545
                                        }
68 Franz 1546
                                        else
167 Franz 1547
                                        {
97 Franz 1548
                                                MaxChars = a+1;
80 Franz 1549
                                                break;
3 paul 1550
                                        }
167 Franz 1551
                                }
97 Franz 1552
                                if (zae > cl.size()-2)
1553
                                        break;
68 Franz 1554
                                p->save();
1555
                                p->translate(cl.point(zae).x()*sc, cl.point(zae).y()*sc);
1556
                                p->rotate(rota);
1557
                                hl->xp = CurX+hl->cextra;
1558
                                hl->yp = CurY+BaseOffs;
1559
                                hl->PtransX = cl.point(zae).x();
1560
                                hl->PtransY = cl.point(zae).y();
1561
                                hl->PRot = rota;
1562
                                Zli = new ZZ;
1563
                                Zli->Zeich = chx;
1564
                                if (hl->ccolor != "None")
167 Franz 1565
                                {
68 Franz 1566
                                        SetFarbe(&tmp, hl->ccolor, hl->cshade);
1567
                                        p->setBrush(tmp);
167 Franz 1568
                                }
68 Franz 1569
                                if (hl->cstroke != "None")
167 Franz 1570
                                {
68 Franz 1571
                                        SetFarbe(&tmp, hl->cstroke, hl->cshade2);
1572
                                        p->setPen(tmp, 1, SolidLine, FlatCap, MiterJoin);
167 Franz 1573
                                }
68 Franz 1574
                                Zli->Farb = hl->ccolor;
1575
                                Zli->Farb2 = hl->cstroke;
1576
                                Zli->shade = hl->cshade;
1577
                                Zli->shade2 = hl->cshade2;
1578
                                Zli->xco = hl->xp;
1579
                                Zli->yco = hl->yp;
1580
                                Zli->Sele = hl->cselect;
1581
                                Zli->Siz = chs;
1582
                                Zli->Style = hl->cstyle;
1583
                                Zli->ZFo = hl->cfont;
1584
                                Zli->wide = wide;
1585
                                Zli->kern = hl->cextra;
1586
                                Zli->scale = hl->cscale;
1587
                                if (!Doc->RePos)
1588
                                        DrawZeichenS(p, Zli);
1589
                                delete Zli;
1590
                                p->restore();
1591
                                p->setZoomFactor(sc);
97 Franz 1592
                                MaxChars = a+1;
68 Franz 1593
                                CurX += wide+hl->cextra;
167 Franz 1594
                        }
68 Franz 1595
                default:
1596
                        break;
167 Franz 1597
        }
68 Franz 1598
        if ((doStroke) && (!Doc->RePos))
167 Franz 1599
        {
1600
                if (Pcolor2 != "None")
68 Franz 1601
                {
1602
                        SetFarbe(&tmp, Pcolor2, Shade2);
236 Franz 1603
                        p->setPen(tmp, Pwidth, PLineArt, PLineEnd, PLineJoin);
68 Franz 1604
                        if (DashValues.count() != 0)
1605
                                p->setDash(DashValues, DashOffset);
167 Franz 1606
                }
68 Franz 1607
                else
1608
                        p->setLineWidth(0);
236 Franz 1609
                if (!isTableItem)
167 Franz 1610
                {
232 Franz 1611
                        p->setupPolygon(&PoLine);
1612
                        if (NamedLStyle == "")
1613
                                p->drawPolyLine();
1614
                        else
1615
                        {
1616
                                multiLine ml = Doc->MLineStyles[NamedLStyle];
1617
                                for (int it = ml.size()-1; it > -1; it--)
1618
                                {
1619
                                        SetFarbe(&tmp, ml[it].Color, ml[it].Shade);
1620
                                        p->setPen(tmp, ml[it].Width,
1621
                                                                         static_cast<PenStyle>(ml[it].Dash),
1622
                                                                         static_cast<PenCapStyle>(ml[it].LineEnd),
1623
                                                                         static_cast<PenJoinStyle>(ml[it].LineJoin));
1624
                                        p->drawPolyLine();
1625
                                }
1626
                        }
1627
                }
167 Franz 1628
        }
68 Franz 1629
        if ((!Tinput) && (!Doc->RePos))
167 Franz 1630
        {
243 Franz 1631
                if ((Frame) && (ScApp->Prefs.FramesShown) && ((PType == 2) || (PType == 4)))
68 Franz 1632
                {
227 Franz 1633
                        double scp = QMAX(Doc->Scale, 1);
1634
                        p->setPen(black, 1 / scp, DotLine, FlatCap, MiterJoin);
68 Franz 1635
                        if ((isBookmark) || (isAnnotation))
227 Franz 1636
                                p->setPen(blue, 1 / scp, DotLine, FlatCap, MiterJoin);
68 Franz 1637
                        if ((BackBox != 0) || (NextBox != 0))
227 Franz 1638
                                p->setPen(red, 1 / scp, SolidLine, FlatCap, MiterJoin);
68 Franz 1639
                        if (Locked)
227 Franz 1640
                                p->setPen(darkRed, 1 / scp, SolidLine, FlatCap, MiterJoin);
68 Franz 1641
                        p->setFillMode(0);
1642
                        p->setupPolygon(&PoLine);
1643
                        p->drawPolyLine();
1644
                }
167 Franz 1645
        }
68 Franz 1646
        Tinput = false;
1647
        FrameOnly = false;
1648
        Dirty = false;
1649
        p->restore();
1650
        pf.end();
1651
}
1652
 
1653
void PageItem::paintObj(QRect e, QPixmap *ppX)
1654
{
1655
        QPainter p;
1656
        if (!Doc->DoDrawing)
167 Franz 1657
        {
68 Franz 1658
                Redrawn = true;
1659
                Tinput = false;
1660
                FrameOnly = false;
1661
                Dirty = false;
1662
                return;
167 Franz 1663
        }
68 Franz 1664
        if (toPixmap)
1665
                p.begin(ppX);
1666
        else
1667
                p.begin(Parent);
1668
        if ((!toPixmap) && (!Doc->RePos))
167 Franz 1669
        {
68 Franz 1670
                if (!e.isEmpty())
1671
                        p.setClipRect(e);
1672
                else
1673
                        p.setClipRect(OwnPage->ViewReg().boundingRect());
167 Franz 1674
        }
68 Franz 1675
        p.translate(static_cast<int>(Xpos*Doc->Scale), static_cast<int>(Ypos*Doc->Scale));
1676
        p.scale(static_cast<double>(Doc->Scale), static_cast<double>(Doc->Scale));
1677
        p.rotate(static_cast<double>(Rot));
3 paul 1678
        if (Sizing)
167 Franz 1679
        {
3 paul 1680
                p.setRasterOp(XorROP);
1681
                p.setBrush(NoBrush);
1682
                p.setPen(QPen(white, 1, DotLine, FlatCap, MiterJoin));
1683
                p.drawRect(0, 0, static_cast<int>(OldB), static_cast<int>(OldH));
1684
                p.drawRect(0, 0, static_cast<int>(Width), static_cast<int>(Height));
1685
                OldB = Width;
1686
                OldH = Height;
167 Franz 1687
        }
3 paul 1688
        if ((!Tinput) && (!Doc->RePos))
167 Franz 1689
        {
243 Franz 1690
                if ((Frame) && (ScApp->Prefs.FramesShown))
3 paul 1691
                {
1692
                        p.setPen(QPen(black, 1, DotLine