/******************************************************************************* * 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.hotkeys.dialog; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.SpanElement; import com.google.gwt.dom.client.Style; 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.dom.client.KeyUpEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; import com.google.inject.Singleton; import org.eclipse.che.ide.CoreLocalizationConstant; import org.eclipse.che.ide.api.hotkeys.HotKeyItem; import org.eclipse.che.ide.api.keybinding.Scheme; import org.eclipse.che.ide.hotkeys.HotKeyResources; import org.eclipse.che.ide.ui.list.CategoriesList; import org.eclipse.che.ide.ui.list.Category; import org.eclipse.che.ide.ui.list.CategoryRenderer; import org.eclipse.che.ide.ui.listbox.CustomListBox; import org.eclipse.che.ide.ui.window.Window; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Implementation {@link HotKeysDialogView} * * @author Alexander Andrienko * @author Artem Zatsarynnyi * @author @author <a href="mailto:ak@nuxeo.com">Arnaud Kervern</a> */ @Singleton public class HotKeysDialogViewImpl extends Window implements HotKeysDialogView { interface KeyMapViewImplUiBinder extends UiBinder<Widget, HotKeysDialogViewImpl> { } private final HotKeyResources hotKeyResources; private final Category.CategoryEventDelegate<HotKeyItem> keyBindingsEventDelegate = new Category.CategoryEventDelegate<HotKeyItem>() { @Override public void onListItemClicked(Element listItemBase, HotKeyItem hotKeyItem) { } }; private final CategoryRenderer<HotKeyItem> keyBindingsRenderer = new CategoryRenderer<HotKeyItem>() { @Override public void renderElement(Element element, HotKeyItem hotKeyItem) { element.setInnerText(hotKeyItem.getActionDescription()); element.addClassName(hotKeyResources.css().description()); if (hotKeyItem.isGlobal()) { element.addClassName(hotKeyResources.css().isGlobal()); } DivElement hotKeyElem = Document.get().createDivElement(); hotKeyElem.setInnerText(hotKeyItem.getHotKey()); hotKeyElem.addClassName(hotKeyResources.css().hotKey()); hotKeyElem.addClassName(hotKeyResources.css().floatRight()); element.appendChild(hotKeyElem); } @Override public SpanElement renderCategory(Category<HotKeyItem> category) { SpanElement spanElement = Document.get().createSpanElement(); spanElement.setInnerText(category.getTitle()); return spanElement; } }; private CategoriesList list; private List<Category<?>> categoriesList; private ActionDelegate delegate; private String filteredValue; Button saveButton; Button closeButton; Button printButton; @UiField FlowPanel category; @UiField TextBox filterInput; @UiField CustomListBox selectionListBox; @UiField FlowPanel selectionPanel; @Inject public HotKeysDialogViewImpl(KeyMapViewImplUiBinder uiBinder, CoreLocalizationConstant locale, org.eclipse.che.ide.Resources res, HotKeyResources hotKeyResources) { hotKeyResources.css().ensureInjected(); this.hotKeyResources = hotKeyResources; this.setTitle(locale.keyBindingsDialogTitle()); this.setWidget(uiBinder.createAndBindUi(this)); saveButton = createButton(locale.save(), "keybindings-saveButton-btn", new ClickHandler() { @Override public void onClick(ClickEvent clickEvent) { delegate.onSaveClicked(); } }); addButtonToFooter(saveButton); saveButton.addStyleName(resources.windowCss().primaryButton()); closeButton = createButton(locale.close(), "keybindings-closeButton-btn", new ClickHandler() { @Override public void onClick(ClickEvent event) { delegate.onCloseClicked(); } }); addButtonToFooter(closeButton); printButton = createButton(locale.print(), "keybindings-printButton-btn", new ClickHandler() { @Override public void onClick(ClickEvent clickEvent) { delegate.onPrintClicked(); } }); addButtonToFooter(printButton); list = new CategoriesList(res); categoriesList = new ArrayList<>(); category.add(list); filterInput.getElement().setAttribute("placeholder", "Search"); selectionListBox.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent changeEvent) { delegate.onSchemeSelectionChanged(); } }); // Override DockLayoutPanel Overflow to correctly display ListBox selectionPanel.getElement().getParentElement().getStyle().setOverflow(Style.Overflow.VISIBLE); } @Override public void setDelegate(ActionDelegate delegate) { this.delegate = delegate; } @Override public void hide() { super.hide(); resetFilter(); } @Override public void renderKeybindings() { list.clear(); list.render(categoriesList, true); } @Override public void setData(Map<String, List<HotKeyItem>> data) { categoriesList.clear(); for (Map.Entry<String, List<HotKeyItem>> elem : data.entrySet()) { categoriesList.add(new Category<>(elem.getKey(), keyBindingsRenderer, elem.getValue(), keyBindingsEventDelegate)); } } @Override public String getSelectedScheme() { return selectionListBox.getValue(); } @Override public void setSchemes(String select, List<Scheme> schemes) { selectionListBox.clear(); for (Scheme s : schemes) { selectionListBox.addItem(s.getDescription(), s.getSchemeId()); if (s.getSchemeId().equals(select)) { // TODO Might be a better way to select item selectionListBox.setSelectedIndex(selectionListBox.getItemCount() - 1); } } } @UiHandler("filterInput") public void onKeyUp(KeyUpEvent keyUpEvent) { String value = filterInput.getText(); if (!filterInput.getText().equals(filteredValue)) { filteredValue = value; delegate.onFilterValueChanged(value); } } private void resetFilter() { filterInput.setText(""); filterInput.setFocus(true); } }