// Copyright 2012 Google Inc. All Rights Reserved. // // 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.collide.client.ui.list; import elemental.events.Event; import elemental.events.EventListener; import elemental.events.KeyboardEvent; import elemental.events.KeyboardEvent.KeyCode; import elemental.html.Element; /** * A controller which attaches to an input element and proxies keyboard * navigation events to an object which {@link HasSelection}. * */ public class KeyboardSelectionController { private final Element inputElement; private final HasSelection list; private boolean handlerEnabled = false; /** * Creates a new KeyboardSelectionController which proxies keyboard events * from inputElement to the supplied list. */ public KeyboardSelectionController(Element inputElement, HasSelection list) { this.inputElement = inputElement; this.list = list; attachHandlers(); } /** * Disables/Enables the keyboard navigation. When the handler is disabled the * controller will not proxy any keyboard input. This is useful if the list is * hidden or disabled. */ public void setHandlerEnabled(boolean enabled) { handlerEnabled = enabled; // reset the selection to the first item list.setSelectedItem(0); } private void attachHandlers() { inputElement.addEventListener(Event.KEYDOWN, new EventListener() { @Override public void handleEvent(Event evt) { if (!handlerEnabled) { return; } KeyboardEvent event = (KeyboardEvent) evt; if (event.getKeyCode() == KeyCode.DOWN) { list.selectNext(); evt.preventDefault(); } else if (event.getKeyCode() == KeyCode.UP) { list.selectPrevious(); evt.preventDefault(); } else if (event.getKeyCode() == KeyCode.ENTER) { list.handleClick(); } } }, false); } }