View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0016049 | Scribus | Text Frames / Story Editor | public | 2020-02-15 04:40 | 2026-09-23 10:47 |
| Reporter | sreerajp | Assigned To | |||
| Priority | normal | Severity | feature | Reproducibility | N/A |
| Status | new | Resolution | open | ||
| Platform | Windows | OS | 10 | OS Version | 1909 |
| Product Version | 1.5.6.svn | ||||
| Summary | 0016049: Span Columns for selected text | ||||
| Description | It will be very useful if we can span selected text to multiple columns. This feature is there in Indesign and will relieve the user from managing TextFrame grouping. With this feature the heading and body text can be managed in a single Text Frame which will be a great feature. | ||||
| Tags | #please_test | ||||
| Attached Files | |||||
| Patch | No | ||||
| related to | 0002039 | acknowledged | column span |
|
|
I do not understand your request. Can you describe an example ? |
|
|
Suppose I have a text frame which is splitted to 5 columns. I want to add a headline to 5 column content which will cover the 5 columns. In scribus, now, I have to create another text frame to type the headline and set the style then adjust the text frame to 2 columns. Then I have to group both the frames to make it bounded. I have attached images of both scribus and Indesign. |
|
|
Ok i understand that the results are the same but you prefer how you achieve this with indesign. So how do you achive this with ID ? Is there some sort of "colspan=2" paragraph property ? |
|
|
Actually both are not same. One is having grouping of text boxes which will cause some work for user if we want to edit anything in Heading or content matter. But in Indesign there is no such extra work. Yes Indesign uses Span column in paragraph style. Attached a screen shot of the same |
|
|
Hi all, We would like to add our support for this feature request. We use QuarkXPress and this feature is invaluable when you are editing a large amount of stories in a short space of time. This may be one of the most important missing features which blocks adoption of Scribus for us because it will add a few extra hours of work a day. The column flow/column spanning feature really is a huge boost to productivity when an entire story can be contained in a single text frame and repositioned in one action without having to deal with grouping/ungrouping/realigning/wrapping/runaround/etc. each time you reposition something. Many thanks, Paul |
|
|
FYI: quick explanation of the tool options in QXP |
|
|
I would use this feature for sure |
|
|
I like the solution of Scribus. The Weld Item solution in Scribus gives similar results as the Indesign solution, but it can be used more flexibly. A similar result can be achieved if I set the "Columns & Text Distances -- Top" property of the frame containing the columns to the height of the title and place the text frame containing the title here, then "Weld Items" |
|
|
@PeterBenedek your approach could be a starting point for the implementation. As far as I understood from Quark XPress's documentation, you can span any paragraph within a text frame, not only the first one. I see a lot of similarities with a table. From a technical point of view, I have some ideas for an implementation. We could have a new base class to handle layouts in rows and cols (simple content blocks). This base class could inherit for text frames and tables. For tables, of course, you would have more cell styling. Here some more text frame examples https://www.quark.com/documentation/quarkxpress/2024/english/User%20Guide/_5_3719690306931965E7_6.html#_C1CD3DD4933948A5ADB104A01E4DB3D4_6_7_4 |
|
|
Yes @nitramr you can span any paragraph in the text frame but typically in newsprint publications this is just the first/second paragraph (for a headline and/or drop head) and this matches our use case -- and seemingly the use case of @sreerajp who originally opened the issue. There are lots of other features offered by column flow in QXP which we just don't require, but they could be useful for others. I've had a play with the weld features and it's still not quite right for this use case. It takes a lot of manual steps to accomplish what QXP/ID do. Although we can achieve the same result, the key is being able to achieve it quickly with minimal clicks. It's hard to overstate exactly how useful this feature is for real-world publishing productivity. I would also draw to attention that the Column Flow feature is just the 4th tab to the right in the QXP toolbar because it's that important; listed well before things even like frame settings, run around, and alignment. This feature actually halves the time it takes to do a real-world layouts. |
|
|
while i see why it can be a huge time saver for your workflow, i fear that new comers start doing bigger parts of the layout inside of a text frame as if it was a word processor, with floating images above it and lot of spaces to make room for them. anyway, if it's really well implemented, it's probably a good feature. but i'd prefer a solution that improves the way the frame work together (like a better welding, mixed with the scrapbook), rather than one that simulates frames inside of frames. |
|
|
I found two nice videos that show the feature in action. It is for InDesign, but I guess it is similar in Quark XPress Span Columns https://www.youtube.com/watch?v=R0pgYBtPIHk Split Columns https://www.youtube.com/watch?v=pJ-EAEt_zrY |
|
|
Welding UI would require notable improvements before it can be used efficiently Eg See : 0011817: welded items move wild when moving their page (probably related to 0011132: Weld item don't follow correctly) 0012424: Resizing Welded Items leads to strange results 0013862: Welded items copy n pasting 0011019: Bug: unwanted move of welded items if welding point of master items doesnt change its position 0010799: welding point visibility feedback after welding 0010798: welding point placement and nature 0010797: welding point visibility 0010796: welded frames wire should all be visible when moving one |
|
|
if you work with columns, 'span over xx columns' is a very useful tool. i would like it to be part of a paragraph style. (if the style defines to span the paragraph over more columns than the actual frame contains, it just spans over the whole text frame…) i like columns (even if they simulate frames inside of a frame.) |
|
|
I'm trying to understand the text floating behavior for different col span options. Unfortunately, I'm on Linux and can't test anything in InDesign or Quark. Below you can find some test cases I prepared in Scribus. It simulates a huge text frame on a page with different paragraph column span options. I'm not sure if the text flow on page 5 and 6 is valid. Would be great if you, @BN_Dev, could confirm that, or can you please provide different scenarios from Quark to show what's possible? The sla file is compatible with Scribus 1.6.2 ColSpan.sla (106,459 bytes)
<?xml version="1.0" encoding="UTF-8"?>
<SCRIBUSUTF8NEW Version="1.6.2">
<DOCUMENT ANZPAGES="6" PAGEWIDTH="595.275590551181" PAGEHEIGHT="841.889763779528" BORDERLEFT="40" BORDERRIGHT="40" BORDERTOP="40" BORDERBOTTOM="40" PRESET="0" BleedTop="0" BleedLeft="0" BleedRight="0" BleedBottom="0" ORIENTATION="0" PAGESIZE="IsoA_A04" FIRSTNUM="1" BOOK="0" AUTOSPALTEN="1" ABSTSPALTEN="11" UNITS="1" DFONT="Arial Regular" DSIZE="12" DCOL="1" DGAP="0" TabFill="" TabWidth="36" TextDistLeft="0" TextDistRight="0" TextDistBottom="0" TextDistTop="0" FirstLineOffset="1" AUTHOR="" COMMENTS="" KEYWORDS="" PUBLISHER="" DOCDATE="" DOCTYPE="" DOCFORMAT="" DOCIDENT="" DOCSOURCE="" DOCLANGINFO="" DOCRELATION="" DOCCOVER="" DOCRIGHTS="" DOCCONTRIB="" TITLE="" SUBJECT="" VHOCH="33" VHOCHSC="66" VTIEF="33" VTIEFSC="66" VKAPIT="75" BASEGRID="14.4" BASEO="0" AUTOL="100" UnderlinePos="-1" UnderlineWidth="-1" StrikeThruPos="-1" StrikeThruWidth="-1" GROUPC="1" HCMS="1" DPSo="0" DPSFo="0" DPuse="1" DPgam="0" DPbla="1" DPPr="ISO Coated v2 300% (basICColor)" DPIn="sRGB display profile (ICC v2.2)" DPInCMYK="ISO Coated v2 300% (basICColor)" DPIn2="sRGB display profile (ICC v2.2)" DPIn3="ISO Coated v2 300% (basICColor)" DISc="1" DIIm="0" ALAYER="0" LANGUAGE="de" AUTOMATIC="1" AUTOCHECK="1" GUIDELOCK="0" SnapToGuides="1" SnapToGrid="0" SnapToElement="1" MINGRID="20.001" MAJGRID="100.001" SHOWGRID="0" SHOWGUIDES="1" showcolborders="1" SHOWFRAME="1" SHOWControl="0" SHOWLAYERM="0" SHOWMARGIN="1" SHOWBASE="0" SHOWPICT="1" SHOWLINK="0" rulerMode="1" showrulers="1" showBleed="1" rulerXoffset="0" rulerYoffset="0" GuideRad="10" GRAB="4" POLYC="4" POLYF="0.502" POLYR="0" POLYIR="0" POLYCUR="0" POLYOCUR="0" POLYS="0" arcStartAngle="30" arcSweepAngle="300" spiralStartAngle="0" spiralEndAngle="1080" spiralFactor="1.2" AutoSave="1" AutoSaveTime="600000" AutoSaveCount="1" AutoSaveKeep="0" AUtoSaveInDocDir="1" AutoSaveDir="" ScratchBottom="20.001" ScratchLeft="100.001" ScratchRight="100.001" ScratchTop="20.001" GapHorizontal="0" GapVertical="40" StartArrow="0" EndArrow="0" PEN="Black" BRUSH="None" PENLINE="Black" PENTEXT="Black" StrokeText="Black" TextBackGround="None" TextLineColor="None" TextBackGroundShade="100" TextLineShade="100" TextPenShade="100" TextStrokeShade="100" STIL="1" STILLINE="1" WIDTH="1" WIDTHLINE="1" PENSHADE="100" LINESHADE="100" BRUSHSHADE="100" CPICT="None" PICTSHADE="100" CSPICT="None" PICTSSHADE="100" PICTSCX="1" PICTSCY="1" PSCALE="1" PASPECT="1" EmbeddedPath="0" HalfRes="1" dispX="10.001" dispY="10.001" constrain="15" MINORC="#00ff00" MAJORC="#00ff00" GuideC="#000080" BaseC="#c0c0c0" renderStack="2 0 4 1 3" GridType="0" PAGEC="#ffffff" MARGC="#0000ff" RANDF="0" currentProfile="PDF 1.4" calligraphicPenFillColor="Black" calligraphicPenLineColor="Black" calligraphicPenFillColorShade="100" calligraphicPenLineColorShade="100" calligraphicPenLineWidth="1" calligraphicPenAngle="0" calligraphicPenWidth="10" calligraphicPenStyle="1">
<CheckProfile Name="PDF 1.3" ignoreErrors="0" autoCheck="1" checkGlyphs="1" checkOrphans="1" checkOverflow="1" checkPictures="1" checkPartFilledImageFrames="0" checkResolution="1" checkTransparency="1" minResolution="144" maxResolution="2400" checkAnnotations="0" checkRasterPDF="1" checkForGIF="1" ignoreOffLayers="0" checkNotCMYKOrSpot="0" checkDeviceColorsAndOutputIntent="0" checkFontNotEmbedded="1" checkFontIsOpenType="1" checkAppliedMasterDifferentSide="1" checkEmptyTextFrames="1"/>
<CheckProfile Name="PDF 1.4" ignoreErrors="0" autoCheck="1" checkGlyphs="1" checkOrphans="1" checkOverflow="1" checkPictures="1" checkPartFilledImageFrames="0" checkResolution="1" checkTransparency="0" minResolution="144" maxResolution="2400" checkAnnotations="0" checkRasterPDF="1" checkForGIF="1" ignoreOffLayers="0" checkNotCMYKOrSpot="0" checkDeviceColorsAndOutputIntent="0" checkFontNotEmbedded="1" checkFontIsOpenType="1" checkAppliedMasterDifferentSide="1" checkEmptyTextFrames="1"/>
<CheckProfile Name="PDF 1.5" ignoreErrors="0" autoCheck="1" checkGlyphs="1" checkOrphans="1" checkOverflow="1" checkPictures="1" checkPartFilledImageFrames="0" checkResolution="1" checkTransparency="0" minResolution="144" maxResolution="2400" checkAnnotations="0" checkRasterPDF="1" checkForGIF="1" ignoreOffLayers="0" checkNotCMYKOrSpot="0" checkDeviceColorsAndOutputIntent="0" checkFontNotEmbedded="1" checkFontIsOpenType="1" checkAppliedMasterDifferentSide="1" checkEmptyTextFrames="1"/>
<CheckProfile Name="PDF 1.6" ignoreErrors="0" autoCheck="1" checkGlyphs="1" checkOrphans="1" checkOverflow="1" checkPictures="1" checkPartFilledImageFrames="0" checkResolution="1" checkTransparency="0" minResolution="144" maxResolution="2400" checkAnnotations="0" checkRasterPDF="1" checkForGIF="1" ignoreOffLayers="0" checkNotCMYKOrSpot="0" checkDeviceColorsAndOutputIntent="0" checkFontNotEmbedded="1" checkFontIsOpenType="0" checkAppliedMasterDifferentSide="1" checkEmptyTextFrames="1"/>
<CheckProfile Name="PDF/X-1a" ignoreErrors="0" autoCheck="1" checkGlyphs="1" checkOrphans="1" checkOverflow="1" checkPictures="1" checkPartFilledImageFrames="0" checkResolution="1" checkTransparency="1" minResolution="144" maxResolution="2400" checkAnnotations="1" checkRasterPDF="1" checkForGIF="1" ignoreOffLayers="0" checkNotCMYKOrSpot="1" checkDeviceColorsAndOutputIntent="0" checkFontNotEmbedded="1" checkFontIsOpenType="1" checkAppliedMasterDifferentSide="1" checkEmptyTextFrames="1"/>
<CheckProfile Name="PDF/X-3" ignoreErrors="0" autoCheck="1" checkGlyphs="1" checkOrphans="1" checkOverflow="1" checkPictures="1" checkPartFilledImageFrames="0" checkResolution="1" checkTransparency="1" minResolution="144" maxResolution="2400" checkAnnotations="1" checkRasterPDF="1" checkForGIF="1" ignoreOffLayers="0" checkNotCMYKOrSpot="0" checkDeviceColorsAndOutputIntent="1" checkFontNotEmbedded="1" checkFontIsOpenType="1" checkAppliedMasterDifferentSide="1" checkEmptyTextFrames="1"/>
<CheckProfile Name="PDF/X-4" ignoreErrors="0" autoCheck="1" checkGlyphs="1" checkOrphans="1" checkOverflow="1" checkPictures="1" checkPartFilledImageFrames="0" checkResolution="1" checkTransparency="0" minResolution="144" maxResolution="2400" checkAnnotations="1" checkRasterPDF="1" checkForGIF="1" ignoreOffLayers="0" checkNotCMYKOrSpot="0" checkDeviceColorsAndOutputIntent="1" checkFontNotEmbedded="1" checkFontIsOpenType="0" checkAppliedMasterDifferentSide="1" checkEmptyTextFrames="1"/>
<CheckProfile Name="PostScript" ignoreErrors="0" autoCheck="1" checkGlyphs="1" checkOrphans="1" checkOverflow="1" checkPictures="1" checkPartFilledImageFrames="0" checkResolution="1" checkTransparency="1" minResolution="144" maxResolution="2400" checkAnnotations="0" checkRasterPDF="1" checkForGIF="1" ignoreOffLayers="0" checkNotCMYKOrSpot="0" checkDeviceColorsAndOutputIntent="0" checkFontNotEmbedded="0" checkFontIsOpenType="0" checkAppliedMasterDifferentSide="1" checkEmptyTextFrames="1"/>
<COLOR NAME="Black" SPACE="CMYK" C="0" M="0" Y="0" K="100"/>
<COLOR NAME="Blue" SPACE="RGB" R="0" G="0" B="255"/>
<COLOR NAME="Cool Black" SPACE="CMYK" C="60" M="0" Y="0" K="100"/>
<COLOR NAME="Cyan" SPACE="CMYK" C="100" M="0" Y="0" K="0"/>
<COLOR NAME="Green" SPACE="CMYK" C="75.4" M="0" Y="92.8" K="0"/>
<COLOR NAME="Magenta" SPACE="CMYK" C="15" M="74.2" Y="0" K="0"/>
<COLOR NAME="Red" SPACE="RGB" R="255" G="0" B="0"/>
<COLOR NAME="Registration" SPACE="CMYK" C="100" M="100" Y="100" K="100" Register="1"/>
<COLOR NAME="Rich Black" SPACE="CMYK" C="60" M="40" Y="40" K="100"/>
<COLOR NAME="Sticky Note" SPACE="CMYK" C="0" M="0" Y="21.7" K="0"/>
<COLOR NAME="Warm Black" SPACE="CMYK" C="0" M="60" Y="29.8039215686275" K="100"/>
<COLOR NAME="White" SPACE="CMYK" C="0" M="0" Y="0" K="0"/>
<COLOR NAME="Yellow" SPACE="CMYK" C="0" M="0" Y="100" K="0"/>
<HYPHEN/>
<CHARSTYLE CNAME="Default Character Style" DefaultStyle="1" FONT="Arial Regular" FONTSIZE="12" FONTFEATURES="" FEATURES="inherit" FCOLOR="Black" FSHADE="100" HyphenWordMin="3" SCOLOR="Black" BGCOLOR="None" BGSHADE="100" SSHADE="100" TXTSHX="5" TXTSHY="-5" TXTOUT="1" TXTULP="-0.1" TXTULW="-0.1" TXTSTP="-0.1" TXTSTW="-0.1" SCALEH="100" SCALEV="100" BASEO="0" KERN="0" LANGUAGE="de"/>
<STYLE NAME="Default Paragraph Style" DefaultStyle="1" ALIGN="0" DIRECTION="0" LINESPMode="0" LINESP="15" INDENT="0" RMARGIN="0" FIRST="0" VOR="0" NACH="0" ParagraphEffectOffset="0" DROP="0" DROPLIN="2" Bullet="0" Numeration="0" HyphenConsecutiveLines="2" BCOLOR="None" BSHADE="100"/>
<STYLE NAME="Base Paragraph" FIRST="14.1732283464567" NACH="5" LANGUAGE="de"/>
<STYLE NAME="Red" PARENT="Base Paragraph" FCOLOR="Red"/>
<STYLE NAME="Blue" PARENT="Base Paragraph" FCOLOR="Cyan"/>
<STYLE NAME="Green" PARENT="Base Paragraph" FCOLOR="Green"/>
<STYLE NAME="Purple" PARENT="Base Paragraph" FCOLOR="Magenta"/>
<TableStyle NAME="Default Table Style" DefaultStyle="1" FillColor="None" FillShade="100">
<TableBorderLeft>
<TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
</TableBorderLeft>
<TableBorderRight>
<TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
</TableBorderRight>
<TableBorderTop>
<TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
</TableBorderTop>
<TableBorderBottom>
<TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
</TableBorderBottom>
</TableStyle>
<CellStyle NAME="Default Cell Style" DefaultStyle="1" FillColor="None" FillShade="100" LeftPadding="1" RightPadding="1" TopPadding="1" BottomPadding="1"/>
<MultiLine Name="Border">
<SubLine Color="Yellow" Shade="100" Dash="6" LineEnd="0" LineJoin="0" Width="1" Shortcut=""/>
</MultiLine>
<LAYERS NUMMER="0" LEVEL="0" NAME="Background" SICHTBAR="1" DRUCKEN="1" EDIT="1" SELECT="0" FLOW="1" TRANS="1" BLEND="0" OUTL="0" LAYERC="#000000"/>
<Printer firstUse="1" toFile="0" useAltPrintCommand="0" outputSeparations="0" useSpotColors="1" useColor="1" mirrorH="0" mirrorV="0" useICC="1" doGCR="0" doClip="0" setDevParam="0" useDocBleeds="1" cropMarks="0" bleedMarks="0" registrationMarks="0" colorMarks="0" includePDFMarks="1" PSLevel="3" PrintEngine="3" markLength="20.0013" markOffset="0" BleedTop="0" BleedLeft="0" BleedRight="0" BleedBottom="0" printer="File" filename="" separationName="All" printerCommand=""/>
<PDF firstUse="0" Thumbnails="0" Articles="0" Bookmarks="0" Compress="1" CMethod="0" Quality="0" EmbedPDF="0" MirrorH="0" MirrorV="0" Clip="0" rangeSel="0" rangeTxt="" RotateDeg="0" PresentMode="0" RecalcPic="0" FontEmbedding="0" Grayscale="0" RGBMode="1" UseProfiles="0" UseProfiles2="0" Binding="0" PicRes="300" Resolution="300" Version="14" Intent="1" Intent2="0" SolidP="sRGB display profile (ICC v2.2)" ImageP="sRGB display profile (ICC v2.2)" PrintP="ISO Coated v2 300% (basICColor)" InfoString="" BTop="0" BLeft="0" BRight="0" BBottom="0" useDocBleeds="1" cropMarks="0" bleedMarks="0" registrationMarks="0" colorMarks="0" docInfoMarks="0" markLength="20.0012598425197" markOffset="0" ImagePr="0" PassOwner="" PassUser="" Permissions="-4" Encrypt="0" UseLayers="0" UseLpi="0" UseSpotColors="1" doMultiFile="0" displayBookmarks="0" displayFullscreen="0" displayLayers="0" displayThumbs="0" hideMenuBar="0" hideToolBar="0" fitWindow="0" openAfterExport="0" PageLayout="0" openAction="">
<Fonts Name="Arial Regular"/>
<LPI Color="" Frequency="10" Angle="0" SpotFunction="0"/>
<LPI Color="Black" Frequency="133" Angle="45" SpotFunction="3"/>
<LPI Color="Cyan" Frequency="133" Angle="105" SpotFunction="3"/>
<LPI Color="Magenta" Frequency="133" Angle="75" SpotFunction="3"/>
<LPI Color="Yellow" Frequency="133" Angle="90" SpotFunction="3"/>
</PDF>
<DocItemAttributes/>
<Indexes/>
<TablesOfContents/>
<NotesStyles>
<notesStyle Name="Default" Start="1" Endnotes="0" Type="Type_1_2_3" Range="0" Prefix="" Suffix=")" AutoHeight="1" AutoWidth="1" AutoRemove="1" AutoWeld="1" SuperNote="1" SuperMaster="1" MarksStyle="" NotesStyle=""/>
</NotesStyles>
<PageSets>
<Set Name="Single Page" FirstPage="0" Rows="1" Columns="1"/>
<Set Name="Facing Pages" FirstPage="1" Rows="1" Columns="2">
<PageNames Name="Left Page"/>
<PageNames Name="Right Page"/>
</Set>
<Set Name="3-Fold" FirstPage="0" Rows="1" Columns="3">
<PageNames Name="Left Page"/>
<PageNames Name="Middle"/>
<PageNames Name="Right Page"/>
</Set>
<Set Name="4-Fold" FirstPage="0" Rows="1" Columns="4">
<PageNames Name="Left Page"/>
<PageNames Name="Middle Left"/>
<PageNames Name="Middle Right"/>
<PageNames Name="Right Page"/>
</Set>
</PageSets>
<Sections>
<Section Number="0" Name="Section 1" From="0" To="5" Type="Type_1_2_3" Start="1" Reversed="0" Active="1" FillChar="0" FieldWidth="0"/>
</Sections>
<MASTERPAGE PAGEXPOS="100.001" PAGEYPOS="20.001" PAGEWIDTH="595.275590551181" PAGEHEIGHT="841.889763779528" BORDERLEFT="40" BORDERRIGHT="40" BORDERTOP="40" BORDERBOTTOM="40" NUM="0" NAM="Normal" MNAM="" Size="IsoA_A04" Orientation="0" LEFT="0" PRESET="0" VerticalGuides="" HorizontalGuides="" AGhorizontalAutoGap="0" AGverticalAutoGap="0" AGhorizontalAutoCount="0" AGverticalAutoCount="0" AGhorizontalAutoRefer="0" AGverticalAutoRefer="0" AGSelection="0 0 0 0" pageEffectDuration="1" pageViewDuration="1" effectType="0" Dm="0" M="0" Di="0"/>
<PAGE PAGEXPOS="100.001" PAGEYPOS="20.001" PAGEWIDTH="595.275590551181" PAGEHEIGHT="841.889763779528" BORDERLEFT="40" BORDERRIGHT="40" BORDERTOP="40" BORDERBOTTOM="40" NUM="0" NAM="" MNAM="Normal" Size="IsoA_A04" Orientation="0" LEFT="0" PRESET="0" VerticalGuides="" HorizontalGuides="" AGhorizontalAutoGap="0" AGverticalAutoGap="0" AGhorizontalAutoCount="0" AGverticalAutoCount="0" AGhorizontalAutoRefer="0" AGverticalAutoRefer="0" AGSelection="0 0 0 0" pageEffectDuration="1" pageViewDuration="1" effectType="0" Dm="0" M="0" Di="0"/>
<PAGE PAGEXPOS="100.001" PAGEYPOS="901.890763779528" PAGEWIDTH="595.275590551181" PAGEHEIGHT="841.889763779528" BORDERLEFT="40" BORDERRIGHT="40" BORDERTOP="40" BORDERBOTTOM="40" NUM="1" NAM="" MNAM="Normal" Size="IsoA_A04" Orientation="0" LEFT="0" PRESET="0" VerticalGuides="" HorizontalGuides="" AGhorizontalAutoGap="0" AGverticalAutoGap="0" AGhorizontalAutoCount="0" AGverticalAutoCount="0" AGhorizontalAutoRefer="0" AGverticalAutoRefer="0" AGSelection="0 0 0 0" pageEffectDuration="1" pageViewDuration="1" effectType="0" Dm="0" M="0" Di="0"/>
<PAGE PAGEXPOS="100.001" PAGEYPOS="1783.78052755906" PAGEWIDTH="595.275590551181" PAGEHEIGHT="841.889763779528" BORDERLEFT="40" BORDERRIGHT="40" BORDERTOP="40" BORDERBOTTOM="40" NUM="2" NAM="" MNAM="Normal" Size="IsoA_A04" Orientation="0" LEFT="0" PRESET="0" VerticalGuides="" HorizontalGuides="" AGhorizontalAutoGap="0" AGverticalAutoGap="0" AGhorizontalAutoCount="0" AGverticalAutoCount="0" AGhorizontalAutoRefer="0" AGverticalAutoRefer="0" AGSelection="0 0 0 0" pageEffectDuration="1" pageViewDuration="1" effectType="0" Dm="0" M="0" Di="0"/>
<PAGE PAGEXPOS="100.001" PAGEYPOS="2665.67029133858" PAGEWIDTH="595.275590551181" PAGEHEIGHT="841.889763779528" BORDERLEFT="40" BORDERRIGHT="40" BORDERTOP="40" BORDERBOTTOM="40" NUM="3" NAM="" MNAM="Normal" Size="IsoA_A04" Orientation="0" LEFT="0" PRESET="0" VerticalGuides="" HorizontalGuides="" AGhorizontalAutoGap="0" AGverticalAutoGap="0" AGhorizontalAutoCount="0" AGverticalAutoCount="0" AGhorizontalAutoRefer="0" AGverticalAutoRefer="0" AGSelection="0 0 0 0" pageEffectDuration="1" pageViewDuration="1" effectType="0" Dm="0" M="0" Di="0"/>
<PAGE PAGEXPOS="100.001" PAGEYPOS="3547.56005511811" PAGEWIDTH="595.275590551181" PAGEHEIGHT="841.889763779528" BORDERLEFT="40" BORDERRIGHT="40" BORDERTOP="40" BORDERBOTTOM="40" NUM="4" NAM="" MNAM="Normal" Size="IsoA_A04" Orientation="0" LEFT="0" PRESET="0" VerticalGuides="" HorizontalGuides="" AGhorizontalAutoGap="0" AGverticalAutoGap="0" AGhorizontalAutoCount="0" AGverticalAutoCount="0" AGhorizontalAutoRefer="0" AGverticalAutoRefer="0" AGSelection="0 0 0 0" pageEffectDuration="1" pageViewDuration="1" effectType="0" Dm="0" M="0" Di="0"/>
<PAGE PAGEXPOS="100.001" PAGEYPOS="4429.44981889764" PAGEWIDTH="595.275590551181" PAGEHEIGHT="841.889763779528" BORDERLEFT="40" BORDERRIGHT="40" BORDERTOP="40" BORDERBOTTOM="40" NUM="5" NAM="" MNAM="Normal" Size="IsoA_A04" Orientation="0" LEFT="0" PRESET="0" VerticalGuides="" HorizontalGuides="" AGhorizontalAutoGap="0" AGverticalAutoGap="0" AGhorizontalAutoCount="0" AGverticalAutoCount="0" AGhorizontalAutoRefer="0" AGverticalAutoRefer="0" AGSelection="0 0 0 0" pageEffectDuration="1" pageViewDuration="1" effectType="0" Dm="0" M="0" Di="0"/>
<PAGEOBJECT XPOS="140.001" YPOS="3587.56005511811" OwnPage="4" ItemID="959595144" PTYPE="4" WIDTH="515.275590551181" HEIGHT="550.433782608696" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="3" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L515.276 0 L515.276 550.434 L0 550.434 L0 0 Z" copath="M0 0 L515.276 0 L515.276 550.434 L0 550.434 L0 0 Z" gXpos="140.001" gYpos="3587.56005511811" gWidth="0" gHeight="0" PSTYLE="Purple" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Purple"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus Suspendisse potenti. Cras ut mi sit amet quam consequat consequat. Aenean ut lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel sapien. Nullam non turpis. Pellentesque elementum pharetra ligula. In rhoncus. Aliquam vel enim consequat sem aliquet hendrerit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam felis. Quisque lobortis euismod metus. Nam ante. Nulla fermentum, risus non pulvinar porttitor, enim pede egestas nibh, sit amet posuere metus tortor id enim. Donec at sem. Vestibulum in lectus ut diam lacinia lacinia. Maecenas sit amet nulla. Suspendisse vel dolor. Nunc hendrerit elit vitae quam. In nonummy velit nec lorem. Etiam rhoncus felis a turpis. Phasellus ullamcorper arcu vitae wisi. Pellentesque urna odio, varius eget, id eros venenatis adipiscing. Cras et lectus ut nisl pharetra ornare. Cras et lectus ut nisl pharetra ornare."/>
<trail PARENT="Purple"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="3587.56005511811" OwnPage="4" ItemID="735204296" PTYPE="6" WIDTH="341.303347826087" HEIGHT="157.925196850394" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" TEXTFLOWMODE="1" path="M0 0 L341.303 0 L341.303 157.925 L0 157.925 L0 0 Z" copath="M0 0 L341.303 0 L341.303 157.925 L0 157.925 L0 0 Z" gXpos="140.001" gYpos="3587.56005511811" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="140.001" YPOS="3587.56005511811" OwnPage="4" ItemID="101063444" PTYPE="4" WIDTH="340.520739130435" HEIGHT="158.425196850394" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L340.521 0 L340.521 158.425 L0 158.425 L0 0 Z" copath="M0 0 L340.521 0 L340.521 158.425 L0 158.425 L0 0 Z" gXpos="140.001" gYpos="3587.56005511811" gWidth="0" gHeight="0" PSTYLE="Blue" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Blue"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus."/>
<trail PARENT="Blue"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="3969.92225984252" OwnPage="4" ItemID="1668380511" PTYPE="6" WIDTH="341.303347826087" HEIGHT="168.854186579938" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" TEXTFLOWMODE="1" path="M0 0 L341.303 0 L341.303 168.854 L0 168.854 L0 0 Z" copath="M0 0 L341.303 0 L341.303 168.854 L0 168.854 L0 0 Z" gXpos="140.001" gYpos="3969.92225984252" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="140.001" YPOS="3975.99383772681" OwnPage="4" ItemID="20028263" PTYPE="4" WIDTH="340.520739130435" HEIGHT="162" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L340.521 0 L340.521 162 L0 162 L0 0 Z" copath="M0 0 L340.521 0 L340.521 162 L0 162 L0 0 Z" gXpos="140.001" gYpos="3975.99383772681" gWidth="0" gHeight="0" PSTYLE="Green" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Green"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus."/>
<para PARENT="Green"/>
<ITEXT CH="Suspendisse potenti. Cras ut mi sit amet quam consequat consequat. Aenean ut lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel sapien. Nullam non turpis. Pellentesque elementum pharetra ligula. In rhoncus. Aliquam vel enim consequat sem aliquet hendrerit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam felis."/>
<trail PARENT="Green"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-31.2608695652174" YPOS="106.696152173913" OwnPage="0" ItemID="333402193" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-31.2608695652174" gYpos="106.696152173913" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 3"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-34.260869565217" YPOS="309.696152173913" OwnPage="0" ItemID="399945856" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="25.511811023622" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-34.2608695652174" gYpos="309.696152173913" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 1"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="60.001" OwnPage="0" ItemID="1368698205" PTYPE="4" WIDTH="515.275590551181" HEIGHT="761.389763779528" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="3" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L515.276 0 L515.276 761.39 L0 761.39 L0 0 Z" copath="M0 0 L515.276 0 L515.276 761.39 L0 761.39 L0 0 Z" gXpos="140.001" gYpos="-1703.77852755906" gWidth="0" gHeight="0" PSTYLE="Purple" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Purple"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus Suspendisse potenti. Cras ut mi sit amet quam consequat consequat. Aenean ut lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel sapien. Nullam non turpis. Pellentesque elementum pharetra ligula. In rhoncus. Aliquam vel enim consequat sem aliquet hendrerit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam felis. Quisque lobortis euismod metus. Nam ante. Nulla fermentum, risus non pulvinar porttitor, enim pede egestas nibh, sit amet posuere metus tortor id enim. Donec at sem. Vestibulum in lectus ut diam lacinia lacinia. Maecenas sit amet nulla. Suspendisse vel dolor. Nunc hendrerit elit vitae quam. In nonummy velit nec lorem. Etiam rhoncus felis a turpis. Phasellus ullamcorper arcu vitae wisi. Pellentesque urna odio, varius eget, id eros venenatis adipiscing. Cras et lectus ut nisl pharetra ornare. Proin leo risus, elementum eget, ultrices vitae, molestie sed, erat. Curabitur et lectus in tellus egestas hendrerit. Sed dapibus ipsum. Quisque sit amet ligula. Suspendisse odio dolor, semper id, feugiat quis, sodales id, mauris. Curabitur id ligula ac libero malesuada pharetra. Nam iaculis blandit purus. Mauris odio nibh, hendrerit id, cursus vel, sagittis a, dolor. Nullam turpis lacus, ultrices vel, sagittis vitae, dapibus vel, elit. Suspendisse auctor, sapien et suscipit tempor, turpis enim consequat sem, eu dictum nunc lorem at massa. Pellentesque scelerisque purus. Etiam sed enim. Maecenas sed tortor id turpis consequat consequat. Curabitur fringilla. Sed risus wisi, dictum a, sagittis nec, luctus ac, neque. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed nibh neque, aliquam ut, sagittis id, gravida et, est. Aenean consectetuer pretium enim. Aenean tellus quam, condimentum a, adipiscing et, lacinia vel, ante. Praesent faucibus dignissim enim. Aliquam tincidunt. Mauris leo ante, condimentum eget, vestibulum sit amet, fringilla eget, diam. Nam ultricies ullamcorper nibh. Etiam neque. Ut posuere laoreet pede."/>
<trail PARENT="Purple"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="60.001" OwnPage="0" ItemID="842657655" PTYPE="6" WIDTH="514.775590551181" HEIGHT="110.629434782609" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" TEXTFLOWMODE="1" path="M0 0 L514.776 0 L514.776 110.629 L0 110.629 L0 0 Z" copath="M0 0 L514.776 0 L514.776 110.629 L0 110.629 L0 0 Z" gXpos="140.001" gYpos="-1703.77852755906" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="140.001" YPOS="60.001" OwnPage="0" ItemID="444321352" PTYPE="4" WIDTH="515.275590551181" HEIGHT="111.129434782609" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L515.276 0 L515.276 111.129 L0 111.129 L0 0 Z" copath="M0 0 L515.276 0 L515.276 111.129 L0 111.129 L0 0 Z" gXpos="140.001" gYpos="-1703.77852755906" gWidth="0" gHeight="0" PSTYLE="Blue" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Blue"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus."/>
<trail PARENT="Blue"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="683.826770410494" YPOS="1174.02019856214" OwnPage="1" ItemID="451185761" PTYPE="4" WIDTH="147.128751328637" HEIGHT="130.067415611092" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PCOLOR="Sticky Note" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="5.66929133858268" TEXTRA="5.66929133858268" BEXTRA="5.66929133858268" REXTRA="5.66929133858268" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" HASSOFTSHADOW="1" SOFTSHADOWXOFFSET="5.00031496062992" SOFTSHADOWYOFFSET="5.00031496062992" SOFTSHADOWCOLOR="Black" SOFTSHADOWBLURRADIUS="0" SOFTSHADOWSHADE="100" SOFTSHADOWBLENDMODE="0" SOFTSHADOWOPACITY="0.67" SOFTSHADOWERASE="0" SOFTSHADOWOBJTRANS="0" path="M0 0 L147.129 0 L147.129 130.067 L0 130.067 L0 0 Z" copath="M0 0 L147.129 0 L147.129 130.067 L0 130.067 L0 0 Z" gXpos="683.826770410494" gYpos="1174.02019856214" gWidth="0" gHeight="0" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle/>
<ITEXT CH="Pink paragraph height must be dxnamically calculated to fit bewteen blue and green one without empty space."/>
<trail/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="1823.78052755906" OwnPage="2" ItemID="475053993" PTYPE="4" WIDTH="515.275590551181" HEIGHT="550.433782608696" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="3" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L515.276 0 L515.276 550.434 L0 550.434 L0 0 Z" copath="M0 0 L515.276 0 L515.276 550.434 L0 550.434 L0 0 Z" gXpos="140.001" gYpos="941.890763779528" gWidth="0" gHeight="0" PSTYLE="Purple" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Purple"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus Suspendisse potenti. Cras ut mi sit amet quam consequat consequat. Aenean ut lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel sapien. Nullam non turpis. Pellentesque elementum pharetra ligula. In rhoncus. Aliquam vel enim consequat sem aliquet hendrerit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam felis. Quisque lobortis euismod metus. Nam ante. Nulla fermentum, risus non pulvinar porttitor, enim pede egestas nibh, sit amet posuere metus tortor id enim. Donec at sem. Vestibulum in lectus ut diam lacinia lacinia. Maecenas sit amet nulla. Suspendisse vel dolor. Nunc hendrerit elit vitae quam. In nonummy velit nec lorem. Etiam rhoncus felis a turpis. Phasellus ullamcorper arcu vitae wisi. Pellentesque urna odio, varius eget, id eros venenatis adipiscing. Cras et lectus ut nisl pharetra ornare. Proin leo risus, elementum eget, ultrices vitae, molestie sed, erat. Curabitur et lectus in tellus egestas hendrerit. Sed dapibus ipsum. Quisque sit amet ligula. Suspendisse odio dolor, semper id, feugiat quis, sodales id, mauris. Curabitur id ligula ac libero malesuada pharetra."/>
<para PARENT="Purple"/>
<ITEXT CH="Nam iaculis blandit purus. Mauris odio nibh, hendrerit id, cursus vel, sagittis a, dolor. Nullam turpis lacus, ultrices vel, sagittis vitae, dapibus vel, elit. Suspendisse auctor, sapien et suscipit tempor, turpis enim consequat sem, eu dictum nunc lorem at massa. Pellentesque scelerisque purus. Etiam sed enim. Maecenas sed tortor id turpis consequat consequat. Curabitur fringilla. Sed risus wisi, dictum a, sagittis nec, luctus ac, neque. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed nibh neque, aliquam ut, sagittis id, gravida et, est. Aenean consectetuer pretium enim. Aenean tellus quam, condimentum a, adipiscing et, lacinia vel, ante. Praesent faucibus dignissim enim. Aliquam tincidunt. Mauris leo ante, condimentum eget, vestibulum sit amet, fringilla eget, diam. Nam ultricies ullamcorper nibh. Etiam neque. Ut posuere laoreet pede."/>
<trail PARENT="Purple"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="1823.78052755906" OwnPage="2" ItemID="348455947" PTYPE="6" WIDTH="341.303347826087" HEIGHT="157.925196850394" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" TEXTFLOWMODE="1" path="M0 0 L341.303 0 L341.303 157.925 L0 157.925 L0 0 Z" copath="M0 0 L341.303 0 L341.303 157.925 L0 157.925 L0 0 Z" gXpos="140.001" gYpos="941.890763779528" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="140.001" YPOS="1823.78052755906" OwnPage="2" ItemID="580201693" PTYPE="4" WIDTH="340.520739130435" HEIGHT="158.425196850394" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L340.521 0 L340.521 158.425 L0 158.425 L0 0 Z" copath="M0 0 L340.521 0 L340.521 158.425 L0 158.425 L0 0 Z" gXpos="140.001" gYpos="941.890763779528" gWidth="0" gHeight="0" PSTYLE="Blue" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Blue"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus."/>
<trail PARENT="Blue"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="2206.14273228347" OwnPage="2" ItemID="801294445" PTYPE="6" WIDTH="515.275590551181" HEIGHT="168.854186579938" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" TEXTFLOWMODE="1" path="M0 0 L515.276 0 L515.276 168.854 L0 168.854 L0 0 Z" copath="M0 0 L515.276 0 L515.276 168.854 L0 168.854 L0 0 Z" gXpos="140.001" gYpos="1324.25296850394" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="140.001" YPOS="2212.21431016775" OwnPage="2" ItemID="1688273596" PTYPE="4" WIDTH="515.275590551181" HEIGHT="162" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L515.276 0 L515.276 162 L0 162 L0 0 Z" copath="M0 0 L515.276 0 L515.276 162 L0 162 L0 0 Z" gXpos="140.001" gYpos="1330.32454638822" gWidth="0" gHeight="0" PSTYLE="Green" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Green"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus. Suspendisse potenti. Cras ut mi sit amet quam consequat consequat. Aenean ut lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel sapien. Nullam non turpis. Pellentesque elementum pharetra ligula. In rhoncus. Aliquam vel enim consequat sem aliquet hendrerit. "/>
<trail PARENT="Green"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-31.260869565217" YPOS="1868.08387538514" OwnPage="2" ItemID="543698193" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-31.2608695652174" gYpos="986.194111605615" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 2"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-34.260869565217" YPOS="2071.08387538514" OwnPage="2" ItemID="689507062" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-34.2608695652174" gYpos="1189.19411160562" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 1"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-32.260869565217" YPOS="2282.08387538514" OwnPage="2" ItemID="794504443" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-32.2608695652174" gYpos="1400.19411160562" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 3"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-31.260869565217" YPOS="3631.8634029442" OwnPage="4" ItemID="788892593" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-31.2608695652174" gYpos="1868.08387538514" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 2"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-34.260869565217" YPOS="3834.8634029442" OwnPage="4" ItemID="1887976795" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-34.2608695652174" gYpos="2071.08387538514" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 1"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-32.260869565217" YPOS="4045.8634029442" OwnPage="4" ItemID="208179738" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-32.2608695652174" gYpos="2282.08387538514" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 2"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="684.739130434783" YPOS="4054.34935313249" OwnPage="4" ItemID="624871660" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="28.3464566929134" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="684.739130434783" gYpos="2290.56982557344" gWidth="0" gHeight="0" ALIGN="0" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="0"/>
<ITEXT CH="Colspan = 1"/>
<trail ALIGN="0"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="488.347456692913" YPOS="3975.99383772681" OwnPage="4" ItemID="1038739082" PTYPE="4" WIDTH="166.929133858268" HEIGHT="162" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L166.929 0 L166.929 162 L0 162 L0 0 Z" copath="M0 0 L166.929 0 L166.929 162 L0 162 L0 0 Z" gXpos="488.347456692913" gYpos="3975.99383772681" gWidth="0" gHeight="0" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at..."/>
<trail PARENT="Blue"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="4139.27644642246" OwnPage="4" ItemID="201085982" PTYPE="4" WIDTH="340.520739130435" HEIGHT="210.17337247518" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L340.521 0 L340.521 210.173 L0 210.173 L0 0 Z" copath="M0 0 L340.521 0 L340.521 210.173 L0 210.173 L0 0 Z" gXpos="140.001" gYpos="4139.27644642246" gWidth="0" gHeight="0" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus Suspendisse potenti. Cras ut mi sit amet quam consequat consequat. Aenean ut lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel sapien. Nullam non turpis. Pellentesque elementum pharetra ligula. In rhoncus. Aliquam vel enim consequat sem aliquet hendrerit."/>
<trail PARENT="Purple"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-31.260869565217" YPOS="4232.8634029442" OwnPage="4" ItemID="161587645" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-31.2608695652174" gYpos="2469.08387538514" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 2"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="2375.4969188634" OwnPage="2" ItemID="44494140" PTYPE="4" WIDTH="515.275590551181" HEIGHT="210.17337247518" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="3" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L515.276 0 L515.276 210.173 L0 210.173 L0 0 Z" copath="M0 0 L515.276 0 L515.276 210.173 L0 210.173 L0 0 Z" gXpos="140.001" gYpos="3257.38668264293" gWidth="0" gHeight="0" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at..."/>
<para PARENT="Blue"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus Suspendisse potenti. Cras ut mi sit amet quam consequat consequat. Aenean ut lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel sapien. Nullam non turpis. Pellentesque elementum pharetra ligula. In rhoncus. Aliquam vel enim consequat sem aliquet hendrerit."/>
<trail PARENT="Purple"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-31.260869565217" YPOS="2455.06186597056" OwnPage="2" ItemID="1175222164" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-31.2608695652174" gYpos="1573.17210219103" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 1"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="2705.67029133858" OwnPage="3" ItemID="950127382" PTYPE="4" WIDTH="515.275590551181" HEIGHT="550.433782608696" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="3" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L515.276 0 L515.276 550.434 L0 550.434 L0 0 Z" copath="M0 0 L515.276 0 L515.276 550.434 L0 550.434 L0 0 Z" gXpos="140.001" gYpos="1823.78052755906" gWidth="0" gHeight="0" PSTYLE="Purple" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Purple"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus Suspendisse potenti. Cras ut mi sit amet quam consequat consequat. Aenean ut lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel sapien. Nullam non turpis. Pellentesque elementum pharetra ligula. In rhoncus. Aliquam vel enim consequat sem aliquet hendrerit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam felis. Quisque lobortis euismod metus. Nam ante. Nulla fermentum, risus non pulvinar porttitor, enim pede egestas nibh, sit amet posuere metus tortor id enim. Donec at sem. Vestibulum in lectus ut diam lacinia lacinia. Maecenas sit amet nulla. Suspendisse vel dolor. Nunc hendrerit elit vitae quam. In nonummy velit nec lorem. Etiam rhoncus felis a turpis. Phasellus ullamcorper arcu vitae wisi. Pellentesque urna odio, varius eget, id eros venenatis adipiscing. Cras et lectus ut nisl pharetra ornare. Cras et lectus ut nisl pharetra ornare."/>
<trail PARENT="Purple"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="3094.10407394728" OwnPage="3" ItemID="1495238475" PTYPE="4" WIDTH="515.275590551181" HEIGHT="373.455981170832" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="3" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L515.276 0 L515.276 373.456 L0 373.456 L0 0 Z" copath="M0 0 L515.276 0 L515.276 373.456 L0 373.456 L0 0 Z" gXpos="140.001" gYpos="2212.21431016775" gWidth="0" gHeight="0" PSTYLE="Blue" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Blue"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus Suspendisse potenti. Cras ut mi sit amet quam consequat consequat. Aenean ut lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel sapien. Nullam non turpis. Pellentesque elementum pharetra ligula. In rhoncus. Aliquam vel enim consequat sem aliquet hendrerit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam felis. Quisque lobortis euismod metus. Nam ante. Nulla fermentum, risus non pulvinar porttitor, enim pede egestas nibh, sit amet posuere metus tortor id enim. Donec at sem. Vestibulum in lectus ut diam lacinia lacinia. Maecenas sit amet nulla. Suspendisse vel dolor. Nunc hendrerit elit vitae quam. In nonummy velit nec lorem. Etiam rhoncus felis a turpis. Phasellus ullamcorper arcu vitae wisi. Pellentesque urna odio, varius eget, id eros venenatis adipiscing. Cras et lectus ut nisl pharetra ornare."/>
<trail PARENT="Blue"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="2705.67029133858" OwnPage="3" ItemID="2002725290" PTYPE="6" WIDTH="341.303347826087" HEIGHT="157.925196850394" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" TEXTFLOWMODE="1" path="M0 0 L341.303 0 L341.303 157.925 L0 157.925 L0 0 Z" copath="M0 0 L341.303 0 L341.303 157.925 L0 157.925 L0 0 Z" gXpos="140.001" gYpos="1823.78052755906" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="140.001" YPOS="2705.67029133858" OwnPage="3" ItemID="1988942110" PTYPE="4" WIDTH="340.520739130435" HEIGHT="158.425196850394" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L340.521 0 L340.521 158.425 L0 158.425 L0 0 Z" copath="M0 0 L340.521 0 L340.521 158.425 L0 158.425 L0 0 Z" gXpos="140.001" gYpos="1823.78052755906" gWidth="0" gHeight="0" PSTYLE="Blue" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Blue"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus."/>
<trail PARENT="Blue"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="3088.03249606299" OwnPage="3" ItemID="703766859" PTYPE="6" WIDTH="341.303347826087" HEIGHT="168.854186579938" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" TEXTFLOWMODE="1" path="M0 0 L341.303 0 L341.303 168.854 L0 168.854 L0 0 Z" copath="M0 0 L341.303 0 L341.303 168.854 L0 168.854 L0 0 Z" gXpos="140.001" gYpos="2206.14273228347" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="140.001" YPOS="3094.10407394728" OwnPage="3" ItemID="1139889666" PTYPE="4" WIDTH="340.520739130435" HEIGHT="162" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L340.521 0 L340.521 162 L0 162 L0 0 Z" copath="M0 0 L340.521 0 L340.521 162 L0 162 L0 0 Z" gXpos="140.001" gYpos="2212.21431016775" gWidth="0" gHeight="0" PSTYLE="Green" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Green"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus."/>
<para PARENT="Green"/>
<ITEXT CH="Suspendisse potenti. Cras ut mi sit amet quam consequat consequat. Aenean ut lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel sapien. Nullam non turpis. Pellentesque elementum pharetra ligula. In rhoncus. Aliquam vel enim consequat sem aliquet hendrerit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam felis."/>
<trail PARENT="Green"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-31.260869565217" YPOS="2749.97363916467" OwnPage="3" ItemID="2014426296" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-31.2608695652174" gYpos="104.304347826087" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 2"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-34.260869565217" YPOS="2952.97363916467" OwnPage="3" ItemID="1656565773" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-34.2608695652174" gYpos="307.304347826087" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 1"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-32.260869565217" YPOS="3163.97363916467" OwnPage="3" ItemID="1697619186" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-32.2608695652174" gYpos="518.304347826087" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 2"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-31.260869565217" YPOS="3350.97363916467" OwnPage="3" ItemID="44659016" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-31.2608695652174" gYpos="705.304347826087" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 1"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="4469.44981889764" OwnPage="5" ItemID="1815749325" PTYPE="4" WIDTH="515.275590551181" HEIGHT="550.433782608696" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="3" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L515.276 0 L515.276 550.434 L0 550.434 L0 0 Z" copath="M0 0 L515.276 0 L515.276 550.434 L0 550.434 L0 0 Z" gXpos="140.001" gYpos="2705.67029133859" gWidth="0" gHeight="0" PSTYLE="Purple" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Purple"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus Suspendisse potenti. Cras ut mi sit amet quam consequat consequat. Aenean ut lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel sapien. Nullam non turpis. Pellentesque elementum pharetra ligula. In rhoncus. Aliquam vel enim consequat sem aliquet hendrerit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam felis. Quisque lobortis euismod metus. Nam ante. Nulla fermentum, risus non pulvinar porttitor, enim pede egestas nibh, sit amet posuere metus tortor id enim. Donec at sem. Vestibulum in lectus ut diam lacinia lacinia. Maecenas sit amet nulla. Suspendisse vel dolor. Nunc hendrerit elit vitae quam. In nonummy velit nec lorem. Etiam rhoncus felis a turpis. Phasellus ullamcorper arcu vitae wisi. Pellentesque urna odio, varius eget, id eros venenatis adipiscing. Cras et lectus ut nisl pharetra ornare. Cras et lectus ut nisl pharetra ornare."/>
<trail PARENT="Purple"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="5019.88360150634" OwnPage="5" ItemID="1741022799" PTYPE="4" WIDTH="170.260369565217" HEIGHT="211.455981170832" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L170.26 0 L170.26 211.456 L0 211.456 L0 0 Z" copath="M0 0 L170.26 0 L170.26 211.456 L0 211.456 L0 0 Z" gXpos="140.001" gYpos="3256.10407394728" gWidth="0" gHeight="0" PSTYLE="Blue" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Blue"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris."/>
<trail PARENT="Blue"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="4469.44981889764" OwnPage="5" ItemID="32240356" PTYPE="6" WIDTH="341.303347826087" HEIGHT="157.925196850394" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" TEXTFLOWMODE="1" path="M0 0 L341.303 0 L341.303 157.925 L0 157.925 L0 0 Z" copath="M0 0 L341.303 0 L341.303 157.925 L0 157.925 L0 0 Z" gXpos="140.001" gYpos="2705.67029133859" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="140.001" YPOS="4469.44981889764" OwnPage="5" ItemID="677163627" PTYPE="4" WIDTH="340.520739130435" HEIGHT="158.425196850394" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L340.521 0 L340.521 158.425 L0 158.425 L0 0 Z" copath="M0 0 L340.521 0 L340.521 158.425 L0 158.425 L0 0 Z" gXpos="140.001" gYpos="2705.67029133859" gWidth="0" gHeight="0" PSTYLE="Blue" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Blue"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus."/>
<trail PARENT="Blue"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="4851.81202362205" OwnPage="5" ItemID="866757346" PTYPE="6" WIDTH="341.303347826087" HEIGHT="168.854186579938" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" TEXTFLOWMODE="1" path="M0 0 L341.303 0 L341.303 168.854 L0 168.854 L0 0 Z" copath="M0 0 L341.303 0 L341.303 168.854 L0 168.854 L0 0 Z" gXpos="140.001" gYpos="3088.032496063" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="140.001" YPOS="4857.88360150634" OwnPage="5" ItemID="1492955435" PTYPE="4" WIDTH="340.520739130435" HEIGHT="162" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L340.521 0 L340.521 162 L0 162 L0 0 Z" copath="M0 0 L340.521 0 L340.521 162 L0 162 L0 0 Z" gXpos="140.001" gYpos="3094.10407394728" gWidth="0" gHeight="0" PSTYLE="Green" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Green"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus."/>
<para PARENT="Green"/>
<ITEXT CH="Suspendisse potenti. Cras ut mi sit amet quam consequat consequat. Aenean ut lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel sapien. Nullam non turpis. Pellentesque elementum pharetra ligula. In rhoncus. Aliquam vel enim consequat sem aliquet hendrerit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam felis."/>
<trail PARENT="Green"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-31.260869565217" YPOS="4513.75316672373" OwnPage="5" ItemID="657091297" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-31.2608695652174" gYpos="986.194111605615" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 2"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-34.260869565217" YPOS="4716.75316672373" OwnPage="5" ItemID="1003652588" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-34.2608695652174" gYpos="1189.19411160562" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 1"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-32.260869565217" YPOS="4927.75316672373" OwnPage="5" ItemID="688782981" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-32.2608695652174" gYpos="1400.19411160562" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 2"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="310.652673913043" YPOS="5021.16621020199" OwnPage="5" ItemID="1735213341" PTYPE="4" WIDTH="344.623916638138" HEIGHT="210.17337247518" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L344.624 0 L344.624 210.173 L0 210.173 L0 0 Z" copath="M0 0 L344.624 0 L344.624 210.173 L0 210.173 L0 0 Z" gXpos="310.652673913043" gYpos="3257.38668264293" gWidth="0" gHeight="0" PSTYLE="Purple" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Purple"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris."/>
<para PARENT="Purple"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="676.739130434783" YPOS="5056.22438240329" OwnPage="5" ItemID="1361053427" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="28.3464566929134" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="676.739130434783" gYpos="3292.44485484424" gWidth="0" gHeight="0" ALIGN="0" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="0"/>
<ITEXT CH="Colspan = 2"/>
<trail ALIGN="0"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="489.320739130435" YPOS="4859.84387555632" OwnPage="5" ItemID="362370774" PTYPE="4" WIDTH="165.955851420746" HEIGHT="160.039725950016" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L165.956 0 L165.956 160.04 L0 160.04 L0 0 Z" copath="M0 0 L165.956 0 L165.956 160.04 L0 160.04 L0 0 Z" gXpos="489.320739130435" gYpos="3096.06434799726" gWidth="0" gHeight="0" PSTYLE="Blue" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Blue"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, "/>
<trail PARENT="Blue"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="676.739130434783" YPOS="4926.12273194112" OwnPage="5" ItemID="328125767" PTYPE="4" WIDTH="142.085956521739" HEIGHT="56.485963711054" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="28.3464566929134" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 56.486 L0 56.486 L0 0 Z" copath="M0 0 L142.086 0 L142.086 56.486 L0 56.486 L0 0 Z" gXpos="676.739130434783" gYpos="3162.34320438207" gWidth="0" gHeight="0" ALIGN="0" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="0"/>
<ITEXT CH="Colspan = 1"/>
<para ALIGN="0"/>
<ITEXT CH="blue = 1 paragraph"/>
<trail/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="607.651173913044" YPOS="5004.67237247518" OwnPage="5" ItemID="1724586097" PTYPE="5" WIDTH="450.620743886049" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="176.415389476062" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="605.564217391305" gYpos="5019.88360150634" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="655.276590551181" YPOS="160.434782608696" OwnPage="0" ItemID="2019261597" PTYPE="5" WIDTH="507.494697804946" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="177.702129395021" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="605.564217391305" gYpos="4137.99383772681" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="301.390304347827" YPOS="821.890763779528" OwnPage="0" ItemID="1213257846" PTYPE="5" WIDTH="632.12201614431" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="271.797338810556" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="605.564217391305" gYpos="4137.99383772681" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="470.390304347827" YPOS="821.890763779528" OwnPage="0" ItemID="944013161" PTYPE="5" WIDTH="632.12201614431" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="271.797338810556" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="774.564217391305" gYpos="4137.99383772681" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="462.08595652174" YPOS="1970.23758986648" OwnPage="2" ItemID="1979210894" PTYPE="5" WIDTH="310.902351569943" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="175.427995628005" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="605.564217391305" gYpos="5019.88360150634" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="297.216391304348" YPOS="2205.64273228347" OwnPage="2" ItemID="863109442" PTYPE="5" WIDTH="212.106170383125" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="276.780757797188" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="605.564217391305" gYpos="5019.88360150634" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="484.279083426602" YPOS="2205.64273228347" OwnPage="2" ItemID="481155647" PTYPE="5" WIDTH="369.058552114281" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="271.252604568939" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="792.626909513559" gYpos="5019.88360150634" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="642.607695652174" YPOS="2205.21753543307" OwnPage="2" ItemID="1205350641" PTYPE="5" WIDTH="489.827714401783" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="177.581224412626" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="792.626909513559" gYpos="5019.88360150634" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="629.392304347826" YPOS="2363.87819599453" OwnPage="2" ItemID="643232017" PTYPE="5" WIDTH="489.827714401783" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="177.581224412626" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="779.411518209211" gYpos="5178.54426206779" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="297.216391304348" YPOS="2571.28106812735" OwnPage="2" ItemID="1297204917" PTYPE="5" WIDTH="182.250580526042" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="277.898136902858" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="792.626909513559" gYpos="5019.88360150634" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="466.945232699955" YPOS="2585.67029133858" OwnPage="2" ItemID="508691230" PTYPE="5" WIDTH="195.680212648002" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="275.082067036507" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="962.355750909166" gYpos="5034.27282471757" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="464.172913043479" YPOS="2853.02019856214" OwnPage="3" ItemID="1538858346" PTYPE="5" WIDTH="313.239335527935" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="177.973754982319" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="792.626909513559" gYpos="5019.88360150634" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="299.303347826087" YPOS="3087.53249606299" OwnPage="3" ItemID="1638224428" PTYPE="5" WIDTH="212.687629477189" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="275.913634122298" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="792.626909513559" gYpos="5019.88360150634" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="473.070059809267" YPOS="3087.1072992126" OwnPage="3" ItemID="563832810" PTYPE="5" WIDTH="370.41762082021" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="273.468037835833" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="966.393621496738" gYpos="5019.45840465594" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="462.526428173903" YPOS="3247.17717825805" OwnPage="3" ItemID="783887209" PTYPE="5" WIDTH="313.239335527935" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="177.973754982319" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="790.980424643983" gYpos="5414.04058120225" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="299.303347826087" YPOS="3467.56005511811" OwnPage="3" ItemID="551498503" PTYPE="5" WIDTH="198.463848330558" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="275.861097324091" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="790.980424643983" gYpos="5414.04058120225" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="480.521739130435" YPOS="3467.56005511811" OwnPage="3" ItemID="1258247201" PTYPE="5" WIDTH="356.283718181735" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="272.14079134041" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="964.747136627162" gYpos="5413.61538435187" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="464.172913043479" YPOS="3734.90996234167" OwnPage="4" ItemID="1766371247" PTYPE="5" WIDTH="313.239335527935" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="177.973754982319" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="792.626909513559" gYpos="5019.88360150634" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="299.303347826087" YPOS="3969.42225984252" OwnPage="4" ItemID="394491139" PTYPE="5" WIDTH="212.687629477189" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="275.913634122298" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="792.626909513559" gYpos="5019.88360150634" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="473.070059809266" YPOS="3968.99706299213" OwnPage="4" ItemID="1791188140" PTYPE="5" WIDTH="370.41762082021" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="273.468037835833" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="966.393621496738" gYpos="5019.45840465595" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="446.955521739131" YPOS="4117.5652173913" OwnPage="4" ItemID="1748162178" PTYPE="5" WIDTH="131.738324817585" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="288.312412267119" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="795.628409513559" gYpos="5417.42983207806" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="638.583677165354" YPOS="4132.03099606299" OwnPage="4" ItemID="348316756" PTYPE="5" WIDTH="486.966115150351" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="177.263387341994" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="795.628409513559" gYpos="5418.71244077371" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="464.172913043479" YPOS="4616.79972612119" OwnPage="5" ItemID="1677792244" PTYPE="5" WIDTH="313.239335527935" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="177.973754982319" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="792.626909513559" gYpos="5019.88360150634" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="299.303347826087" YPOS="4851.31202362205" OwnPage="5" ItemID="318605024" PTYPE="5" WIDTH="212.687629477189" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="275.913634122298" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="792.626909513559" gYpos="5019.88360150634" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="473.070059809266" YPOS="4850.88682677166" OwnPage="5" ItemID="790449496" PTYPE="5" WIDTH="370.41762082021" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="273.468037835833" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="966.393621496738" gYpos="5019.45840465595" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="641.564217391305" YPOS="4851.31202362205" OwnPage="5" ItemID="1260618642" PTYPE="5" WIDTH="490.636552583654" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="178.356760618242" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="792.626909513559" gYpos="5257.39010612804" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="469.565217391304" YPOS="5004.24717562479" OwnPage="5" ItemID="1037122546" PTYPE="5" WIDTH="133.565628518448" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="278.505753471417" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="962.888779078776" gYpos="5172.81875350908" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="299.303347826087" YPOS="5213.84266381377" OwnPage="5" ItemID="1937749683" PTYPE="5" WIDTH="174.062427453712" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="273.738487018172" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="792.626909513559" gYpos="5382.41424169806" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="644.694652173914" YPOS="3086.68210236221" OwnPage="3" ItemID="226156522" PTYPE="5" WIDTH="491.30335032769" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="177.842340102087" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="795.237105165733" gYpos="5260.96747689149" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="-31.260869565217" YPOS="988.585915953441" OwnPage="1" ItemID="1572333367" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-31.2608695652174" gYpos="106.696152173913" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 3"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="-34.260869565217" YPOS="1191.58591595344" OwnPage="1" ItemID="1602490255" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="25.511811023622" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-34.2608695652174" gYpos="309.696152173913" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 1"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="941.890763779528" OwnPage="1" ItemID="1085056011" PTYPE="4" WIDTH="515.275590551181" HEIGHT="520.474179732972" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="3" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L515.276 0 L515.276 520.474 L0 520.474 L0 0 Z" copath="M0 0 L515.276 0 L515.276 520.474 L0 520.474 L0 0 Z" gXpos="140.001" gYpos="-1703.77852755906" gWidth="0" gHeight="0" PSTYLE="Purple" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Purple"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus Suspendisse potenti. Cras ut mi sit amet quam consequat consequat. Aenean ut lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel sapien. Nullam non turpis. Pellentesque elementum pharetra ligula. In rhoncus. Aliquam vel enim consequat sem aliquet hendrerit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam felis. Quisque lobortis euismod metus. Nam ante. Nulla fermentum, risus non pulvinar porttitor, enim pede egestas nibh, sit amet posuere metus tortor id enim. Donec at sem. Vestibulum in lectus ut diam lacinia lacinia. Maecenas sit amet nulla. Suspendisse vel dolor. Nunc hendrerit elit vitae quam. In nonummy velit nec lorem. Etiam rhoncus felis a turpis. Phasellus ullamcorper arcu vitae wisi. Pellentesque urna odio, varius eget, id eros venenatis adipiscing. Cras et lectus ut nisl pharetra ornare. Proin leo risus, elementum eget, ultrices vitae, molestie sed, erat. Curabitur et lectus in tellus egestas hendrerit. Sed dapibus ipsum. Quisque sit amet ligula. Suspendisse odio dolor, semper id, feugiat quis, sodales id, mauris. Curabitur id ligula ac libero malesuada pharetra. Nam iaculis blandit purus. Mauris odio nibh, hendrerit id, cursus vel, sagittis a, dolor. Nullam turpis lacus, ultrices vel, sagittis vitae, dapibus vel, elit. Suspendisse auctor, sapien et suscipit tempor, turpis enim consequat sem, eu dictum nunc lorem at massa. Pellentesque scelerisque purus. Etiam sed enim. Maecenas sed tortor id turpis consequat consequat. Curabitur fringilla. Sed risus wisi, dictum a, sagittis nec, luctus ac, neque. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed nibh neque, aliquam ut, sagittis id, gravida et, est. Aenean consectetuer pretium enim. Aenean tellus quam, condimentum a, adipiscing et, lacinia vel, ante. Praesent faucibus dignissim enim. Aliquam tincidunt. Mauris leo ante, condimentum eget, vestibulum sit amet, fringilla eget, diam. Nam ultricies ullamcorper nibh. Etiam neque. Ut posuere laoreet pede."/>
<trail PARENT="Purple"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="941.890763779528" OwnPage="1" ItemID="2032841065" PTYPE="6" WIDTH="514.775590551181" HEIGHT="110.629434782609" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" TEXTFLOWMODE="1" path="M0 0 L514.776 0 L514.776 110.629 L0 110.629 L0 0 Z" copath="M0 0 L514.776 0 L514.776 110.629 L0 110.629 L0 0 Z" gXpos="140.001" gYpos="-1703.77852755906" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="140.001" YPOS="941.890763779528" OwnPage="1" ItemID="800892399" PTYPE="4" WIDTH="515.275590551181" HEIGHT="111.129434782609" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="8.50393700787402" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L515.276 0 L515.276 111.129 L0 111.129 L0 0 Z" copath="M0 0 L515.276 0 L515.276 111.129 L0 111.129 L0 0 Z" gXpos="140.001" gYpos="-1703.77852755906" gWidth="0" gHeight="0" PSTYLE="Blue" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Blue"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus."/>
<trail PARENT="Blue"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="655.276590551181" YPOS="1042.32454638822" OwnPage="1" ItemID="1636690912" PTYPE="5" WIDTH="507.494697804946" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="177.702129395021" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="605.564217391305" gYpos="4137.99383772681" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="298.426196850394" YPOS="1456.69565217391" OwnPage="1" ItemID="965474455" PTYPE="5" WIDTH="385.4005735601" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="273.390093987451" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="605.564217391305" gYpos="4137.99383772681" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="473.04247826087" YPOS="1456.27045532352" OwnPage="1" ItemID="1680404991" PTYPE="5" WIDTH="384.684499981222" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="272.558771914919" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="774.564217391305" gYpos="4137.99383772681" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="647.087614173228" YPOS="1452.19103046902" OwnPage="1" ItemID="1446339371" PTYPE="5" WIDTH="495.93553093818" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="177.429301314609" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="597.375241013352" gYpos="4547.86032180761" gWidth="0" gHeight="0" LAYER="0"/>
<PAGEOBJECT XPOS="-31.260869565217" YPOS="1517.84320438206" OwnPage="1" ItemID="131617712" PTYPE="4" WIDTH="142.085956521739" HEIGHT="25.5217391304348" FRTYPE="0" CLIPEDIT="0" PWIDTH="1" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="28.3464566929134" VAlign="1" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" copath="M0 0 L142.086 0 L142.086 25.5217 L0 25.5217 L0 0 Z" gXpos="-31.2608695652174" gYpos="635.953440602534" gWidth="0" gHeight="0" ALIGN="2" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle ALIGN="2"/>
<ITEXT CH="Colspan = 3"/>
<trail ALIGN="2"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="140.001" YPOS="1462.3649435125" OwnPage="1" ItemID="1600585778" PTYPE="4" WIDTH="515.275590551181" HEIGHT="162" FRTYPE="0" CLIPEDIT="0" PWIDTH="0" PLINEART="1" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" LOCALROT="0" PICART="1" SCALETYPE="1" RATIO="1" COLUMNS="1" COLGAP="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" VAlign="0" FLOP="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" path="M0 0 L515.276 0 L515.276 162 L0 162 L0 0 Z" copath="M0 0 L515.276 0 L515.276 162 L0 162 L0 0 Z" gXpos="140.001" gYpos="1462.36494351249" gWidth="0" gHeight="0" PSTYLE="Green" LAYER="0" NEXTITEM="-1" BACKITEM="-1">
<StoryText>
<DefaultStyle PARENT="Green"/>
<ITEXT CH="Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut a sapien. Aliquam aliquet purus molestie dolor. Integer quis eros ut erat posuere dictum. Curabitur dignissim. Integer orci. Fusce vulputate lacus at ipsum. Quisque in libero nec mi laoreet volutpat. Aliquam eros pede, scelerisque quis, tristique cursus, placerat convallis, velit. Nam condimentum. Nulla ut mauris. Curabitur adipiscing, mauris non dictum aliquam, arcu risus dapibus diam, nec sollicitudin quam erat quis ligula. Aenean massa nulla, volutpat eu, accumsan et, fringilla eget, odio. Nulla placerat porta justo. Nulla vitae turpis. Praesent lacus. Suspendisse potenti. Cras ut mi sit amet quam consequat consequat. Aenean ut lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel sapien. Nullam non turpis. Pellentesque elementum pharetra ligula. In rhoncus. Aliquam vel enim consequat sem aliquet hendrerit. "/>
<trail PARENT="Green"/>
</StoryText>
</PAGEOBJECT>
<PAGEOBJECT XPOS="640.844177336528" YPOS="3968.57186614174" OwnPage="4" ItemID="1822053311" PTYPE="5" WIDTH="485.075874163268" HEIGHT="1" FRTYPE="0" CLIPEDIT="0" ROT="179.123303663785" PWIDTH="0.850393700787402" SHADE="0" PCOLOR2="Red" PLINEART="1" path="" endArrowIndex="1" gXpos="797.888909684733" gYpos="5255.25331085246" gWidth="0" gHeight="0" LAYER="0"/>
</DOCUMENT>
</SCRIBUSUTF8NEW>
|
|
|
@ale Regarding newcomers, I think most of those who don't know the difference between a word processor and layout program would probably already be using their default office tool. Of those that did try Scribus I think they'd fall at the first hurdle when typing and not seeing any text appear because they didn't yet create a text frame. It would be a shame for Scribus not to have a professional feature just because a newbie might use it wrong :( @nitramr I watched the videos and confirm that QuarkXPress behaves exactly the same. @utnik Yes column spans can also be associated to paragraph styles which is just next-stratosphere efficiency. Pasting a story in to a text frame and applying the headline style to the first paragraph is 90% of the job done! Press t (for text tool), 1 drag (create text frame), press Ctrl+V (paste), 1 click (in first para), 1 click (on style pallet). 3 keys and 3 mouse clicks :-O @JLuc I evaluated the welding and couldn't find an easy way to get it to weld the frame to just the x position and width, and keep them attached correctly while resizing the story box. Plus I had to create multiple text frames and I think in terms of that point alone, the game was already lost by the time I'd done that and setup all the welding, there was so much UI interaction it would have been easier to have done it manually with 2 frames. I'll look at the example files and get back to you @nitramr on that shortly. Thanks! |
|
|
Wow @nitramr your examples made my head spin! I struggled to understand what was happening on the pages because nobody would ever create anything like that in real life (probably get fired for doing so haha). I persisted and tried to recreate your PDF in QXP and found nothing but unpredictable behavior and bugs galore. Lots of crashes, lots of confusion, and lots of differences between my document and exported PDFs. A total nightmare for production and would certainly result in angry meetings if somebody was doing this before a deadline. I've come to the conclusion that column flow is very hard, and if Quark can't get it right (and I suspect Adobe also) then there's little hope. I beg the developers, please, do not try and recreate what Quark and ID let users do. I consider this a bug not a feature. The entire text frame looks haywire and going back to my first point, nobody would ever do this in real life. The only actual use case needed by the opening poster (and myself) is to span the first paragraph over all columns. Everything else is totally unnecessary for actual production and would be over-engineered if it supported it. I think to distill what's needed for actual use cases, the simplest implementation logic is: 1. Only spans are allowed (no splits/unspans) 2. A span can be 2-All columns 3. The vertical position of the next paragraph is always below the end of the span, regardless of how many columns it spanned 4. A paragraph style can contain a span property ("All" maps to however many columns are present in the parent text frame) |
|
|
^ just to mention for the above PDF that I created, each paragraph starts with a number for colspan or OFF/ALL meaning 3. Also interesting to note is I asked QXP to put a line in the gutters so where these do (and don't) show is a bit of a clue as to how QXP is understanding the rendering intent. |
|
|
Hi BN_Dev, thanks for the document. Interesting how Quark lays out the text. >> I struggled to understand what was happening on the pages because nobody would ever create anything like that in real life (probably get fired for doing so haha). I hope so too. :D I have an idea for a first version to minimize the potential of uncovered edge cases. # Option 1 Column spanning is not a paragraph feature, but more of a frame option. The first paragraph can always span x columns. Pro: Calculation for the second paragraph in the text frame is relative easy. Con: Could be messy/uncontrolled if text changes in connected previous text frames. # Option 2 Column spanning is a paragraph feature, but the paragraph always spans all columns. Pro: You can apply column spanning to more than one paragraph in the text frame. No influence from changing text from previous text frames. Con: Calculation more complex* *) if we always need to support full column width, we can calculate the text spacing between 2 column width paragraphs as follows: 1. Calculate the text height as if it had only 1 column 2. Divide the height by the number of columns in the text frame 3. The new height is the bottom boundary of text between 2 column spanning paragraphs |
|
|
Below some illustrations of what I meant. |
|
|
I'm glad you agree that the implementation in QXP (and I suspect ID) is a hot mess. A cautionary tale. Column spanning is an essential feature for story headlines (and subheadings) and basically nothing else. What they allowed the user to do is just ridiculous and they can't even get it right themselves based on how unpredictable the results are and how crashy the app is. I'm in favor of your second option; because being able to tie the span intent in to a style is an productivity power-move. Although I do think the number of columns should be flexible rather than an all-or-nothing approach, the calculations could be simplified by taking this approach: The para height is calculated; [para height] = [margin above] + ([num of cols] * ([width of col] + [width of gutter])) + [margin below] Start the top of the next para at [para height] [col counter] = 0 Begin laying out text in col [col counter] When it wraps, ++[col counter] if [col counter] + 1 <= [num of cols] then Start column y at [para height] else Start column y at 0 endif That will allow the columns flow in this PDF to work quite easily; and allow for subheadings too. p.s., I wonder if another easy approach to code this might be to add a virtual runaround to the areas where the para spans multiple columns as if it was a text frame above it? |
|
|
Having all the possible layouts at once on one single page makes it look crazy but there are probable legit usecases for each of the possible proposed layout situations |
|
|
I think it's a case of "just because you can doesn't mean you should". The right tool for that job is multiple text frames and chains. It's precisely the job it exists for. Whilst such layouts could be (horrendously) emulated by supporting every permutation of column flow; the point of the column flow tool was efficient headline layout. Everything else it can be wrangled in to supporting is entering the wrong tool territory. I could hammer in a nail using a wrench, but I should really know better :) |
|
|
I think this is a very useful feature. Here is my attempt at it; a series of 5 patches. The series depends on the `cc` patch series from 0000162. Feel free to work it around that if you want to hold that feature for now. ## `cs1-text-flow-region-infrastructure-v1.02.patch` - Depends on cc1 → cc2 → cc3 (from 0000162) - Introduces reusable flow-band and region infrastructure based on actual Custom Columns geometry. - Keeps Custom Columns authoritative for unequal column widths and gaps. - Does not enable visible paragraph spanning by itself. ## `cs2-column-span-property-persistence-v1.01.patch` - Depends on cs1. - Adds inheritable paragraph properties for layout mode and span spacing. - Adds SLA serialisation/loading, including legacy prototype compatibility. - Existing documents default to normal single-column paragraph flow. ## `cs3-column-span-all-layout-v1.02.patch` - Depends on cs1 → cs2. - Implements `All columns` through genuine pre-span, span and post-span layout bands. - Interrupts column flow at the spanning paragraph and resumes it below the span using the frame’s real column boundaries. - Supports unequal widths and gaps, multi-line spans, chained frames and insufficient-space cases. - Integrates keep-together, keep-with-next and widow/orphan handling, with bounded re-composition fall-back. ## `cs4-column-span-ui-v1.02.patch` - Depends on cs1 → cs2 → cs3. - Adds `None` and `All columns` controls to Style Manager and Text Properties. - Exposes `Space before` and `Space after` with document-unit conversion. - Supports named-style inheritance and local paragraph overrides. - Consolidates the controls under `Paragraph flow`, with consistent icons, labels, tab order and compact natural sizing. ## `cs5-column-span-recomposition-performance-v1.09.patch` - Depends on cs1 → cs2 → cs3 → cs4. - Caches settled span-layout decisions so normal edits do not repeatedly rediscover the same boundaries. - Validates or prunes cached steps when story or frame geometry changes. - Tightens span-bottom tracking, including real line descent and zero or positive `Space after` values. - Keeps bounded retries and ordinary-flow fall-back for irregular or pathological layouts. cs1-text-flow-region-infrastructure-v1.02.patch (13,209 bytes)
Index: scribus/pageitem_textframe.cpp
===================================================================
--- scribus/pageitem_textframe.cpp (revision 27861)
+++ scribus/pageitem_textframe.cpp (working copy)
@@ -377,7 +377,7 @@
int hyphenCount { 0 };
double colLeft { 0.0 };
double colRight { 0.0 };
- int column { 0 };
+ int regionIndex { 0 };
bool startOfCol { true };
bool hasDropCap;
double dropCapWidth { 0.0 };
@@ -406,48 +406,47 @@
double maxStretch { 0.0 };
ScribusDoc* doc { nullptr };
ITextContext* context { nullptr };
- QVector<TextColumnGeometry> columns;
+ QVector<TextFlowRegion> regions;
- /// remember frame dimensions and offsets
- LineControl(double w, double h, const MarginStruct& extra, double lCorr, ScribusDoc* d, ITextContext* ctx, const QVector<TextColumnGeometry>& columnGeometry)
+ /// Configure traversal through the frame's planned flow regions.
+ LineControl(const TextFlowPlan& flowPlan, double lCorr, ScribusDoc* d, ITextContext* ctx)
: hasDropCap(false)
- , doc(d), context(ctx), columns(columnGeometry)
+ , doc(d), context(ctx), regions(flowPlan.regions())
{
- insets = extra;
lineCorr = lCorr;
- frameWidth = w;
- frameHeight = h;
- if (!columns.isEmpty())
+ Q_ASSERT(!regions.isEmpty());
+ if (!regions.isEmpty())
{
- colLeft = columns.first().left;
- colRight = colLeft + columns.first().width;
+ colLeft = regions.first().bounds.left();
+ colRight = regions.first().bounds.right();
}
}
- /// move position to next column
- void nextColumn(TextLayout &textLayout)
+ /// Move to the active region in story-flow order.
+ void nextRegion(TextLayout &textLayout)
{
startOfCol = true;
- const bool rtl = textLayout.story()->defaultStyle().direction() == ParagraphStyle::RTL;
- const int columnCount = static_cast<int>(columns.size());
- const int physicalColumn = rtl ? columnCount - column - 1 : column;
- if (physicalColumn < 0 || physicalColumn >= columnCount)
+ if (!hasCurrentRegion())
return;
- const TextColumnGeometry& geometry = columns.at(physicalColumn);
- colLeft = geometry.left;
- textLayout.addColumn(colLeft, geometry.width);
- //now colRight is REAL column right edge
- colRight = colLeft + geometry.width;
+ const TextFlowRegion& region = regions.at(regionIndex);
+ colLeft = region.bounds.left();
+ colRight = region.bounds.right();
+ textLayout.addRegion(region);
+ // colRight is now the real region right edge.
if (legacy)
colRight += lineCorr;
xPos = colLeft;
- yPos = insets.top() + lineCorr;
+ yPos = region.flowTop;
lineData.colLeft = colLeft;
}
+ bool hasCurrentRegion() const { return regionIndex < regions.size(); }
+ bool hasNextRegion() const { return regionIndex + 1 < regions.size(); }
+ bool isLastRegion() const { return !hasNextRegion(); }
+
bool isEndOfCol(double morespace = 0)
{
- return yPos + morespace + insets.bottom() + lineCorr > frameHeight;
+ return yPos + morespace > regions.at(regionIndex).flowBottom;
}
/**
@@ -1039,9 +1038,6 @@
}
private:
- double frameWidth;
- double frameHeight;
- MarginStruct insets;
double lineCorr;
};
@@ -1346,8 +1342,8 @@
QList<GlyphCluster> glyphClusters; // = textShaper.shape();
// std::sort(glyphClusters.begin(), glyphClusters.end(), logicalGlyphRunComp);
- LineControl current(m_width, m_height, m_textDistanceMargins, lineCorr, m_Doc, context, columnGeometry());
- current.nextColumn(textLayout);
+ LineControl current(initialFlowPlan(), lineCorr, m_Doc, context);
+ current.nextRegion(textLayout);
lastLineY = m_textDistanceMargins.top();
@@ -1995,8 +1991,8 @@
}
if (current.isEndOfCol(realDesc))
{
- current.column++;
- if (current.column < m_columns)
+ current.regionIndex++;
+ if (current.hasCurrentRegion())
{
newColumn = true;
break;
@@ -2007,7 +2003,7 @@
}
if (newColumn)
{
- current.nextColumn(textLayout);
+ current.nextRegion(textLayout);
current.mustLineEnd = current.colRight;
current.restartX = current.xPos;
lastLineY = current.yPos;
@@ -2740,7 +2736,7 @@
current.updateHeightMetrics();
if (current.isEndOfCol(current.lineData.descent))
{
- if (current.isEmpty || current.column + 1 == m_columns)
+ if (current.isEmpty || current.isLastRegion())
{
goNoRoom = true;
m_maxChars = a + 1;
@@ -2858,12 +2854,12 @@
if (goNextColumn)
{
goNextColumn = false;
- current.column++;
- if (current.column < m_columns)
+ current.regionIndex++;
+ if (current.hasCurrentRegion())
{
if (firstLineOffset() == FLOPRealGlyphHeight)
asce = 0;
- current.nextColumn(textLayout);
+ current.nextRegion(textLayout);
current.mustLineEnd = current.colRight;
current.addLeftIndent = true;
lastLineY = m_textDistanceMargins.top();
@@ -5174,6 +5170,49 @@
return geometry.at(qBound(0, physicalColumn, static_cast<int>(geometry.size()) - 1)).width;
}
+TextFlowBand PageItem_TextFrame::columnBand(double bandTop, double bandBottom, double flowTop, double flowBottom) const
+{
+ double lineCorr = 0.0;
+ if (lineColor() != CommonStrings::None)
+ lineCorr = m_lineWidth / 2.0;
+ if (bandBottom < 0.0)
+ bandBottom = m_height;
+ bandTop = qBound(0.0, bandTop, m_height);
+ bandBottom = qBound(bandTop, bandBottom, m_height);
+ if (flowTop < 0.0)
+ flowTop = bandTop + m_textDistanceMargins.top() + lineCorr;
+ if (flowBottom < 0.0)
+ flowBottom = bandBottom - m_textDistanceMargins.bottom() - lineCorr;
+
+ TextFlowBand band;
+ band.kind = TextFlowBandKind::Columns;
+ band.top = bandTop;
+ band.bottom = bandBottom;
+ const QVector<TextColumnGeometry> geometry = columnGeometry();
+ const bool isRTL = itemText.defaultStyle().direction() == ParagraphStyle::RTL;
+ const int columnCount = static_cast<int>(geometry.size());
+ band.regions.reserve(columnCount);
+ for (int logicalColumn = 0; logicalColumn < columnCount; ++logicalColumn)
+ {
+ const int physicalColumn = isRTL ? columnCount - logicalColumn - 1 : logicalColumn;
+ const TextColumnGeometry& column = geometry.at(physicalColumn);
+ TextFlowRegion region;
+ region.bounds = QRectF(column.left, bandTop, column.width, bandBottom - bandTop);
+ region.flowTop = flowTop;
+ region.flowBottom = flowBottom;
+ region.logicalColumn = logicalColumn;
+ band.regions.append(region);
+ }
+ return band;
+}
+
+TextFlowPlan PageItem_TextFrame::initialFlowPlan() const
+{
+ TextFlowPlan plan;
+ plan.bands.append(columnBand());
+ return plan;
+}
+
/*
void PageItem_TextFrame::drawOverflowMarker(ScPainter *p)
{
Index: scribus/pageitem_textframe.h
===================================================================
--- scribus/pageitem_textframe.h (revision 27861)
+++ scribus/pageitem_textframe.h (working copy)
@@ -126,6 +126,8 @@
protected:
+ TextFlowBand columnBand(double bandTop = 0.0, double bandBottom = -1.0, double flowTop = -1.0, double flowBottom = -1.0) const;
+ TextFlowPlan initialFlowPlan() const;
QRegion calcAvailableRegion();
QRegion m_availableRegion;
void DrawObj_Item(ScPainter *p, const QRectF& e) override;
Index: scribus/text/boxes.cpp
===================================================================
--- scribus/text/boxes.cpp (revision 27861)
+++ scribus/text/boxes.cpp (working copy)
@@ -100,8 +100,10 @@
{
if (m_direction == D_Horizontal)
nH = qMax(m_naturalHeight, box->naturalHeight());
- else
+ else if (m_direction == D_Vertical)
nH = ceil(box->y() + box->ascent() - box->naturalDescent());
+ else
+ nH = qMax(nH, box->y() + box->naturalHeight());
}
return nH;
}
@@ -133,11 +135,16 @@
m_naturalWidth += box->width();
m_naturalHeight = qMax(m_naturalHeight, box->naturalHeight());
}
- else
+ else if (m_direction == D_Vertical)
{
m_naturalWidth = qMax(m_naturalWidth, box->naturalWidth());
m_naturalHeight = ceil(box->y() + box->ascent() - box->naturalDescent());
}
+ else
+ {
+ m_naturalWidth = qMax(m_naturalWidth, box->x() + box->naturalWidth());
+ m_naturalHeight = qMax(m_naturalHeight, box->y() + box->naturalHeight());
+ }
}
}
Index: scribus/text/boxes.h
===================================================================
--- scribus/text/boxes.h (revision 27861)
+++ scribus/text/boxes.h (working copy)
@@ -38,7 +38,8 @@
enum BoxDirection
{
D_Horizontal,
- D_Vertical
+ D_Vertical,
+ D_Absolute
};
Box() = default;
Index: scribus/text/textlayout.cpp
===================================================================
--- scribus/text/textlayout.cpp (revision 27861)
+++ scribus/text/textlayout.cpp (working copy)
@@ -29,11 +29,28 @@
#include "boxes.h"
#include "itextcontext.h"
+QVector<TextFlowRegion> TextFlowPlan::regions() const
+{
+ QVector<TextFlowRegion> result;
+ const int bandCount = static_cast<int>(bands.size());
+ for (int bandIndex = 0; bandIndex < bandCount; ++bandIndex)
+ {
+ const TextFlowBand& band = bands.at(bandIndex);
+ for (TextFlowRegion region : band.regions)
+ {
+ region.bandKind = band.kind;
+ region.bandIndex = bandIndex;
+ result.append(region);
+ }
+ }
+ return result;
+}
+
TextLayout::TextLayout(StoryText* text, ITextContext* frame)
: m_story(text),
m_frame(frame)
{
- m_box = new GroupBox(Box::D_Horizontal);
+ m_box = new GroupBox(Box::D_Absolute);
}
TextLayout::~TextLayout()
@@ -82,13 +99,13 @@
assert(ls->lastChar() < story()->length());
assert(!m_box->boxes().empty());
- GroupBox* column = dynamic_cast<GroupBox*>(m_box->boxes().constLast());
- assert(column);
+ GroupBox* region = dynamic_cast<GroupBox*>(m_box->boxes().constLast());
+ assert(region);
if (ls->type() == Box::T_PathLine)
- ls->setAscent(ls->y() - column->naturalHeight());
+ ls->setAscent(ls->y() - region->naturalHeight());
- ls->setWidth(column->width());
- column->addBox(ls);
+ ls->setWidth(region->width());
+ region->addBox(ls);
}
// Remove the last line from the list. Used when we need to backtrack on the layouting.
@@ -132,10 +149,10 @@
p->save();
p->translate(m_box->x(), m_box->y());
- for (const Box* column : m_box->boxes())
+ for (const Box* region : m_box->boxes())
{
- const QList<const Box*>& lineBoxes = column->boxes();
- QRectF colBBox = column->bbox();
+ const QList<const Box*>& lineBoxes = region->boxes();
+ QRectF regionBBox = region->bbox();
for (int j = 0; j < lineBoxes.count(); ++j)
{
@@ -161,7 +178,7 @@
if (backColor != CommonStrings::None)
{
- QRectF rect(colBBox.x(), box->y(), colBBox.width(), box->height());
+ QRectF rect(regionBBox.x(), regionBBox.y() + box->y(), regionBBox.width(), box->height());
lastRect |= rect;
}
@@ -194,12 +211,12 @@
p->restore();
}
-void TextLayout::addColumn(double colLeft, double colWidth)
+void TextLayout::addRegion(const TextFlowRegion& region)
{
GroupBox *newBox = new GroupBox(Box::D_Vertical);
- newBox->moveTo(colLeft, 0.0);
- newBox->setWidth(colWidth);
- newBox->setAscent(m_frame->height());
+ newBox->moveTo(region.bounds.left(), region.bounds.top());
+ newBox->setWidth(region.bounds.width());
+ newBox->setAscent(region.bounds.height());
m_box->addBox(newBox);
// Update the box width and height, any better place to do this?
@@ -207,10 +224,18 @@
m_box->setWidth(m_frame->width());
}
+void TextLayout::addColumn(double colLeft, double colWidth)
+{
+ TextFlowRegion region;
+ region.bounds = QRectF(colLeft, 0.0, colWidth, m_frame->height());
+ region.flowBottom = m_frame->height();
+ addRegion(region);
+}
+
void TextLayout::clear()
{
delete m_box;
- m_box = new GroupBox(Box::D_Horizontal);
+ m_box = new GroupBox(Box::D_Absolute);
}
void TextLayout::setStory(StoryText *story)
Index: scribus/text/textlayout.h
===================================================================
--- scribus/text/textlayout.h (revision 27861)
+++ scribus/text/textlayout.h (working copy)
@@ -17,6 +17,8 @@
#define TEXTLAYOUT_H
#include <QList>
+#include <QRectF>
+#include <QVector>
#include "scribusapi.h"
@@ -32,6 +34,40 @@
class TextLayoutPainter;
class ScreenPainter;
class ITextContext;
+
+enum class TextFlowBandKind
+{
+ Columns,
+ Span
+};
+
+struct TextFlowRegion
+{
+ QRectF bounds;
+ double flowTop { 0.0 };
+ double flowBottom { 0.0 };
+ TextFlowBandKind bandKind { TextFlowBandKind::Columns };
+ int bandIndex { 0 };
+ int logicalColumn { 0 };
+};
+
+struct TextFlowBand
+{
+ TextFlowBandKind kind { TextFlowBandKind::Columns };
+ int storyStart { -1 };
+ double top { 0.0 };
+ double bottom { 0.0 };
+ QVector<TextFlowRegion> regions;
+};
+
+struct TextFlowPlan
+{
+ QVector<TextFlowBand> bands;
+
+ QVector<TextFlowRegion> regions() const;
+ bool isEmpty() const { return bands.isEmpty(); }
+};
+
/**
This class manages the physical layout of a textframe, ie. its line
structure and the lines' glyph layouts. It will use some of the layouters above to create a Box.
@@ -68,6 +104,7 @@
void appendLine(LineBox* ls);
void removeLastLine ();
+ void addRegion(const TextFlowRegion& region);
void addColumn(double colLeft, double colWidth);
void clear();
cs2-column-span-property-persistence-v1.01.patch (4,896 bytes)
Index: scribus/plugins/fileloader/scribus171format/scribus171format.cpp
===================================================================
--- scribus/plugins/fileloader/scribus171format/scribus171format.cpp (revision 27861)
+++ scribus/plugins/fileloader/scribus171format/scribus171format.cpp (working copy)
@@ -3793,6 +3793,32 @@
static const QString KeepTogether("KeepTogether");
if (attrs.hasAttribute(KeepTogether))
newStyle.setKeepTogether(attrs.valueAsInt(KeepTogether));
+
+ static const QString ParagraphLayout("ParagraphLayout");
+ static const QString ExperimentalColumnSpan("ColumnSpan");
+ if (attrs.hasAttribute(ParagraphLayout))
+ {
+ const int value = attrs.valueAsInt(ParagraphLayout);
+ if (value >= ParagraphStyle::ParagraphLayoutSingleColumn && value <= ParagraphStyle::ParagraphLayoutSpanColumns)
+ newStyle.setParagraphLayout(static_cast<ParagraphStyle::ParagraphLayoutMode>(value));
+ }
+ else if (attrs.hasAttribute(ExperimentalColumnSpan))
+ {
+ // Compatibility with documents written by the pre-foundation span prototype.
+ const int value = attrs.valueAsInt(ExperimentalColumnSpan);
+ if (value == 0)
+ newStyle.setParagraphLayout(ParagraphStyle::ParagraphLayoutSingleColumn);
+ else if (value == 1)
+ newStyle.setParagraphLayout(ParagraphStyle::ParagraphLayoutSpanColumns);
+ }
+
+ static const QString SpanSpaceBefore("SpanSpaceBefore");
+ if (attrs.hasAttribute(SpanSpaceBefore))
+ newStyle.setSpanSpaceBefore(qMax(0.0, attrs.valueAsDouble(SpanSpaceBefore)));
+
+ static const QString SpanSpaceAfter("SpanSpaceAfter");
+ if (attrs.hasAttribute(SpanSpaceAfter))
+ newStyle.setSpanSpaceAfter(qMax(0.0, attrs.valueAsDouble(SpanSpaceAfter)));
//Remove uppercase in 1.8 format
if (attrs.hasAttribute("BCOLOR"))
newStyle.setBackgroundColor(attrs.valueAsString("BCOLOR", CommonStrings::None));
Index: scribus/plugins/fileloader/scribus171format/scribus171format_save.cpp
===================================================================
--- scribus/plugins/fileloader/scribus171format/scribus171format_save.cpp (revision 27861)
+++ scribus/plugins/fileloader/scribus171format/scribus171format_save.cpp (working copy)
@@ -923,6 +923,12 @@
docu.writeAttribute("KeepWithNext", style.keepWithNext());
if (!style.isInhKeepTogether())
docu.writeAttribute("KeepTogether", style.keepTogether());
+ if (!style.isInhParagraphLayout())
+ docu.writeAttribute("ParagraphLayout", style.paragraphLayout());
+ if (!style.isInhSpanSpaceBefore())
+ docu.writeAttribute("SpanSpaceBefore", style.spanSpaceBefore());
+ if (!style.isInhSpanSpaceAfter())
+ docu.writeAttribute("SpanSpaceAfter", style.spanSpaceAfter());
if (!style.isInhBackgroundColor())
docu.writeAttribute("ParagraphBackgroundColor", style.backgroundColor());
if (!style.isInhBackgroundShade())
Index: scribus/styles/paragraphstyle.attrdefs.cxx
===================================================================
--- scribus/styles/paragraphstyle.attrdefs.cxx (revision 27861)
+++ scribus/styles/paragraphstyle.attrdefs.cxx (working copy)
@@ -37,6 +37,9 @@
ATTRDEF(int, keepLinesEnd, KeepLinesEnd, 0)
ATTRDEF(bool, keepWithNext, KeepWithNext, false)
ATTRDEF(bool, keepTogether, KeepTogether, false)
+ATTRDEF(ParagraphStyle::ParagraphLayoutMode, paragraphLayout, ParagraphLayout, ParagraphStyle::ParagraphLayoutSingleColumn)
+ATTRDEF(double, spanSpaceBefore, SpanSpaceBefore, 0.0)
+ATTRDEF(double, spanSpaceAfter, SpanSpaceAfter, 0.0)
ATTRDEF(bool, hasDropCap, HasDropCap, false)
ATTRDEF(int, dropCapLines, DropCapLines, 2)
ATTRDEF(double, parEffectOffset, ParEffectOffset, 0.0)
Index: scribus/styles/paragraphstyle.cpp
===================================================================
--- scribus/styles/paragraphstyle.cpp (revision 27861)
+++ scribus/styles/paragraphstyle.cpp (working copy)
@@ -266,6 +266,11 @@
return QString::number(static_cast<int>(val));
}
+static QString toXMLString(ParagraphStyle::ParagraphLayoutMode val)
+{
+ return QString::number(static_cast<int>(val));
+}
+
static QString toXMLString(const QList<ParagraphStyle::TabRecord> & )
{
return "dummy";
@@ -351,6 +356,12 @@
}
template<>
+ParagraphStyle::ParagraphLayoutMode parse<ParagraphStyle::ParagraphLayoutMode>(const Xml_string& str)
+{
+ return parseEnum<ParagraphStyle::ParagraphLayoutMode>(str);
+}
+
+template<>
ParagraphStyle::LineSpacingMode parse<ParagraphStyle::LineSpacingMode>(const Xml_string& str)
{
return parseEnum<ParagraphStyle::LineSpacingMode>(str);
Index: scribus/styles/paragraphstyle.h
===================================================================
--- scribus/styles/paragraphstyle.h (revision 27861)
+++ scribus/styles/paragraphstyle.h (working copy)
@@ -50,6 +50,12 @@
RTL = 1
};
+ enum ParagraphLayoutMode
+ {
+ ParagraphLayoutSingleColumn = 0,
+ ParagraphLayoutSpanColumns = 1
+ };
+
enum OpticalMarginType
{
OM_None = 0,
cs3-column-span-all-layout-v1.02.patch (19,918 bytes)
Index: scribus/pageitem_textframe.cpp
===================================================================
--- scribus/pageitem_textframe.cpp (revision 27861)
+++ scribus/pageitem_textframe.cpp (working copy)
@@ -377,6 +377,7 @@
int hyphenCount { 0 };
double colLeft { 0.0 };
double colRight { 0.0 };
+ double regionTop { 0.0 };
int regionIndex { 0 };
bool startOfCol { true };
bool hasDropCap;
@@ -431,6 +432,7 @@
const TextFlowRegion& region = regions.at(regionIndex);
colLeft = region.bounds.left();
colRight = region.bounds.right();
+ regionTop = region.bounds.top();
textLayout.addRegion(region);
// colRight is now the real region right edge.
if (legacy)
@@ -443,6 +445,63 @@
bool hasCurrentRegion() const { return regionIndex < regions.size(); }
bool hasNextRegion() const { return regionIndex + 1 < regions.size(); }
bool isLastRegion() const { return !hasNextRegion(); }
+ bool isSpanRegion() const
+ {
+ return hasCurrentRegion() && regions.at(regionIndex).bandKind == TextFlowBandKind::Span;
+ }
+ int currentBandIndex() const
+ {
+ return hasCurrentRegion() ? regions.at(regionIndex).bandIndex : -1;
+ }
+ int currentBandStoryStart() const
+ {
+ return hasCurrentRegion() ? regions.at(regionIndex).storyStart : -1;
+ }
+ double currentRegionTop() const { return regions.at(regionIndex).bounds.top(); }
+ double currentFlowTop() const { return regions.at(regionIndex).flowTop; }
+ double currentFlowBottom() const { return regions.at(regionIndex).flowBottom; }
+ int currentLogicalColumn() const { return regions.at(regionIndex).logicalColumn; }
+ bool nextRegionIsReserved(int storyPosition) const
+ {
+ if (!hasNextRegion())
+ return false;
+ const TextFlowRegion& next = regions.at(regionIndex + 1);
+ return next.storyStart >= 0 && storyPosition < next.storyStart;
+ }
+ bool nextRegionLeavesSpan() const
+ {
+ return isSpanRegion() && hasNextRegion()
+ && regions.at(regionIndex + 1).bandIndex != currentBandIndex();
+ }
+ bool moveToBand(TextFlowBandKind kind, int storyStart, TextLayout& textLayout)
+ {
+ for (int i = regionIndex + 1; i < regions.size(); ++i)
+ {
+ const TextFlowRegion& region = regions.at(i);
+ if (region.bandKind == kind && region.storyStart == storyStart)
+ {
+ regionIndex = i;
+ nextRegion(textLayout);
+ return true;
+ }
+ }
+ return false;
+ }
+ bool moveToNextBand(TextFlowBandKind kind, TextLayout& textLayout)
+ {
+ const int bandIndex = currentBandIndex();
+ for (int i = regionIndex + 1; i < regions.size(); ++i)
+ {
+ const TextFlowRegion& region = regions.at(i);
+ if (region.bandIndex != bandIndex && region.bandKind == kind)
+ {
+ regionIndex = i;
+ nextRegion(textLayout);
+ return true;
+ }
+ }
+ return false;
+ }
bool isEndOfCol(double morespace = 0)
{
@@ -1001,7 +1060,7 @@
LineBox* createLineBox()
{
LineBox* result = new LineBox();
- result->moveTo(lineData.x - colLeft, lineData.y - lineData.ascent);
+ result->moveTo(lineData.x - colLeft, lineData.y - lineData.ascent - regionTop);
result->setWidth(lineData.width);
result->setAscent(lineData.ascent);
result->setDescent(lineData.descent);
@@ -1146,6 +1205,11 @@
int paragraphStart = itemText.prevParagraph (end) + 1;
QChar lastChar = itemText.text (end);
bool keepWithNext = style.keepWithNext() && (lastChar == SpecialChars::PARSEP);
+ const bool spanningParagraph = style.paragraphLayout() == ParagraphStyle::ParagraphLayoutSpanColumns;
+ // A spanning paragraph which overflows from the top of an otherwise empty
+ // frame cannot be kept together there. Let it split so a chain cannot stall
+ // with the same paragraph repeatedly moved from one empty frame to the next.
+ const bool splitOversizeSpan = spanningParagraph && paragraphStart <= firstInFrame();
if (keepWithNext || (!SpecialChars::isBreak (lastChar, true)))
{
// paragraph continues in the next frame, or needs to be kept with the next one
@@ -1159,16 +1223,21 @@
incompleteLines++;
incompletePositions.prepend (lineStart);
}
- int need = style.keepLinesStart () + 1;
- if (style.keepTogether())
+ int need = splitOversizeSpan ? 1 : style.keepLinesStart () + 1;
+ if (style.keepTogether() && !splitOversizeSpan)
need = incompleteLines;
int pull = 0;
- if (style.keepTogether() || (incompleteLines < need))
+ if ((style.keepTogether() && !splitOversizeSpan) || (incompleteLines < need))
pull = incompleteLines;
// if we need to keep it with the next one, pull one line. Next frame layouting
// will pull more from us if it proves necessary.
if (keepWithNext && (!pull))
- pull = 1;
+ {
+ // A span must move as one band when space below it is the problem.
+ // At an empty frame top, retain the legacy one-line pull as the
+ // progress escape for a span which cannot fit with its successor.
+ pull = spanningParagraph && !splitOversizeSpan ? incompleteLines : 1;
+ }
if (pull)
{
@@ -1226,6 +1295,9 @@
bool outs = false;
bool goNoRoom = false;
bool goNextColumn = false;
+ bool ownsColumnSpanLayout = false;
+ int activeSpanStart = -1;
+ uint linesAtSpanStart = 0;
TabControl tabs;
tabs.active = false; // RTab
@@ -1327,6 +1399,15 @@
}
m_availableRegion = matrix.map(m_availableRegion);
}
+
+ if (!m_columnSpanLayoutActive)
+ {
+ m_columnSpanLayoutActive = true;
+ m_columnSpanLayoutFallback = false;
+ m_columnSpanLayoutRetries = 0;
+ m_columnSpanLayoutSteps.clear();
+ ownsColumnSpanLayout = true;
+ }
// update Bullet & number list if any.
if (itemText.hasTextMarks() || itemText.hasBulletOrNum() || itemText.marksCountChanged())
@@ -1342,7 +1423,7 @@
QList<GlyphCluster> glyphClusters; // = textShaper.shape();
// std::sort(glyphClusters.begin(), glyphClusters.end(), logicalGlyphRunComp);
- LineControl current(initialFlowPlan(), lineCorr, m_Doc, context);
+ LineControl current(columnSpanFlowPlan(), lineCorr, m_Doc, context);
current.nextRegion(textLayout);
lastLineY = m_textDistanceMargins.top();
@@ -1398,6 +1479,20 @@
//why emit invalidating signals each time text is changed by applying styles?
//this speed up layouting in case of using notes marks and drop caps
itemText.blockSignals(true);
+ auto restartColumnSpanLayout = [&]()
+ {
+ ++m_columnSpanLayoutRetries;
+ if (m_columnSpanLayoutRetries > 128)
+ {
+ // Pathological exclusion geometry or rounding must not recurse
+ // forever. Preserve story progress with ordinary column flow.
+ m_columnSpanLayoutFallback = true;
+ m_columnSpanLayoutSteps.clear();
+ }
+ itemText.blockSignals(false);
+ invalid = true;
+ layout();
+ };
setMaxY(-1);
double maxYAsc = 0.0, maxYDesc = 0.0;
int regionMinY = 0, regionMaxY= 0;
@@ -1452,6 +1547,100 @@
}
}
+ const bool atParagraphStart = itemText.isBlockStart(a);
+ const bool spanContinuation = a == firstInFrame() && !atParagraphStart
+ && style.paragraphLayout() == ParagraphStyle::ParagraphLayoutSpanColumns;
+ const bool wantsColumnSpan = !m_columnSpanLayoutFallback
+ && (atParagraphStart || spanContinuation)
+ && columnGeometry().size() > 1
+ && style.paragraphLayout() == ParagraphStyle::ParagraphLayoutSpanColumns;
+ if (current.isEmpty && atParagraphStart && wantsColumnSpan && current.isSpanRegion())
+ {
+ const ParagraphStyle previousSpanStyle = itemText.paragraphStyle(a - 1);
+ current.yPos += previousSpanStyle.spanSpaceAfter() + style.spanSpaceBefore();
+ }
+ if (current.isEmpty && wantsColumnSpan && !current.isSpanRegion())
+ {
+ int stepIndex = columnSpanLayoutStep(a);
+ if (stepIndex < 0)
+ {
+ ColumnSpanLayoutStep step;
+ step.storyStart = a;
+ step.continuation = spanContinuation;
+ step.segmentTop = current.currentRegionTop();
+ step.segmentFlowTop = current.currentFlowTop();
+ step.low = step.segmentTop;
+ step.high = current.currentFlowBottom();
+ if (a == firstInFrame())
+ {
+ step.high = step.low;
+ step.spanTop = step.low;
+ }
+ else
+ {
+ const double usableHeight = qMax(0.01, step.high - step.segmentFlowTop);
+ const double usedHeight = current.currentLogicalColumn() * usableHeight
+ + qMax(0.0, current.yPos - step.segmentFlowTop);
+ step.spanTop = qBound(step.low, step.segmentTop + usedHeight / columnGeometry().size(), step.high);
+ }
+ m_columnSpanLayoutSteps.append(step);
+ restartColumnSpanLayout();
+ if (ownsColumnSpanLayout)
+ clearColumnSpanLayout();
+ return;
+ }
+
+ if (reviseColumnSpanTop(stepIndex, true))
+ {
+ restartColumnSpanLayout();
+ if (ownsColumnSpanLayout)
+ clearColumnSpanLayout();
+ return;
+ }
+
+ if (!current.moveToBand(TextFlowBandKind::Span, a, textLayout))
+ {
+ m_maxChars = a;
+ goto NoRoom;
+ }
+ current.mustLineEnd = current.colRight;
+ current.restartX = current.xPos;
+ current.addLeftIndent = true;
+ current.rowDesc = 0.0;
+ current.recalculateY = true;
+ lastLineY = current.yPos;
+ activeSpanStart = a;
+ linesAtSpanStart = textLayout.lines();
+ }
+ else if (current.isEmpty && atParagraphStart && !wantsColumnSpan && current.isSpanRegion())
+ {
+ const int stepIndex = columnSpanLayoutStep(current.currentBandStoryStart());
+ if (stepIndex >= 0 && m_columnSpanLayoutSteps.at(stepIndex).spanBottom < 0.0)
+ {
+ const ParagraphStyle spanStyle = itemText.paragraphStyle(a - 1);
+ double spanBottom = qMax(qMax(current.yPos, textLayout.box()->naturalHeight()), maxYDesc)
+ + spanStyle.spanSpaceAfter() + style.gapBefore();
+ m_columnSpanLayoutSteps[stepIndex].spanBottom = qMin(spanBottom, current.currentFlowBottom());
+ restartColumnSpanLayout();
+ if (ownsColumnSpanLayout)
+ clearColumnSpanLayout();
+ return;
+ }
+
+ if (!current.moveToNextBand(TextFlowBandKind::Columns, textLayout))
+ {
+ m_maxChars = a;
+ goto NoRoom;
+ }
+ current.mustLineEnd = current.colRight;
+ current.restartX = current.xPos;
+ current.addLeftIndent = true;
+ current.rowDesc = 0.0;
+ current.recalculateY = true;
+ lastLineY = current.yPos;
+ activeSpanStart = -1;
+ }
+
if (current.isEmpty)
opticalMargins = style.opticalMargins();
//-->#13490
@@ -1991,6 +2180,21 @@
}
if (current.isEndOfCol(realDesc))
{
+ if (current.nextRegionLeavesSpan())
+ {
+ m_maxChars = a;
+ goto NoRoom;
+ }
+ if (current.nextRegionIsReserved(a))
+ {
+ const int stepIndex = columnSpanLayoutStep(current.regions.at(current.regionIndex + 1).storyStart);
+ if (stepIndex >= 0)
+ reviseColumnSpanTop(stepIndex, false);
+ restartColumnSpanLayout();
+ if (ownsColumnSpanLayout)
+ clearColumnSpanLayout();
+ return;
+ }
current.regionIndex++;
if (current.hasCurrentRegion())
{
@@ -2426,7 +2630,7 @@
if ((itemText.text(a) == SpecialChars::FRAMEBREAK) && (a < itemText.length() - 1))
goNoRoom = true;
- if ((itemText.text(a) == SpecialChars::COLBREAK) && (m_columns > 1))
+ if ((itemText.text(a) == SpecialChars::COLBREAK) && (m_columns > 1) && !current.isSpanRegion())
goNextColumn = true;
current.isEmpty = (i - current.lineData.firstCluster + 1) == 0;
@@ -2854,6 +3058,21 @@
if (goNextColumn)
{
goNextColumn = false;
+ if (current.nextRegionLeavesSpan())
+ {
+ m_maxChars = a;
+ goto NoRoom;
+ }
+ if (current.nextRegionIsReserved(a))
+ {
+ const int stepIndex = columnSpanLayoutStep(current.regions.at(current.regionIndex + 1).storyStart);
+ if (stepIndex >= 0)
+ reviseColumnSpanTop(stepIndex, false);
+ restartColumnSpanLayout();
+ if (ownsColumnSpanLayout)
+ clearColumnSpanLayout();
+ return;
+ }
current.regionIndex++;
if (current.hasCurrentRegion())
{
@@ -3032,6 +3251,7 @@
current.startOfCol = false;
if (moveLinesFromPreviousFrame ()) {
+ clearColumnSpanLayout();
layout (); // line moving ensures that this won't be an endless loop
itemText.blockSignals(false);
return;
@@ -3054,6 +3274,7 @@
double topDist = m_textDistanceMargins.top();
m_textDistanceMargins.setTop(topDist + hAdjust);
verticalAlign = 0;
+ clearColumnSpanLayout();
layout();
verticalAlign = vertAlign;
m_textDistanceMargins.setTop(topDist);
@@ -3083,11 +3304,15 @@
}
}
itemText.blockSignals(false);
+ if (ownsColumnSpanLayout)
+ clearColumnSpanLayout();
// qDebug("textframe: len=%d, done relayout", itemText.length());
return;
NoRoom:
invalid = false;
+ if (activeSpanStart >= 0 && textLayout.lines() == linesAtSpanStart)
+ m_maxChars = activeSpanStart;
adjustParagraphEndings ();
@@ -3106,6 +3331,7 @@
double topDist = m_textDistanceMargins.top();
m_textDistanceMargins.setTop(topDist + hAdjust);
verticalAlign = 0;
+ clearColumnSpanLayout();
layout();
verticalAlign = vertAlign;
m_textDistanceMargins.setTop(topDist);
@@ -3143,6 +3369,8 @@
}
// qDebug("textframe: len=%d, done relayout (no room %d)", itemText.length(), MaxChars);
itemText.blockSignals(false);
+ if (ownsColumnSpanLayout)
+ clearColumnSpanLayout();
}
void PageItem_TextFrame::invalidateLayout(bool wholeChain)
@@ -5206,6 +5434,48 @@
return band;
}
+TextFlowBand PageItem_TextFrame::spanBand(int storyStart, double bandTop, double bandBottom, double flowTop, double flowBottom) const
+{
+ double lineCorr = 0.0;
+ if (lineColor() != CommonStrings::None)
+ lineCorr = m_lineWidth / 2.0;
+ if (bandBottom < 0.0)
+ bandBottom = m_height;
+ bandTop = qBound(0.0, bandTop, m_height);
+ bandBottom = qBound(bandTop, bandBottom, m_height);
+ if (flowTop < 0.0)
+ flowTop = bandTop;
+ if (flowBottom < 0.0)
+ flowBottom = bandBottom - m_textDistanceMargins.bottom() - lineCorr;
+
+ const QVector<TextColumnGeometry> geometry = columnGeometry();
+ double left = m_textDistanceMargins.left() + lineCorr;
+ double right = m_width - m_textDistanceMargins.right() - lineCorr;
+ if (!geometry.isEmpty())
+ {
+ left = geometry.first().left;
+ right = geometry.first().left + geometry.first().width;
+ for (const TextColumnGeometry& column : geometry)
+ {
+ left = qMin(left, column.left);
+ right = qMax(right, column.left + column.width);
+ }
+ }
+
+ TextFlowBand band;
+ band.kind = TextFlowBandKind::Span;
+ band.storyStart = storyStart;
+ band.top = bandTop;
+ band.bottom = bandBottom;
+ TextFlowRegion region;
+ region.bounds = QRectF(left, bandTop, qMax(0.0, right - left), bandBottom - bandTop);
+ region.flowTop = flowTop;
+ region.flowBottom = flowBottom;
+ region.logicalColumn = -1;
+ band.regions.append(region);
+ return band;
+}
+
TextFlowPlan PageItem_TextFrame::initialFlowPlan() const
{
TextFlowPlan plan;
@@ -5213,6 +5483,83 @@
return plan;
}
+TextFlowPlan PageItem_TextFrame::columnSpanFlowPlan() const
+{
+ if (m_columnSpanLayoutSteps.isEmpty())
+ return initialFlowPlan();
+
+ double lineCorr = 0.0;
+ if (lineColor() != CommonStrings::None)
+ lineCorr = m_lineWidth / 2.0;
+ const double contentBottom = m_height - m_textDistanceMargins.bottom() - lineCorr;
+
+ TextFlowPlan plan;
+ for (const ColumnSpanLayoutStep& step : m_columnSpanLayoutSteps)
+ {
+ TextFlowBand columns = columnBand(step.segmentTop, step.spanTop, step.segmentFlowTop, step.spanTop);
+ plan.bands.append(columns);
+
+ const ParagraphStyle spanStyle = itemText.paragraphStyle(step.storyStart);
+ double spanFlowTop = qMax(step.spanTop, step.segmentFlowTop);
+ if (!step.continuation)
+ {
+ spanFlowTop += spanStyle.spanSpaceBefore();
+ if (step.storyStart > firstInFrame() && itemText.isBlockStart(step.storyStart))
+ spanFlowTop += spanStyle.gapBefore();
+ }
+ const double spanBottom = step.spanBottom >= 0.0 ? step.spanBottom : m_height;
+ plan.bands.append(spanBand(step.storyStart, step.spanTop, spanBottom, spanFlowTop,
+ step.spanBottom >= 0.0 ? step.spanBottom : contentBottom));
+
+ if (step.spanBottom < 0.0)
+ return plan;
+ }
+
+ const ColumnSpanLayoutStep& lastStep = m_columnSpanLayoutSteps.constLast();
+ if (lastStep.spanBottom < m_height)
+ plan.bands.append(columnBand(lastStep.spanBottom, m_height, lastStep.spanBottom, contentBottom));
+ return plan;
+}
+
+int PageItem_TextFrame::columnSpanLayoutStep(int storyStart) const
+{
+ for (int i = 0; i < m_columnSpanLayoutSteps.size(); ++i)
+ {
+ if (m_columnSpanLayoutSteps.at(i).storyStart == storyStart)
+ return i;
+ }
+ return -1;
+}
+
+bool PageItem_TextFrame::reviseColumnSpanTop(int stepIndex, bool prefixFits)
+{
+ if (stepIndex < 0 || stepIndex >= m_columnSpanLayoutSteps.size())
+ return false;
+
+ ColumnSpanLayoutStep& step = m_columnSpanLayoutSteps[stepIndex];
+ if (prefixFits)
+ step.high = qMin(step.high, step.spanTop);
+ else
+ step.low = qMax(step.low, step.spanTop);
+ ++step.attempts;
+
+ const bool converged = (step.high - step.low <= 0.25) || (step.attempts >= 16);
+ const double nextTop = converged ? step.high : (step.low + step.high) / 2.0;
+ const bool needsRetry = !prefixFits || !converged;
+ step.spanTop = nextTop;
+ if (converged)
+ step.low = step.high;
+ return needsRetry;
+}
+
+void PageItem_TextFrame::clearColumnSpanLayout()
+{
+ m_columnSpanLayoutSteps.clear();
+ m_columnSpanLayoutRetries = 0;
+ m_columnSpanLayoutFallback = false;
+ m_columnSpanLayoutActive = false;
+}
+
/*
void PageItem_TextFrame::drawOverflowMarker(ScPainter *p)
{
Index: scribus/pageitem_textframe.h
===================================================================
--- scribus/pageitem_textframe.h (revision 27861)
+++ scribus/pageitem_textframe.h (working copy)
@@ -127,7 +127,9 @@
protected:
TextFlowBand columnBand(double bandTop = 0.0, double bandBottom = -1.0, double flowTop = -1.0, double flowBottom = -1.0) const;
+ TextFlowBand spanBand(int storyStart, double bandTop, double bandBottom = -1.0, double flowTop = -1.0, double flowBottom = -1.0) const;
TextFlowPlan initialFlowPlan() const;
+ TextFlowPlan columnSpanFlowPlan() const;
QRegion calcAvailableRegion();
QRegion m_availableRegion;
void DrawObj_Item(ScPainter *p, const QRectF& e) override;
@@ -152,6 +154,27 @@
void adjustParagraphEndings ();
private:
+ struct ColumnSpanLayoutStep
+ {
+ int storyStart { -1 };
+ bool continuation { false };
+ double segmentTop { 0.0 };
+ double segmentFlowTop { 0.0 };
+ double low { 0.0 };
+ double high { 0.0 };
+ double spanTop { 0.0 };
+ double spanBottom { -1.0 };
+ int attempts { 0 };
+ };
+
+ bool m_columnSpanLayoutActive { false };
+ bool m_columnSpanLayoutFallback { false };
+ int m_columnSpanLayoutRetries { 0 };
+ QVector<ColumnSpanLayoutStep> m_columnSpanLayoutSteps;
+ int columnSpanLayoutStep(int storyStart) const;
+ bool reviseColumnSpanTop(int stepIndex, bool prefixFits);
+ void clearColumnSpanLayout();
+
bool cursorBiasBackward {false};
// If the last paragraph had to be split, this is how many lines of the paragraph are in this frame.
// Used for orphan/widow control
Index: scribus/text/textlayout.cpp
===================================================================
--- scribus/text/textlayout.cpp (revision 27861)
+++ scribus/text/textlayout.cpp (working copy)
@@ -40,6 +40,7 @@
{
region.bandKind = band.kind;
region.bandIndex = bandIndex;
+ region.storyStart = band.storyStart;
result.append(region);
}
}
Index: scribus/text/textlayout.h
===================================================================
--- scribus/text/textlayout.h (revision 27861)
+++ scribus/text/textlayout.h (working copy)
@@ -48,6 +48,7 @@
double flowBottom { 0.0 };
TextFlowBandKind bandKind { TextFlowBandKind::Columns };
int bandIndex { 0 };
+ int storyStart { -1 };
int logicalColumn { 0 };
};
cs4-column-span-ui-v1.02.patch (39,271 bytes)
Index: scribus/ui/propertiespalette_text.cpp
===================================================================
--- scribus/ui/propertiespalette_text.cpp (revision 27861)
+++ scribus/ui/propertiespalette_text.cpp (working copy)
@@ -86,7 +86,7 @@
scHyphenation->restorePreferences();
orphanBox = new PropertyWidget_Orphans(this);
- scOrphans = new SectionContainer(tr("Orphans && Widows"), "SectionTPOrphansWidows", true, false);
+ scOrphans = new SectionContainer(tr("Paragraph flow"), "SectionTPOrphansWidows", true, false);
scOrphans->setCanSaveState(true);
scOrphans->setWidget(orphanBox);
scOrphans->restorePreferences();
@@ -347,6 +347,7 @@
distanceWidgets->unitChange();
pathTextWidgets->unitChange();
parEffectWidgets->unitChange();
+ orphanBox->unitChange();
textWidgets->unitChange();
m_haveItem = tmp;
@@ -427,7 +428,7 @@
scDistance->setText(tr("Columns && Indentation"));
scFontFeatures->setText(tr("OpenType Features"));
scHyphenation->setText(tr("Hyphenation && Language"));
- scOrphans->setText(tr("Orphans && Widows"));
+ scOrphans->setText(tr("Paragraph flow"));
scParEffect->setText(tr("Lists && Drop Caps"));
scPathText->setText(tr("Text on Path"));
scText->setText(tr("Font"));
Index: scribus/ui/propertywidget_orphans.cpp
===================================================================
--- scribus/ui/propertywidget_orphans.cpp (revision 27861)
+++ scribus/ui/propertywidget_orphans.cpp (working copy)
@@ -10,6 +10,8 @@
#include "iconmanager.h"
#include "scribusapp.h"
#include "scribusdoc.h"
+#include "styles/paragraphstyle.h"
+#include "units.h"
PropertyWidget_Orphans::PropertyWidget_Orphans(QWidget* parent) : QFrame(parent)
{
@@ -18,6 +20,8 @@
layout()->setAlignment(Qt::AlignTop);
keepLinesStart->setDecimals(0);
keepLinesEnd->setDecimals(0);
+ paragraphLayout->addItem(tr("None"), ParagraphStyle::ParagraphLayoutSingleColumn);
+ paragraphLayout->addItem(tr("All columns"), ParagraphStyle::ParagraphLayoutSpanColumns);
iconSetChange();
languageChange();
@@ -25,8 +29,23 @@
connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(iconSetChange()));
}
+void PropertyWidget_Orphans::setDoc(ScribusDoc *doc)
+{
+ PropertyWidgetBase::setDoc(doc);
+ if (!m_doc)
+ return;
+
+ m_unitRatio = m_doc->unitRatio();
+ m_unitIndex = m_doc->unitIndex();
+ spanSpaceBefore->setNewUnit(m_unitIndex);
+ spanSpaceAfter->setNewUnit(m_unitIndex);
+}
+
void PropertyWidget_Orphans::connectSignals()
{
+ connect(paragraphLayout, SIGNAL(activated(int)), this, SLOT(handleParagraphLayout(int)));
+ connect(spanSpaceBefore, SIGNAL(valueChanged(double)), this, SLOT(handleSpanSpaceBefore()));
+ connect(spanSpaceAfter, SIGNAL(valueChanged(double)), this, SLOT(handleSpanSpaceAfter()));
connect(keepLinesStart, SIGNAL(valueChanged(double)), this, SLOT(handleKeepLinesStart()));
connect(keepLinesEnd, SIGNAL(valueChanged(double)), this, SLOT(handleKeepLinesEnd()));
connect(keepTogether, SIGNAL(toggled(bool)), this, SLOT(handleKeepTogether()));
@@ -35,12 +54,46 @@
void PropertyWidget_Orphans::disconnectSignals()
{
+ disconnect(paragraphLayout, SIGNAL(activated(int)), this, SLOT(handleParagraphLayout(int)));
+ disconnect(spanSpaceBefore, SIGNAL(valueChanged(double)), this, SLOT(handleSpanSpaceBefore()));
+ disconnect(spanSpaceAfter, SIGNAL(valueChanged(double)), this, SLOT(handleSpanSpaceAfter()));
disconnect(keepLinesStart, SIGNAL(valueChanged(double)), this, SLOT(handleKeepLinesStart()));
disconnect(keepLinesEnd, SIGNAL(valueChanged(double)), this, SLOT(handleKeepLinesEnd()));
disconnect(keepTogether, SIGNAL(toggled(bool)), this, SLOT(handleKeepTogether()));
disconnect(keepWithNext, SIGNAL(toggled(bool)), this, SLOT(handleKeepWithNext()));
}
+void PropertyWidget_Orphans::handleParagraphLayout(int index)
+{
+ if (!m_doc)
+ return;
+
+ ParagraphStyle newStyle;
+ newStyle.setParagraphLayout(static_cast<ParagraphStyle::ParagraphLayoutMode>(paragraphLayout->itemData(index).toInt()));
+ m_doc->itemSelection_ApplyParagraphStyle(newStyle);
+ updateSpanSpaceEnabled();
+}
+
+void PropertyWidget_Orphans::handleSpanSpaceBefore()
+{
+ if (!m_doc)
+ return;
+
+ ParagraphStyle newStyle;
+ newStyle.setSpanSpaceBefore(spanSpaceBefore->value() / m_unitRatio);
+ m_doc->itemSelection_ApplyParagraphStyle(newStyle);
+}
+
+void PropertyWidget_Orphans::handleSpanSpaceAfter()
+{
+ if (!m_doc)
+ return;
+
+ ParagraphStyle newStyle;
+ newStyle.setSpanSpaceAfter(spanSpaceAfter->value() / m_unitRatio);
+ m_doc->itemSelection_ApplyParagraphStyle(newStyle);
+}
+
void PropertyWidget_Orphans::handleKeepLinesStart()
{
if (!m_doc) return;
@@ -76,6 +129,10 @@
void PropertyWidget_Orphans::updateStyle(const ParagraphStyle& newCurrent)
{
disconnectSignals ();
+ paragraphLayout->setCurrentIndex(paragraphLayout->findData(newCurrent.paragraphLayout()));
+ spanSpaceBefore->setValue(newCurrent.spanSpaceBefore() * m_unitRatio);
+ spanSpaceAfter->setValue(newCurrent.spanSpaceAfter() * m_unitRatio);
+ updateSpanSpaceEnabled();
keepLinesStart->setValue (newCurrent.keepLinesStart());
keepLinesEnd->setValue (newCurrent.keepLinesEnd());
keepTogether->setChecked (newCurrent.keepTogether());
@@ -83,14 +140,22 @@
connectSignals ();
}
-void PropertyWidget_Orphans::changeEvent(QEvent *e)
+void PropertyWidget_Orphans::unitChange()
{
- if (e->type() == QEvent::LanguageChange)
- {
- languageChange();
+ if (!m_doc)
return;
- }
- QWidget::changeEvent(e);
+
+ m_unitRatio = m_doc->unitRatio();
+ m_unitIndex = m_doc->unitIndex();
+ spanSpaceBefore->setNewUnit(m_unitIndex);
+ spanSpaceAfter->setNewUnit(m_unitIndex);
+}
+
+void PropertyWidget_Orphans::updateSpanSpaceEnabled()
+{
+ const bool enabled = paragraphLayout->currentData().toInt() == ParagraphStyle::ParagraphLayoutSpanColumns;
+ spanSpaceBeforeLabel->setEnabled(enabled);
+ spanSpaceAfterLabel->setEnabled(enabled);
}
void PropertyWidget_Orphans::iconSetChange()
@@ -101,8 +166,22 @@
keepLabelEnd->setPixmap(im.loadPixmap("paragraph-widow"));
}
+void PropertyWidget_Orphans::changeEvent(QEvent *e)
+{
+ if (e->type() == QEvent::LanguageChange)
+ {
+ languageChange();
+ return;
+ }
+ QWidget::changeEvent(e);
+}
+
void PropertyWidget_Orphans::languageChange()
{
+ const int oldLayout = paragraphLayout->currentData().toInt();
retranslateUi(this);
+ paragraphLayout->setItemText(0, tr("None"));
+ paragraphLayout->setItemText(1, tr("All columns"));
+ paragraphLayout->setCurrentIndex(paragraphLayout->findData(oldLayout));
}
Index: scribus/ui/propertywidget_orphans.h
===================================================================
--- scribus/ui/propertywidget_orphans.h (revision 27861)
+++ scribus/ui/propertywidget_orphans.h (working copy)
@@ -21,6 +21,7 @@
PropertyWidget_Orphans(QWidget* parent);
~PropertyWidget_Orphans() {};
+ void setDoc(ScribusDoc *doc);
void updateStyle(const ParagraphStyle& newCurrent);
protected:
@@ -29,14 +30,22 @@
public slots:
void iconSetChange();
void languageChange();
+ void unitChange();
+ void handleParagraphLayout(int index);
+ void handleSpanSpaceBefore();
+ void handleSpanSpaceAfter();
void handleKeepLinesStart();
void handleKeepLinesEnd();
void handleKeepTogether();
void handleKeepWithNext();
private:
+ double m_unitRatio { 1.0 };
+ int m_unitIndex { 0 };
+
void connectSignals();
void disconnectSignals();
+ void updateSpanSpaceEnabled();
};
#endif
Index: scribus/ui/propertywidget_orphansbase.ui
===================================================================
--- scribus/ui/propertywidget_orphansbase.ui (revision 27861)
+++ scribus/ui/propertywidget_orphansbase.ui (working copy)
@@ -11,6 +11,9 @@
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>8</number>
+ </property>
<property name="leftMargin">
<number>8</number>
</property>
@@ -24,113 +27,32 @@
<number>8</number>
</property>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_3">
- <property name="spacing">
- <number>16</number>
- </property>
+ <layout class="QHBoxLayout" name="keepLinesLayout" stretch="0,0,1">
+ <property name="spacing"><number>8</number></property>
<item>
<widget class="FormWidget" name="keepLabelStart">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="label" stdset="0">
- <string/>
- </property>
- <property name="direction">
- <enum>FormWidget::LabelPosition::Left</enum>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="leftMargin">
- <number>0</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>0</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <item>
- <widget class="ScrSpinBox" name="keepLinesStart">
- <property name="toolTip">
- <string>Ensure that first lines of a paragraph won't end up separated from the rest (known as widow/orphan control)</string>
- </property>
- <property name="suffix">
- <string> lines</string>
- </property>
- <property name="maximum">
- <double>10.000000000000000</double>
- </property>
- </widget>
- </item>
+ <property name="sizePolicy"><sizepolicy hsizetype="Preferred" vsizetype="Minimum"><horstretch>0</horstretch><verstretch>0</verstretch></sizepolicy></property>
+ <property name="label" stdset="0"><string>At start</string></property>
+ <property name="direction"><enum>FormWidget::LabelPosition::Bottom</enum></property>
+ <layout class="QHBoxLayout" name="horizontalLayout"><property name="leftMargin"><number>0</number></property><property name="topMargin"><number>0</number></property><property name="rightMargin"><number>0</number></property><property name="bottomMargin"><number>0</number></property>
+ <item><widget class="ScrSpinBox" name="keepLinesStart"><property name="toolTip"><string>Minimum lines kept together at the beginning of a paragraph</string></property><property name="suffix"><string> lines</string></property><property name="maximum"><double>10.000000000000000</double></property></widget></item>
</layout>
</widget>
</item>
<item>
<widget class="FormWidget" name="keepLabelEnd">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="label" stdset="0">
- <string/>
- </property>
- <property name="direction">
- <enum>FormWidget::LabelPosition::Left</enum>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <property name="spacing">
- <number>4</number>
- </property>
- <property name="leftMargin">
- <number>0</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>0</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <item>
- <widget class="ScrSpinBox" name="keepLinesEnd">
- <property name="toolTip">
- <string>Ensure that last lines of a paragraph won't end up separated from the rest (known as widow/orphan control)</string>
- </property>
- <property name="suffix">
- <string> lines</string>
- </property>
- <property name="maximum">
- <double>10.000000000000000</double>
- </property>
- </widget>
- </item>
+ <property name="sizePolicy"><sizepolicy hsizetype="Preferred" vsizetype="Minimum"><horstretch>0</horstretch><verstretch>0</verstretch></sizepolicy></property>
+ <property name="label" stdset="0"><string>At end</string></property>
+ <property name="direction"><enum>FormWidget::LabelPosition::Bottom</enum></property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2"><property name="leftMargin"><number>0</number></property><property name="topMargin"><number>0</number></property><property name="rightMargin"><number>0</number></property><property name="bottomMargin"><number>0</number></property>
+ <item><widget class="ScrSpinBox" name="keepLinesEnd"><property name="toolTip"><string>Minimum lines kept together at the end of a paragraph</string></property><property name="suffix"><string> lines</string></property><property name="maximum"><double>10.000000000000000</double></property></widget></item>
</layout>
</widget>
</item>
<item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Orientation::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
+ <spacer name="keepLinesSpacer">
+ <property name="orientation"><enum>Qt::Orientation::Horizontal</enum></property>
+ <property name="sizeHint" stdset="0"><size><width>0</width><height>20</height></size></property>
</spacer>
</item>
</layout>
@@ -155,6 +77,47 @@
</property>
</widget>
</item>
+ <item>
+ <layout class="QHBoxLayout" name="paragraphLayoutRow" stretch="0,0,0,1">
+ <property name="spacing"><number>8</number></property>
+ <item>
+ <widget class="FormWidget" name="paragraphLayoutLabel">
+ <property name="sizePolicy"><sizepolicy hsizetype="Preferred" vsizetype="Minimum"><horstretch>0</horstretch><verstretch>0</verstretch></sizepolicy></property>
+ <property name="label" stdset="0"><string>Column span</string></property>
+ <property name="direction"><enum>FormWidget::LabelPosition::Bottom</enum></property>
+ <layout class="QHBoxLayout" name="paragraphLayoutControl"><property name="leftMargin"><number>0</number></property><property name="topMargin"><number>0</number></property><property name="rightMargin"><number>0</number></property><property name="bottomMargin"><number>0</number></property>
+ <item><widget class="QComboBox" name="paragraphLayout"><property name="toolTip"><string>Choose whether the paragraph spans all columns in its text frame</string></property><property name="sizeAdjustPolicy"><enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum></property></widget></item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="FormWidget" name="spanSpaceBeforeLabel">
+ <property name="sizePolicy"><sizepolicy hsizetype="Preferred" vsizetype="Minimum"><horstretch>0</horstretch><verstretch>0</verstretch></sizepolicy></property>
+ <property name="label" stdset="0"><string>Space before</string></property>
+ <property name="direction"><enum>FormWidget::LabelPosition::Bottom</enum></property>
+ <layout class="QHBoxLayout" name="spanSpaceBeforeLayout"><property name="leftMargin"><number>0</number></property><property name="topMargin"><number>0</number></property><property name="rightMargin"><number>0</number></property><property name="bottomMargin"><number>0</number></property>
+ <item><widget class="ScrSpinBox" name="spanSpaceBefore"><property name="toolTip"><string>Additional space before a spanning paragraph</string></property><property name="minimum"><double>0.000000000000000</double></property><property name="maximum"><double>1000.000000000000000</double></property></widget></item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="FormWidget" name="spanSpaceAfterLabel">
+ <property name="sizePolicy"><sizepolicy hsizetype="Preferred" vsizetype="Minimum"><horstretch>0</horstretch><verstretch>0</verstretch></sizepolicy></property>
+ <property name="label" stdset="0"><string>Space after</string></property>
+ <property name="direction"><enum>FormWidget::LabelPosition::Bottom</enum></property>
+ <layout class="QHBoxLayout" name="spanSpaceAfterLayout"><property name="leftMargin"><number>0</number></property><property name="topMargin"><number>0</number></property><property name="rightMargin"><number>0</number></property><property name="bottomMargin"><number>0</number></property>
+ <item><widget class="ScrSpinBox" name="spanSpaceAfter"><property name="toolTip"><string>Additional space after a spanning paragraph</string></property><property name="minimum"><double>0.000000000000000</double></property><property name="maximum"><double>1000.000000000000000</double></property></widget></item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="paragraphLayoutSpacer">
+ <property name="orientation"><enum>Qt::Orientation::Horizontal</enum></property>
+ <property name="sizeHint" stdset="0"><size><width>0</width><height>20</height></size></property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
</layout>
</widget>
<customwidgets>
@@ -178,6 +141,11 @@
<tabstops>
<tabstop>keepLinesStart</tabstop>
<tabstop>keepLinesEnd</tabstop>
+ <tabstop>keepTogether</tabstop>
+ <tabstop>keepWithNext</tabstop>
+ <tabstop>paragraphLayout</tabstop>
+ <tabstop>spanSpaceBefore</tabstop>
+ <tabstop>spanSpaceAfter</tabstop>
</tabstops>
<resources/>
<connections/>
Index: scribus/ui/smpstylewidget.cpp
===================================================================
--- scribus/ui/smpstylewidget.cpp (revision 27861)
+++ scribus/ui/smpstylewidget.cpp (working copy)
@@ -6,6 +6,7 @@
*/
#include <QEvent>
+#include <QSignalBlocker>
#include "iconmanager.h"
@@ -49,6 +50,9 @@
lineSpacing->setSuffix(unitGetSuffixFromIndex(0));
spaceAbove->setSuffix(unitGetSuffixFromIndex(0));
spaceBelow->setSuffix(unitGetSuffixFromIndex(0));
+ spanSpaceBefore->setSuffix(unitGetSuffixFromIndex(0));
+ spanSpaceAfter->setSuffix(unitGetSuffixFromIndex(0));
+ fillParagraphLayoutCombo();
// optMarginCombo->addItem(tr("None"), ParagraphStyle::OM_None);
// optMarginCombo->addItem(tr("Left Protruding"), ParagraphStyle::OM_LeftProtruding);
@@ -145,6 +149,11 @@
lineSpacing->setSuffix(unitGetSuffixFromIndex(0));
spaceAbove->setSuffix(unitGetSuffixFromIndex(0));
spaceBelow->setSuffix(unitGetSuffixFromIndex(0));
+ spanSpaceBefore->setSuffix(unitGetSuffixFromIndex(spanSpaceBefore->unitIndex()));
+ spanSpaceAfter->setSuffix(unitGetSuffixFromIndex(spanSpaceAfter->unitIndex()));
+ const int oldParagraphLayout = paragraphLayout->currentData().toInt();
+ fillParagraphLayoutCombo();
+ paragraphLayout->setCurrentIndex(paragraphLayout->findData(oldParagraphLayout));
keepLinesStart->setSuffix( tr(" lines"));
keepLinesEnd->setSuffix( tr(" lines"));
@@ -164,9 +173,20 @@
void SMPStyleWidget::unitChange(double oldRatio, double newRatio, int unitIndex)
{
parEffectOffset->setNewUnit(unitIndex);
+ spanSpaceBefore->setNewUnit(unitIndex);
+ spanSpaceAfter->setNewUnit(unitIndex);
tabList->unitChange(unitIndex);
}
+void SMPStyleWidget::fillParagraphLayoutCombo()
+{
+ const QSignalBlocker blocker(paragraphLayout);
+ paragraphLayout->setParentValueText(tr("Inherited"));
+ paragraphLayout->clear();
+ paragraphLayout->addItem(tr("None"), ParagraphStyle::ParagraphLayoutSingleColumn);
+ paragraphLayout->addItem(tr("All columns"), ParagraphStyle::ParagraphLayoutSpanColumns);
+}
+
void SMPStyleWidget::setDoc(ScribusDoc *doc)
{
if (m_Doc)
@@ -187,6 +207,9 @@
{
m_currPStyle = pstyle;
double unitRatio = unitGetRatioFromIndex(unitIndex);
+ spanSpaceBefore->setNewUnit(unitIndex);
+ spanSpaceAfter->setNewUnit(unitIndex);
+ fillParagraphLayoutCombo();
parentCombo->setEnabled(!pstyle->isDefaultStyle());
const ParagraphStyle *parent = dynamic_cast<const ParagraphStyle*>(pstyle->parentStyle());
m_hasParent = pstyle->hasParent() && parent != nullptr && parent->hasName() && pstyle->parent() != "";
@@ -284,6 +307,12 @@
keepLinesEnd->setParentValue (parent->keepLinesEnd());
keepTogether->setParentValue (parent->keepTogether());
keepWithNext->setParentValue (parent->keepWithNext());
+ paragraphLayout->setCurrentItemByData(pstyle->paragraphLayout(), pstyle->isInhParagraphLayout());
+ paragraphLayout->setParentItem(paragraphLayout->getItemIndexForData(parent->paragraphLayout()));
+ spanSpaceBefore->setValue(pstyle->spanSpaceBefore() * unitRatio, pstyle->isInhSpanSpaceBefore());
+ spanSpaceBefore->setParentValue(parent->spanSpaceBefore() * unitRatio);
+ spanSpaceAfter->setValue(pstyle->spanSpaceAfter() * unitRatio, pstyle->isInhSpanSpaceAfter());
+ spanSpaceAfter->setParentValue(parent->spanSpaceAfter() * unitRatio);
//Effects Gropup Box
m_parentDC = parent->hasDropCap();
@@ -398,11 +427,17 @@
keepLinesEnd->setValue (pstyle->keepLinesEnd());
keepTogether->setChecked (pstyle->keepTogether());
keepWithNext->setChecked (pstyle->keepWithNext());
+ paragraphLayout->setCurrentItemByData(pstyle->paragraphLayout());
+ spanSpaceBefore->setValue(pstyle->spanSpaceBefore() * unitRatio);
+ spanSpaceAfter->setValue(pstyle->spanSpaceAfter() * unitRatio);
backgroundColor->setColor(pstyle->backgroundColor(), qRound(pstyle->backgroundShade()));
}
lineSpacing->setEnabled(pstyle->lineSpacingMode() == ParagraphStyle::FixedLineSpacing);
+ const bool spanEnabled = pstyle->paragraphLayout() == ParagraphStyle::ParagraphLayoutSpanColumns;
+ spanSpaceBeforeLabel->setEnabled(spanEnabled);
+ spanSpaceAfterLabel->setEnabled(spanEnabled);
if (pstyle->hasDropCap())
setParagraphEffect(1);
@@ -457,6 +492,7 @@
m_currPStyle = pstyles[0];
showLineSpacing(pstyles);
showSpaceAB(pstyles, unitIndex);
+ showParagraphFlow(pstyles, unitIndex);
showDropCap(pstyles, cstyles, unitIndex);
showBullet(pstyles, cstyles, unitIndex);
showNumeration(pstyles, cstyles, unitIndex);
@@ -476,6 +512,46 @@
}
}
+void SMPStyleWidget::showParagraphFlow(const QList<ParagraphStyle*> &pstyles, int unitIndex)
+{
+ const double unitRatio = unitGetRatioFromIndex(unitIndex);
+ spanSpaceBefore->setNewUnit(unitIndex);
+ spanSpaceAfter->setNewUnit(unitIndex);
+ fillParagraphLayoutCombo();
+
+ int layoutMode = pstyles[0]->paragraphLayout();
+ double spaceBefore = pstyles[0]->spanSpaceBefore();
+ double spaceAfter = pstyles[0]->spanSpaceAfter();
+ bool sameLayout = true;
+ bool sameBefore = true;
+ bool sameAfter = true;
+ for (int i = 1; i < pstyles.count(); ++i)
+ {
+ sameLayout &= pstyles[i]->paragraphLayout() == layoutMode;
+ sameBefore &= isEqual(pstyles[i]->spanSpaceBefore(), spaceBefore);
+ sameAfter &= isEqual(pstyles[i]->spanSpaceAfter(), spaceAfter);
+ }
+
+ if (sameLayout)
+ paragraphLayout->setCurrentItemByData(layoutMode);
+ else
+ {
+ paragraphLayout->addItem(QString());
+ paragraphLayout->setCurrentIndex(paragraphLayout->count() - 1);
+ }
+ if (sameBefore)
+ spanSpaceBefore->setValue(spaceBefore * unitRatio);
+ else
+ spanSpaceBefore->clear();
+ if (sameAfter)
+ spanSpaceAfter->setValue(spaceAfter * unitRatio);
+ else
+ spanSpaceAfter->clear();
+
+ spanSpaceBeforeLabel->setEnabled(!sameLayout || layoutMode == ParagraphStyle::ParagraphLayoutSpanColumns);
+ spanSpaceAfterLabel->setEnabled(!sameLayout || layoutMode == ParagraphStyle::ParagraphLayoutSpanColumns);
+}
+
void SMPStyleWidget::showColors(const QList<ParagraphStyle*> &cstyles)
{
double d = -30000;
Index: scribus/ui/smpstylewidget.h
===================================================================
--- scribus/ui/smpstylewidget.h (revision 27861)
+++ scribus/ui/smpstylewidget.h (working copy)
@@ -52,10 +52,12 @@
void fillNumerationsCombo();
void fillNumRestartCombo();
void fillPECombo();
+ void fillParagraphLayoutCombo();
void setParagraphEffect(int);
void showColors(const QList<ParagraphStyle*> &cstyles);
void showLineSpacing(const QList<ParagraphStyle*> &pstyles);
void showSpaceAB(const QList<ParagraphStyle*> &pstyles, int unitIndex);
+ void showParagraphFlow(const QList<ParagraphStyle*> &pstyles, int unitIndex);
void showDropCap(const QList<ParagraphStyle*> &pstyles, const QList<CharStyle> &cstyles, int unitIndex);
void showBullet(const QList<ParagraphStyle*> &pstyles, const QList<CharStyle> &cstyles, int unitIndex);
void showNumeration(const QList<ParagraphStyle*> &pstyles, const QList<CharStyle> &cstyles, int unitIndex);
Index: scribus/ui/smpstylewidget.ui
===================================================================
--- scribus/ui/smpstylewidget.ui (revision 27861)
+++ scribus/ui/smpstylewidget.ui (working copy)
@@ -780,11 +780,11 @@
<item row="2" column="1">
<widget class="QGroupBox" name="textFlowBox">
<property name="title">
- <string>Orphans && Widows</string>
+ <string>Paragraph flow</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
- <number>4</number>
+ <number>8</number>
</property>
<property name="leftMargin">
<number>8</number>
@@ -799,9 +799,9 @@
<number>8</number>
</property>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_11">
+ <layout class="QHBoxLayout" name="horizontalLayout_11" stretch="0,0,1">
<property name="spacing">
- <number>16</number>
+ <number>8</number>
</property>
<item>
<widget class="FormWidget" name="keepLabelStart">
@@ -812,7 +812,10 @@
</sizepolicy>
</property>
<property name="label" stdset="0">
- <string/>
+ <string>At start</string>
+ </property>
+ <property name="direction">
+ <enum>FormWidget::LabelPosition::Bottom</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_13">
<property name="leftMargin">
@@ -830,7 +833,7 @@
<item>
<widget class="SMSpinBox" name="keepLinesStart">
<property name="toolTip">
- <string>Ensure that first lines of a paragraph won't end up separated from the rest (known as widow/orphan control)</string>
+ <string>Minimum lines kept together at the beginning of a paragraph</string>
</property>
<property name="suffix">
<string> lines</string>
@@ -852,7 +855,10 @@
</sizepolicy>
</property>
<property name="label" stdset="0">
- <string/>
+ <string>At end</string>
+ </property>
+ <property name="direction">
+ <enum>FormWidget::LabelPosition::Bottom</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_17">
<property name="leftMargin">
@@ -870,7 +876,7 @@
<item>
<widget class="SMSpinBox" name="keepLinesEnd">
<property name="toolTip">
- <string>Ensure that last lines of a paragraph won't end up separated from the rest (known as widow/orphan control)</string>
+ <string>Minimum lines kept together at the end of a paragraph</string>
</property>
<property name="suffix">
<string> lines</string>
@@ -919,6 +925,47 @@
</widget>
</item>
<item>
+ <layout class="QHBoxLayout" name="paragraphLayoutRow" stretch="0,0,0,1">
+ <property name="spacing"><number>8</number></property>
+ <item>
+ <widget class="FormWidget" name="paragraphLayoutLabel">
+ <property name="sizePolicy"><sizepolicy hsizetype="Preferred" vsizetype="Minimum"><horstretch>0</horstretch><verstretch>0</verstretch></sizepolicy></property>
+ <property name="label" stdset="0"><string>Column span</string></property>
+ <property name="direction"><enum>FormWidget::LabelPosition::Bottom</enum></property>
+ <layout class="QHBoxLayout" name="paragraphLayoutControl"><property name="leftMargin"><number>0</number></property><property name="topMargin"><number>0</number></property><property name="rightMargin"><number>0</number></property><property name="bottomMargin"><number>0</number></property>
+ <item><widget class="SMScComboBox" name="paragraphLayout"><property name="toolTip"><string>Choose the column span. Inherited uses the parent paragraph style</string></property><property name="sizeAdjustPolicy"><enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum></property></widget></item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="FormWidget" name="spanSpaceBeforeLabel">
+ <property name="sizePolicy"><sizepolicy hsizetype="Preferred" vsizetype="Minimum"><horstretch>0</horstretch><verstretch>0</verstretch></sizepolicy></property>
+ <property name="label" stdset="0"><string>Space before</string></property>
+ <property name="direction"><enum>FormWidget::LabelPosition::Bottom</enum></property>
+ <layout class="QHBoxLayout" name="spanSpaceBeforeLayout"><property name="leftMargin"><number>0</number></property><property name="topMargin"><number>0</number></property><property name="rightMargin"><number>0</number></property><property name="bottomMargin"><number>0</number></property>
+ <item><widget class="SMScrSpinBox" name="spanSpaceBefore"><property name="toolTip"><string>Additional space before a spanning paragraph</string></property><property name="minimum"><double>0.000000000000000</double></property><property name="maximum"><double>1000.000000000000000</double></property></widget></item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="FormWidget" name="spanSpaceAfterLabel">
+ <property name="sizePolicy"><sizepolicy hsizetype="Preferred" vsizetype="Minimum"><horstretch>0</horstretch><verstretch>0</verstretch></sizepolicy></property>
+ <property name="label" stdset="0"><string>Space after</string></property>
+ <property name="direction"><enum>FormWidget::LabelPosition::Bottom</enum></property>
+ <layout class="QHBoxLayout" name="spanSpaceAfterLayout"><property name="leftMargin"><number>0</number></property><property name="topMargin"><number>0</number></property><property name="rightMargin"><number>0</number></property><property name="bottomMargin"><number>0</number></property>
+ <item><widget class="SMScrSpinBox" name="spanSpaceAfter"><property name="toolTip"><string>Additional space after a spanning paragraph</string></property><property name="minimum"><double>0.000000000000000</double></property><property name="maximum"><double>1000.000000000000000</double></property></widget></item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="paragraphLayoutSpacer">
+ <property name="orientation"><enum>Qt::Orientation::Horizontal</enum></property>
+ <property name="sizeHint" stdset="0"><size><width>0</width><height>20</height></size></property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
@@ -1788,6 +1835,9 @@
<tabstop>keepLinesEnd</tabstop>
<tabstop>keepTogether</tabstop>
<tabstop>keepWithNext</tabstop>
+ <tabstop>paragraphLayout</tabstop>
+ <tabstop>spanSpaceBefore</tabstop>
+ <tabstop>spanSpaceAfter</tabstop>
<tabstop>peCombo</tabstop>
<tabstop>parentParEffectsButton</tabstop>
<tabstop>dropCapLines</tabstop>
Index: scribus/ui/smsccombobox.cpp
===================================================================
--- scribus/ui/smsccombobox.cpp (revision 27861)
+++ scribus/ui/smsccombobox.cpp (working copy)
@@ -38,7 +38,7 @@
if (!isParentValue && !m_useParentValue)
{
m_useParentValue = true;
- addItem( tr("Use Parent Value"));
+ addItem(parentValueText());
}
QComboBox::setCurrentIndex(i);
@@ -67,7 +67,7 @@
if (!isParentValue && !m_useParentValue)
{
m_useParentValue = true;
- addItem( tr("Use Parent Value"));
+ addItem(parentValueText());
}
for (int idx(0); idx < count(); ++idx)
@@ -103,7 +103,7 @@
if (!isParentValue && !m_useParentValue)
{
m_useParentValue = true;
- addItem( tr("Use Parent Value"));
+ addItem(parentValueText());
}
for (int idx(0); idx < count(); ++idx)
@@ -149,6 +149,18 @@
m_pItem = i;
}
+void SMScComboBox::setParentValueText(const QString& text)
+{
+ m_parentValueText = text;
+ if (m_useParentValue && count() > 0)
+ setItemText(count() - 1, parentValueText());
+}
+
+QString SMScComboBox::parentValueText() const
+{
+ return m_parentValueText.isEmpty() ? tr("Use Parent Value") : m_parentValueText;
+}
+
bool SMScComboBox::useParentValue()
{
bool ret = false;
@@ -180,7 +192,7 @@
if (m_hasParent && !m_useParentValue)
{
setFont(true);
- addItem( tr("Use Parent Value"));
+ addItem(parentValueText());
m_useParentValue = true;
}
}
Index: scribus/ui/smsccombobox.h
===================================================================
--- scribus/ui/smsccombobox.h (revision 27861)
+++ scribus/ui/smsccombobox.h (working copy)
@@ -31,6 +31,7 @@
int getItemIndexForData(double d);
void setParentItem(int i);
+ void setParentValueText(const QString& text);
bool useParentValue();
public slots:
@@ -40,8 +41,10 @@
bool m_hasParent = false;
bool m_useParentValue = false;
int m_pItem = 0;
+ QString m_parentValueText;
void setFont(bool wantBold);
+ QString parentValueText() const;
private slots:
void currentChanged();
Index: scribus/ui/smtextstyles.cpp
===================================================================
--- scribus/ui/smtextstyles.cpp (revision 27861)
+++ scribus/ui/smtextstyles.cpp (working copy)
@@ -489,6 +489,9 @@
connect(m_pwidget->lineSpacing, SIGNAL(valueChanged(double)), this, SLOT(slotLineSpacing()));
connect(m_pwidget->spaceAbove, SIGNAL(valueChanged(double)), this, SLOT(slotSpaceAbove()));
connect(m_pwidget->spaceBelow, SIGNAL(valueChanged(double)), this, SLOT(slotSpaceBelow()));
+ connect(m_pwidget->paragraphLayout, SIGNAL(activated(int)), this, SLOT(handleParagraphLayout(int)));
+ connect(m_pwidget->spanSpaceBefore, SIGNAL(valueChanged(double)), this, SLOT(handleSpanSpaceBefore()));
+ connect(m_pwidget->spanSpaceAfter, SIGNAL(valueChanged(double)), this, SLOT(handleSpanSpaceAfter()));
connect(m_pwidget->alignment->TextL, SIGNAL(clicked()), this, SLOT(slotAlignment()));
connect(m_pwidget->alignment->TextR, SIGNAL(clicked()), this, SLOT(slotAlignment()));
connect(m_pwidget->alignment->TextC, SIGNAL(clicked()), this, SLOT(slotAlignment()));
@@ -584,6 +587,9 @@
disconnect(m_pwidget->lineSpacing, SIGNAL(valueChanged(double)), this, SLOT(slotLineSpacing()));
disconnect(m_pwidget->spaceAbove, SIGNAL(valueChanged(double)), this, SLOT(slotSpaceAbove()));
disconnect(m_pwidget->spaceBelow, SIGNAL(valueChanged(double)), this, SLOT(slotSpaceBelow()));
+ disconnect(m_pwidget->paragraphLayout, SIGNAL(activated(int)), this, SLOT(handleParagraphLayout(int)));
+ disconnect(m_pwidget->spanSpaceBefore, SIGNAL(valueChanged(double)), this, SLOT(handleSpanSpaceBefore()));
+ disconnect(m_pwidget->spanSpaceAfter, SIGNAL(valueChanged(double)), this, SLOT(handleSpanSpaceAfter()));
disconnect(m_pwidget->alignment->TextL, SIGNAL(clicked()), this, SLOT(slotAlignment()));
disconnect(m_pwidget->alignment->TextR, SIGNAL(clicked()), this, SLOT(slotAlignment()));
disconnect(m_pwidget->alignment->TextC, SIGNAL(clicked()), this, SLOT(slotAlignment()));
@@ -734,6 +740,62 @@
slotSelectionDirty();
}
+void SMParagraphStyle::handleParagraphLayout(int index)
+{
+ if (m_pwidget->paragraphLayout->useParentValue())
+ {
+ for (int i = 0; i < m_selection.count(); ++i)
+ m_selection[i]->resetParagraphLayout();
+ }
+ else if (index >= 0 && index < 2)
+ {
+ const auto mode = static_cast<ParagraphStyle::ParagraphLayoutMode>(m_pwidget->paragraphLayout->itemData(index).toInt());
+ for (int i = 0; i < m_selection.count(); ++i)
+ m_selection[i]->setParagraphLayout(mode);
+ }
+
+ const bool spanEnabled = m_pwidget->paragraphLayout->currentData().toInt() == ParagraphStyle::ParagraphLayoutSpanColumns;
+ m_pwidget->spanSpaceBeforeLabel->setEnabled(spanEnabled);
+ m_pwidget->spanSpaceAfterLabel->setEnabled(spanEnabled);
+ slotSelectionDirty();
+}
+
+void SMParagraphStyle::handleSpanSpaceBefore()
+{
+ if (m_pwidget->spanSpaceBefore->useParentValue())
+ {
+ for (int i = 0; i < m_selection.count(); ++i)
+ m_selection[i]->resetSpanSpaceBefore();
+ }
+ else
+ {
+ double a, b, value;
+ int c;
+ m_pwidget->spanSpaceBefore->getValues(&a, &b, &c, &value);
+ for (int i = 0; i < m_selection.count(); ++i)
+ m_selection[i]->setSpanSpaceBefore(value / m_unitRatio);
+ }
+ slotSelectionDirty();
+}
+
+void SMParagraphStyle::handleSpanSpaceAfter()
+{
+ if (m_pwidget->spanSpaceAfter->useParentValue())
+ {
+ for (int i = 0; i < m_selection.count(); ++i)
+ m_selection[i]->resetSpanSpaceAfter();
+ }
+ else
+ {
+ double a, b, value;
+ int c;
+ m_pwidget->spanSpaceAfter->getValues(&a, &b, &c, &value);
+ for (int i = 0; i < m_selection.count(); ++i)
+ m_selection[i]->setSpanSpaceAfter(value / m_unitRatio);
+ }
+ slotSelectionDirty();
+}
+
void SMParagraphStyle::slotAlignment()
{
ParagraphStyle::AlignmentType style = static_cast<ParagraphStyle::AlignmentType>(m_pwidget->alignment->getStyle());
@@ -2745,4 +2807,3 @@
m_page = nullptr;
m_widget = nullptr;
}
-
Index: scribus/ui/smtextstyles.h
===================================================================
--- scribus/ui/smtextstyles.h (revision 27861)
+++ scribus/ui/smtextstyles.h (working copy)
@@ -93,6 +93,9 @@
void slotNumHigher(bool isOn);
void slotSpaceAbove();
void slotSpaceBelow();
+ void handleParagraphLayout(int index);
+ void handleSpanSpaceBefore();
+ void handleSpanSpaceAfter();
void slotAlignment();
void slotDirection();
void slotOpticalMargin(int i);
cs5-column-span-recomposition-performance-v1.09.patch (31,461 bytes)
Index: scribus/pageitem_textframe.cpp
===================================================================
--- scribus/pageitem_textframe.cpp (revision 27859)
+++ scribus/pageitem_textframe.cpp (working copy)
@@ -1297,6 +1297,7 @@
bool goNextColumn = false;
bool ownsColumnSpanLayout = false;
int activeSpanStart = -1;
+ double activeSpanRequiredBottom = -1.0;
uint linesAtSpanStart = 0;
TabControl tabs;
@@ -1346,6 +1347,7 @@
//fast validate empty frames
if (itLen == 0 || firstInFrame() == itLen)
{
+ clearColumnSpanCache();
PageItem_TextFrame * next = this;
while (next != nullptr)
{
@@ -1380,6 +1382,7 @@
m_availableRegion = calcAvailableRegion();
if (m_availableRegion.isEmpty())
{
+ clearColumnSpanCache();
m_maxChars = firstInFrame();
goto NoRoom;
}
@@ -1400,21 +1403,28 @@
m_availableRegion = matrix.map(m_availableRegion);
}
+ // update Bullet & number list if any.
+ if (itemText.hasTextMarks() || itemText.hasBulletOrNum() || itemText.marksCountChanged())
+ {
+ updateBulletsNum();
+ itemText.resetMarksCountChanged();
+ }
+
if (!m_columnSpanLayoutActive)
{
+ if (!columnSpanCacheMatchesGeometry())
+ clearColumnSpanCache();
m_columnSpanLayoutActive = true;
m_columnSpanLayoutFallback = false;
m_columnSpanLayoutRetries = 0;
- m_columnSpanLayoutSteps.clear();
+ m_columnSpanLayoutSteps = m_columnSpanCachedSteps;
+ for (ColumnSpanLayoutStep& step : m_columnSpanLayoutSteps)
+ {
+ step.attempts = 0;
+ step.directAttempts = 0;
+ }
ownsColumnSpanLayout = true;
}
-
- // update Bullet & number list if any.
- if (itemText.hasTextMarks() || itemText.hasBulletOrNum() || itemText.marksCountChanged())
- {
- updateBulletsNum();
- itemText.resetMarksCountChanged();
- }
ITextContext* context = this;
//TextShaper textShaper(this, itemText, firstInFrame());
@@ -1482,7 +1492,9 @@
auto restartColumnSpanLayout = [&]()
{
++m_columnSpanLayoutRetries;
- if (m_columnSpanLayoutRetries > 128)
+ // Each discovered span gets its own bounded search allowance.
+ const int retryLimit = 16 + 24 * qMax(1, static_cast<int>(m_columnSpanLayoutSteps.size()));
+ if (m_columnSpanLayoutRetries > retryLimit)
{
// Pathological exclusion geometry or rounding must not recurse
// forever. Preserve story progress with ordinary column flow.
@@ -1569,32 +1581,42 @@
step.continuation = spanContinuation;
step.segmentTop = current.currentRegionTop();
step.segmentFlowTop = current.currentFlowTop();
+ step.segmentFlowBottom = current.currentFlowBottom();
step.low = step.segmentTop;
step.high = current.currentFlowBottom();
if (a == firstInFrame())
{
step.high = step.low;
step.spanTop = step.low;
+ step.topState = ColumnSpanLayoutStep::TopState::Settled;
}
else
{
const double usableHeight = qMax(0.01, step.high - step.segmentFlowTop);
const double usedHeight = current.currentLogicalColumn() * usableHeight
+ qMax(0.0, current.yPos - step.segmentFlowTop);
- step.spanTop = qBound(step.low, step.segmentTop + usedHeight / columnGeometry().size(), step.high);
+ step.spanTop = qBound(step.low,
+ step.segmentTop + usedHeight / columnGeometry().size(), step.high);
}
m_columnSpanLayoutSteps.append(step);
restartColumnSpanLayout();
if (ownsColumnSpanLayout)
- clearColumnSpanLayout();
+ finishColumnSpanLayout();
return;
}
- if (reviseColumnSpanTop(stepIndex, true))
+ const ColumnSpanRevision revision = reviseColumnSpanTop(stepIndex, true,
+ current.currentLogicalColumn(), qMax(current.yPos, maxYDesc));
+ if (revision != ColumnSpanRevision::Resolved)
{
+ if (revision == ColumnSpanRevision::Failed)
+ {
+ m_columnSpanLayoutFallback = true;
+ m_columnSpanLayoutSteps.clear();
+ }
restartColumnSpanLayout();
if (ownsColumnSpanLayout)
- clearColumnSpanLayout();
+ finishColumnSpanLayout();
return;
}
@@ -1610,21 +1632,35 @@
current.recalculateY = true;
lastLineY = current.yPos;
activeSpanStart = a;
+ activeSpanRequiredBottom = -1.0;
linesAtSpanStart = textLayout.lines();
}
else if (current.isEmpty && atParagraphStart && !wantsColumnSpan && current.isSpanRegion())
{
const int stepIndex = columnSpanLayoutStep(current.currentBandStoryStart());
- if (stepIndex >= 0 && m_columnSpanLayoutSteps.at(stepIndex).spanBottom < 0.0)
+ if (stepIndex >= 0
+ && (m_columnSpanLayoutSteps.at(stepIndex).spanBottom < 0.0
+ || m_columnSpanLayoutSteps.at(stepIndex).bottomNeedsValidation))
{
const ParagraphStyle spanStyle = itemText.paragraphStyle(a - 1);
- double spanBottom = qMax(qMax(current.yPos, textLayout.box()->naturalHeight()), maxYDesc)
+ double spanBottom = qMax(qMax(qMax(current.yPos, textLayout.box()->naturalHeight()), maxYDesc),
+ activeSpanRequiredBottom)
+ spanStyle.spanSpaceAfter() + style.gapBefore();
- m_columnSpanLayoutSteps[stepIndex].spanBottom = qMin(spanBottom, current.currentFlowBottom());
- restartColumnSpanLayout();
- if (ownsColumnSpanLayout)
- clearColumnSpanLayout();
- return;
+ ColumnSpanLayoutStep& step = m_columnSpanLayoutSteps[stepIndex];
+ spanBottom = qMin(spanBottom, step.segmentFlowBottom);
+ const bool planHasFollowingBand = step.spanBottom >= 0.0;
+ const bool geometryChanged = !planHasFollowingBand
+ || qAbs(step.spanBottom - spanBottom) > 0.001;
+ step.storyEnd = a;
+ step.bottomNeedsValidation = false;
+ if (geometryChanged)
+ {
+ setColumnSpanBottom(stepIndex, spanBottom);
+ restartColumnSpanLayout();
+ if (ownsColumnSpanLayout)
+ finishColumnSpanLayout();
+ return;
+ }
}
if (!current.moveToNextBand(TextFlowBandKind::Columns, textLayout))
@@ -1639,6 +1675,7 @@
current.recalculateY = true;
lastLineY = current.yPos;
activeSpanStart = -1;
+ activeSpanRequiredBottom = -1.0;
}
if (current.isEmpty)
@@ -2087,6 +2124,11 @@
maxYAsc = qMax(0.0, qMin(maxYAsc, current.yPos - asce));
maxYDesc = current.yPos + desc;
}
+ if (current.isSpanRegion())
+ {
+ const double spanLineBottom = qMax(maxYDesc, current.yPos + realDesc);
+ activeSpanRequiredBottom = qMax(activeSpanRequiredBottom, spanLineBottom);
+ }
regionMinY = static_cast<int>(floor(maxYAsc));
regionMaxY = static_cast<int>(floor(maxYDesc));
@@ -2171,6 +2210,11 @@
maxYAsc = qMax(0.0, qMin(maxYAsc, current.yPos - asce));
maxYDesc = current.yPos + desc;
}
+ if (current.isSpanRegion())
+ {
+ const double spanLineBottom = qMax(maxYDesc, current.yPos + realDesc);
+ activeSpanRequiredBottom = qMax(activeSpanRequiredBottom, spanLineBottom);
+ }
regionMinY = static_cast<int>(floor(maxYAsc));
regionMaxY = static_cast<int>(floor(maxYDesc));
@@ -2182,18 +2223,36 @@
{
if (current.nextRegionLeavesSpan())
{
+ const int stepIndex = columnSpanLayoutStep(current.currentBandStoryStart());
+ if (stepIndex >= 0
+ && m_columnSpanLayoutSteps.at(stepIndex).bottomNeedsValidation
+ && m_columnSpanLayoutSteps.at(stepIndex).spanBottom < m_height - 0.25)
+ {
+ setColumnSpanBottom(stepIndex, m_height);
+ restartColumnSpanLayout();
+ if (ownsColumnSpanLayout)
+ finishColumnSpanLayout();
+ return;
+ }
m_maxChars = a;
goto NoRoom;
}
if (current.nextRegionIsReserved(a))
{
const int stepIndex = columnSpanLayoutStep(current.regions.at(current.regionIndex + 1).storyStart);
- if (stepIndex >= 0)
- reviseColumnSpanTop(stepIndex, false);
- restartColumnSpanLayout();
- if (ownsColumnSpanLayout)
- clearColumnSpanLayout();
- return;
+ const ColumnSpanRevision revision = reviseColumnSpanTop(stepIndex, false);
+ if (revision == ColumnSpanRevision::Failed)
+ {
+ m_columnSpanLayoutFallback = true;
+ m_columnSpanLayoutSteps.clear();
+ }
+ if (revision != ColumnSpanRevision::Resolved)
+ {
+ restartColumnSpanLayout();
+ if (ownsColumnSpanLayout)
+ finishColumnSpanLayout();
+ return;
+ }
}
current.regionIndex++;
if (current.hasCurrentRegion())
@@ -3060,18 +3119,36 @@
goNextColumn = false;
if (current.nextRegionLeavesSpan())
{
+ const int stepIndex = columnSpanLayoutStep(current.currentBandStoryStart());
+ if (stepIndex >= 0
+ && m_columnSpanLayoutSteps.at(stepIndex).bottomNeedsValidation
+ && m_columnSpanLayoutSteps.at(stepIndex).spanBottom < m_height - 0.25)
+ {
+ setColumnSpanBottom(stepIndex, m_height);
+ restartColumnSpanLayout();
+ if (ownsColumnSpanLayout)
+ finishColumnSpanLayout();
+ return;
+ }
m_maxChars = a;
goto NoRoom;
}
if (current.nextRegionIsReserved(a))
{
const int stepIndex = columnSpanLayoutStep(current.regions.at(current.regionIndex + 1).storyStart);
- if (stepIndex >= 0)
- reviseColumnSpanTop(stepIndex, false);
- restartColumnSpanLayout();
- if (ownsColumnSpanLayout)
- clearColumnSpanLayout();
- return;
+ const ColumnSpanRevision revision = reviseColumnSpanTop(stepIndex, false);
+ if (revision == ColumnSpanRevision::Failed)
+ {
+ m_columnSpanLayoutFallback = true;
+ m_columnSpanLayoutSteps.clear();
+ }
+ if (revision != ColumnSpanRevision::Resolved)
+ {
+ restartColumnSpanLayout();
+ if (ownsColumnSpanLayout)
+ finishColumnSpanLayout();
+ return;
+ }
}
current.regionIndex++;
if (current.hasCurrentRegion())
@@ -3189,6 +3266,11 @@
maxYAsc = qMax(0.0, qMin(maxYAsc, current.yPos - asce));
maxYDesc = current.yPos + desc;
}
+ if (current.isSpanRegion())
+ {
+ const double spanLineBottom = qMax(maxYDesc, current.yPos + realDesc);
+ activeSpanRequiredBottom = qMax(activeSpanRequiredBottom, spanLineBottom);
+ }
regionMinY = static_cast<int>(floor(maxYAsc));
regionMaxY = static_cast<int>(floor(maxYDesc));
@@ -3251,6 +3330,7 @@
current.startOfCol = false;
if (moveLinesFromPreviousFrame ()) {
+ clearColumnSpanCache();
clearColumnSpanLayout();
layout (); // line moving ensures that this won't be an endless loop
itemText.blockSignals(false);
@@ -3274,6 +3354,7 @@
double topDist = m_textDistanceMargins.top();
m_textDistanceMargins.setTop(topDist + hAdjust);
verticalAlign = 0;
+ clearColumnSpanCache();
clearColumnSpanLayout();
layout();
verticalAlign = vertAlign;
@@ -3296,16 +3377,20 @@
if (m_nextBox != nullptr)
{
PageItem_TextFrame * nextFrame = dynamic_cast<PageItem_TextFrame*>(m_nextBox);
+ bool directNextFrame = true;
while (nextFrame)
{
+ if (!directNextFrame || nextFrame->firstChar != m_maxChars)
+ nextFrame->clearColumnSpanCache();
nextFrame->invalid = true;
nextFrame->firstChar = m_maxChars;
nextFrame = dynamic_cast<PageItem_TextFrame*>(nextFrame->m_nextBox);
+ directNextFrame = false;
}
}
itemText.blockSignals(false);
if (ownsColumnSpanLayout)
- clearColumnSpanLayout();
+ finishColumnSpanLayout();
// qDebug("textframe: len=%d, done relayout", itemText.length());
return;
@@ -3331,6 +3416,7 @@
double topDist = m_textDistanceMargins.top();
m_textDistanceMargins.setTop(topDist + hAdjust);
verticalAlign = 0;
+ clearColumnSpanCache();
clearColumnSpanLayout();
layout();
verticalAlign = vertAlign;
@@ -3360,34 +3446,43 @@
if (m_Doc->appMode == modeEdit)
next->itemText.setCursorPosition( qMax(nCP, signed(m_maxChars)) );
}
+ bool directNextFrame = true;
while (next)
{
+ if (!directNextFrame || next->firstChar != m_maxChars)
+ next->clearColumnSpanCache();
next->invalid = true;
next->firstChar = m_maxChars;
next = dynamic_cast<PageItem_TextFrame*>(next->m_nextBox);
+ directNextFrame = false;
}
}
// qDebug("textframe: len=%d, done relayout (no room %d)", itemText.length(), MaxChars);
itemText.blockSignals(false);
if (ownsColumnSpanLayout)
- clearColumnSpanLayout();
+ finishColumnSpanLayout();
}
void PageItem_TextFrame::invalidateLayout(bool wholeChain)
{
//const bool wholeChain = true;
+ clearColumnSpanCache();
invalid = true;
if (wholeChain)
{
PageItem *prevFrame = this->prevInChain();
while (prevFrame != nullptr)
{
+ if (PageItem_TextFrame* textFrame = dynamic_cast<PageItem_TextFrame*>(prevFrame))
+ textFrame->clearColumnSpanCache();
prevFrame->invalid = true;
prevFrame = prevFrame->prevInChain();
}
PageItem *nextFrame = this->nextInChain();
while (nextFrame != nullptr)
{
+ if (PageItem_TextFrame* textFrame = dynamic_cast<PageItem_TextFrame*>(nextFrame))
+ textFrame->clearColumnSpanCache();
nextFrame->invalid = true;
nextFrame = nextFrame->nextInChain();
}
@@ -3400,8 +3501,9 @@
slotInvalidateLayout(firstChar, storyLen);
}
-void PageItem_TextFrame::slotInvalidateLayout(int firstItem, int /*endItem*/)
+void PageItem_TextFrame::slotInvalidateLayout(int firstItem, int endItem)
{
+ pruneColumnSpanCache(firstItem, endItem);
PageItem* firstFrame = firstInChain();
firstItem = itemText.prevParagraph(firstItem);
@@ -5507,11 +5609,11 @@
if (step.storyStart > firstInFrame() && itemText.isBlockStart(step.storyStart))
spanFlowTop += spanStyle.gapBefore();
}
- const double spanBottom = step.spanBottom >= 0.0 ? step.spanBottom : m_height;
+ const double spanBottom = step.spanBottom >= 0.0 ? qMin(step.spanBottom, m_height) : m_height;
plan.bands.append(spanBand(step.storyStart, step.spanTop, spanBottom, spanFlowTop,
- step.spanBottom >= 0.0 ? step.spanBottom : contentBottom));
+ step.spanBottom >= 0.0 ? spanBottom : contentBottom));
- if (step.spanBottom < 0.0)
+ if (step.spanBottom < 0.0 || step.spanBottom >= m_height)
return plan;
}
@@ -5531,25 +5633,445 @@
return -1;
}
-bool PageItem_TextFrame::reviseColumnSpanTop(int stepIndex, bool prefixFits)
+PageItem_TextFrame::ColumnSpanRevision PageItem_TextFrame::reviseColumnSpanTop(int stepIndex, bool prefixFits,
+ int logicalColumn, double usedBottom)
{
if (stepIndex < 0 || stepIndex >= m_columnSpanLayoutSteps.size())
- return false;
+ return ColumnSpanRevision::Failed;
ColumnSpanLayoutStep& step = m_columnSpanLayoutSteps[stepIndex];
+ auto rememberPrefix = [&]()
+ {
+ if (!prefixFits || logicalColumn < 0)
+ return;
+ step.prefixLogicalColumn = logicalColumn;
+ step.prefixSlack = step.spanTop - usedBottom;
+ step.prefixFingerprintValid = true;
+ };
+ if (step.topState == ColumnSpanLayoutStep::TopState::Settled)
+ {
+ if (prefixFits)
+ {
+ rememberPrefix();
+ return ColumnSpanRevision::Resolved;
+ }
+
+ // The cached top was reached before all prefix text fitted. Reopen only
+ // the interval below that top; a settled step must never be re-probed
+ // merely because an unrelated edit started a new layout transaction.
+ step.topState = ColumnSpanLayoutStep::TopState::Search;
+ step.low = step.spanTop;
+ step.high = step.segmentFlowBottom;
+ step.attempts = 0;
+ step.directAttempts = 0;
+ step.prefixFingerprintValid = false;
+ if (step.high - step.low <= 0.25)
+ return ColumnSpanRevision::Failed;
+ setColumnSpanTop(stepIndex, (step.low + step.high) / 2.0);
+ return ColumnSpanRevision::Retry;
+ }
+ if (step.topState == ColumnSpanLayoutStep::TopState::Validate)
+ {
+ const double observedSlack = step.spanTop - usedBottom;
+ if (prefixFits && step.prefixFingerprintValid
+ && logicalColumn == step.prefixLogicalColumn
+ && qAbs(observedSlack - step.prefixSlack) <= 0.25)
+ {
+ // The cached span boundary reproduced the same terminal column and
+ // vertical slack. Its prefix geometry is unchanged, so do not search
+ // through otherwise legitimate end-of-column whitespace again.
+ step.low = step.spanTop;
+ step.high = step.spanTop;
+ step.attempts = 0;
+ step.directAttempts = 0;
+ step.topState = ColumnSpanLayoutStep::TopState::Settled;
+ rememberPrefix();
+ return ColumnSpanRevision::Resolved;
+ }
+
+ step.topState = ColumnSpanLayoutStep::TopState::Search;
+ step.low = step.segmentTop;
+ step.high = step.segmentFlowBottom;
+ step.attempts = 0;
+ step.directAttempts = 0;
+ step.prefixFingerprintValid = false;
+ }
+
+ const double previousTop = step.spanTop;
if (prefixFits)
step.high = qMin(step.high, step.spanTop);
else
step.low = qMax(step.low, step.spanTop);
++step.attempts;
- const bool converged = (step.high - step.low <= 0.25) || (step.attempts >= 16);
- const double nextTop = converged ? step.high : (step.low + step.high) / 2.0;
- const bool needsRetry = !prefixFits || !converged;
- step.spanTop = nextTop;
- if (converged)
+ const double remaining = step.high - step.low;
+ if (prefixFits)
+ {
+ const int columnCount = static_cast<int>(columnGeometry().size());
+ const int lastColumn = columnCount - 1;
+ const double fittedBottom = qBound(step.low, usedBottom, step.high);
+ const double slack = qMax(0.0, step.spanTop - fittedBottom);
+ if (logicalColumn >= lastColumn && slack <= 0.25)
+ {
+ step.low = step.high;
+ setColumnSpanTop(stepIndex, step.high);
+ m_columnSpanLayoutSteps[stepIndex].topState = ColumnSpanLayoutStep::TopState::Settled;
+ rememberPrefix();
+ return ColumnSpanRevision::Resolved;
+ }
+
+ if (remaining > 0.25 && logicalColumn >= 0 && step.directAttempts < 4)
+ {
+ // Use measured occupancy for the first probes. Binary bisection below
+ // remains the fallback for exclusions and other irregular geometry.
+ double nextTop = fittedBottom;
+ if (logicalColumn < lastColumn && columnCount > 0)
+ {
+ const double probeHeight = qMax(0.01, step.spanTop - step.segmentFlowTop);
+ const double usedHeight = logicalColumn * probeHeight
+ + qMax(0.0, fittedBottom - step.segmentFlowTop);
+ nextTop = step.segmentTop + usedHeight / columnCount;
+ }
+ nextTop = qBound(step.low + 0.25, nextTop, step.high);
+ if (nextTop < step.spanTop - 0.01)
+ {
+ setColumnSpanTop(stepIndex, nextTop);
+ ++step.directAttempts;
+ return ColumnSpanRevision::Retry;
+ }
+ }
+ }
+
+ if (remaining <= 0.25)
+ {
step.low = step.high;
- return needsRetry;
+ setColumnSpanTop(stepIndex, step.high);
+ if (prefixFits)
+ {
+ m_columnSpanLayoutSteps[stepIndex].topState = ColumnSpanLayoutStep::TopState::Settled;
+ rememberPrefix();
+ return ColumnSpanRevision::Resolved;
+ }
+ return qAbs(previousTop - step.high) > 0.01
+ ? ColumnSpanRevision::Retry : ColumnSpanRevision::Failed;
+ }
+
+ if (step.attempts >= 16)
+ {
+ setColumnSpanTop(stepIndex, step.high);
+ if (prefixFits)
+ {
+ step.low = step.high;
+ m_columnSpanLayoutSteps[stepIndex].topState = ColumnSpanLayoutStep::TopState::Settled;
+ rememberPrefix();
+ return ColumnSpanRevision::Resolved;
+ }
+ return qAbs(previousTop - step.high) > 0.01
+ ? ColumnSpanRevision::Retry : ColumnSpanRevision::Failed;
+ }
+
+ setColumnSpanTop(stepIndex, (step.low + step.high) / 2.0);
+ return ColumnSpanRevision::Retry;
+}
+
+void PageItem_TextFrame::setColumnSpanTop(int stepIndex, double spanTop)
+{
+ if (stepIndex < 0 || stepIndex >= m_columnSpanLayoutSteps.size())
+ return;
+ ColumnSpanLayoutStep& step = m_columnSpanLayoutSteps[stepIndex];
+ spanTop = qBound(step.segmentTop, spanTop, step.segmentFlowBottom);
+ const double delta = spanTop - step.spanTop;
+ if (qAbs(delta) <= 0.001)
+ return;
+ step.spanTop = spanTop;
+ if (step.spanHeight >= 0.0)
+ {
+ step.spanBottom = step.spanTop + step.spanHeight;
+ step.bottomNeedsValidation = true;
+ }
+ translateColumnSpanSteps(stepIndex + 1, delta);
+}
+
+void PageItem_TextFrame::setColumnSpanBottom(int stepIndex, double spanBottom)
+{
+ if (stepIndex < 0 || stepIndex >= m_columnSpanLayoutSteps.size())
+ return;
+ ColumnSpanLayoutStep& step = m_columnSpanLayoutSteps[stepIndex];
+ spanBottom = qBound(step.spanTop, spanBottom, m_height);
+ const double oldBottom = step.spanBottom;
+ step.spanBottom = spanBottom;
+ step.spanHeight = spanBottom - step.spanTop;
+ if (oldBottom >= 0.0)
+ translateColumnSpanSteps(stepIndex + 1, spanBottom - oldBottom);
+}
+
+void PageItem_TextFrame::translateColumnSpanSteps(int firstStep, double delta)
+{
+ if (qAbs(delta) <= 0.001)
+ return;
+ for (int i = qMax(0, firstStep); i < m_columnSpanLayoutSteps.size(); ++i)
+ {
+ ColumnSpanLayoutStep& step = m_columnSpanLayoutSteps[i];
+ step.segmentTop += delta;
+ step.segmentFlowTop += delta;
+ step.spanTop += delta;
+ if (step.spanHeight >= 0.0)
+ {
+ step.spanBottom = step.spanTop + step.spanHeight;
+ step.bottomNeedsValidation = true;
+ }
+ step.low = step.segmentTop;
+ step.high = step.segmentFlowBottom;
+ step.attempts = 0;
+ step.directAttempts = 0;
+ step.topState = ColumnSpanLayoutStep::TopState::Validate;
+ }
+}
+
+bool PageItem_TextFrame::columnSpanStepMatchesStory(const ColumnSpanLayoutStep& step) const
+{
+ const int storyLength = itemText.length();
+ if (step.storyStart < firstInFrame() || step.storyStart >= storyLength)
+ return false;
+ if (!step.continuation && !itemText.isBlockStart(step.storyStart))
+ return false;
+ if (itemText.paragraphStyle(step.storyStart).paragraphLayout()
+ != ParagraphStyle::ParagraphLayoutSpanColumns)
+ {
+ return false;
+ }
+ if (step.storyEnd < 0 || step.storyEnd > storyLength || step.storyEnd <= step.storyStart)
+ return false;
+
+ int paragraphStart = step.storyStart;
+ while (paragraphStart < step.storyEnd)
+ {
+ if (itemText.paragraphStyle(paragraphStart).paragraphLayout()
+ != ParagraphStyle::ParagraphLayoutSpanColumns)
+ {
+ return false;
+ }
+ const int nextStart = itemText.nextParagraph(paragraphStart) + 1;
+ if (nextStart <= paragraphStart)
+ return false;
+ paragraphStart = nextStart;
+ }
+ if (paragraphStart != step.storyEnd)
+ return false;
+ return step.storyEnd == storyLength
+ || itemText.paragraphStyle(step.storyEnd).paragraphLayout()
+ != ParagraphStyle::ParagraphLayoutSpanColumns;
+}
+
+bool PageItem_TextFrame::columnSpanCacheMatchesGeometry() const
+{
+ if (m_columnSpanCachedSteps.isEmpty())
+ return true;
+ if (m_columnSpanCachedStoryLength != itemText.length()
+ || m_columnSpanCachedAvailableRegion != m_availableRegion)
+ {
+ return false;
+ }
+
+ const QVector<TextFlowRegion> regions = initialFlowPlan().regions();
+ if (regions.size() != m_columnSpanCachedRegions.size())
+ return false;
+ for (int i = 0; i < regions.size(); ++i)
+ {
+ const TextFlowRegion& current = regions.at(i);
+ const TextFlowRegion& cached = m_columnSpanCachedRegions.at(i);
+ if (current.bandKind != cached.bandKind
+ || current.logicalColumn != cached.logicalColumn
+ || current.bounds != cached.bounds
+ || qAbs(current.flowTop - cached.flowTop) > 0.001
+ || qAbs(current.flowBottom - cached.flowBottom) > 0.001)
+ {
+ return false;
+ }
+ }
+
+ for (const ColumnSpanLayoutStep& step : m_columnSpanCachedSteps)
+ {
+ if (!columnSpanStepMatchesStory(step))
+ return false;
+ }
+ return true;
+}
+
+void PageItem_TextFrame::pruneColumnSpanCache(int firstItem, int endItem)
+{
+ if (m_columnSpanCachedSteps.isEmpty())
+ return;
+
+ const int storyLength = itemText.length();
+ const int lengthDelta = m_columnSpanCachedStoryLength >= 0
+ ? storyLength - m_columnSpanCachedStoryLength : 0;
+ const bool wholeStoryInvalidated = firstItem <= 0 && endItem >= storyLength
+ && m_columnSpanCachedStoryLength == storyLength;
+ const int changedAt = qBound(0, firstItem, storyLength);
+ int paragraphStart = changedAt;
+ while (paragraphStart > 0 && !itemText.isBlockStart(paragraphStart))
+ --paragraphStart;
+
+ int dirtySpan = -1;
+ int validateFrom = m_columnSpanCachedSteps.size();
+ for (int i = 0; i < m_columnSpanCachedSteps.size(); ++i)
+ {
+ ColumnSpanLayoutStep& step = m_columnSpanCachedSteps[i];
+ const int oldStart = step.storyStart;
+ const int oldEnd = step.storyEnd;
+ if (oldStart <= changedAt && changedAt < oldEnd)
+ {
+ dirtySpan = i;
+ validateFrom = qMin(validateFrom, i + 1);
+ }
+ else if (changedAt < oldStart)
+ validateFrom = qMin(validateFrom, i);
+
+ if (step.storyStart > changedAt)
+ step.storyStart += lengthDelta;
+ if (step.storyEnd > changedAt)
+ step.storyEnd += lengthDelta;
+ step.attempts = 0;
+ step.directAttempts = 0;
+ }
+
+ int validCount = 0;
+ while (validCount < m_columnSpanCachedSteps.size()
+ && columnSpanStepMatchesStory(m_columnSpanCachedSteps.at(validCount)))
+ {
+ ++validCount;
+ }
+ if (validCount < m_columnSpanCachedSteps.size())
+ m_columnSpanCachedSteps.resize(validCount);
+ if (dirtySpan >= m_columnSpanCachedSteps.size())
+ dirtySpan = -1;
+ validateFrom = qMin(validateFrom, m_columnSpanCachedSteps.size());
+
+ bool paragraphCoveredBySpan = false;
+ for (const ColumnSpanLayoutStep& step : std::as_const(m_columnSpanCachedSteps))
+ {
+ if (step.storyStart <= paragraphStart && paragraphStart < step.storyEnd)
+ {
+ paragraphCoveredBySpan = true;
+ break;
+ }
+ }
+ const bool changedParagraphIsSpan = paragraphStart < storyLength
+ && itemText.paragraphStyle(paragraphStart).paragraphLayout()
+ == ParagraphStyle::ParagraphLayoutSpanColumns;
+ if (changedParagraphIsSpan && !paragraphCoveredBySpan)
+ {
+ int firstLaterStep = 0;
+ while (firstLaterStep < m_columnSpanCachedSteps.size()
+ && m_columnSpanCachedSteps.at(firstLaterStep).storyStart < paragraphStart)
+ {
+ ++firstLaterStep;
+ }
+ m_columnSpanCachedSteps.resize(firstLaterStep);
+ validateFrom = qMin(validateFrom, firstLaterStep);
+ }
+
+ const int paragraphEnd = storyLength > 0
+ ? itemText.nextParagraph(qMin(changedAt, storyLength - 1)) : 0;
+ const bool paragraphMayHaveChanged = m_columnSpanCachedStoryLength == storyLength
+ && endItem >= paragraphEnd;
+ if (paragraphMayHaveChanged)
+ {
+ // A span band's bottom includes the following paragraph's gap-before.
+ // Remeasure it when that following paragraph's style may have changed.
+ for (int i = 0; i < m_columnSpanCachedSteps.size(); ++i)
+ {
+ ColumnSpanLayoutStep& step = m_columnSpanCachedSteps[i];
+ if (step.storyEnd == paragraphStart)
+ {
+ step.bottomNeedsValidation = true;
+ validateFrom = qMin(validateFrom, i + 1);
+ break;
+ }
+ }
+ }
+
+ if (dirtySpan >= 0)
+ {
+ ColumnSpanLayoutStep& dirtyStep = m_columnSpanCachedSteps[dirtySpan];
+ dirtyStep.low = dirtyStep.spanTop;
+ dirtyStep.high = dirtyStep.spanTop;
+ dirtyStep.topState = ColumnSpanLayoutStep::TopState::Settled;
+ dirtyStep.bottomNeedsValidation = true;
+ dirtyStep.attempts = 0;
+ dirtyStep.directAttempts = 0;
+ }
+
+ if (wholeStoryInvalidated)
+ {
+ // Named-style changes invalidate StoryText as one full range. Every
+ // cached span may therefore have a different height or spacing even
+ // though its story positions and the frame geometry are unchanged.
+ validateFrom = 0;
+ for (ColumnSpanLayoutStep& step : m_columnSpanCachedSteps)
+ step.bottomNeedsValidation = true;
+ }
+
+ for (int i = validateFrom; i < m_columnSpanCachedSteps.size(); ++i)
+ {
+ ColumnSpanLayoutStep& step = m_columnSpanCachedSteps[i];
+ step.low = step.segmentTop;
+ step.high = step.segmentFlowBottom;
+ step.topState = ColumnSpanLayoutStep::TopState::Validate;
+ step.attempts = 0;
+ step.directAttempts = 0;
+ }
+ m_columnSpanCachedStoryLength = storyLength;
+}
+
+void PageItem_TextFrame::clearColumnSpanCache()
+{
+ m_columnSpanCachedSteps.clear();
+ m_columnSpanCachedRegions.clear();
+ m_columnSpanCachedAvailableRegion = QRegion();
+ m_columnSpanCachedStoryLength = -1;
+}
+
+void PageItem_TextFrame::finishColumnSpanLayout()
+{
+ if (m_columnSpanLayoutFallback)
+ {
+ clearColumnSpanCache();
+ }
+ else
+ {
+ QVector<ColumnSpanLayoutStep> completedSteps;
+ completedSteps.reserve(m_columnSpanLayoutSteps.size());
+ for (ColumnSpanLayoutStep step : std::as_const(m_columnSpanLayoutSteps))
+ {
+ if (step.spanBottom < 0.0 || step.spanHeight < 0.0 || step.storyEnd < 0
+ || step.topState != ColumnSpanLayoutStep::TopState::Settled
+ || step.bottomNeedsValidation)
+ {
+ break;
+ }
+ step.low = step.spanTop;
+ step.high = step.spanTop;
+ step.attempts = 0;
+ step.directAttempts = 0;
+ step.topState = ColumnSpanLayoutStep::TopState::Settled;
+ completedSteps.append(step);
+ }
+
+ if (completedSteps.isEmpty())
+ {
+ clearColumnSpanCache();
+ }
+ else
+ {
+ m_columnSpanCachedSteps = completedSteps;
+ m_columnSpanCachedRegions = initialFlowPlan().regions();
+ m_columnSpanCachedAvailableRegion = m_availableRegion;
+ m_columnSpanCachedStoryLength = itemText.length();
+ }
+ }
+ clearColumnSpanLayout();
}
void PageItem_TextFrame::clearColumnSpanLayout()
Index: scribus/pageitem_textframe.h
===================================================================
--- scribus/pageitem_textframe.h (revision 27859)
+++ scribus/pageitem_textframe.h (working copy)
@@ -24,6 +24,7 @@
#include <QHash>
#include <QRectF>
+#include <QRegion>
#include <QString>
#include <QKeyEvent>
@@ -157,22 +158,59 @@
struct ColumnSpanLayoutStep
{
int storyStart { -1 };
+ int storyEnd { -1 };
bool continuation { false };
double segmentTop { 0.0 };
double segmentFlowTop { 0.0 };
+ double segmentFlowBottom { 0.0 };
double low { 0.0 };
double high { 0.0 };
double spanTop { 0.0 };
double spanBottom { -1.0 };
+ double spanHeight { -1.0 };
int attempts { 0 };
+ int directAttempts { 0 };
+ int prefixLogicalColumn { -1 };
+ double prefixSlack { 0.0 };
+ bool prefixFingerprintValid { false };
+ enum class TopState
+ {
+ Settled,
+ Validate,
+ Search
+ };
+ TopState topState { TopState::Search };
+ bool bottomNeedsValidation { false };
+ };
+
+ enum class ColumnSpanRevision
+ {
+ Resolved,
+ Retry,
+ Failed
};
bool m_columnSpanLayoutActive { false };
bool m_columnSpanLayoutFallback { false };
int m_columnSpanLayoutRetries { 0 };
QVector<ColumnSpanLayoutStep> m_columnSpanLayoutSteps;
+ // Completed bands from the last layout remain in the active flow plan.
+ // Story invalidation marks affected geometry for validation in place.
+ QVector<ColumnSpanLayoutStep> m_columnSpanCachedSteps;
+ QVector<TextFlowRegion> m_columnSpanCachedRegions;
+ QRegion m_columnSpanCachedAvailableRegion;
+ int m_columnSpanCachedStoryLength { -1 };
int columnSpanLayoutStep(int storyStart) const;
- bool reviseColumnSpanTop(int stepIndex, bool prefixFits);
+ ColumnSpanRevision reviseColumnSpanTop(int stepIndex, bool prefixFits, int logicalColumn = -1,
+ double usedBottom = 0.0);
+ void setColumnSpanTop(int stepIndex, double spanTop);
+ void setColumnSpanBottom(int stepIndex, double spanBottom);
+ void translateColumnSpanSteps(int firstStep, double delta);
+ bool columnSpanStepMatchesStory(const ColumnSpanLayoutStep& step) const;
+ bool columnSpanCacheMatchesGeometry() const;
+ void pruneColumnSpanCache(int firstItem, int endItem);
+ void clearColumnSpanCache();
+ void finishColumnSpanLayout();
void clearColumnSpanLayout();
bool cursorBiasBackward {false};
|
|
|
Currently, the span options are 'All Columns' and 'None' (which is default). Here are some screenshot that show it in action with the UI. |
|
|
Here is one more screenshot, and a sample test .sla. Also, since there is no relationship/duplicate mentioned, let me leave this as a reminder that when (whenever) this is closed, close 0002039 as well. column-span-test.sla (34,668 bytes)
<?xml version="1.0" encoding="UTF-8"?>
<SCRIBUSUTF8NEW Version="1.7.4.svn">
<Document PageCount="6" PageWidth="595.2744" PageHeight="841.8888" BorderLeft="40" BorderRight="40" BorderTop="40" BorderBottom="40" MarginPreset="0" BleedTop="0" BleedLeft="0" BleedRight="0" BleedBottom="0" PageOrientation="0" PageSize="A4" FirstPageNumber="1" PagePositioning="1" BindingDirection="0" IsRTL="0" AutomaticTextFrameColumnCount="1" AutomaticTextFrameColumnGap="11" UnitIndex="2" FontFace="Arial Regular" FontSize="12" TextColumnCount="1" TextColumnGap="0" TabFillCharacter="" TabWidth="36" TextDistanceLeft="0" TextDistanceRight="0" TextDistanceBottom="0" TextDistanceTop="0" FirstLineOffset="1" DocumentInfoAuthor="" DocumentInfoComments="" DocumentInfoKeywords="" DocumentInfoPublisher="" DocumentInfoDate="" DocumentInfoType="" DocumentInfoFormat="" DocumentInfoIdentifier="" DocumentInfoSource="" DocumentInfoLanguage="" DocumentInfoRelation="" DocumentInfoCoverage="" DocumentInfoRights="" DocumentInfoContributors="" DocumentInfoTitle="" DocumentInfoSubject="" SuperScriptDisplacement="33" SuperScriptScaling="66" SubScriptDisplacement="33" SubScriptScaling="66" SmallCapsScaling="75" BaselineGridSpacing="14.4" BaselineGridOffset="0" AutoLineSpacingPct="100" UnderlinePosition="-1" UnderlineWidth="-1" StrikeThruPosition="-1" StrikeThruWidth="-1" GroupCounter="1" DocumentHasCMS="0" SoftProofOn="0" SoftProofFullOn="0" ColorManagementActive="0" GamutCheck="0" BlackPoint="1" DefaultPrinterProfile="ISO Coated v2 300% (basICColor)" DefaultImageRGBProfile="sRGB display profile (ICC v2.2)" DefaultImageCMYKProfile="ISO Coated v2 300% (basICColor)" DefaultSolidColorRGBProfile="sRGB display profile (ICC v2.2)" DefaultSolidColorCMYKProfile="ISO Coated v2 300% (basICColor)" DefaultIntentColors="1" DefaultIntentImages="0" ActiveLayer="0" Language="en_GB" AutomaticHyphenation="1" AutomaticHyphenationCheck="0" GuideLock="0" SnapToGuides="1" SnapToGrid="0" SnapToItems="0" MinorGridSpacing="20.002" MajorGridSpacing="100.001" ShowGrid="0" ShowGuides="1" ShowColumnBorders="1" ShowFrames="1" ShowControls="0" ShowTableCellFrames="0" ShowLayerMarkers="0" ShowMargins="1" ShowBaselineGrid="0" ShowImages="1" ShowLinks="0" RulerMode="1" ShowRulers="1" ShowBleed="1" RulerXOffset="0" RulerYOffset="0" GuideRadius="10" GrabRadius="4" PolygonCorners="4" PolygonFactor="0.502" PolygonRotation="0" PolygonInnerRotation="0" PolygonCurvature="0" PolygonOuterCurvature="0" PolygonUseFactor="0" ArcStartAngle="30" ArcSweepAngle="300" SpiralStartAngle="0" SpiralEndAngle="1080" SpiralFactor="1.2" AutoSave="0" AutoSaveTime="600000" AutoSaveCount="1" AutoSaveKeep="0" AutoSaveInDocumentDirectory="1" AutoSaveDirectory="" ScratchBottom="20.002" ScratchLeft="100.001" ScratchRight="100.001" ScratchTop="20.002" GapHorizontal="0" GapVertical="40.003" LineStartArrow="0" LineEndArrow="0" ShapeLineColor="None" ShapeFillColor="Cyan" LineColor="Black" TextColor="Black" TextStrokeColor="Black" TextBackgroundColor="None" TextLineColor="None" TextBackgroundColorShade="100" TextLineColorShade="100" TextColorShade="100" TextStrokeColorShade="100" ShapeLineStyle="1" LineStyle="1" ShapeLineWidth="1" LineWidth="1" ShapeLineColorShade="100" LineColorShade="100" ShapeFillColorShade="100" ImageFillColor="None" ImageFillColorShade="100" ImageStrokeColor="None" ImageStrokeColorShade="100" ImageScaleX="1" ImageScaleY="1" ImageScaleType="1" ImageAspectRatio="1" ImageUseEmbeddedPath="0" ImageLowResType="1" DisplayOffsetX="10.001" DisplayOffsetY="10.001" RotationConstrainAngle="15" MinorGridColor="#00ff00" MajorGridColor="#00ff00" GuidesColor="#000080" BaselineGridColor="#c0c0c0" RenderStack="2 0 4 1 3" GridType="0" PageColor="#ffffff" MarginColor="#0000ff" ShowMarginsFilled="0" CurrentProfile="PDF 1.4" CalligraphicPenFillColor="Black" CalligraphicPenLineColor="Black" CalligraphicPenFillColorShade="100" CalligraphicPenLineColorShade="100" CalligraphicPenLineWidth="1" CalligraphicPenAngle="0" CalligraphicPenWidth="10" CalligraphicPenStyle="1">
<CheckProfile Name="PDF 1.3" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="1" MinimumResolution="144" MaximumResolution="2400" CheckAnnotations="0" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="0" CheckDeviceColorsAndOutputIntent="0" CheckFontNotEmbedded="1" CheckFontIsOpenType="1" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="0"/>
<CheckProfile Name="PDF 1.4" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="0" MinimumResolution="144" MaximumResolution="2400" CheckAnnotations="0" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="0" CheckDeviceColorsAndOutputIntent="0" CheckFontNotEmbedded="1" CheckFontIsOpenType="1" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="1"/>
<CheckProfile Name="PDF 1.5" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="0" MinimumResolution="144" MaximumResolution="2400" CheckAnnotations="0" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="0" CheckDeviceColorsAndOutputIntent="0" CheckFontNotEmbedded="1" CheckFontIsOpenType="1" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="1"/>
<CheckProfile Name="PDF 1.6" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="0" MinimumResolution="144" MaximumResolution="2400" CheckAnnotations="0" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="0" CheckDeviceColorsAndOutputIntent="0" CheckFontNotEmbedded="1" CheckFontIsOpenType="0" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="1"/>
<CheckProfile Name="PDF/X-1a" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="1" MinimumResolution="144" MaximumResolution="2400" CheckAnnotations="1" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="1" CheckDeviceColorsAndOutputIntent="0" CheckFontNotEmbedded="1" CheckFontIsOpenType="1" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="1"/>
<CheckProfile Name="PDF/X-3" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="1" MinimumResolution="144" MaximumResolution="2400" CheckAnnotations="1" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="0" CheckDeviceColorsAndOutputIntent="1" CheckFontNotEmbedded="1" CheckFontIsOpenType="1" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="1"/>
<CheckProfile Name="PDF/X-4" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="0" MinimumResolution="144" MaximumResolution="2400" CheckAnnotations="1" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="0" CheckDeviceColorsAndOutputIntent="1" CheckFontNotEmbedded="1" CheckFontIsOpenType="0" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="1"/>
<CheckProfile Name="PostScript" IgnoreErrors="0" AutoCheck="1" CheckGlyphs="1" CheckOrphans="1" CheckOverflow="1" CheckPictures="1" CheckPartFilledImageFrames="0" CheckResolution="1" CheckTransparency="1" MinimumResolution="144" MaximumResolution="2400" CheckAnnotations="0" CheckRasterPDF="1" CheckForGIF="1" IgnoreOffLayers="0" CheckNotCMYKOrSpot="0" CheckDeviceColorsAndOutputIntent="0" CheckFontNotEmbedded="0" CheckFontIsOpenType="0" CheckAppliedMasterDifferentSide="1" CheckEmptyTextFrames="1" CheckImageHasProgressiveEncoding="1"/>
<Color Name="Black" Space="CMYK" C="0" M="0" Y="0" K="100"/>
<Color Name="Blue" Space="RGB" R="0" G="0" B="255"/>
<Color Name="Cool Black" Space="CMYK" C="60" M="0" Y="0" K="100"/>
<Color Name="Cyan" Space="CMYK" C="100" M="0" Y="0" K="0"/>
<Color Name="Green" Space="RGB" R="0" G="255" B="0"/>
<Color Name="Magenta" Space="CMYK" C="0" M="100" Y="0" K="0"/>
<Color Name="Red" Space="RGB" R="255" G="0" B="0"/>
<Color Name="Registration" Space="CMYK" C="100" M="100" Y="100" K="100" Register="1"/>
<Color Name="Rich Black" Space="CMYK" C="60" M="40" Y="40" K="100"/>
<Color Name="Warm Black" Space="CMYK" C="0" M="60" Y="29.8039215686275" K="100"/>
<Color Name="White" Space="CMYK" C="0" M="0" Y="0" K="0"/>
<Color Name="Yellow" Space="CMYK" C="0" M="0" Y="100" K="0"/>
<Hyphenator/>
<CharacterStyle Name="Default Character Style" DefaultStyle="1" Font="Arial Regular" FontSize="12" FontFeatures="" Features="inherit" FontColor="Black" FillShade="100" HyphenWordMinimum="3" StrokeColor="Black" BackgroundColor="None" BackgroundShade="100" StrokeShade="100" TextShadowXOffset="5" TextShadowYOffset="-5" TextOutlineWidth="1" TextUnderlineOffset="-0.1" TextUnderlineWidth="-0.1" TextStrikeThroughOffset="-0.1" TextStrikeThroughWidth="-0.1" ScaleHorizontal="100" ScaleVertical="100" BaselineOffset="0" Kerning="0" Language="en_GB"/>
<ParagraphStyle Name="Default Paragraph Style" DefaultStyle="1" Alignment="3" Direction="0" LineSpacingMode="0" LineSpacing="16" LeftMargin="0" RightMargin="0" FirstIndent="0" GapBefore="0" GapAfter="0" ParagraphEffectOffset="0" HasDropCap="0" DropCapLines="2" Bullet="0" Numeration="0" HyphenConsecutiveLines="2" ParagraphBackgroundColor="None" ParagraphBackgroundColorShade="100" Font="League Spartan Regular" FontFeatures="-clig"/>
<ParagraphStyle Name="Byliine" OpticalMarginSetId="preset_0" ParagraphLayout="1" SpanSpaceAfter="13.5" Features="underline" TextShadowXOffset="5" TextShadowYOffset="-5" TextOutlineWidth="1" TextUnderlineOffset="-0.1" TextUnderlineWidth="-0.1" TextStrikeThroughOffset="-0.1" TextStrikeThroughWidth="-0.1" Language="en_GB"/>
<ParagraphStyle Name="Headline" LineSpacingMode="0" LineSpacing="30" OpticalMarginSetId="preset_0" ParagraphLayout="1" SpanSpaceAfter="18" Font="Lato Black" FontSize="30" FontFeatures="-clig" HyphenWordMinimum="3" Language="en_GB"/>
<ParagraphStyle Name="Sub-headlines" LineSpacing="16" OpticalMarginSetId="preset_0" ParagraphLayout="1" SpanSpaceBefore="13.5" SpanSpaceAfter="9" Font="Lato Regular" FontSize="18" FontFeatures="-clig" Language="en_GB"/>
<ParagraphStyle Name="Sub-headline Child" Parent="Sub-headlines" LineSpacing="18" GapBefore="0" GapAfter="0" SpanSpaceBefore="13.5" SpanSpaceAfter="9" Font="Cormorant Garamond Bold" FontSize="18" FontFeatures="-clig"/>
<TableStyle Name="Default Table Style" DefaultStyle="1" FillColor="None" FillShade="100">
<TableBorderLeft>
<TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
</TableBorderLeft>
<TableBorderRight>
<TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
</TableBorderRight>
<TableBorderTop>
<TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
</TableBorderTop>
<TableBorderBottom>
<TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
</TableBorderBottom>
</TableStyle>
<CellStyle Name="Default Cell Style" DefaultStyle="1" FillColor="None" FillShade="100" LeftPadding="1" RightPadding="1" TopPadding="1" BottomPadding="1">
<TableBorderLeft>
<TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
</TableBorderLeft>
<TableBorderRight>
<TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
</TableBorderRight>
<TableBorderTop>
<TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
</TableBorderTop>
<TableBorderBottom>
<TableBorderLine Width="1" PenStyle="1" Color="Black" Shade="100"/>
</TableBorderBottom>
</CellStyle>
<MultiLine Name="Default Line Style">
<SubLine Color="Black" Shade="100" Dash="1" LineEnd="0" LineJoin="0" Width="1" Shortcut=""/>
</MultiLine>
<Layers Number="0" Level="0" Name="Background" IsViewable="1" IsPrintable="1" IsEditable="1" IsSelectable="0" FlowControl="1" Transparency="1" BlendMode="0" OutlineMode="0" LayerColor="#000000"/>
<Layers Number="1" Level="1" Name="Fond de page" IsViewable="1" IsPrintable="1" IsEditable="1" IsSelectable="0" FlowControl="1" Transparency="1" BlendMode="0" OutlineMode="0" LayerColor="#000000"/>
<Printer firstUse="1" toFile="0" useAltPrintCommand="0" outputSeparations="0" useSpotColors="1" useColor="1" mirrorH="0" mirrorV="0" useICC="0" doGCR="0" doClip="0" setDevParam="0" useDocBleeds="1" cropMarks="0" bleedMarks="0" registrationMarks="0" colorMarks="0" includePDFMarks="1" PSLevel="3" PrintEngine="3" markLength="20.0016" markOffset="0" BleedTop="0" BleedLeft="0" BleedRight="0" BleedBottom="0" printer="File" filename="" separationName="All" printerCommand=""/>
<PDF firstUse="1" Thumbnails="0" Articles="0" Bookmarks="0" Compress="1" CMethod="0" Quality="0" EmbedPDF="0" MirrorH="0" MirrorV="0" Clip="0" rangeSel="0" rangeTxt="" RotateDeg="0" PresentMode="0" RecalcPic="0" FontEmbedding="0" Grayscale="0" RGBMode="1" UseProfiles="0" UseProfiles2="0" Binding="0" PicRes="300" Resolution="300" Version="14" Intent="1" Intent2="0" SolidP="sRGB display profile (ICC v2.2)" ImageP="sRGB display profile (ICC v2.2)" PrintP="ISO Coated v2 300% (basICColor)" InfoString="" BTop="0" BLeft="0" BRight="0" BBottom="0" useDocBleeds="1" cropMarks="0" bleedMarks="0" registrationMarks="0" colorMarks="0" docInfoMarks="0" markLength="20.0016" markOffset="0" ImagePr="0" PassOwner="" PassUser="" Permissions="-4" Encrypt="0" UseLayers="0" UseLpi="0" UseSpotColors="1" doMultiFile="0" displayBookmarks="0" displayFullscreen="0" displayLayers="0" displayThumbs="0" hideMenuBar="0" hideToolBar="0" fitWindow="0" openAfterExport="0" PageLayout="0" openAction="">
<LPI Color="" Frequency="0" Angle="0" SpotFunction="0"/>
<LPI Color="Black" Frequency="133" Angle="45" SpotFunction="3"/>
<LPI Color="Cyan" Frequency="133" Angle="105" SpotFunction="3"/>
<LPI Color="Magenta" Frequency="133" Angle="75" SpotFunction="3"/>
<LPI Color="Yellow" Frequency="133" Angle="90" SpotFunction="3"/>
</PDF>
<DocItemAttributes/>
<Indexes/>
<TablesOfContents/>
<NotesStyles>
<notesStyle Name="Default" Start="1" Endnotes="0" Type="Type_1_2_3" Range="0" Prefix="" Suffix=")" AutoHeight="1" AutoWidth="1" AutoRemove="1" AutoWeld="1" SuperNote="1" SuperMaster="1" MarksStyle="" NotesStyle=""/>
</NotesStyles>
<OpticalMarginSets>
<Set Id="preset_0" Type="preset" Name="Default">
<Rules>
<Rule Left="0" Right="0.5" Unit="7" Characters="U+003A,U+003B,U+2013,U+2033"/>
<Rule Left="0" Right="0.75" Unit="7" Characters="U+002C,U+002D,U+002E,U+2010,U+2032"/>
<Rule Left="0.25" Right="0.25" Unit="7" Characters="U+2014"/>
<Rule Left="0.5" Right="0" Unit="7" Characters="U+2036"/>
<Rule Left="0.5" Right="0.5" Unit="7" Characters="U+0022,U+0028,U+0029,U+005B,U+005D,U+00AB,U+00BB,U+201C,U+201D,U+201E,U+201F"/>
<Rule Left="0.75" Right="0" Unit="7" Characters="U+2035"/>
<Rule Left="0.75" Right="0.75" Unit="7" Characters="U+0027,U+002A,U+0060,U+007E,U+00B4,U+2018,U+2019,U+201A,U+201B,U+2039,U+203A"/>
</Rules>
</Set>
</OpticalMarginSets>
<PageSets>
<Set Name="Single Page" FirstPage="0" Rows="1" Columns="1"/>
<Set Name="Facing Pages" FirstPage="1" Rows="1" Columns="2">
<PageNames Name="Left Page"/>
<PageNames Name="Right Page"/>
</Set>
<Set Name="3-Fold" FirstPage="0" Rows="1" Columns="3">
<PageNames Name="Left Page"/>
<PageNames Name="Middle"/>
<PageNames Name="Right Page"/>
</Set>
<Set Name="4-Fold" FirstPage="0" Rows="1" Columns="4">
<PageNames Name="Left Page"/>
<PageNames Name="Middle Left"/>
<PageNames Name="Middle Right"/>
<PageNames Name="Right Page"/>
</Set>
<Set Name="Single Page" FirstPage="0" Rows="1" Columns="1"/>
<Set Name="Facing Pages" FirstPage="1" Rows="1" Columns="2">
<PageNames Name="Left Page"/>
<PageNames Name="Right Page"/>
</Set>
<Set Name="3-Fold" FirstPage="0" Rows="1" Columns="3">
<PageNames Name="Left Page"/>
<PageNames Name="Middle"/>
<PageNames Name="Right Page"/>
</Set>
<Set Name="4-Fold" FirstPage="0" Rows="1" Columns="4">
<PageNames Name="Left Page"/>
<PageNames Name="Middle Left"/>
<PageNames Name="Middle Right"/>
<PageNames Name="Right Page"/>
</Set>
<Set Name="Single Page" FirstPage="0" Rows="1" Columns="1"/>
<Set Name="Facing Pages" FirstPage="1" Rows="1" Columns="2">
<PageNames Name="Left Page"/>
<PageNames Name="Right Page"/>
</Set>
<Set Name="3-Fold" FirstPage="0" Rows="1" Columns="3">
<PageNames Name="Left Page"/>
<PageNames Name="Middle"/>
<PageNames Name="Right Page"/>
</Set>
<Set Name="4-Fold" FirstPage="0" Rows="1" Columns="4">
<PageNames Name="Left Page"/>
<PageNames Name="Middle Left"/>
<PageNames Name="Middle Right"/>
<PageNames Name="Right Page"/>
</Set>
<Set Name="Single Page" FirstPage="0" Rows="1" Columns="1"/>
<Set Name="Facing Pages" FirstPage="1" Rows="1" Columns="2">
<PageNames Name="Left Page"/>
<PageNames Name="Right Page"/>
</Set>
<Set Name="3-Fold" FirstPage="0" Rows="1" Columns="3">
<PageNames Name="Left Page"/>
<PageNames Name="Middle"/>
<PageNames Name="Right Page"/>
</Set>
<Set Name="4-Fold" FirstPage="0" Rows="1" Columns="4">
<PageNames Name="Left Page"/>
<PageNames Name="Middle Left"/>
<PageNames Name="Middle Right"/>
<PageNames Name="Right Page"/>
</Set>
</PageSets>
<Sections>
<Section Number="0" Name="Section 1" From="0" To="5" Type="Type_1_2_3" Start="1" Reversed="0" Active="1" FillChar="0" FieldWidth="0"/>
</Sections>
<MasterPage PageXPosition="100.001" PageYPosition="20.002" PageWidth="595.2744" PageHeight="841.8888" BorderLeft="40" BorderRight="40" BorderTop="40" BorderBottom="40" PageNumber="0" PageName="Normal Left" MasterPageName="" Size="A4" Orientation="0" LeftPage="1" Preset="0" VerticalGuides="" HorizontalGuides="" AutoGuideHorizontalGap="0" AutoGuideVerticalGap="0" AutoGuideHorizontalCount="0" AutoGuideVerticalCount="0" AutoGuideHorizontalReference="0" AutoGuideVerticalReference="0" AutoGuideSelection="0 0 0 0" PageEffectDuration="1" PageViewDuration="1" PageEffectType="0" PageEffectLineDirection="0" PageEffectInsideOutside="0" PageEffectDirection="0"/>
<MasterPage PageXPosition="100.001" PageYPosition="20.002" PageWidth="595.2744" PageHeight="841.8888" BorderLeft="40" BorderRight="40" BorderTop="40" BorderBottom="40" PageNumber="1" PageName="Normal Right" MasterPageName="" Size="A4" Orientation="0" LeftPage="0" Preset="0" VerticalGuides="" HorizontalGuides="" AutoGuideHorizontalGap="0" AutoGuideVerticalGap="0" AutoGuideHorizontalCount="0" AutoGuideVerticalCount="0" AutoGuideHorizontalReference="0" AutoGuideVerticalReference="0" AutoGuideSelection="0 0 0 0" PageEffectDuration="1" PageViewDuration="1" PageEffectType="0" PageEffectLineDirection="0" PageEffectInsideOutside="0" PageEffectDirection="0"/>
<Page PageXPosition="695.2754" PageYPosition="20.002" PageWidth="595.2744" PageHeight="841.8888" BorderLeft="40" BorderRight="40" BorderTop="40" BorderBottom="40" PageNumber="0" PageName="" MasterPageName="Normal Right" Size="A4" Orientation="0" LeftPage="0" Preset="0" VerticalGuides="" HorizontalGuides="" AutoGuideHorizontalGap="0" AutoGuideVerticalGap="0" AutoGuideHorizontalCount="0" AutoGuideVerticalCount="0" AutoGuideHorizontalReference="0" AutoGuideVerticalReference="0" AutoGuideSelection="0 0 0 0" PageEffectDuration="1" PageViewDuration="1" PageEffectType="0" PageEffectLineDirection="0" PageEffectInsideOutside="0" PageEffectDirection="0"/>
<Page PageXPosition="100.001" PageYPosition="901.8938" PageWidth="595.2744" PageHeight="841.8888" BorderLeft="40" BorderRight="40" BorderTop="40" BorderBottom="40" PageNumber="1" PageName="" MasterPageName="Normal Left" Size="A4" Orientation="0" LeftPage="0" Preset="0" VerticalGuides="" HorizontalGuides="" AutoGuideHorizontalGap="0" AutoGuideVerticalGap="0" AutoGuideHorizontalCount="0" AutoGuideVerticalCount="0" AutoGuideHorizontalReference="0" AutoGuideVerticalReference="0" AutoGuideSelection="0 0 0 0" PageEffectDuration="1" PageViewDuration="1" PageEffectType="0" PageEffectLineDirection="0" PageEffectInsideOutside="0" PageEffectDirection="0"/>
<Page PageXPosition="695.2754" PageYPosition="901.8938" PageWidth="595.2744" PageHeight="841.8888" BorderLeft="40" BorderRight="40" BorderTop="40" BorderBottom="40" PageNumber="2" PageName="" MasterPageName="Normal Right" Size="A4" Orientation="0" LeftPage="0" Preset="0" VerticalGuides="" HorizontalGuides="" AutoGuideHorizontalGap="0" AutoGuideVerticalGap="0" AutoGuideHorizontalCount="0" AutoGuideVerticalCount="0" AutoGuideHorizontalReference="0" AutoGuideVerticalReference="0" AutoGuideSelection="0 0 0 0" PageEffectDuration="1" PageViewDuration="1" PageEffectType="0" PageEffectLineDirection="0" PageEffectInsideOutside="0" PageEffectDirection="0"/>
<Page PageXPosition="100.001" PageYPosition="1783.7856" PageWidth="595.2744" PageHeight="841.8888" BorderLeft="40" BorderRight="40" BorderTop="40" BorderBottom="40" PageNumber="3" PageName="" MasterPageName="Normal Left" Size="A4" Orientation="0" LeftPage="0" Preset="0" VerticalGuides="" HorizontalGuides="" AutoGuideHorizontalGap="0" AutoGuideVerticalGap="0" AutoGuideHorizontalCount="0" AutoGuideVerticalCount="0" AutoGuideHorizontalReference="0" AutoGuideVerticalReference="0" AutoGuideSelection="0 0 0 0" PageEffectDuration="1" PageViewDuration="1" PageEffectType="0" PageEffectLineDirection="0" PageEffectInsideOutside="0" PageEffectDirection="0"/>
<Page PageXPosition="695.2754" PageYPosition="1783.7856" PageWidth="595.2744" PageHeight="841.8888" BorderLeft="40" BorderRight="40" BorderTop="40" BorderBottom="40" PageNumber="4" PageName="" MasterPageName="Normal Right" Size="A4" Orientation="0" LeftPage="0" Preset="0" VerticalGuides="" HorizontalGuides="" AutoGuideHorizontalGap="0" AutoGuideVerticalGap="0" AutoGuideHorizontalCount="0" AutoGuideVerticalCount="0" AutoGuideHorizontalReference="0" AutoGuideVerticalReference="0" AutoGuideSelection="0 0 0 0" PageEffectDuration="1" PageViewDuration="1" PageEffectType="0" PageEffectLineDirection="0" PageEffectInsideOutside="0" PageEffectDirection="0"/>
<Page PageXPosition="100.001" PageYPosition="2665.6774" PageWidth="595.2744" PageHeight="841.8888" BorderLeft="40" BorderRight="40" BorderTop="40" BorderBottom="40" PageNumber="5" PageName="" MasterPageName="Normal Left" Size="A4" Orientation="0" LeftPage="0" Preset="0" VerticalGuides="" HorizontalGuides="" AutoGuideHorizontalGap="0" AutoGuideVerticalGap="0" AutoGuideHorizontalCount="0" AutoGuideVerticalCount="0" AutoGuideHorizontalReference="0" AutoGuideVerticalReference="0" AutoGuideSelection="0 0 0 0" PageEffectDuration="1" PageViewDuration="1" PageEffectType="0" PageEffectLineDirection="0" PageEffectInsideOutside="0" PageEffectDirection="0"/>
<PageObject XPosition="140.001" YPosition="941.8938" OwnPage="1" ItemID="316152380" ItemType="4" Width="515.2744" Height="761.8888" FrameType="0" ClipEdited="0" LineWidth="1" LinePenStyle="1" ImageScaleX="1" ImageScaleY="1" ImageOffsetX="0" ImageOffsetY="0" ImageRotation="0" ImageVisible="1" ImageScaleType="1" ImageRatio="1" Columns="3" ColumnGap="13.5" AutomaticTextFrame="0" TextToFrameDistanceLeft="0" TextToFrameDistanceTop="0" TextToFrameDistanceBottom="0" TextToFrameDistanceRight="0" VerticalAlignment="0" FirstLineOffset="1" PathTextShowPath="0" PathTextDistanceFromPath="0" TextPathType="0" TextPathFlipped="0" Path="M0 0 L515.274 0 L515.274 761.889 L0 761.889 L0 0 Z" ContourLinePath="M0 0 L515.274 0 L515.274 761.889 L0 761.889 L0 0 Z" gXpos="140.001" gYpos="941.8938" gWidth="0" gHeight="0" Alignment="3" Layer="0" NextItem="2041747577" BackItem="-1">
<StoryText>
<DefaultStyle Alignment="3"/>
<Content Chars="Arriving at Vienna early next morning; should have arrived at 6:46"/>
<para Parent="Headline"/>
<Content Chars="Byline goes here"/>
<para Parent="Byliine"/>
<Content Chars="Buda-Pesth seems a wonderful place, from the glimpse which I got of it from the train and the little I could walk through the streets. I feared to go very far from the station, as we had arrived late and would start as near correct time as possible."/>
<para Parent="Default Paragraph Style" Alignment="3"/>
<Content Chars="Having had some time at my disposal when in London, I had visited the British Museum, and made search among the books and maps in the library regarding Transylvania; it had struck me that some foreknowledge of the country could hardly fail to have some importance in dealing a nobleman of that country."/>
<para Alignment="3"/>
<Content Chars="I read that every known superstition in the world is gathered into the horseshoe of the Carpathians, as if it were the centre of some sort of imaginative whirlpool; if so my stay may be very interesting. (Mem., I must ask Count all about them.)"/>
<para Alignment="3"/>
<Content Chars="I find that the district he named is in the extreme east of the country, just on the borders of three states, Transylvania, Moldavia, and Bukovina, in the midst of the Carpathian mountains; one of the wildest and least known portions of Europe."/>
<para Alignment="3"/>
<Content Chars="We left in pretty good time, and came after nightfall to Klausenburgh. Here I stopped for the night at the Hotel Royale. I had for dinner, or rather supper, a chicken done up some way with red pepper, which was very good but thirsty. (Mem. get recipe for Mina.) I asked the waiter, and he said it was called "paprika hendl," and that, as it was a national dish, I should be able to get it anywhere along the Carpathians. "/>
<para Alignment="3"/>
<Content Chars="In the population of Transylvania there are 4 distinct nationalities:"/>
<para Parent="Sub-headlines"/>
<Content Chars="Saxons in the South, and mixed with them the Wallachs, who are the descendants of the Dacians; Magyars in West, and Szekelys in the East and North. I am going among the latter, who claim to be descended from Attila and the Huns. This may be so, for when the Magyars conquered the country in the eleventh century they found Huns settled it."/>
<para Alignment="3"/>
<Content Chars="I did not sleep well, though my bed was comfortable enough, for I had all sorts of queer dreams. There was a dog howling all night under my window, which may have had something to do with it; or it may have been the paprika, for I had to drink up all the water in my carafe, and was still thirsty. Towards morning I slept and was wakened by the continuous knocking at my door, so I guess I must sleeping soundly then."/>
<para Alignment="3"/>
<Content Chars="We left in pretty good time, and came after nightfall to Klausenburgh. Here I stopped for the night at the Hotel Royale. I had for dinner, or rather supper, a chicken done up some way with red pepper, which was very good but thirsty. (Mem. get recipe for Mina.)"/>
<para Alignment="3"/>
<Content Chars="I asked the waiter, and he said it was called that, as it was a national dish, I should be able to get it anywhere along the Carpathians."/>
<para Parent="Sub-headline Child"/>
<Content Chars="The strangest figures we saw were the Slovaks, who were more barbarian than the rest, with their big cow-boy hats, great the a in baggy dirty-white trousers, white linen shirts, and enormous heavy leather belts, nearly a foot wide, all studded over with brass nails. They wore high boots, with their trousers tucked into them, and had long black hair and heavy black moustaches. They are very picturesque, but do not look prepossessing. On the stage they would be set down at once as some old Oriental band of brigands. They are, however, I am told, very harmless and rather wanting in natural self-assertion."/>
<para Alignment="3"/>
<Content Chars="I was not able to light on any map or work giving the exact locality of the Castle Dracula, as there are no maps of this country as yet to compare with our own Ordance Survey Maps; but I found that Bistritz, the post town named by Count Dracula, is a fairly well-known place. I shall enter here some of my notes, as they may refresh my memory when I talk over my travels with Mina."/>
<para Alignment="3"/>
<Content Chars="I find that the district he named is in the extreme east of the country, just on the borders of three states, Transylvania, Moldavia, and Bukovina, in the midst of the Carpathian mountains; one of the wildest and least known portions of Europe."/>
<para Alignment="3"/>
<Content Chars="I read that every known superstition in the world is gathered into the horseshoe of the Carpathians, as if it were the centre of some sort of imaginative whirlpool; if so my stay may be very interesting. (Mem., I must ask the Count all about them.)"/>
<para Alignment="3"/>
<Content Chars="I had to hurry breakfast, for the train started a little before eight, or rather it ought to have done so, for after rushing to the station at 7:30 I had to sit in the carriage for more than an hour before we began to move."/>
<para Alignment="3"/>
<Content Chars="The strangest figures we saw were the Slovaks, who were more barbarian than the rest, with their big cow-boy hats, great baggy dirty-white trousers, white linen shirts, and enormous heavy leather belts, nearly a foot wide, all studded over with brass nails. They wore high boots, with their trousers tucked into them, and had long black hair and heavy black moustaches. They are very picturesque, but do not look prepossessing. On the stage they would be set down at once as some old Oriental band of brigands. They are, however, I am told, very harmless and rather wanting in natural self-assertion."/>
<para Alignment="3"/>
<Content Chars="I read that every known superstition in the world is gathered into the horseshoe of the Carpathians, as if it were the centre of some sort of imaginative whirlpool; if so my stay may be very interesting. (Mem., I must ask the Count all about them.)"/>
<para Alignment="3"/>
<Content Chars="3 May. Bistritz.--Left Munich at 8:35 P.M., on 1st May, arriving at Vienna early next morning; should have arrived at 6:46, but train was an hour late. Buda-Pesth seems a wonderful place, from the glimpse which I got of it from the train and the little I could walk through the streets. I feared to go very far from the station, as we had arrived late and would start as near the correct time as possible."/>
<trail Alignment="3"/>
</StoryText>
</PageObject>
<PageObject XPosition="735.2754" YPosition="941.8938" OwnPage="2" ItemID="2041747577" ItemType="4" Width="515.2744" Height="761.8888" FrameType="0" ClipEdited="0" LineWidth="1" LinePenStyle="1" ImageScaleX="1" ImageScaleY="1" ImageOffsetX="0" ImageOffsetY="0" ImageRotation="0" ImageVisible="1" ImageScaleType="1" ImageRatio="1" Columns="1" ColumnGap="0" AutomaticTextFrame="0" TextToFrameDistanceLeft="0" TextToFrameDistanceTop="0" TextToFrameDistanceBottom="0" TextToFrameDistanceRight="0" VerticalAlignment="0" FirstLineOffset="1" PathTextShowPath="0" PathTextDistanceFromPath="0" TextPathType="0" TextPathFlipped="0" Path="M0 0 L515.274 0 L515.274 761.889 L0 761.889 L0 0 Z" ContourLinePath="M0 0 L515.274 0 L515.274 761.889 L0 761.889 L0 0 Z" gXpos="735.2754" gYpos="941.8938" gWidth="0" gHeight="0" Alignment="3" Layer="0" NextItem="-1" BackItem="316152380"/>
</Document>
</SCRIBUSUTF8NEW>
|
|
|
This can be a base for future `Span N columns` and `Split Columns` features in paragraph styles. |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2020-02-15 04:40 | sreerajp | New Issue | |
| 2020-02-15 08:37 | JLuc | Note Added: 0047386 | |
| 2020-02-15 09:42 | sreerajp | File Added: scribus.png | |
| 2020-02-15 09:42 | sreerajp | File Added: Indesign.png | |
| 2020-02-15 09:42 | sreerajp | Note Added: 0047387 | |
| 2020-02-15 09:57 | JLuc | Note Added: 0047388 | |
| 2020-02-15 10:11 | sreerajp | File Added: IndesignSpan.png | |
| 2020-02-15 10:11 | sreerajp | Note Added: 0047390 | |
| 2020-02-15 10:58 | jghali | Priority | high => normal |
| 2024-09-06 15:13 | BN_Dev | Note Added: 0051305 | |
| 2024-09-06 15:13 | BN_Dev | File Added: qxpcolflow.png | |
| 2024-09-06 15:32 | BN_Dev | Note Added: 0051306 | |
| 2024-09-06 15:32 | BN_Dev | File Added: qxpflowoptions.png | |
| 2024-09-06 15:52 | JLuc | Note Added: 0051307 | |
| 2024-09-07 11:13 | PeterBenedek | Note Added: 0051308 | |
| 2024-09-07 11:19 | PeterBenedek | Note Edited: 0051308 | |
| 2024-09-07 12:31 | nitramr | Note Added: 0051309 | |
| 2024-09-07 12:31 | nitramr | File Added: screenshot_20240907-140520.png | |
| 2024-09-07 12:37 | nitramr | Note Edited: 0051309 | |
| 2024-09-07 14:52 | BN_Dev | Note Added: 0051310 | |
| 2024-09-09 14:40 | ale | Note Added: 0051316 | |
| 2024-09-09 16:21 | nitramr | Note Added: 0051319 | |
| 2024-09-09 16:25 | JLuc | Note Added: 0051320 | |
| 2024-09-09 16:26 | JLuc | Note Edited: 0051320 | |
| 2024-09-09 16:26 | JLuc | Note Edited: 0051320 | |
| 2024-09-09 16:27 | JLuc | Note Edited: 0051320 | |
| 2024-09-09 16:28 | JLuc | Note Edited: 0051320 | |
| 2024-09-09 16:32 | utnik | Note Added: 0051321 | |
| 2024-09-11 18:10 | nitramr | Note Added: 0051325 | |
| 2024-09-11 18:10 | nitramr | File Added: ColSpan.pdf | |
| 2024-09-11 18:10 | nitramr | File Added: ColSpan.sla | |
| 2024-09-13 00:41 | BN_Dev | Note Added: 0051331 | |
| 2024-09-13 12:51 | BN_Dev | Note Added: 0051332 | |
| 2024-09-13 12:51 | BN_Dev | File Added: Colflow.qxp | |
| 2024-09-13 12:51 | BN_Dev | File Added: Colflow_Layout1.pdf | |
| 2024-09-13 12:54 | BN_Dev | Note Added: 0051333 | |
| 2024-09-13 13:29 | nitramr | Note Added: 0051334 | |
| 2024-09-13 13:29 | nitramr | Note Edited: 0051334 | |
| 2024-09-13 13:54 | nitramr | Note Added: 0051336 | |
| 2024-09-13 13:54 | nitramr | File Added: Bildschirmfoto 2024-09-13 um 15.49.52.png | |
| 2024-09-13 13:54 | nitramr | File Added: Bildschirmfoto 2024-09-13 um 15.53.54.png | |
| 2024-09-13 14:08 | nitramr | Note Edited: 0051334 | |
| 2024-09-13 14:29 | BN_Dev | Note Added: 0051337 | |
| 2024-09-13 14:29 | BN_Dev | File Added: Colflow_Layout2.pdf | |
| 2024-09-19 08:25 | JLuc | Note Added: 0051374 | |
| 2024-09-19 10:08 | BN_Dev | Note Added: 0051375 | |
| 2025-04-27 19:16 | cbradney | Category | Story Editor / Text Frames => Text Frames / Story Editor |
| 2026-09-23 05:15 | buttar | Note Added: 0054484 | |
| 2026-09-23 05:15 | buttar | File Added: cs1-text-flow-region-infrastructure-v1.02.patch | |
| 2026-09-23 05:15 | buttar | File Added: cs2-column-span-property-persistence-v1.01.patch | |
| 2026-09-23 05:15 | buttar | File Added: cs3-column-span-all-layout-v1.02.patch | |
| 2026-09-23 05:15 | buttar | File Added: cs4-column-span-ui-v1.02.patch | |
| 2026-09-23 05:15 | buttar | File Added: cs5-column-span-recomposition-performance-v1.09.patch | |
| 2026-09-23 05:17 | buttar | Note Added: 0054485 | |
| 2026-09-23 05:17 | buttar | File Added: sm-para-flow-group-PROPOSED.png | |
| 2026-09-23 05:17 | buttar | File Added: span-column-editing-PROPOSED.png | |
| 2026-09-23 05:17 | buttar | File Added: span-column-preview-PROPOSED.png | |
| 2026-09-23 09:55 | buttar | Note Added: 0054486 | |
| 2026-09-23 09:55 | buttar | File Added: column-span-test.sla | |
| 2026-09-23 09:55 | buttar | File Added: text-properties-palette-PROPOSED.png | |
| 2026-09-23 09:55 | buttar | Tag Attached: #please_test | |
| 2026-09-23 09:57 | buttar | Note Added: 0054487 | |
| 2026-09-23 10:47 | JLuc | Relationship added | related to 0002039 |