com.hdcookbook.grin.io.text
Class SEGenericFeature

java.lang.Object
  extended by com.hdcookbook.grin.Feature
      extended by com.hdcookbook.grin.io.text.SEGenericFeature
All Implemented Interfaces:
SENode

public abstract class SEGenericFeature
extends Feature
implements SENode

This is a generic SEFeature class in which the ExtensionParser implementation can choose to subclass. This is meant to be used for the show compile time only.


Field Summary
 
Fields inherited from class com.hdcookbook.grin.Feature
name, show
 
Constructor Summary
SEGenericFeature(Show show)
           
 
Method Summary
 void accept(SEShowVisitor visitor)
          Calls the visit method corresponding to this node type.
 void addDisplayAreas(RenderContext context)
          Add all of the areas that are displayed for this feature with the current frame.
 void changeFeatureReference(Feature from, Feature to)
          Change a feature reference from one feature to a new one.
 void destroy()
          Free any resources held by this feature.
 void doSomeSetup()
           
 int getX()
          Get the upper-left hand corner of this feature as presently displayed.
 int getY()
          Get the upper-left hand corner of this feature as presently displayed Return Integer.MAX_VALUE if this feature has no visible representation.
 void initialize()
          Initialize this feature.
 boolean needsMoreSetup()
          This is where the feaure says whether or not it needs more setup.
 void nextFrame()
          Called from Segment with the Show lock held, to advance us to the state we should be in for the next frame.
 void paintFrame(java.awt.Graphics2D gr)
          Paint the current state of this feature to gr.
 void postProcess(ShowBuilder builder)
          Do any needed post-processing in this show.
protected  void setActivateMode(boolean mode)
          Change the activated mode of this feature.
protected  int setSetupMode(boolean mode)
          Change the setup mode of this feature.
 
Methods inherited from class com.hdcookbook.grin.Feature
activate, addSubgraph, cloneCommands, clonedReference, cloneSubgraph, createClone, deactivate, destroyClonedSubgraph, getName, initializeClone, isSetup, makeNewClone, markDisplayAreasChanged, resetFeature, sendFeatureSetup, setName, setup, toString, unsetup
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface com.hdcookbook.grin.SENode
getRuntimeClassName, writeInstanceData
 

Constructor Detail

SEGenericFeature

public SEGenericFeature(Show show)
Method Detail

getX

public int getX()
Description copied from class: Feature
Get the upper-left hand corner of this feature as presently displayed. Return Integer.MAX_VALUE if this feature has no visible representation.

Specified by:
getX in class Feature
Returns:
the x coordinate

getY

public int getY()
Description copied from class: Feature
Get the upper-left hand corner of this feature as presently displayed Return Integer.MAX_VALUE if this feature has no visible representation.

Specified by:
getY in class Feature
Returns:
the y coordinate

initialize

public void initialize()
Description copied from class: Feature
Initialize this feature. This is called on show initialization. A show will initialize all of its features after it initializes the segments. Clients of the GRIN framework should never call this method directly. Custom feature extensions must implement this method.

Specified by:
initialize in class Feature

destroy

public void destroy()
Description copied from class: Feature
Free any resources held by this feature. It is the opposite of initialize().

Features are deactivated before they are destroyed. For example, the last segment a show is in when the show is destroyed will probably be active, but it is deactivated and unsetup() is called in Show.destroy() before the features are destroyed.

Cloned features are handled a little differently. They have destroy() called from within Feature.destroyClonedSubgraph(). Since cloned fetures are exempt from the setup/unsetup lifecycle, the cloned feature will not be activated, but will be in a setup state when destroy() is called. Features that support cloning must therefore release any resources they acquired in createClone() or initializeClone() during the call to destroy().

Clients of the GRIN framework should never call this method directly. Custom feature extensions must implement this method.

Specified by:
destroy in class Feature

setSetupMode

protected int setSetupMode(boolean mode)
Description copied from class: Feature
Change the setup mode of this feature. The new mode will always be different than the old. Clients of the GRIN framework should never call this method directly. Custom feature extensions must implement this method.

