/*
*
* 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.fxg.dom.strokes;
import static org.apache.flex.compiler.fxg.FXGConstants.*;
import java.util.Collection;
import org.apache.flex.compiler.fxg.FXGVersion;
import org.apache.flex.compiler.internal.fxg.dom.AbstractFXGNode;
import org.apache.flex.compiler.internal.fxg.dom.DOMParserHelper;
import org.apache.flex.compiler.internal.fxg.dom.GraphicNode;
import org.apache.flex.compiler.internal.fxg.dom.IStrokeNode;
import org.apache.flex.compiler.internal.fxg.dom.types.Caps;
import org.apache.flex.compiler.internal.fxg.dom.types.Joints;
import org.apache.flex.compiler.internal.fxg.dom.types.ScaleMode;
import org.apache.flex.compiler.problems.FXGUnknownAttributeValueProblem;
import org.apache.flex.compiler.problems.ICompilerProblem;
/**
* Base class for all FXG stroke nodes.
*/
public abstract class AbstractStrokeNode extends AbstractFXGNode implements IStrokeNode
{
protected static final double MITERLIMIT_MIN_INCLUSIVE = 1.0;
protected static final double MITERLIMIT_MAX_INCLUSIVE = 255.0;
protected static final double WEIGHT_MIN_INCLUSIVE = 0.0;
protected static final double WEIGHT_MAX_INCLUSIVE = 255.0;
//--------------------------------------------------------------------------
//
// Attributes
//
//--------------------------------------------------------------------------
//------------
// id
//------------
protected String id;
/**
* An id attribute provides a well defined name to a content node.
*/
@Override
public String getId()
{
return id;
}
/**
* Sets the node id.
* @param value - the node id as a String.
*/
@Override
public void setId(String value)
{
id = value;
}
public ScaleMode scaleMode = ScaleMode.NORMAL;
public Caps caps = Caps.ROUND;
public boolean pixelHinting = false;
public Joints joints = Joints.ROUND;
public double miterLimit = 3.0;
private double weight = Double.NaN;
protected double weight_v_1 = 0.0;
protected double weight_v_1_later = 1.0;
/**
* Stroke weight. Default value is FXG Version specific.
* FXG 1.0 - default "0.0"
* FXG 2.0 - default "2.0"
*/
public double getWeight()
{
if (Double.isNaN(weight))
{
if (((GraphicNode)this.getDocumentNode()).getVersion().equals(FXGVersion.v1_0))
weight = weight_v_1;
else
weight = weight_v_1_later;
}
return weight;
}
/**
* Get scaleX.
* @return Double.NaN as default.
*/
public double getScaleX()
{
return Double.NaN;
}
/**
* Get scaleY.
* @return Double.NaN as default.
*/
public double getScaleY()
{
return Double.NaN;
}
//--------------------------------------------------------------------------
//
// IFXGNode Implementation
//
//--------------------------------------------------------------------------
/**
* Sets an FXG attribute on this stroke node.
*
* @param name - the unqualified attribute name.
* @param value - the attribute value.
* @param problems problem collection used to collect problems occurred within this method
*/
@Override
public void setAttribute(String name, String value, Collection<ICompilerProblem> problems)
{
if (FXG_SCALEMODE_ATTRIBUTE.equals(name))
scaleMode = getScaleMode(value, problems);
else if (FXG_CAPS_ATTRIBUTE.equals(name))
caps = getCaps(value, problems);
else if (FXG_WEIGHT_ATTRIBUTE.equals(name))
weight = DOMParserHelper.parseDouble(this, value, name, WEIGHT_MIN_INCLUSIVE, WEIGHT_MAX_INCLUSIVE, weight, problems);
else if (FXG_PIXELHINTING_ATTRIBUTE.equals(name))
pixelHinting = DOMParserHelper.parseBoolean(this, value, name, pixelHinting, problems);
else if (FXG_JOINTS_ATTRIBUTE.equals(name))
joints = getJoints(value, problems);
else if (FXG_MITERLIMIT_ATTRIBUTE.equals(name))
miterLimit = DOMParserHelper.parseDouble(this, value, name, MITERLIMIT_MIN_INCLUSIVE, MITERLIMIT_MAX_INCLUSIVE, miterLimit, problems);
else if (FXG_ID_ATTRIBUTE.equals(name))
id = value;
else
super.setAttribute(name, value, problems);
}
//--------------------------------------------------------------------------
//
// Helper Methods
//
//--------------------------------------------------------------------------
/**
* Convert an FXG String value to a Caps enumeration.
*
* @param value - the FXG String value.
* @return the matching Caps type.
*/
protected Caps getCaps(String value, Collection<ICompilerProblem> problems)
{
if (FXG_CAPS_ROUND_VALUE.equals(value))
return Caps.ROUND;
else if (FXG_CAPS_SQUARE_VALUE.equals(value))
return Caps.SQUARE;
else if (FXG_CAPS_NONE_VALUE.equals(value))
return Caps.NONE;
//string did not match a known caps type.
problems.add(new FXGUnknownAttributeValueProblem(getDocumentPath(), getStartLine(),
getStartColumn(), FXG_CAPS_ATTRIBUTE, value));
return caps;
}
/**
* Convert an FXG String value to a Joints enumeration.
*
* @param value - the FXG String value.
* @return the matching Joints type.
*/
protected Joints getJoints(String value, Collection<ICompilerProblem> problems)
{
if (FXG_JOINTS_ROUND_VALUE.equals(value))
return Joints.ROUND;
if (FXG_JOINTS_MITER_VALUE.equals(value))
return Joints.MITER;
if (FXG_JOINTS_BEVEL_VALUE.equals(value))
return Joints.BEVEL;
//string did not match a known Joints type.
problems.add(new FXGUnknownAttributeValueProblem(getDocumentPath(), getStartLine(),
getStartColumn(), FXG_JOINTS_ATTRIBUTE, value));
return joints;
}
/**
* Convert an FXG String value to a ScaleMode enumeration.
*
* @param value - the FXG String value.
* @return the matching ScaleMode.
*/
protected ScaleMode getScaleMode(String value, Collection<ICompilerProblem> problems)
{
if (FXG_SCALEMODE_NONE_VALUE.equals(value))
return ScaleMode.NONE;
else if (FXG_SCALEMODE_VERTICAL_VALUE.equals(value))
return ScaleMode.VERTICAL;
else if (FXG_SCALEMODE_NORMAL_VALUE.equals(value))
return ScaleMode.NORMAL;
else if (FXG_SCALEMODE_HORIZONTAL_VALUE.equals(value))
return ScaleMode.HORIZONTAL;
//string did not match a known Joints type.
problems.add(new FXGUnknownAttributeValueProblem(getDocumentPath(), getStartLine(),
getStartColumn(), FXG_SCALEMODE_ATTRIBUTE, value));
return scaleMode;
}
}