ingo@862: package de.intevation.flys.client.client.ui; ingo@862: ingo@862: import com.google.gwt.core.client.GWT; ingo@862: import com.google.gwt.user.client.Timer; ingo@865: import com.google.gwt.user.client.rpc.AsyncCallback; ingo@862: ingo@862: import com.smartgwt.client.types.Alignment; ingo@862: import com.smartgwt.client.types.Positioning; ingo@870: import com.smartgwt.client.types.VerticalAlignment; ingo@862: import com.smartgwt.client.widgets.Canvas; ingo@870: import com.smartgwt.client.widgets.Img; ingo@862: import com.smartgwt.client.widgets.Label; ingo@1432: import com.smartgwt.client.widgets.events.ClickEvent; ingo@1432: import com.smartgwt.client.widgets.events.ClickHandler; ingo@1432: import com.smartgwt.client.widgets.layout.HLayout; ingo@870: import com.smartgwt.client.widgets.layout.VLayout; ingo@862: ingo@865: import de.intevation.flys.client.client.Config; ingo@878: import de.intevation.flys.client.client.FLYSConstants; ingo@1432: import de.intevation.flys.client.client.event.HasStepBackHandlers; ingo@1432: import de.intevation.flys.client.client.event.StepBackEvent; ingo@1432: import de.intevation.flys.client.client.event.StepBackHandler; ingo@865: import de.intevation.flys.client.client.services.DescribeArtifactService; ingo@865: import de.intevation.flys.client.client.services.DescribeArtifactServiceAsync; ingo@862: import de.intevation.flys.client.shared.model.Artifact; ingo@1432: import de.intevation.flys.client.shared.model.ArtifactDescription; ingo@870: import de.intevation.flys.client.shared.model.CalculationMessage; ingo@1432: import de.intevation.flys.client.shared.model.DataList; ingo@862: christian@4131: import java.util.ArrayList; christian@4131: import java.util.List; christian@4131: ingo@862: ingo@1432: public class LoadingPanel extends Canvas implements HasStepBackHandlers { ingo@862: christian@4131: private static final long serialVersionUID = -7806425431408987601L; christian@4131: ingo@870: public static final int UPDATE_INTERVAL = 1000 * 3; ingo@865: ingo@865: public static final DescribeArtifactServiceAsync describe = ingo@865: GWT.create(DescribeArtifactService.class); ingo@865: ingo@878: private FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@870: ingo@862: ingo@1432: protected List handlers; ingo@1432: ingo@862: protected CollectionView parent; ingo@862: protected Artifact artifact; ingo@862: ingo@870: protected VLayout dialog; ingo@1432: protected HLayout cancelRow; ingo@862: protected Label msg; ingo@870: protected Label title; ingo@862: ingo@862: protected int i; ingo@862: ingo@862: ingo@862: public LoadingPanel(CollectionView parent, Artifact artifact) { ingo@862: super(); ingo@862: ingo@1432: this.handlers = new ArrayList(); ingo@862: this.parent = parent; ingo@862: this.artifact = artifact; ingo@870: this.msg = new Label(""); ingo@870: this.title = new Label(""); ingo@862: this.dialog = createDialog(); ingo@862: ingo@862: this.i = 0; ingo@862: ingo@862: initLayout(); ingo@862: startTimer(); ingo@862: } ingo@862: ingo@862: ingo@862: private void initLayout() { ingo@862: setWidth("100%"); ingo@862: setHeight("98%"); raimund@898: setBackgroundColor("#7f7f7f"); ingo@862: setOpacity(50); ingo@862: setPosition(Positioning.RELATIVE); ingo@862: ingo@862: parent.addChild(this); ingo@862: parent.addChild(dialog); ingo@862: dialog.moveTo(0, 20); ingo@862: moveTo(0, 7); ingo@862: } ingo@862: ingo@862: ingo@865: public void setArtifact(Artifact artifact) { ingo@865: this.artifact = artifact; ingo@865: } ingo@865: ingo@865: ingo@1432: public Artifact getArtifact() { ingo@1432: return artifact; ingo@1432: } ingo@1432: ingo@1432: ingo@1432: @Override ingo@1432: public void addStepBackHandler(StepBackHandler handler) { ingo@1432: if (handler != null) { ingo@1432: handlers.add(handler); ingo@1432: } ingo@1432: } ingo@1432: ingo@1432: ingo@1432: /** ingo@1432: * This method is called after the user has clicked the button to cancel the ingo@1432: * current process. ingo@1432: * ingo@1432: * @param e The StepBackEvent. ingo@1432: */ ingo@1432: protected void fireStepBackEvent(StepBackEvent e) { ingo@1432: for (StepBackHandler handler: handlers) { ingo@1432: handler.onStepBack(e); ingo@1432: } ingo@1432: } ingo@1432: ingo@1432: ingo@870: protected VLayout createDialog() { raimund@1399: raimund@1399: String baseUrl = GWT.getHostPageBaseURL(); raimund@1399: ingo@870: title.setStyleName("loading-title"); ingo@870: title.setHeight(25); ingo@870: title.setWidth100(); ingo@870: ingo@862: msg.setStyleName("loading-message"); ingo@870: msg.setValign(VerticalAlignment.TOP); ingo@870: msg.setWidth100(); ingo@862: msg.setHeight(100); ingo@862: raimund@1399: Img img = new Img(baseUrl + MSG.loadingImg(), 25, 25); ingo@870: ingo@1432: Label cancelLabel = new Label(MSG.cancelCalculationLabel()); ingo@1432: Img cancel = new Img(baseUrl + MSG.cancelCalculation(), 25, 25); ingo@1432: cancel.addClickHandler(new ClickHandler() { ingo@1432: @Override ingo@1432: public void onClick(ClickEvent e) { ingo@1432: cancel(); ingo@1432: } ingo@1432: }); ingo@1432: ingo@1432: cancelRow = new HLayout(); ingo@1432: cancelRow.setHeight(27); ingo@1432: cancelRow.setWidth100(); ingo@1432: cancelRow.addMember(cancel); ingo@1432: cancelRow.addMember(cancelLabel); ingo@1432: ingo@870: VLayout box = new VLayout(); ingo@870: box.setStyleName("loading-box"); ingo@870: box.setAlign(VerticalAlignment.TOP); ingo@870: box.setDefaultLayoutAlign(VerticalAlignment.TOP); ingo@870: box.addMember(title); ingo@870: box.addMember(msg); ingo@1432: box.addMember(cancelRow); ingo@870: box.setMembersMargin(0); ingo@870: box.setHeight(125); ingo@870: box.setWidth(275); ingo@870: ingo@870: dialog = new VLayout(); ingo@870: dialog.setAlign(Alignment.CENTER); ingo@862: dialog.setDefaultLayoutAlign(Alignment.CENTER); ingo@870: dialog.setMembersMargin(5); ingo@870: dialog.setHeight100(); ingo@862: dialog.setWidth100(); ingo@862: ingo@870: dialog.addMember(img); ingo@870: dialog.addMember(box); ingo@862: ingo@862: return dialog; ingo@862: } ingo@862: ingo@862: ingo@1432: public String getTargetState() { ingo@1432: ArtifactDescription desc = getArtifact().getArtifactDescription(); ingo@1432: DataList[] oldData = desc.getOldData(); ingo@1432: ingo@1432: return oldData[oldData.length -1].getState(); ingo@1432: } ingo@1432: ingo@1432: ingo@862: private void startTimer() { ingo@862: Timer t = new Timer() { ingo@862: @Override ingo@862: public void run() { ingo@862: update(); ingo@862: } ingo@862: }; ingo@862: t.schedule(UPDATE_INTERVAL); ingo@862: } ingo@862: ingo@862: ingo@865: protected void update() { ingo@870: updateMessage(); ingo@862: ingo@865: final Config config = Config.getInstance(); ingo@865: final String locale = config.getLocale(); ingo@862: raimund@1425: describe.describe(locale, artifact, new AsyncCallback() { christian@4131: @Override ingo@865: public void onFailure(Throwable t) { ingo@865: GWT.log("Error while DESCRIBE artifact: " + t.getMessage()); ingo@1432: ingo@865: startTimer(); ingo@865: } ingo@862: christian@4131: @Override ingo@865: public void onSuccess(Artifact artifact) { ingo@865: GWT.log("Successfully DESCRIBE artifact."); ingo@865: ingo@865: setArtifact(artifact); ingo@865: ingo@865: if (artifact.isInBackground()) { ingo@865: startTimer(); ingo@865: } ingo@865: else { ingo@865: finish(); ingo@865: } ingo@865: } ingo@865: }); ingo@862: } ingo@862: ingo@862: ingo@870: protected void updateMessage() { ingo@870: List messages = artifact.getBackgroundMessages(); ingo@870: if (messages != null && messages.size() > 0) { ingo@870: CalculationMessage calcMsg = messages.get(0); ingo@870: title.setContents(getStepTitle(calcMsg)); ingo@870: msg.setContents(calcMsg.getMessage()); ingo@870: } ingo@870: else { ingo@878: title.setContents(MSG.calculationStarted()); ingo@870: } ingo@870: } ingo@870: ingo@870: ingo@870: protected String getStepTitle(CalculationMessage msg) { ingo@878: return MSG.step() + " " + msg.getCurrentStep() + "/" + msg.getSteps(); ingo@870: } ingo@870: ingo@870: ingo@1432: private void cancel() { ingo@1432: fireStepBackEvent(new StepBackEvent(getTargetState())); ingo@1432: parent.removeChild(dialog); ingo@1432: parent.removeChild(this); ingo@1432: } ingo@1432: ingo@1432: ingo@862: private void finish() { ingo@1432: parent.removeChild(dialog); ingo@862: parent.removeChild(this); ingo@1270: parent.setArtifact(artifact); ingo@862: } ingo@862: } ingo@862: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :