package org.gcube.portlets.user.reportgenerator.client.targets; import org.gcube.portlets.d4sreporting.common.shared.BasicComponent; import org.gcube.portlets.d4sreporting.common.shared.Metadata; import org.gcube.portlets.user.reportgenerator.client.ReportGenerator; import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; import org.gcube.portlets.user.reportgenerator.client.model.TemplateComponent; import org.gcube.portlets.user.reportgenerator.client.model.TemplateModel; import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspaceItem; import org.gcube.portlets.user.workspace.client.workspace.folder.item.GWTExternalImage; import org.gcube.portlets.user.workspace.client.workspace.folder.item.gcube.GWTImageDocument; import org.gcube.portlets.user.workspace.lighttree.client.ItemType; import org.gcube.portlets.user.workspace.lighttree.client.event.PopupEvent; import org.gcube.portlets.user.workspace.lighttree.client.event.PopupHandler; import org.gcube.portlets.user.workspace.lighttree.client.load.WorkspaceLightTreeLoadPopup; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.RunAsyncCallback; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; /** * * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it */ public class ClientImage extends Composite { private String expectedContent = ""; private final String METADATA_TITLE_KEY = "title"; private final String METADATA_DESC_KEY = "description"; private final String METADATA_SOURCE_KEY = "source"; private VerticalPanel mainPanel = new VerticalPanel(); private SimplePanel imagePanel = new SimplePanel(); private Image currImage; private Presenter presenter; private String idInBasket; private String currentUser; private String currentScope; private final int DEFAULT_HEIGHT = 100; private TextBox titleTB = new TextBox(); private TextBox descTB = new TextBox(); private TextBox sourceTB = new TextBox(); private Button resetB = new Button("Clear Image"); private Button addImageB = new Button("Select Image"); private Button uploadImageB = new Button("Upload Image"); /** * * @param presenter * @param width * @param tag */ public ClientImage(BasicComponent co, Presenter presenter, int width) { this.presenter = presenter; HorizontalPanel controlPanel = getControlPanel(); VerticalPanel attributesPanel = getAttributesPanel(co); mainPanel.add(controlPanel); mainPanel.add(imagePanel); mainPanel.add(attributesPanel); mainPanel.setWidth((TemplateModel.TEMPLATE_WIDTH-95)+"px"); imagePanel.setSize(width+"px", DEFAULT_HEIGHT+"px"); attributesPanel.setWidth((TemplateModel.TEMPLATE_WIDTH-95)+"px"); mainPanel.setStyleName("imageWrapperPanel"); imagePanel.setStyleName("imagePanel"); controlPanel.setStyleName("tableControlPanel"); attributesPanel.setStyleName("tableAttributesPanel"); String imageURL = (String) co.getPossibleContent(); if (imageURL == null || imageURL.trim().compareTo("") == 0 || imageURL.endsWith(TemplateComponent.DEFAULT_IMAGE_NAME)) { GWT.log("Empty ImageUrl="+imageURL); imagePanel.addStyleName("imageEmptyPanel"); } else { GWT.log("Found ImageUrl="+imageURL); showImage(new Image(imageURL)); } //set style for buttons for (int i = 0; i < controlPanel.getWidgetCount(); i++) { if (controlPanel.getWidget(i) instanceof Button) { Button b = (Button) controlPanel.getWidget(i); b.addStyleName("tableButton"); } } initWidget(mainPanel); } private HorizontalPanel getControlPanel() { final HorizontalPanel toReturn = new HorizontalPanel(); resetB.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { } }); addImageB.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { openFileExplorer(addImageB.getAbsoluteLeft(), addImageB.getAbsoluteTop()); } }); uploadImageB.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { } }); toReturn.setSpacing(3); toReturn.add(uploadImageB); toReturn.add(resetB); toReturn.add(addImageB); return toReturn; } private VerticalPanel getAttributesPanel(BasicComponent co) { VerticalPanel toReturn = new VerticalPanel(); for (Metadata md : co.getMetadata()) { if (md.getAttribute().compareTo(METADATA_TITLE_KEY) == 0) titleTB.setText(md.getValue()); if (md.getAttribute().compareTo(METADATA_DESC_KEY) == 0) descTB.setText(md.getValue()); if (md.getAttribute().compareTo(METADATA_SOURCE_KEY) == 0) sourceTB.setText(md.getValue()); } HorizontalPanel hp1 = new HorizontalPanel(); HTML title = new HTML("Title: ", true); hp1.add(title); hp1.add(titleTB); titleTB.setWidth("135px"); HTML desc = new HTML(" Description: ", true); HTML source = new HTML("Source: ", true); hp1.add(desc); hp1.add(descTB); descTB.setWidth("435px"); toReturn.add(hp1); toReturn.add(source); toReturn.add(sourceTB); sourceTB.setWidth("693px"); return toReturn; } public void add(Widget w) { mainPanel.add(w); } /** * called when dropped an image on the area * @param toShow the image to show */ public void showImage(Image toShow) { imagePanel.clear(); this.currImage = toShow; toShow.setWidth(toShow.getWidth()+"px"); imagePanel.setSize(toShow.getWidth()+"px", toShow.getHeight()+"px"); imagePanel.add(toShow); presenter.storeChangeInSession(this); } /** * * @param url . * @param id the id in the folder */ public void dropImage(String url, String id) { GWT.log("URL:" + url, null); idInBasket = id; showImage(new Image(url)); } public void fetchImage(String identifier, final boolean isInteralImage, boolean fullDetails) { ReportGenerator.get().getWSTreeService().getImageById(identifier, isInteralImage, fullDetails, new AsyncCallback() { public void onSuccess(GWTWorkspaceItem result) { if (isInteralImage) { GWTImageDocument image = (GWTImageDocument) result; dropImage(image.getImageUrl(), image.getId()); } else { GWTExternalImage image = (GWTExternalImage) result; dropImage(image.getImageUrl(), image.getId()); } } public void onFailure(Throwable caught) { Window.alert("Could not fetch image from infrastructure " + caught.getCause()); } }); } /** * * @return the image */ public Image getDroppedImage() { if (currImage == null) return new Image(); return currImage; } /** * return a URL which is lookable for on the web * @param imageName . * @param templateName . * @return . */ public String getImageURL(String imageName, String templateName) { currentUser = presenter.getCurrentUser().getUsername(); currentScope = presenter.getCurrentScope(); /** * Images will be stored under webapps/usersArea... * GWT.getModuleBaseURL() returns * e.g. http://dlib28.isti.cnr.it/templatecreator/html/ * need to get just http://dlib28.isti.cnr.it/ */ //remove "/html/" and get e.g. http://dlib28.isti.cnr.it/templatecreator String host = GWT.getModuleBaseURL().substring(0, GWT.getModuleBaseURL().length()-6); //loog for last slash int lastSlash = host.lastIndexOf("/"); //get what i need : e.g. http://dlib28.isti.cnr.it/ or host = "http://localhost:8080/"; host = host.substring(0, lastSlash +1 ); //host = "http://localhost:8080/"; String imgURL = host + "usersArea/" + currentScope + "/templates/" + currentUser + "/CURRENT_OPEN/images/" + imageName; return imgURL; } /** * * @return . */ public String getIdInBasket() { return idInBasket; } /** * * @param idInBasket . */ public void setIdInBasket(String idInBasket) { this.idInBasket = idInBasket; } /** * * @return expectedContent */ public String getExpectedContent() { return expectedContent; } /** * * @param expectedContent . */ public void setExpectedContent(String expectedContent) { this.expectedContent = expectedContent; } private void openFileExplorer(final int left, final int top) { GWT.runAsync(WorkspaceLightTreeLoadPopup.class, new RunAsyncCallback() { public void onSuccess() { WorkspaceLightTreeLoadPopup wpTreepopup = new WorkspaceLightTreeLoadPopup("Select the Image", true, true); wpTreepopup.setShowableTypes(ItemType.IMAGE_DOCUMENT, ItemType.EXTERNAL_IMAGE); wpTreepopup.setSelectableTypes(ItemType.IMAGE_DOCUMENT, ItemType.EXTERNAL_IMAGE); wpTreepopup.addPopupHandler(new PopupHandler() { public void onPopup(PopupEvent event) { if (! event.isCanceled()) { if (event.getSelectedItem() != null) { if (event.getSelectedItem().getType() == ItemType.IMAGE_DOCUMENT) fetchImage(event.getSelectedItem().getId(), true, true); else fetchImage(event.getSelectedItem().getId(), false, true); } } } }); wpTreepopup.setPopupPosition(left, top); wpTreepopup.show(); } public void onFailure(Throwable reason) { Window.alert("There are networks problem, please check your connection."); } }); } }