Subversion Repositories Scribus

Rev

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