package com.project.website.canvas.client.canvastools.image;
import java.util.ArrayList;
import java.util.Collection;
import com.google.common.base.Objects;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.DoubleClickEvent;
import com.google.gwt.event.dom.client.DoubleClickHandler;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;
import com.project.shared.client.events.SimpleEvent;
import com.project.shared.client.handlers.RegistrationsManager;
import com.project.shared.client.utils.ElementUtils;
import com.project.shared.client.utils.HandlerUtils;
import com.project.shared.client.utils.StyleUtils;
import com.project.shared.client.utils.UrlUtils;
import com.project.shared.client.utils.widgets.DialogWithZIndex;
import com.project.shared.client.utils.widgets.WidgetUtils;
import com.project.shared.utils.StringUtils;
import com.project.website.canvas.client.canvastools.base.CanvasToolCommon;
import com.project.website.canvas.client.canvastools.base.CanvasToolEvents;
import com.project.website.canvas.client.canvastools.base.ResizeMode;
import com.project.website.canvas.client.canvastools.base.eventargs.LoadStartedEventArgs;
import com.project.website.canvas.client.canvastools.base.interfaces.CanvasTool;
import com.project.website.canvas.client.canvastools.base.interfaces.ICanvasToolEvents;
import com.project.website.canvas.client.resources.CanvasResources;
import com.project.website.canvas.client.shared.ImageInformationUtils;
import com.project.website.canvas.client.shared.dialogs.SelectImageDialog;
import com.project.website.canvas.client.shared.searchProviders.interfaces.ImageSearchProvider;
import com.project.website.canvas.shared.data.ElementData;
import com.project.website.canvas.shared.data.ImageData;
import com.project.website.canvas.shared.data.ImageInformation;
public class ImageTool extends Composite implements CanvasTool<ImageData> {
interface ImageToolUiBinder extends UiBinder<Widget, ImageTool> {
}
private static ImageToolUiBinder uiBinder = GWT.create(ImageToolUiBinder.class);
@UiField
Button optionsLabel;
@UiField
FlowPanel optionsBar;
private CanvasToolEvents _toolEvents = new CanvasToolEvents(this);
private final RegistrationsManager registrationsManager = new RegistrationsManager();
private final RegistrationsManager editModeRegistrationsManager = new RegistrationsManager();
private ImageData data = null;
private SelectImageDialog selectImageDialog;
private DialogBox dialogContainer;
private boolean optionsWidgetInited = false;
private ArrayList<ImageSearchProvider> searchProviders = new ArrayList<ImageSearchProvider>();
private boolean viewMode;
public ImageTool(Collection<ImageSearchProvider> imageSearchProviders) {
initWidget(uiBinder.createAndBindUi(this));
CanvasToolCommon.initCanvasToolWidget(this);
searchProviders.addAll(imageSearchProviders);
WidgetUtils.stopClickPropagation(this.optionsLabel);
this.addStyleName(CanvasResources.INSTANCE.main().imageToolDefault());
this.addStyleName(CanvasResources.INSTANCE.main().imageToolEmpty());
}
@Override
public ICanvasToolEvents getToolEvents() {
return this._toolEvents;
}
@Override
public void bind() {
this.registerHandlers();
this.setViewMode(viewMode); // do whatever bindings necessary for our
// mode
}
@Override
protected void onLoad()
{
super.onLoad();
ElementUtils.setTextSelectionEnabled(this.getElement(), false);
}
private void registerHandlers() {
registrationsManager.clear();
registrationsManager.add(this.addDomHandler(new MouseDownHandler() {
@Override
public void onMouseDown(MouseDownEvent event) {
_toolEvents.dispatchMoveStartRequestEvent(event);
}
}, MouseDownEvent.getType()));
}
private void setEditModeRegistrations() {
editModeRegistrationsManager.clear();
editModeRegistrationsManager.add(this.optionsLabel.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
uploadImage();
}
}));
editModeRegistrationsManager.add(this.addDomHandler(new DoubleClickHandler() {
@Override
public void onDoubleClick(DoubleClickEvent event) {
uploadImage();
}
}, DoubleClickEvent.getType()));
}
private void uploadImage() {
initOptionsWidget();
selectImageDialog.setValue(data.imageInformation.getClone());
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
dialogContainer.center();
selectImageDialog.setFocus(true);
}
});
}
private void initOptionsWidget() {
if (optionsWidgetInited) {
return;
}
this.optionsWidgetInited = true;
this.dialogContainer = new DialogWithZIndex(false, true);
dialogContainer.setGlassEnabled(true);
dialogContainer.setText("Image options");
this.selectImageDialog = new SelectImageDialog();
dialogContainer.add(selectImageDialog);
this.selectImageDialog.setSearchProviders(this.searchProviders);
this.selectImageDialog.setImageOptionsProvider(new ImageToolOptionsProvider());
selectImageDialog.addCancelHandler(new SimpleEvent.Handler<Void>() {
@Override
public void onFire(Void arg) {
dialogContainer.hide();
}
});
selectImageDialog.addDoneHandler(new SimpleEvent.Handler<ImageInformation>() {
@Override
public void onFire(ImageInformation arg) {
setImageInformation(arg);
dialogContainer.hide();
}
});
}
private void setImageInformation(ImageInformation imageInformation) {
if (Objects.equal(data.imageInformation, imageInformation)) {
return;
}
// Make sure we don't set arbitrary html or invalid urls
imageInformation.setUrl(UrlUtils.encodeOnce(imageInformation.getUrl()));
this.data.imageInformation = imageInformation;
this.updateImageFromData(imageInformation.options.useOriginalSize);
}
@Override
public void setActive(boolean isFocused) {
// do nothing.
}
private void updateImageFromData(boolean autoSize) {
this.refreshVisibility();
StyleUtils.clearBackground(this.getElement().getStyle());
if (StringUtils.isWhitespaceOrNull(this.data.imageInformation.getUrl())) {
this.addStyleName(CanvasResources.INSTANCE.main().imageToolEmpty());
this.removeStyleName(CanvasResources.INSTANCE.main().imageToolSet());
return;
}
this.removeStyleName(CanvasResources.INSTANCE.main().imageToolEmpty());
this._toolEvents.dispatchLoadStartedEvent(new LoadStartedEventArgs(false));
WidgetUtils.setBackgroundImageAsync(this, this.data.imageInformation.getUrl(), CanvasResources.INSTANCE
.imageUnavailable().getSafeUri().asString(), autoSize,
CanvasResources.INSTANCE.main().imageToolLoading(),
new SimpleEvent.Handler<Void>() {
@Override
public void onFire(Void arg) {
setLoadedStyle();
}
}, HandlerUtils.<Void> emptyHandler());
}
private void setLoadedStyle() {
ImageInformationUtils.setBackgroundStyle(this, this.data.imageInformation);
this._toolEvents.dispatchLoadEndedEvent();
this.addStyleName(CanvasResources.INSTANCE.main().imageToolSet());
}
@Override
public ImageData getValue() {
return this.data;
}
@Override
public void setValue(ImageData data) {
this.data = data;
this.updateImageFromData(false);
}
@Override
public void setElementData(ElementData data) {
this.setValue((ImageData) data);
}
@Override
public ResizeMode getResizeMode() {
return ResizeMode.BOTH;
}
@Override
public boolean canRotate() {
return true;
}
@Override
public void setViewMode(boolean isViewMode) {
this.viewMode = isViewMode;
this.refreshVisibility();
if (isViewMode) {
editModeRegistrationsManager.clear();
} else {
this.setVisible(true);
setEditModeRegistrations();
}
}
private void refreshVisibility() {
if ((this.viewMode) && (StringUtils.isWhitespaceOrNull(this.data.imageInformation.getUrl()))) {
this.setVisible(false);
} else {
this.setVisible(true);
}
}
@Override
public void onResize() {
}
@Override
public IsWidget getToolbar() {
// TODO Auto-generated method stub
return null;
}
}