blob: 26d304e022173c331339d3cab17e9f7a5610941f [file] [log] [blame]
/*
*
* 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 com.adobe.internal.fxg.dom;
import java.util.ArrayList;
import java.util.List;
import com.adobe.fxg.FXGException;
import com.adobe.fxg.dom.FXGNode;
import com.adobe.internal.fxg.dom.types.ScalingGrid;
import static com.adobe.fxg.FXGConstants.*;
/**
* @author Peter Farland
*/
public class GroupNode extends GraphicContentNode implements MaskingNode
{
//--------------------------------------------------------------------------
//
// Attributes
//
//--------------------------------------------------------------------------
/** The distance from the origin of the left edge of the scale grid,
* in the group's own coordinate system. */
public double scaleGridLeft = 0.0;
/** The distance from the origin of the top edge of the scale grid,
* in the group's own coordinate system. */
public double scaleGridTop = 0.0;
/** The distance from the origin of the right edge of the scale grid,
* in the group's own coordinate system. */
public double scaleGridRight = 0.0;
/** The distance from the origin of the bottom edge of the scale grid,
* in the group's own coordinate system. */
public double scaleGridBottom = 0.0;
//--------------------------------------------------------------------------
//
// Children
//
//--------------------------------------------------------------------------
/** The children. */
public List<GraphicContentNode> children;
//--------------------------------------------------------------------------
//
// FXGNode Implementation
//
//--------------------------------------------------------------------------
/**
* Adds an FXG child node to this Group node.
*
* @param child - a child FXG node to be added to this node.
* @throws FXGException if the child is not supported by this node.
*/
@Override
public void addChild(FXGNode child)
{
if (child instanceof GraphicContentNode)
{
if (children == null)
children = new ArrayList<GraphicContentNode>();
GraphicContentNode graphicContent = (GraphicContentNode)child;
graphicContent.setParentGraphicContext(createGraphicContext());
if (child instanceof GroupNode)
{
if (isInsideScaleGrid())
{
// Exception:A child Group cannot exist in a Group that
// defines the scale grid
throw new FXGException(child.getStartLine(), child.getStartColumn(), "InvalidScaleGridGroupChild");
}
}
children.add(graphicContent);
}
else
{
super.addChild(child);
}
}
/**
* @return The unqualified name of a Group node, without tag markup.
*/
public String getNodeName()
{
return FXG_GROUP_ELEMENT;
}
/**
* Sets an FXG attribute on this Group node. Delegates to the parent
* class to process attributes that are not in the list below.
* <p>Attributes include:
* <ul>
* <li><b>scaleGridLeft</b> (Number): The distance from the origin of the
* left edge of the scale grid, in the group's own coordinate system.</li>
* <li><b>scaleGridTop</b> (Number): The distance from the origin of the
* top edge of the scale grid, in the group's own coordinate system.</li>
* <li><b>scaleGridRight</b> (Number): The distance from the origin of the
* right edge of the scale grid, in the group's own coordinate system.</li>
* <li><b>scaleGridBottom</b> (Number): The distance from the origin of the
* bottom edge of the scale grid, in the group's own coordinate system.</li>
*
* @param name - the unqualified attribute name
* @param value - the attribute value
* @throws FXGException if a value is out of the valid range.
* @see com.adobe.internal.fxg.dom.AbstractFXGNode#setAttribute(java.lang.String, java.lang.String)
*/
@Override
public void setAttribute(String name, String value)
{
if (FXG_SCALEGRIDLEFT_ATTRIBUTE.equals(name))
{
scaleGridLeft = DOMParserHelper.parseDouble(this, value, name);
definesScaleGrid = true;
}
else if (FXG_SCALEGRIDTOP_ATTRIBUTE.equals(name))
{
scaleGridTop = DOMParserHelper.parseDouble(this, value, name);
definesScaleGrid = true;
}
else if (FXG_SCALEGRIDRIGHT_ATTRIBUTE.equals(name))
{
scaleGridRight = DOMParserHelper.parseDouble(this, value, name);
definesScaleGrid = true;
}
else if (FXG_SCALEGRIDBOTTOM_ATTRIBUTE.equals(name))
{
scaleGridBottom = DOMParserHelper.parseDouble(this, value, name);
definesScaleGrid = true;
}
else
{
super.setAttribute(name, value);
}
if ((definesScaleGrid) && (this.rotationSet))
{
throw new FXGException(getStartLine(), getStartColumn(), "InvalidScaleGridRotationAttribute");
}
}
/**
* Create graphic context. If a scale grid is defined, set it on the
* context.
*
* @see com.adobe.internal.fxg.dom.GraphicContentNode#createGraphicContext()
*/
@Override
public GraphicContext createGraphicContext()
{
GraphicContext context = super.createGraphicContext();
if (definesScaleGrid())
{
ScalingGrid scalingGrid = new ScalingGrid();
scalingGrid.scaleGridLeft = scaleGridLeft;
scalingGrid.scaleGridTop = scaleGridTop;
scalingGrid.scaleGridRight = scaleGridRight;
scalingGrid.scaleGridBottom = scaleGridBottom;
context.scalingGrid = scalingGrid;
}
return context;
}
/**
* Check whether a scaling grid is defined.
*
* @return true, if a scaling grid is defined.
*/
public boolean definesScaleGrid()
{
return definesScaleGrid;
}
/**
* Check whether the current group is inside a scale grid or has a
* scale grid defined.
*
* @return true, if inside a scale grid or has a scale grid defined.
*/
public boolean isInsideScaleGrid()
{
return insideScaleGrid || definesScaleGrid;
}
/**
* Sets the inside scale grid.
*
* @param value the new inside scale grid
*/
public void setInsideScaleGrid(boolean value)
{
insideScaleGrid = value;
}
private boolean definesScaleGrid;
private boolean insideScaleGrid;
//--------------------------------------------------------------------------
//
// MaskingNode Implementation
//
//--------------------------------------------------------------------------
private int maskIndex;
/**
* @return the index of a mask in a parent DisplayObject's list of children.
* This can be used to access the mask programmatically at runtime.
*/
public int getMaskIndex()
{
return maskIndex;
}
/**
* Records the index of this mask in the parent DisplayObject's list of
* children. (Optional).
* @param index - the child index to the mask
*/
public void setMaskIndex(int index)
{
maskIndex = index;
}
}