/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.flex.compiler.internal.tree.as.metadata;
import antlr.Token;
import org.apache.flex.compiler.constants.IMetaAttributeConstants;
import org.apache.flex.compiler.definitions.IClassDefinition;
import org.apache.flex.compiler.definitions.IDefinition;
import org.apache.flex.compiler.internal.parsing.TokenBase;
import org.apache.flex.compiler.internal.tree.as.IdentifierNode;
import org.apache.flex.compiler.internal.tree.as.QualifiedNameExpressionNode;
import org.apache.flex.compiler.tree.as.ICommonClassNode;
import org.apache.flex.compiler.tree.metadata.IStyleTagNode;
import org.apache.flex.compiler.workspaces.IWorkspace;
import org.apache.flex.utils.CheapArray;
public final class StyleTagNode extends BaseDefinitionMetaTagNode implements IStyleTagNode
{
private IdentifierNode arrayType;
private IdentifierNode type;
private Object values;
private Object states;
private static final String[] EMPTY_LIST = new String[0];
public StyleTagNode()
{
super(IMetaAttributeConstants.ATTRIBUTE_STYLE);
init();
}
private void init()
{
values = CheapArray.create(3);
states = CheapArray.create(3);
}
@Override
public void normalize(boolean fillInOffsets)
{
super.normalize(fillInOffsets);
values = CheapArray.optimize(values, EMPTY_LIST);
states = CheapArray.optimize(states, EMPTY_LIST);
}
public void setArrayType(IdentifierNode arrayType)
{
this.arrayType = arrayType;
this.arrayType.setParent(this);
addToMap(IMetaAttributeConstants.NAME_STYLE_ARRAYTYPE, getArrayTypeName());
}
public void setType(Token type)
{
this.type = new QualifiedNameExpressionNode((TokenBase)type);
this.type.setParent(this);
addToMap(IMetaAttributeConstants.NAME_STYLE_TYPE, getTypeName());
}
public void setIsInheritable(String doesInherit)
{
addToMap(IMetaAttributeConstants.NAME_STYLE_INHERIT, doesInherit);
}
public void setFormat(String format)
{
addToMap(IMetaAttributeConstants.NAME_STYLE_FORMAT, format);
}
public void addValue(String value)
{
addToList(IMetaAttributeConstants.NAME_STYLE_ENUMERATION, value, values);
}
public void addState(String state)
{
addToList(IMetaAttributeConstants.NAME_STYLE_STATES, state, states);
}
private void addToList(String key, String value, Object array)
{
CheapArray.add(value, array);
String string = getValue(key);
if (string.length() > 0)
string += ",";
string += value;
addToMap(key, value);
}
public void parseValues(String valueString)
{
parseList(IMetaAttributeConstants.NAME_STYLE_ENUMERATION, valueString, values);
}
public void parseStates(String statesString)
{
parseList(IMetaAttributeConstants.NAME_STYLE_STATES, statesString, states);
}
private void parseList(String key, String value, Object list)
{
if (value != null)
{
String[] strings = value.split(",");
for (int i = 0; i < strings.length; i++)
{
CheapArray.add(strings[i].trim(), list);
}
}
addToMap(key, value);
}
private String getArrayTypeName()
{
if (arrayType != null)
return arrayType.getName();
return "";
}
public IdentifierNode getArrayTypeNode()
{
return arrayType;
}
@Override
public String getFormat()
{
return getValue(IMetaAttributeConstants.NAME_STYLE_FORMAT);
}
@Override
public String getTypeName()
{
if (type != null)
return type.getName();
return "";
}
@Override
public boolean hasThemes()
{
return !(getValue(IMetaAttributeConstants.NAME_STYLE_THEME).isEmpty());
}
@Override
public boolean equals(Object obj)
{
if (obj instanceof StyleTagNode)
{
StyleTagNode other = (StyleTagNode)obj;
if (!equals(nameNode, other.nameNode))
return false;
if (!equals(type, other.type))
return false;
if (!equals(arrayType, other.arrayType))
return false;
if (other.getAbsoluteStart() != this.getAbsoluteStart())
return false;
if (other.getAbsoluteEnd() != this.getAbsoluteEnd())
return false;
if (getFormat().compareTo(other.getFormat()) != 0)
return false;
if (other.getValue(IMetaAttributeConstants.NAME_STYLE_ENUMERATION).compareTo(getValue(IMetaAttributeConstants.NAME_STYLE_ENUMERATION)) != 0)
return false;
if (other.getValue(IMetaAttributeConstants.NAME_STYLE_STATES).compareTo(getValue(IMetaAttributeConstants.NAME_STYLE_STATES)) != 0)
return false;
return true;
}
return false;
}
@Override
protected void setChildren(boolean fillInOffsets)
{
addChildInOrder(nameNode, fillInOffsets);
addChildInOrder(arrayType, fillInOffsets);
addChildInOrder(type, fillInOffsets);
}
@Override
protected int getInitialChildCount()
{
return 0;
}
@Override
public IDefinition getDefinition()
{
ICommonClassNode decoratedClassNode = (ICommonClassNode)getAncestorOfType(ICommonClassNode.class);
if (decoratedClassNode == null)
return null;
IWorkspace workspace = getWorkspace();
IClassDefinition decoratedClassDefinition = decoratedClassNode.getDefinition();
assert decoratedClassDefinition != null;
return decoratedClassDefinition.getStyleDefinition(workspace, getName());
}
}