contrib.com.blogofbug.swing.layout
Class CaroselLayout

java.lang.Object
  extended by contrib.com.blogofbug.swing.layout.CaroselLayout
All Implemented Interfaces:
java.awt.event.ActionListener, java.awt.LayoutManager, java.util.EventListener
Direct Known Subclasses:
OffsetCaroselLayout

public class CaroselLayout
extends java.lang.Object
implements java.awt.LayoutManager, java.awt.event.ActionListener

Layout engine for JCarousel components (although would work for any container). It does have a closer than usual relationship with the container, sometimes causing the container to repaint.

Author:
bug

Field Summary
protected  java.util.Hashtable additionalData
          List of additional information held on components in the carousel
protected  java.util.LinkedList<java.awt.Component> components
          List of components being laid out
protected  int numberOfItems
          Number of items in the carousel (that are visible)
protected  double rotationalOffset
          The current degree of rotation of the carousel
protected  double targetOffset
          The desired rotational offset, which will be moved to by a timer animating the carousel
 
Constructor Summary
CaroselLayout(java.awt.Container forContainer)
          Creates a new instance of the layout engine, tied to the specified container.
 
Method Summary
 void actionPerformed(java.awt.event.ActionEvent actionEvent)
          Manages timer actions, terminating the timer if any event is fully achieved
 void addLayoutComponent(java.lang.String name, java.awt.Component comp)
          Name is ignored
protected  java.awt.Point calculateCenter(java.awt.Insets insets, int width, int height, int widest)
          Determines the center of the carousel
 void finalizeLayoutImmediately()
          Moves everything to their "target" positions, without animating anything
 double getAngle()
          Returns the current rotational angle
protected  java.awt.Dimension getCarouselRadius(java.awt.Container target, java.awt.Insets insets, int width, int height, int widestComponent)
          Determines the correct size of the carousel for the container
 int getComponentCount()
          The number of components being laid out.
 int getComponentIndex(java.awt.Component comp)
          Gets the index of the supplied component
 int getNeutralContentWidth()
          The size of comopnents a neutral width
 java.awt.Component getNextComponent(java.awt.Component component)
          Retrieve the component after the specified one.
protected  contrib.com.blogofbug.swing.layout.CaroselLayout.CaroselPosition getPosition(java.awt.Component comp)
          Gets the additional data stored by the layout manager for a given component
 java.awt.Component getPreviousComponent(java.awt.Component component)
          Retrieve the component before the specified one.
protected  double getScale(double angle, double x, double y, double carouselX, double carouselY)
          Determines the scale to be applied to the component.
protected  boolean isAnimating()
          Determines if an animation is currently playing
 void layoutContainer(java.awt.Container target)
          Lays out all of the components on the carosel.
 java.awt.Dimension minimumLayoutSize(java.awt.Container parent)
          Cheats and bases it's size on the prefered sizes of each component
 void moveComponentTo(int i, java.awt.Component comp)
          Moves a layout component at a particular location in the carousel
 java.awt.Dimension preferredLayoutSize(java.awt.Container parent)
          Determine the widest and tallest dimensions, then return the height as 1.5 * the highest, and 3 * the widest
protected  void recalculateCarosel()
          Updates all of the positions of the carousel.
protected  int recalculateVisibleItems()
          Determines how many of the items being laid out are currently visible.
 void removeLayoutComponent(java.awt.Component comp)
          Remove the component
 void setAngle(double d)
          Sets the current rotational angle.
 void setDepthBasedAlpha(boolean depthBasedAlpha)
          Controls if items should fade as they move to the back of the carousel
 void setFrontMostComponent(java.awt.Component component)
          Moves the specified component to the front
 void setNeutralContentWidth(int neutralContentWidth)
          Specify the neutral content width of any laid out component.
protected  void setTarget(double target)
          Sets a target angle to rotate to, always choses a direction that is less than or equal to 180 degrees
protected  boolean shouldHide(java.awt.Component comp, double angle, double s)
          Can be over-ridden to restrict the range of angles where the child component is shown
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

numberOfItems

protected int numberOfItems
Number of items in the carousel (that are visible)


components

protected java.util.LinkedList<java.awt.Component> components
List of components being laid out


additionalData

protected java.util.Hashtable additionalData
List of additional information held on components in the carousel


rotationalOffset

protected double rotationalOffset
The current degree of rotation of the carousel


targetOffset

protected double targetOffset
The desired rotational offset, which will be moved to by a timer animating the carousel

Constructor Detail

CaroselLayout

public CaroselLayout(java.awt.Container forContainer)
Creates a new instance of the layout engine, tied to the specified container.

Parameters:
forContainer - The container the layout will layout
Method Detail

setNeutralContentWidth

public void setNeutralContentWidth(int neutralContentWidth)
Specify the neutral content width of any laid out component.

Parameters:
neutralContentWidth - The neutral width of components

moveComponentTo

public void moveComponentTo(int i,
                            java.awt.Component comp)
Moves a layout component at a particular location in the carousel

Parameters:
i - The location at which to insert
comp - The component to insert

addLayoutComponent

public void addLayoutComponent(java.lang.String name,
                               java.awt.Component comp)
Name is ignored

Specified by:
addLayoutComponent in interface java.awt.LayoutManager
Parameters:
name - The name of the component, ignored.
comp - The component being added

removeLayoutComponent

public void removeLayoutComponent(java.awt.Component comp)
Remove the component

