checkbox handling and focus/enter/escape handling for checkbox work

This commit is contained in:
Axel Uhl committed 2011-08-26 15:10:41 +02:00
1 parent c55eb8cfb9
commit d2a00020d2
6 files changed
+236 -35

No files matched your search

@@ -0,0 +1,154 @@
package com.sap.sailing.gwt.ui.client;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
/**
* An abstract data entry dialog class, capturing data of type <code>T</code>, with generic OK/Cancel buttons, title
* and message.
*
* @author Axel Uhl (d043530)
*/
public abstract class DataEntryDialog<T> {
private final DialogBox dateEntryDialog;
private final Validator<T> validator;
private final Button okButton;
private final Button cancelButton;
private final Label statusLabel;
private final HorizontalPanel panelForAdditionalWidget;
public static interface Validator<T> {
/**
* @return <code>null</code> in case the <code>valueToValidate</code> is valid; a user-readable error message otherwise
*/
String getErrorMessage(T valueToValidate);
}
public DataEntryDialog(String title, String message, String okButtonName, String cancelButtonName,
String initialValue, Validator<T> validator, final AsyncCallback<T> callback) {
dateEntryDialog = new DialogBox();
dateEntryDialog.setText(title);
dateEntryDialog.setAnimationEnabled(true);
this.validator = validator;
okButton = new Button(okButtonName);
VerticalPanel dialogVPanel = new VerticalPanel();
statusLabel = new Label();
dialogVPanel.add(statusLabel);
dialogVPanel.add(new Label(message));
dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT);
panelForAdditionalWidget = new HorizontalPanel();
dialogVPanel.add(panelForAdditionalWidget);
HorizontalPanel buttonPanel = new HorizontalPanel();
dialogVPanel.add(buttonPanel);
buttonPanel.add(okButton);
cancelButton = new Button(cancelButtonName);
buttonPanel.add(cancelButton);
cancelButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
dateEntryDialog.hide();
callback.onFailure(null);
}
});
dateEntryDialog.setWidget(dialogVPanel);
okButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
dateEntryDialog.hide();
callback.onSuccess(getResult());
}
});
}
protected boolean validate() {
String errorMessage = validator.getErrorMessage(getResult());
if (errorMessage == null) {
getStatusLabel().setText("");
} else {
getStatusLabel().setText(errorMessage);
}
return errorMessage == null;
}
protected abstract T getResult();
/**
* Creates a text box with a key-up listener attached which ensures the value is updated after each
* key-up event and the entire dialog is {@link #validate() validated} in this case.
*
* @param initialValue initial value to show in text box; <code>null</code> is permissible
*/
protected TextBox createTextBox(String initialValue) {
TextBox textBox = new TextBox();
textBox.setText(initialValue == null ? "" : initialValue);
AbstractEntryPoint.addFocusUponKeyUpToggler(textBox);
textBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
validate();
}
});
AbstractEntryPoint.linkEnterToButton(getOkButton(), textBox);
AbstractEntryPoint.linkEscapeToButton(getCancelButton(), textBox);
return textBox;
}
protected CheckBox createCheckbox(String checkboxLabel) {
CheckBox result = new CheckBox(checkboxLabel);
result.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
@Override
public void onValueChange(ValueChangeEvent<Boolean> event) {
validate();
}
});
AbstractEntryPoint.linkEnterToButton(getOkButton(), result);
AbstractEntryPoint.linkEscapeToButton(getCancelButton(), result);
return result;
}
/**
* Can contribute an additional widget to be displayed underneath the text entry field. If <code>null</code> is
* returned, no additional widget will be displayed. This is the default behavior of this default implementation.
*/
protected Widget getAdditionalWidget() {
return null;
}
protected Button getOkButton() {
return okButton;
}
protected Button getCancelButton() {
return cancelButton;
}
/**
* status label can be used to display status information within the dialog to the user
*/
protected Label getStatusLabel() {
return statusLabel;
}
public void show() {
Widget additionalWidget = getAdditionalWidget();
if (additionalWidget != null) {
panelForAdditionalWidget.add(additionalWidget);
}
validate();
dateEntryDialog.center();
}
}
@@ -48,6 +48,18 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer
private LeaderboardDAO selectedLeaderboard;
private final Button renameLeaderboardButton;
private final Button editLeaderboardScoresButton;
private final Button removeLeaderboardButton;
private final Button addColumnButton;
private final Button columnRenameButton;
private final Button columnRemoveButton;
public LeaderboardConfigPanel(SailingServiceAsync sailingService, AdminConsole adminConsole,
ErrorReporter errorReporter, StringConstants stringConstants) {
this.stringConstants = stringConstants;
@@ -104,25 +116,25 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer
addNewLeaderboard();
}
});
Button renameButton = new Button(stringConstants.renameDotDotDot());
verticalPanel.add(renameButton);
renameButton.addClickHandler(new ClickHandler() {
renameLeaderboardButton = new Button(stringConstants.renameDotDotDot());
verticalPanel.add(renameLeaderboardButton);
renameLeaderboardButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
renameSelectedLeaderboard();
}
});
Button btnEditScores = new Button(stringConstants.editScores());
verticalPanel.add(btnEditScores);
btnEditScores.addClickHandler(new ClickHandler() {
editLeaderboardScoresButton = new Button(stringConstants.editScores());
verticalPanel.add(editLeaderboardScoresButton);
editLeaderboardScoresButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
// TODO Auto-generated method stub
}
});
Button btnRemove = new Button(stringConstants.remove());
verticalPanel.add(btnRemove);
btnRemove.addClickHandler(new ClickHandler() {
removeLeaderboardButton = new Button(stringConstants.remove());
verticalPanel.add(removeLeaderboardButton);
removeLeaderboardButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
removeSelectedLeaderboard();
@@ -151,27 +163,27 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer
VerticalPanel buttonPanelForSelectedLeaderboardDetails = new VerticalPanel();
grid.setWidget(3, 1, buttonPanelForSelectedLeaderboardDetails);
Button btnAdd = new Button(stringConstants.addDotDotDot());
buttonPanelForSelectedLeaderboardDetails.add(btnAdd);
btnAdd.addClickHandler(new ClickHandler() {
addColumnButton = new Button(stringConstants.addDotDotDot());
buttonPanelForSelectedLeaderboardDetails.add(addColumnButton);
addColumnButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
addColumnToSelectedLeaderboard();
}
});
Button btnRename = new Button(stringConstants.renameDotDotDot());
buttonPanelForSelectedLeaderboardDetails.add(btnRename);
btnRename.addClickHandler(new ClickHandler() {
columnRenameButton = new Button(stringConstants.renameDotDotDot());
buttonPanelForSelectedLeaderboardDetails.add(columnRenameButton);
columnRenameButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
// TODO implement rename column
}
});
Button btnRemove_1 = new Button(stringConstants.remove());
buttonPanelForSelectedLeaderboardDetails.add(btnRemove_1);
btnRemove_1.addClickHandler(new ClickHandler() {
columnRemoveButton = new Button(stringConstants.remove());
buttonPanelForSelectedLeaderboardDetails.add(columnRemoveButton);
columnRemoveButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
// TODO Auto-generated method stub
@@ -204,6 +216,8 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer
// TODO Auto-generated method stub
}
});
leaderboardSelectionChanged();
leaderboardRaceColumnSelectionChanged();
}
private void leaderboardRaceColumnSelectionChanged() {
@@ -211,6 +225,11 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer
if (selectedIndex >= 0) {
String selectedRaceColumnName = columnNamesInSelectedLeaderboardListBox.getItemText(selectedIndex);
medalRaceCheckBox.setValue(selectedLeaderboard.raceNamesAndMedalRace.get(selectedRaceColumnName));
columnRenameButton.setEnabled(true);
columnRemoveButton.setEnabled(true);
} else {
columnRenameButton.setEnabled(false);
columnRemoveButton.setEnabled(false);
}
}
@@ -245,6 +264,7 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer
@Override
public void onSuccess(Void v) {
columnNamesInSelectedLeaderboardListBox.addItem(columnNameAndMedalRace.getA());
selectedLeaderboard.raceNamesAndMedalRace.put(columnNameAndMedalRace.getA(), columnNameAndMedalRace.getB());
}
});
}
@@ -319,23 +339,36 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer
}
private String getSelectedLeaderboardName() {
return leaderboardsListBox.getItemText(leaderboardsListBox.getSelectedIndex());
int selectedIndex = leaderboardsListBox.getSelectedIndex();
return selectedIndex >= 0 ? leaderboardsListBox.getItemText(selectedIndex) : null;
}
protected void leaderboardSelectionChanged() {
final String leaderboardName = getSelectedLeaderboardName();
sailingService.getLeaderboardByName(leaderboardName,
new Date(), new AsyncCallback<LeaderboardDAO>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to fetch leaderboard "+leaderboardName+" from the server: "+caught.getMessage());
}
@Override
public void onSuccess(LeaderboardDAO result) {
selectedLeaderboard = result;
updateLeaderboardDisplays();
}
});
if (leaderboardName != null) {
sailingService.getLeaderboardByName(leaderboardName, new Date(), new AsyncCallback<LeaderboardDAO>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error trying to fetch leaderboard " + leaderboardName
+ " from the server: " + caught.getMessage());
}
@Override
public void onSuccess(LeaderboardDAO result) {
selectedLeaderboard = result;
updateLeaderboardDisplays();
addColumnButton.setEnabled(true);
editLeaderboardScoresButton.setEnabled(true);
renameLeaderboardButton.setEnabled(true);
removeLeaderboardButton.setEnabled(true);
}
});
} else {
addColumnButton.setEnabled(false);
editLeaderboardScoresButton.setEnabled(false);
renameLeaderboardButton.setEnabled(false);
removeLeaderboardButton.setEnabled(false);
}
}
protected void updateLeaderboardDisplays() {
@@ -350,6 +383,7 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer
for (String columnName : selectedLeaderboard.raceNamesAndMedalRace.keySet()) {
columnNamesInSelectedLeaderboardListBox.addItem(columnName);
}
leaderboardRaceColumnSelectionChanged();
}
private void updateLeaderboardNamesListBox() {
@@ -24,10 +24,12 @@ public class TextfieldEntryDialog extends DataEntryDialog<String> {
* Can contribute an additional widget to be displayed underneath the text entry field. If <code>null</code> is
* returned, no additional widget will be displayed. This is the default behavior of this default implementation.
*/
@Override
protected Widget getAdditionalWidget() {
return entryField;
}
@Override
public void show() {
super.show();
entryField.setFocus(true);
@@ -14,14 +14,18 @@ public class TextfieldEntryDialogWithCheckbox extends DataEntryDialog<Pair<Strin
public TextfieldEntryDialogWithCheckbox(String title, String message, String okButtonName, String cancelButtonName,
String checkboxLabel, String initialValue, Validator<Pair<String, Boolean>> validator, AsyncCallback<Pair<String, Boolean>> callback) {
super(title, message, okButtonName, cancelButtonName, initialValue, validator, callback);
checkbox = new CheckBox(checkboxLabel);
checkbox = createCheckbox(checkboxLabel);
entryField = createTextBox(initialValue);
}
@Override
protected Widget getAdditionalWidget() {
VerticalPanel panel = new VerticalPanel();
panel.add(super.getAdditionalWidget());
Widget additionalWidget = super.getAdditionalWidget();
if (additionalWidget != null) {
panel.add(additionalWidget);
}
panel.add(entryField);
panel.add(checkbox);
return panel;
}
@@ -31,4 +35,9 @@ public class TextfieldEntryDialogWithCheckbox extends DataEntryDialog<Pair<Strin
return new Pair<String, Boolean>(entryField.getValue(), checkbox.getValue());
}
@Override
public void show() {
super.show();
entryField.setFocus(true);
}
}
@@ -12,6 +12,7 @@ import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -100,7 +101,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
TimePoint timePoint = new MillisecondsTimePoint(date);
result.competitors = new ArrayList<CompetitorDAO>();
result.name = leaderboard.getName();
result.raceNamesAndMedalRace = new HashMap<String, Boolean>();
result.raceNamesAndMedalRace = new LinkedHashMap<String, Boolean>();
for (RaceInLeaderboard raceColumn : leaderboard.getRaceColumns()) {
result.raceNamesAndMedalRace.put(raceColumn.getName(), raceColumn.isMedalRace());
}
@@ -1,5 +1,6 @@
package com.sap.sailing.gwt.ui.shared;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -15,7 +16,7 @@ import com.google.gwt.user.client.rpc.IsSerializable;
public class LeaderboardDAO implements IsSerializable {
public String name;
public List<CompetitorDAO> competitors;
public Map<String, Boolean> raceNamesAndMedalRace;
public LinkedHashMap<String, Boolean> raceNamesAndMedalRace;
public Map<CompetitorDAO, LeaderboardRowDAO> rows;
public boolean hasCarriedPoints;
public int[] discardThresholds;