FileDocCategorySizeDatePackage
TitleLayer.javaAPI DocphoneME MR2 API (J2ME)5032Wed May 02 18:00:20 BST 2007com.sun.midp.chameleon.layers

TitleLayer.java

/*
 *  
 *
 * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt).
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions.
 */

package com.sun.midp.chameleon.layers;

import com.sun.midp.lcdui.Text;
import com.sun.midp.chameleon.CLayer;
import javax.microedition.lcdui.*;
import com.sun.midp.chameleon.skins.ScreenSkin;
import com.sun.midp.chameleon.skins.TitleSkin;

/**
 * A basic "title" layer. This layer holds a screens title information.
 */
public class TitleLayer extends CLayer {

    /** The text to draw as the title */
    protected String title;

    /** This is the anchor position for the title */
    protected int titlex, titley, titlew, titleh;
    
    /**
     * Construct a new TitleLayer. This will construct a new layer using
     * the background image and color settings as defined in the TitleSkin.
     */
    public TitleLayer() {
        super(TitleSkin.IMAGE_BG, TitleSkin.COLOR_BG);
    }

    /**
     * The TitleLayer overrides the initialize method in order to locate
     * the title layer in the window at the position and dimensions defined
     * in the TitleSkin.
     */
    protected void initialize() {
        super.initialize();

       setAnchor();
    }

    /**
     * Sets the anchor constraints for rendering operation.
     */
    public void setAnchor() {
        bounds[X] = 0;
        bounds[Y] = 0;
        bounds[W] = ScreenSkin.WIDTH;
        bounds[H] = TitleSkin.HEIGHT;
        titlex = 0;
    }


    /**
     * Set the title of this title layer.
     *
     * @param title the text to draw as the title
     * @return true if visability of layer was changed
     */
    public boolean setTitle(String title) {
        boolean oldVisible = this.visible;
        this.title = title;

        setDirty();
        this.visible = (title != null);

        // force a re-calc of the text anchor location
        titlex = 0;
        return (oldVisible != this.visible);
    }

    /**
     * Get the title of this layer.
     *
     * @return the title of this layer, or null if this TitleLayer has no
     *         title set.
     */
    public String getTitle() {
        return title;
    }

    /**
     * Draw the body of this layer. This method uses settings in the
     * TitleSkin to render the title at the correct location using
     * specified font and color values.
     *
     * @param g the Graphics to draw to
     */
    protected void paintBody(Graphics g) {
        String title = this.title;
        if (title == null) {
            return;
        }

        if (titlex == 0) {
            // anchor isn't set yet
            titlew = TitleSkin.FONT.stringWidth(title);
            if (titlew > (ScreenSkin.WIDTH - (2 * TitleSkin.MARGIN))) {
                titlew = ScreenSkin.WIDTH - (2 * TitleSkin.MARGIN);
            }            
            
            switch (TitleSkin.TEXT_ALIGN_X) {
                case Graphics.HCENTER:
                    titlex = (ScreenSkin.WIDTH - titlew) / 2;
                    break;
                case Graphics.RIGHT:
                    titlex = 
                        (ScreenSkin.WIDTH - TitleSkin.MARGIN - titlew);
                    break;
                case Graphics.LEFT:
                default:
                    titlex = TitleSkin.MARGIN;
                    break;
            }
            
            // We center the title vertically in the
            // space provided
            titleh = TitleSkin.FONT.getHeight();
            if (titleh < TitleSkin.HEIGHT) {
                titley = (TitleSkin.HEIGHT - titleh) / 2;
            } else {
                titley = 0;
            }
        }

        g.translate(titlex, titley);
        Text.drawTruncStringShadowed(g, title, TitleSkin.FONT, TitleSkin.COLOR_FG,
                TitleSkin.COLOR_FG_SHD, TitleSkin.TEXT_SHD_ALIGN,
                titlew);
        g.translate(-titlex, -titley);
    }

    /**
     * Update bounds of layer
     * @param layers - current layer can be dependant on this parameter
     */
    public void update(CLayer[] layers) {
        super.update(layers);
        setAnchor();
    }

}