package es.upm.fi.dia.oeg.map4rdf.client.view;
import java.util.List;
import java.util.Map;
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.user.client.Event;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.InlineHTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import es.upm.fi.dia.oeg.map4rdf.client.action.GetAllConfigurationsDescription;
import es.upm.fi.dia.oeg.map4rdf.client.action.GetAllConfigurationsDescriptionResult;
import es.upm.fi.dia.oeg.map4rdf.client.conf.ConfIDInterface;
import es.upm.fi.dia.oeg.map4rdf.client.event.OnSelectedConfiguration;
import es.upm.fi.dia.oeg.map4rdf.client.navigation.Places;
import es.upm.fi.dia.oeg.map4rdf.client.presenter.SelectConfigurationPresenter;
import es.upm.fi.dia.oeg.map4rdf.client.resource.BrowserMessages;
import es.upm.fi.dia.oeg.map4rdf.client.resource.BrowserResources;
import es.upm.fi.dia.oeg.map4rdf.client.util.LocaleUtil;
import es.upm.fi.dia.oeg.map4rdf.client.widget.WidgetFactory;
import es.upm.fi.dia.oeg.map4rdf.share.Resource;
import es.upm.fi.dia.oeg.map4rdf.share.conf.util.ConfigurationDescription;
import net.customware.gwt.dispatch.client.DispatchAsync;
import net.customware.gwt.presenter.client.EventBus;
import net.customware.gwt.presenter.client.place.PlaceChangedEvent;
public class SelectConfigurationView extends Composite implements SelectConfigurationPresenter.Display{
public interface Stylesheet {
String configurationDescriptionLine0Style();
String configurationDescriptionLine1Style();
}
public interface SelectedCallback{
public void doCallBack(String newConfigID);
}
private ConfIDInterface configID;
private EventBus eventBus;
private SelectWindow dialog;
private BrowserResources resources;
private BrowserMessages messages;
@Inject
public SelectConfigurationView(ConfIDInterface configID,EventBus eventBus, DispatchAsync dispatchAsync,BrowserResources resources,final BrowserMessages messages, final WidgetFactory widgetFactory){
this.configID=configID;
this.eventBus=eventBus;
this.resources=resources;
this.messages=messages;
Panel panel= new VerticalPanel();
initWidget(panel);
if(!configID.existsConfigID()){
dispatchAsync.execute(new GetAllConfigurationsDescription(), new AsyncCallback<GetAllConfigurationsDescriptionResult>() {
@Override
public void onSuccess(GetAllConfigurationsDescriptionResult result) {
initAsync(result.getConfigurationsDescription());
}
@Override
public void onFailure(Throwable caught) {
widgetFactory.getDialogBox().showError(messages.errorCommunication()+":"+caught.getMessage());
}
});
}
}
private void initAsync(
List<ConfigurationDescription> configurationsDescription) {
dialog = new SelectWindow();
int style=0;
for(ConfigurationDescription configDescription: configurationsDescription){
if(style==0){
dialog.addWidget(getConfigWidget(configDescription,resources.css().configurationDescriptionLine0Style()));
style=1;
}else{
dialog.addWidget(getConfigWidget(configDescription,resources.css().configurationDescriptionLine1Style()));
style=0;
}
}
dialog.center();
}
private Widget getConfigWidget(final ConfigurationDescription configDescription, String style){
HorizontalPanel panel= new HorizontalPanel();
panel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE);
VerticalPanel infoPanel = new VerticalPanel();
if(configDescription.hasImage()){
Image image=new Image(GWT.getHostPageBaseURL()+configDescription.getImage());
panel.add(image);
}
infoPanel.add(new Label(LocaleUtil.getBestLabel(configDescription)));
infoPanel.add(new InlineHTML("<p></p>"));
if(configDescription.hasDescription()){
infoPanel.add(new Label(LocaleUtil.getBestLabel(new DescriptionResource(configDescription.getDescriptions()))));
}
panel.add(infoPanel);
panel.sinkEvents(Event.ONCLICK);
panel.addStyleName(style);
panel.addHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
fireOnSelectedEvent(configDescription.getId());
}
}, ClickEvent.getType());
return panel;
}
public void fireOnSelectedEvent(String id){
dialog.hide();
configID.setConfigID(id);
eventBus.fireEvent(new OnSelectedConfiguration(id));
eventBus.fireEvent(new PlaceChangedEvent(Places.DASHBOARD));
}
private class DescriptionResource extends Resource{
private static final long serialVersionUID = -4532902285276486639L;
public DescriptionResource(Map<String,String> descriptions) {
super("");
for(String locale: descriptions.keySet()){
super.addLabel(locale, descriptions.get(locale));
}
}
}
public class SelectWindow extends DialogBox{
private Panel mainPanel;
public SelectWindow(){
super();
// Set the dialog box's caption.
setText(messages.configurationSelectionTittle());
// Enable animation.
setAnimationEnabled(true);
// Enable glass background.
setGlassEnabled(true);
//Disable modal. The user cant click in app(GlassEnabled true) and other startup errors can be show.
//If modal is false. Others errors dont be show.
setModal(false);
mainPanel= new VerticalPanel();
this.getElement().getStyle().setZIndex(10000);
setWidget(new ScrollPanel(mainPanel));
}
public void addWidget(Widget widget){
mainPanel.add(widget);
}
public void removeWidget(Widget widget){
mainPanel.remove(widget);
}
}
}