diff --git a/src/server/gwt/src/se/chalmers/cs/gf/gwt/client/SettingsPanel.java b/src/server/gwt/src/se/chalmers/cs/gf/gwt/client/SettingsPanel.java new file mode 100644 index 000000000..3f52b1fab --- /dev/null +++ b/src/server/gwt/src/se/chalmers/cs/gf/gwt/client/SettingsPanel.java @@ -0,0 +1,149 @@ +package se.chalmers.cs.gf.gwt.client; + +import java.util.LinkedList; +import java.util.List; + +import com.google.gwt.user.client.ui.ChangeListener; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.Widget; + +public class SettingsPanel extends Composite { + + private PGF pgf; + private PGF.Grammar grammar; + + private GrammarBox grammarBox; + private InputLanguageBox fromLangBox; + private OutputLanguageBox toLangBox; + + private List listeners = new LinkedList(); + + public SettingsPanel (PGF pgf) { + this.pgf = pgf; + + grammarBox = new GrammarBox(); + grammarBox.addChangeListener(new ChangeListener() { + public void onChange(Widget sender) { + updateSelectedGrammar(); + } + }); + + ChangeListener languageChangeListener = new ChangeListener() { + public void onChange(Widget sender) { + updateSelectedLanguages(); + } + }; + + fromLangBox = new InputLanguageBox(); + fromLangBox.addChangeListener(languageChangeListener); + + toLangBox = new OutputLanguageBox(); + toLangBox.addChangeListener(languageChangeListener); + + HorizontalPanel settingsPanel = new HorizontalPanel(); + 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); + + initWidget(settingsPanel); + setStylePrimaryName("my-SettingsPanel"); + } + + public interface SettingsListener { + public void grammarChanged(String pgfName); + public void languagesChanged(List inputLangs, List outputLangs); + public void settingsError(String msg, Throwable e); + } + + public void addSettingsListener(SettingsListener listener) { + listeners.add(listener); + } + + void fireGrammarChanged() { + for (SettingsListener listener : listeners) { + listener.grammarChanged(getGrammarName()); + } + } + + void fireLanguagesChanged() { + for (SettingsListener listener : listeners) { + listener.languagesChanged(getInputLanguages(), getOutputLanguages()); + } + } + + void fireSettingsError(String msg, Throwable e) { + for (SettingsListener listener : listeners) { + listener.settingsError(msg, e); + } + } + + // + // Grammars + // + + public 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) { + fireSettingsError("Error getting grammar list", e); + } + }); + } + + private void updateSelectedGrammar() { + fireGrammarChanged(); + updateAvailableLanguages(); + } + + public PGF.Grammar getGrammar() { + return grammar; + } + + public String getGrammarName() { + return grammarBox.getSelectedGrammar(); + } + + + // + // Languages + // + + public List getInputLanguages() { + return fromLangBox.getSelectedValues(); + } + + public List getOutputLanguages() { + return toLangBox.getSelectedValues(); + } + + private void updateAvailableLanguages() { + pgf.grammar(getGrammarName(), new PGF.GrammarCallback() { + public void onResult(PGF.Grammar grammar) { + SettingsPanel.this.grammar = grammar; + fromLangBox.setGrammar(grammar); + toLangBox.setGrammar(grammar); + updateSelectedLanguages(); + } + + public void onError (Throwable e) { + fireSettingsError("Error getting language information", e); + } + }); + } + + private void updateSelectedLanguages() { + fireLanguagesChanged(); + } + +} diff --git a/src/server/gwt/src/se/chalmers/cs/gf/gwt/client/SuggestPanel.java b/src/server/gwt/src/se/chalmers/cs/gf/gwt/client/SuggestPanel.java new file mode 100644 index 000000000..cfaca58fc --- /dev/null +++ b/src/server/gwt/src/se/chalmers/cs/gf/gwt/client/SuggestPanel.java @@ -0,0 +1,119 @@ +package se.chalmers.cs.gf.gwt.client; + +import java.util.LinkedList; +import java.util.List; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.ClickListener; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.DockPanel; +import com.google.gwt.user.client.ui.HasVerticalAlignment; +import com.google.gwt.user.client.ui.KeyboardListenerAdapter; +import com.google.gwt.user.client.ui.SuggestBox; +import com.google.gwt.user.client.ui.Widget; + +public class SuggestPanel extends Composite { + + private CompletionOracle oracle; + private SuggestBox suggest; + private Button submitButton; + + private List listeners = new LinkedList(); + + public SuggestPanel (PGF pgf) { + + oracle = new CompletionOracle(pgf, new CompletionOracle.ErrorHandler() { + public void onError(Throwable e) { + GWT.log("Completion failed", e); + } + }); + + suggest = new SuggestBox(oracle); + suggest.setLimit(10); + suggest.addKeyboardListener(new KeyboardListenerAdapter() { + public void onKeyUp (Widget sender, char keyCode, int modifiers) { + if (keyCode == KEY_ENTER) { + submit(); + } + } + }); + + submitButton = new Button("Submit"); + submitButton.setEnabled(false); + submitButton.addClickListener(new ClickListener() { + public void onClick(Widget sender) { + submit(); + } + }); + + DockPanel mainPanel = new DockPanel(); + mainPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); + mainPanel.add(suggest, DockPanel.CENTER); + mainPanel.add(submitButton, DockPanel.EAST); + + initWidget(mainPanel); + setStylePrimaryName("my-SuggestPanel"); + + } + + public int getLimit() { + return suggest.getLimit(); + } + + public String getText() { + return suggest.getText(); + } + + public String getTitle() { + return suggest.getTitle(); + } + + public void onLoad() { + suggest.setFocus(true); + } + + public void setButtonText (String text) { + submitButton.setText(text); + } + + public void setEnabled(boolean enabled) { + submitButton.setEnabled(enabled); + } + + public void setGrammarName(String pgfName) { + oracle.setGrammarName(pgfName); + } + + public void setInputLangs(List inputLangs) { + oracle.setInputLangs(inputLangs); + } + + public void setLimit(int limit) { + suggest.setLimit(limit); + } + + public void setText (String text) { + suggest.setText(text); + } + + public void setTitle(String title) { + suggest.setTitle(title); + } + + public void addSubmitListener(SubmitListener listener) { + listeners.add(listener); + } + + public void submit() { + String text = getText(); + for (SubmitListener listener : listeners) { + listener.onSubmit(text); + } + } + + public interface SubmitListener { + public void onSubmit(String text); + } + +} diff --git a/src/server/gwt/src/se/chalmers/cs/gf/gwt/client/TranslateApp.java b/src/server/gwt/src/se/chalmers/cs/gf/gwt/client/TranslateApp.java index 642216d31..a678d435d 100644 --- a/src/server/gwt/src/se/chalmers/cs/gf/gwt/client/TranslateApp.java +++ b/src/server/gwt/src/se/chalmers/cs/gf/gwt/client/TranslateApp.java @@ -1,16 +1,11 @@ package se.chalmers.cs.gf.gwt.client; +import java.util.List; + 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.HorizontalPanel; -import com.google.gwt.user.client.ui.KeyboardListenerAdapter; import com.google.gwt.user.client.ui.Label; 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; public class TranslateApp implements EntryPoint { @@ -19,13 +14,8 @@ public class TranslateApp implements EntryPoint { private PGF pgf; - private CompletionOracle oracle; - private SuggestBox suggest; - private PGF.Grammar grammar; - private GrammarBox grammarBox; - private InputLanguageBox fromLangBox; - private OutputLanguageBox toLangBox; - private Button translateButton; + private SuggestPanel suggestPanel; + private SettingsPanel settingsPanel; private VerticalPanel outputPanel; private StatusPopup statusPopup; @@ -36,13 +26,16 @@ public class TranslateApp implements EntryPoint { private void translate() { outputPanel.clear(); setStatus("Translating..."); - pgf.translate(getGrammarName(), suggest.getText(), fromLangBox.getSelectedValues(), null, - toLangBox.getSelectedValues(), new PGF.TranslateCallback() { + pgf.translate(settingsPanel.getGrammarName(), + suggestPanel.getText(), + settingsPanel.getInputLanguages(), null, + settingsPanel.getOutputLanguages(), + 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()); + PGF.Language lang = settingsPanel.getGrammar().getLanguage(t.getTo()); if (lang != null) { l.getElement().setLang(lang.getLanguageCode()); } @@ -71,59 +64,19 @@ public class TranslateApp implements EntryPoint { private void clearStatus() { statusPopup.clearStatus(); } - + // - // Grammars + // Grammars and languages // - 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); - toLangBox.setGrammar(grammar); - - updateSelectedLanguages(); - clearStatus(); - translateButton.setEnabled(true); - } - - public void onError (Throwable e) { - showError("Error getting language information", e); - } - }); + suggestPanel.setGrammarName(settingsPanel.getGrammarName()); } private void updateSelectedLanguages() { - oracle.setInputLangs(fromLangBox.getSelectedValues()); + suggestPanel.setInputLangs(settingsPanel.getInputLanguages()); + suggestPanel.setEnabled(true); + clearStatus(); translate(); } @@ -136,58 +89,26 @@ public class TranslateApp implements EntryPoint { statusPopup = new StatusPopup(); setStatus("Loading..."); - oracle = new CompletionOracle(pgf, 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(); - } - } - }); - - grammarBox = new GrammarBox(); - grammarBox.addChangeListener(new ChangeListener() { - public void onChange(Widget sender) { - updateSelectedGrammar(); - } - }); - - ChangeListener languageChangeListener = new ChangeListener() { - public void onChange(Widget sender) { - updateSelectedLanguages(); - } - }; - - fromLangBox = new InputLanguageBox(); - fromLangBox.addChangeListener(languageChangeListener); - - toLangBox = new OutputLanguageBox(); - toLangBox.addChangeListener(languageChangeListener); - - translateButton = new Button("Translate"); - translateButton.setEnabled(false); - translateButton.addClickListener(new ClickListener() { - public void onClick(Widget sender) { + suggestPanel = new SuggestPanel(pgf); + suggestPanel.setButtonText("Translate"); + suggestPanel.addSubmitListener(new SuggestPanel.SubmitListener() { + public void onSubmit(String text) { 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); + settingsPanel = new SettingsPanel(pgf); + settingsPanel.addSettingsListener(new SettingsPanel.SettingsListener() { + public void grammarChanged(String pgfName) { + updateSelectedGrammar(); + } + public void languagesChanged(List inputLangs, List outputLangs) { + updateSelectedLanguages(); + } + public void settingsError(String msg, Throwable e) { + showError(msg,e); + } + }); outputPanel = new VerticalPanel(); outputPanel.addStyleName("my-translations"); @@ -195,7 +116,7 @@ public class TranslateApp implements EntryPoint { VerticalPanel vPanel = new VerticalPanel(); vPanel.setWidth("100%"); vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER); - vPanel.add(suggest); + vPanel.add(suggestPanel); vPanel.add(settingsPanel); vPanel.add(outputPanel); @@ -210,7 +131,7 @@ public class TranslateApp implements EntryPoint { public void onModuleLoad() { pgf = new PGF(pgfBaseURL); createTranslationUI(); - updateAvailableGrammars(); + settingsPanel.updateAvailableGrammars(); } } diff --git a/src/server/gwt/src/se/chalmers/cs/gf/gwt/public/Translate.css b/src/server/gwt/src/se/chalmers/cs/gf/gwt/public/Translate.css index 5b5d22023..9a904c228 100644 --- a/src/server/gwt/src/se/chalmers/cs/gf/gwt/public/Translate.css +++ b/src/server/gwt/src/se/chalmers/cs/gf/gwt/public/Translate.css @@ -1,12 +1,22 @@ /** Add css rules here for your application. */ -.gwt-SuggestBox { - width: 70%; - font-size: 150%; +.my-SuggestPanel { margin: 1em 0 0.5em 0; } -.my-settingsPanel * { +.my-SuggestPanel .gwt-SuggestBox { + width: 400px; + font-size: 150%; + margin: 0; +} + +.my-SuggestPanel .gwt-Button { + font-size: 150%; + margin: 0; + margin-left: 2px; +} + +.my-SettingsPanel * { margin: 0 0.4em; }