introduce explicit representation of a list in the box model
The List box represents the root of the list. It will take care of the
calculations and layout related to the bullets for the list items.
Signed-off-by: Florian Thienel <florian@thienel.org>
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/BaseBoxVisitor.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/BaseBoxVisitor.java
index 9359baf..8c26409 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/BaseBoxVisitor.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/BaseBoxVisitor.java
@@ -41,6 +41,11 @@
}
@Override
+ public void visit(final List box) {
+ // ignore
+ }
+
+ @Override
public void visit(final ListItem box) {
// ignore
}
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/BaseBoxVisitorWithResult.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/BaseBoxVisitorWithResult.java
index fce0659..7138f3d 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/BaseBoxVisitorWithResult.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/BaseBoxVisitorWithResult.java
@@ -51,6 +51,11 @@
}
@Override
+ public T visit(final List box) {
+ return defaultValue;
+ }
+
+ @Override
public T visit(final ListItem box) {
return defaultValue;
}
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/BoxFactory.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/BoxFactory.java
index 5f7b1fe..5a656dd 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/BoxFactory.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/BoxFactory.java
@@ -16,6 +16,7 @@
import org.eclipse.vex.core.internal.core.Color;
import org.eclipse.vex.core.internal.core.FontSpec;
import org.eclipse.vex.core.internal.core.TextAlign;
+import org.eclipse.vex.core.internal.css.BulletStyle;
import org.eclipse.vex.core.provisional.dom.ContentRange;
import org.eclipse.vex.core.provisional.dom.IContent;
import org.eclipse.vex.core.provisional.dom.INode;
@@ -127,6 +128,13 @@
return horizontalBar;
}
+ public static List list(final IStructuralBox component, final BulletStyle bulletStyle) {
+ final List list = new List();
+ list.setBulletStyle(bulletStyle);
+ list.setComponent(component);
+ return list;
+ }
+
public static ListItem listItem(final int bulletWidth, final IStructuralBox bullet, final IStructuralBox component) {
final ListItem listItem = new ListItem();
listItem.setBulletWidth(bulletWidth);
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/DepthFirstBoxTraversal.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/DepthFirstBoxTraversal.java
index b92795c..6fcea6b 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/DepthFirstBoxTraversal.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/DepthFirstBoxTraversal.java
@@ -40,6 +40,11 @@
}
@Override
+ public T visit(final List box) {
+ return box.getComponent().accept(this);
+ }
+
+ @Override
public T visit(final ListItem box) {
return box.getComponent().accept(this);
}
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/IBoxVisitor.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/IBoxVisitor.java
index a7353b1..e1dad21 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/IBoxVisitor.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/IBoxVisitor.java
@@ -25,6 +25,8 @@
void visit(HorizontalBar box);
+ void visit(List box);
+
void visit(ListItem box);
void visit(Paragraph box);
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/IBoxVisitorWithResult.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/IBoxVisitorWithResult.java
index c18b35f..676926e 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/IBoxVisitorWithResult.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/IBoxVisitorWithResult.java
@@ -25,6 +25,8 @@
T visit(HorizontalBar box);
+ T visit(List box);
+
T visit(ListItem box);
T visit(Paragraph box);
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/List.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/List.java
new file mode 100644
index 0000000..0208d4f
--- /dev/null
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/List.java
@@ -0,0 +1,143 @@
+package org.eclipse.vex.core.internal.boxes;
+
+import org.eclipse.vex.core.internal.core.Graphics;
+import org.eclipse.vex.core.internal.core.Rectangle;
+import org.eclipse.vex.core.internal.css.BulletStyle;
+
+public class List extends BaseBox implements IStructuralBox, IDecoratorBox<IStructuralBox> {
+
+ private IBox parent;
+ private int top;
+ private int left;
+ private int width;
+ private int height;
+
+ private BulletStyle bulletStyle;
+
+ private IStructuralBox component;
+
+ @Override
+ public void setParent(final IBox parent) {
+ this.parent = parent;
+ }
+
+ @Override
+ public IBox getParent() {
+ return parent;
+ }
+
+ @Override
+ public int getAbsoluteTop() {
+ if (parent == null) {
+ return top;
+ }
+ return parent.getAbsoluteTop() + top;
+ }
+
+ @Override
+ public int getAbsoluteLeft() {
+ if (parent == null) {
+ return left;
+ }
+ return parent.getAbsoluteLeft() + left;
+ }
+
+ public int getTop() {
+ return top;
+ }
+
+ public int getLeft() {
+ return left;
+ }
+
+ public void setPosition(final int top, final int left) {
+ this.top = top;
+ this.left = left;
+ }
+
+ @Override
+ public int getWidth() {
+ return width;
+ }
+
+ public void setWidth(final int width) {
+ this.width = Math.max(0, width);
+ }
+
+ @Override
+ public int getHeight() {
+ return height;
+ }
+
+ @Override
+ public Rectangle getBounds() {
+ return new Rectangle(left, top, width, height);
+ }
+
+ @Override
+ public void accept(final IBoxVisitor visitor) {
+ visitor.visit(this);
+ }
+
+ @Override
+ public <T> T accept(final IBoxVisitorWithResult<T> visitor) {
+ return visitor.visit(this);
+ }
+
+ public void setBulletStyle(final BulletStyle bulletStyle) {
+ this.bulletStyle = bulletStyle;
+ }
+
+ public BulletStyle getBulletStyle() {
+ return bulletStyle;
+ }
+
+ @Override
+ public void setComponent(final IStructuralBox component) {
+ this.component = component;
+ component.setParent(this);
+ }
+
+ @Override
+ public IStructuralBox getComponent() {
+ return component;
+ }
+
+ @Override
+ public void layout(final Graphics graphics) {
+ if (component == null) {
+ return;
+ }
+ component.setPosition(0, 0);
+ component.setWidth(width);
+ component.layout(graphics);
+ height = component.getHeight();
+ }
+
+ @Override
+ public boolean reconcileLayout(final Graphics graphics) {
+ final int oldHeight = height;
+ height = component.getHeight();
+ return oldHeight != height;
+ }
+
+ @Override
+ public void paint(final Graphics graphics) {
+ ChildBoxPainter.paint(component, graphics);
+ }
+
+ @Override
+ public void setVisualDecorator(final IVisualDecorator<IStructuralBox> visualDecorator) {
+ // ignore, will be removed anyway
+ }
+
+ @Override
+ public void resetVisualDecorator() {
+ // ignore, will be removed anyway
+ }
+
+ @Override
+ public void applyVisualDecorator() {
+ // ignore, will be removed anyway
+ }
+}
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/ParentTraversal.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/ParentTraversal.java
index 61d103a..92ed040 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/ParentTraversal.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/boxes/ParentTraversal.java
@@ -51,6 +51,11 @@
}
@Override
+ public T visit(final List box) {
+ return box.getParent().accept(this);
+ }
+
+ @Override
public T visit(final ListItem box) {
return box.getParent().accept(this);
}
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java
index 5997350..c129f27 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java
@@ -23,6 +23,7 @@
import static org.eclipse.vex.core.internal.visualization.CssBoxFactory.endTag;
import static org.eclipse.vex.core.internal.visualization.CssBoxFactory.frame;
import static org.eclipse.vex.core.internal.visualization.CssBoxFactory.image;
+import static org.eclipse.vex.core.internal.visualization.CssBoxFactory.list;
import static org.eclipse.vex.core.internal.visualization.CssBoxFactory.nodeTag;
import static org.eclipse.vex.core.internal.visualization.CssBoxFactory.paragraph;
import static org.eclipse.vex.core.internal.visualization.CssBoxFactory.square;
@@ -222,7 +223,7 @@
*/
private IStructuralBox visualizeAsList(final IElement element, final Styles styles, final Collection<VisualizeResult> childrenResults) {
- return visualizeAsBlock(element, styles, childrenResults);
+ return list(visualizeAsBlock(element, styles, childrenResults), styles);
}
/*
@@ -230,17 +231,12 @@
*/
private IStructuralBox visualizeAsListItem(final IElement element, final Styles styles, final Collection<VisualizeResult> childrenResults) {
- final BulletStyle bulletStyle = new BulletStyle(BulletStyle.Type.SQUARE, BulletStyle.Position.INSIDE, null, '\0');
+ final BulletStyle bulletStyle = BulletStyle.fromStyles(styles);
final int bulletWidth = 20;
final int itemIndex = 0;
final int itemCount = 1;
- final IInlineBox bullet;
- if (bulletStyle.type.isTextual()) {
- bullet = staticText(bulletStyle.getBulletAsText(itemIndex, itemCount), styles);
- } else {
- bullet = square(styles);
- }
+ final IInlineBox bullet = visualizeBullet(styles, bulletStyle, itemIndex, itemCount);
final IStructuralBox content = visualizeStructuralElementContent(element, styles, childrenResults);
switch (bulletStyle.position) {
@@ -256,6 +252,16 @@
}
}
+ private static IInlineBox visualizeBullet(final Styles styles, final BulletStyle bulletStyle, final int itemIndex, final int itemCount) {
+ final IInlineBox bullet;
+ if (bulletStyle.type.isTextual()) {
+ bullet = staticText(bulletStyle.getBulletAsText(itemIndex, itemCount), styles);
+ } else {
+ bullet = square(styles);
+ }
+ return bullet;
+ }
+
private static IVisualDecorator<IStructuralBox> insertBulletIntoContent(final IInlineBox bullet) {
return new IVisualDecorator<IStructuralBox>() {
@Override
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBoxFactory.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBoxFactory.java
index 834a6a7..74785b7 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBoxFactory.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBoxFactory.java
@@ -19,6 +19,7 @@
import org.eclipse.vex.core.internal.boxes.Image;
import org.eclipse.vex.core.internal.boxes.InlineFrame;
import org.eclipse.vex.core.internal.boxes.LineWrappingRule;
+import org.eclipse.vex.core.internal.boxes.List;
import org.eclipse.vex.core.internal.boxes.Margin;
import org.eclipse.vex.core.internal.boxes.NodeEndOffsetPlaceholder;
import org.eclipse.vex.core.internal.boxes.NodeTag;
@@ -31,6 +32,7 @@
import org.eclipse.vex.core.internal.core.FontSpec;
import org.eclipse.vex.core.internal.core.LineStyle;
import org.eclipse.vex.core.internal.core.TextAlign;
+import org.eclipse.vex.core.internal.css.BulletStyle;
import org.eclipse.vex.core.internal.css.CSS;
import org.eclipse.vex.core.internal.css.Styles;
import org.eclipse.vex.core.provisional.dom.ContentRange;
@@ -59,6 +61,13 @@
return frame;
}
+ public static List list(final IStructuralBox component, final Styles styles) {
+ final List list = new List();
+ list.setBulletStyle(BulletStyle.fromStyles(styles));
+ list.setComponent(component);
+ return list;
+ }
+
public static Paragraph paragraph(final Styles styles, final IInlineBox... children) {
final Paragraph paragraph = new Paragraph();
for (final IInlineBox child : children) {
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/DOMVisualization.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/DOMVisualization.java
index a87e173..abd304e 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/DOMVisualization.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/widget/DOMVisualization.java
@@ -21,6 +21,7 @@
import org.eclipse.vex.core.internal.boxes.InlineContainer;
import org.eclipse.vex.core.internal.boxes.InlineFrame;
import org.eclipse.vex.core.internal.boxes.InlineNodeReference;
+import org.eclipse.vex.core.internal.boxes.List;
import org.eclipse.vex.core.internal.boxes.ListItem;
import org.eclipse.vex.core.internal.boxes.NodeEndOffsetPlaceholder;
import org.eclipse.vex.core.internal.boxes.Paragraph;
@@ -135,6 +136,12 @@
}
@Override
+ public void visit(final List box) {
+ box.setComponent(boxModelBuilder.visualizeStructure(node));
+ box.applyVisualDecorator();
+ }
+
+ @Override
public void visit(final Paragraph box) {
box.replaceChildren(modifiedBoxes, boxModelBuilder.visualizeInline(node));
box.applyVisualDecorator();