/******************************************************************************* * Copyright (c) 2012-2015 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.jseditor.client.preference.keymaps; import java.util.List; import org.eclipse.che.ide.jseditor.client.editortype.EditorType; import org.eclipse.che.ide.jseditor.client.keymap.Keymap; import com.google.gwt.cell.client.AbstractInputCell; import com.google.gwt.cell.client.SelectionCell; import com.google.gwt.cell.client.ValueUpdater; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.BrowserEvents; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.dom.client.SelectElement; import com.google.gwt.safehtml.client.SafeHtmlTemplates; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; public class KeymapSelectionCell extends AbstractInputCell<Keymap, String> { interface Template extends SafeHtmlTemplates { @Template("<option value=\"{0}\">{1}</option>") SafeHtml deselected(String key, String display); @Template("<option value=\"{0}\" selected=\"selected\">{1}</option>") SafeHtml selected(String key, String display); @Template("<select class=\"{0} {1}\">") SafeHtml select(String classname, String selectWidthStyle); } private static Template template; private final String stylename; private final String widthStylename; /** * Construct a new {@link SelectionCell} with the specified options. * * @param options the options in the cell */ public KeymapSelectionCell(final String stylename, final String widthStylename) { super(BrowserEvents.CHANGE); initTemplate(); this.stylename = stylename; this.widthStylename = widthStylename; } @Override public void onBrowserEvent(final Context context, final Element parent, final Keymap value, final NativeEvent event, final ValueUpdater<Keymap> valueUpdater) { super.onBrowserEvent(context, parent, value, event, valueUpdater); String type = event.getType(); if (BrowserEvents.CHANGE.equals(type)) { final EditorType key = (EditorType)context.getKey(); final SelectElement select = parent.getFirstChild().cast(); final List<Keymap> keymapsForRow = Keymap.getInstances(key); final Keymap newValue = keymapsForRow.get(select.getSelectedIndex()); setViewData(key, newValue.getKey()); finishEditing(parent, newValue, key, valueUpdater); if (valueUpdater != null) { valueUpdater.update(newValue); } } } @Override public void render(final Context context, final Keymap keymap, final SafeHtmlBuilder sb) { // Get the view data. EditorType editorType = (EditorType)context.getKey(); String viewData = getViewData(editorType); if (viewData != null && viewData.equals(keymap.getKey())) { clearViewData(editorType); viewData = null; } final List<Keymap> keymapsForRow = Keymap.getInstances(editorType); final int selectedIndex = getIndex(keymapsForRow, viewData, keymap); if (keymapsForRow == null || keymapsForRow.isEmpty()) { return; } sb.append(template.select(this.stylename, this.widthStylename)); int index = 0; for (final Keymap option : keymapsForRow) { if (index++ == selectedIndex) { sb.append(template.selected(option.getKey(), option.getDisplay())); } else { sb.append(template.deselected(option.getKey(), option.getDisplay())); } } sb.appendHtmlConstant("</select>"); } private int getIndex(final List<Keymap> keymapsForRow, final String viewData, final Keymap keymap) { String value = viewData; if (value == null) { if (keymap != null) { value = keymap.getKey(); } else { return -1; } } for (int i = 0; i < keymapsForRow.size(); i++) { final Keymap item = keymapsForRow.get(i); if (item != null && item.getKey().equals(value)) { return i; } } return -1; } private static void initTemplate() { if (template == null) { template = GWT.create(Template.class); } } }