1
0
forked from GitHub/gf-core

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

@@ -2,21 +2,23 @@ package se.chalmers.cs.gf.gwt.client;
public class InputLanguageBox extends MultiListBox { public class InputLanguageBox extends MultiListBox {
public InputLanguageBox() { public InputLanguageBox() {
setEnabled(false); setEnabled(false);
} }
public void setGrammar(PGF.Grammar grammar) { public void setGrammar(PGF.Grammar grammar) {
for (PGF.Language l : grammar.getLanguages().iterable()) { clear();
String name = l.getName(); addItem("Any language", "");
if (l.canParse()) { for (PGF.Language l : grammar.getLanguages().iterable()) {
addItem(name); String name = l.getName();
if (name.equals(grammar.getUserLanguage())) { if (l.canParse()) {
setSelectedIndex(getItemCount()-1); addItem(name);
} if (name.equals(grammar.getUserLanguage())) {
} setSelectedIndex(getItemCount()-1);
}
}
}
setEnabled(true);
} }
setEnabled(true);
}
} }

View File

@@ -2,15 +2,17 @@ package se.chalmers.cs.gf.gwt.client;
public class OutputLanguageBox extends MultiListBox { public class OutputLanguageBox extends MultiListBox {
public OutputLanguageBox() { public OutputLanguageBox() {
setEnabled(false); setEnabled(false);
} }
public void setGrammar(PGF.Grammar grammar) { public void setGrammar(PGF.Grammar grammar) {
for (PGF.Language l : grammar.getLanguages().iterable()) { clear();
addItem(l.getName()); addItem("All languages", "");
for (PGF.Language l : grammar.getLanguages().iterable()) {
addItem(l.getName());
}
setEnabled(true);
} }
setEnabled(true);
}
} }

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,175 +5,212 @@ 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 InputLanguageBox fromLangBox; private GrammarBox grammarBox;
private OutputLanguageBox toLangBox; private InputLanguageBox fromLangBox;
private Button translateButton; private OutputLanguageBox toLangBox;
private VerticalPanel outputPanel; private Button translateButton;
private PopupPanel statusPopup; private VerticalPanel outputPanel;
private Label statusLabel; private StatusPopup statusPopup;
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) { private void translate() {
l.getElement().setLang(lang.getLanguageCode()); outputPanel.clear();
setStatus("Translating...");
pgf.translate(getGrammarName(), suggest.getText(), fromLangBox.getSelectedValues(), null,
toLangBox.getSelectedValues(), new PGF.TranslateCallback() {
public void onResult (PGF.Translations translations) {
for (PGF.Translation t : translations.iterable()) {
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();
}
public void onError (Throwable e) {
showError("Translation failed", e);
}
});
} }
outputPanel.add(l);
}
private void translate() { //
outputPanel.clear(); // Status stuff
setStatus("Translating..."); //
pgf.translate(suggest.getText(), fromLangBox.getSelectedValues(), null,
toLangBox.getSelectedValues(), new PGF.TranslateCallback() {
public void onResult (PGF.Translations translations) {
for (PGF.Translation t : translations.iterable()) {
addTranslation(t.getText(), t.getTo());
}
clearStatus();
}
public void onError (Throwable e) {
showError("Translation failed", e);
}
});
}
private void updateLangs() { private void setStatus(String msg) {
oracle.setInputLangs(fromLangBox.getSelectedValues()); statusPopup.setStatus(msg);
} }
private void setStatus(String msg) { private void showError(String msg, Throwable e) {
statusLabel.setText(msg); statusPopup.showError(msg, e);
statusPopup.center(); }
}
private void showError(String msg, Throwable e) { private void clearStatus() {
GWT.log(msg, e); statusPopup.clearStatus();
setStatus(msg); }
}
private void clearStatus() { //
statusPopup.hide(); // Grammars
} //
private void setGrammar(PGF.Grammar grammar) { private String getGrammarName() {
this.grammar = grammar; return grammarBox.getSelectedGrammar();
}
fromLangBox.setGrammar(grammar); private void updateAvailableGrammars() {
toLangBox.setGrammar(grammar); pgf.listGrammars(new PGF.GrammarNamesCallback() {
public void onResult(PGF.GrammarNames grammarNames) {
grammarBox.setGrammarNames(grammarNames);
// setGrammarNames() picks the first grammar automatically
updateSelectedGrammar();
}
updateLangs(); public void onError (Throwable e) {
clearStatus(); showError("Error getting grammar list", e);
translateButton.setEnabled(true); }
} });
}
private void createTranslationUI() { private void updateSelectedGrammar() {
oracle.setGrammarName(getGrammarName());
updateAvailableLanguages();
}
oracle = new CompletionOracle(pgf, new CompletionOracle.ErrorHandler() { //
public void onError(Throwable e) { // Languages
showError("Completion failed", e); //
}
});
suggest = new SuggestBox(oracle); private void updateAvailableLanguages() {
suggest.addKeyboardListener(new KeyboardListenerAdapter() { pgf.grammar(getGrammarName(), new PGF.GrammarCallback() {
public void onKeyUp (Widget sender, char keyCode, int modifiers) { public void onResult(PGF.Grammar grammar) {
if (keyCode == KEY_ENTER) { TranslateApp.this.grammar = grammar;
translate();
}
}
});
fromLangBox = new InputLanguageBox(); fromLangBox.setGrammar(grammar);
fromLangBox.addItem("Any language", ""); toLangBox.setGrammar(grammar);
fromLangBox.addChangeListener(new ChangeListener() {
public void onChange(Widget sender) {
updateLangs();
translate();
}
});
toLangBox = new OutputLanguageBox(); updateSelectedLanguages();
toLangBox.addItem("All languages", ""); clearStatus();
toLangBox.addChangeListener(new ChangeListener() { translateButton.setEnabled(true);
public void onChange(Widget sender) { }
updateLangs();
translate();
}
});
translateButton = new Button("Translate"); public void onError (Throwable e) {
translateButton.setEnabled(false); showError("Error getting language information", e);
translateButton.addClickListener(new ClickListener() { }
public void onClick(Widget sender) { });
translate(); }
}
});
HorizontalPanel settingsPanel = new HorizontalPanel(); private void updateSelectedLanguages() {
settingsPanel.addStyleName("my-settingsPanel"); oracle.setInputLangs(fromLangBox.getSelectedValues());
settingsPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE); translate();
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"); // GUI
//
VerticalPanel vPanel = new VerticalPanel(); private void createTranslationUI() {
vPanel.setWidth("100%");
vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
vPanel.add(suggest);
vPanel.add(settingsPanel);
vPanel.add(outputPanel);
RootPanel.get().add(vPanel); statusPopup = new StatusPopup();
setStatus("Loading...");
} oracle = new CompletionOracle(pgf, new CompletionOracle.ErrorHandler() {
public void onError(Throwable e) {
showError("Completion failed", e);
}
});
public void onModuleLoad() { suggest = new SuggestBox(oracle);
statusLabel = new Label("Loading..."); suggest.addKeyboardListener(new KeyboardListenerAdapter() {
statusPopup = new PopupPanel(true, true); public void onKeyUp (Widget sender, char keyCode, int modifiers) {
statusPopup.add(statusLabel); if (keyCode == KEY_ENTER) {
statusPopup.center(); translate();
}
}
});
pgf = new PGF(pgfBaseURL, pgfName); grammarBox = new GrammarBox();
grammarBox.addChangeListener(new ChangeListener() {
public void onChange(Widget sender) {
updateSelectedGrammar();
}
});
createTranslationUI(); ChangeListener languageChangeListener = new ChangeListener() {
public void onChange(Widget sender) {
updateSelectedLanguages();
}
};
pgf.grammar(new PGF.GrammarCallback() { fromLangBox = new InputLanguageBox();
public void onResult(PGF.Grammar grammar) { fromLangBox.addChangeListener(languageChangeListener);
setGrammar(grammar);
}
public void onError (Throwable e) { toLangBox = new OutputLanguageBox();
showError("Error getting language information", e); toLangBox.addChangeListener(languageChangeListener);
}
}); 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("Grammar:"));
settingsPanel.add(grammarBox);
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);
}
//
// Initialization
//
public void onModuleLoad() {
pgf = new PGF(pgfBaseURL);
createTranslationUI();
updateAvailableGrammars();
}
} }