/******************************************************************************* * 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.ui.toolbar; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOutHandler; import com.google.gwt.event.dom.client.MouseOverEvent; import com.google.gwt.event.dom.client.MouseOverHandler; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.MouseUpHandler; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Image; import org.eclipse.che.ide.api.action.Action; import org.eclipse.che.ide.api.action.ActionEvent; import org.eclipse.che.ide.api.action.ActionGroup; import org.eclipse.che.ide.api.action.ActionManager; import org.eclipse.che.ide.api.action.CustomComponentAction; import org.eclipse.che.ide.api.action.Presentation; import org.eclipse.che.ide.api.action.PropertyChangeEvent; import org.eclipse.che.ide.api.action.PropertyChangeListener; import org.eclipse.che.ide.api.parts.PerspectiveManager; import org.eclipse.che.ide.ui.Tooltip; import org.eclipse.che.ide.ui.menu.PositionController; import org.vectomatic.dom.svg.ui.SVGImage; /** * Toolbar image button. * * @author Evgen Vidolob */ public class ActionButton extends Composite implements MouseOverHandler, MouseOutHandler, MouseDownHandler, MouseUpHandler, ClickHandler { private final Presentation presentation; private final PerspectiveManager perspectiveManager; /** Command which will be executed when button was pressed. */ protected Action action; private FlowPanel panel; /** Is enabled. */ private boolean enabled = true; /** Is button selected. */ private boolean selected = false; private ActionManager actionManager; private ActionButtonSynchronizer actionButtonSynchronizer; private ToolbarResources toolbarResources; /** Tooltip */ private Tooltip tooltip; public ActionButton(Action action, ActionManager actionManager, Presentation presentation, PerspectiveManager perspectiveManager, ToolbarResources toolbarResources) { this.actionManager = actionManager; this.perspectiveManager = perspectiveManager; this.toolbarResources = toolbarResources; panel = new FlowPanel(); initWidget(panel); panel.setStyleName(toolbarResources.toolbar().iconButtonPanel()); this.action = action; this.presentation = presentation; addDomHandlers(); renderImage(); setEnabled(presentation.isEnabled()); setVisible(presentation.isVisible()); if (presentation.getDescription() != null) { tooltip = Tooltip.create((elemental.dom.Element)panel.getElement(), PositionController.VerticalAlign.BOTTOM, PositionController.HorizontalAlign.MIDDLE, presentation.getDescription()); } } /** {@inheritDoc} */ @Override protected void onLoad() { super.onLoad(); if (actionButtonSynchronizer == null) { actionButtonSynchronizer = new ActionButtonSynchronizer(); presentation.addPropertyChangeListener(actionButtonSynchronizer); } } /** {@inheritDoc} */ @Override protected void onUnload() { super.onUnload(); if (actionButtonSynchronizer != null) { presentation.removePropertyChangeListener(actionButtonSynchronizer); actionButtonSynchronizer = null; } } private void addDomHandlers() { panel.addDomHandler(this, MouseOverEvent.getType()); panel.addDomHandler(this, MouseOutEvent.getType()); panel.addDomHandler(this, MouseDownEvent.getType()); panel.addDomHandler(this, MouseUpEvent.getType()); panel.addDomHandler(this, ClickEvent.getType()); } /** Redraw icon. */ private void renderImage() { panel.clear(); if (presentation.getImageResource() != null) { Image img = new Image(presentation.getImageResource()); img.setStyleName(toolbarResources.toolbar().iconButtonIcon()); panel.add(img); } else if (presentation.getSVGResource() != null) { SVGImage image = new SVGImage(presentation.getSVGResource()); image.getElement().setAttribute("class", toolbarResources.toolbar().iconButtonIcon()); panel.add(image); } else if (presentation.getHTMLResource() != null) { FlowPanel icon = new FlowPanel(); icon.setStyleName(toolbarResources.toolbar().iconButtonIcon()); FlowPanel inner = new FlowPanel(); inner.setStyleName(toolbarResources.toolbar().iconButtonIconInner()); inner.getElement().setInnerHTML(presentation.getHTMLResource()); icon.add(inner); panel.add(inner); } } /** {@inheritDoc} */ public void setEnabled(boolean enabled) { this.enabled = enabled; if (enabled) { removeStyleName(toolbarResources.toolbar().disabled()); } else { if (selected) { panel.setStyleName(toolbarResources.toolbar().iconButtonPanelSelected()); } else { panel.setStyleName(toolbarResources.toolbar().iconButtonPanel()); } addStyleName(toolbarResources.toolbar().disabled()); } this.ensureDebugId("ActionButton/" + actionManager.getId(action) + "-" + enabled); } /** {@inheritDoc} */ public void setSelected(boolean selected) { this.selected = selected; if (selected) { panel.setStyleName(toolbarResources.toolbar().iconButtonPanelSelected()); } } /** Mouse Over handler. */ @Override public void onMouseOver(MouseOverEvent event) { } /** Mouse Out handler. */ @Override public void onMouseOut(MouseOutEvent event) { if (!enabled) { return; } if (selected) { panel.setStyleName(toolbarResources.toolbar().iconButtonPanelSelected()); } else { panel.setStyleName(toolbarResources.toolbar().iconButtonPanel()); } } /** Mouse Down handler. */ @Override public void onMouseDown(MouseDownEvent event) { if (!enabled) { return; } if (selected) { panel.setStyleName(toolbarResources.toolbar().iconButtonPanelSelectedDown()); } else { panel.setStyleName(toolbarResources.toolbar().iconButtonPanelDown()); } } /** Mouse Up handler. */ @Override public void onMouseUp(MouseUpEvent event) { } /** Mouse Click handler. */ @Override public void onClick(ClickEvent event) { if (!enabled) { return; } //todo handle popup group ActionEvent e = new ActionEvent(presentation, actionManager, perspectiveManager); if (action instanceof ActionGroup && !(action instanceof CustomComponentAction) && ((ActionGroup)action).isPopup()) { } else { action.actionPerformed(e); } } private class ActionButtonSynchronizer implements PropertyChangeListener { protected static final String SELECTED_PROPERTY_NAME = "selected"; @Override public void onPropertyChange(PropertyChangeEvent e) { String propertyName = e.getPropertyName(); if (Presentation.PROP_TEXT.equals(propertyName)) { if (tooltip != null && e.getNewValue() instanceof String) { tooltip.setTitle((String)e.getNewValue()); } } else if (Presentation.PROP_ENABLED.equals(propertyName)) { setEnabled((Boolean)e.getNewValue()); } else if (Presentation.PROP_ICON.equals(propertyName)) { renderImage(); } else if (Presentation.PROP_VISIBLE.equals(propertyName)) { setVisible((Boolean)e.getNewValue()); } else if (SELECTED_PROPERTY_NAME.equals(propertyName)) { setSelected((Boolean)e.getNewValue()); } } } }