package org.gcube.portlets.widgets.ckandatapublisherwidget.client.ui.resources; import java.util.ArrayList; import java.util.List; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.CKanMetadataPublisher; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.events.AddResourceEvent; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.events.AddResourceEventHandler; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.events.DeleteResourceEvent; import org.gcube.portlets.widgets.ckandatapublisherwidget.client.events.DeleteResourceEventHandler; import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.ResourceElementBean; import com.github.gwtbootstrap.client.ui.Accordion; import com.github.gwtbootstrap.client.ui.AccordionGroup; import com.github.gwtbootstrap.client.ui.Button; import com.github.gwtbootstrap.client.ui.Paragraph; 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.event.shared.HandlerManager; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; /** * A summary of the resources added by the user. * * @author Costantino Perciante at ISTI-CNR (costantino.perciante@isti.cnr.it) */ public class AddedResourcesSummary extends Composite { private static AddedResourcesSummaryUiBinder uiBinder = GWT.create(AddedResourcesSummaryUiBinder.class); interface AddedResourcesSummaryUiBinder extends UiBinder { } // Event bus private HandlerManager eventBus; // list of added resources (beans) List addedResources; @UiField VerticalPanel addResourcesPanel; public AddedResourcesSummary(HandlerManager eventBus) { initWidget(uiBinder.createAndBindUi(this)); // save bus this.eventBus = eventBus; // bind on add resource event bind(); // init list addedResources = new ArrayList(); } /** * Bind on add/delete resource event */ private void bind() { // when a new resource is added eventBus.addHandler(AddResourceEvent.TYPE, new AddResourceEventHandler() { @Override public void onAddedResource(AddResourceEvent addResourceEvent) { GWT.log("Added resource event: " + addResourceEvent); // get the resource final ResourceElementBean justAddedResource = addResourceEvent.getResource(); // Build an accordion to show resource info Accordion accordion = new Accordion(); AccordionGroup accordionGroup = new AccordionGroup(); accordionGroup.setHeading("* " + justAddedResource.getName()); accordion.add(accordionGroup); // add sub-info such as url and description Paragraph pUrl = new Paragraph(); pUrl.setText("URL : " + justAddedResource.getUrl()); Paragraph pDescription = new Paragraph(); pDescription.setText("Description : " + justAddedResource.getDescription()); // button to delete the resource Button deleteButton = new Button(); deleteButton.setText("Delete"); deleteButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { eventBus.fireEvent(new DeleteResourceEvent(justAddedResource)); } }); // fill accordion accordionGroup.add(pUrl); accordionGroup.add(pDescription); accordionGroup.add(deleteButton); // add to the list addedResources.add(justAddedResource); // add to the panel addResourcesPanel.add(accordion); } }); // when the user wants to delete a resource eventBus.addHandler(DeleteResourceEvent.TYPE, new DeleteResourceEventHandler() { @Override public void onDeletedResource(DeleteResourceEvent deleteResourceEvent) { GWT.log("onDeletedResource resource event: " + deleteResourceEvent); // to delete ResourceElementBean toDelete = deleteResourceEvent.getResource(); // find it for (int i = 0; i < addedResources.size(); i++) { if (addedResources.get(i).equals(toDelete)) { // get the associated widget and remove it final Widget widget = addResourcesPanel.getWidget(i); // remote call to remove it from the dataset CKanMetadataPublisher.ckanServices.deleteResourceFromDataset(toDelete, new AsyncCallback() { @Override public void onSuccess(Boolean result) { if (result) { widget.removeFromParent(); } // remove from the list addedResources.remove(toDelete); } @Override public void onFailure(Throwable caught) { } }); break; } } } }); } public HandlerManager getEventBus() { return eventBus; } }