AbstractDrawer.java

/**
* Copyright (c) 2012-2013 Nokia Corporation. All rights reserved.
* Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation. 
* Oracle and Java are trademarks or registered trademarks of Oracle and/or its
* affiliates. Other product and company names mentioned herein may be trademarks
* or trade names of their respective owners. 
* See LICENSE.TXT for license information.
*/
package com.nokia.example.attractions.views.list;

import com.nokia.example.attractions.utils.ImageLoader;
import com.nokia.example.attractions.views.ViewMaster;
import com.nokia.example.attractions.Visual;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Vector;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

/**
 * An abstract drawer class for rendering the rows in a list.
 */
public abstract class AbstractDrawer
    implements List.Drawer {

    // 42 is the thumbnail size, minimum height is 48
    private final int ROW_HEIGHT = Math.max(2 * Visual.SMALL_FONT.getHeight()
        + 2, 48);
    private final Image defaultThumbnail;
    private final ViewMaster view;
    protected final Hashtable cache;

    public AbstractDrawer(ViewMaster view, Image defaultThumbnailIcon,
        Hashtable cache) {
        this.view = view;
        this.defaultThumbnail = defaultThumbnailIcon;
        this.cache = cache;
    }

    public final int itemHeight() {
        return ROW_HEIGHT;
    }

    /**
     * Returns a thumbnail for a list item. Loads from network if not available,
     * after loading the main view is refreshed.
     * @param attraction
     * @return
     */
    private Image getThumbnail(Object item) {

        final String url = getThumbnailUrl(item);
        if (url.equals("")) {
            return null;
        }
        try {
            return ImageLoader.getInstance().loadImage(url, cache);
        } catch (IOException ex) {
            ex.printStackTrace();
            return null;
        }
    }

    protected abstract String getThumbnailUrl(Object item);

    public final void drawItem(Vector data, Graphics g, int itemIndex,
        final int x, final int y,
        final int width, final int height, boolean focused) {

        ViewMaster.drawBackground(g, x, y, width, ROW_HEIGHT, focused);

        Object item = data.elementAt(itemIndex);

        int x0 = x + 2; // margins
        int w0 = width;

        Image thumbnail = getThumbnail(item);
        if (thumbnail != null) {
            g.drawImage(thumbnail, x0, y + ROW_HEIGHT / 2,
                Graphics.VCENTER | Graphics.LEFT);
            x0 += thumbnail.getWidth() + 2; // margins
            w0 = width - thumbnail.getWidth() - 2; // margins
        }

        drawText(g, item, x0, y, w0, height);
    }

    protected abstract void drawText(Graphics g, Object item, int x, int y,
        int width, int height);
}