1 51 package org.apache.fop.fo.flow; 52 53 import org.apache.fop.fo.*; 55 import org.apache.fop.layout.*; 56 import org.apache.fop.apps.FOPException; 57 58 import java.util.ArrayList ; 60 61 public class Footnote extends FObj { 62 63 public static class Maker extends FObj.Maker { 64 public FObj make(FObj parent, PropertyList propertyList, 65 String systemId, int line, int column) 66 throws FOPException { 67 return new Footnote(parent, propertyList, systemId, line, column); 68 } 69 70 } 71 72 public static FObj.Maker maker() { 73 return new Footnote.Maker(); 74 } 75 76 public Footnote(FObj parent, PropertyList propertyList, 77 String systemId, int line, int column) throws FOPException { 78 super(parent, propertyList, systemId, line, column); 79 } 80 81 public String getName() { 82 return "fo:footnote"; 83 } 84 85 public int layout(Area area) throws FOPException { 86 FONode inline = null; 87 FONode fbody = null; 88 if (this.marker == START) { 89 this.marker = 0; 90 } 91 int numChildren = this.children.size(); 92 for (int i = this.marker; i < numChildren; i++) { 93 FONode fo = (FONode)children.get(i); 94 if (fo instanceof Inline) { 95 inline = fo; 96 int status = fo.layout(area); 97 if (Status.isIncomplete(status)) { 98 return status; 99 } 100 } else if (inline != null && fo instanceof FootnoteBody) { 101 fbody = fo; 103 if (area instanceof BlockArea) { 104 ((BlockArea)area).addFootnote((FootnoteBody)fbody); 105 } else { 106 Page page = area.getPage(); 107 layoutFootnote(page, (FootnoteBody)fbody, area); 108 } 109 } 110 } 111 if (fbody == null) { 112 log.error("no footnote-body in footnote"); 113 } 114 if (area instanceof BlockArea) {} 115 return Status.OK; 116 } 117 118 public static boolean layoutFootnote(Page p, FootnoteBody fb, Area area) { 119 try { 120 BodyAreaContainer bac = p.getBody(); 121 AreaContainer footArea = bac.getFootnoteReferenceArea(); 122 footArea.setIDReferences(bac.getIDReferences()); 123 int basePos = footArea.getCurrentYPosition() 124 - footArea.getHeight(); 125 int oldHeight = footArea.getHeight(); 126 if (area != null) { 127 footArea.setMaxHeight(area.getMaxHeight() - area.getHeight() 128 + footArea.getHeight()); 129 } else { 130 footArea.setMaxHeight(bac.getMaxHeight() 131 + footArea.getHeight()); 132 } 133 if (!footArea.hasChildren()) { 134 StaticContent separator = bac.getPage().getPageSequence() 135 .getStaticContent("xsl-footnote-separator"); 136 if (separator!=null) { 137 footArea.setIDReferences(bac.getIDReferences()); 138 separator.layout(footArea, null); 139 int diff = footArea.getHeight() - oldHeight; 140 if (area != null) { 141 area.setMaxHeight(area.getMaxHeight() - diff); 142 } 143 if (bac.getFootnoteState() == 0) { 144 Area ar = bac.getMainReferenceArea(); 145 decreaseMaxHeight(ar, diff); 146 footArea.setYPosition(basePos + footArea.getHeight()); 147 } 148 basePos = footArea.getCurrentYPosition() 149 - footArea.getHeight(); 150 oldHeight = footArea.getHeight(); 151 } 152 } 153 int status = fb.layout(footArea); 154 if (Status.isIncomplete(status)) { 155 return false; 157 } else { 158 if (area != null) { 159 area.setMaxHeight(area.getMaxHeight() 160 - footArea.getHeight() + oldHeight); 161 } 162 if (bac.getFootnoteState() == 0) { 164 Area ar = bac.getMainReferenceArea(); 165 decreaseMaxHeight(ar, footArea.getHeight() - oldHeight); 166 footArea.setYPosition(basePos + footArea.getHeight()); 167 } 168 } 169 } catch (FOPException fope) { 170 return false; 171 } 172 return true; 173 } 174 175 protected static void decreaseMaxHeight(Area ar, int change) { 176 ar.setMaxHeight(ar.getMaxHeight() - change); 177 ArrayList children = ar.getChildren(); 178 for (int i = 0; i < children.size(); i++) { 179 Object obj = children.get(i); 180 if (obj instanceof Area) { 181 Area childArea = (Area)obj; 182 decreaseMaxHeight(childArea, change); 183 } 184 } 185 } 186 187 } 188 | Popular Tags |