/*******************************************************************************
* 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.command.toolbar.commands.button;
import elemental.dom.Element;
import elemental.html.DivElement;
import elemental.html.SpanElement;
import com.google.gwt.safehtml.shared.SafeHtml;
import org.eclipse.che.commons.annotation.Nullable;
import org.eclipse.che.ide.api.action.Action;
import org.eclipse.che.ide.api.action.ActionEvent;
import org.eclipse.che.ide.api.action.ActionManager;
import org.eclipse.che.ide.api.command.CommandGoal;
import org.eclipse.che.ide.api.keybinding.KeyBindingAgent;
import org.eclipse.che.ide.command.toolbar.ToolbarMessages;
import org.eclipse.che.ide.ui.Tooltip;
import org.eclipse.che.ide.ui.menubutton.MenuButton;
import org.eclipse.che.ide.ui.menubutton.MenuItem;
import org.eclipse.che.ide.util.dom.Elements;
import org.eclipse.che.ide.util.input.CharCodeWithModifiers;
import java.util.Optional;
import static org.eclipse.che.ide.ui.menu.PositionController.HorizontalAlign.MIDDLE;
import static org.eclipse.che.ide.ui.menu.PositionController.VerticalAlign.BOTTOM;
import static org.eclipse.che.ide.util.input.KeyMapUtil.getShortcutText;
/** {@link MenuButton} allows to chose a command for execution. */
public class ExecuteCommandButton extends MenuButton {
private static final String ACTION_PREFIX = "execute_command_";
private final CommandGoal goal;
private final ToolbarMessages messages;
private final CharCodeWithModifiers keyBinding;
private Tooltip tooltip;
private String tooltipText;
ExecuteCommandButton(CommandGoal goal,
SafeHtml icon,
ExecuteCommandButtonItemsProvider itemsProvider,
ToolbarMessages messages,
ActionManager actionManager,
KeyBindingAgent keyBindingAgent,
@Nullable CharCodeWithModifiers keyBinding) {
super(icon, itemsProvider);
this.goal = goal;
this.messages = messages;
this.keyBinding = keyBinding;
if (keyBinding != null) {
actionManager.registerAction(ACTION_PREFIX + goal.getId(), new ExecuteDefaultCommandAction());
keyBindingAgent.getGlobal().addKey(keyBinding, ACTION_PREFIX + goal.getId());
}
}
public ExecuteCommandButtonItemsProvider getItemsProvider() {
return (ExecuteCommandButtonItemsProvider)itemsProvider;
}
/** Updates button's tooltip depending on it's state (what child elements it contains). */
public void updateTooltip() {
final Optional<MenuItem> defaultItem = itemsProvider.getDefaultItem();
if (defaultItem.isPresent()) {
MenuItem menuItem = defaultItem.get();
String message = "";
if (menuItem instanceof CommandItem) {
message = messages.goalButtonTooltipExecute(menuItem.getName());
} else if (menuItem instanceof MachineItem) {
MachineItem machineMenuItem = (MachineItem)menuItem;
message = messages.goalButtonTooltipExecuteOnMachine(machineMenuItem.getCommand().getName(),
machineMenuItem.getName());
}
setTooltip(message, keyBinding);
} else if (getItemsProvider().containsGuideItemOnly()) {
setTooltip(messages.goalButtonTooltipNoCommand(goal.getId()), null);
} else {
setTooltip(messages.goalButtonTooltipChooseCommand(goal.getId()), null);
}
}
private void setTooltip(String newTooltipText, @Nullable CharCodeWithModifiers keyBinding) {
if (newTooltipText.equals(tooltipText)) {
return;
}
tooltipText = newTooltipText;
if (tooltip != null) {
tooltip.destroy();
}
final DivElement divElement = Elements.createDivElement();
divElement.setInnerText(newTooltipText);
if (keyBinding != null) {
final String hotKey = getShortcutText(keyBinding);
if (hotKey != null) {
SpanElement spanElement = Elements.createSpanElement();
spanElement.getStyle().setMarginLeft("5px");
spanElement.getStyle().setColor("#aaaaaa");
spanElement.setInnerText("[" + hotKey + "]");
divElement.appendChild(spanElement);
}
}
tooltip = Tooltip.create((Element)getElement(), BOTTOM, MIDDLE, divElement);
}
private class ExecuteDefaultCommandAction extends Action {
ExecuteDefaultCommandAction() {
super("Execute default command of " + goal.getId() + " goal");
}
@Override
public void actionPerformed(ActionEvent e) {
itemsProvider.getDefaultItem()
.ifPresent(defaultItem -> getActionHandler().ifPresent(handler -> handler.onAction(defaultItem)));
}
}
}