package com.project.website.canvas.client.shared.dialogs;
import java.util.List;
import com.google.common.base.Objects;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.TakesValue;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Focusable;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.project.shared.client.events.SimpleEvent;
import com.project.shared.client.handlers.SpecificKeyPressHandler;
import com.project.shared.client.utils.UrlUtils;
import com.project.shared.client.utils.widgets.TextBoxUtils;
import com.project.shared.data.Point2D;
import com.project.website.canvas.client.shared.ImageOptionTypes;
import com.project.website.canvas.client.shared.ImageOptionsProvider;
import com.project.website.canvas.client.shared.ImageOptionsProviderUtils;
import com.project.website.canvas.client.shared.searchProviders.interfaces.MediaInfo;
import com.project.website.canvas.client.shared.searchProviders.interfaces.MediaSearchProvider;
import com.project.website.canvas.client.shared.widgets.media.MediaSearchPanel;
import com.project.website.canvas.shared.data.ImageInformation;
public class SelectImageDialog extends Composite implements TakesValue<ImageInformation>, Focusable {
private static SelectImageDialogUiBinder uiBinder = GWT.create(SelectImageDialogUiBinder.class);
interface SelectImageDialogUiBinder extends UiBinder<Widget, SelectImageDialog> {
}
@UiField
FlowPanel formPanel;
@UiField
TextBox urlTextBox;
@UiField
Button clearButton;
@UiField
Button doneButton;
@UiField
Button cancelButton;
@UiField
MediaSearchPanel mediaSearchPanel;
@UiField
RadioButton stretchOption;
@UiField
RadioButton repeatOption;
@UiField
RadioButton originalSizeOption;
private SimpleEvent<ImageInformation> doneEvent = new SimpleEvent<ImageInformation>();
private SimpleEvent<Void> cancelEvent = new SimpleEvent<Void>();
private ImageOptionsProvider _imageOptionsProvider;
private ImageInformation _defaultInformation = new ImageInformation();
private ImageInformation _imageInformation = new ImageInformation();
public SelectImageDialog() {
initWidget(uiBinder.createAndBindUi(this));
TextBoxUtils.setPlaceHolder(this.urlTextBox, "http://...");
this.clearButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
clear();
}
});
this.doneButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
doneClicked();
}
});
this.cancelButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
cancelEvent.dispatch(null);
}
});
this.mediaSearchPanel.addMediaPickedHandler(new SimpleEvent.Handler<MediaInfo>() {
@Override
public void onFire(MediaInfo imageInfo) {
setSearchData(imageInfo);
}
});
this.urlTextBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
setManualUrl(urlTextBox.getText());
}
});
this.urlTextBox.addKeyPressHandler(new SpecificKeyPressHandler(KeyCodes.KEY_ENTER) {
@Override
public void onSpecificKeyPress(KeyPressEvent event) {
setManualUrl(urlTextBox.getText());
doneClicked();
}
});
}
public HandlerRegistration addDoneHandler(SimpleEvent.Handler<ImageInformation> handler)
{
return this.doneEvent.addHandler(handler);
}
public HandlerRegistration addCancelHandler(SimpleEvent.Handler<Void> handler)
{
return this.cancelEvent.addHandler(handler);
}
public void setSearchProviders(List<? extends MediaSearchProvider> searchProviders)
{
this.mediaSearchPanel.setSearchProviders(searchProviders);
}
public void setImageOptionsProvider(ImageOptionsProvider imageOptionsProvider)
{
this._imageOptionsProvider = imageOptionsProvider;
this._defaultInformation.options = imageOptionsProvider.getDefaultOptions();
}
@Override
public void setValue(ImageInformation value) {
this._imageInformation = value;
if (this.isAttached())
{
this.bindData();
}
}
@Override
protected void onLoad() {
super.onLoad();
this.bindData();
}
private void bindData()
{
this.urlTextBox.setText(this._imageInformation.getUrl());
switch (ImageOptionsProviderUtils.getImageOptionType(
this._imageOptionsProvider, this._imageInformation.options))
{
case OriginalSize:
this.originalSizeOption.setValue(true, true);
break;
case Repeat:
this.repeatOption.setValue(true, true);
break;
case Stretch:
this.stretchOption.setValue(true, true);
break;
default:
break;
}
}
private void applyBasicImageOptions()
{
ImageOptionTypes imageOptionType = null;
if (this.originalSizeOption.getValue())
{
imageOptionType = ImageOptionTypes.OriginalSize;
}
else if (this.stretchOption.getValue())
{
imageOptionType = ImageOptionTypes.Stretch;
}
else if (this.repeatOption.getValue())
{
imageOptionType = ImageOptionTypes.Repeat;
}
else {
// Unknown option type!
// TODO choose a default
return;
}
this._imageInformation.options = ImageOptionsProviderUtils.getImageOptions(this._imageOptionsProvider, imageOptionType);
}
@Override
public ImageInformation getValue() {
return this._imageInformation;
}
@Override
public int getTabIndex() {
return this.mediaSearchPanel.getTabIndex();
}
@Override
public void setAccessKey(char key) {
this.mediaSearchPanel.setAccessKey(key);
}
@Override
public void setFocus(boolean focused) {
this.mediaSearchPanel.setFocus(focused);
}
@Override
public void setTabIndex(int index) {
this.mediaSearchPanel.setTabIndex(index);
}
private void setSearchData(MediaInfo mediaInfo)
{
this._imageInformation.setUrl(mediaInfo.getMediaUrl());
this._imageInformation.size = new Point2D(mediaInfo.getWidth(), mediaInfo.getHeight());
this.urlTextBox.setText(this._imageInformation.getUrl());
}
private void setManualUrl(String url)
{
if (Objects.equal(this._imageInformation.url, url))
{
return;
}
if (url.isEmpty() || UrlUtils.isValidUrl(url, false)) {
this._imageInformation.setUrl(url);
this._imageInformation.size = new Point2D();
} else {
Window.alert("Invalid url.");
}
}
public void doneClicked()
{
this.applyBasicImageOptions();
this.doneEvent.dispatch(this._imageInformation);
}
public void clear()
{
this.mediaSearchPanel.clear();
this.setValue(this._defaultInformation.getClone());
}
}