blob: a8400f4068a9859a1506257aea583e956a906f27 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Sybase, Inc. and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.css2.layout;
import java.util.List;
import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
import org.eclipse.jst.pagedesigner.css2.marker.CounterUtil;
import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
/**
* @author mengbo
*/
public class CSSListItemLayout extends CSSBlockFlowLayout implements
ICSSPainter {
private static final String DEFAULT_LIST_COUNTER = "_anonymous";
private static final int CIRCLE_DIAMETER = 6;
private static final int DISC_DIAMETER = 5;
private static final int ROUNDRECT_ARC = 2;
private static final int TEXT_PADDING = 16;
private int _count;
/**
* @param cssfigure
*/
public CSSListItemLayout(CSSFigure cssfigure) {
super(cssfigure);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter#paintFigure(org.eclipse.draw2d.Graphics)
*/
public void paintFigure(Graphics g) {
ICSSStyle style = this.getCSSStyle();
if (style == null) {
style = DefaultStyle.getInstance();
}
Rectangle drawArea = null;
Font font = getCSSStyle().getCSSFont().getSwtFont();
// draw the marker box
Object styleType = style
.getStyleProperty(ICSSPropertyID.ATTR_LIST_STYLE_TYPE);
g.pushState();
Color newColor = null;
Object color = style.getColor();
if (color instanceof Color) {
g.setForegroundColor((Color) color);
g.setBackgroundColor((Color) color);
} else if (color instanceof RGB) {
newColor = new Color(Display.getCurrent(), (RGB) color);
g.setForegroundColor(newColor);
g.setBackgroundColor(newColor);
}
if (styleType instanceof String) {
int type = CounterHelper.toTypeInt((String) styleType);
switch (type) {
case CounterHelper.LIST_T_UPPER_ALPHA:
case CounterHelper.LIST_T_LOWER_ALPHA:
case CounterHelper.LIST_T_LOWER_ROMAN:
case CounterHelper.LIST_T_UPPER_ROMAN:
case CounterHelper.LIST_T_DECIMAL:
g.setFont(font);
String displayString = CounterUtil.convertCount(_count, type);
Point point = getDrawPointForText(displayString);
g.drawString(displayString, point);
break;
case CounterHelper.LIST_T_CIRCLE:
drawArea = getDrawAreaForGraph(CIRCLE_DIAMETER, CIRCLE_DIAMETER);
g.drawArc(drawArea, 0, 360);
break;
case CounterHelper.LIST_T_SQUARE:
drawArea = getDrawAreaForGraph(DISC_DIAMETER, DISC_DIAMETER);
g.fillRectangle(drawArea);
case CounterHelper.LIST_T_DECIMAL_LEADING_ZERO:
case CounterHelper.LIST_T_LOWER_GREEK:
case CounterHelper.LIST_T_ARMENIAN:
case CounterHelper.LIST_T_GEORGIAN:
case CounterHelper.LIST_T_IMAGE:
case CounterHelper.LIST_T_NONE:
default:
drawArea = getDrawAreaForGraph(DISC_DIAMETER, DISC_DIAMETER);
g.fillRoundRectangle(drawArea, ROUNDRECT_ARC, ROUNDRECT_ARC);
break;
}
}
g.popState();
if (newColor != null) {
newColor.dispose();
}
}
/**
* @param g
* @return
*/
private Rectangle getDrawAreaForGraph(int width, int height) {
Rectangle drawArea;
int x = 0;
int y = 0;
List list = _blockBox.getFragments();
Rectangle box = _blockBox.toRectangle().getCopy().expand(
_blockBox.getBorderPaddingInsets().getAdded(
_blockBox.getMarginInsets()));
if (list != null && !list.isEmpty()) {
LineBox line = (LineBox) list.get(0);
y = line.getBaseline() - CIRCLE_DIAMETER;
x = box.x;
} else {
x = box.x;
y = box.height / 2 - CIRCLE_DIAMETER;
}
drawArea = new Rectangle(x - CIRCLE_DIAMETER * 5 / 2, y, width, height);
return drawArea;
}
private Point getDrawPointForText(String displayString) {
Font font = getCSSStyle().getCSSFont().getSwtFont();
int x = 0;
int y = 0;
Rectangle box = _blockBox.toRectangle().getCopy().expand(
_blockBox.getBorderPaddingInsets().getAdded(
_blockBox.getMarginInsets()));
x = box.x - FigureUtilities.getTextWidth(displayString, font);
x = x
- (TEXT_PADDING - FigureUtilities.getFontMetrics(font)
.getDescent());
return new Point(x, y);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#layoutChildren()
*/
protected void layoutChildren() {
ICounterValueGenerator counter = this.getCSSStyle().findCounter(
DEFAULT_LIST_COUNTER, true);
if (counter != null) {
_count = counter.getCurrentCount();
} else {
// should not happen.
_count = 1; // use 1 as the default value
}
super.layoutChildren();
}
}