package com.rapidftr.controls;
import java.util.Vector;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FocusChangeListener;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.RichTextField;
import net.rim.device.api.ui.component.SeparatorField;
import com.rapidftr.form.Form;
import com.rapidftr.form.FormField;
import com.rapidftr.form.FormFieldAction;
import com.rapidftr.model.Child;
import com.rapidftr.utilities.BoldRichTextField;
public class Tab implements FocusChangeListener {
private Form form;
private Child child;
private TabLabelField label;
private final TabBodyField body;
private Vector observers = new Vector();
private TabsField canvas;
private Vector toBeIgnored = new Vector() {
{
addElement("histories");
addElement("_id");
addElement("current_photo_key");
}
};
public Tab(String label, Form form, Child child) {
this(form, child, new TabLabelField(label), new TabBodyField());
}
protected Tab(Form form, Child child, TabLabelField label,
TabBodyField bodyField) {
this.form = form;
this.child = child;
this.label = label;
label.addFocusChangeListener(this);
this.body = bodyField;
render();
}
private void render() {
form.forEachField(new FormFieldAction() {
public void execute(FormField field) {
String key = field.getName();
if (!toBeIgnored.contains(key)) {
child.updateField(key);
drawField(body, field, child.getField(key));
}
}
});
}
public void open() {
label.select();
canvas.setBody(body);
}
public void close() {
label.deSelect();
canvas.clearBody();
}
public void setCanvas(TabsField canvas) {
this.canvas = canvas;
this.canvas.addHandle(label);
}
public void addTabChangeListener(FocusChangeListener observer) {
observers.addElement(observer);
}
private void drawField(final Manager renderingArea, FormField field,
String value) {
Field detail = null;
if (isNotEmpty(value)) {
detail = createEmptyRecord(field);
} else {
detail = createRecordWithValue(field, value);
}
renderingArea.add(detail);
renderingArea.add(new SeparatorField());
}
private RichTextField createRecordWithValue(FormField field, String value) {
return BoldRichTextField
.getSemiBoldRichTextField(drawKey(field), value);
}
private LabelField createEmptyRecord(FormField field) {
return new LabelField(drawKey(field), LabelField.FOCUSABLE) {
protected void paint(Graphics graphics) {
graphics.setColor(Color.GRAY);
super.paint(graphics);
}
};
}
private boolean isNotEmpty(String value) {
return value.trim().equals("");
}
private String drawKey(FormField field) {
return field.getDisplayName() + " : ";
}
private void notifyObservers(Field field, int eventType) {
for (int i = 0; i < observers.size(); i++) {
((FocusChangeListener) observers.elementAt(i)).focusChanged(field,
eventType);
}
}
public void focusChanged(Field field, int eventType) {
notifyObservers(field, eventType);
}
public String getLabel() {
return label.getText().trim();
}
}