/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.machine.chooser; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.PopupPanel; import com.google.inject.Inject; import org.eclipse.che.api.core.model.machine.Machine; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Implementation of {@link MachineChooserView} which pops up list of the machines. * User can select machine with Enter key or cancel selection with Esc key. * * @author Artem Zatsarynnyi */ public class MachineChooserViewImpl extends PopupPanel implements MachineChooserView { private static final MachineChooserViewImplUiBinder UI_BINDER = GWT.create(MachineChooserViewImplUiBinder.class); /** Map that contains all shown machines. */ private final Map<String, Machine> machinesById; @UiField ListBox machinesList; private ActionDelegate delegate; @Inject public MachineChooserViewImpl() { machinesById = new HashMap<>(); setWidget(UI_BINDER.createAndBindUi(this)); initView(); addHandlers(); } private void initView() { setAutoHideEnabled(true); setAnimationEnabled(true); setAnimationType(AnimationType.ROLL_DOWN); } private void addHandlers() { addCloseHandler(event -> { if (event.isAutoClosed()) { delegate.onCanceled(); } }); machinesList.addDoubleClickHandler(event -> { final String selectedMachineId = machinesList.getSelectedValue(); if (selectedMachineId != null) { final Machine selectedMachine = machinesById.get(selectedMachineId); if (selectedMachine != null) { delegate.onMachineSelected(selectedMachine); } } }); machinesList.addKeyPressHandler(event -> { final int keyCode = event.getNativeEvent().getKeyCode(); if (KeyCodes.KEY_ENTER == keyCode || KeyCodes.KEY_MAC_ENTER == keyCode) { final String selectedMachineId = machinesList.getSelectedValue(); if (selectedMachineId != null) { final Machine selectedMachine = machinesById.get(selectedMachineId); if (selectedMachine != null) { delegate.onMachineSelected(selectedMachine); } } } }); machinesList.addKeyDownHandler(event -> { if (KeyCodes.KEY_ESCAPE == event.getNativeKeyCode()) { hide(true); } }); } @Override public void setDelegate(ActionDelegate delegate) { this.delegate = delegate; } @Override public void show() { super.show(); center(); machinesList.setFocus(true); } @Override public void close() { hide(); } @Override public void setMachines(List<? extends Machine> machines) { machinesList.clear(); machinesById.clear(); machines.forEach(machine -> { machinesById.put(machine.getId(), machine); machinesList.addItem(machine.getConfig().getName(), machine.getId()); }); machinesList.setVisibleItemCount(machines.size()); machinesList.setSelectedIndex(0); } interface MachineChooserViewImplUiBinder extends UiBinder<FlowPanel, MachineChooserViewImpl> { } }