From 426b4e8a5b215f74c5c7ce7cd02a9c1d76549d4b Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 12 Sep 2008 11:47:41 +0000 Subject: [PATCH] GWT client now has the same func --- .../client/CompletionOracle.java | 27 ++-- .../cs/gf/gwt_translate/client/GF.java | 151 ++++++++++++++---- .../cs/gf/gwt_translate/client/Translate.java | 90 ++++++++++- 3 files changed, 217 insertions(+), 51 deletions(-) diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/CompletionOracle.java b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/CompletionOracle.java index 2e496eb7b..6f1b4d342 100644 --- a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/CompletionOracle.java +++ b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/CompletionOracle.java @@ -8,8 +8,19 @@ public class CompletionOracle extends SuggestOracle { private GF gf; - public CompletionOracle (String gfBaseURL) { - gf = new GF(gfBaseURL); + private List inputLangs; + + public CompletionOracle (GF gf) { + this.gf = gf; + inputLangs = new ArrayList(); + } + + public void setInputLangs(List inputLangs) { + this.inputLangs = inputLangs; + } + + public List getInputLangs() { + return inputLangs; } public static class CompletionSuggestion implements SuggestOracle.Suggestion { @@ -28,15 +39,13 @@ public class CompletionOracle extends SuggestOracle { } public void requestSuggestions(final SuggestOracle.Request request, final SuggestOracle.Callback callback) { - gf.complete(request.getQuery(), request.getLimit(), new GF.CompleteCallback() { + gf.complete(request.getQuery(), getInputLangs(), null, request.getLimit(), + new GF.CompleteCallback() { public void onCompleteDone(GF.Completions completions) { Collection suggestions = new ArrayList(); - for (String lang : completions.getCompletionLanguages()) { - int c = completions.countCompletions(lang); - for (int i = 0; i < c; i++) { - String text = request.getQuery() + " " + completions.getCompletion(lang,i); - suggestions.add(new CompletionSuggestion(text)); - } + for (int i = 0; i < completions.length(); i++) { + String text = request.getQuery() + " " + completions.get(i).getText(); + suggestions.add(new CompletionSuggestion(text)); } callback.onSuggestionsReady(request, new SuggestOracle.Response(suggestions)); } diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/GF.java b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/GF.java index 99fb2e275..a18ea4703 100644 --- a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/GF.java +++ b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/GF.java @@ -2,14 +2,16 @@ package se.chalmers.cs.gf.gwt_translate.client; import com.google.gwt.http.client.*; import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.JsArray; +import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.json.client.JSONValue; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; import java.util.Set; -import java.util.Map; -import java.util.HashMap; +import java.util.List; +import java.util.ArrayList; public class GF { @@ -19,38 +21,101 @@ public class GF { this.baseURL = baseURL; } - /* Translation */ + /* Languages */ - - /* Completion */ - - public void complete (String text, int count, final CompleteCallback callback) { - Map args = new HashMap(); - args.put("input",text); - // args.put("from",); - // args.put("cat",); - // args.put("count",); - sendRequest("complete", args, new JSONRequestCallback() { + public void languages (final LanguagesCallback callback) { + sendRequest("languages", null, new JSONRequestCallback() { public void onJSONReceived(JSONValue json) { - callback.onCompleteDone(new Completions(json)); + callback.onLanguagesDone((Languages)json.isArray().getJavaScriptObject().cast()); } }); } - public static final class Completions { - private final JSONObject completions; - public Completions (JSONValue json) { - this.completions = json.isObject(); + public static class Languages extends JsArray { + protected Languages() { } + } + + public static class Language extends JavaScriptObject { + protected Language() { } + + public final native String getName() /*-{ return this.name; }-*/; + public final native String getLanguageCode() /*-{ return this.languageCode; }-*/; + public final native boolean canParse() /*-{ return this.canParse; }-*/; + } + + + public interface LanguagesCallback { + public void onLanguagesDone (Languages languages); + } + + /* Translation */ + + public void translate (String input, List fromLangs, String cat, List toLangs, + final TranslateCallback callback) { + List args = new ArrayList(); + args.add(new Arg("input", input)); + if (fromLangs != null) { + for (String from : fromLangs) { + args.add(new Arg("from", from)); + } } - public final Set getCompletionLanguages() { return completions.keySet(); } - public final int countCompletions(String lang) { - JSONValue cs = completions.get(lang); - return cs == null ? 0 : cs.isArray().size(); + args.add(new Arg("cat", cat)); + if (toLangs != null) { + for (String to : toLangs) { + args.add(new Arg("to", to)); + } } - public final String getCompletion(String lang, int i) { - JSONValue cs = completions.get(lang); - return cs == null ? null : cs.isArray().get(i).isString().stringValue(); + sendRequest("translate", args, new JSONRequestCallback() { + public void onJSONReceived(JSONValue json) { + callback.onTranslateDone((Translations)json.isArray().getJavaScriptObject().cast()); + } + }); + } + + public static class Translations extends JsArray { + protected Translations() { } + } + + public static class Translation extends JavaScriptObject { + protected Translation() { } + + public final native String getFrom() /*-{ return this.from; }-*/; + public final native String getTo() /*-{ return this.to; }-*/; + public final native String getText() /*-{ return this.text; }-*/; + } + + public interface TranslateCallback { + public void onTranslateDone (Translations translations); + } + + /* Completion */ + + public void complete (String input, List fromLangs, String cat, int limit, final CompleteCallback callback) { + List args = new ArrayList(); + args.add(new Arg("input", input)); + if (fromLangs != null) { + for (String from : fromLangs) { + args.add(new Arg("from", from)); + } } + args.add(new Arg("cat", cat)); + args.add(new Arg("limit", limit)); + sendRequest("complete", args, new JSONRequestCallback() { + public void onJSONReceived(JSONValue json) { + callback.onCompleteDone((Completions)json.isArray().getJavaScriptObject().cast()); + } + }); + } + + public static class Completions extends JsArray { + protected Completions() { } + } + + public static class Completion extends JavaScriptObject { + protected Completion() { } + + public final native String getFrom() /*-{ return this.from; }-*/; + public final native String getText() /*-{ return this.text; }-*/; } public interface CompleteCallback { @@ -64,7 +129,7 @@ public class GF { public void onJSONReceived(JSONValue json); } - private void sendRequest (String resource, Map vars, final JSONRequestCallback callback) { + private void sendRequest (String resource, List vars, final JSONRequestCallback callback) { String url = baseURL + "/" + resource + "?" + buildQueryString(vars); RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url); @@ -78,7 +143,7 @@ public class GF { if (200 == response.getStatusCode()) { callback.onJSONReceived(JSONParser.parse(response.getText())); } else { - GWT.log("Response not OK: " + response.getStatusCode(), null); + GWT.log("Response not OK: " + response.getStatusCode() + ". " + response.getText(), null); } } }); @@ -87,16 +152,32 @@ public class GF { } } - private static String buildQueryString(Map vars) { + private static class Arg { + public final String name; + public final String value; + public Arg (String name, String value) { + this.name = name; + this.value = value; + } + public Arg (String name, int value) { + this(name, Integer.toString(value)); + } + } + + private static String buildQueryString(List args) { StringBuffer sb = new StringBuffer(); - for (Map.Entry e : vars.entrySet()) { - if (sb.length() > 0) { - sb.append("&"); + if (args != null) { + for (Arg arg : args) { + if (arg.value != null) { + if (sb.length() > 0) { + sb.append("&"); + } + sb.append(URL.encodeComponent(arg.name)); + sb.append("="); + sb.append(URL.encodeComponent(arg.value)); + } } - sb.append(URL.encodeComponent(e.getKey())); - sb.append("="); - sb.append(URL.encodeComponent(e.getValue())); - } + } return sb.toString(); } diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/Translate.java b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/Translate.java index 71eaf422d..f2ada71e5 100644 --- a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/Translate.java +++ b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/Translate.java @@ -2,10 +2,14 @@ package se.chalmers.cs.gf.gwt_translate.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.ChangeListener; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.DialogBox; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.Image; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.VerticalPanel; @@ -14,22 +18,56 @@ import com.google.gwt.user.client.ui.KeyboardListenerAdapter; import com.google.gwt.user.client.Window; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + public class Translate implements EntryPoint { + private static final String gfBaseURL = "http://localhost/~bringert/gf-server/gf.fcgi"; + + private GF gf; + + private CompletionOracle oracle; private SuggestBox suggest; + private List fromLangs; + private List toLangs; private Grid outputTable; private void translate() { - outputTable.resizeRows(3); - outputTable.setText(0, 1, suggest.getText()); - outputTable.setText(1, 1, suggest.getText()); - outputTable.setText(2, 1, suggest.getText()); + gf.translate(suggest.getText(), fromLangs, null, toLangs, new GF.TranslateCallback() { + public void onTranslateDone (GF.Translations translations) { + outputTable.resizeRows(translations.length()); + for (int i = 0; i < translations.length(); i++) { + GF.Translation t = translations.get(i); + outputTable.setText(i, 0, t.getFrom()); + outputTable.setText(i, 1, t.getTo()); + outputTable.setText(i, 2, t.getText()); + } + } + }); + } + + private List listBoxSelection(ListBox box) { + int c = box.getItemCount(); + List l = new ArrayList(); + for (int i = 0; i < c; i++) { + if (box.isItemSelected(i)) { + l.add(box.getValue(i)); + } + } + return l; } public void onModuleLoad() { - suggest = new SuggestBox(new CompletionOracle("http://localhost/~bringert/gf-server/gf.fcgi")); + gf = new GF(gfBaseURL); + + oracle = new CompletionOracle(gf); + + suggest = new SuggestBox(oracle); suggest.setWidth("50em"); + suggest.setText("this cheese is warm"); suggest.addKeyboardListener(new KeyboardListenerAdapter() { public void onKeyUp (Widget sender, char keyCode, int modifiers) { if (keyCode == KEY_ENTER) { @@ -38,6 +76,25 @@ public class Translate implements EntryPoint { } }); + final ListBox fromLangBox = new ListBox(); + fromLangBox.addItem("Any language", ""); + fromLangBox.addChangeListener(new ChangeListener() { + public void onChange(Widget sender) { + fromLangs = listBoxSelection(fromLangBox); + oracle.setInputLangs(fromLangs); + translate(); + } + }); + + final ListBox toLangBox = new ListBox(); + toLangBox.addItem("All languages", ""); + toLangBox.addChangeListener(new ChangeListener() { + public void onChange(Widget sender) { + toLangs = listBoxSelection(toLangBox); + translate(); + } + }); + Button translateButton = new Button("Translate"); translateButton.addClickListener(new ClickListener() { public void onClick(Widget sender) { @@ -45,16 +102,35 @@ public class Translate implements EntryPoint { } }); - outputTable = new Grid(0, 2); + HorizontalPanel hPanel = new HorizontalPanel(); + hPanel.add(new Label("From:")); + hPanel.add(fromLangBox); + hPanel.add(new Label("To:")); + hPanel.add(toLangBox); + hPanel.add(translateButton); + + outputTable = new Grid(0, 3); VerticalPanel vPanel = new VerticalPanel(); vPanel.setWidth("100%"); vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER); vPanel.add(suggest); - vPanel.add(translateButton); + vPanel.add(hPanel); vPanel.add(outputTable); RootPanel.get().add(vPanel); + gf.languages(new GF.LanguagesCallback() { + public void onLanguagesDone(GF.Languages languages) { + for (int i = 0; i < languages.length(); i++) { + GF.Language l = languages.get(i); + if (l.canParse()) { + fromLangBox.addItem(l.getName()); + } + toLangBox.addItem(l.getName()); + } + } + }); + } }