| /******************************************************************************* |
| * Copyright (c) 2007, 2008 Innoopract Informationssysteme GmbH. |
| * 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: |
| * Innoopract Informationssysteme GmbH - initial API and implementation |
| ******************************************************************************/ |
| |
| package org.eclipse.rwt.internal.theme; |
| |
| public class QxBorder implements QxType { |
| |
| public static final QxBorder NONE = new QxBorder( 0, null, null ); |
| |
| public static final String[] VALID_STYLES = new String[] { |
| "none", |
| "hidden", |
| "dotted", |
| "dashed", |
| "solid", |
| "double", |
| "groove", |
| "ridge", |
| "inset", |
| "outset" |
| }; |
| |
| // TODO [rst] Implement properties for left, right, etc. |
| |
| private static final String DARKSHADOW_LIGHTSHADOW |
| = getBorderColors( "widget.darkshadow", "widget.lightshadow" ); |
| |
| private static final String LIGHTSHADOW_DARKSHADOW |
| = getBorderColors( "widget.lightshadow", "widget.darkshadow" ); |
| |
| private static final String SHADOW_HIGHLIGHT |
| = getBorderColors( "widget.shadow", "widget.highlight" ); |
| |
| private static final String HIGHLIGHT_SHADOW |
| = getBorderColors( "widget.highlight", "widget.shadow" ); |
| |
| public final int width; |
| |
| public final String style; |
| |
| // TODO [rst] Color is either a valid color string or a named color from the |
| // color theme. Check for valid colors. |
| public final String color; |
| |
| private QxBorder( final int width, final String style, final String color ) { |
| this.width = width; |
| this.style = style; |
| this.color = color; |
| } |
| |
| public static QxBorder create( final int width, |
| final String style, |
| final String color ) |
| { |
| QxBorder result; |
| if( width == 0 || "none".equals( style ) || "hidden".equals( style ) ) { |
| result = NONE; |
| } else { |
| result = new QxBorder( width, style == null ? "solid" : style, color ); |
| } |
| return result; |
| } |
| |
| public static QxBorder valueOf( final String input ) { |
| if( input == null ) { |
| throw new NullPointerException( "null argument" ); |
| } |
| String[] parts = input.split( "\\s+" ); |
| if( input.trim().length() == 0 ) { |
| throw new IllegalArgumentException( "Empty border definition" ); |
| } |
| if( parts.length > 3 ) { |
| throw new IllegalArgumentException( "Illegal number of arguments for border" ); |
| } |
| int width = -1; |
| String style = null; |
| String color = null; |
| for( int i = 0; i < parts.length; i++ ) { |
| String part = parts[ i ]; |
| boolean consumed = "".equals( part ); |
| // parse width |
| if( !consumed && width == -1 ) { |
| Integer parsedWidth = QxDimension.parseLength( part ); |
| if( parsedWidth != null ) { |
| if( parsedWidth.intValue() < 0 ) { |
| throw new IllegalArgumentException( "Negative width: " + part ); |
| } |
| width = parsedWidth.intValue(); |
| consumed = true; |
| } |
| } |
| // parse style |
| if( !consumed && style == null ) { |
| String parsedStyle = parseStyle( part ); |
| if( parsedStyle != null ) { |
| style = parsedStyle; |
| consumed = true; |
| } |
| } |
| // parse color |
| if( !consumed && color == null ) { |
| color = part; |
| consumed = true; |
| } |
| if( !consumed ) { |
| throw new IllegalArgumentException( "Illegal parameter for color: " |
| + part ); |
| } |
| } |
| if( width == -1 ) { |
| width = 1; |
| } |
| return QxBorder.create( width, style, color ); |
| } |
| |
| public String getQxStyle() { |
| String result = style; |
| if( color == null ) { |
| if( ( "outset".equals( style ) || "inset".equals( style ) ) |
| && ( width == 1 || width == 2 ) ) |
| { |
| result = "solid"; |
| } else if( ( "ridge".equals( style ) || "groove".equals( style ) ) |
| && width == 2 ) |
| { |
| result = "solid"; |
| } |
| } |
| return result; |
| } |
| |
| /** |
| * Returns the colors to pass to qx for use default widget colors for 3d |
| * borders. When a 3d border style is used and no color has been set, this |
| * method returns an array of the default widget colors for the style. |
| */ |
| public String getQxColors() { |
| String result = null; |
| if( color == null && width == 2 ) { |
| if( "outset".equals( style ) ) { |
| result = LIGHTSHADOW_DARKSHADOW; |
| } else if( "inset".equals( style ) ) { |
| result = SHADOW_HIGHLIGHT; |
| } else if( "ridge".equals( style ) ) { |
| result = HIGHLIGHT_SHADOW; |
| } else if( "groove".equals( style ) ) { |
| result = SHADOW_HIGHLIGHT; |
| } |
| } else if( color == null && width == 1 ) { |
| if( "outset".equals( style ) ) { |
| result = HIGHLIGHT_SHADOW; |
| } else if( "inset".equals( style ) ) { |
| result = SHADOW_HIGHLIGHT; |
| } |
| } |
| if( result == null ) { |
| result = color == null ? null : "\"" + color + "\""; |
| } |
| return result; |
| } |
| |
| /** |
| * Returns the inner colors to pass to qx for use default widget colors for 3d |
| * borders. When a 3d border style is used and no color has been set, this |
| * method returns an array of the default widget colors for the style. |
| */ |
| public String getQxInnerColors() { |
| String result = null; |
| if( color == null && width == 2 ) { |
| if( "outset".equals( style ) ) { |
| result = HIGHLIGHT_SHADOW; |
| } else if( "inset".equals( style ) ) { |
| result = DARKSHADOW_LIGHTSHADOW; |
| } else if( "ridge".equals( style ) ) { |
| result = SHADOW_HIGHLIGHT; |
| } else if( "groove".equals( style ) ) { |
| result = HIGHLIGHT_SHADOW; |
| } |
| } |
| return result; |
| } |
| |
| public String toDefaultString() { |
| StringBuffer result = new StringBuffer(); |
| if( width == 0 ) { |
| result.append( "none" ); |
| } else { |
| result.append( width + "px" ); |
| result.append( " " ); |
| result.append( style ); |
| if( color != null ) { |
| result.append( " " ); |
| result.append( color ); |
| } |
| } |
| return result.toString(); |
| } |
| |
| public boolean equals( final Object object ) { |
| // TODO [rst] Adapt this method as soon as properties for left, right, etc. exist |
| boolean result = false; |
| if( object == this ) { |
| result = true; |
| } else if( object instanceof QxBorder ) { |
| QxBorder other = ( QxBorder )object; |
| result = other.width == this.width |
| && ( style == null |
| ? other.style == null |
| : style.equals( other.style ) ) |
| && ( color == null |
| ? other.color == null |
| : color.equals( other.color ) ); |
| } |
| return result; |
| } |
| |
| public int hashCode() { |
| // TODO [rst] Adapt this method as soon as properties for left, right, etc. |
| // exist |
| int result = 23; |
| result += 37 * result + width; |
| if( style != null ) { |
| result += 37 * result + style.hashCode(); |
| } |
| if( color != null ) { |
| result += 37 * result + color.hashCode(); |
| } |
| return result; |
| } |
| |
| public String toString() { |
| // TODO [rst] Adapt this method as soon as properties for left, right, etc. |
| // exist |
| return "QxBorder{ " + width + ", " + style + ", " + color + " }"; |
| } |
| |
| private static String getBorderColors( final String color1, final String color2 ) { |
| StringBuffer result = new StringBuffer(); |
| result.append( "[ \""); |
| result.append( color1 ); |
| result.append( "\", \""); |
| result.append( color2 ); |
| result.append( "\", \""); |
| result.append( color2 ); |
| result.append( "\", \""); |
| result.append( color1 ); |
| result.append( "\" ]"); |
| return result.toString(); |
| } |
| |
| private static String parseStyle( final String part ) { |
| String result = null; |
| for( int j = 0; j < VALID_STYLES.length && result == null; j++ ) { |
| if( VALID_STYLES[ j ].equalsIgnoreCase( part ) ) { |
| result = VALID_STYLES[ j ]; |
| } |
| } |
| return result; |
| } |
| } |