/**
* Copyright (C) 2015 Born Informatik AG (www.born.ch)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.wte4j.examples.showcase.client.generation;
import java.util.ArrayList;
import java.util.List;
import org.wte4j.examples.showcase.client.Application;
import org.wte4j.examples.showcase.shared.OrderDataDto;
import org.wte4j.examples.showcase.shared.service.OrderServiceAsync;
import org.wte4j.ui.client.dialog.DialogType;
import org.wte4j.ui.client.dialog.MessageDialog;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.view.client.NoSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
public class GenerateDocumentPresenter {
private OrderServiceAsync orderService = OrderServiceAsync.Util.getInstance();
private GenerateDocumentDisplay display;
private NoSelectionModel<OrderDataDto> orderSelectionModel;
private OrderDataDto selectedOrder;
private String selectedTemplate;
public void bind(GenerateDocumentDisplay aDisplay) {
if (display != null) {
throw new IllegalStateException("presenter is already bound");
}
display = aDisplay;
bindOrderContainer();
initOrderContainer();
}
private void bindOrderContainer() {
orderSelectionModel = new NoSelectionModel<OrderDataDto>();
orderSelectionModel.addSelectionChangeHandler(new Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
displayTemplatesForSelection();
}
});
display.getOrderContainer().setSelectionModel(orderSelectionModel);
}
public void initOrderContainer() {
orderService.listOrderData(new AsyncCallback<List<OrderDataDto>>() {
@Override
public void onSuccess(List<OrderDataDto> list) {
display.getOrderContainer().setRowData(0, list);
}
@Override
public void onFailure(Throwable caught) {
showErrorOnFailure(caught);
}
});
}
public void displayTemplatesForSelection() {
selectedOrder = orderSelectionModel.getLastSelectedObject();
orderService.listOrderTemplates(new AsyncCallback<List<String>>() {
@Override
public void onSuccess(List<String> templates) {
List<TemplateItem> templateItems = new ArrayList<TemplateItem>();
for (String templateName : templates) {
templateItems.add(createTemplateItem(templateName));
}
display.setTemplateListItems(templateItems);
display.showTemplateList();
}
@Override
public void onFailure(Throwable caught) {
showErrorOnFailure(caught);
}
});
}
TemplateItem createTemplateItem(String templateName) {
TemplateItem templateItem = new TemplateItem();
templateItem.setText(templateName);
templateItem.setClickHandler(new TemplateClickHandler(templateName));
return templateItem;
}
public void createAndDownlaodDocument() {
orderService.createDocument(selectedOrder, selectedTemplate,
new AsyncCallback<String>() {
@Override
public void onSuccess(String result) {
display.hideTemplateList();
String url = GWT.getModuleBaseURL() + "orderService?file=" + result.toString();
url = URL.decode(url);
Window.open(url, "parent", "");
}
@Override
public void onFailure(Throwable caught) {
display.hideTemplateList();
showErrorOnFailure(caught);
}
});
}
private void showErrorOnFailure(Throwable caught){
String message = ((caught == null || caught.getMessage()== null || "".equals(caught.getMessage()) || caught.getMessage().length() < 4 ) )?
Application.MESSAGES.wte4j_message_document_generation_service_unavailable_text():caught.getMessage();
MessageDialog messageDialog = new MessageDialog(Application.MESSAGES.wte4j_message_document_generation_error_title(), message, DialogType.ERROR);
messageDialog.show();
}
private class TemplateClickHandler implements ClickHandler {
private String template;
public TemplateClickHandler(String template) {
this.template = template;
}
@Override
public void onClick(ClickEvent event) {
selectedTemplate = template;
createAndDownlaodDocument();
}
}
}