package org.bbssh.ui.components;
import java.util.Vector;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.DrawStyle;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.component.ListField;
import net.rim.device.api.ui.component.ListFieldCallback;
import org.bbssh.model.ConnectionManager;
import org.bbssh.model.ConnectionProperties;
import org.bbssh.net.session.Session;
import org.bbssh.platform.PlatformServicesProvider;
import org.bbssh.session.RemoteSessionInstance;
import org.bbssh.session.SessionManager;
import org.bbssh.util.Tools;
public class ConnectionListfieldCallback implements ListFieldCallback {
private final int ROW_HEIGHT;
private final int ICON_SIZE;
private final int RESERVE_SIZE;
private static Bitmap iconNotConnected;
private static Bitmap iconConnected;
private static Bitmap iconConnecting;
private static Bitmap iconDisconnected;
private static Bitmap iconError;
private static Bitmap iconNotify;
private Vector activeConnList;
private Vector getList() {
if (activeConnList != null) {
return activeConnList;
}
return ConnectionManager.getInstance().getConnections();
}
public ConnectionListfieldCallback(Vector list, boolean forceSmall) {
this(forceSmall);
activeConnList = list;
}
public ConnectionListfieldCallback(boolean forceSmall) {
if (forceSmall || Display.getWidth() < 300) {
ROW_HEIGHT = 18;
ICON_SIZE = 12;
} else if (PlatformServicesProvider.getInstance().hasTouchscreen()) {
ROW_HEIGHT = 30;
ICON_SIZE = 24;
} else {
ROW_HEIGHT = 24;
ICON_SIZE = 18;
}
RESERVE_SIZE = ICON_SIZE + 6;
if (iconNotConnected == null) {
iconNotConnected = Tools.scaleImage("notconnected-icon.png",
ICON_SIZE, ICON_SIZE).getBitmap();
iconConnected = Tools.scaleImage("connected-icon.png", ICON_SIZE,
ICON_SIZE).getBitmap();
iconConnecting = Tools.scaleImage("connecting-icon.png", ICON_SIZE,
ICON_SIZE).getBitmap();
iconDisconnected = Tools.scaleImage("disconnected-icon.png",
ICON_SIZE, ICON_SIZE).getBitmap();
iconError = Tools
.scaleImage("error-icon.png", ICON_SIZE, ICON_SIZE)
.getBitmap();
iconNotify = Tools.scaleImage("notification-icon.png", ICON_SIZE,
ICON_SIZE).getBitmap();
}
}
public void drawListRow(ListField listField, Graphics graphics, int index,
int y, int width) {
Vector v = getList();
if (index < 0 || index >= v.size())
return;
Object o = v.elementAt(index);
ConnectionProperties prop = null;
RemoteSessionInstance inst = null;
if (o instanceof ConnectionProperties) {
prop = (ConnectionProperties)o;
inst = SessionManager.getInstance().getFirstSession(prop);
} else if (o instanceof RemoteSessionInstance) {
inst = (RemoteSessionInstance)o;
prop = ((RemoteSessionInstance) o).session.getProperties();
}
drawConnectionDetail(listField, prop, inst, graphics, y, width, index);
}
public Object get(ListField listField, int index) {
Vector v = getList();
if (index < 0 || index >= v.size())
return null;
return v.elementAt(index);
}
public int getPreferredWidth(ListField listField) {
Vector v = getList();
Font f = listField.getFont();
int max = listField.getWidth();
// not determined yet.
if (max == 0) {
max = Display.getWidth();
}
int advance = 0;
for (int x = v.size(); x > -1; x--) {
Math.max(advance, f.getAdvance(v.elementAt(x).toString()));
if (advance + RESERVE_SIZE > max)
return max;
}
return advance;
}
public int indexOfList(ListField listField, String prefix, int start) {
return 0;
}
private void drawConnectionDetail(ListField listField,
ConnectionProperties p, RemoteSessionInstance i, Graphics g, int y,
int width, int index) {
// not connected means that there simply is no connection present for
// this session.
Bitmap stateIcon = iconNotConnected;
int iconY = y + (ROW_HEIGHT / 2) - (ICON_SIZE / 2);
int reservedSize = ICON_SIZE + 6;
// Determine if we need notification icons, and how much space to save
// for them.
int reserved = reservedSize;
Bitmap bmp1 = null;
Bitmap bmp2 = null;
if (i != null && i.state != null) {
if (i.state.notified) {
bmp1 = iconNotify;
reserved += RESERVE_SIZE;
}
if (i.state.error) {
bmp2 = iconError;
reserved += RESERVE_SIZE;
}
}
if (i != null) {
switch (i.session.getConnectionState()) {
case Session.CONNSTATE_CONNECTED:
stateIcon = iconConnected;
break;
case Session.CONNSTATE_CONNECTING:
case Session.CONNSTATE_DISCONNECTING:
stateIcon = iconConnecting; // not a typo
break;
case Session.CONNSTATE_DISCONNECTED:
default:
stateIcon = iconDisconnected;
break;
}
}
// Draw text, to a max width of what is provided to us less what we need
// to save for our notification icons
// Use the full field widht, and not the row width - as it seems
// sometimes the row with can be offset.
g.drawText(p.getName(), 0, y + (ROW_HEIGHT / 2)
- (listField.getFont().getHeight() / 2), DrawStyle.ELLIPSIS,
width - reserved);
// Finally draw our notification icons, if any.
if (bmp1 != null) {
g.drawBitmap(width - reserved, iconY, ICON_SIZE, ICON_SIZE, bmp1,
0, 0);
reserved -= RESERVE_SIZE;
}
if (bmp2 != null) {
g.drawBitmap(width - reserved, iconY, ICON_SIZE, ICON_SIZE, bmp2,
0, 0);
reserved -= RESERVE_SIZE;
}
// Always draw this last - it will align to the right edge in all cases.
g.drawBitmap(width - reserved, iconY, ICON_SIZE, ICON_SIZE, stateIcon,
0, 0);
}
public int getRowHeight() {
return ROW_HEIGHT;
}
}