CommentDrawer.java
/*
* Copyright © 2011 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.wordpress.components;
import com.nokia.example.wordpress.helpers.TextWrapper;
import com.nokia.example.wordpress.networking.Comment;
import com.nokia.example.wordpress.networking.GetGravatarOperation;
import com.nokia.example.wordpress.views.ViewMaster;
import com.nokia.example.wordpress.views.Visual;
import java.io.ByteArrayInputStream;
import java.util.Hashtable;
import java.util.Vector;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
/**
* A drawer class for rendering the rows in the comments list Visual.
*/
public class CommentDrawer implements ListDrawer {
private final int ROW_HEIGHT = Math.max(3 * Visual.SMALL_FONT.getHeight() + 2, 64 + 2); // 64 is the gravatar size, +2 small margin
private Hashtable gravatarCache;
private Image defaultGravatarIcon;
private ViewMaster view;
private class Icon {
Icon(Image defaultIcon) {
this.image = defaultIcon;
}
Image image = null;
}
public CommentDrawer(ViewMaster view, Hashtable gravatarCache, Image defaultGravatarIcon) {
this.view = view;
this.gravatarCache = gravatarCache;
this.defaultGravatarIcon = defaultGravatarIcon;
}
public int itemHeight() {
return ROW_HEIGHT;
}
/**
* Returns a gravar icon for a comment. Loads from network if not available,
* after loading the main view is refreshed.
* @param comment
* @return
*/
public Image getIcon(Comment comment) {
final String email = comment.author_email.trim();
if (email.equals("")) {
return null;
}
Icon icon = (Icon) gravatarCache.get(email);
if (icon == null) {
icon = new Icon(defaultGravatarIcon);
gravatarCache.put(email, icon);
System.out.println("getting icon for " + email);
GetGravatarOperation.Listener listener = new GetGravatarOperation.Listener() {
public void gravatarReceived(String email, byte[] data) {
try {
System.out.println("got icon for " + email);
Icon icon = (Icon) gravatarCache.get(email);
icon.image = Image.createImage(new ByteArrayInputStream(data));
view.draw();
} catch (java.io.IOException ex) {
System.out.print(ex.getMessage());
}
}
};
GetGravatarOperation op = new GetGravatarOperation(listener, comment.author_email);
op.start();
}
return icon.image;
}
public void drawItem(Vector data, Graphics g, int itemIndex, int x, int y, int width, int height, boolean focused) {
view.drawBackground(g, x, y, width, ROW_HEIGHT, focused);
Comment comment = (Comment) data.elementAt(itemIndex);
Image icon = getIcon(comment);
if (icon != null) {
g.drawImage(icon, 0, y, g.TOP | g.LEFT);
x += icon.getWidth() + 2; // margins
width -= icon.getWidth() + 2; // margins
}
int commentX = x;
g.setColor(Visual.LIST_SECONDARY_COLOR);
g.setFont(Visual.SMALL_FONT);
int linesLeft = 3;
String firstLine = comment.author + " on ";
if(comment.post != null) {
firstLine += comment.post.title;
} else {
//Post not loaded yet. A fixed number of posts were loaded earlier, but not enough it seems.
firstLine += " ";
}
Vector lines = TextWrapper.wrapTextToWidth(firstLine, width, Visual.SMALL_FONT);
g.drawString((String) lines.elementAt(0), commentX, y, g.TOP | g.LEFT);
y += Visual.SMALL_FONT.getHeight();
linesLeft--;
if (lines.size() > 1) {
g.drawString((String) lines.elementAt(1), commentX, y, g.TOP | g.LEFT);
y += Visual.SMALL_FONT.getHeight();
linesLeft--;
}
g.setColor(Visual.LIST_PRIMARY_COLOR);
lines = TextWrapper.wrapTextToWidth(comment.content, width, Visual.SMALL_FONT);
int linesToDraw = Math.min(lines.size(), linesLeft);
for (int i = 0; i < linesToDraw; i++) {
g.drawString((String) lines.elementAt(i), commentX, y, g.TOP | g.LEFT);
y += Visual.SMALL_FONT.getHeight();
}
}
}