/*
* Bibliothek - DockingFrames
* Library built on Java/Swing, allows the user to "drag and drop"
* panels containing any Swing-Component the developer likes to add.
*
* Copyright (C) 2012 Benjamin Sigg
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Benjamin Sigg
* benjamin_sigg@gmx.ch
* CH - Switzerland
*/
package bibliothek.gui.dock.extension.css;
import java.util.ArrayList;
import java.util.List;
/**
* Used to call the method {@link CssType#convert(String)}, this class represents a simple {@link String}
* as it can be found in the "value" part of a css-declaration. At the same time this class offers some
* methods to split that string into multiple parts.
* @author Benjamin Sigg
*/
public class CssDeclarationValue {
/** the actual value found in the declaration */
private String value;
/** cache for the parts */
private String[] parts;
/**
* Creates a new argument
* @param value the actual value found in the declaration
*/
public CssDeclarationValue( String value ){
this.value = value;
}
/**
* Gets the unmodified, original value.
* @return the unmodified value
*/
public String getValue(){
return value;
}
/**
* Assuming that the value has only one part, gets that one part (or the first part if the assumption was incorrect).
* @return the first part of the value
*/
public String getSingleValue(){
String[] values = getValues();
return values[0];
}
/**
* Gets all the parts of this value, parts are split when finding a comma.
* @return all the parts
*/
public String[] getValues(){
if( parts != null ){
return parts;
}
List<String> items = new ArrayList<String>();
StringBuilder item = new StringBuilder();
boolean inString = false;
boolean escape = false;
boolean pending = true;
for( int i = 0, n = value.length(); i<n; i++ ){
pending = false;
char c = value.charAt( i );
if( escape ){
item.append( c );
escape = false;
}
else if( c == '\\'){
escape = true;
}
else if( c == '"' ){
inString = !inString;
}
else if( c == ',' ){
if( inString ){
item.append( c );
}
else{
items.add( item.toString().trim() );
item.setLength( 0 );
pending = true;
}
}
else{
item.append( c );
}
}
if( pending || item.length() > 0 ){
items.add( item.toString().trim() );
}
parts = items.toArray( new String[ items.size() ] );
return parts;
}
@Override
public String toString(){
return getValue();
}
}