Java tutorial
/* * (C) Copyright 2011 Nuxeo SA (http://nuxeo.com/) and contributors. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public License * (LGPL) version 2.1 which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl.html * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * Contributors: * Stphane Fourrier */ package org.nuxeo.opensocial.container.client.external.html; import java.util.ArrayList; import java.util.List; import net.customware.gwt.presenter.client.EventBus; import net.customware.gwt.presenter.client.place.Place; import net.customware.gwt.presenter.client.place.PlaceRequest; import net.customware.gwt.presenter.client.widget.WidgetDisplay; import net.customware.gwt.presenter.client.widget.WidgetPresenter; import org.nuxeo.gwt.habyt.upload.client.FileChanges; import org.nuxeo.gwt.habyt.upload.client.FileRef; import org.nuxeo.opensocial.container.client.ContainerConfiguration; import org.nuxeo.opensocial.container.client.event.priv.app.portlet.WebContentUpdatedEvent; import org.nuxeo.opensocial.container.client.event.priv.app.portlet.WebContentUpdatedEventHandler; import org.nuxeo.opensocial.container.client.event.publ.UpdateWebContentEvent; import org.nuxeo.opensocial.container.client.external.FileUtils; import org.nuxeo.opensocial.container.client.ui.api.HasMultipleValue; import org.nuxeo.opensocial.container.shared.PermissionsConstants; import org.nuxeo.opensocial.container.shared.webcontent.HTMLData; 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.dom.client.HasClickHandlers; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.HasText; import com.google.gwt.user.client.ui.Image; /** * @author Stphane Fourrier */ public class HTMLPresenter extends WidgetPresenter<HTMLPresenter.Display> { private static final String HTTP_PREFIX = "http://"; private HTMLGadgetConstants htmlConstants = GWT.create(HTMLGadgetConstants.class); public interface Display extends WidgetDisplay { String getHtmlFromView(); void setHtmlContent(String html); String getHtmlFromEditor(); void setHtmlEditor(String html); HasClickHandlers getSaveButton(); HasClickHandlers getModifyButton(); HasClickHandlers getCancelButton(); void enableModifPanel(String baseUrl); FileChanges getUploadedFiles(); HasText getTitleTextBox(); HasText getHtmlTitle(); HasText getLinkTextBox(); HasText getLegendTextBox(); void switchToModifyPanel(); void switchToMainPanel(); void enableFacets(); Image getHtmlPicture(); Image getPreviewImage(); HasMultipleValue<String> getTemplateListBox(); void setTemplate(String template); void setPicturePreview(String buildFileUrl); HasClickHandlers getDeletePictureImage(); void removePicturePreview(); } public static final Place PLACE = null; private HTMLModel model; public HTMLPresenter(Display display, EventBus eventBus, HTMLModel model) { super(display, eventBus); this.model = model; fetchContent(); } private void fetchContent() { setHtmlTitle(); setHtmlContent(); setHtmlPictureUrl(); setHtmlPictureLegend(); setHtmlTemplate(); if (model.hasPermission(PermissionsConstants.EVERYTHING)) { display.enableFacets(); display.enableModifPanel(FileUtils.getBaseUrl()); initHtmlTemplatesValues(); } } private void setHtmlTemplate() { String template = model.getData().getTemplate(); if (template == null) { display.setTemplate(HTMLData.CENTER_TEMPLATE); } else { display.setTemplate(template); } } private void initHtmlTemplatesValues() { HasMultipleValue<String> templateList = display.getTemplateListBox(); // Populate the list with static values templateList.addValue(htmlConstants.left(), HTMLData.LEFT_TEMPLATE); templateList.addValue(htmlConstants.right(), HTMLData.RIGHT_TEMPLATE); templateList.addValue(htmlConstants.center(), HTMLData.CENTER_TEMPLATE); } private void setHtmlContent() { display.setHtmlContent(model.getData().getHtml()); } private void setHtmlTitle() { display.getHtmlTitle().setText(model.getData().getHtmlTitle()); } private void setHtmlPictureUrl() { display.getHtmlPicture().setUrl(FileUtils.buildFileUrl(ContainerConfiguration.getRepositoryName(), model.getData().getId(), "content")); } private void setHtmlPictureLegend() { display.getHtmlPicture().getElement().setTitle(model.getData().getHtmlPictureLegend()); } @Override public Place getPlace() { return PLACE; } @Override protected void onBind() { String url = model.getData().getHtmlPictureLink(); if (url != null && !url.isEmpty()) { display.getHtmlPicture().addStyleName("clickable"); } registerImageClick(); if (model.hasPermission(PermissionsConstants.EVERYTHING)) { registerSaveEvent(); registerModifyEvent(); registerHtmlUpdate(); registerCancelButtonEvent(); } } private void registerImageClick() { display.getHtmlPicture().addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { String url = model.getData().getHtmlPictureLink(); if (url != null && !url.isEmpty()) { Window.open(url, "_blank", null); } } }); } private void registerModifyEvent() { registerHandler(display.getModifyButton().addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { display.getTitleTextBox().setText(model.getData().getHtmlTitle()); display.setHtmlEditor(model.getData().getHtml()); display.getLegendTextBox().setText(model.getData().getHtmlPictureLegend()); display.getLinkTextBox().setText(model.getData().getHtmlPictureLink()); display.getTemplateListBox().setValue(model.getData().getTemplate()); if (model.getData().hasPicture()) { display.setPicturePreview(FileUtils.buildFileUrl(ContainerConfiguration.getRepositoryName(), model.getData().getId(), "content")); display.getDeletePictureImage().addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { display.removePicturePreview(); } }); } display.switchToModifyPanel(); } })); } private void registerCancelButtonEvent() { registerHandler(display.getCancelButton().addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { display.switchToMainPanel(); } })); } private void registerSaveEvent() { registerHandler(display.getSaveButton().addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { HTMLData data = model.getData(); List<FileRef> fileRefList = display.getUploadedFiles().getAddedFiles(); List<String> files = new ArrayList<String>(); if (!fileRefList.isEmpty()) { data.setHasPicture(true); for (FileRef ref : fileRefList) { files.add(ref.getId()); } display.getUploadedFiles().getAddedFiles().clear(); } else if (display.getPreviewImage() != null) { model.getData().setHasPicture(display.getPreviewImage().isAttached()); } data.setHtmlTitle(display.getTitleTextBox().getText()); data.setHtml(display.getHtmlFromEditor()); data.setHtmlPictureLegend(display.getLegendTextBox().getText()); String link = display.getLinkTextBox().getText(); if (!link.isEmpty() && !link.startsWith(HTTP_PREFIX)) { link = HTTP_PREFIX + link; } data.setHtmlPictureLink(link); if (link != null && !link.isEmpty()) { display.getHtmlPicture().addStyleName("clickable"); } else { display.getHtmlPicture().removeStyleName("clickable"); } data.setTemplate(display.getTemplateListBox().getValue()); eventBus.fireEvent(new UpdateWebContentEvent(model.getData().getId(), files)); } })); } private void registerHtmlUpdate() { eventBus.addHandler(WebContentUpdatedEvent.TYPE, new WebContentUpdatedEventHandler() { public void onWebContentUpdated(WebContentUpdatedEvent event) { if (event.getWebContentId().equals(model.getData().getId())) { setHtmlTitle(); setHtmlContent(); setHtmlPictureUrl(); setHtmlPictureLegend(); setHtmlTemplate(); display.switchToMainPanel(); } } }); } @Override protected void onPlaceRequest(PlaceRequest request) { } @Override protected void onUnbind() { } public void refreshDisplay() { } public void revealDisplay() { } }