Subversion Repositories Scribus

Rev

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

Rev Author Line No. Line
4430 cbradney 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
3614 cbradney 7
/***************************************************************************
8
                          pageitem.cpp  -  description
9
                             -------------------
10
    begin                : Sat Apr 7 2001
11
    copyright            : (C) 2001 by Franz Schmid
12
    email                : Franz.Schmid@altmuehlnet.de
13
 ***************************************************************************/
14
 
15
/***************************************************************************
16
 *                                                                         *
17
 *   This program is free software; you can redistribute it and/or modify  *
18
 *   it under the terms of the GNU General Public License as published by  *
19
 *   the Free Software Foundation; either version 2 of the License, or     *
20
 *   (at your option) any later version.                                   *
21
 *                                                                         *
22
 ***************************************************************************/
23
 
24
#include "pageitem_textframe.h"
25
#include "pageitem_textframe.moc"
26
#include <qpainter.h>
27
#include <qpen.h>
28
#include <qfont.h>
29
#include <qregion.h>
30
#include <qpoint.h>
31
#include <qfileinfo.h>
32
#include <qdrawutil.h>
33
#include <qbitmap.h>
34
#include <qregexp.h>
35
#include <qmessagebox.h>
36
#include <cmath>
37
#include <cassert>
38
 
3829 cbradney 39
#include "hyphenator.h"
3614 cbradney 40
#include "mpalette.h"
41
#include "page.h"
42
#include "pageitem.h"
43
#include "prefsmanager.h"
44
#include "scpaths.h"
45
#include "scribus.h"
46
#include "scribusstructs.h"
47
#include "scribusdoc.h"
4145 cbradney 48
#include "selection.h"
3614 cbradney 49
#include "undomanager.h"
50
#include "undostate.h"
51
#include "scconfig.h"
4546 subik 52
#include "commonstrings.h"
5087 subik 53
#include "guidemanager.h"
3614 cbradney 54
 
55
#include "util.h"
5291 avox 56
#include "text/nlsconfig.h"
5756 jghali 57
#ifdef HAVE_CAIRO
58
#include <cairo.h>
59
#endif
3614 cbradney 60
 
61
using namespace std;
62
 
63
PageItem_TextFrame::PageItem_TextFrame(ScribusDoc *pa, double x, double y, double w, double h, double w2, QString fill, QString outline)
64
        : PageItem(pa, PageItem::TextFrame, x, y, w, h, w2, fill, outline)
65
{
3829 cbradney 66
        unicodeTextEditMode = false;
67
        unicodeInputCount = 0;
68
        unicodeInputString = "";
3614 cbradney 69
}
70
 
5184 avox 71
 
72
static QRegion itemShape(PageItem* docItem, ScribusView* view, double xOffset, double yOffset)
73
{
74
        QRegion res;
75
        QPainter pp;
76
        pp.begin(view->viewport());
77
        pp.translate(docItem->xPos() - xOffset, docItem->yPos() - yOffset);
78
        pp.rotate(docItem->rotation());
79
        if (docItem->textFlowUsesBoundingBox())
80
        {
81
                QPointArray tcli(4);
82
                tcli.setPoint(0, QPoint(0,0));
83
                tcli.setPoint(1, QPoint(qRound(docItem->width()), 0));
84
                tcli.setPoint(2, QPoint(qRound(docItem->width()), qRound(docItem->height())));
85
                tcli.setPoint(3, QPoint(0, qRound(docItem->height())));
86
                res = QRegion(pp.xForm(tcli));
87
        }
88
        else
89
        {
90
                if ((docItem->textFlowUsesContourLine()) && (docItem->ContourLine.size() != 0))
91
                {
92
                        QValueList<uint> Segs;
93
                        QPointArray Clip2 = FlattenPath(docItem->ContourLine, Segs);
94
                        res = QRegion(pp.xForm(Clip2));
95
                }
96
                else
97
                        res = QRegion(pp.xForm(docItem->Clip));
98
        }
99
        pp.end();
100
        return  res;
101
}
102
 
103
QRegion PageItem_TextFrame::availableRegion(QRegion clip)
104
{
105
        QRegion result = clip;
106
        int LayerLev = m_Doc->layerLevelFromNumber(LayerNr);
107
        uint docItemsCount=m_Doc->Items->count();
108
        if (!isEmbedded)
109
        {
110
                if (!OnMasterPage.isEmpty())
111
                {
5559 avox 112
                        if ((savedOwnPage == -1) || (savedOwnPage >= signed(m_Doc->Pages->count())))
5375 fschmid 113
                                return result;
5184 avox 114
                        Page* Mp = m_Doc->MasterPages.at(m_Doc->MasterNames[OnMasterPage]);
115
                        Page* Dp = m_Doc->Pages->at(savedOwnPage);
116
                        for (uint a = 0; a < m_Doc->MasterItems.count(); ++a)
117
                        {
118
                                PageItem* docItem = m_Doc->MasterItems.at(a);
119
                                int LayerLevItem = m_Doc->layerLevelFromNumber(docItem->LayerNr);
5359 fschmid 120
                                if (((docItem->ItemNr > ItemNr) && (docItem->LayerNr == LayerNr)) || (LayerLevItem > LayerLev) && (m_Doc->layerFlow(docItem->LayerNr)))
5184 avox 121
                                {
5620 jghali 122
                                        if (docItem->textFlowAroundObject())
5184 avox 123
                                        {
124
                                                result = result.subtract(itemShape(docItem, m_Doc->view(),  Mp->xOffset() - Dp->xOffset(), Mp->yOffset() - Dp->yOffset()));
125
                                        }
5387 avox 126
                                }
127
                        } // for all masterItems
5184 avox 128
                        if (!m_Doc->masterPageMode())
129
                        {
130
                                for (uint a = 0; a < docItemsCount; ++a)
131
                                {
132
                                        PageItem* docItem = m_Doc->Items->at(a);
133
                                        Page* Mp = m_Doc->MasterPages.at(m_Doc->MasterNames[OnMasterPage]);
134
                                        Page* Dp = m_Doc->Pages->at(OwnPage);
5620 jghali 135
                                        if ((docItem->textFlowAroundObject()) && (docItem->OwnPage == OwnPage))
5184 avox 136
                                        {
137
                                                result = result.subtract(itemShape(docItem, m_Doc->view(), Mp->xOffset() - Dp->xOffset(), Mp->yOffset() - Dp->yOffset()));
138
                                        }
139
                                } // for all docItems
140
                        } // if (! masterPageMode)
5387 avox 141
                } // if (!OnMasterPage.isEmpty())
5184 avox 142
                else
143
                {
144
                        for (uint a = 0; a < docItemsCount; ++a)
145
                        {
146
                                PageItem* docItem = m_Doc->Items->at(a);
147
                                int LayerLevItem = m_Doc->layerLevelFromNumber(docItem->LayerNr);
5359 fschmid 148
                                if (((docItem->ItemNr > ItemNr) && (docItem->LayerNr == LayerNr)) || (LayerLevItem > LayerLev) && (m_Doc->layerFlow(docItem->LayerNr)))
5184 avox 149
                                {
5620 jghali 150
                                         if (docItem->textFlowAroundObject())
5229 fschmid 151
                                                result = result.subtract(itemShape(docItem, m_Doc->view(), 0, 0));
5387 avox 152
                                }
153
                        } // for all docItems
5184 avox 154
                        } // if(OnMasterPage.isEmpty()          
155
        } // if(!Embedded)
156
        return result;
157
}
158
 
6144 avox 159
 
160
void PageItem_TextFrame::setShadow()
161
{
162
        if (OnMasterPage.isEmpty())
163
                return;
164
//      QString newShadow = m_Doc->masterPageMode() ? QString::number(OwnPage) : OnMasterPage;
165
//      QString newShadow = QString::number(OwnPage);
166
        QString newShadow = m_Doc->masterPageMode() ? OnMasterPage : QString::number(OwnPage);
167
        qDebug(QString("Pageitem_Textframe: shadow %1 ... %2").arg(currentShadow).arg(newShadow));
168
        if (newShadow != currentShadow) {
169
                if (!shadows.contains(newShadow)) {
170
                        if (!shadows.contains(OnMasterPage)) {
171
                                shadows[OnMasterPage] = itemText;
172
                                qDebug(QString("Pageitem_Textframe: shadow itemText->%1").arg(OnMasterPage));
173
                        }
174
                        shadows[newShadow] = shadows[OnMasterPage].copy();
175
                        qDebug(QString("Pageitem_Textframe: shadow %1<-%2").arg(newShadow).arg(OnMasterPage));
176
                }
177
                itemText = shadows[newShadow];
178
                invalid = true;
179
                currentShadow = newShadow;
180
        }
181
        qDebug(QString("Pageitem_Textframe: shadow=%1").arg(itemText.text(0, itemText.length())));
182
}
183
 
5291 avox 184
#ifdef NLS_PROTO
185
#include "text/pageitem_textframe.cpp"
186
#else
187
 
5778 avox 188
static void dumpIt(const ParagraphStyle& pstyle, QString indent = QString("->"))
189
{
190
        qDebug(QString("%6%1/%2 @ %3: %4--%5")
191
                   .arg(pstyle.name())
192
                   .arg(pstyle.parent()? pstyle.parent()->name() : "-")
5850 tsoots 193
                   .arg( (unsigned long int) &pstyle)
5778 avox 194
                   .arg(pstyle.leftMargin())
195
                   .arg(pstyle.rightMargin())
196
                   .arg(indent));
197
        static QString more("  ");
198
        if (pstyle.parent())
199
                dumpIt(*dynamic_cast<const ParagraphStyle*>(pstyle.parent()), more + indent);
200
}
201
 
5390 avox 202
static const bool opticalMargins = true;
203
 
