package com.rapidftr.screens; import net.rim.device.api.system.Characters; import net.rim.device.api.ui.Field; import net.rim.device.api.ui.FieldChangeListener; import net.rim.device.api.ui.Manager; import net.rim.device.api.ui.MenuItem; 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.ObjectChoiceField; 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 com.rapidftr.controllers.ManageChildController; import com.rapidftr.controls.BlankSeparatorField; import com.rapidftr.controls.FormFieldFactory; import com.rapidftr.controls.UIForms; import com.rapidftr.form.Forms; import com.rapidftr.model.Child; import com.rapidftr.screens.internal.CustomScreen; import com.rapidftr.utilities.DateFormatter; import com.rapidftr.utilities.ImageCaptureListener; import com.rapidftr.utilities.SaveDialog; public class ManageChildScreen extends CustomScreen { private Forms forms; private Manager screenManager; private final DateFormatter dateFormatter; private String selectedTab; public ManageChildScreen(DateFormatter dateFormatter) { this.dateFormatter = dateFormatter; } public void setUp() { createScreenLayout(); } public void setForms(Forms forms) { setForms(forms, null); } public void setForms(Forms forms, String selectedTab) { this.forms = forms; this.selectedTab = selectedTab; } private void createScreenLayout() { deleteScreenManager(); screenManager = new VerticalFieldManager(); screenManager.add(prepareTitleManager()); screenManager.add(new SeparatorField()); add(screenManager); final UIForms uiForms = new UIForms(forms, new FormFieldFactory(), getController().getChild()); final Manager formManager = new HorizontalFieldManager(FIELD_LEFT); formManager.add(uiForms.getDefaultForm()); final Manager formsManager = new HorizontalFieldManager(FIELD_HCENTER); final ObjectChoiceField availableForms = new ObjectChoiceField( "Choose form: ", uiForms.getFormNames()); formsManager.add(availableForms); screenManager.add(formsManager); screenManager.add(new SeparatorField()); screenManager.add(formManager); availableForms.setChangeListener(new FieldChangeListener() { public void fieldChanged(Field field, int context) { formManager.deleteAll(); formManager.add(uiForms.formAt(availableForms.getSelectedIndex())); } }); availableForms.setSelectedIndex(uiForms.getIndexByName(selectedTab)); screenManager.add(new BlankSeparatorField(15)); } private Manager prepareTitleManager() { Manager titleManager = new HorizontalFieldManager(FIELD_HCENTER); titleManager.add(new LabelField(getController().getScreenTitle())); return titleManager; } private void deleteScreenManager() { try { delete(screenManager); } catch (Exception ignored) { } } public void takePhoto(ImageCaptureListener imageCaptureListener) { getController().takeSnapshotAndUpdateWithNewImage(imageCaptureListener); } public boolean onClose() { return new SaveDialog((ManageChildController)controller).show(this); } protected void onMainMenuClick() { new SaveDialog((ManageChildController)controller).show(this); } abstract class ControllerAction { abstract void execute(); } public ManageChildController getController() { return ((ManageChildController) controller); } protected void makeMenu(Menu menu, int instance) { if (forms.isNotEmpty()) { MenuItem saveChildMenu = new MenuItem("Save Child ", 1, 1) { public void run() { if (!getController().validateOnSave(forms, dateFormatter)) { return; } getController().viewChild(); getController().setChild(null); } }; menu.add(saveChildMenu); } addSyncFailedErrorMenuItem(menu); super.makeMenu(menu, instance); } private void addSyncFailedErrorMenuItem(Menu menu) { final Child childToEdit = getController().getChild(); if (childToEdit != null && childToEdit.isSyncFailed()) { MenuItem syncFailesErrorMenu = new MenuItem("Sync Error ", 2, 2) { public void run() { Dialog.alert(childToEdit.childStatus().getSyncError()); } }; menu.add(syncFailesErrorMenu); } } public boolean keyChar(char key, int status, int time) { if (key == Characters.ESCAPE) { return onClose(); } return super.keyChar(key, status, time); } public boolean keyDown(int keycode, int time) { if (keycode == Characters.ESCAPE) { return onClose(); } return super.keyDown(keycode, time); } public Forms getForms() { return forms; } public DateFormatter getDateFormatter() { return dateFormatter; } }