From acdcd57fa6b108566b7da2c36e1d6505cb4a2946 Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 22 Oct 2008 09:36:05 +0000 Subject: Reorganize GWT stuff into a reusable module and one application module. --- src/server/Makefile | 7 +- src/server/gwt-client/Translate-compile | 2 +- src/server/gwt-client/Translate-shell | 2 +- src/server/gwt-client/Translate-shell-external | 2 +- .../src/se/chalmers/cs/gf/gwt/Translate.gwt.xml | 8 + .../src/se/chalmers/cs/gf/gwt/TranslateApp.gwt.xml | 24 +++ .../cs/gf/gwt/client/CompletionOracle.java | 84 ++++++++ .../src/se/chalmers/cs/gf/gwt/client/GF.java | 221 +++++++++++++++++++++ .../se/chalmers/cs/gf/gwt/client/GFRequest.java | 19 ++ .../se/chalmers/cs/gf/gwt/client/TranslateApp.java | 214 ++++++++++++++++++++ .../src/se/chalmers/cs/gf/gwt/public/Translate.css | 38 ++++ .../se/chalmers/cs/gf/gwt/public/Translate.html | 36 ++++ .../chalmers/cs/gf/gwt_translate/Translate.gwt.xml | 24 --- .../gf/gwt_translate/client/CompletionOracle.java | 84 -------- .../se/chalmers/cs/gf/gwt_translate/client/GF.java | 221 --------------------- .../cs/gf/gwt_translate/client/GFRequest.java | 19 -- .../cs/gf/gwt_translate/client/Translate.java | 214 -------------------- .../cs/gf/gwt_translate/public/Translate.css | 38 ---- .../cs/gf/gwt_translate/public/Translate.html | 36 ---- 19 files changed, 652 insertions(+), 641 deletions(-) create mode 100644 src/server/gwt-client/src/se/chalmers/cs/gf/gwt/Translate.gwt.xml create mode 100644 src/server/gwt-client/src/se/chalmers/cs/gf/gwt/TranslateApp.gwt.xml create mode 100644 src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/CompletionOracle.java create mode 100644 src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/GF.java create mode 100644 src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/GFRequest.java create mode 100644 src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/TranslateApp.java create mode 100644 src/server/gwt-client/src/se/chalmers/cs/gf/gwt/public/Translate.css create mode 100644 src/server/gwt-client/src/se/chalmers/cs/gf/gwt/public/Translate.html delete mode 100644 src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/Translate.gwt.xml delete mode 100644 src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/CompletionOracle.java delete mode 100644 src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/GF.java delete mode 100644 src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/GFRequest.java delete mode 100644 src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/Translate.java delete mode 100644 src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/public/Translate.css delete mode 100644 src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/public/Translate.html diff --git a/src/server/Makefile b/src/server/Makefile index 76f1d1ab8..4ccf57182 100644 --- a/src/server/Makefile +++ b/src/server/Makefile @@ -1,6 +1,6 @@ GFCFLAGS = +RTS -K100M -RTS --cpu -.PHONY: pgf.fcgi run +.PHONY: pgf.fcgi run gf-gwt.jar pgf.fcgi: cabal install @@ -35,7 +35,7 @@ test.pgf: LangEng-parse.pgf LangGer-parse.pgf run: pgf.fcgi @echo '*********************************************' - @echo 'See http://localhost:41296/gwt-client/www/se.chalmers.cs.gf.gwt_translate.Translate/Translate.html' + @echo 'See http://localhost:41296/gwt-client/www/se.chalmers.cs.gf.gwt.TranslateApp/Translate.html' @echo '*********************************************' lighttpd -f lighttpd.conf -D @@ -47,6 +47,9 @@ gwt-installball: pgf.fcgi gwt mv tmp/gwt-client/Translate.html tmp/gwt-client/index.html (cd tmp && tar -zcf ../gwt-client-installball.tar.gz gwt-client) +gf-gwt.jar: + jar -cf $@ -C gwt-client/src se + clean: cabal clean -rm -f pgf.fcgi \ No newline at end of file diff --git a/src/server/gwt-client/Translate-compile b/src/server/gwt-client/Translate-compile index d98e10016..1601fd40e 100644 --- a/src/server/gwt-client/Translate-compile +++ b/src/server/gwt-client/Translate-compile @@ -1,3 +1,3 @@ #!/bin/sh APPDIR=`dirname $0`; -java -XstartOnFirstThread -Xmx256M -cp "$APPDIR/src:$APPDIR/bin:/Users/bringert/src/gwt-mac-1.5.2/gwt-user.jar:/Users/bringert/src/gwt-mac-1.5.2/gwt-dev-mac.jar" com.google.gwt.dev.GWTCompiler -out "$APPDIR/www" "$@" se.chalmers.cs.gf.gwt_translate.Translate; +java -XstartOnFirstThread -Xmx256M -cp "$APPDIR/src:$APPDIR/bin:/Users/bringert/src/gwt-mac-1.5.2/gwt-user.jar:/Users/bringert/src/gwt-mac-1.5.2/gwt-dev-mac.jar" com.google.gwt.dev.GWTCompiler -out "$APPDIR/www" "$@" se.chalmers.cs.gf.gwt.TranslateApp; diff --git a/src/server/gwt-client/Translate-shell b/src/server/gwt-client/Translate-shell index 668700d52..e9761c769 100644 --- a/src/server/gwt-client/Translate-shell +++ b/src/server/gwt-client/Translate-shell @@ -1,3 +1,3 @@ #!/bin/sh APPDIR=`dirname $0`; -java -XstartOnFirstThread -Xmx256M -cp "$APPDIR/src:$APPDIR/bin:/Users/bringert/src/gwt-mac-1.5.2/gwt-user.jar:/Users/bringert/src/gwt-mac-1.5.2/gwt-dev-mac.jar" com.google.gwt.dev.GWTShell -out "$APPDIR/www" "$@" se.chalmers.cs.gf.gwt_translate.Translate/Translate.html; +java -XstartOnFirstThread -Xmx256M -cp "$APPDIR/src:$APPDIR/bin:/Users/bringert/src/gwt-mac-1.5.2/gwt-user.jar:/Users/bringert/src/gwt-mac-1.5.2/gwt-dev-mac.jar" com.google.gwt.dev.GWTShell -out "$APPDIR/www" "$@" se.chalmers.cs.gf.gwt.TranslateApp/Translate.html; diff --git a/src/server/gwt-client/Translate-shell-external b/src/server/gwt-client/Translate-shell-external index e97c13d1d..ec1910dc2 100644 --- a/src/server/gwt-client/Translate-shell-external +++ b/src/server/gwt-client/Translate-shell-external @@ -1,3 +1,3 @@ #!/bin/sh APPDIR=`dirname $0`; -java -XstartOnFirstThread -Xmx256M -cp "$APPDIR/src:$APPDIR/bin:/Users/bringert/src/gwt-mac-1.5.2/gwt-user.jar:/Users/bringert/src/gwt-mac-1.5.2/gwt-dev-mac.jar" com.google.gwt.dev.GWTShell -out "$APPDIR/www" -noserver "$@" http://localhost:41296/gwt-client/www/se.chalmers.cs.gf.gwt_translate.Translate/Translate.html; +java -XstartOnFirstThread -Xmx256M -cp "$APPDIR/src:$APPDIR/bin:/Users/bringert/src/gwt-mac-1.5.2/gwt-user.jar:/Users/bringert/src/gwt-mac-1.5.2/gwt-dev-mac.jar" com.google.gwt.dev.GWTShell -out "$APPDIR/www" -noserver "$@" http://localhost:41296/gwt-client/www/se.chalmers.cs.gf.gwt.TranslateApp/Translate.html; diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/Translate.gwt.xml b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/Translate.gwt.xml new file mode 100644 index 000000000..959f16040 --- /dev/null +++ b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/Translate.gwt.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/TranslateApp.gwt.xml b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/TranslateApp.gwt.xml new file mode 100644 index 000000000..717629e74 --- /dev/null +++ b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/TranslateApp.gwt.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/CompletionOracle.java b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/CompletionOracle.java new file mode 100644 index 000000000..6fc8a930a --- /dev/null +++ b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/CompletionOracle.java @@ -0,0 +1,84 @@ +package se.chalmers.cs.gf.gwt.client; + +import com.google.gwt.user.client.ui.SuggestOracle; + +import com.google.gwt.core.client.GWT; + +import java.util.*; + +public class CompletionOracle extends SuggestOracle { + + private GF gf; + + private ErrorHandler errorHandler; + + private List inputLangs = null; + + private GFRequest gfRequest = null; + + + public CompletionOracle (GF gf) { + this(gf, null); + } + + public CompletionOracle (GF gf, ErrorHandler errorHandler) { + this.gf = gf; + this.errorHandler = errorHandler; + } + + public void setInputLangs(List inputLangs) { + this.inputLangs = inputLangs; + } + + public List getInputLangs() { + return inputLangs; + } + + public void setErrorHandler(ErrorHandler errorHandler) { + this.errorHandler = errorHandler; + } + + public static interface ErrorHandler { + public void onError(Throwable e); + } + + public static class CompletionSuggestion implements SuggestOracle.Suggestion { + private String string; + public CompletionSuggestion(String string) { + this.string = string; + } + + public String getDisplayString() { + return string; + } + + public String getReplacementString() { + return string; + } + } + + public void requestSuggestions(final SuggestOracle.Request request, final SuggestOracle.Callback callback) { + + // only allow a single completion request at a time + if (gfRequest != null) + gfRequest.cancel(); + + gfRequest = gf.complete(request.getQuery(), getInputLangs(), null, request.getLimit(), + new GF.CompleteCallback() { + public void onResult(GF.Completions completions) { + Collection suggestions = new ArrayList(); + for (int i = 0; i < completions.length(); i++) { + String text = completions.get(i).getText(); + suggestions.add(new CompletionSuggestion(text)); + } + callback.onSuggestionsReady(request, new SuggestOracle.Response(suggestions)); + } + + public void onError(Throwable e) { + errorHandler.onError(e); + } + + }); + } + +} diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/GF.java b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/GF.java new file mode 100644 index 000000000..a8533406e --- /dev/null +++ b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/GF.java @@ -0,0 +1,221 @@ +package se.chalmers.cs.gf.gwt.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.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.ArrayList; + +public class GF { + + private String baseURL; + private String pgfName; + + public GF (String baseURL, String pgfName) { + this.baseURL = baseURL; + this.pgfName = pgfName; + } + + public static interface GFCallback { + public void onResult (T result) ; + public void onError (Throwable e) ; + } + + public static class IterableJsArray extends JsArray { + protected IterableJsArray() {} + + public final Iterable iterable() { + return new Iterable() { + public Iterator iterator() { + return new Iterator() { + private int i = 0; + public boolean hasNext() { + return i < length(); + } + public T next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + return get(i++); + } + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } + }; + } + } + + /* Grammar */ + + public GFRequest grammar (final GrammarCallback callback) { + return sendRequest("grammar", null, callback); + } + + public interface GrammarCallback extends GFCallback { } + + public static class Grammar extends JavaScriptObject { + protected Grammar() { } + + public final native String getName() /*-{ return this.name; }-*/; + + public final native String getUserLanguage() /*-{ return this.userLanguage; }-*/; + + public final native IterableJsArray getLanguages() /*-{ return this.languages; }-*/; + + public final Language getLanguage(String name) { + int c = getLanguages().length(); + for (int i = 0; i < c; i++) { + Language l = getLanguages().get(i); + if (l.getName().equals(name)) + return l; + } + return null; + } + } + + 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; }-*/; + } + + /* Translation */ + + public GFRequest 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)); + } + } + args.add(new Arg("cat", cat)); + if (toLangs != null) { + for (String to : toLangs) { + args.add(new Arg("to", to)); + } + } + return sendRequest("translate", args, callback); + } + + public interface TranslateCallback extends GFCallback { } + + public static class Translations extends IterableJsArray { + 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; }-*/; + } + + /* Completion */ + + public GFRequest 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)); + return sendRequest("complete", args, callback); + } + + public interface CompleteCallback extends GFCallback { } + + public static class Completions extends IterableJsArray { + 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; }-*/; + } + + /* Utilities */ + + private GFRequest sendRequest (String resource, List vars, final GFCallback callback) { + String url = baseURL + "/" + pgfName + "/" + resource + "?" + buildQueryString(vars); + RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url); + builder.setTimeoutMillis(30000); + builder.setHeader("Accept","text/plain, text/html;q=0.5, */*;q=0.1"); + Request request = null; + + try { + request = builder.sendRequest(null, new RequestCallback() { + public void onError(Request request, Throwable e) { + callback.onError(e); + } + + public void onResponseReceived(Request request, Response response) { + if (200 == response.getStatusCode()) { + callback.onResult((T)eval(response.getText()).cast()); + } else { + RequestException e = new RequestException("Response not OK: " + response.getStatusCode() + ". " + response.getText()); + callback.onError(e); + } + } + }); + } catch (RequestException e) { + callback.onError(e); + } + + return new GFRequest(request); + } + + private static native JavaScriptObject eval(String json) /*-{ + return eval('(' + json + ')'); + }-*/; + + 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(); + 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)); + } + } + } + return sb.toString(); + } + +} \ No newline at end of file diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/GFRequest.java b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/GFRequest.java new file mode 100644 index 000000000..de30f803a --- /dev/null +++ b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/GFRequest.java @@ -0,0 +1,19 @@ +package se.chalmers.cs.gf.gwt.client; + +import com.google.gwt.http.client.*; + +public class GFRequest { + + private Request httpRequest; + + GFRequest (Request httpRequest) { + this.httpRequest = httpRequest; + } + + public void cancel() { + if (httpRequest != null) { + httpRequest.cancel(); + } + } + +} \ No newline at end of file diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/TranslateApp.java b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/TranslateApp.java new file mode 100644 index 000000000..d96db4365 --- /dev/null +++ b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/client/TranslateApp.java @@ -0,0 +1,214 @@ +package se.chalmers.cs.gf.gwt.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.DockPanel; +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.PopupPanel; +import com.google.gwt.user.client.ui.RootPanel; +import com.google.gwt.user.client.ui.SuggestBox; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.user.client.ui.KeyboardListenerAdapter; + +import com.google.gwt.core.client.GWT; + +import com.google.gwt.user.client.Window; + +import com.google.gwt.i18n.client.LocaleInfo; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class TranslateApp implements EntryPoint { + + private static final String gfBaseURL = "/pgf"; + private static final String pgfName = "grammar.pgf"; + + private GF gf; + + private CompletionOracle oracle; + private SuggestBox suggest; + private GF.Grammar grammar; + private ListBox fromLangBox; + private ListBox toLangBox; + private Button translateButton; + private VerticalPanel outputPanel; + private PopupPanel statusPopup; + private Label statusLabel; + + private void addTranslation(String text, String toLang) { + Label l = new Label(text); + l.addStyleName("my-translation"); + GF.Language lang = grammar.getLanguage(toLang); + if (lang != null) { + l.getElement().setLang(lang.getLanguageCode()); + } + outputPanel.add(l); + } + + private void translate() { + outputPanel.clear(); + setStatus("Translating..."); + gf.translate(suggest.getText(), listBoxSelection(fromLangBox), null, + listBoxSelection(toLangBox), new GF.TranslateCallback() { + public void onResult (GF.Translations translations) { + for (GF.Translation t : translations.iterable()) { + addTranslation(t.getText(), t.getTo()); + } + clearStatus(); + } + public void onError (Throwable e) { + showError("Translation failed", e); + } + }); + } + + private void updateLangs() { + oracle.setInputLangs(listBoxSelection(fromLangBox)); + } + + 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; + } + + private void setStatus(String msg) { + statusLabel.setText(msg); + statusPopup.center(); + } + + private void showError(String msg, Throwable e) { + GWT.log(msg, e); + setStatus(msg); + } + + private void clearStatus() { + statusPopup.hide(); + } + + private void setGrammar(GF.Grammar grammar) { + this.grammar = grammar; + + for (GF.Language l : grammar.getLanguages().iterable()) { + String name = l.getName(); + if (l.canParse()) { + fromLangBox.addItem(name); + if (name.equals(grammar.getUserLanguage())) { + fromLangBox.setSelectedIndex(fromLangBox.getItemCount()-1); + } + } + toLangBox.addItem(name); + } + + updateLangs(); + clearStatus(); + fromLangBox.setEnabled(true); + toLangBox.setEnabled(true); + translateButton.setEnabled(true); + } + + private void createTranslationUI() { + + oracle = new CompletionOracle(gf, new CompletionOracle.ErrorHandler() { + public void onError(Throwable e) { + showError("Completion failed", e); + } + }); + + suggest = new SuggestBox(oracle); + suggest.addKeyboardListener(new KeyboardListenerAdapter() { + public void onKeyUp (Widget sender, char keyCode, int modifiers) { + if (keyCode == KEY_ENTER) { + translate(); + } + } + }); + + fromLangBox = new ListBox(); + fromLangBox.setEnabled(false); + fromLangBox.addItem("Any language", ""); + fromLangBox.addChangeListener(new ChangeListener() { + public void onChange(Widget sender) { + updateLangs(); + translate(); + } + }); + + toLangBox = new ListBox(); + toLangBox.setEnabled(false); + toLangBox.addItem("All languages", ""); + toLangBox.addChangeListener(new ChangeListener() { + public void onChange(Widget sender) { + updateLangs(); + translate(); + } + }); + + translateButton = new Button("Translate"); + translateButton.setEnabled(false); + translateButton.addClickListener(new ClickListener() { + public void onClick(Widget sender) { + translate(); + } + }); + + HorizontalPanel settingsPanel = new HorizontalPanel(); + settingsPanel.addStyleName("my-settingsPanel"); + settingsPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE); + settingsPanel.add(new Label("From:")); + settingsPanel.add(fromLangBox); + settingsPanel.add(new Label("To:")); + settingsPanel.add(toLangBox); + settingsPanel.add(translateButton); + + outputPanel = new VerticalPanel(); + outputPanel.addStyleName("my-translations"); + + VerticalPanel vPanel = new VerticalPanel(); + vPanel.setWidth("100%"); + vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER); + vPanel.add(suggest); + vPanel.add(settingsPanel); + vPanel.add(outputPanel); + + RootPanel.get().add(vPanel); + + } + + public void onModuleLoad() { + statusLabel = new Label("Loading..."); + statusPopup = new PopupPanel(true, true); + statusPopup.add(statusLabel); + statusPopup.center(); + + gf = new GF(gfBaseURL, pgfName); + + createTranslationUI(); + + gf.grammar(new GF.GrammarCallback() { + public void onResult(GF.Grammar grammar) { + setGrammar(grammar); + } + + public void onError (Throwable e) { + showError("Error getting language information", e); + } + }); + } + +} diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/public/Translate.css b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/public/Translate.css new file mode 100644 index 000000000..5b5d22023 --- /dev/null +++ b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/public/Translate.css @@ -0,0 +1,38 @@ +/** Add css rules here for your application. */ + +.gwt-SuggestBox { + width: 70%; + font-size: 150%; + margin: 1em 0 0.5em 0; +} + +.my-settingsPanel * { + margin: 0 0.4em; +} + +.my-translations { + margin-top: 1em; +} + +.my-translation { + margin: 0.2em; + padding-left: 25px; + font-size: 150%; + background-repeat: no-repeat; + background-position: 0% 50%; +} + +/* +* [LANG=bg] { background-image: url("flags/bg.png"); } +* [LANG=ca] { background-image: url("flags/catalonia.png"); } +* [LANG=da] { background-image: url("flags/dk.png"); } +* [LANG=de] { background-image: url("flags/de.png"); } +* [LANG=en] { background-image: url("flags/gb.png"); } +* [LANG=fi] { background-image: url("flags/fi.png"); } +* [LANG=fr] { background-image: url("flags/fr.png"); } +* [LANG=it] { background-image: url("flags/it.png"); } +* [LANG=no] { background-image: url("flags/no.png"); } +* [LANG=ru] { background-image: url("flags/ru.png"); } +* [LANG=es] { background-image: url("flags/es.png"); } +* [LANG=sv] { background-image: url("flags/se.png"); } +*/ \ No newline at end of file diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/public/Translate.html b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/public/Translate.html new file mode 100644 index 000000000..f3fc1da8c --- /dev/null +++ b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt/public/Translate.html @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + Translate + + + + + + + + + + + + + + + + + + + + + diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/Translate.gwt.xml b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/Translate.gwt.xml deleted file mode 100644 index 49b229a66..000000000 --- a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/Translate.gwt.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - 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 deleted file mode 100644 index 5df8f1413..000000000 --- a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/CompletionOracle.java +++ /dev/null @@ -1,84 +0,0 @@ -package se.chalmers.cs.gf.gwt_translate.client; - -import com.google.gwt.user.client.ui.SuggestOracle; - -import com.google.gwt.core.client.GWT; - -import java.util.*; - -public class CompletionOracle extends SuggestOracle { - - private GF gf; - - private ErrorHandler errorHandler; - - private List inputLangs = null; - - private GFRequest gfRequest = null; - - - public CompletionOracle (GF gf) { - this(gf, null); - } - - public CompletionOracle (GF gf, ErrorHandler errorHandler) { - this.gf = gf; - this.errorHandler = errorHandler; - } - - public void setInputLangs(List inputLangs) { - this.inputLangs = inputLangs; - } - - public List getInputLangs() { - return inputLangs; - } - - public void setErrorHandler(ErrorHandler errorHandler) { - this.errorHandler = errorHandler; - } - - public static interface ErrorHandler { - public void onError(Throwable e); - } - - public static class CompletionSuggestion implements SuggestOracle.Suggestion { - private String string; - public CompletionSuggestion(String string) { - this.string = string; - } - - public String getDisplayString() { - return string; - } - - public String getReplacementString() { - return string; - } - } - - public void requestSuggestions(final SuggestOracle.Request request, final SuggestOracle.Callback callback) { - - // only allow a single completion request at a time - if (gfRequest != null) - gfRequest.cancel(); - - gfRequest = gf.complete(request.getQuery(), getInputLangs(), null, request.getLimit(), - new GF.CompleteCallback() { - public void onResult(GF.Completions completions) { - Collection suggestions = new ArrayList(); - for (int i = 0; i < completions.length(); i++) { - String text = completions.get(i).getText(); - suggestions.add(new CompletionSuggestion(text)); - } - callback.onSuggestionsReady(request, new SuggestOracle.Response(suggestions)); - } - - public void onError(Throwable e) { - errorHandler.onError(e); - } - - }); - } - -} 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 deleted file mode 100644 index 74f38219c..000000000 --- a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/GF.java +++ /dev/null @@ -1,221 +0,0 @@ -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.Iterator; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.ArrayList; - -public class GF { - - private String baseURL; - private String pgfName; - - public GF (String baseURL, String pgfName) { - this.baseURL = baseURL; - this.pgfName = pgfName; - } - - public static interface GFCallback { - public void onResult (T result) ; - public void onError (Throwable e) ; - } - - public static class IterableJsArray extends JsArray { - protected IterableJsArray() {} - - public final Iterable iterable() { - return new Iterable() { - public Iterator iterator() { - return new Iterator() { - private int i = 0; - public boolean hasNext() { - return i < length(); - } - public T next() { - if (!hasNext()) { - throw new NoSuchElementException(); - } - return get(i++); - } - public void remove() { - throw new UnsupportedOperationException(); - } - }; - } - }; - } - } - - /* Grammar */ - - public GFRequest grammar (final GrammarCallback callback) { - return sendRequest("grammar", null, callback); - } - - public interface GrammarCallback extends GFCallback { } - - public static class Grammar extends JavaScriptObject { - protected Grammar() { } - - public final native String getName() /*-{ return this.name; }-*/; - - public final native String getUserLanguage() /*-{ return this.userLanguage; }-*/; - - public final native IterableJsArray getLanguages() /*-{ return this.languages; }-*/; - - public final Language getLanguage(String name) { - int c = getLanguages().length(); - for (int i = 0; i < c; i++) { - Language l = getLanguages().get(i); - if (l.getName().equals(name)) - return l; - } - return null; - } - } - - 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; }-*/; - } - - /* Translation */ - - public GFRequest 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)); - } - } - args.add(new Arg("cat", cat)); - if (toLangs != null) { - for (String to : toLangs) { - args.add(new Arg("to", to)); - } - } - return sendRequest("translate", args, callback); - } - - public interface TranslateCallback extends GFCallback { } - - public static class Translations extends IterableJsArray { - 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; }-*/; - } - - /* Completion */ - - public GFRequest 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)); - return sendRequest("complete", args, callback); - } - - public interface CompleteCallback extends GFCallback { } - - public static class Completions extends IterableJsArray { - 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; }-*/; - } - - /* Utilities */ - - private GFRequest sendRequest (String resource, List vars, final GFCallback callback) { - String url = baseURL + "/" + pgfName + "/" + resource + "?" + buildQueryString(vars); - RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url); - builder.setTimeoutMillis(30000); - builder.setHeader("Accept","text/plain, text/html;q=0.5, */*;q=0.1"); - Request request = null; - - try { - request = builder.sendRequest(null, new RequestCallback() { - public void onError(Request request, Throwable e) { - callback.onError(e); - } - - public void onResponseReceived(Request request, Response response) { - if (200 == response.getStatusCode()) { - callback.onResult((T)eval(response.getText()).cast()); - } else { - RequestException e = new RequestException("Response not OK: " + response.getStatusCode() + ". " + response.getText()); - callback.onError(e); - } - } - }); - } catch (RequestException e) { - callback.onError(e); - } - - return new GFRequest(request); - } - - private static native JavaScriptObject eval(String json) /*-{ - return eval('(' + json + ')'); - }-*/; - - 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(); - 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)); - } - } - } - return sb.toString(); - } - -} \ No newline at end of file diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/GFRequest.java b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/GFRequest.java deleted file mode 100644 index 1f2d32086..000000000 --- a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/GFRequest.java +++ /dev/null @@ -1,19 +0,0 @@ -package se.chalmers.cs.gf.gwt_translate.client; - -import com.google.gwt.http.client.*; - -public class GFRequest { - - private Request httpRequest; - - GFRequest (Request httpRequest) { - this.httpRequest = httpRequest; - } - - public void cancel() { - if (httpRequest != null) { - httpRequest.cancel(); - } - } - -} \ No newline at end of file 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 deleted file mode 100644 index a27b7ba75..000000000 --- a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/client/Translate.java +++ /dev/null @@ -1,214 +0,0 @@ -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.DockPanel; -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.PopupPanel; -import com.google.gwt.user.client.ui.RootPanel; -import com.google.gwt.user.client.ui.SuggestBox; -import com.google.gwt.user.client.ui.VerticalPanel; -import com.google.gwt.user.client.ui.Widget; -import com.google.gwt.user.client.ui.KeyboardListenerAdapter; - -import com.google.gwt.core.client.GWT; - -import com.google.gwt.user.client.Window; - -import com.google.gwt.i18n.client.LocaleInfo; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -public class Translate implements EntryPoint { - - private static final String gfBaseURL = "/pgf"; - private static final String pgfName = "grammar.pgf"; - - private GF gf; - - private CompletionOracle oracle; - private SuggestBox suggest; - private GF.Grammar grammar; - private ListBox fromLangBox; - private ListBox toLangBox; - private Button translateButton; - private VerticalPanel outputPanel; - private PopupPanel statusPopup; - private Label statusLabel; - - private void addTranslation(String text, String toLang) { - Label l = new Label(text); - l.addStyleName("my-translation"); - GF.Language lang = grammar.getLanguage(toLang); - if (lang != null) { - l.getElement().setLang(lang.getLanguageCode()); - } - outputPanel.add(l); - } - - private void translate() { - outputPanel.clear(); - setStatus("Translating..."); - gf.translate(suggest.getText(), listBoxSelection(fromLangBox), null, - listBoxSelection(toLangBox), new GF.TranslateCallback() { - public void onResult (GF.Translations translations) { - for (GF.Translation t : translations.iterable()) { - addTranslation(t.getText(), t.getTo()); - } - clearStatus(); - } - public void onError (Throwable e) { - showError("Translation failed", e); - } - }); - } - - private void updateLangs() { - oracle.setInputLangs(listBoxSelection(fromLangBox)); - } - - 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; - } - - private void setStatus(String msg) { - statusLabel.setText(msg); - statusPopup.center(); - } - - private void showError(String msg, Throwable e) { - GWT.log(msg, e); - setStatus(msg); - } - - private void clearStatus() { - statusPopup.hide(); - } - - private void setGrammar(GF.Grammar grammar) { - this.grammar = grammar; - - for (GF.Language l : grammar.getLanguages().iterable()) { - String name = l.getName(); - if (l.canParse()) { - fromLangBox.addItem(name); - if (name.equals(grammar.getUserLanguage())) { - fromLangBox.setSelectedIndex(fromLangBox.getItemCount()-1); - } - } - toLangBox.addItem(name); - } - - updateLangs(); - clearStatus(); - fromLangBox.setEnabled(true); - toLangBox.setEnabled(true); - translateButton.setEnabled(true); - } - - private void createTranslationUI() { - - oracle = new CompletionOracle(gf, new CompletionOracle.ErrorHandler() { - public void onError(Throwable e) { - showError("Completion failed", e); - } - }); - - suggest = new SuggestBox(oracle); - suggest.addKeyboardListener(new KeyboardListenerAdapter() { - public void onKeyUp (Widget sender, char keyCode, int modifiers) { - if (keyCode == KEY_ENTER) { - translate(); - } - } - }); - - fromLangBox = new ListBox(); - fromLangBox.setEnabled(false); - fromLangBox.addItem("Any language", ""); - fromLangBox.addChangeListener(new ChangeListener() { - public void onChange(Widget sender) { - updateLangs(); - translate(); - } - }); - - toLangBox = new ListBox(); - toLangBox.setEnabled(false); - toLangBox.addItem("All languages", ""); - toLangBox.addChangeListener(new ChangeListener() { - public void onChange(Widget sender) { - updateLangs(); - translate(); - } - }); - - translateButton = new Button("Translate"); - translateButton.setEnabled(false); - translateButton.addClickListener(new ClickListener() { - public void onClick(Widget sender) { - translate(); - } - }); - - HorizontalPanel settingsPanel = new HorizontalPanel(); - settingsPanel.addStyleName("my-settingsPanel"); - settingsPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE); - settingsPanel.add(new Label("From:")); - settingsPanel.add(fromLangBox); - settingsPanel.add(new Label("To:")); - settingsPanel.add(toLangBox); - settingsPanel.add(translateButton); - - outputPanel = new VerticalPanel(); - outputPanel.addStyleName("my-translations"); - - VerticalPanel vPanel = new VerticalPanel(); - vPanel.setWidth("100%"); - vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER); - vPanel.add(suggest); - vPanel.add(settingsPanel); - vPanel.add(outputPanel); - - RootPanel.get().add(vPanel); - - } - - public void onModuleLoad() { - statusLabel = new Label("Loading..."); - statusPopup = new PopupPanel(true, true); - statusPopup.add(statusLabel); - statusPopup.center(); - - gf = new GF(gfBaseURL, pgfName); - - createTranslationUI(); - - gf.grammar(new GF.GrammarCallback() { - public void onResult(GF.Grammar grammar) { - setGrammar(grammar); - } - - public void onError (Throwable e) { - showError("Error getting language information", e); - } - }); - } - -} diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/public/Translate.css b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/public/Translate.css deleted file mode 100644 index 5b5d22023..000000000 --- a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/public/Translate.css +++ /dev/null @@ -1,38 +0,0 @@ -/** Add css rules here for your application. */ - -.gwt-SuggestBox { - width: 70%; - font-size: 150%; - margin: 1em 0 0.5em 0; -} - -.my-settingsPanel * { - margin: 0 0.4em; -} - -.my-translations { - margin-top: 1em; -} - -.my-translation { - margin: 0.2em; - padding-left: 25px; - font-size: 150%; - background-repeat: no-repeat; - background-position: 0% 50%; -} - -/* -* [LANG=bg] { background-image: url("flags/bg.png"); } -* [LANG=ca] { background-image: url("flags/catalonia.png"); } -* [LANG=da] { background-image: url("flags/dk.png"); } -* [LANG=de] { background-image: url("flags/de.png"); } -* [LANG=en] { background-image: url("flags/gb.png"); } -* [LANG=fi] { background-image: url("flags/fi.png"); } -* [LANG=fr] { background-image: url("flags/fr.png"); } -* [LANG=it] { background-image: url("flags/it.png"); } -* [LANG=no] { background-image: url("flags/no.png"); } -* [LANG=ru] { background-image: url("flags/ru.png"); } -* [LANG=es] { background-image: url("flags/es.png"); } -* [LANG=sv] { background-image: url("flags/se.png"); } -*/ \ No newline at end of file diff --git a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/public/Translate.html b/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/public/Translate.html deleted file mode 100644 index d9bd6cef9..000000000 --- a/src/server/gwt-client/src/se/chalmers/cs/gf/gwt_translate/public/Translate.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - Translate - - - - - - - - - - - - - - - - - - - - - -- cgit v1.2.3