/*
* Copyright © 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.favouriteartists;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import com.nokia.example.favouriteartists.tool.Log;
import com.nokia.example.favouriteartists.tool.Util;
/**
* Represents a single item in the list, responsible for drawing item contents.
*/
public class ListItem {
// Constants
/** Vertical padding. */
protected static final int V_PAD = 2;
/** Horizontal padding. */
protected static final int H_PAD = 2;
/** Maximum width of icon */
protected static final int ICON_MAX_W = 48;
/** Maximum height of icon */
protected static final int ICON_MAX_H = 48;
/** Margin between icon and title text */
protected static final int ICON_TEXT_MARGIN = 4;
/** One row item */
protected static final int TYPE_ONE_ROW = 1;
/** Two row item */
protected static final int TYPE_TWO_ROW = 2;
/** Icon on the left */
protected static final int TYPE_ICON_LEFT = 4;
/** Icon on the right */
protected static final int TYPE_ICON_RIGHT = 8;
// Member data
private Display display;
private String text1;
private String text2;
private Image icon;
private int itemType;
private int width = 0;
private int height = 0;
private boolean selected = false;
// Methods
/**
* Constructor.
*
* @param display For retrieving colors.
* @param text1 Text 1 (e.g. top row text)
* @param text2 Text 2 (e.g. bottom row text)
* @param icon Image to use for icon.
* @param itemType Item type.
*/
public ListItem(Display display, String text1, String text2,
Image icon, int itemType, int width, int height) {
if (Log.TEST) Log.note("[ListItem#ListItem]-->");
this.display = display;
this.text1 = text1;
this.text2 = text2;
this.icon = icon;
this.itemType = itemType;
this.height = height;
this.width = width;
}
/**
* Setter for width.
*
* @param width
*/
public void setWidth(int width) {
this.width = width;
}
/**
* Getter for text1.
*
* @return text1
*/
public String getText1() {
return text1;
}
/**
* Setter for text1
*
* @param text1
*/
public void setText1(String text1){
this.text1 = text1;
}
/**
* Getter for text2.
*
* @return text2
*/
public String getText2() {
return text2;
}
/**
* Setter for text2
*
* @param text2
*/
public void setText2(String text2){
this.text2 = text2;
}
/**
* Setter for icon.
*
* @param icon
*/
public void setIcon(Image icon){
this.icon = icon;
}
/**
* Set the item as selected, affects drawing of the item.
*
* @param selected
*/
public void setSelected(boolean selected) {
this.selected = selected;
}
/**
* Draws the item.
*
* @param g Graphics context.
* @param yOffset Y-offset to draw from.
*/
public void paint(Graphics g, final int yOffset) {
if (Log.TEST) Log.note("[ListItem#paint]-->");
int y = yOffset;
if (Log.TEST) Log.note("[ListItem#paint] y: " + y);
// First draw the underlying rect, and get color for text drawing
if (selected) {
g.setColor(display.getColor(Display.COLOR_HIGHLIGHTED_BACKGROUND));
g.fillRect(0, y, width, height);
g.setColor(display.getColor(Display.COLOR_HIGHLIGHTED_FOREGROUND));
} else {
g.setColor(display.getColor(Display.COLOR_FOREGROUND));
}
y += V_PAD;
int x = H_PAD;
int[] contentsRect = {x, y, width - 2 * H_PAD, height - 2 * V_PAD};
drawContents(g, contentsRect );
// Get border color
if (selected) {
g.setColor(display.getColor(Display.COLOR_HIGHLIGHTED_BORDER));
} else {
// g.setColor(display.getColor(Display.COLOR_BORDER));
g.setColor(~display.getColor(Display.COLOR_BACKGROUND));
}
// Draw border
g.drawLine(0, yOffset + height, width, yOffset + height);
if (Log.TEST) Log.note("[ListItem#paint]<--");
}
/**
* Draws item contents.
*
* @param g Graphics context.
* @param rect Rectangle to draw in.
*/
protected void drawContents(Graphics g, int[] rect){
if (Log.TEST) Log.note("[ListItem#drawContents]-->");
// First draw icon
int[] remainderRect = drawIcon(g, rect);
if((itemType & TYPE_TWO_ROW) > 0){
// Draw top row
int topRowHeight = drawTopRow(g, remainderRect, false);
// Update remainder rect accordingly
remainderRect[1] += topRowHeight; // y
remainderRect[3] -= topRowHeight; // height
// Last, draw bottom row
drawBottomRow(g, remainderRect);
} else {
// Draw top row
drawTopRow(g, remainderRect, true);
}
}
/**
* Draws the icon.
*
* @param g Graphics context.
* @param rect Rectangle to draw in
* @return remainder rect.
*/
protected int[] drawIcon(Graphics g, int[] rect){
if (Log.TEST) Log.note("[ListItem#drawIcon]-->");
if(icon == null){
return rect;
}
int x = rect[0];
int y = rect[1];
int width = rect[2];
int height = rect[3];
int iconX = 0;
int remainderX = 0;
int remainderWidth = 0;
if((itemType & TYPE_ICON_LEFT) > 0){
iconX = x;
remainderX = x + ICON_MAX_W + ICON_TEXT_MARGIN;
remainderWidth = width - ICON_MAX_W;
} else if ((itemType & TYPE_ICON_RIGHT) > 0) {
iconX = x + width - ICON_MAX_W;
remainderX = x;
remainderWidth = width - ICON_MAX_W - ICON_TEXT_MARGIN;
}
// Draw the image
Util.drawImageCentered(g, icon, iconX, y, ICON_MAX_W, ICON_MAX_H);
int[] remainderRect = {remainderX,
y,
remainderWidth,
height};
return remainderRect;
}
/**
* Draws the top row.
*
* @param g Graphics context.
* @param rect Rectangle to draw in.
* @param useWholeArea if true then top row will occupy the whole rect.
* @return Height used for top row.
*/
protected int drawTopRow(Graphics g, int[] rect, boolean useWholeArea){
if (Log.TEST) Log.note("[ListItem#drawTopRow]-->");
int x = rect[0];
int y = rect[1];
int width = rect[2];
int height = rect[3];
Font font = null;
if((itemType & TYPE_ONE_ROW) > 0){
font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_LARGE);
} else if ((itemType & TYPE_TWO_ROW) > 0){
font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM);
}
if(!useWholeArea){
height = font.getHeight() + V_PAD * 2;
}
// Draw the text to the middle of the top row
Util.drawStringCenteredAndTruncated(g, text1, font, x, y + V_PAD, width, height, Graphics.TOP | Graphics.LEFT );
return height;
}
/**
* Draws the bottom row.
*
* @param g Graphics context.
* @param rect Rectangle to draw in.
*/
protected void drawBottomRow(Graphics g, int[] rect){
if (Log.TEST) Log.note("[ListItem#drawBottomRow]-->");
int x = rect[0];
int y = rect[1];
int width = rect[2];
int height = rect[3];
Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);
height = font.getHeight() + V_PAD * 2;
// Draw the text to the middle of the bottom row
Util.drawStringCenteredAndTruncated(g, text2, font, x, y + V_PAD, width, height, Graphics.TOP | Graphics.LEFT );
}
/**
* Getter for height.
*
* @return height
*/
public int getHeight() {
return height;
}
}