/* * Copyright (C) 2011 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.api.explorer.client.editors; import com.google.api.explorer.client.Resources; import com.google.api.explorer.client.editors.Validator.ValidationResult; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.gwt.event.dom.client.FocusEvent; import com.google.gwt.event.dom.client.FocusHandler; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.MultiWordSuggestOracle; import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.SuggestOracle.Suggestion; import java.util.List; /** * Implementation of an {@link Editor} that suggests valid values to the user. * * @author jasonhall@google.com (Jason Hall) */ public class EnumEditor extends Editor { /** Values that will be suggested to the user. */ final List<String> enumValues; /** Descriptions of the values that will be suggested to the user. */ final List<String> enumDescriptions; EditorView view; EnumEditor(List<String> enumValues, List<String> enumDescriptions) { this.enumValues = enumValues; this.enumDescriptions = enumDescriptions; this.addValidator(new EnumValidator()); } @Override public EditorView createAndSetView() { EnumEditorViewImpl viewImpl = new EnumEditorViewImpl(enumValues, enumDescriptions); setView(viewImpl); return viewImpl; } /** * Validates that the parameter value is one of the defined valid enum values. */ public class EnumValidator implements Validator { @Override public ValidationResult isValid(List<String> values) { for (String value : values) { if (!value.isEmpty() && !enumValues.contains(value)) { return SimpleValidationResult.createError("Must be one of the specified values."); } } return SimpleValidationResult.STATUS_VALID; } } /** * {@link EditorView} implementation for displaying enum values using a * {@link SuggestBox}. */ static class EnumEditorViewImpl extends FlowPanel implements EditorView { private SuggestBox suggestBox; private Label errorMessage; EnumEditorViewImpl(final List<String> enumValues, final List<String> enumDescriptions) { // Sets up a SuggestOracle that, when the textbox has focus, displays the // valid enum values and their descriptions. MultiWordSuggestOracle oracle = new MultiWordSuggestOracle(); List<Suggestion> suggestions = Lists.newArrayList(); for (int i = 0; i < enumValues.size(); i++) { suggestions.add(new EnumSuggestion( enumValues.get(i), enumDescriptions == null ? "" : enumDescriptions.get(i))); } oracle.setDefaultSuggestions(suggestions); this.suggestBox = new SuggestBox(oracle); suggestBox.getTextBox().addFocusHandler(new FocusHandler() { @Override public void onFocus(FocusEvent event) { suggestBox.showSuggestionList(); } }); add(suggestBox); this.errorMessage = new Label("This parameter is invalid."); errorMessage.setVisible(false); add(errorMessage); } class EnumSuggestion implements Suggestion { private final String enumValue; private final String enumDisplay; EnumSuggestion(String enumValue, String enumDescription) { this.enumValue = enumValue; SafeHtmlBuilder newEnumDisplay = new SafeHtmlBuilder() .appendHtmlConstant("<b>").appendEscaped(enumValue).appendHtmlConstant("</b>"); if (!enumDescription.isEmpty()) { newEnumDisplay.appendHtmlConstant(": ").appendEscaped(enumDescription); } enumDisplay = newEnumDisplay.toSafeHtml().asString(); } @Override public String getDisplayString() { return enumDisplay; } @Override public String getReplacementString() { return enumValue; } } @Override public List<String> getValue() { return Lists.newArrayList(suggestBox.getValue()); } @Override public void setValue(List<String> values) { suggestBox.setValue(Iterables.getOnlyElement(values)); } @Override public void setEnabled(boolean enabled) { suggestBox.getTextBox().setEnabled(enabled); } @Override public void displayValidation(ValidationResult valid) { removeStyleName(Resources.INSTANCE.style().infoParameter()); removeStyleName(Resources.INSTANCE.style().invalidParameter()); switch(valid.getType()) { case VALID: errorMessage.setVisible(false); break; case INFO: addStyleName(Resources.INSTANCE.style().infoParameter()); errorMessage.setVisible(true); errorMessage.setText(valid.getMessage()); break; case ERROR: addStyleName(Resources.INSTANCE.style().invalidParameter()); errorMessage.setVisible(true); errorMessage.setText(valid.getMessage()); break; } } } }