package com.rapidftr.screens;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.io.Connector;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.EncodedImage;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
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.MenuItem;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.XYEdges;
import net.rim.device.api.ui.component.BitmapField;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.component.SeparatorField;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.container.VerticalFieldManager;
import net.rim.device.api.ui.decor.BackgroundFactory;
import net.rim.device.api.ui.decor.Border;
import net.rim.device.api.ui.decor.BorderFactory;
import com.rapidftr.controllers.ViewChildController;
import com.rapidftr.controls.Button;
import com.rapidftr.controls.Tab;
import com.rapidftr.controls.TabsField;
import com.rapidftr.form.Form;
import com.rapidftr.form.FormAction;
import com.rapidftr.form.Forms;
import com.rapidftr.model.Child;
import com.rapidftr.model.ChildStatus;
import com.rapidftr.screens.internal.CustomScreen;
import com.rapidftr.utilities.BoldRichTextField;
import com.rapidftr.utilities.ImageUtility;
public class ViewChildScreen extends CustomScreen {
Child child;
BitmapField bitmapField;
boolean isBitmapFieldFocused = false;
private Forms forms;
private TabsField tabsField;
public ViewChildScreen() {
}
public void setChild(Child child, Forms forms) {
this.child = child;
this.forms = forms;
}
protected void onExposed() {
setUp();
}
public void setUp() {
clearFields();
this.add(renderTitleField());
this.add(new SeparatorField());
renderChildFields(child);
renderFormFields(child);
}
private HorizontalFieldManager renderTitleField() {
HorizontalFieldManager titleManager = new HorizontalFieldManager(
USE_ALL_WIDTH);
titleManager.setPadding(new XYEdges(2, 2, 2, 0));
titleManager.add(new LabelField("Child Details"));
VerticalFieldManager titleSyncStatusManager = new VerticalFieldManager(
USE_ALL_WIDTH);
ChildStatus childSyncStatus = child.childStatus();
String syncMessage = child.childStatus().getStatusString();
LabelField syncStatus = new LabelField(syncMessage, FIELD_RIGHT) {
protected void paint(Graphics graphics) {
graphics.setColor(Color.WHITE);
super.paint(graphics);
}
};
XYEdges labelEdges = new XYEdges(1, 1, 1, 1);
syncStatus.setBorder(BorderFactory.createBevelBorder(labelEdges));
syncStatus.setBackground(BackgroundFactory
.createSolidBackground(childSyncStatus.getStatusColor()));
titleSyncStatusManager.add(syncStatus);
titleManager.add(titleSyncStatusManager);
return titleManager;
}
private void renderChildFields(final Child child) {
final HorizontalFieldManager horizontalFieldManager = new HorizontalFieldManager(
Manager.HORIZONTAL_SCROLLBAR | Manager.USE_ALL_WIDTH);
renderBitmap(horizontalFieldManager, child
.getField("current_photo_key"));
String uniqueIdentifier = child.getField("unique_identifier");
uniqueIdentifier = (null == uniqueIdentifier) ? "" : uniqueIdentifier;
VerticalFieldManager verticalFieldManager = new VerticalFieldManager();
verticalFieldManager.add(BoldRichTextField.getSemiBoldRichTextField(
" ", uniqueIdentifier));
if (child.getCreatedBy() != null) {
verticalFieldManager.add(getRegisteredByControl());
}
LabelField emptyLineAfterUID = new LabelField("");
emptyLineAfterUID.select(false);
add(emptyLineAfterUID);
if ("true".equals(child.getField(Child.FLAGGED_KEY))) {
verticalFieldManager.add(getFlaggedByControl());
}
horizontalFieldManager.add(verticalFieldManager);
add(horizontalFieldManager);
}
private Field getFlaggedByControl() {
LabelField label = new LabelField("Record flagged as possibly suspect or duplicate by " + child.flaggedByUserName() + ": " + child.flagInformation());
return label;
}
private Field getRegisteredByControl() {
LabelField label = new LabelField("Registered by "
+ child.getCreatedBy());
if (child.hasChangesByOtherThan(child.getCreatedBy())) {
VerticalFieldManager manager = new VerticalFieldManager();
manager.add(label);
Button othersButton = new Button("and others");
othersButton.setChangeListener(new FieldChangeListener() {
public void fieldChanged(Field field, int i) {
getViewChildController().showHistory(child);
}
});
manager.add(othersButton);
return manager;
}
return label;
}
private void renderFormFields(final Child child) {
tabsField = new TabsField();
forms.forEachForm(new FormAction() {
public void execute(Form form) {
tabsField.addTab(new Tab(form.toString(), form, child));
}
});
this.add(tabsField.draw());
}
private void renderBitmap(HorizontalFieldManager manager,
String currentPhotoKey) {
manager.setMargin(10, 10, 10, 10);
Bitmap image = getChildImage(currentPhotoKey);
if (image == null) {
image = getChildImage("res/default.jpg");
}
final BitmapField bitmapField = new BitmapField(image,
BitmapField.FOCUSABLE);
bitmapField.select(true);
bitmapField.setFocusListener(new FocusChangeListener() {
public void focusChanged(Field field, int eventType) {
if (eventType == FOCUS_GAINED) {
isBitmapFieldFocused = true;
Border blueBorder = BorderFactory.createSimpleBorder(
new XYEdges(2, 2, 2, 2), new XYEdges(Color.BLUE,
Color.BLUE, Color.BLUE, Color.BLUE),
Border.STYLE_SOLID);
bitmapField.setBorder(blueBorder);
} else if (eventType == FOCUS_LOST) {
isBitmapFieldFocused = false;
bitmapField.setBorder(null);
}
}
});
manager.add(bitmapField);
}
protected boolean trackwheelClick(int status, int time) {
if (isBitmapFieldFocused) {
((ViewChildController) controller).viewChildPhoto(child);
return false;
}
return true;
}
private ViewChildController getViewChildController() {
return ((ViewChildController) controller);
}
protected void makeMenu(Menu menu, int instance) {
MenuItem editChildMenu = new MenuItem("Edit Child Detail", 1, 1) {
public void run() {
controller.popScreen();
getViewChildController().editChild(child,
tabsField.getSelectedTab());
}
};
MenuItem photoMenu = new MenuItem("View Child Photo", 2, 1) {
public void run() {
getViewChildController().viewChildPhoto(child);
}
};
MenuItem historyMenu = new MenuItem("View The Change Log", 2, 1) {
public void run() {
getViewChildController().showHistory(child);
}
};
MenuItem syncChildMenu = new MenuItem("Synchronise this Record", 2, 1) {
public void run() {
getViewChildController().syncChild(child);
}
};
MenuItem flagRecordAsSuspectMenu;
if ("true".equals(child.getField(Child.FLAGGED_KEY))) {
flagRecordAsSuspectMenu = new MenuItem("Flag Information", 2, 1) {
public void run() {
Dialog.alert(child.flagInformation());
}
};
} else {
flagRecordAsSuspectMenu = new MenuItem("Flag Record As Suspect", 2, 1) {
public void run() {
getViewChildController().flagRecord(child);
}
};
}
menu.add(editChildMenu);
menu.add(photoMenu);
menu.add(syncChildMenu);
menu.add(flagRecordAsSuspectMenu);
if (child.isSyncFailed()) {
MenuItem syncMenu = new MenuItem("Sync Errors", 2, 1) {
public void run() {
UiApplication.getUiApplication().invokeLater(
new Runnable() {
public void run() {
Dialog.alert(child.childStatus()
.getSyncError());
}
});
}
};
menu.add(syncMenu);
}
menu.add(historyMenu);
super.makeMenu(menu, instance);
}
private Bitmap getChildImage(String ImagePath) {
try {
InputStream inputStream = Connector.openInputStream(ImagePath);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int i = 0;
while ((i = inputStream.read()) != -1) {
outputStream.write(i);
}
byte[] data = outputStream.toByteArray();
EncodedImage eimg = EncodedImage.createEncodedImage(data, 0,
data.length);
Bitmap image = eimg.getBitmap();
inputStream.close();
return ImageUtility.resizeBitmap(image, 70, 70);
} catch (IOException e) {
return null;
} catch (IllegalArgumentException ex) {
return null;
}
}
}