GWT: Refactor TranslateApp to make the suggestion panel and the settings panel separate classes. This makes it possible to reuse them in mosg and fridge.

This commit is contained in:
bjorn
2008-11-03 14:42:49 +00:00
parent 770135af5f
commit ed05fc771c
4 changed files with 316 additions and 117 deletions

View File

@@ -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<SettingsListener> listeners = new LinkedList<SettingsListener>();
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<String> inputLangs, List<String> 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<String> getInputLanguages() {
return fromLangBox.getSelectedValues();
}
public List<String> 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();
}
}

View File

@@ -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<SubmitListener> listeners = new LinkedList<SubmitListener>();
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<String> 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);
}
}

View File

@@ -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<String> inputLangs, List<String> 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();
}
}

View File

@@ -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;
}