Specified by:
removeLayoutComponent in interface java.awt.LayoutManager
Parameters:
comp - The component being removed

getPosition

protected contrib.com.blogofbug.swing.layout.CaroselLayout.CaroselPosition getPosition(java.awt.Component comp)
Gets the additional data stored by the layout manager for a given component

Parameters:
comp - The component you wish retreive the data for
Returns:
A position, which is added if it does not already exist. Never null unless you run out of memory!

recalculateVisibleItems

protected int recalculateVisibleItems()
Determines how many of the items being laid out are currently visible.

Returns:
How many of the items in the carousel are currently visible.

recalculateCarosel

protected void recalculateCarosel()
Updates all of the positions of the carousel. Does not do a repaint, just does the math ready for the next one.


minimumLayoutSize

public java.awt.Dimension minimumLayoutSize(java.awt.Container parent)
Cheats and bases it's size on the prefered sizes of each component

Specified by:
minimumLayoutSize in interface java.awt.LayoutManager
Parameters:
parent - The container interested in the layout size
Returns:
The minimum size of the layout. See above.

preferredLayoutSize

public java.awt.Dimension preferredLayoutSize(java.awt.Container parent)
Determine the widest and tallest dimensions, then return the height as 1.5 * the highest, and 3 * the widest

Specified by:
preferredLayoutSize in interface java.awt.LayoutManager
Parameters:
parent - The container for the layout
Returns:
The prefered size of the layout

calculateCenter

protected java.awt.Point calculateCenter(java.awt.Insets insets,
                                         int width,
                                         int height,
                                         int widest)
Determines the center of the carousel

Parameters:
insets - The insets of the container
width - The width of the container
height - The height of the container
widest - The widest component
Returns:
A point at the center of the carousel

setDepthBasedAlpha

public void setDepthBasedAlpha(boolean depthBasedAlpha)
Controls if items should fade as they move to the back of the carousel

Parameters:
depthBasedAlpha - True if they should fade, false if they shouldn't

shouldHide

protected boolean shouldHide(java.awt.Component comp,
                             double angle,
                             double s)
Can be over-ridden to restrict the range of angles where the child component is shown

Parameters:
comp - Controls if components are hidden or not, in the case of this layout it always returns false
angle - The angle of the component under consideration
s - The scale of the component under consideration
Returns:
false if the component should not be shown

getCarouselRadius

protected java.awt.Dimension getCarouselRadius(java.awt.Container target,
                                               java.awt.Insets insets,
                                               int width,
                                               int height,
                                               int widestComponent)
Determines the correct size of the carousel for the container

Parameters:
target - The target container
insets - Insets into the target container
width - Width of the target container
height - Height of the target container
widestComponent - The widest component in the container
Returns:
The

getScale

protected double getScale(double angle,
                          double x,
                          double y,
                          double carouselX,
                          double carouselY)
Determines the scale to be applied to the component. The default calculation divides the y co-ordinate by the y-cordinate of the centre. Other implimentations may use some of the other parameters

Parameters:
angle - The angle of the component
x - The x-position of the component
y - The y-position of the component
carouselX - The x centre of the carousel
carouselY - The y centre of the carousel
Returns:
A double which will be used to scale x and y co-ordinates

layoutContainer

public void layoutContainer(java.awt.Container target)
Lays out all of the components on the carosel. Using the preferred width and height to base scaling on

Specified by:
layoutContainer in interface java.awt.LayoutManager
Parameters:
target - The container currently being laid out

getAngle

public double getAngle()
Returns the current rotational angle

Returns:
The current rotated angle in radians

setAngle

public void setAngle(double d)
Sets the current rotational angle. Will not cause an animation to start

Parameters:
d - The desired angle in radians

isAnimating

protected boolean isAnimating()
Determines if an animation is currently playing

Returns:
true if it is animating, false if it isn't

actionPerformed

public void actionPerformed(java.awt.event.ActionEvent actionEvent)
Manages timer actions, terminating the timer if any event is fully achieved

Specified by:
actionPerformed in interface java.awt.event.ActionListener
Parameters:
actionEvent - the action event, although this will always be the timer

finalizeLayoutImmediately

public void finalizeLayoutImmediately()
Moves everything to their "target" positions, without animating anything


setTarget

protected final void setTarget(double target)
Sets a target angle to rotate to, always choses a direction that is less than or equal to 180 degrees

Parameters:
target - The target angle in radians

setFrontMostComponent

public void setFrontMostComponent(java.awt.Component component)
Moves the specified component to the front

Parameters:
component - The component move to the front

getPreviousComponent

public java.awt.Component getPreviousComponent(java.awt.Component component)
Retrieve the component before the specified one. It does not filter out invisible ones.

Parameters:
component - The component you are looking for the one before for.
Returns:
The component before it

getNextComponent

public java.awt.Component getNextComponent(java.awt.Component component)
Retrieve the component after the specified one. It does not filter out invisible ones.

Parameters:
component - The component
Returns:
The one after it

getComponentCount

public int getComponentCount()
The number of components being laid out. Does not included hidden ones

Returns:
The number of components

getComponentIndex

public int getComponentIndex(java.awt.Component comp)
Gets the index of the supplied component

Parameters:
comp - The component
Returns:
The index

getNeutralContentWidth

public int getNeutralContentWidth()
The size of comopnents a neutral width

Returns:
The size of components at neutral width (scale 1.0)