package it.agilis.mens.azzeroCO2.client.components.uploadFiles;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.FieldEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.mvc.Dispatcher;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteHandler;
import com.google.gwt.user.client.ui.FormPanel.SubmitEvent;
import com.google.gwt.user.client.ui.FormPanel.SubmitHandler;
import it.agilis.mens.azzeroCO2.client.components.uploadFiles.listener.FileAddedListener;
import it.agilis.mens.azzeroCO2.client.components.uploadFiles.listener.FileBeforeSubmitListener;
import it.agilis.mens.azzeroCO2.client.components.uploadFiles.listener.FileUploadFailedListener;
import it.agilis.mens.azzeroCO2.client.components.uploadFiles.listener.FileUploadSucceedListener;
import it.agilis.mens.azzeroCO2.client.components.uploadFiles.model.FileUploadModel;
import it.agilis.mens.azzeroCO2.client.components.uploadFiles.model.Model;
import it.agilis.mens.azzeroCO2.client.components.uploadFiles.panel.FilePanelDecorator;
import it.agilis.mens.azzeroCO2.client.components.uploadFiles.panel.FormPanelDecorator;
import it.agilis.mens.azzeroCO2.client.components.uploadFiles.utils.MultiUploadUtils;
import it.agilis.mens.azzeroCO2.client.mvc.events.AmministrazioneEvents;
import java.util.ArrayList;
import java.util.List;
public class MultiUploadPresenter implements Presenter {
protected final Display display;
private List<FileBeforeSubmitListener> fileBeforeSubmitListeners = new ArrayList<FileBeforeSubmitListener>();
private List<FileUploadSucceedListener> fileUploadSucceedListeners = new ArrayList<FileUploadSucceedListener>();
private List<FileUploadFailedListener> fileUploadFailedListeners = new ArrayList<FileUploadFailedListener>();
private List<FileAddedListener> fileAddedListeners = new ArrayList<FileAddedListener>();
private Long idProgetto;
private String IMGorPDF;
public interface Display {
public void setAddButtonListener(Listener<FieldEvent> listener);
public void setUploadButtonListener(SelectionListener<ButtonEvent> listener);
public void exchangeAddButton();
public String getCurrentFile();
public void addModel(Model model);
public void removeModel(Model model);
public Model findModel(String filename);
public Model parseModel(String json);
public Model getSelectedModel();
public FormPanelDecorator getFormPanel();
public FilePanelDecorator getFileStackPanel();
public void upload();
public void show();
public void close();
}
public MultiUploadPresenter(Display display, Long idProgetto, String IMGorPDF) {
this.display = display;
this.idProgetto = idProgetto;
this.IMGorPDF = IMGorPDF;
}
public void addFileAddedListener(FileAddedListener listener) {
fileAddedListeners.add(listener);
}
public void addFileBeforeSubmitListener(FileBeforeSubmitListener listener) {
fileBeforeSubmitListeners.add(listener);
}
public void addFileUploadFailedListener(FileUploadFailedListener listener) {
fileUploadFailedListeners.add(listener);
}
public void addFileUploadSucceedListener(FileUploadSucceedListener listener) {
fileUploadSucceedListeners.add(listener);
}
@Override
public void go() {
bind();
display.show();
}
protected Model assemblyModel(String name, UploadState state) {
FileUploadModel model = new FileUploadModel(name, state, state.getLabel());
return model;
}
private void bind() {
bindAddButtonListener();
bindUploadButtonListener();
bindSubmitBeforeHandler();
bindSubmitCompleteHandler();
}
private void bindAddButtonListener() {
Listener<FieldEvent> addButtonClickListener = new Listener<FieldEvent>() {
@Override
public void handleEvent(FieldEvent be) {
String name = MultiUploadUtils.removeFilePath(display.getCurrentFile());
Model model = assemblyModel(name, UploadState.IN_QUEUE);
if (display.findModel(name) == null) {
display.addModel(model);
display.exchangeAddButton();
notifyFileAddedListener(name);
}
}
};
display.setAddButtonListener(addButtonClickListener);
}
private void bindUploadButtonListener() {
SelectionListener<ButtonEvent> uploadButtonListener = new SelectionListener<ButtonEvent>() {
@Override
public void componentSelected(ButtonEvent ce) {
display.upload();
}
};
display.setUploadButtonListener(uploadButtonListener);
}
private void bindSubmitBeforeHandler() {
SubmitHandler submitHandler = new SubmitHandler() {
@Override
public void onSubmit(SubmitEvent event) {
notifyBeforeSubmitListener(MultiUploadUtils.removeFilePath(display.getFormPanel().getFilename()));
}
};
display.getFormPanel().addSubmitHandler(submitHandler);
}
private void bindSubmitCompleteHandler() {
SubmitCompleteHandler submitCompleteHandler = new SubmitCompleteHandler() {
@Override
public void onSubmitComplete(SubmitCompleteEvent event) {
processResult(event.getResults());
}
};
display.getFormPanel().addSubmitCompleteHandler(submitCompleteHandler);
}
private void processResult(String json) {
Model model = display.parseModel(json);
Model foundModel = display.findModel(model.getName());
foundModel.setState(model.getState());
foundModel.setMessage(model.getMessage());
notifyListeners(model);
display.getFormPanel().removeFileInput(model.getName());
display.upload();
}
private void notifyFileAddedListener(String filename) {
for (FileAddedListener listener : fileAddedListeners) {
listener.onFileAdded(filename);
}
}
private void notifyListeners(Model model) {
if (model.getState().equals(UploadState.OK)) {
notifyFileUploadSucceedListener(model.getName());
model.setIdProgetto(idProgetto);
model.setIMGorPDF(IMGorPDF);
Dispatcher.forwardEvent(AmministrazioneEvents.SaveProgrammiDiCompensazione, model);
display.close();
} else {
notifyFileUploadFailedListener(model.getName());
}
}
private void notifyBeforeSubmitListener(String filename) {
for (FileBeforeSubmitListener listener : fileBeforeSubmitListeners) {
listener.onBeforeSubmit(filename);
}
}
private void notifyFileUploadSucceedListener(String filename) {
for (FileUploadSucceedListener listener : fileUploadSucceedListeners) {
listener.onFileUploadSucceed(filename);
}
}
private void notifyFileUploadFailedListener(String filename) {
for (FileUploadFailedListener listener : fileUploadFailedListeners) {
listener.onFileUploadFailed(filename);
}
}
}