package org.geogebra.web.touch.gui.dialog.image;
import org.geogebra.common.main.App;
import org.geogebra.web.html5.gui.FastClickHandler;
import org.geogebra.web.html5.gui.tooltip.ToolTipManagerW;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.tablet.Tablet;
import org.geogebra.web.touch.PhoneGapManager;
import org.geogebra.web.web.gui.dialog.image.UploadImageDialog;
import org.geogebra.web.web.gui.util.StandardButton;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import com.googlecode.gwtphonegap.client.camera.PictureCallback;
import com.googlecode.gwtphonegap.client.camera.PictureOptions;
/**
*
*/
public class ImageInputDialogT extends UploadImageDialog {
private static final int PREVIEW_HEIGHT = 155;
private static final int PREVIEW_WIDTH = 213;
private static final int PICTURE_QUALITY = 25;
private SimplePanel cameraPanel;
private SimplePanel picturePanel;
private Label camera;
private String pictureFromCameraString = "";
private String pictureFromFileString = "";
private FlowPanel filePanel;
private StandardButton chooseFromFile;
private PictureOptions options;
private boolean cameraIsActive;
private PictureCallback pictureCallback;
/**
* @param app {@link App}
*/
public ImageInputDialogT(final App app) {
super((AppW) app, PREVIEW_WIDTH, PREVIEW_HEIGHT);
this.pictureCallback = new PictureCallback() {
@Override
public void onSuccess(final String pictureBase64) {
setPicturePreview(pictureBase64);
}
@Override
public void onFailure(final String arg0) {
ToolTipManagerW.sharedInstance().showBottomMessage(
"Couldn't open chosen image", true, (AppW) app);
}
};
if (!Tablet.useCordova()){
exportJavascriptMethods();
}
}
@Override
protected void initGUI() {
super.initGUI();
listPanel.add(camera = new Label(""));
initFilePanel();
initCameraPanel();
}
private void initCameraPanel() {
cameraPanel = new SimplePanel();
cameraPanel.setStyleName("inputPanel");
cameraPanel.setSize(PREVIEW_WIDTH+"px", PREVIEW_HEIGHT+"px");
}
private void initFilePanel() {
this.options = new PictureOptions(ImageInputDialogT.PICTURE_QUALITY);
this.options.setSourceType(PictureOptions.PICTURE_SOURCE_TYPE_SAVED_PHOTO_ALBUM);//.PICTURE_SOURCE_TYPE_PHOTO_LIBRARY);
filePanel = new FlowPanel();
filePanel.add(chooseFromFile = new StandardButton(
app.getLocalization().getMenu("ChooseFromFile")));
chooseFromFile.addStyleName("gwt-Button");
chooseFromFile.addFastClickHandler(new FastClickHandler() {
@Override
public void onClick(Widget source) {
openFromFileClicked();
}
});
filePanel.add(picturePanel = new SimplePanel());
picturePanel.setStyleName("inputPanel");
picturePanel.setSize(PREVIEW_WIDTH + "px", PREVIEW_HEIGHT + "px");
}
/**
* Callback for file open button
*/
void openFromFileClicked() {
if (Tablet.useCordova()){
PhoneGapManager.getPhoneGap().getCamera().getPicture(options, this.pictureCallback);
}else{
openFromFileClickedNative();
}
}
private native void openFromFileClickedNative() /*-{
if ($wnd.android) {
$wnd.android.openFromFileClickedNative();
}
}-*/;
@Override
protected void initActions() {
super.initActions();
camera.addClickHandler(this);
}
@Override
public void setLabels() {
super.setLabels();
//TODO Translation needed
camera.setText("Camera");
}
@Override
public void onClick(ClickEvent event) {
Object source = event.getSource();
if (source == insertBtn) {
if (location != null && !location.isLabelSet()) {
location.setLabel(null);
}
if (this.cameraIsActive && !"".equals(this.pictureFromCameraString)) {
app.imageDropHappened("devicePicture",
this.pictureFromCameraString, "", location);
} else if (!this.cameraIsActive
&& !"".equals(this.pictureFromFileString)) {
app.imageDropHappened("devicePicture",
this.pictureFromFileString, "", location);
}
hide();
} else if (source == cancelBtn) {
app.getImageManager().setPreventAuxImage(false);
hide();
} else if (source == upload) {
uploadClicked();
} else if (source == camera) {
cameraClicked();
}
}
@Override
protected void uploadClicked() {
if (this.pictureFromFileString != null
&& !"".equals(this.pictureFromFileString)) {
imageAvailable();
} else {
imageUnavailable();
}
this.cameraIsActive = false;
this.upload.addStyleDependentName("highlighted");
this.camera.removeStyleDependentName("highlighted");
this.inputPanel.setWidget(this.filePanel);
}
/**
* Callback for camera button
*/
protected void cameraClicked() {
if (this.pictureFromCameraString != null
&& !"".equals(this.pictureFromCameraString)) {
imageAvailable();
} else {
imageUnavailable();
}
this.cameraIsActive = true;
this.camera.addStyleDependentName("highlighted");
this.upload.removeStyleDependentName("highlighted");
this.inputPanel.setWidget(this.cameraPanel);
PictureOptions pictureOptions = new PictureOptions(ImageInputDialogT.PICTURE_QUALITY);
pictureOptions.setAllowEdit(false);
pictureOptions.setCorrectOrientation(true);
if (Tablet.useCordova()){
PhoneGapManager.getPhoneGap().getCamera().getPicture(
pictureOptions,
this.pictureCallback);
}else{
getCameraPictureNative();
}
}
private native void getCameraPictureNative() /*-{
if ($wnd.android) {
$wnd.android.getCameraPictureNative();
}
}-*/;
/**
* @param pictureBase64 String
*/
void setPicturePreview(String pictureBase64) {
if (cameraIsActive) {
this.pictureFromCameraString = "data:image/jpg;base64," + pictureBase64;
this.cameraPanel.clear();
this.cameraPanel.getElement().getStyle().setBackgroundImage("url('" + this.pictureFromCameraString + "')");
} else {
this.pictureFromFileString = "data:image/jpg;base64," + pictureBase64;
this.picturePanel.clear();
this.picturePanel.getElement().getStyle().setBackgroundImage("url('" + this.pictureFromFileString + "')");
}
imageAvailable();
}
@Override
public void hide() {
super.hide();
this.cameraPanel.getElement().getStyle().setBackgroundImage("none");
this.picturePanel.getElement().getStyle().setBackgroundImage("none");
this.pictureFromCameraString = "";
this.pictureFromFileString = "";
}
private native void exportJavascriptMethods() /*-{
var that = this;
$wnd.imageInputDialogT_catchImage = $entry(function(data) {
that.@org.geogebra.web.touch.gui.dialog.image.ImageInputDialogT::catchImage(Ljava/lang/String;)(data);
});
}-*/;
/**
* this method is called through js (see exportGeoGebraAndroidMethods())
*/
public void catchImage(String data) {
setPicturePreview(data);
}
}