5362 avox 204
void PageItem_TextFrame::layout()
3614 cbradney 205
{
5732 avox 206
        if (BackBox != NULL && BackBox->invalid) {
207
//              qDebug("textframe: len=%d, going back", itemText.length());
208
                dynamic_cast<PageItem_TextFrame*>(BackBox)->layout();
5362 avox 209
                return;
210
        }
6144 avox 211
        else if (!invalid && !OnMasterPage.isEmpty()) {
5732 avox 212
//              qDebug("textframe: len=%d, no relayout", itemText.length());
213
                return;
214
        }
215
//      qDebug(QString("textframe(%1,%2): len=%3, start relayout at %4").arg(Xpos).arg(Ypos).arg(itemText.length()).arg(firstInFrame()));
4320 cbradney 216
        ScribusView* view = m_Doc->view();
5362 avox 217
        QPainter pf2;
218
        PageItem *nextItem;
219
        QPoint pt1, pt2;
220
        FPoint ColBound;
221
        QRegion cm;
5721 avox 222
        uint nrc, startLin;
6144 avox 223
        int aSpa, CurrCol;
224
        double chs, chsd;
5362 avox 225
        uint BuPos, LastSP, MaxText;
5408 avox 226
        double oldCurY, LastXp, EndX, OFs, OFs2, wide, ColWidth, kernVal, RTabX;
5721 avox 227
        QString chstr, chstr2, chstr3;
5362 avox 228
        ScText *hl;
5721 avox 229
        ParagraphStyle style;
5362 avox 230
 
231
        bool outs = false;
232
        bool fBorder = false;
233
        bool RTab = false;
234
        bool goNoRoom = false;
235
        bool goNextColumn = false;
5980 avox 236
        uint StartRT;
5362 avox 237
        int TabCode = 0;
238
        int HyphenCount = 0;
239
        QValueList<ParagraphStyle::TabRecord> tTabValues;
240
        bool DropCmode = false;
241
        bool AbsHasDrop = false;
6143 cbradney 242
        double desc, asce, maxDY, firstDes, desc2, maxDX;
5362 avox 243
        int DropLines;
244
        bool StartOfCol = true;
245
        tTabValues.clear();
246
 
6144 avox 247
        itemText.clearLines();
5980 avox 248
        LineSpec curLine;
249
 
5559 avox 250
/*
5362 avox 251
        for (int xxx=0; xxx<5; ++xxx)
3614 cbradney 252
        {
5362 avox 253
                m_Doc->docParagraphStyles[xxx].setLineSpacingMode(static_cast<ParagraphStyle::LineSpacingMode>(LineSpMode));
254
                m_Doc->docParagraphStyles[xxx].setUseBaselineGrid(LineSpMode == ParagraphStyle::BaselineGridLineSpacing);
255
                m_Doc->docParagraphStyles[xxx].setLineSpacing(LineSp);
5691 avox 256
                m_Doc->docParagraphStyles[xxx].charStyle().fontSize() = m_FontSize;
5362 avox 257
                m_Doc->docParagraphStyles[xxx].setLeftMargin(0);
258
                m_Doc->docParagraphStyles[xxx].setFirstIndent(0);
259
                m_Doc->docParagraphStyles[xxx].setGapBefore(0);
260
                m_Doc->docParagraphStyles[xxx].setGapAfter(0);
261
                m_Doc->docParagraphStyles[xxx].setAlignment(xxx);
262
        }
5559 avox 263
*/
264
 
5778 avox 265
        // dump styles
266
/*     
267
        for (int i=0; i < itemText.nrOfParagraphs(); ++i) {
268
                const ParagraphStyle& pstyle(itemText.paragraphStyle(itemText.endOfParagraph(i)));
269
                qDebug(QString("par %1:").arg(i));
270
                dumpIt(pstyle);
271
        }
272
        qDebug(QString("default:"));
273
        dumpIt(itemText.defaultStyle());
274
        */
275
 
5362 avox 276
        pf2.begin(view->viewport());
277
        pf2.translate(Xpos, Ypos);
278
        pf2.rotate(Rot);
3614 cbradney 279
 
5408 avox 280
        double lineCorr = 0;
5362 avox 281
        if (lineColor() != CommonStrings::None)
282
                lineCorr = m_lineWidth / 2.0;
283
 
6144 avox 284
 
285
        setShadow();
5732 avox 286
        if ((itemText.length() != 0)) // || (NextBox != 0))
5362 avox 287
        {
5721 avox 288
/*              // steal text from next boxes
5362 avox 289
                if (NextBox != 0)
290
                {
291
                        nextItem = NextBox;
292
                        while (nextItem != 0)
3614 cbradney 293
                        {
5387 avox 294
                                nextItem->invalid = true;
5362 avox 295
                                a = nextItem->itemText.count();
296
                                for (uint s=0; s<a; ++s)
297
                                {
298
                                        itemText.append(nextItem->itemText.take(0));
299
                                }
5559 avox 300
//FIXME:av                              nextItem->MaxChars = 0;
5362 avox 301
                                nextItem = nextItem->NextBox;
3614 cbradney 302
                        }
5362 avox 303
                        nextItem = NextBox;
304
                }
5559 avox 305
//              m_Doc->docParagraphStyles[0].setLineSpacing(LineSp);
5721 avox 306
*/             
5362 avox 307
 
5408 avox 308
                // determine layout area
5362 avox 309
                QRegion cl = availableRegion(QRegion(pf2.xForm(Clip)));
310
 
311
                if (imageFlippedH())
312
                {
313
                        pf2.translate(Width, 0);
314
                        pf2.scale(-1, 1);
315
                }
316
                if (imageFlippedV())
317
                {
318
                        pf2.translate(0, Height);
319
                        pf2.scale(1, -1);
320
                }
5408 avox 321
 
5362 avox 322
                CurrCol = 0;
323
                ColWidth = columnWidth();
5408 avox 324
                // ColBound.x() is left border, ColBound.y() is right(!) border
5362 avox 325
                ColBound = FPoint((ColWidth + ColGap) * CurrCol+Extra + lineCorr, ColWidth * (CurrCol+1) + ColGap * CurrCol + Extra+lineCorr);
326
                ColBound = FPoint(ColBound.x(), ColBound.y()+RExtra+lineCorr);
327
                CurX = ColBound.x();
5559 avox 328
                // find start of first line
5721 avox 329
                if (itemText.length() > 0)
5362 avox 330
                {
5721 avox 331
                        hl = itemText.item(0);
332
                        style = itemText.paragraphStyle(0);
5778 avox 333
                        if (style.rightMargin() < 0) {
334
                                qDebug(QString("style pos 0:"));
335
                                dumpIt(style);
336
                        }
5721 avox 337
//                      qDebug(QString("style @0: %1 -- %2, %4/%5 char: %3").arg(style.leftMargin()).arg(style.rightMargin())
338
//                                 .arg(style.charStyle().asString()).arg(style.name()).arg(style.parent()?style.parent()->name():""));
339
                        if (style.hasDropCap())
3614 cbradney 340
                        {
5721 avox 341
                                if (style.useBaselineGrid())
342
                                        chs = qRound(m_Doc->typographicSettings.valueBaseGrid  * style.dropCapLines() * 10);
5362 avox 343
                                else
5721 avox 344
                                        chs = qRound(style.lineSpacing() * style.dropCapLines() * 10);
3614 cbradney 345
                        }
346
                        else
5691 avox 347
                                chs = hl->fontSize();
5980 avox 348
                        desc2 = -hl->font().descent(chs / 10.0);
5362 avox 349
                        CurY = TExtra+lineCorr;
350
                }
5408 avox 351
                else // no dropcap:
5362 avox 352
                {
5980 avox 353
                        desc2 = -m_Doc->currentStyle.charStyle().font().descent(m_Doc->currentStyle.charStyle().fontSize() / 10.0);
5721 avox 354
                        CurY = itemText.paragraphStyle(0).lineSpacing() + TExtra+lineCorr-desc2;
5362 avox 355
                }
356
                firstDes = desc2;
5980 avox 357
//!             LiList.clear();
358
                int itemsInLine = 0;
359
                curLine.firstItem = firstInFrame();
6144 avox 360
                curLine.ascent = 10;
361
                curLine.descent = 0;
5362 avox 362
                BuPos = 0;
363
                LastSP = 0;
364
                LastXp = 0;
365
                outs = false;
366
                OFs = 0;
367
                OFs2 = 0;
368
                aSpa = 0;
369
                MaxChars = 0;
5721 avox 370
                MaxText = itemText.length();
5362 avox 371
                StartOfCol = true;
5721 avox 372
                for (int a = firstInFrame(); a < itemText.length(); ++a)
5362 avox 373
                {
5721 avox 374
                        hl = itemText.item(a);
375
                        style = itemText.paragraphStyle(a);
6144 avox 376
                        const CharStyle& charStyle = itemText.charStyle(a);
377
//                      qDebug(QString("charstyle pos %1: %2 (%3)").arg(a).arg(charStyle.asString()).arg(charStyle.fontSize()));
5778 avox 378
                        if (style.rightMargin() < 0) {
379
                                qDebug(QString("style pos %1:").arg(a));
380
                                dumpIt(style);
381
                                dumpIt(itemText.paragraphStyle(a));
382
                        }
5721 avox 383
//                      qDebug(QString("style @%6: %1 -- %2, %4/%5 char: %3").arg(style.leftMargin()).arg(style.rightMargin())
384
//                                 .arg(style.charStyle().asString()).arg(style.name()).arg(style.parent()?style.parent()->name():"")
385
//                                 .arg(a));
386
 
6144 avox 387
//                      chstr = hl->ch;
388
//                      if (hl->ch == QChar(30)) // pagenumber
389
                        chstr = ExpandToken(a);
390
//                      qDebug(QString("expanded token: '%1'").arg(chstr));
391
                        if (chstr.isEmpty())
392
                                continue;
5721 avox 393
                        if (style.lineSpacingMode() == ParagraphStyle::AutomaticLineSpacing)
6144 avox 394
                                style.setLineSpacing(charStyle.font().height(charStyle.fontSize() / 10.0));
5408 avox 395
                        // find out about par gap and dropcap
5721 avox 396
                        if (a == firstInFrame())
3614 cbradney 397
                        {
5362 avox 398
                                if (BackBox != 0)
399
                                {
400
                                        nextItem = BackBox;
401
                                        while (nextItem != 0)
402
                                        {
5721 avox 403
                                                if (nextItem->frameDisplays(a-1))
5362 avox 404
                                                {
5721 avox 405
                                                        if (nextItem->itemText.text(a-1) == SpecialChars::PARSEP)
5362 avox 406
                                                        {
5721 avox 407
                                                                CurY += style.gapBefore();
408
                                                                if (chstr != SpecialChars::PARSEP)
5362 avox 409
                                                                {
5721 avox 410
                                                                        DropCmode = style.hasDropCap();
5362 avox 411
                                                                        if (DropCmode)
5721 avox 412
                                                                                DropLines = style.dropCapLines();
5362 avox 413
                                                                }
414
                                                                else
415
                                                                        DropCmode = false;
416
                                                                break;
417
                                                        }
418
                                                        else
419
                                                                break;
420
                                                }
421
                                                nextItem = nextItem->BackBox;
422
                                        }
423
                                }
424
                                else
425
                                {
5721 avox 426
                                        if (chstr != SpecialChars::PARSEP)
5362 avox 427
                                        {
5721 avox 428
                                                DropCmode = style.hasDropCap();
5362 avox 429
                                                if (DropCmode)
5721 avox 430
                                                        DropLines = style.dropCapLines();
5362 avox 431
                                        }
432
                                        else
433
                                                DropCmode = false;
5721 avox 434
                                        CurY += style.gapBefore();
5362 avox 435
                                }
3614 cbradney 436
                        }
5691 avox 437
                        {
438
                                StyleFlag fl = hl->effects();
439
                                fl &= ~ScStyle_DropCap;
440
                                fl &= ~ScStyle_SmartHyphenVisible;
441
                                hl->setEffects(fl);
442
                        }
5408 avox 443
                        // No space at begin of line
5412 avox 444
                        if ( //((m_Doc->docParagraphStyles[absa].alignment() == 3) || (m_Doc->docParagraphStyles[absa].alignment() == 4)) && 
5980 avox 445
                                 (itemsInLine == 0) && (hl->ch == " "))
3614 cbradney 446
                        {
5691 avox 447
                                hl->setEffects(hl->effects() | ScStyle_SuppressSpace);
6144 avox 448
                                hl->glyph.xadvance = 0;
5362 avox 449
                                continue;
450
                        }
451
                        else
5691 avox 452
                                hl->setEffects(hl->effects() & ~ScStyle_SuppressSpace);
453
 
6144 avox 454
//                      qDebug(QString("textframe(%1,%2): len=%3, fontsize=%4, ascent=%5").arg(Xpos).arg(Ypos).arg(itemText.length())
455
//                                         .arg(charStyle.fontSize()).arg(charStyle.font().ascent()));                          
5980 avox 456
                        if (itemsInLine == 0)
5362 avox 457
                        {
5732 avox 458
                                // more about par gap and dropcaps
5721 avox 459
                                if (((a > firstInFrame()) && (itemText.text(a-1) == SpecialChars::PARSEP)) || ((a == 0) && (BackBox == 0)) && (!StartOfCol))
3614 cbradney 460
                                {
5721 avox 461
                                        CurY += style.gapBefore();
462
                                        if (chstr != SpecialChars::PARSEP)
463
                                                DropCmode = style.hasDropCap();
5362 avox 464
                                        else
465
                                                DropCmode = false;
466
                                        if (DropCmode)
467
                                        {
5721 avox 468
                                                DropLines = style.dropCapLines();
469
                                                if (style.useBaselineGrid())
5362 avox 470
                                                        CurY += m_Doc->typographicSettings.valueBaseGrid * (DropLines-1);
471
                                                else
472
                                                {
5721 avox 473
                                                        if (style.lineSpacingMode() == ParagraphStyle::FixedLineSpacing)
474
                                                                CurY += style.lineSpacing() * (DropLines-1);
5362 avox 475
                                                        else
6144 avox 476
                                                                CurY += charStyle.font().height(style.charStyle().fontSize() / 10.0) * (DropLines-1);
5362 avox 477
                                                }
478
                                        }
3614 cbradney 479
                                }
5362 avox 480
                        }
5408 avox 481
                        // find charsize & y pos
5362 avox 482
                        if (DropCmode)
483
                        {
5408 avox 484
                                // dropcap active?
5721 avox 485
                                if (style.useBaselineGrid())
3614 cbradney 486
                                {
6144 avox 487
                                        chsd = (10 * ((m_Doc->typographicSettings.valueBaseGrid * (DropLines-1)+(charStyle.font().ascent(style.charStyle().fontSize() / 10.0))) / (charStyle.font().realCharHeight(chstr[0], 1))));
488
                                        chs = (10 * ((m_Doc->typographicSettings.valueBaseGrid * (DropLines-1)+(charStyle.font().ascent(style.charStyle().fontSize() / 10.0))) / charStyle.font().realCharAscent(chstr[0], 1)));
3614 cbradney 489
                                }
5362 avox 490
                                else
3614 cbradney 491
                                {
5721 avox 492
                                        if (style.lineSpacingMode() == ParagraphStyle::FixedLineSpacing)
5362 avox 493
                                        {
6144 avox 494
                                                chsd = (10 * ((style.lineSpacing() * (DropLines-1)+(charStyle.font().ascent(style.charStyle().fontSize() / 10.0))) / (charStyle.font().realCharHeight(chstr[0], 1))));
495
                                                chs = (10 * ((style.lineSpacing() * (DropLines-1)+(charStyle.font().ascent(style.charStyle().fontSize() / 10.0))) / charStyle.font().realCharAscent(chstr[0], 1)));
5184 avox 496
                                        }
3614 cbradney 497
                                        else
498
                                        {
6144 avox 499
                                                double currasce = charStyle.font().height(style.charStyle().fontSize() / 10.0);
500
                                                chsd = (10 * ((currasce * (DropLines-1)+(charStyle.font().ascent(style.charStyle().fontSize() / 10.0))) / (charStyle.font().realCharHeight(chstr[0], 1))));
501
                                                chs = (10 * ((currasce * (DropLines-1)+(charStyle.font().ascent(style.charStyle().fontSize() / 10.0))) / charStyle.font().realCharAscent(chstr[0], 1)));
3614 cbradney 502
                                        }
5362 avox 503
                                }
5691 avox 504
                                hl->setEffects(hl->effects() | ScStyle_DropCap);
5362 avox 505
                        }
5408 avox 506
                        else // ! dropCapMode
5362 avox 507
                        {
5387 avox 508
                                if ((hl->ch == SpecialChars::OBJECT) && (hl->cembedded != 0))
5362 avox 509
                                        chs = qRound((hl->cembedded->gHeight + hl->cembedded->lineWidth()) * 10);
510
                                else
6144 avox 511
                                        chs = charStyle.fontSize();
5362 avox 512
                        }
5408 avox 513
                        // Smallcaps and such
6144 avox 514
                        hl->glyph.yadvance = 0;
5980 avox 515
                        oldCurY = layoutGlyphs(*hl, chstr, hl->glyph);
5408 avox 516
                        // some special cases TODO: move to ScFace
6144 avox 517
//                      if (chstr == SpecialChars::NBSPACE)
518
//                              chstr2 = " ";
519
//                      else if (chstr == SpecialChars::NBHYPHEN)
520
//                              chstr2 = "-";
521
//                      else
5721 avox 522
                                chstr2 = chstr;
5408 avox 523
                        // find out width of char
5387 avox 524
                        if ((hl->ch == SpecialChars::OBJECT) && (hl->cembedded != 0))
5362 avox 525
                                wide = hl->cembedded->gWidth + hl->cembedded->lineWidth();
526
                        else
527
                        {
5980 avox 528
                                if (a+1 < itemText.length())
5362 avox 529
                                {
6144 avox 530
//                                      if (itemText.text(a+1) == SpecialChars::NBSPACE)
531
//                                              chstr3 = " ";
532
//                                      else if (itemText.text(a+1) == SpecialChars::NBHYPHEN)
533
//                                              chstr3 = "-";
534
//                                      else
535
                                                chstr3 = itemText.text(a+1);
5408 avox 536
                                        // apply kerning
6144 avox 537
                                        wide = charStyle.font().charWidth(chstr2[0], chs / 10.0, chstr3[0]);
5362 avox 538
                                }
539
                                else
6144 avox 540
                                        wide = charStyle.font().charWidth(chstr2[0], chs / 10.0);
5362 avox 541
                        }
542
                        if (DropCmode)
543
                        {
5408 avox 544
                                // drop caps are wider...
5387 avox 545
                                if ((hl->ch == SpecialChars::OBJECT) && (hl->cembedded != 0))
5362 avox 546
                                {
547
                                        wide = hl->cembedded->gWidth + hl->cembedded->lineWidth();
5721 avox 548
                                        if (style.useBaselineGrid())
5362 avox 549
                                                asce = m_Doc->typographicSettings.valueBaseGrid * DropLines;
550
                                        else
3614 cbradney 551
                                        {
5721 avox 552
                                                if (style.lineSpacingMode() == ParagraphStyle::FixedLineSpacing)
553
                                                        asce = style.lineSpacing() * DropLines;
5362 avox 554
                                                else
6144 avox 555
                                                        asce = charStyle.font().height(style.charStyle().fontSize() / 10.0) * DropLines;
3614 cbradney 556
                                        }
6144 avox 557
                                        hl->glyph.scaleH /= hl->glyph.scaleV;
558
                                        hl->glyph.scaleV = (asce / (hl->cembedded->gHeight + hl->cembedded->lineWidth()));
559
                                        hl->glyph.scaleH *= hl->glyph.scaleV;
5362 avox 560
                                }
561
                                else
562
                                {
6144 avox 563
                                        wide = charStyle.font().realCharWidth(chstr2[0], chsd / 10.0);
564
                                        asce = charStyle.font().realCharHeight(chstr2[0], chsd / 10.0);
565
                                        qDebug(QString("dropcaps pre: chsd=%1 realCharHeight = %2 chstr=%3").arg(chsd).arg(asce).arg(chstr2[0]));
566
                                        hl->glyph.scaleH /= hl->glyph.scaleV;
567
                                        hl->glyph.scaleV = (asce / charStyle.font().ascent(charStyle.fontSize() / 10.0));
568
                                        hl->glyph.scaleH *= hl->glyph.scaleV;
5362 avox 569
                                }
570
                                desc2 = 0;
571
                                desc = 0;
572
                        }
573
                        else
574
                        {
6144 avox 575
//                              qDebug(QString("textframe ascent/descent: fontsize=%1, ascent=%2, descent=%3")
576
//                                         .arg(charStyle.fontSize()).arg(charStyle.font().ascent()).arg(charStyle.font().descent()));                          
5408 avox 577
                                // find ascent / descent
6144 avox 578
                                double hlcsize10=charStyle.fontSize() / 10.0;
5408 avox 579
                                if ((hl->ch == SpecialChars::OBJECT) && (hl->cembedded != 0))
5362 avox 580
                                {
581
                                        desc = desc2 = 0;
582
                                }
583
                                else
584
                                {
6144 avox 585
                                        desc = desc2 = -charStyle.font().descent(hlcsize10);
5362 avox 586
                                }
6144 avox 587
                                asce = charStyle.font().ascent(hlcsize10);
588
                                wide = wide * hl->glyph.scaleH;
5362 avox 589
                        }
590
                        fBorder = false;
5408 avox 591
                        // end of col reached?
6144 avox 592
//                      qDebug(QString("eocol? %1 + %2 + %3 > %4 -- asce=%5").arg(CurY).arg(BExtra).arg(lineCorr).arg(Height).arg(asce));
5362 avox 593
                        if (CurY+BExtra+lineCorr > Height)
594
                        {
595
                                StartOfCol = true;
596
                                CurrCol++;
597
                                if (CurrCol < Cols)
598
                                {
5408 avox 599
                                        // start next col
5362 avox 600
                                        ColWidth = columnWidth();
601
                                        ColBound = FPoint((ColWidth + ColGap) * CurrCol + Extra+lineCorr, ColWidth * (CurrCol+1) + ColGap * CurrCol + Extra+lineCorr);
602
                                        CurX = ColBound.x();
603
                                        ColBound = FPoint(ColBound.x(), ColBound.y()+RExtra+lineCorr);
604
                                        CurY = asce+TExtra+lineCorr+1;
5721 avox 605
                                        if (((a > firstInFrame()) && (itemText.text(a-1) == SpecialChars::PARSEP))
606
                                                || ((a == firstInFrame()) && (BackBox == 0)))
3614 cbradney 607
                                        {
5721 avox 608
                                                if (chstr != SpecialChars::PARSEP)
609
                                                        DropCmode = style.hasDropCap();
3614 cbradney 610
                                                else
5362 avox 611
                                                        DropCmode = false;
612
                                                if (DropCmode)
3614 cbradney 613
                                                {
5721 avox 614
                                                        if (style.useBaselineGrid())
6144 avox 615
                                                                desc2 = -charStyle.font().descent() * m_Doc->typographicSettings.valueBaseGrid * style.dropCapLines();
3614 cbradney 616
                                                        else
6144 avox 617
                                                                desc2 = -charStyle.font().descent() * style.lineSpacing() * style.dropCapLines();
3614 cbradney 618
                                                }
5362 avox 619
                                                if (DropCmode)
5721 avox 620
                                                        DropLines = style.dropCapLines();
3614 cbradney 621
                                        }
5721 avox 622
                                        if (style.useBaselineGrid())
3614 cbradney 623
                                        {
5362 avox 624
                                                double by = Ypos;
625
                                                if (OwnPage != -1)
626
                                                        by = Ypos - m_Doc->Pages->at(OwnPage)->yOffset();
627
                                                int ol1 = qRound((by + CurY - m_Doc->typographicSettings.offsetBaseGrid) * 10000.0);
628
                                                int ol2 = static_cast<int>(ol1 / m_Doc->typographicSettings.valueBaseGrid);
629
                                                CurY = ceil(  ol2 / 10000.0 ) * m_Doc->typographicSettings.valueBaseGrid + m_Doc->typographicSettings.offsetBaseGrid - by;
3614 cbradney 630
                                        }
5362 avox 631
                                }
632
                                else
633
                                {
634
                                        nrc = a;
6144 avox 635
//                                      qDebug(QString("no room A: %1").arg(a));
5362 avox 636
                                        goto NoRoom;
637
                                }
638
                        }
5408 avox 639
                        // ok, there's more room in col
5980 avox 640
                        if (itemsInLine == 0)
5362 avox 641
                        {
6144 avox 642
//                              qDebug(QString("newline: '%1' %2 %3").arg(a).arg(CurY).arg(asce));
5408 avox 643
                                // start a new line
5362 avox 644
                                startLin = a;
645
                                double TopOffset = asce;
646
                                double BotOffset = desc2;
647
                                goNoRoom = false;
5408 avox 648
                                // ??? AV
5362 avox 649
                                bool specialCase = false;
650
                                if (StartOfCol)
651
                                {
6144 avox 652
//                                      qDebug(QString("StartOfCol: %1 + %2 + %3").arg(asce).arg(TExtra).arg(lineCorr));
5362 avox 653
                                        CurY = asce+TExtra+lineCorr+1;
5408 avox 654
//                                                      if (((a > 0) && (itemText.at(a-1)->ch == QChar(13))) || ((a == 0) && (BackBox == 0)))
655
//                                                              CurY += m_Doc->docParagraphStyles[hl->cab].gapBefore;
5362 avox 656
                                }
5721 avox 657
                                if (style.useBaselineGrid())
5362 avox 658
                                {
659
                                        double by = Ypos;
660
                                        if (OwnPage != -1)
661
                                                by = Ypos - m_Doc->Pages->at(OwnPage)->yOffset();
662
                                        int ol1 = qRound((by + CurY - m_Doc->typographicSettings.offsetBaseGrid) * 10000.0);
663
                                        int ol2 = static_cast<int>(ol1 / m_Doc->typographicSettings.valueBaseGrid);
6144 avox 664
//                                      qDebug(QString("useBaselIneGrid: %1 * %2 + %3 - %4").arg(ol2 / 10000.0).arg(m_Doc->typographicSettings.valueBaseGrid).arg(m_Doc->typographicSettings.offsetBaseGrid).arg(by));
5362 avox 665
                                        CurY = ceil(  ol2 / 10000.0 ) * m_Doc->typographicSettings.valueBaseGrid + m_Doc->typographicSettings.offsetBaseGrid - by;
666
                                }
667
                                if (CurY-TopOffset < 0.0)
668
                                        CurY = TopOffset+1;
5408 avox 669
                                // find linelength:
5362 avox 670
                                pt1 = QPoint(static_cast<int>(ceil(CurX-Extra)), static_cast<int>(CurY+BotOffset));
671
                                pt2 = QPoint(static_cast<int>(ceil(CurX-Extra)), static_cast<int>(ceil(CurY-TopOffset)));
672
 
673
                                if ((!cl.contains(pf2.xForm(pt1))) || (!cl.contains(pf2.xForm(pt2))))
674
                                {
675
                                        specialCase = true;
676
                                        CurX -= Extra;
677
                                }
678
                                pt1 = QPoint(static_cast<int>(ceil(CurX)), static_cast<int>(CurY+BotOffset));
679
                                pt2 = QPoint(static_cast<int>(ceil(CurX)), static_cast<int>(ceil(CurY-TopOffset)));
5408 avox 680
                                // increase pt1/pt2 until i-beam reaches end of line
5362 avox 681
                                while ((!cl.contains(pf2.xForm(pt1))) || (!cl.contains(pf2.xForm(pt2))))
682
                                {
683
                                        fBorder = true;
684
                                        CurX++;
5721 avox 685
                                        if (CurX+RExtra+lineCorr > ColBound.y() - style.rightMargin())
3614 cbradney 686
                                        {
6144 avox 687
//                                              qDebug(QString("eocol %5? %1 + %2 + %3 + %4").arg(CurY).arg(StartOfCol).arg(style.useBaselineGrid()).arg(style.lineSpacing()).arg(CurrCol));
5408 avox 688
                                                // new line
5362 avox 689
                                                fBorder = false;
690
                                                if (StartOfCol)
3614 cbradney 691
                                                {
5362 avox 692
                                                        CurX = ColBound.x();
693
                                                        CurY++;
3614 cbradney 694
                                                }
5362 avox 695
                                                else
3614 cbradney 696
                                                {
5721 avox 697
                                                        CurY += style.lineSpacing();
5362 avox 698
                                                        CurX = ColBound.x();
3614 cbradney 699
                                                }
5721 avox 700
                                                if (style.useBaselineGrid())
3614 cbradney 701
                                                {
5362 avox 702
                                                        double by = Ypos;
703
                                                        if (OwnPage != -1)
704
                                                                by = Ypos - m_Doc->Pages->at(OwnPage)->yOffset();
705
                                                        int ol1 = qRound((by + CurY - m_Doc->typographicSettings.offsetBaseGrid) * 10000.0);
706
                                                        int ol2 = static_cast<int>(ol1 / m_Doc->typographicSettings.valueBaseGrid);
707
                                                        CurY = ceil(  ol2 / 10000.0 ) * m_Doc->typographicSettings.valueBaseGrid + m_Doc->typographicSettings.offsetBaseGrid - by;
708
                                                }
709
                                                if (CurY+BExtra+lineCorr > Height)
710
                                                {
711
                                                        StartOfCol = true;
712
                                                        fBorder = false;
713
                                                        CurrCol++;
714
                                                        if (CurrCol < Cols)
3614 cbradney 715
                                                        {
5362 avox 716
                                                                ColWidth = columnWidth();
717
                                                                ColBound = FPoint((ColWidth + ColGap) * CurrCol + Extra+lineCorr, ColWidth * (CurrCol+1) + ColGap * CurrCol + Extra+lineCorr);
718
                                                                CurX = ColBound.x();
719
                                                                ColBound = FPoint(ColBound.x(), ColBound.y()+RExtra+lineCorr);
720
                                                                CurY = asce+TExtra+lineCorr+1;
5721 avox 721
                                                                if (((a > firstInFrame()) && (itemText.text(a-1) == SpecialChars::PARSEP)) || ((a == firstInFrame()) && (BackBox == 0)))
3614 cbradney 722
                                                                {
5721 avox 723
                                                                        if (chstr != SpecialChars::PARSEP)
724
                                                                                DropCmode = style.hasDropCap();
3614 cbradney 725
                                                                        else
5362 avox 726
                                                                                DropCmode = false;
727
                                                                        if (DropCmode)
728
                                                                        {
5721 avox 729
                                                                                if (style.useBaselineGrid())
6144 avox 730
                                                                                        desc2 = -charStyle.font().descent() * m_Doc->typographicSettings.valueBaseGrid * style.dropCapLines();
5362 avox 731
                                                                                else
6144 avox 732
                                                                                        desc2 = -charStyle.font().descent() * style.lineSpacing() * style.dropCapLines();
5362 avox 733
                                                                        }
734
                                                                        if (DropCmode)
5721 avox 735
                                                                                DropLines = style.dropCapLines();
3614 cbradney 736
                                                                }
5721 avox 737
                                                                if (style.useBaselineGrid())
3614 cbradney 738
                                                                {
5362 avox 739
                                                                        double by = Ypos;
740
                                                                        if (OwnPage != -1)
741
                                                                                by = Ypos - m_Doc->Pages->at(OwnPage)->yOffset();
742
                                                                        int ol1 = qRound((by + CurY - m_Doc->typographicSettings.offsetBaseGrid) * 10000.0);
743
                                                                        int ol2 = static_cast<int>(ol1 / m_Doc->typographicSettings.valueBaseGrid);
744
                                                                        CurY = ceil(  ol2 / 10000.0 ) * m_Doc->typographicSettings.valueBaseGrid + m_Doc->typographicSettings.offsetBaseGrid - by;
3614 cbradney 745
                                                                }
746
                                                        }
747
                                                        else
5362 avox 748
                                                        {
749
                                                                nrc = a;
6144 avox 750
//                                                              qDebug(QString("no room B: %1").arg(a));
5362 avox 751
                                                                goto NoRoom;
752
                                                        }
3614 cbradney 753
                                                }
5362 avox 754
                                        }
755
                                        pt1 = QPoint(static_cast<int>(ceil(CurX)), static_cast<int>(CurY+BotOffset));
756
                                        pt2 = QPoint(static_cast<int>(ceil(CurX)), static_cast<int>(ceil(CurY-TopOffset)));
757
                                }
5408 avox 758
 
5362 avox 759
                                if (((fBorder)) && (!AbsHasDrop))
760
                                        CurX += Extra;
5408 avox 761
                                // indent first line of par
5362 avox 762
                                if (a > 0)
763
                                {
5721 avox 764
                                        if (itemText.text(a-1) == SpecialChars::PARSEP)
765
                                                CurX += style.firstIndent();
5362 avox 766
                                }
767
                                else
768
                                {
769
                                        if (BackBox == 0)
5721 avox 770
                                                CurX += style.firstIndent();
5362 avox 771
                                        else
772
                                        {
5721 avox 773
                                                if (BackBox->frameDisplays(firstInFrame()-1))
3614 cbradney 774
                                                {
5721 avox 775
                                                        if (BackBox->itemText.text(BackBox->lastInFrame()) == SpecialChars::PARSEP)
776
                                                                CurX += style.firstIndent();
3614 cbradney 777
                                                }
5362 avox 778
                                                else
5721 avox 779
                                                        CurX += style.firstIndent();
3614 cbradney 780
                                        }
781
                                }
5408 avox 782
                                // add left margin
5362 avox 783
                                if (!AbsHasDrop)
5721 avox 784
                                        CurX += style.leftMargin();
5390 avox 785
                                if (opticalMargins) {
5980 avox 786
                                        double chs = itemText.charStyle(a).fontSize() * (itemText.charStyle(a).scaleH() / 1000.0);
787
                                        double leftCorr = itemText.charStyle(a).font().realCharWidth(itemText.text(a), chs / 10.0);
5412 avox 788
                                        if (QString("'´`").find(itemText.text(a)) >= 0
789
                                                || itemText.text(a) == QChar(0x2018)
790
                                                || itemText.text(a) == QChar(0x2019)
791
                                                || itemText.text(a) == QChar(0x201a)
792
                                                || itemText.text(a) == QChar(0x201b)
793
                                                || itemText.text(a) == QChar(0x2039)
794
                                                || itemText.text(a) == QChar(0x203a)
795
                                                )
5391 avox 796
                                                leftCorr *= -0.7;
5412 avox 797
                                        else if (QString("\"").find(itemText.text(a)) >= 0
798
                                                         || itemText.text(a) == QChar(0x00ab)
799
                                                         || itemText.text(a) == QChar(0x00bb)
800
                                                         || itemText.text(a) == QChar(0x201c)
801
                                                         || itemText.text(a) == QChar(0x201d)
802
                                                         || itemText.text(a) == QChar(0x201e)
803
                                                         || itemText.text(a) == QChar(0x201f)
804
                                                         )
5391 avox 805
                                                leftCorr *= -0.5;
5390 avox 806
                                        else {
5991 avox 807
                                                leftCorr = itemText.charStyle(a).font().charWidth(QChar(' '), chs / 10.0, itemText.text(a));
808
                                                leftCorr -= itemText.charStyle(a).font().charWidth(QChar(' '), chs / 10.0);
809
                //                              double leftCorr2 = itemText.charStyle(a).font().charWidth(QChar('K'), chs / 10.0, itemText.text(a));
810
                //                              leftCorr2 -= itemText.charStyle(a).font().charWidth(QChar('K'), chs / 10.0);
811
                //                              leftCorr = QMIN(leftCorr, leftCorr2);
5390 avox 812
                                        }
813
                                        CurX += leftCorr;
814
                                }
6144 avox 815
                                curLine.x = CurX;
816
                                curLine.y = CurY;
5362 avox 817
                                fBorder = false;
818
                        }
6144 avox 819
                        else {
820
//                              qDebug(QString("cont.' line: '%1'").arg(a));
821
                        }
5408 avox 822
                        // right tab stuff
5362 avox 823
                        if (RTab)
824
                        {
5387 avox 825
                                if (((hl->ch == ".") && (TabCode == 2)) || ((hl->ch == ",") && (TabCode == 3)) || (hl->ch == SpecialChars::TAB))
5362 avox 826
                                {
827
                                        RTab = false;
828
                                        TabCode = 0;
3614 cbradney 829
                                }
830
                        }
5408 avox 831
                        // tab positioning
5387 avox 832
                        if (hl->ch == SpecialChars::TAB)
3614 cbradney 833
                        {
5362 avox 834
                                wide = 1;
835
                                if (RTab)
836
                                        RTab = false;
837
                                else
3614 cbradney 838
                                {
5362 avox 839
                                        RTabX = CurX+wide;
5721 avox 840
                                        tTabValues = style.tabValues();
5362 avox 841
                                        if (tTabValues.isEmpty())
3614 cbradney 842
                                        {
5362 avox 843
                                                if ((CurX - ColBound.x()) != 0)
3614 cbradney 844
                                                {
5362 avox 845
                                                        if (CurX == ColBound.x() + ceil((CurX-ColBound.x()) / m_Doc->toolSettings.dTabWidth) * m_Doc->toolSettings.dTabWidth)
846
                                                                CurX += m_Doc->toolSettings.dTabWidth;
847
                                                        else
848
                                                                CurX = ColBound.x() + ceil((CurX-ColBound.x()) / m_Doc->toolSettings.dTabWidth) * m_Doc->toolSettings.dTabWidth;
3614 cbradney 849
                                                }
5362 avox 850
                                                else
851
                                                        CurX = ColBound.x() + m_Doc->toolSettings.dTabWidth;
852
                                                TabCode = 0;
853
                                                RTab = false;
3614 cbradney 854
                                        }
5362 avox 855
                                        else
856
                                        {
857
                                                double tCurX = CurX - ColBound.x();
858
                                                double oCurX = tCurX + wide;
859
                                                for (int yg = static_cast<int>(tTabValues.count()-1); yg > -1; yg--)
860
                                                {
861
                                                        if (oCurX < tTabValues[yg].tabPosition)
862
                                                        {
863
                                                                tCurX = tTabValues[yg].tabPosition;
864
                                                                TabCode = static_cast<int>(tTabValues[yg].tabType);
865
                                                        }
866
                                                }
867
                                                if (TabCode == 0)
868
                                                        RTab = false;
869
                                                else
870
                                                        RTab = true;
871
                                                if (tCurX == oCurX-wide)
872
                                                        CurX = ColBound.x() + ceil((CurX-ColBound.x()) / m_Doc->toolSettings.dTabWidth) * m_Doc->toolSettings.dTabWidth;
873
                                                else
874
                                                        CurX = ColBound.x() + tCurX;
875
                                        }
876
                                        CurX -= 1;
5980 avox 877
                                        StartRT = a;
3614 cbradney 878
                                }
5362 avox 879
                        }
880
 
5408 avox 881
                        // remember y pos
6144 avox 882
//                      hl->glyph.yoffset = CurY + oldCurY;
883
                        hl->glyph.yoffset = 0;
5362 avox 884
                        if (DropCmode)
6144 avox 885
                                hl->glyph.yoffset -= charStyle.font().realCharHeight(chstr2[0], chsd / 10.0) - charStyle.font().realCharAscent(chstr2[0], chsd / 10.0);
5408 avox 886
                        // find tracking
5980 avox 887
                        if (itemsInLine == 0)
5362 avox 888
                        {
5721 avox 889
                                itemText.item(a)->setEffects(itemText.item(a)->effects() | ScStyle_StartOfLine);
5362 avox 890
                                kernVal = 0;
891
                        }
892
                        else
893
                        {
6144 avox 894
                                kernVal = chs * charStyle.tracking() / 10000.0;
5721 avox 895
                                itemText.item(a)->setEffects(itemText.item(a)->effects() & ~ScStyle_StartOfLine);
5362 avox 896
                        }
5408 avox 897
                        // remember x pos
5362 avox 898
                        if (!RTab)
899
                        {
5691 avox 900
//                              hl->glyph.xoffset = QMAX(CurX+kernVal, ColBound.x());
6144 avox 901
                                //hl->glyph.xoffset = CurX+kernVal; // needed for left optical margin
5362 avox 902
                                CurX += wide+kernVal;
5392 avox 903
//                              CurX = QMAX(CurX, ColBound.x());
5362 avox 904
                        }
905
                        else
906
                        {
907
                                CurX = QMAX(CurX, ColBound.x());
6144 avox 908
                                //hl->glyph.xoffset = CurX;
5362 avox 909
                        }
5408 avox 910
                        // more right tab stuff
5362 avox 911
                        if ((TabCode == 4) && (RTab))
912
                        {
913
                                CurX += (wide+kernVal) / 2;
914
                                CurX = QMAX(CurX, ColBound.x());
915
                        }
5408 avox 916
                        // hyphenation
5691 avox 917
                        if (((hl->effects() & ScStyle_HyphenationPossible) || hl->ch == "-") && (HyphenCount < m_Doc->HyCount || m_Doc->HyCount == 0))
5362 avox 918
                        {
5691 avox 919
                                if (hl->effects() & ScStyle_HyphenationPossible)
3614 cbradney 920
                                {
6144 avox 921
                                        pt1 = QPoint(qRound(ceil(CurX+RExtra+ charStyle.font().charWidth('-', charStyle.fontSize() / 10.0) * (charStyle.scaleH() / 1000.0))), qRound(CurY+desc));
922
                                        pt2 = QPoint(qRound(ceil(CurX+RExtra+ charStyle.font().charWidth('-', charStyle.fontSize() / 10.0) * (charStyle.scaleH() / 1000.0))), qRound(ceil(CurY-asce)));
3614 cbradney 923
                                }
5362 avox 924
                                else
3614 cbradney 925
                                {
5362 avox 926
                                        pt1 = QPoint(qRound(ceil(CurX+RExtra)), qRound(CurY+desc));
927
                                        pt2 = QPoint(qRound(ceil(CurX+RExtra)), qRound(ceil(CurY-asce)));
3614 cbradney 928
                                }
5362 avox 929
                        }
930
                        else
931
                        {
932
                                pt1 = QPoint(qRound(ceil(CurX+RExtra)), qRound(CurY+desc));
5408 avox 933
                                pt2 = QPoint(qRound(ceil(CurX+RExtra)), qRound(ceil(CurY-asce)));
5362 avox 934
                        }
5408 avox 935
 
936
                        // test if end of line reached
5721 avox 937
                        if ((!cl.contains(pf2.xForm(pt1))) || (!cl.contains(pf2.xForm(pt2))) || (CurX+RExtra+lineCorr > ColBound.y() - style.rightMargin()))
5362 avox 938
                                outs = true;
939
                        if (CurY > (Height - BExtra - lineCorr))
940
                                outs = true;
5721 avox 941
                        if ((hl->ch == QChar(27)) && (a < itemText.length()-1))
5362 avox 942
                                goNoRoom = true;
943
                        if ((hl->ch == QChar(26)) && (Cols > 1))
944
                                goNextColumn = true;
945
 
5980 avox 946
/* /Hm.
5362 avox 947
                        Zli = new ZZ;
5721 avox 948
                        Zli->Zeich = chstr;
5691 avox 949
                        Zli->Farb = hl->fillColor();
950
                        Zli->shade = hl->fillShade();
951
                        Zli->Farb2 = hl->strokeColor();
952
                        Zli->shade2 = hl->strokeShade();
953
                        Zli->xco = hl->glyph.xoffset;
954
                        Zli->yco = hl->glyph.yoffset;
5721 avox 955
                        Zli->Sele = itemText.selected(a);
6144 avox 956
                        if (DropCmode)
5362 avox 957
                        {
6144 avox 958
                                qDebug(QString("dropcaps1: scale= %1/%2, chsd= %3, par-fontsize= %4")
959
                                           .arg(hl->glyph.scaleH).arg(hl->glyph.scaleV)
960
                                           .arg(chsd).arg(style.charStyle().fontSize()));
5980 avox 961
                                hl->glyph.scaleH *= chsd / style.charStyle().fontSize();
962
                                hl->glyph.scaleV *= chsd / style.charStyle().fontSize();
6144 avox 963
                                qDebug(QString("dropcaps2: scale= %1/%2, chsd= %3, wide= %4, kern= %5")
5980 avox 964
                                           .arg(hl->glyph.scaleH).arg(hl->glyph.scaleV)
965
                                           .arg(chsd).arg(wide).arg(kernVal));
5362 avox 966
                        }
6144 avox 967
*/
5980 avox 968
//                      Zli->Style = hl->effects();
969
//                      Zli->ZFo = hl->font();
970
                        hl->glyph.xadvance = wide + kernVal;
971
//!!                    Zli->kern = kernVal;
972
/*                      Zli->scale = hl->scaleH();
5691 avox 973
                        Zli->scalev = hl->scaleV();
974
                        Zli->base = hl->baselineOffset();
975
                        Zli->shadowX = hl->shadowXOffset();
976
                        Zli->shadowY = hl->shadowYOffset();
977
                        Zli->outline = hl->outlineWidth();
978
                        Zli->underpos = hl->underlineOffset();
979
                        Zli->underwidth = hl->underlineWidth();
980
                        Zli->strikepos = hl->strikethruOffset();
981
                        Zli->strikewidth = hl->strikethruWidth();
5362 avox 982
                        Zli->embedded = hl->cembedded;
5980 avox 983
*/
6144 avox 984
//                      qDebug(QString("make Zli: '%1' outs=%2").arg(hl->ch).arg(outs));
985
 
5387 avox 986
                        if (((hl->ch == " ") || (hl->ch == SpecialChars::TAB)) && (!outs))
5362 avox 987
                        {
5721 avox 988
                                if ( a == firstInFrame() || itemText.text(a-1) !=  ' ')
3614 cbradney 989
                                {
6144 avox 990
                                        LastXp = CurX;
5362 avox 991
                                        LastSP = BuPos;
3614 cbradney 992
                                }
5362 avox 993
                        }
5691 avox 994
                        if (((hl->effects() & ScStyle_HyphenationPossible) || (hl->ch == "-")) && (!outs))
5362 avox 995
                        {
996
                                if ((HyphenCount < m_Doc->HyCount) || (m_Doc->HyCount == 0))
3614 cbradney 997
                                {
5362 avox 998
                                        if (hl->ch == "-")
999
                                                LastXp = CurX;
1000
                                        else
6144 avox 1001
                                                LastXp = CurX + charStyle.font().charWidth('-', charStyle.fontSize() / 10.0) * (charStyle.scaleH() / 1000.0);
5408 avox 1002
                                        LastSP = BuPos + 1;
5362 avox 1003
                                }
1004
                        }
5980 avox 1005
//!                     LiList.append(Zli);
1006
                        ++itemsInLine;
5362 avox 1007
                        if (RTab)
1008
                        {
1009
                                double cen = 1;
1010
                                if (TabCode == 4)
1011
                                        cen = 2;
5980 avox 1012
                                for (uint rtx = StartRT; rtx < StartRT + itemsInLine; ++rtx)
5362 avox 1013
                                {
5980 avox 1014
//                                      LiList.at(rtx)->xco = QMAX(LiList.at(rtx)->xco-(wide+kernVal) / cen, 0.0);
1015
                                        itemText.item(rtx)->glyph.xoffset = QMAX(itemText.item(rtx)->glyph.xoffset-(wide+kernVal) / cen, 0.0);
1016
                                        if (itemText.item(rtx)->glyph.xoffset < RTabX)
5362 avox 1017
                                        {
1018
                                                RTab = false;
1019
                                                TabCode = 0;
5184 avox 1020
                                        }
5362 avox 1021
                                }
1022
                        }
1023
                        BuPos++;
1024
                        if (DropCmode)
1025
                        {
1026
                                DropCmode = false;
1027
                                AbsHasDrop = true;
1028
                                maxDY = CurY;
5721 avox 1029
                                CurX += style.dropCapOffset();
5362 avox 1030
                                CurX = QMAX(CurX, ColBound.x());
1031
                                maxDX = CurX;
1032
                                QPointArray tcli(4);
5721 avox 1033
                                if (style.useBaselineGrid())
5362 avox 1034
                                {
1035
                                        CurY -= m_Doc->typographicSettings.valueBaseGrid * (DropLines-1);
1036
                                        double by = Ypos;
1037
                                        if (OwnPage != -1)
1038
                                                by = Ypos - m_Doc->Pages->at(OwnPage)->yOffset();
1039
                                        int ol1 = qRound((by + CurY - m_Doc->typographicSettings.offsetBaseGrid) * 10000.0);
1040
                                        int ol2 = static_cast<int>(ol1 / m_Doc->typographicSettings.valueBaseGrid);
1041
                                        CurY = ceil(  ol2 / 10000.0 ) * m_Doc->typographicSettings.valueBaseGrid + m_Doc->typographicSettings.offsetBaseGrid - by;
5691 avox 1042
                                        tcli.setPoint(0, QPoint(qRound(hl->glyph.xoffset), qRound(maxDY-DropLines*m_Doc->typographicSettings.valueBaseGrid)));
5362 avox 1043
                                        tcli.setPoint(1, QPoint(qRound(maxDX), qRound(maxDY-DropLines*m_Doc->typographicSettings.valueBaseGrid)));
1044
                                }
1045
                                else
1046
                                {
5721 avox 1047
                                        if (style.lineSpacingMode() == ParagraphStyle::FixedLineSpacing)
3614 cbradney 1048
                                        {
5721 avox 1049
                                                CurY -= style.lineSpacing() * (DropLines-1);
1050
                                                tcli.setPoint(0, QPoint(qRound(hl->glyph.xoffset), qRound(maxDY - DropLines * style.lineSpacing())));
1051
                                                tcli.setPoint(1, QPoint(qRound(maxDX), qRound(maxDY-DropLines*style.lineSpacing())));
5362 avox 1052
                                        }
1053
                                        else
1054
                                        {
6144 avox 1055
                                                double currasce = charStyle.font().height(style.charStyle().fontSize() / 10.0);
5362 avox 1056
                                                CurY -= currasce * (DropLines-1);
5691 avox 1057
                                                tcli.setPoint(0, QPoint(qRound(hl->glyph.xoffset), qRound(maxDY-DropLines*currasce)));
5362 avox 1058
                                                tcli.setPoint(1, QPoint(qRound(maxDX), qRound(maxDY-DropLines*currasce)));
1059
                                        }
1060
                                }
1061
                                tcli.setPoint(2, QPoint(qRound(maxDX), qRound(maxDY)));
5691 avox 1062
                                tcli.setPoint(3, QPoint(qRound(hl->glyph.xoffset), qRound(maxDY)));
5362 avox 1063
                                cm = QRegion(pf2.xForm(tcli));
1064
                                cl = cl.subtract(cm);
1065
                        }
5408 avox 1066
                        // end of line
5362 avox 1067
                        if ((hl->ch == SpecialChars::PARSEP)
1068
                                || (hl->ch == SpecialChars::LINEBREAK)
1069
                                || (hl->ch == SpecialChars::FRAMEBREAK)  
1070
                                || ((hl->ch == SpecialChars::COLBREAK) && (Cols > 1))
1071
                                || (outs))
1072
                        {
1073
                                RTab = false;
1074
                                TabCode = 0;
1075
                                if ((hl->ch == SpecialChars::PARSEP)
1076
                                        || (hl->ch == SpecialChars::LINEBREAK)
1077
                                        || (hl->ch == SpecialChars::FRAMEBREAK)  
1078
                                        || ((hl->ch == SpecialChars::COLBREAK) && (Cols > 1)))
1079
                                {
5721 avox 1080
                                        if (style.alignment() != 0)
5362 avox 1081
                                        {
5408 avox 1082
                                                // find end of line
6144 avox 1083
                                                EndX = floor(CurX + hl->glyph.xoffset - 1);
5408 avox 1084
//                                              qDebug(QString("endx start=%1, hl is '%2'").arg(EndX).arg(hl->ch));
5362 avox 1085
                                                do
3614 cbradney 1086
                                                {
5362 avox 1087
                                                        pt1 = QPoint(qRound(EndX+RExtra), static_cast<int>(CurY+desc));
1088
                                                        pt2 = QPoint(qRound(EndX+RExtra), static_cast<int>(ceil(CurY-asce)));
5408 avox 1089
                                                        EndX += 0.125;
5362 avox 1090
                                                }
1091
                                                while ((cl.contains(pf2.xForm(pt1)))
1092
                                                           && (cl.contains(pf2.xForm(pt2)))
5721 avox 1093
                                                           && (EndX+RExtra+lineCorr < ColBound.y() - style.rightMargin()));
5362 avox 1094
                                                // end do
5408 avox 1095
//                                              qDebug(QString("endx @ %1").arg(EndX));
5362 avox 1096
 
6144 avox 1097
                                                curLine.naturalWidth = CurX - curLine.x;
1098
                                                curLine.width = EndX - curLine.x;
5721 avox 1099
                                                if (style.alignment() == 2)
5362 avox 1100
                                                        OFs = EndX - CurX;
5721 avox 1101
                                                if (style.alignment() == 1)
5362 avox 1102
                                                        OFs = (EndX - CurX) / 2;
5721 avox 1103
                                                if (style.alignment() == 3)
5362 avox 1104
                                                        OFs = 0;
5721 avox 1105
                                                if (style.alignment() == 4)
5362 avox 1106
                                                {
5408 avox 1107
                                                        // count the available spaces
5362 avox 1108
                                                        aSpa = 0;
5980 avox 1109
                                                        for (int sof = 0; sof < itemsInLine; ++sof)
3614 cbradney 1110
                                                        {
5980 avox 1111
                                                                if ((itemText.text(curLine.firstItem + sof) == QChar(32)
1112
                                                                        || itemText.text(curLine.firstItem + sof) == SpecialChars::NBSPACE)
1113
                                                                        && ! (itemText.item(curLine.firstItem + sof)->effects() & ScStyle_SuppressSpace)
5362 avox 1114
                                                                        )
1115
                                                                        aSpa++;
3614 cbradney 1116
                                                        }
5362 avox 1117
                                                        if (aSpa != 0)
1118
                                                                OFs2 = (EndX - CurX) / aSpa;
1119
                                                        else
1120
                                                                OFs2 = 0;
1121
                                                        OFs = 0;
5408 avox 1122
                                                        // distribute whitespace on spaces
5980 avox 1123
                                                        for (int yof = 0; yof < itemsInLine; ++yof)
5362 avox 1124
                                                        {
6144 avox 1125
                                                                /*
5980 avox 1126
                                                                for (GlyphLayout* gp = &itemText.item(curLine.firstItem + yof)->glyph; gp; gp = gp->more)
1127
                                                                        gp->xoffset += OFs;
6144 avox 1128
                                                                 */
5980 avox 1129
                                                                if ((itemText.text(curLine.firstItem + yof) == QChar(32)
1130
                                                                        || itemText.text(curLine.firstItem + yof) == SpecialChars::NBSPACE)
1131
                                                                        && ! (itemText.item(curLine.firstItem + yof)->effects() & ScStyle_SuppressSpace)
5362 avox 1132
                                                                        )
6144 avox 1133
                                                                {
1134
                                                                        itemText.item(curLine.firstItem + yof)->glyph.last()->xadvance += OFs2;
5362 avox 1135
                                                                        OFs += OFs2;
6144 avox 1136
                                                                }
5362 avox 1137
                                                        }
3614 cbradney 1138
                                                }
1139
                                                else
1140
                                                {
5408 avox 1141
                                                        // simple offset
6144 avox 1142
                                                        curLine.x += OFs;
1143
/*                                                      for (int xof = 0; xof < itemsInLine; ++xof)
3668 cbradney 1144
                                                        {
5980 avox 1145
                                                                itemText.item(curLine.firstItem + xof)->glyph.xoffset += OFs;
3668 cbradney 1146
                                                        }
6144 avox 1147
*/
3614 cbradney 1148
                                                }
5362 avox 1149
                                                CurX = EndX;
3614 cbradney 1150
                                        }
6144 avox 1151
                                        else {
1152
                                                curLine.naturalWidth = CurX - curLine.x;
1153
                                                curLine.width = CurX - curLine.x;
1154
                                        }
5362 avox 1155
                                }
5408 avox 1156
                                else // outs -- last char went outside the columns
5362 avox 1157
                                {
1158
                                        if (LastSP != 0)            // Hier koenen auch andere Trennungen eingebaut werden
3614 cbradney 1159
                                        {
5408 avox 1160
                                                // go back to last break position
5778 avox 1161
//                                              qDebug(QString("new break pos a=%1 BuPos=%2 LastSP=%3").arg(a).arg(BuPos).arg(LastSP));
5362 avox 1162
                                                a -= BuPos - LastSP;
5980 avox 1163
                                                assert( a >= 0 );
1164
                                                assert( a < itemText.length() );
5721 avox 1165
                                                hl = itemText.item(a);
1166
                                                style = itemText.paragraphStyle(a);
5778 avox 1167
                                                if (style.rightMargin() < 0) {
1168
                                                        qDebug(QString("style pos < %1:").arg(a));
1169
                                                        dumpIt(style);
1170
                                                }
5721 avox 1171
//                                              qDebug(QString("style <@%6: %1 -- %2, %4/%5 char: %3").arg(style.leftMargin()).arg(style.rightMargin())
1172
//                                                         .arg(style.charStyle().asString()).arg(style.name()).arg(style.parent()?style.parent()->name():"")
1173
//                                                         .arg(a));
5408 avox 1174
//not needed any more:  a++;
1175
                                                // Fix incorrect right flush for full lines: ? -AV
6144 avox 1176
                                                LastXp = curLine.x;
1177
                                                for (int j=curLine.firstItem; j <= a; ++j)
1178
                                                        LastXp += itemText.item(j)->glyph.wide();
1179
 
5691 avox 1180
                                                if (hl->effects() & ScStyle_HyphenationPossible)
3614 cbradney 1181
                                                {
5362 avox 1182
                                                        // insert hyphen
1183
                                                        HyphenCount++;
5691 avox 1184
                                                        hl->setEffects(hl->effects() | ScStyle_SmartHyphenVisible);
5980 avox 1185
                                                        hl->glyph.more = new GlyphLayout();
6144 avox 1186
                                                        hl->glyph.more->glyph = charStyle.font().char2CMap(QChar('-'));
1187
                                                        /*
1188
                                                         hl->glyph.more->xoffset = LastXp;
1189
                                                         hl->glyph.more->yoffset = hl->glyph.yoffset;
1190
                                                         */
1191
                                                        hl->glyph.more->xadvance = charStyle.font().charWidth('-', itemText.charStyle(a).fontSize() / 10.0) * (itemText.charStyle(a).scaleH() / 1000.0);
5980 avox 1192
/*                                                      Zli = new ZZ;
5362 avox 1193
                                                        Zli->Zeich = "-";
5721 avox 1194
                                                        Zli->Farb = itemText.charStyle(a).fillColor();
1195
                                                        Zli->Farb2 = itemText.charStyle(a).strokeColor();
1196
                                                        Zli->shade = itemText.charStyle(a).fillShade();
1197
                                                        Zli->shade2 = itemText.charStyle(a).strokeShade();
5980 avox 1198
                                                        Zli->xco = LastXp - itemText.charStyle(a).font().charWidth('-', itemText.charStyle(a).fontSize() / 10.0) * (itemText.charStyle(a).scaleH() / 1000.0);
5721 avox 1199
                                                        Zli->yco = itemText.item(a)->glyph.yoffset;
1200
                                                        Zli->Sele = itemText.selected(a);
1201
                                                        Zli->Siz = itemText.charStyle(a).fontSize();
1202
                                                        Zli->realSiz = itemText.charStyle(a).fontSize();
1203
                                                        Zli->Style = itemText.charStyle(a).effects();
1204
                                                        Zli->ZFo = itemText.charStyle(a).font();
5980 avox 1205
                                                        Zli->wide = itemText.charStyle(a).font().charWidth('-', itemText.charStyle(a).fontSize() / 10.0) * (itemText.charStyle(a).scaleH() / 1000.0);
5721 avox 1206
                                                        Zli->kern = itemText.charStyle(a).fontSize() * itemText.charStyle(a).tracking() / 10000.0;
1207
                                                        Zli->scale = itemText.charStyle(a).scaleH();
1208
                                                        Zli->scalev = itemText.charStyle(a).scaleV();
1209
                                                        Zli->base = itemText.charStyle(a).baselineOffset();
1210
                                                        Zli->shadowX = itemText.charStyle(a).shadowXOffset();
1211
                                                        Zli->shadowY = itemText.charStyle(a).shadowYOffset();
1212
                                                        Zli->outline = itemText.charStyle(a).outlineWidth();
1213
                                                        Zli->underpos = itemText.charStyle(a).underlineOffset();
1214
                                                        Zli->underwidth = itemText.charStyle(a).underlineWidth();
1215
                                                        Zli->strikepos = itemText.charStyle(a).strikethruOffset();
1216
                                                        Zli->strikewidth = itemText.charStyle(a).strikethruWidth();
5362 avox 1217
                                                        Zli->embedded = 0;
5980 avox 1218
//                                                      LiList.insert(LastSP+1, Zli);
1219
                                                        */
5408 avox 1220
                                                        LastSP += 2;
5980 avox 1221
                                                        LastXp += hl->glyph.more->xadvance;
5362 avox 1222
                                                }
5408 avox 1223
                                                else
5362 avox 1224
                                                {
1225
                                                        HyphenCount = 0;
5691 avox 1226
                                                        hl->setEffects(hl->effects() & ~ScStyle_SmartHyphenVisible);
5980 avox 1227
                                                        if (hl->glyph.more) {
1228
                                                                delete hl->glyph.more;
1229
                                                                hl->glyph.more = 0;
1230
                                                        }
5362 avox 1231
                                                }
5408 avox 1232
                                                BuPos = LastSP;
1233
                                                // Justification
5721 avox 1234
                                                if (style.alignment() != 0)
5362 avox 1235
                                                {
5408 avox 1236
                                                        // find end of line
6144 avox 1237
                                                        EndX = floor(curLine.x + hl->glyph.xoffset);
5408 avox 1238
//                                                      qDebug(QString("endx start=%1, hl is '%2'").arg(EndX).arg(hl->ch));
5362 avox 1239
                                                        do
3614 cbradney 1240
                                                        {
5362 avox 1241
                                                                pt1 = QPoint(qRound(EndX+RExtra), static_cast<int>(CurY+desc));
1242
                                                                pt2 = QPoint(qRound(EndX+RExtra), static_cast<int>(ceil(CurY-asce)));
5408 avox 1243
                                                                EndX += 0.125;
5362 avox 1244
                                                        }
1245
                                                        while ((cl.contains(pf2.xForm(pt1)))
1246
                                                                   && (cl.contains(pf2.xForm(pt2)))
5721 avox 1247
                                                                   && (EndX+RExtra+lineCorr < ColBound.y() - style.rightMargin()));
5408 avox 1248
                                                        // end do
1249
//                                                      qDebug(QString("endx @ %1").arg(EndX));
1250
 
5980 avox 1251
                                                        if (opticalMargins && a >= curLine.firstItem) {
1252
                                                                double chs = itemText.charStyle(a).fontSize() * (itemText.charStyle(a).scaleH() / 1000.0);
1253
                                                                QString chr = itemText.item(a)->glyph.more ? "-" : itemText.text(a,1);
1254
                                                                double rightCorr = itemText.charStyle(a).font().realCharWidth(chr[0], chs / 10.0);
5414 avox 1255
                                                                if (QString("-,.`´'~").find(chr) >= 0
5415 avox 1256
                                                                        || chr[0] == QChar(0x2018)
1257
                                                                        || chr[0] == QChar(0x2019)
1258
                                                                        || chr[0] == QChar(0x201a)
1259
                                                                        || chr[0] == QChar(0x201b)
1260
                                                                        || chr[0] == QChar(0x2039)
1261
                                                                        || chr[0] == QChar(0x203a)
1262
                                                                        || chr[0] == QChar(0x2032)
5414 avox 1263
                                                                        )
1264
                                                                        rightCorr *= 0.7;
1265
                                                                else if (QString(";:\"").find(chr) >= 0
5415 avox 1266
                                                                                 || chr[0] == QChar(0x00ab)
1267
                                                                                 || chr[0] == QChar(0x00bb)
1268
                                                                                 || chr[0] == QChar(0x201c)
1269
                                                                                 || chr[0] == QChar(0x201d)
1270
                                                                                 || chr[0] == QChar(0x201e)
1271
                                                                                 || chr[0] == QChar(0x201f)
1272
                                                                                 || chr[0] == QChar(0x2013)
1273
                                                                                 || chr[0] == QChar(0x2033)
5414 avox 1274
                                                                                 )
1275
                                                                        rightCorr *= 0.5;
1276
                                                                else {
5980 avox 1277
                                                                        rightCorr = itemText.charStyle(a).font().charWidth(chr[0], chs / 10.0);
1278
                                                                        rightCorr -= itemText.charStyle(a).font().charWidth(chr[0], chs / 10.0, QChar('.'));
5414 avox 1279
                                                                }
1280
                                                                EndX += rightCorr;
5980 avox 1281
//                                                              qDebug(QString("orm %1 @ %2: %3 %4").arg(rightCorr).arg(a).arg(chr).arg(itemText.charStyle(a).effects() & ScStyle_HyphenationPossible? "smart" : ""));
5414 avox 1282
                                                        }
6144 avox 1283
                                                        curLine.naturalWidth = LastXp - curLine.x;
1284
                                                        curLine.width = EndX - curLine.x;
5721 avox 1285
                                                        if (style.alignment() == 2)
5362 avox 1286
                                                                OFs = EndX - LastXp;
5721 avox 1287
                                                        if (style.alignment() == 1)
5362 avox 1288
                                                                OFs = (EndX - LastXp) / 2;
5721 avox 1289
                                                        if ((style.alignment() == 3)
1290
                                                                || (style.alignment() == 4))
5362 avox 1291
                                                        {
5408 avox 1292
                                                                // count available spaces
6144 avox 1293
                                                                aSpa = 0;
5408 avox 1294
                                                                for (uint sof = 0; sof<LastSP; ++sof)
5362 avox 1295
                                                                {
5980 avox 1296
                                                                        if ((itemText.item(curLine.firstItem + sof)->ch == QChar(32)
1297
                                                                                 || itemText.item(curLine.firstItem + sof)->ch == SpecialChars::NBSPACE)
1298
                                                                                && ! (itemText.item(curLine.firstItem + sof)->effects() & ScStyle_SuppressSpace)
5408 avox 1299
                                                                                )
5362 avox 1300
                                                                                aSpa++;
1301
                                                                }
5408 avox 1302
                                                                if (aSpa > 0)
5362 avox 1303
                                                                        OFs2 = (EndX - LastXp) / aSpa;
3614 cbradney 1304
                                                                else
5408 avox 1305
                                                                        OFs2 = 0;
1306
 
5362 avox 1307
                                                                OFs = 0;
5408 avox 1308
//                                                              qDebug(QString("just %1").arg(OFs2));
5980 avox 1309
                                                                for (int yof = 0; yof < itemsInLine; ++yof)
5362 avox 1310
                                                                {
6144 avox 1311
                                                                        /*for (GlyphLayout* gp = &itemText.item(curLine.firstItem + yof)->glyph; gp; gp = gp->more)
1312
                                                                                gp->xoffset += OFs;*/
5980 avox 1313
                                                                        if ( (itemText.item(curLine.firstItem + yof)->ch == QChar(32)
1314
                                                                                 || itemText.item(curLine.firstItem + yof)->ch == SpecialChars::NBSPACE)
1315
                                                                                 && ! (itemText.item(curLine.firstItem + yof)->effects() & ScStyle_SuppressSpace)
5362 avox 1316
                                                                                 )
6144 avox 1317
                                                                        {
1318
                                                                                itemText.item(curLine.firstItem + yof)->glyph.last()->xadvance += OFs2;
5362 avox 1319
                                                                                OFs += OFs2;
6144 avox 1320
                                                                        }
5362 avox 1321
                                                                }
3614 cbradney 1322
                                                        }
5362 avox 1323
                                                        else
1324
                                                        {
6144 avox 1325
                                                                curLine.x += OFs;
1326
                                                                /*
5980 avox 1327
                                                                for (int xof = 0; xof < itemsInLine; ++xof)
5362 avox 1328
                                                                {
5980 avox 1329
                                                                        itemText.item(curLine.firstItem + xof)->glyph.xoffset += OFs;
6144 avox 1330
                                                                }*/
5362 avox 1331
                                                        }
5408 avox 1332
//                                                      qDebug(QString("line: endx=%1 lastchar=%2").arg(EndX).arg(LiList.at(BuPos-1)->xco + LiList.at(BuPos-1)->wide));
5362 avox 1333
                                                        CurX = EndX;
3614 cbradney 1334
                                                }
6144 avox 1335
                                                else {
1336
                                                        curLine.naturalWidth = LastXp - curLine.x;
1337
                                                        curLine.width = LastXp - curLine.x;
1338
                                                }
3614 cbradney 1339
                                        }
5980 avox 1340
                                        else if (a > 0) // no break position
3614 cbradney 1341
                                        {
5362 avox 1342
                                                a--;
5980 avox 1343
                                                assert( a >= 0 );
1344
                                                assert( a < itemText.length() );
5778 avox 1345
                                                hl = itemText.item(a);
1346
                                                style = itemText.paragraphStyle(a);
1347
                                                if (style.rightMargin() < 0) {
1348
                                                        qDebug(QString("style nb pos %1:").arg(a));
1349
                                                        dumpIt(style);
1350
                                                }
1351
//                                              qDebug(QString("style nb @%6: %1 -- %2, %4/%5 char: %3").arg(style.leftMargin()).arg(style.rightMargin())
1352
//                                                         .arg(style.charStyle().asString()).arg(style.name()).arg(style.parent()?style.parent()->name():"")
1353
//                                                         .arg(a));
6144 avox 1354
                                                curLine.naturalWidth = CurX - curLine.x;
1355
                                                curLine.width = CurX - curLine.x;
5362 avox 1356
                                                BuPos--;
1357
                                        }
1358
                                }
1359
                                uint BuPos3 = BuPos;
1360
                                if ((outs)
1361
                                        || (hl->ch == SpecialChars::PARSEP)
1362
                                        || (hl->ch == SpecialChars::LINEBREAK)
1363
                                        || (hl->ch == SpecialChars::FRAMEBREAK)
1364
                                        || ((hl->ch == SpecialChars::COLBREAK) && (Cols > 1)))
1365
                                {
5721 avox 1366
                                        if ((outs) && (CurX+RExtra+lineCorr < ColBound.y() - style.rightMargin()))
5362 avox 1367
                                        {
1368
                                                if (( hl->ch == SpecialChars::PARSEP || hl->ch == SpecialChars::LINEBREAK)
1369
                                                        && AbsHasDrop)
3614 cbradney 1370
                                                {
5362 avox 1371
                                                        AbsHasDrop = false;
1372
                                                        if (CurY < maxDY)
1373
                                                                CurY = maxDY;
3614 cbradney 1374
                                                }
5362 avox 1375
                                                bool fromOut = true;
1376
                                                double BotOffset = desc+BExtra+lineCorr;
1377
                                                pt1 = QPoint(qRound(CurX+RExtra), static_cast<int>(CurY+BotOffset));
1378
                                                pt2 = QPoint(qRound(CurX+RExtra), static_cast<int>(ceil(CurY-asce)));
5721 avox 1379
                                                while (CurX+RExtra+lineCorr < ColBound.y() - style.rightMargin())
3614 cbradney 1380
                                                {
5362 avox 1381
                                                        CurX++;
5721 avox 1382
                                                        if (CurX+RExtra+lineCorr > ColBound.y() - style.rightMargin())
3614 cbradney 1383
                                                        {
5362 avox 1384
                                                                fromOut = false;
5721 avox 1385
                                                                if (style.useBaselineGrid())
5362 avox 1386
                                                                        CurY += m_Doc->typographicSettings.valueBaseGrid;
1387
                                                                else
5721 avox 1388
                                                                        CurY += style.lineSpacing();
5362 avox 1389
                                                                if ((CurY+desc+BExtra+lineCorr > Height) && (CurrCol+1 == Cols))
1390
                                                                {
1391
                                                                        goNoRoom = true;
6144 avox 1392
                                                                        qDebug(QString("go no room 1: %1").arg(a));
5362 avox 1393
                                                                        break;
1394
                                                                }
1395
                                                                if (AbsHasDrop)
1396
                                                                {
1397
                                                                        if ((CurY > maxDY) && (CurY - asce > maxDY))
1398
                                                                        {
1399
                                                                                AbsHasDrop = false;
1400
                                                                                CurX = ColBound.x();
1401
                                                                        }
1402
                                                                        else
1403
                                                                                CurX = maxDX;
1404
                                                                }
1405
                                                                else
1406
                                                                        CurX = ColBound.x();
1407
                                                                if ((hl->ch == SpecialChars::PARSEP)
1408
                                                                        || (hl->ch == SpecialChars::LINEBREAK)
1409
                                                                        || (hl->ch == SpecialChars::FRAMEBREAK)
1410
                                                                        || (hl->ch == SpecialChars::COLBREAK))
1411
                                                                {
1412
                                                                        if (hl->ch == SpecialChars::PARSEP)
5721 avox 1413
                                                                                CurY += style.gapAfter();
5362 avox 1414
                                                                        if (BuPos3 > 0)
1415
                                                                                BuPos3 -= 1;
1416
                                                                        HyphenCount = 0;
1417
                                                                }
1418
                                                                break;
3614 cbradney 1419
                                                        }
5362 avox 1420
                                                        pt1 = QPoint(qRound(CurX+RExtra), static_cast<int>(CurY+BotOffset));
1421
                                                        pt2 = QPoint(qRound(CurX+RExtra), static_cast<int>(ceil(CurY-asce)));
1422
                                                        if ((cl.contains(pf2.xForm(pt1))) && (cl.contains(pf2.xForm(pt2))))
1423
                                                                break;
1424
                                                }
1425
                                                if (fromOut)
1426
                                                {
1427
                                                        if ((CurY+desc+BExtra+lineCorr > Height) && (CurrCol+1 == Cols))
3614 cbradney 1428
                                                        {
5362 avox 1429
                                                                goNoRoom = true;
6144 avox 1430
                                                                qDebug(QString("go no room 2: %1").arg(a));
5362 avox 1431
                                                                break;
3614 cbradney 1432
                                                        }
5362 avox 1433
                                                        CurX--;
1434
                                                        CurX = QMAX(CurX, ColBound.x());
3614 cbradney 1435
                                                }
1436
                                        }
1437
                                        else
1438
                                        {
5362 avox 1439
                                                if (( hl->ch == SpecialChars::PARSEP || hl->ch == SpecialChars::LINEBREAK )
1440
                                                        && AbsHasDrop)
1441
                                                {
1442
                                                        AbsHasDrop = false;
1443
                                                        if (CurY < maxDY)
1444
                                                                CurY = maxDY;
1445
                                                }
5721 avox 1446
                                                if (style.useBaselineGrid())
5362 avox 1447
                                                        CurY += m_Doc->typographicSettings.valueBaseGrid;
3614 cbradney 1448
                                                else
1449
                                                {
5721 avox 1450
                                                        if (a < lastInFrame())
1451
                                                                CurY += itemText.paragraphStyle(a+1).lineSpacing();
3614 cbradney 1452
                                                        else
5721 avox 1453
                                                                CurY += style.lineSpacing();
3614 cbradney 1454
                                                }
5362 avox 1455
                                                if (AbsHasDrop)
1456
                                                {
1457
                                                        if ((CurY > maxDY) && (CurY - asce > maxDY))
1458
                                                        {
1459
                                                                AbsHasDrop = false;
1460
                                                                CurX = ColBound.x();
1461
                                                        }
1462
                                                        else
1463
                                                                CurX = maxDX;
1464
                                                }
3614 cbradney 1465
                                                else
5362 avox 1466
                                                        CurX = ColBound.x();
1467
                                                if ( hl->ch == SpecialChars::PARSEP
1468
                                                         || hl->ch == SpecialChars::LINEBREAK
1469
                                                         || hl->ch == SpecialChars::FRAMEBREAK
1470
                                                         || hl->ch == SpecialChars::COLBREAK )
1471
                                                {
5721 avox 1472
                                                        if (hl->ch == SpecialChars::PARSEP)
1473
                                                                CurY += style.gapAfter();
5362 avox 1474
                                                        if (BuPos3 > 0)
1475
                                                                BuPos3 -= 1;
1476
                                                        HyphenCount = 0;
1477
                                                }
3614 cbradney 1478
                                        }
5362 avox 1479
                                }
1480
 
5980 avox 1481
//                              hl->glyph.xoffset = CurX;
1482
//                              hl->glyph.yoffset = CurY;
5362 avox 1483
 
5980 avox 1484
                                if (itemsInLine != 0)
5362 avox 1485
                                {
5721 avox 1486
                                        if ((!AbsHasDrop) && (StartOfCol) && (!style.useBaselineGrid()))
3614 cbradney 1487
                                        {
5980 avox 1488
                                                double firstasce = itemText.charStyle(curLine.firstItem).font().ascent(itemText.charStyle(curLine.firstItem).fontSize() / 10.0);
5362 avox 1489
                                                double currasce;
5980 avox 1490
                                                if ((itemText.text(curLine.firstItem) == QChar(13)) || (itemText.text(curLine.firstItem) == QChar(28)))
1491
                                                        currasce = itemText.charStyle(curLine.firstItem).font().ascent(itemText.charStyle(curLine.firstItem).fontSize() / 10.0);
1492
                                                else if (itemText.object(curLine.firstItem) != 0)
1493
                                                        currasce = QMAX(currasce, (itemText.object(curLine.firstItem)->gHeight + itemText.object(curLine.firstItem)->lineWidth()) * (itemText.charStyle(curLine.firstItem).scaleV() / 1000.0));
5362 avox 1494
                                                else
5980 avox 1495
                                                        currasce = itemText.charStyle(curLine.firstItem).font().realCharAscent(itemText.text(curLine.firstItem), itemText.charStyle(curLine.firstItem).fontSize() / 10.0);
1496
                                                for (int zc = 0; zc < itemsInLine; ++zc)
3614 cbradney 1497
                                                {
5980 avox 1498
                                                        QChar ch = itemText.text(curLine.firstItem + zc);
1499
                                                        const CharStyle& cStyle(itemText.charStyle(curLine.firstItem + zc));
1500
                                                        if ((ch == SpecialChars::TAB) || (ch == QChar(10))
1501
                                                                || (ch == SpecialChars::PARSEP) || (ch == SpecialChars::NBHYPHEN)
1502
                                                                || (ch == SpecialChars::COLBREAK) || (ch == SpecialChars::LINEBREAK)
1503
                                                                || (ch == SpecialChars::FRAMEBREAK) || (ch == SpecialChars::NBSPACE))
5362 avox 1504
                                                                continue;
5980 avox 1505
                                                        if (itemText.object(curLine.firstItem) != 0)
1506
                                                                currasce = QMAX(currasce, (itemText.object(curLine.firstItem)->gHeight + itemText.object(curLine.firstItem)->lineWidth()) * (cStyle.scaleV() / 1000.0));
3614 cbradney 1507
                                                        else
5980 avox 1508
                                                                currasce = QMAX(currasce, cStyle.font().realCharAscent(ch, cStyle.fontSize() / 10.0));
3614 cbradney 1509
                                                }
5362 avox 1510
                                                double adj = firstasce - currasce;
6144 avox 1511
                                                curLine.ascent = currasce;
1512
                                                curLine.y -= adj;
1513
                                                /*
5980 avox 1514
                                                for (int zc = 0; zc < itemsInLine; ++zc)
5362 avox 1515
                                                {
5980 avox 1516
                                                        itemText.item(curLine.firstItem + zc)->glyph.yoffset -= adj;
6144 avox 1517
                                                }*/
5362 avox 1518
                                                CurY -= adj;
1519
                                        }
5721 avox 1520
                                        if ((!StartOfCol) && (!style.useBaselineGrid()) && (style.lineSpacingMode() == ParagraphStyle::AutomaticLineSpacing))
5362 avox 1521
                                        {
5980 avox 1522
                                                QChar ch = itemText.text(curLine.firstItem);
5721 avox 1523
                                                double firstasce = style.lineSpacing();
5362 avox 1524
                                                double currasce = 0;
5980 avox 1525
                                                if (itemText.object(curLine.firstItem) != 0)
1526
                                                        currasce = QMAX(currasce, (itemText.object(curLine.firstItem)->gHeight + itemText.object(curLine.firstItem)->lineWidth()) * (itemText.charStyle(curLine.firstItem).scaleV() / 1000.0));
3614 cbradney 1527
                                                else
5980 avox 1528
                                                        currasce = itemText.charStyle(curLine.firstItem).font().height(itemText.charStyle(curLine.firstItem).fontSize() / 10.0);
1529
                                                for (int zc = 0; zc < itemsInLine; ++zc)
3614 cbradney 1530
                                                {
5980 avox 1531
                                                        QChar ch = itemText.text(curLine.firstItem + zc);
1532
                                                        if ((ch == SpecialChars::TAB) || (ch == QChar(10))
1533
                                                                || (ch == SpecialChars::PARSEP) || (ch == QChar(24))
1534
                                                                || (ch == QChar(26)) || (ch == QChar(27))
1535
                                                                || (ch == QChar(28)) || (ch == QChar(29)))
5362 avox 1536
                                                                continue;
5980 avox 1537
                                                        if (itemText.object(curLine.firstItem) != 0)
1538
                                                                currasce = QMAX(currasce, (itemText.object(curLine.firstItem)->gHeight + itemText.object(curLine.firstItem)->lineWidth()) * (itemText.charStyle(curLine.firstItem).scaleV() / 1000.0));
5362 avox 1539
                                                        else
5980 avox 1540
                                                                currasce = QMAX(currasce, itemText.charStyle(curLine.firstItem).font().height(itemText.charStyle(curLine.firstItem).fontSize() / 10.0));
3614 cbradney 1541
                                                }
5362 avox 1542
                                                double adj = firstasce - currasce;
6144 avox 1543
                                                curLine.ascent = currasce;
1544
                                                curLine.y -= adj;
1545
                                                /*
5980 avox 1546
                                                for (int zc = 0; zc < itemsInLine; ++zc)
5362 avox 1547
                                                {
5980 avox 1548
                                                        itemText.item(curLine.firstItem + zc)->glyph.yoffset -= adj;
6144 avox 1549
                                                }*/
5362 avox 1550
                                                CurY -= adj;
3614 cbradney 1551
                                        }
5362 avox 1552
                                }
6144 avox 1553
                                // set x/yoffset for dependent glyphs
1554
/*                              GlyphLayout* glp =  & hl->glyph;
1555
                                while (glp->more) {
1556
                                        qDebug(QString("dependent glyph %1").arg(glp->more->glyph));
1557
                                        glp->more->xoffset = glp->xoffset + glp->xadvance;
1558
                                        glp->more->yoffset = glp->yoffset;
1559
                                        glp = glp->more;
1560
                                }*/
1561
 
5362 avox 1562
                                StartOfCol = false;
6144 avox 1563
/* has no effect except setting wide, asce and desc
1564
                                uint loopC = BuPos3;
5362 avox 1565
                                if (m_Doc->guidesSettings.showControls)
1566
                                        loopC++;  // ??? AV
5980 avox 1567
                                for (int zc = 0; zc < loopC; ++zc)
5362 avox 1568
                                {
5980 avox 1569
                                        if ( zc >= itemsInLine) {
1570
                                                qDebug("layout: zc too large %d / %d", zc, itemsInLine);
5751 avox 1571
                                                continue;
1572
                                        }
5980 avox 1573
                                        if ( startLin + zc >= itemText.length()) {
5751 avox 1574
                                                qDebug("layout: startLin+zc too large %d+%d / %d", startLin, zc, itemText.length());
1575
                                                continue;
1576
                                        }
1577
//                                      else
1578
//                                              qDebug("layout: startLin, zc ok. %d, %d, %d", startLin, zc, LiList.count());
5362 avox 1579
                                        double wide2 = 0;
5980 avox 1580
                                        double xcoZli = itemText.item(curLine.firstItem + zc)->glyph.xoffset;
1581
//                                      itemText.item(startLin+zc)->glyph.xoffset = Zli2->xco;
1582
///                                     itemText.item(startLin+zc)->glyph.yoffset = Zli2->yco;
5721 avox 1583
                                        tTabValues = itemText.paragraphStyle(startLin+zc).tabValues();
5980 avox 1584
                                        desc = - itemText.charStyle(startLin+zc).font().descent(itemText.charStyle(startLin+zc).fontSize() / 10.0);
1585
                                        asce = itemText.charStyle(startLin+zc).font().ascent(itemText.charStyle(startLin+zc).fontSize() / 10.0);
1586
                                        bool Sele = itemText.selected(startLin+zc);
1587
                                        if (((Sele && (Select)) || (((NextBox != 0) || (BackBox != 0)) && Sele)) && (m_Doc->appMode == modeEdit))
3614 cbradney 1588
                                        {
5980 avox 1589
                                                wide = itemText.item(startLin+zc)->glyph.xadvance;
1590
                                                if ((zc > 0) && (itemText.text(startLin+zc) == SpecialChars::TAB))
3614 cbradney 1591
                                                {
5980 avox 1592
                                                        wide2 = itemText.item(startLin+zc-1)->glyph.xadvance;
1593
                                                        xcoZli = itemText.item(startLin+zc-1)->glyph.xoffset + wide2;
1594
                                                        wide = itemText.item(startLin+zc)->glyph.xoffset - xcoZli + itemText.item(startLin+zc)->glyph.xadvance;
3614 cbradney 1595
                                                }
5362 avox 1596
                                        }
1597
                                }
6144 avox 1598
                                */
5980 avox 1599
//                              LiList.clear();
6144 avox 1600
                                curLine.lastItem = a;
1601
                                itemText.appendLine(curLine);
5980 avox 1602
                                itemsInLine = 0;
1603
                                curLine.firstItem = a+1;
5362 avox 1604
                                BuPos = 0;
1605
                                LastSP = 0;
1606
                                LastXp = 0;
1607
                                outs = false;
1608
                                if (goNoRoom)
1609
                                {
1610
                                        goNoRoom = false;
1611
                                        nrc = a+1;
6144 avox 1612
                                        qDebug(QString("no room C: %1").arg(a+1));
5362 avox 1613
                                        goto NoRoom;
1614
                                }
1615
                                if (goNextColumn)
1616
                                {
1617
                                        goNextColumn = false;
1618
                                        StartOfCol = true;
1619
                                        CurrCol++;
1620
                                        if (CurrCol < Cols)
1621
                                        {
1622
                                                ColWidth = columnWidth();
1623
                                                ColBound = FPoint((ColWidth + ColGap) * CurrCol + Extra+lineCorr, ColWidth * (CurrCol+1) + ColGap * CurrCol + Extra+lineCorr);
1624
                                                CurX = ColBound.x();
1625
                                                ColBound = FPoint(ColBound.x(), ColBound.y()+RExtra+lineCorr);
1626
                                        }
1627
                                        else
1628
                                        {
1629
                                                nrc = a;
6144 avox 1630
                                                qDebug(QString("no room D: %1").arg(a));
5362 avox 1631
                                                goto NoRoom;
1632
                                        }
1633
                                }
1634
                        }
6144 avox 1635
                        // set x/yoffset for dependent glyphs
1636
/*                      GlyphLayout* glp =  & hl->glyph;
1637
                        while (glp->more) {
1638
                                qDebug(QString("dependent glyph %1").arg(glp->more->glyph));
1639
                                glp->more->xoffset = glp->xoffset + glp->xadvance;
1640
                                glp->more->yoffset = glp->yoffset;
1641
                                glp = glp->more;
1642
                        }       */             
5362 avox 1643
                }
5980 avox 1644
// end of itemText
1645
                uint a = itemText.length()-1;
6144 avox 1646
                curLine.lastItem = a;
5721 avox 1647
                if (style.alignment() != 0)
5362 avox 1648
                {
5408 avox 1649
                        EndX = floor(CurX);
5362 avox 1650
                        do
1651
                        {
1652
                                pt1 = QPoint(qRound(EndX+RExtra), static_cast<int>(CurY+desc));
1653
                                pt2 = QPoint(qRound(EndX+RExtra), static_cast<int>(ceil(CurY-asce)));
5408 avox 1654
                                EndX += 0.125;
5362 avox 1655
                        }
1656
                        while ((cl.contains(pf2.xForm(pt1)))
1657
                                   && (cl.contains(pf2.xForm(pt2)))
5721 avox 1658
                                   && (EndX+RExtra+lineCorr < ColBound.y() - style.rightMargin()));
5362 avox 1659
 
5980 avox 1660
                        if (opticalMargins && itemsInLine > 0) {
1661
                                double chs = itemText.charStyle(a).fontSize() * (itemText.charStyle(a).scaleH() / 1000.0);
1662
                                QString chr = itemText.item(a)->glyph.more ? "-" : itemText.text(a,1);
1663
                                double rightCorr = itemText.charStyle(a).font().realCharWidth(chr[0], chs / 10.0);
5414 avox 1664
                                if (QString("-,.`´'~").find(chr) >= 0
5415 avox 1665
                                        || chr[0] == QChar(0x2018)
1666
                                        || chr[0] == QChar(0x2019)
1667
                                        || chr[0] == QChar(0x201a)
1668
                                        || chr[0] == QChar(0x201b)
1669
                                        || chr[0] == QChar(0x2039)
1670
                                        || chr[0] == QChar(0x203a)
1671
                                        || chr[0] == QChar(0x2032)
5414 avox 1672
                                        )
1673
                                        rightCorr *= 0.7;
1674
                                else if (QString(";:\"").find(chr) >= 0
5415 avox 1675
                                                 || chr[0] == QChar(0x00ab)
1676
                                                 || chr[0] == QChar(0x00bb)
1677
                                                 || chr[0] == QChar(0x201c)
1678
                                                 || chr[0] == QChar(0x201d)
1679
                                                 || chr[0] == QChar(0x201e)
1680
                                                 || chr[0] == QChar(0x201f)
1681
                                                 || chr[0] == QChar(0x2013)
1682
                                                 || chr[0] == QChar(0x2033)
5414 avox 1683
                                                 )
1684
                                        rightCorr *= 0.5;
1685
                                else {
5980 avox 1686
                                        rightCorr = itemText.charStyle(a).font().charWidth(chr[0], chs / 10.0);
1687
                                        rightCorr -= itemText.charStyle(a).font().charWidth(chr[0], chs / 10.0, QChar('.'));
5414 avox 1688
                                }
1689
                                EndX += rightCorr;
5980 avox 1690
//                              qDebug(QString("orm %1 @ %2: %3 par").arg(rightCorr).arg(a).arg(chr));
5414 avox 1691
                        }
6144 avox