/* * See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.xwiki.gwt.wysiwyg.client.plugin.image.ui; import java.util.List; import org.xwiki.gwt.user.client.ui.ListItem; import org.xwiki.gwt.wysiwyg.client.Strings; import org.xwiki.gwt.wysiwyg.client.plugin.image.ImageConfig; import org.xwiki.gwt.wysiwyg.client.plugin.image.ui.ImageWizard.ImageWizardStep; import org.xwiki.gwt.wysiwyg.client.widget.wizard.util.AbstractEntityListSelectorWizardStep; import org.xwiki.gwt.wysiwyg.client.wiki.Attachment; import org.xwiki.gwt.wysiwyg.client.wiki.AttachmentReference; import org.xwiki.gwt.wysiwyg.client.wiki.EntityReference; import org.xwiki.gwt.wysiwyg.client.wiki.ResourceReference.ResourceType; import org.xwiki.gwt.wysiwyg.client.wiki.WikiPageReference; import org.xwiki.gwt.wysiwyg.client.wiki.WikiServiceAsync; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; /** * Wizard step to select an image from the list of images attached to a page. * * @version $Id: 8a49180ba150abb43f196a95fdaeb79a318373e6 $ */ public class CurrentPageImageSelectorWizardStep extends AbstractEntityListSelectorWizardStep<ImageConfig, Attachment> implements SelectionHandler<ListItem<Attachment>> { /** * Fake list item to add to the end of the list, for styling purposes, to clear the floats of the image previews * list items. */ private final ListItem<Attachment> clearFloatsListItem; /** * Flag indicating which end point of the link is the current page. */ private final boolean useLinkDestination; /** * The service used to fetch the list of images attached to the current page. */ private final WikiServiceAsync wikiService; /** * Creates a new image selector that displays the images attached to the link destination page. * * @param wikiService the service used to retrieve the list of image attachments * @param useLinkDestination {@code true} to consider that the link destination is the current page, {@code false} * to consider that the link origin is the current page */ public CurrentPageImageSelectorWizardStep(WikiServiceAsync wikiService, boolean useLinkDestination) { this.wikiService = wikiService; this.useLinkDestination = useLinkDestination; setStepTitle(Strings.INSTANCE.imageSelectImageTitle()); display().addStyleName("xImagesSelector"); clearFloatsListItem = new ListItem<Attachment>(); clearFloatsListItem.setStyleName("clearfloats"); getList().addSelectionHandler(this); } @Override protected String getSelectHelpLabel() { return Strings.INSTANCE.imageSelectImageHelpLabel(); } @Override protected String getSelectErrorMessage() { return Strings.INSTANCE.imageNoImageSelectedError(); } @Override protected void fetchData(AsyncCallback<List<Attachment>> callback) { EntityReference currentPage = useLinkDestination ? getData().getDestination().getEntityReference() : getData().getOrigin(); wikiService.getImageAttachments(new WikiPageReference(currentPage), callback); } @Override protected ListItem<Attachment> fillList(List<Attachment> attachments, Attachment selectedAttachment) { ListItem<Attachment> selectedItem = super.fillList(attachments, selectedAttachment); getList().addItem(clearFloatsListItem); return selectedItem; } @Override public String getNextStep() { if (getSelectedItem() != null && getSelectedItem().getData() == null) { return ImageWizardStep.IMAGE_UPLOAD.toString(); } return ImageWizardStep.IMAGE_CONFIG.toString(); } @Override protected ListItem<Attachment> getListItem(Attachment image) { ListItem<Attachment> imageItem = new ListItem<Attachment>(); imageItem.setData(image); Image htmlImage = new Image(extendQueryString(image.getUrl(), "width=135")); htmlImage.setTitle(new AttachmentReference(image.getReference()).getFileName()); FlowPanel previewPanel = new FlowPanel(); previewPanel.addStyleName("xImagePreview"); previewPanel.add(htmlImage); imageItem.add(previewPanel); return imageItem; } /** * Extend the query string of the given URL with additional parameters. If the URL doesn't already have a query * string, one is created. * * @param url the URL whose query string is going to be extended * @param extraQueryString the string to add to the existing query string * @return the given URL with the query string extended */ private String extendQueryString(String url, String extraQueryString) { char separator = url.indexOf('?') < 0 ? '?' : '&'; return url + separator + extraQueryString; } @Override protected ListItem<Attachment> getNewOptionListItem() { ListItem<Attachment> newImageOption = new ListItem<Attachment>(); newImageOption.setData(null); FlowPanel newOptionPanel = new FlowPanel(); newOptionPanel.addStyleName("xNewImagePreview"); Label newOptionLabel = new Label(Strings.INSTANCE.imageUploadNewFileLabel()); newOptionPanel.add(newOptionLabel); newImageOption.add(newOptionPanel); return newImageOption; } @Override public void onSelection(SelectionEvent<ListItem<Attachment>> event) { // if the selection is the clear floats fake item, move it to the last item if (event.getSelectedItem() == clearFloatsListItem) { // it's the fake item, select the last item in the list getList().setSelectedItem(getList().getItem(getList().getItemCount() - 2)); } } @Override protected void saveSelectedValue(final AsyncCallback<Boolean> async) { // Make sure the resource type is ATTACHMENT since this wizard step selects an attachment. getData().getDestination().setType(ResourceType.ATTACHMENT); super.saveSelectedValue(async); } }