mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-08 05:11:04 +00:00
checkbox handling and focus/enter/escape handling for checkbox work
This commit is contained in:
1 parent
c55eb8cfb9
commit
d2a00020d2
6 files changed
+236
-35
No files matched your search
Executable
+154
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
+65
-31
@@ -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() {
|
||||
|
||||
+2
@@ -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);
|
||||
|
||||
+11
-2
@@ -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);
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -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());
|
||||
}
|
||||
|
||||
+2
-1
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user