blob: 58283bd2b4fc38b97e628af36a719c7349ad777e [file] [log] [blame]
/*******************************************************************************
* 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;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class QxDimension implements QxType {
public static final QxDimension ZERO = new QxDimension( 0 );
private static final Pattern LENGTH_PATTERN
= Pattern.compile( "((\\+|-)?\\d+)(em|ex|px|pt|pc|in|cm|mm|%)?" );
public final int value;
private QxDimension( final int value ) {
this.value = value;
}
public static QxDimension create( final int value ) {
QxDimension result;
if( value == 0 ) {
result = ZERO;
} else {
result = new QxDimension( value );
}
return result;
}
public static QxDimension valueOf( final String input ) {
if( input == null ) {
throw new NullPointerException( "null argument" );
}
Integer parsed = parseLength( input );
if( parsed == null ) {
throw new IllegalArgumentException( "Illegal dimension parameter: " + input );
}
return create( parsed.intValue() );
}
public String toDefaultString() {
return value + "px";
}
public boolean equals( final Object object ) {
boolean result = false;
if( object == this ) {
result = true;
} else if( object instanceof QxDimension ) {
QxDimension other = (QxDimension)object;
result = ( other.value == this.value );
}
return result;
}
public int hashCode () {
return value * 47;
}
public String toString () {
return "QxDimension{ "
+ value
+ " }";
}
/**
* Tries to interpret a string as length parameter.
*
* @return the parsed length as integer, or <code>null</code> if the string
* could not be parsed.
* @throws IllegalArgumentException if the string is valid CSS length
* parameter that is a percentage value or has an unsupported
* unit.
*/
static Integer parseLength( final String input ) {
// TODO [rst] Also catch values with fractional digits
Integer result = null;
Matcher matcher = LENGTH_PATTERN.matcher( input );
if( matcher.matches() ) {
result = Integer.valueOf( matcher.group( 1 ) );
String unit = matcher.group( 3 );
if( unit != null && "%".equals( unit ) ) {
throw new IllegalArgumentException( "Percentages not supported: " + input );
}
if( unit != null && !"px".equals( unit ) ) {
throw new IllegalArgumentException( "Unit not supported: " + input );
}
}
return result;
}
}