This method must return a guaranteed lower bound for the number of times it will send a feature setup command as a result of this call. That is, it must send at least as many feature setup commands to the segment as the number returned; sending an accurate number makes the setup process more efficient, since the time it takes to process a command scales with the number of features in a segment. When mode is false, 0 should be returned.

Specified by:
setSetupMode in class Feature

setActivateMode

protected void setActivateMode(boolean mode)
Description copied from class: Feature
Change the activated mode of this feature. The new mode will always be different than the old. Clients of the GRIN framework should never call this method directly. Custom feature extensions must implement this method.

Specified by:
setActivateMode in class Feature

doSomeSetup

public void doSomeSetup()

needsMoreSetup

public boolean needsMoreSetup()
Description copied from class: Feature
This is where the feaure says whether or not it needs more setup. Calls to this are synchronized within the init manager to avoid race conditions. The implementation of this method must not call outside code or call any animation manager methods. For a given setup cycle, this method is called only after setup(). Clients of the GRIN framework should never call this method directly. Custom feature extensions must implement this method.

Specified by:
needsMoreSetup in class Feature
See Also:
SetupClient.needsMoreSetup()

addDisplayAreas

public void addDisplayAreas(RenderContext context)
Description copied from class: Feature
Add all of the areas that are displayed for this feature with the current frame. This will be called exactly once per frame displayed on each activated feature.

A feature that displays something needs to maintain a record of it in a DrawRecord. The animation framework uses this to track what needs to be erased and drawn from frame to frame.

Clients of the GRIN framework should not call this method directly. Feature subclasses must implement this method.

Specified by:
addDisplayAreas in class Feature
Parameters:
context - The context for tracking rendering state
See Also:
DrawRecord

paintFrame

public void paintFrame(java.awt.Graphics2D gr)
Description copied from class: Feature
Paint the current state of this feature to gr. Clients of the GRIN framework should not call this method directly. Feature subclasses must implement this method.

Specified by:
paintFrame in class Feature
Parameters:
gr - The place to paint to.

nextFrame

public void nextFrame()
Description copied from class: Feature
Called from Segment with the Show lock held, to advance us to the state we should be in for the next frame.

Specified by:
nextFrame in class Feature

accept

public void accept(SEShowVisitor visitor)
Description copied from interface: SENode
Calls the visit method corresponding to this node type.

If you are defining a user-defined feature, there are some restrictions that you'll want to follow. If your extension is a feature that has children, then you should make it a subclass of one of the built-in feature types, Assembly, Modifer or Group. That's because the GRIN compiler defines visitors that need to visit every node in the tree, but these built-in visitors don't know about your extension types. By making your extension type a subclass of one of the standard ones, and by making your accept() method call either visitAssembly(), visitGroup() or visitUserDefinedModifier(), as appropriate, you'll ensure that all the children get visited.

Specified by:
accept in interface SENode
Parameters:
visitor - SEShowVisitor object.
See Also:
SEShowVisitor

postProcess

public void postProcess(ShowBuilder builder)
                 throws java.io.IOException
Do any needed post-processing in this show. The grin compiler works as follows:

During the post-process phase, a node can add new features to the show, by calling ShowBuilder.addSyntheticFeature(), and it can insert a new feature as the parent of a given feature, by calling ShowBuilder.injectParent(). It can also add segments and handlers by calling the appropriate builder methods.

When a parent is injected, the ShowBuilder calls postProcess() on all nodes automatically, including nodes that are created during the execution of postProcess() in another node.

Specified by:
postProcess in interface SENode
Parameters:
builder - The builder that holds state for the show
Throws:
java.io.IOException - if an error is encountered
See Also:
ShowBuilder.addSyntheticFeature(Feature), ShowBuilder.injectParent(Feature, Feature)

changeFeatureReference

public void changeFeatureReference(Feature from,
                                   Feature to)
Change a feature reference from one feature to a new one. If your node has a reference to the feature from, it should be changed to refer to to. This is called for every node in an SEShow when SENode.injectParent is used.

The ShowBuilder calls changeFeatureReference() on all nodes automatically, including nodes that are created during the execution of postProcess().

Specified by:
changeFeatureReference in interface SENode
See Also:
SENode.changeFeatureReference(Feature, Feature)