blob: 645ac6ff986ace65e6994df1f8d500fa34c0c782 [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 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.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 ComboWidgetProvider extends AbstractWidgetProvider {
private static final int VERTICAL_PADDING = 6;
private static final int HORIZONTAL_PADDING = 12;
private static int ARRAWWIDTH = 16;
//private static int ARROWHEIGHT = 16;
private String _firstString;
private String _longestString;
private String _label;
/**
* @param style
*/
public ComboWidgetProvider(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
*/
private int getDefaultWidth() {
int textareaWidth;
if (this._longestString == null || this._longestString.length() == 0) {
textareaWidth = 20;
} else {
ICSSStyle style = this.getCSSStyle();
if (style == null) {
style = DefaultStyle.getInstance();
}
ICSSFont font = style.getCSSFont();
textareaWidth = FigureUtilities.getTextWidth(_longestString, font
.getSwtFont());
}
return textareaWidth + ARRAWWIDTH + HORIZONTAL_PADDING;
}
/**
*
* @return the default height
* @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 fontSize = FigureUtilities.getFontMetrics(swtfont).getHeight();
return fontSize + VERTICAL_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 (this._firstString != null) {
ICSSStyle style = this.getCSSStyle();
if (style == null) {
style = DefaultStyle.getInstance();
}
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);
}
g.clipRect(rect);
String label = _label != null ? _label : _firstString;
label = label.replaceAll("[ \r\n]+", " ");
if (label.endsWith(" ")) {
label = label.substring(0, label.length() - 1);
}
g.drawString(label, rect.x + HORIZONTAL_PADDING / 2, rect.y
+ VERTICAL_PADDING / 2);
if (newColor != null) {
newColor.dispose();
}
}
BorderUtil.drawBorder(g, rect.x, rect.y, rect.width, rect.height,
BORDERTHICK, true);
// next the drop down button
int width = ARRAWWIDTH;
int left = rect.x + rect.width - width - BORDERTHICK;
int top = rect.y + BORDERTHICK;
int height = rect.height - BORDERTHICK * 2;
g.setBackgroundColor(ColorConstants.button);
g.fillRectangle(left, top, width, height);
Rectangle borderRect = new Rectangle(left, top, width, height);
BorderUtil.drawBorder(g, borderRect.x, borderRect.y, borderRect.width,
borderRect.height, BORDERTHICK, false);
g.setForegroundColor(ColorConstants.black);
int decoratorWidth = (width - BORDERTHICK * 2) / 2;
int length = decoratorWidth / 2 + 1;
int leftX = left + (width - decoratorWidth) / 2 - 1;
int topY = top + (height - length) / 2 + 1;
for (int i = 0; i < length; i++) {
g.drawLine(leftX + i, topY + i, leftX - i + decoratorWidth, topY
+ i);
}
}
/**
* set the options to be displayed in this combo box. Will calculate out the
* first string and the longest string.
*
* @param options
*/
public void setOptions(String[] options) {
if (options == null || options.length == 0) {
this._firstString = null;
this._longestString = null;
} else {
this._firstString = options[0];
this._longestString = (options[0] == null ? "" : options[0]);
for (int i = 1; i < options.length; i++) {
if (options[i] == null) {
continue;
}
if (options[i].length() > this._longestString.length()) {
this._longestString = options[i];
}
}
}
}
/**
* @param label
*/
public void setSelectedLabel(String label) {
this._label = label;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isHandlingBorder()
*/
public boolean isHandlingBorder() {
return false;
}
}