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