/******************************************************************************* * 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.macro.chooser; import com.google.gwt.view.client.ListDataProvider; import com.google.inject.Inject; import org.eclipse.che.commons.annotation.Nullable; import org.eclipse.che.ide.api.macro.Macro; import org.eclipse.che.ide.api.macro.MacroRegistry; import java.util.ArrayList; import java.util.List; import static java.util.Comparator.comparing; import static org.eclipse.che.ide.util.StringUtils.containsIgnoreCase; /** * Provides a simple mechanism for the user to choose a {@link Macro}. * * @author Artem Zatsarynnyi * @see #show(MacroChosenCallback) */ public class MacroChooser implements MacroChooserView.ActionDelegate { private final MacroChooserView view; private final MacroRegistry macroRegistry; /** * Provides macros list for the view. * All changes made in provider should be reflected in the view automatically. */ private final ListDataProvider<Macro> macrosProvider; private MacroChosenCallback callback; @Inject public MacroChooser(MacroChooserView view, MacroRegistry macroRegistry) { this.view = view; this.macroRegistry = macroRegistry; macrosProvider = new ListDataProvider<>(); view.setDelegate(this); view.bindMacrosList(macrosProvider); } /** * Pops up a macro chooser dialog. * {@link MacroChosenCallback} can be specified to be invoked when the user chose a {@link Macro}. * * @param callback * callback that will be called to report about chosen {@link Macro} */ public void show(@Nullable MacroChosenCallback callback) { this.callback = callback; updateMacrosProvider(macroRegistry.getMacros()); view.show(); } @Override public void onMacroChosen(Macro macro) { view.close(); if (callback != null) { callback.onMacroChosen(macro); } } @Override public void onFilterChanged(String filterValue) { final List<Macro> macrosList = new ArrayList<>(); if (filterValue.isEmpty()) { macrosList.addAll(macroRegistry.getMacros()); } else { // filter works by macro's name and description for (Macro macro : macroRegistry.getMacros()) { if (containsIgnoreCase(macro.getName(), filterValue) || containsIgnoreCase(macro.getDescription(), filterValue)) { macrosList.add(macro); } } } updateMacrosProvider(macrosList); } /** Updates internal {@link #macrosProvider} with the given {@code macrosList}. */ private void updateMacrosProvider(List<Macro> macrosList) { macrosProvider.getList().clear(); macrosProvider.getList().addAll(macrosList); macrosProvider.getList().sort(comparing(Macro::getName)); } /** Callback to notify when some macro has been chosen. */ public interface MacroChosenCallback { /** Called when macro has been chosen. */ void onMacroChosen(Macro macro); } }