package com.rapidftr.screens;
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.UiApplication;
import net.rim.device.api.ui.XYEdges;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.GaugeField;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.decor.BorderFactory;
import com.rapidftr.controllers.SyncController;
import com.rapidftr.controls.Button;
import com.rapidftr.process.Process;
import com.rapidftr.screens.internal.CustomScreen;
import com.rapidftr.services.ScreenCallBack;
import com.rapidftr.utilities.Settings;
public class SyncScreen extends CustomScreen implements FieldChangeListener,
ScreenCallBack {
// Model
Process process;
private static final XYEdges PADDING = new XYEdges(10, 10, 10, 10);
private Button okButton;
private GaugeField downloadProgressBar;
private Manager hButtonManager;
private Button cancelButton;
LabelField labelField;
private Settings settings;
public SyncScreen(Settings settings) {
this.settings = settings;
layoutScreen();
}
private void layoutScreen() {
try {
labelField = new LabelField("Syncinging ...");
Manager hManager = new HorizontalFieldManager(FIELD_HCENTER);
hManager.add(labelField);
hManager.setPadding(PADDING);
add(hManager);
Manager hGaugeManager = new HorizontalFieldManager(FIELD_HCENTER);
downloadProgressBar = new GaugeField("", 0, 100, 0,
GaugeField.LABEL_AS_PROGRESS);
downloadProgressBar.setBorder(BorderFactory
.createSimpleBorder(new XYEdges(1, 1, 1, 1)));
hGaugeManager.add(downloadProgressBar);
hGaugeManager.setPadding(PADDING);
add(hGaugeManager);
hButtonManager = new HorizontalFieldManager(FIELD_HCENTER);
add(hButtonManager);
hButtonManager.setPadding(PADDING);
okButton = new Button("Ok");
okButton.setChangeListener(this);
cancelButton = new Button("Cancel");
cancelButton.setChangeListener(this);
} catch (Exception e) {
e.printStackTrace();
}
}
public void setUp() {
labelField.setText(process.name());
onProcessStart();
}
public void fieldChanged(Field field, int context) {
if (field.equals(okButton)) {
controller.popScreen();
return;
}
if (field.equals(cancelButton)) {
int result = Dialog.ask(Dialog.D_YES_NO,
"Are you sure want to cancel " + process.name() + "?");
if (result == Dialog.YES) {
process.stopProcess();
controller.popScreen();
return;
}
}
}
public void onAuthenticationFailure() {
}
public boolean onClose() {
process.stopProcess();
return super.onClose();
}
public void onConnectionProblem() {
onProcessFail("Connection Problem");
}
public void updateProgress(final int size) {
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
try{
downloadProgressBar.setValue(size);
}catch (Exception ignore) {
// Gauge field throwing this wired exception if screen is not active
// TODO handle this stuff by checking if current screen is active
}
}
});
}
public void onProcessSuccess() {
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
downloadProgressBar.setLabel("Complete");
downloadProgressBar.setValue(100);
hButtonManager.deleteAll();
hButtonManager.add(okButton);
settings.updateLastSyncInfo();
}
});
}
public void setProgressMessage(String message) {
downloadProgressBar.setLabel(message);
}
public void attachProcess(Process process) {
this.process = process;
}
public void showRunninngProcessAlert() {
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
int result = Dialog.ask(Dialog.D_YES_NO, " other process [ "
+ process.name()
+ " ] is Still Runing .\n Do you want to Stop it?");
if (result == Dialog.YES) {
((SyncController) controller).clearProcess();
return;
}
}
});
}
public void onProcessFail(final String failureMessage) {
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
String msg = "Attempt to sync failed.";
if (null != failureMessage)
msg = failureMessage;
int result = Dialog.ask(Dialog.D_YES_NO, msg
+ " \nDo you want to Retry?");
downloadProgressBar.setValue(0);
downloadProgressBar.setLabel("Failed");
if (result == Dialog.YES) {
process.startProcess();
return;
} else if (result == Dialog.NO) {
controller.popScreen();
}
}
});
}
public void onProcessStart() {
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
if (process != null) {
downloadProgressBar.setLabel(process.name() + " ...");
}
downloadProgressBar.setValue(0);
hButtonManager.deleteAll();
hButtonManager.add(cancelButton);
}
});
}
protected void makeMenu(Menu menu, int instance) {
super.makeMenu(menu, instance);
}
}