GWT lib and translator: added support for multiple pgf files.

This commit is contained in:
bjorn
2008-10-30 09:19:58 +00:00
parent 3e40a907ca
commit 748b60eaee
7 changed files with 299 additions and 170 deletions

View File

@@ -12,6 +12,8 @@ public class CompletionOracle extends SuggestOracle {
private PGF pgf; private PGF pgf;
private String pgfName;
private ErrorHandler errorHandler; private ErrorHandler errorHandler;
private List<String> inputLangs = null; private List<String> inputLangs = null;
@@ -32,6 +34,14 @@ public class CompletionOracle extends SuggestOracle {
this.errorHandler = errorHandler; this.errorHandler = errorHandler;
} }
public String getGrammarName() {
return pgfName;
}
public void setGrammarName(String pgfName) {
this.pgfName = pgfName;
}
public void setInputLangs(List<String> inputLangs) { public void setInputLangs(List<String> inputLangs) {
this.inputLangs = inputLangs; this.inputLangs = inputLangs;
this.oldQuery = null; this.oldQuery = null;
@@ -109,7 +119,7 @@ public class CompletionOracle extends SuggestOracle {
// hack: first report no completions, to hide suggestions until we get the new completions // hack: first report no completions, to hide suggestions until we get the new completions
callback.onSuggestionsReady(request, new SuggestOracle.Response(Collections.<CompletionSuggestion>emptyList())); callback.onSuggestionsReady(request, new SuggestOracle.Response(Collections.<CompletionSuggestion>emptyList()));
jsonRequest = pgf.complete(request.getQuery(), getInputLangs(), null, LIMIT_SCALE_FACTOR * request.getLimit(), jsonRequest = pgf.complete(getGrammarName(), request.getQuery(), getInputLangs(), null, LIMIT_SCALE_FACTOR * request.getLimit(),
new PGF.CompleteCallback() { new PGF.CompleteCallback() {
public void onResult(PGF.Completions completions) { public void onResult(PGF.Completions completions) {
List<CompletionSuggestion> suggestions = new ArrayList<CompletionSuggestion>(); List<CompletionSuggestion> suggestions = new ArrayList<CompletionSuggestion>();

View File

@@ -0,0 +1,26 @@
package se.chalmers.cs.gf.gwt.client;
import com.google.gwt.user.client.ui.ListBox;
public class GrammarBox extends ListBox {
public GrammarBox() {
setEnabled(false);
}
public void setGrammarNames(PGF.GrammarNames grammarNames) {
for (PGF.GrammarName grammarName : grammarNames.iterable()) {
addItem(grammarName.getName());
}
if (!grammarNames.isEmpty()) {
setSelectedIndex(0);
setEnabled(true);
}
}
public String getSelectedGrammar() {
int i = getSelectedIndex();
return i == -1 ? null : getValue(i);
}
}

View File

@@ -7,6 +7,8 @@ public class InputLanguageBox extends MultiListBox {
} }
public void setGrammar(PGF.Grammar grammar) { public void setGrammar(PGF.Grammar grammar) {
clear();
addItem("Any language", "");
for (PGF.Language l : grammar.getLanguages().iterable()) { for (PGF.Language l : grammar.getLanguages().iterable()) {
String name = l.getName(); String name = l.getName();
if (l.canParse()) { if (l.canParse()) {

View File

@@ -7,6 +7,8 @@ public class OutputLanguageBox extends MultiListBox {
} }
public void setGrammar(PGF.Grammar grammar) { public void setGrammar(PGF.Grammar grammar) {
clear();
addItem("All languages", "");
for (PGF.Language l : grammar.getLanguages().iterable()) { for (PGF.Language l : grammar.getLanguages().iterable()) {
addItem(l.getName()); addItem(l.getName());
} }

View File

@@ -10,17 +10,33 @@ import java.util.ArrayList;
public class PGF { public class PGF {
private String baseURL; private String baseURL;
private String pgfName;
public PGF (String baseURL, String pgfName) { public PGF (String baseURL) {
this.baseURL = baseURL; this.baseURL = baseURL;
this.pgfName = pgfName; }
/* List grammars */
public JSONRequest listGrammars (final GrammarNamesCallback callback) {
return JSONRequestBuilder.sendRequest(baseURL + "/", null, callback);
}
public interface GrammarNamesCallback extends JSONCallback<GrammarNames> { }
public static class GrammarNames extends IterableJsArray<GrammarName> {
protected GrammarNames() { }
}
public static class GrammarName extends JavaScriptObject {
protected GrammarName() { }
public final native String getName() /*-{ return this.name; }-*/;
} }
/* Grammar */ /* Grammar */
public JSONRequest grammar (final GrammarCallback callback) { public JSONRequest grammar (String pgfName, final GrammarCallback callback) {
return sendRequest("grammar", null, callback); return sendGrammarRequest(pgfName, "grammar", null, callback);
} }
public interface GrammarCallback extends JSONCallback<Grammar> { } public interface GrammarCallback extends JSONCallback<Grammar> { }
@@ -55,7 +71,7 @@ public class PGF {
/* Translation */ /* Translation */
public JSONRequest translate (String input, List<String> fromLangs, String cat, List<String> toLangs, public JSONRequest translate (String pgfName, String input, List<String> fromLangs, String cat, List<String> toLangs,
final TranslateCallback callback) { final TranslateCallback callback) {
List<Arg> args = new ArrayList<Arg>(); List<Arg> args = new ArrayList<Arg>();
args.add(new Arg("input", input)); args.add(new Arg("input", input));
@@ -70,7 +86,7 @@ public class PGF {
args.add(new Arg("to", to)); args.add(new Arg("to", to));
} }
} }
return sendRequest("translate", args, callback); return sendGrammarRequest(pgfName, "translate", args, callback);
} }
public interface TranslateCallback extends JSONCallback<Translations> { } public interface TranslateCallback extends JSONCallback<Translations> { }
@@ -89,7 +105,7 @@ public class PGF {
/* Completion */ /* Completion */
public JSONRequest complete (String input, List<String> fromLangs, String cat, int limit, final CompleteCallback callback) { public JSONRequest complete (String pgfName, String input, List<String> fromLangs, String cat, int limit, final CompleteCallback callback) {
List<Arg> args = new ArrayList<Arg>(); List<Arg> args = new ArrayList<Arg>();
args.add(new Arg("input", input)); args.add(new Arg("input", input));
if (fromLangs != null) { if (fromLangs != null) {
@@ -99,7 +115,7 @@ public class PGF {
} }
args.add(new Arg("cat", cat)); args.add(new Arg("cat", cat));
args.add(new Arg("limit", limit)); args.add(new Arg("limit", limit));
return sendRequest("complete", args, callback); return sendGrammarRequest(pgfName, "complete", args, callback);
} }
public interface CompleteCallback extends JSONCallback<Completions> { } public interface CompleteCallback extends JSONCallback<Completions> { }
@@ -117,7 +133,7 @@ public class PGF {
/* Parsing */ /* Parsing */
public JSONRequest parse (String input, List<String> fromLangs, String cat, final ParseCallback callback) { public JSONRequest parse (String pgfName, String input, List<String> fromLangs, String cat, final ParseCallback callback) {
List<Arg> args = new ArrayList<Arg>(); List<Arg> args = new ArrayList<Arg>();
args.add(new Arg("input", input)); args.add(new Arg("input", input));
if (fromLangs != null) { if (fromLangs != null) {
@@ -126,7 +142,7 @@ public class PGF {
} }
} }
args.add(new Arg("cat", cat)); args.add(new Arg("cat", cat));
return sendRequest("parse", args, callback); return sendGrammarRequest(pgfName, "parse", args, callback);
} }
public interface ParseCallback extends JSONCallback<ParseResults> { } public interface ParseCallback extends JSONCallback<ParseResults> { }
@@ -144,7 +160,7 @@ public class PGF {
/* Common */ /* Common */
public <T extends JavaScriptObject> JSONRequest sendRequest(String resource, List<Arg> args, final JSONCallback<T> callback) { public <T extends JavaScriptObject> JSONRequest sendGrammarRequest(String pgfName, String resource, List<Arg> args, final JSONCallback<T> callback) {
return JSONRequestBuilder.sendRequest(baseURL + "/" + pgfName + "/" + resource, args, callback); return JSONRequestBuilder.sendRequest(baseURL + "/" + pgfName + "/" + resource, args, callback);
} }

View File

@@ -0,0 +1,36 @@
package se.chalmers.cs.gf.gwt.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
public class StatusPopup extends PopupPanel {
private Label label = new Label();
public StatusPopup () {
super(true, true);
label = new Label();
add(label);
}
public void setStatus(String msg) {
removeStyleDependentName("error");
label.setText(msg);
center();
}
public void showError(String msg, Throwable e) {
GWT.log(msg, e);
addStyleDependentName("error");
label.setText(msg);
center();
}
public void clearStatus() {
removeStyleDependentName("error");
label.setText("");
hide();
}
}

View File

@@ -5,52 +5,48 @@ import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ChangeListener; import com.google.gwt.user.client.ui.ChangeListener;
import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.KeyboardListenerAdapter;
import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.KeyboardListenerAdapter;
import com.google.gwt.core.client.GWT;
public class TranslateApp implements EntryPoint { public class TranslateApp implements EntryPoint {
private static final String pgfBaseURL = "/pgf"; private static final String pgfBaseURL = "/pgf";
private static final String pgfName = "grammar.pgf";
private PGF pgf; private PGF pgf;
private CompletionOracle oracle; private CompletionOracle oracle;
private SuggestBox suggest; private SuggestBox suggest;
private PGF.Grammar grammar; private PGF.Grammar grammar;
private GrammarBox grammarBox;
private InputLanguageBox fromLangBox; private InputLanguageBox fromLangBox;
private OutputLanguageBox toLangBox; private OutputLanguageBox toLangBox;
private Button translateButton; private Button translateButton;
private VerticalPanel outputPanel; private VerticalPanel outputPanel;
private PopupPanel statusPopup; private StatusPopup statusPopup;
private Label statusLabel;
private void addTranslation(String text, String toLang) { //
Label l = new Label(text); // Translation
l.addStyleName("my-translation"); //
PGF.Language lang = grammar.getLanguage(toLang);
if (lang != null) {
l.getElement().setLang(lang.getLanguageCode());
}
outputPanel.add(l);
}
private void translate() { private void translate() {
outputPanel.clear(); outputPanel.clear();
setStatus("Translating..."); setStatus("Translating...");
pgf.translate(suggest.getText(), fromLangBox.getSelectedValues(), null, pgf.translate(getGrammarName(), suggest.getText(), fromLangBox.getSelectedValues(), null,
toLangBox.getSelectedValues(), new PGF.TranslateCallback() { toLangBox.getSelectedValues(), new PGF.TranslateCallback() {
public void onResult (PGF.Translations translations) { public void onResult (PGF.Translations translations) {
for (PGF.Translation t : translations.iterable()) { for (PGF.Translation t : translations.iterable()) {
addTranslation(t.getText(), t.getTo()); Label l = new Label(t.getText());
l.addStyleName("my-translation");
PGF.Language lang = grammar.getLanguage(t.getTo());
if (lang != null) {
l.getElement().setLang(lang.getLanguageCode());
}
outputPanel.add(l);
} }
clearStatus(); clearStatus();
} }
@@ -60,37 +56,86 @@ public class TranslateApp implements EntryPoint {
}); });
} }
private void updateLangs() { //
oracle.setInputLangs(fromLangBox.getSelectedValues()); // Status stuff
} //
private void setStatus(String msg) { private void setStatus(String msg) {
statusLabel.setText(msg); statusPopup.setStatus(msg);
statusPopup.center();
} }
private void showError(String msg, Throwable e) { private void showError(String msg, Throwable e) {
GWT.log(msg, e); statusPopup.showError(msg, e);
setStatus(msg);
} }
private void clearStatus() { private void clearStatus() {
statusPopup.hide(); statusPopup.clearStatus();
} }
private void setGrammar(PGF.Grammar grammar) { //
this.grammar = grammar; // Grammars
//
private String getGrammarName() {
return grammarBox.getSelectedGrammar();
}
private void updateAvailableGrammars() {
pgf.listGrammars(new PGF.GrammarNamesCallback() {
public void onResult(PGF.GrammarNames grammarNames) {
grammarBox.setGrammarNames(grammarNames);
// setGrammarNames() picks the first grammar automatically
updateSelectedGrammar();
}
public void onError (Throwable e) {
showError("Error getting grammar list", e);
}
});
}
private void updateSelectedGrammar() {
oracle.setGrammarName(getGrammarName());
updateAvailableLanguages();
}
//
// Languages
//
private void updateAvailableLanguages() {
pgf.grammar(getGrammarName(), new PGF.GrammarCallback() {
public void onResult(PGF.Grammar grammar) {
TranslateApp.this.grammar = grammar;
fromLangBox.setGrammar(grammar); fromLangBox.setGrammar(grammar);
toLangBox.setGrammar(grammar); toLangBox.setGrammar(grammar);
updateLangs(); updateSelectedLanguages();
clearStatus(); clearStatus();
translateButton.setEnabled(true); translateButton.setEnabled(true);
} }
public void onError (Throwable e) {
showError("Error getting language information", e);
}
});
}
private void updateSelectedLanguages() {
oracle.setInputLangs(fromLangBox.getSelectedValues());
translate();
}
//
// GUI
//
private void createTranslationUI() { private void createTranslationUI() {
statusPopup = new StatusPopup();
setStatus("Loading...");
oracle = new CompletionOracle(pgf, new CompletionOracle.ErrorHandler() { oracle = new CompletionOracle(pgf, new CompletionOracle.ErrorHandler() {
public void onError(Throwable e) { public void onError(Throwable e) {
showError("Completion failed", e); showError("Completion failed", e);
@@ -106,23 +151,24 @@ public class TranslateApp implements EntryPoint {
} }
}); });
fromLangBox = new InputLanguageBox(); grammarBox = new GrammarBox();
fromLangBox.addItem("Any language", ""); grammarBox.addChangeListener(new ChangeListener() {
fromLangBox.addChangeListener(new ChangeListener() {
public void onChange(Widget sender) { public void onChange(Widget sender) {
updateLangs(); updateSelectedGrammar();
translate();
} }
}); });
toLangBox = new OutputLanguageBox(); ChangeListener languageChangeListener = new ChangeListener() {
toLangBox.addItem("All languages", "");
toLangBox.addChangeListener(new ChangeListener() {
public void onChange(Widget sender) { public void onChange(Widget sender) {
updateLangs(); updateSelectedLanguages();
translate();
} }
}); };
fromLangBox = new InputLanguageBox();
fromLangBox.addChangeListener(languageChangeListener);
toLangBox = new OutputLanguageBox();
toLangBox.addChangeListener(languageChangeListener);
translateButton = new Button("Translate"); translateButton = new Button("Translate");
translateButton.setEnabled(false); translateButton.setEnabled(false);
@@ -135,6 +181,8 @@ public class TranslateApp implements EntryPoint {
HorizontalPanel settingsPanel = new HorizontalPanel(); HorizontalPanel settingsPanel = new HorizontalPanel();
settingsPanel.addStyleName("my-settingsPanel"); settingsPanel.addStyleName("my-settingsPanel");
settingsPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE); settingsPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE);
settingsPanel.add(new Label("Grammar:"));
settingsPanel.add(grammarBox);
settingsPanel.add(new Label("From:")); settingsPanel.add(new Label("From:"));
settingsPanel.add(fromLangBox); settingsPanel.add(fromLangBox);
settingsPanel.add(new Label("To:")); settingsPanel.add(new Label("To:"));
@@ -155,25 +203,14 @@ public class TranslateApp implements EntryPoint {
} }
//
// Initialization
//
public void onModuleLoad() { public void onModuleLoad() {
statusLabel = new Label("Loading..."); pgf = new PGF(pgfBaseURL);
statusPopup = new PopupPanel(true, true);
statusPopup.add(statusLabel);
statusPopup.center();
pgf = new PGF(pgfBaseURL, pgfName);
createTranslationUI(); createTranslationUI();
updateAvailableGrammars();
pgf.grammar(new PGF.GrammarCallback() {
public void onResult(PGF.Grammar grammar) {
setGrammar(grammar);
}
public void onError (Throwable e) {
showError("Error getting language information", e);
}
});
} }
} }