blob: 2c1f91d6d7683de25711f2a8b3918326575dcc25 [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 spark.core
{
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import mx.core.IVisualElement;
/**
* The IGraphicElement is implemented by IVisualElements that
* take advantage of the parent <code>IGraphicElementContainer</code>
* DisplayObject management.
*
* <p>One typical use case is DisplayObject sharing.
* the Group class, which implements <code>IGraphicElementContainer</code>, organizes its
* IGraphicElement children in sequences that share and draw to
* the same DisplayObject.
* The DisplayObject is created by the first element in the
* sequence.</p>
*
* <p>Another use case is when an element does not derive from
* DisplayObject but instead maintains, creates and/or destroys
* its own DisplayObject. The <code>IGraphicElementContainer</code> will
* call the element to create the DisplayObject, add the
* DisplayObject as its child at the correct index, and
* handle its removal.</p>
*
* <p>Typically, you extend the GraphicElement class
* instead of directly implementing the IGraphciElement
* interface. The GraphicElement class already provides most of the
* required functionality.</p>
*
* @see spark.core.IGraphicElementContainer
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
public interface IGraphicElement extends IVisualElement
{
//--------------------------------------------------------------------------
//
// Properties
//
//--------------------------------------------------------------------------
//----------------------------------
// displayObject
//----------------------------------
/**
* The shared DisplayObject where this
* IGraphicElement is drawn.
*
* <p>Implementers should not create the DisplayObject
* here, but in the <code>createDisplayObject()</code> method.</p>
*
* @see #createDisplayObject
* @see #validateDisplayList
* @see #displayObjectSharingMode
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
function get displayObject():DisplayObject;
//----------------------------------
// displayObjectSharingMode
//----------------------------------
/**
* Indicates the association between this IGraphicElement and its
* display objects. The <code>IGraphicElementContainer</code> manages this
* property and the values are one of the DisplayObjectSharingMode enum class.
*
* <ul>
* <li>A value of <code>DisplayObjectSharingMode.OWNS_UNSHARED_OBJECT</code>
* indicates that the IGraphicElement owns exclusively the
* DisplayObject corresponding to its <code>displayObject</code>
* property.</li>
*
* <li>A value of <code>DisplayObjectSharingMode.OWNS_SHARED_OBJECT</code>
* indicates taht the IGraphicElement owns the DisplayObject
* corresponding to its <code>displayObject</code> property but
* other IGraphicElements are using/drawing to that display object as well.
* Depending on the specific implementation, the IGraphicElement may perform
* certain management of the display object.
* For example the base class GraphicElement
* clears the transform of the display object, reset its visibility, alpha,
* etc. properties to their default values and additionally clear the
* graphics on every <code>validateDisplayList()</code> call.</li>
*
* <li>A value of <code>DisplayObjectSharingMode.USES_SHARED_OBJECT</code>
* indicates that the IGraphicElement draws into the
* DisplayObject corresponding to its <code>displayObject</code>
* property. There are one or more IGraphicElements that draw
* into that same displayObject, and the first element that draws
* has its mode set to <code>DisplayObjectMode.OWNS_SHARED_OBJECT</code></li>
* </ul>
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 2.5
* @productversion Flex 4.5
*/
function get displayObjectSharingMode():String;
/**
* @private
*/
function set displayObjectSharingMode(value:String):void;
//--------------------------------------------------------------------------
//
// Methods
//
//--------------------------------------------------------------------------
/**
* Creates a new DisplayObject where this IGraphicElement
* is drawn.
*
* <p>Subsequent calls to the getter of the <code>displayObject</code> property must
* return the same display object.</p>
*
* <p>After the DisplayObject is created, the parent <code>IGraphicElementContainer</code>
* will pass along the display objects to the rest of the elements in the sequence.</p>
*
* <p>The <code>IGraphicElementContainer</code> ensures that this method is called only when needed.</p>
*
* <p>If the element wants to participate in the DisplayObject
* sharing, then the new DisplayObject must implement IShareableDisplayObject.
* This interface is being used by the <code>IGraphicElementContainer</code> to manage invalidation and
* redrawing of the graphic element sequence and typically is not directly
* used by the developer.</p>
*
* <p>To reevaluate the shared sequences, call the
* <code>invalidateGraphicElementSharing()</code> method
* on the <code>IGraphicElementContainer</code>.</p>
*
* <p>To force the <code>IGraphicElementContainer</code> to remove the element's current
* DisplayObject from its display list and recalculate the
* display object sharing, call the
* <code>discardDisplayObject()</code> method on the <code>IGraphicElementContainer</code>.</p>
*
* @return The display object created.
*
* @see #displayObject
* @see spark.core.IGraphicElementContainer#invalidateGraphicElementSharing
* @see spark.core.IGraphicElementContainer#discardDisplayObject
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
function createDisplayObject():DisplayObject;
/**
* Determines whether this element can draw itself to the
* <code>sharedDisplayObject</code> of the sequence.
*
* <p>Typically implementers return <code>true</code> when this
* IGraphicElement can cumulatively draw in the shared
* DisplayObject <code>graphics</code> property.
* In all cases where this IGraphicElement needs to set
* properties on the DisplayObjects that don't apply to the
* rest of the elements in the sequence, this method must return <code>false</code>.
* Examples for such properties are rotation, scale, transform,
* mask, alpha, filters, color transform, 3D, and layer.</p>
*
* <p>When this method returns <code>true</code>, subsequent calls to the getter of the
* <code>displayObject</code> property must return the same display object.</p>
*
* <p>In certain cases, the <code>sharedDisplayObject</code> property might be
* the <code>IGraphicElementContainer</code> itself. In the rest of the cases, the
* DisplayObject is created by the first element in the sequence.</p>
*
* <p>When this IGraphicElement needs to rebuild its sequence,
* it notifies the <code>IGraphicElementContainer</code> by calling its
* <code>invalidateGraphicElementSharing()</code> method.</p>
*
* @param sharedDisplayObject The shared DisplayObject.
*
* @return Returns <code>true</code> when this IGraphicElement can draw itself
* to the shared DisplayObject of the sequence.
*
* @see #canShareWithPrevious
* @see #canShareWithNext
* @see spark.core.IGraphicElementContainer#invalidateGraphicElementSharing
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
function setSharedDisplayObject(sharedDisplayObject:DisplayObject):Boolean;
/**
* Returns <code>true</code> if this IGraphicElement is compatible and can
* share display objects with the previous IGraphicElement
* in the sequence.
*
* <p>In certain cases the element might be passed to the <code>IGraphicElementContainer</code>
* in a call to the <code>setSharedDisplayObject()</code> method.
* In those cases, this method is not called.</p>
*
* @param element The element that comes before this element in the sequence.
*
* @return Returns <code>true</code> when this element is compatible with the previous
* element in the sequence.
*
* @see #canShareWithNext
* @see #setSharedDisplayObject
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
function canShareWithPrevious(element:IGraphicElement):Boolean;
/**
* Returns <code>true</code> if this IGraphicElement is compatible and can
* share display objects with the next IGraphicElement
* in the sequence.
*
* @param element The element that comes after this element in the sequence.
*
* @return Returns <code>true</code> when this element is compatible with the previous
* element in the sequence.
*
* @see #canShareWithPrevious
* @see #setSharedDisplayObject
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
function canShareWithNext(element:IGraphicElement):Boolean;
/**
* Called by <code>IGraphicElementContainer</code> when an IGraphicElement
* is added to or removed from the host component.
* <p>You typically never need to call this method.</p>
*
* @param parent The <code>IGraphicElementContainer</code> of this <code>IGraphicElement</code>.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
function parentChanged(parent:IGraphicElementContainer):void;
/**
* Called by the <code>IGraphicElementContainer</code> to validate the properties of
* this element.
*
* <p>To ensure that this method is called, notify the <code>IGraphicElementContainer</code>
* by calling its <code>invalidateGraphicElementProperties()</code> method.</p>
*
* <p>This method might be called even if this element has not
* notified the <code>IGraphicElementContainer</code>.</p>
*
* @see #validateSize
* @see #validateDisplayList
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
function validateProperties():void;
/**
* Called by the <code>IGraphicElementContainer</code> to validate the size of
* this element.
*
* <p>When the size of the element changes and is going to affect the
* <code>IGraphicElementContainer</code> layout, the implementer is responsible
* for invalidating the parent's size and display list.</p>
*
* <p>To ensure that this method is called, notify the <code>IGraphicElementContainer</code>
* by calling its <code>invalidateGraphicElementSize()</code> method.</p>
*
* <p>This method might be called even if this element has not
* notified the <code>IGraphicElementContainer</code>.</p>
*
* @see #validateProperties
* @see #validateDisplayList
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
function validateSize():void;
/**
* Called by the <code>IGraphicElementContainer</code> to redraw this element
* in its <code>displayObject</code> property.
*
* <p>If the element is the first in the sequence (<code>displayObjectSharingMode</code>
* is set to <code>DisplayObjectSharingMode.OWNS_SHARED_OBJECT</code>)
* then it must clear the <code>displayObject</code>
* graphics and set it up as necessary for drawing the rest of the elements.</p>
*
* <p>The element must alway redraw even if it itself has not changed
* since the last time the <code>validateDisplayList()</code> method was called.
* The parent <code>IGraphicElementContainer</code> will redraw the whole sequence
* if any of its elements need to be redrawn.</p>
*
* <p>To ensure this method is called, notify the <code>IGraphicElementContainer</code>
* by calling its <code>invalidateGraphicElementSize()</code> method.</p>
*
* <p>This method might be called even if this element has not
* notified the <code>IGraphicElementContainer</code>.</p>
*
* @see #displayObject
* @see #validateProperties
* @see #validateSize
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
function validateDisplayList():void;
}
}