package org.openrosa.client.view;
import java.util.HashMap;
import org.openrosa.client.FormDesigner;
import org.openrosa.client.controller.IFileListener;
import org.openrosa.client.view.Toolbar.Images;
import org.openrosa.client.util.FormUtil;
import org.openrosa.client.util.QueryAndFormData;
import org.openrosa.client.util.XEPResponse;
import com.extjs.gxt.ui.client.Style.IconAlign;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Window;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.RequestTimeoutException;
import com.google.gwt.http.client.Response;
import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.VerticalPanel;
/**
*
* @author daniel
*
*/
public class XformsTabWidget extends Composite {
private TextArea txtXforms = new TextArea();
private Window window = new Window();
private final IFileListener fileListener;
private final String VALIDATE_URL = "https://www.commcarehq.org/formtranslate/validate/";
Images images;
private static ValidationDialogue valDialog = new ValidationDialogue();
// protected static class JSONXForm extends JavaScriptObject {
// public final native String getXForm() /*-{
// return this.xform;
// }-*/;
// public final native void setXForm(String value) /*-{
// this.xform = value;
// }-*/;
//
// }
private boolean validateXForm(String xml){
RequestBuilder builder = new RequestBuilder(RequestBuilder.POST,VALIDATE_URL);
try{
// builder.setHeader("Content-Type", "application/x-www-form-urlencoded");
HashMap<String, String> requestParams = new HashMap<String, String>();
requestParams.put("xform", xml);
String data = QueryAndFormData.buildQueryString(requestParams);
if(xml == null || xml.isEmpty()){
return false;
}else{
FormUtil.dlg.center("Validating Form...");
FormUtil.dlg.show();
}
GWT.log("sending form for validation...data = "+data);
GWT.log("sending form for validation...url = "+VALIDATE_URL);
builder.setTimeoutMillis(5000);
Request reponse = builder.sendRequest(data, new RequestCallback(){
public void onResponseReceived(Request request, Response response){
GWT.log("Validation response received!");
int code = response.getStatusCode();
FormUtil.dlg.hide();
if(code == Response.SC_OK){
valDialog.center();
String output = response.getText();
valDialog.setReturnMessage(output);
valDialog.show();
return;
}else{
GWT.log("Reponse code (for validation)="+code);
GWT.log("Validation Service response headers="+response.getHeadersAsString());
GWT.log(response.getStatusText()+"|||||"+response.getText()+"|||||"+response);
com.google.gwt.user.client.Window.alert("Failed to validate form. Response code received: "+code);
}
}
public void onError(Request request, Throwable exception){
com.google.gwt.user.client.Window.alert("sendRequest onError exception....");
FormUtil.displayException(exception);
if (exception instanceof RequestTimeoutException) {
GWT.log("Request timed out!");
}
}
});
return true;
}
catch(RequestException ex){
FormUtil.displayException(ex);
return false;
}
}
public XformsTabWidget(IFileListener fileListenerr){
this.images = Toolbar.images;
this.fileListener = fileListenerr;
window.setMaximizable(true);
window.setHeading("Xform Source");
ContentPanel cp = new ContentPanel();
ToolBar tb = new ToolBar();
VerticalPanel verticalPanel = new VerticalPanel();
Button validate,update,saveas,openBut;
validate = new Button("Validate Xform");
validate.setIcon(AbstractImagePrototype.create(images.validate()));
validate.setIconAlign(IconAlign.LEFT);
validate.addSelectionListener(new SelectionListener<ButtonEvent>() {
public void componentSelected(ButtonEvent ce){
validateXForm(txtXforms.getText());
}
});
validate.disable();
tb.add(validate);
tb.add(new SeparatorToolItem());
update = new Button("Update to URL");
update.disable(); //feature not ready yet
tb.add(update);
tb.add(new SeparatorToolItem());
saveas = new Button("Save As");
saveas.disable(); //feature not ready yet
tb.add(saveas);
tb.add(new SeparatorToolItem());
openBut = new Button("Open Pasted Text");
openBut.addSelectionListener(new SelectionListener<ButtonEvent>() {
public void componentSelected(ButtonEvent ce) {
fileListener.onOpen();
}
});
tb.add(openBut);
window.setTopComponent(tb);
window.setWidth(800);
window.setMinWidth(500);
cp.setHeading("XForm Editor Output");
cp.add(txtXforms);
// txtXforms.
FormUtil.maximizeWidget(txtXforms);
/*window.addListener(Events.Resize, new Listener<ComponentEvent>() {
public void handleEvent(final ComponentEvent event) {
txtXforms.setWidth(/*window.getWidth() +*//* "100%");
}});*/
window.add(cp);
initWidget(verticalPanel);
FormUtil.maximizeWidget(this);
}
// public static final native JSONXForm buildJSONXform(String xform) /*-{
// return eval("({'xform'," + xform + "})");
// }-*/;
public void adjustHeight(String height){
txtXforms.setHeight(height);
}
public void setXform(String xml){
txtXforms.setText(xml);
txtXforms.setCharacterWidth(800);
txtXforms.setVisibleLines(150);
}
public String getXform(){
return txtXforms.getText();
}
public void showWindow(){
window.show();
}
public void hideWindow(){
window.hide();
}
public boolean isVisible(){
return window.isVisible();
}
}