Thursday, November 11, 2010

Simple Effect

Pivot nicely provides a few nice effects for items. This is useful for images, etc but if you want to make a simple text-based header it needs the tiniest bit of tweaking.
<Label text="Your Title" styles="{font:'Arial bold 36',color:'#a0a0a0'}">
<decorators>
<effects:Reflection/>
</decorators>
</Label>
What we need is to translate the reflection so it overlaps the text a little.
<Label text="Your Title" styles="{font:'Arial bold 36',color:'#a0a0a0'}">
<decorators>
<myeffects:ConfigurableReflection yTranslate="-20"/>
</decorators>
</Label>
We can just modify the Reflection effect and two properties for x & y reflection translation and tweak where the reflection is drawn. Here's the modified ConfigurableReflection class
public class ConfigurableReflection extends ReflectionDecorator {

    private Component component = null;
    private Graphics2D graphics = null;
    private BufferedImage componentImage = null;
    private Graphics2D componentImageGraphics = null;

    private int yTranslate = 0;
    private int xTranslate = 0;

    public void setXTranslate(int xTranslate) {
        this.xTranslate = xTranslate;
    }

    public void setYTranslate(int yTranslate) {
        this.yTranslate = yTranslate;
    }

    public int getXTranslate() {
        return xTranslate;
    }

    public int getYTranslate() {
        return yTranslate;
    }

    

    @Override
    public Graphics2D prepare(Component component, Graphics2D graphics) {
        this.component = component;
        this.graphics = graphics;

        int width = component.getWidth();
        int height = component.getHeight();

        componentImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        componentImageGraphics = componentImage.createGraphics();

        // Clear the image background
        componentImageGraphics.setComposite(AlphaComposite.Clear);
        componentImageGraphics.fillRect(0, 0, componentImage.getWidth(), componentImage.getHeight());

        componentImageGraphics.setComposite(AlphaComposite.SrcOver);

        return componentImageGraphics;
    }

    @Override
    public void update() {
        // Draw the component
        graphics.drawImage(componentImage, 0, 0, null);

        // Draw the reflection
        int width = componentImage.getWidth();
        int height = componentImage.getHeight();

        GradientPaint mask = new GradientPaint(0, height / 4f, new Color(1.0f, 1.0f, 1.0f, 0.0f),
                0, height, new Color(1.0f, 1.0f, 1.0f, 0.5f));
        componentImageGraphics.setPaint(mask);

        componentImageGraphics.setComposite(AlphaComposite.DstIn);
        componentImageGraphics.fillRect(0, 0, width, height);

        componentImageGraphics.dispose();
        componentImageGraphics = null;

        componentImage.flush();

        graphics.transform(getTransform(component));

        graphics.drawImage(componentImage, 0, 0, null);

        componentImage = null;
        component = null;
        graphics = null;
    }

    @Override
    public Bounds getBounds(Component component) {
        // MODIFICATION for new translation
        return new Bounds(0, 0, component.getWidth() + xTranslate, component.getHeight() * 2 + yTranslate);
    }

    @Override
    public AffineTransform getTransform(Component component) {
        AffineTransform transform = AffineTransform.getScaleInstance(1.0, -1.0);
        // MODIFICATION for new translation
        transform.translate(xTranslate, -((component.getHeight() * 2) + yTranslate));

        return transform;
    }
}