/******************************************************************************* * 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 org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.FigureUtilities; import org.eclipse.draw2d.Graphics; 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.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; /** * @author mengbo * @version 1.5 */ public class TextAreaWidgetProvider extends AbstractWidgetProvider { private static final int DEFAULTCOLUMN = 20; private static final int DEFAULTROWS = 2; private static final int VERTICAL_PADDING = 2; private static final int HORIZONTAL_PADDING = 2; private static int ARRAWWIDTH = 16; private static int ARROWHEIGHT = 16; private int _columns = DEFAULTCOLUMN; private int _rows = DEFAULTROWS; private String _value; /** * @param style */ public TextAreaWidgetProvider(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(width, height, -1); } /** * @return */ private 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 (fontHeight) * _rows + VERTICAL_PADDING; } /** * @return */ private int getDefaultWidth() { ICSSStyle style = this.getCSSStyle(); if (style == null) { style = DefaultStyle.getInstance(); } ICSSFont font = style.getCSSFont(); int fontWidth = FigureUtilities.getFontMetrics(font.getSwtFont()) .getAverageCharWidth(); return _columns * fontWidth + ARRAWWIDTH + HORIZONTAL_PADDING; } /* * (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) { if (_value != null) { g.clipRect(rect); ICSSStyle style = this.getCSSStyle(); if (style == null) { style = DefaultStyle.getInstance(); } int decoration = ((Integer) style .getStyleProperty(ICSSPropertyID.ATTR_TEXTDECORATION)) .intValue(); ICSSFont font = style.getCSSFont(); g.setFont(font.getSwtFont()); 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); } Object textAlign = style .getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN); int begin = 0; int end = 0; int fontHeight = FigureUtilities.getFontMetrics(font.getSwtFont()) .getHeight(); int fontWidth = FigureUtilities.getFontMetrics(font.getSwtFont()) .getAverageCharWidth(); int columns = (rect.width - HORIZONTAL_PADDING) / fontWidth; int i = 0; while (true) { int y = rect.y + VERTICAL_PADDING / 2 + fontHeight * i; if (y >= rect.bottom()) { break; } end += columns; if (end > _value.length()) { end = _value.length(); } end = getTextCount(begin, end, g.getFont(), rect.width - ARRAWWIDTH); String text = _value.substring(begin, end); int width = FigureUtilities.getTextWidth(text, g.getFont()); int x = TextLayoutSupport.getBeginX(textAlign, rect, width); g.drawString(text, x, y); TextLayoutSupport.paintTextDecoration(g, new Rectangle(x, y, width, fontHeight), decoration); begin = end; if (end == _value.length()) { break; } i++; } if (newColor != null) { newColor.dispose(); } } int borderThick = 2; BorderUtil .drawVertialBar(g, ARRAWWIDTH, ARROWHEIGHT, borderThick, rect); } private int getTextCount(int begin, int end, Font swtFont, int textWidth) { while (begin > -1 && end > begin && FigureUtilities.getTextWidth( _value.substring(begin, end), swtFont) > textWidth) { end--; } return end; } /** * @param columns */ public void setColumns(int columns) { this._columns = (columns > 0 ? columns : DEFAULTCOLUMN); } /** * @param rows */ public void setRows(int rows) { this._rows = (rows > 0 ? rows : DEFAULTROWS); } /** * @param value */ public void setValue(String value) { this._value = value; } }