blob: 98bfaf93d8de22d373892f1b454c37985b8af7f6 [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.widget;
import java.util.StringTokenizer;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
import org.eclipse.jst.pagedesigner.css2.layout.TextLayoutSupport;
import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
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;
/**
* For ButtonWidget, it displays some text value in it. And lays the text with
* nowrap.
*
* @author mengbo
* @version 1.5
*/
public class ButtonWidgetProvider extends AbstractWidgetProvider {
// The button width should include the label length and padding,
// to let the button looks fine, we set the padding 0.46 width as the label
// length.
private final static double HORIZONTAL_RATE = 1.46;
// The button height should include the label height and padding,
// to let the button looks fine, we set the padding 0.36 height as the
// character height.
private final static double VERTICAL_PADDING_RATE = 0.36;
private static final String[] DEFAULTLINES = new String[] { " " };
private String _value = "";
private String[] _lines = DEFAULTLINES;
/**
* @param style
*/
public ButtonWidgetProvider(ICSSStyle style) {
super(style);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
* int)
*/
public DimensionInfo getPreferredDimension(int width, int height) {
if (width <= 0) {
width = getDefaultWidth();
}
if (height <= 0) {
height = getDefaultHeight();
}
return new DimensionInfo(new Dimension(width, height), -1);
}
/**
* by default, the combo's width will be calculated from the longest option
* value.
*
* @return the default width value
*/
public int getDefaultWidth() {
int longestStringWidth = 0;
if (_lines != null) {
ICSSStyle style = this.getCSSStyle();
if (style == null) {
style = DefaultStyle.getInstance();
}
ICSSFont font = style.getCSSFont();
Font swtFont = font.getSwtFont();
for (int i = 0; i < _lines.length; i++) {
int width = FigureUtilities.getTextWidth(_lines[i], swtFont);
if (width > longestStringWidth) {
longestStringWidth = width;
}
}
}
// text area width + padding
return (int) ((longestStringWidth) * HORIZONTAL_RATE);
}
/**
*
* @return the default height value
* @see TextInputWidgetProvider#getDefaultHeight()
*/
public int getDefaultHeight() {
ICSSStyle style = this.getCSSStyle();
if (style == null) {
style = DefaultStyle.getInstance();
}
ICSSFont font = style.getCSSFont();
Font swtfont = font.getSwtFont();
int fontHeight = FigureUtilities.getFontMetrics(swtfont).getHeight();
return (int) ((fontHeight) * (_lines.length + VERTICAL_PADDING_RATE));
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
* org.eclipse.draw2d.geometry.Rectangle)
*/
public void paintFigure(Graphics g, Rectangle rect) {
ICSSStyle style = this.getCSSStyle();
if (style == null) {
style = DefaultStyle.getInstance();
}
Object textAlign = style
.getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN);
if (ICSSPropertyMeta.NOT_SPECIFIED == textAlign) {
textAlign = "center";
}
Font font = style.getCSSFont().getSwtFont();
g.setFont(font);
int fontHeight = FigureUtilities.getFontMetrics(font).getHeight();
Color newColor = null;
Object color = style.getColor();
if (color instanceof Color) {
g.setForegroundColor((Color) color);
} else if (color instanceof RGB) {
newColor = new Color(Display.getCurrent(), (RGB) color);
g.setForegroundColor(newColor);
} else {
g.setForegroundColor(ColorConstants.black);
}
g.clipRect(rect);
int y = rect.y + (int) (fontHeight * VERTICAL_PADDING_RATE / 2);
if (rect.height > fontHeight * _lines.length) {
y = rect.y + (rect.height - fontHeight * _lines.length) / 2;
}
for (int i = 0; i < _lines.length && y < rect.y + rect.height; i++) {
int width = FigureUtilities.getTextWidth(_lines[i], font);
int x = TextLayoutSupport.getBeginX(textAlign, rect, width);
g.drawString(_lines[i], x, y);
TextLayoutSupport.paintTextDecoration(g, new Rectangle(x, y, width,
fontHeight), ((Integer) getCSSStyle().getStyleProperty(
ICSSPropertyID.ATTR_TEXTDECORATION)).intValue());
y += fontHeight;
}
if (newColor != null) {
newColor.dispose();
}
}
/**
* @param value
*/
public void setValue(String value) {
if (value == null) {
value = "";
}
_value = value;
_lines = splitValue(_value);
}
/**
* Split the value to multiple lines.
*
* @param _value2
* @return
*/
private String[] splitValue(String _value2) {
if (_value2 == null || "".equals(_value2)) {
return DEFAULTLINES;
}
StringTokenizer tokenizer = new StringTokenizer(_value2, "\r\n");
String[] result = new String[tokenizer.countTokens()];
for (int i = 0; i < result.length; i++) {
result[i] = tokenizer.nextToken().replaceAll("\t", " ");
}
return result;
}
}