/******************************************************************************* * 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.menu; import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.ui.UIObject; import com.google.inject.Provider; import org.eclipse.che.ide.api.action.Action; import org.eclipse.che.ide.api.action.ActionGroup; import org.eclipse.che.ide.api.action.ActionManager; import org.eclipse.che.ide.api.action.ActionSelectedHandler; import org.eclipse.che.ide.api.action.Presentation; import org.eclipse.che.ide.api.keybinding.KeyBindingAgent; import org.eclipse.che.ide.api.parts.PerspectiveManager; import org.eclipse.che.ide.ui.toolbar.MenuLockLayer; import org.eclipse.che.ide.ui.toolbar.PopupMenu; import org.eclipse.che.ide.ui.toolbar.PresentationFactory; import org.eclipse.che.ide.ui.toolbar.Utils; /** * Menu bar is implementation of Menu interface and represents a visual component. * * @author Vitaliy Gulyy * @author Dmitry Shnurenko */ public class MenuBarItem implements ActionSelectedHandler { private final ActionGroup group; private final ActionManager actionManager; private final Provider<PerspectiveManager> managerProvider; private final PresentationFactory presentationFactory; /** * Working variable: * is need to store pressed state. */ boolean pressed = false; /** Visual element which is table cell. */ private Element element; /** Enabled or disabled state */ private boolean enabled = true; private boolean hasVisibleItems = true; private ActionSelectedHandler actionSelectedHandler; private KeyBindingAgent keyBindingAgent; private MenuResources.Css css; /** * Working variable: * is needs to store opened Popup menu. */ private PopupMenu popupMenu; /** Title of Menu Bar Item */ private String title; public MenuBarItem(ActionGroup group, ActionManager actionManager, Provider<PerspectiveManager> managerProvider, PresentationFactory presentationFactory, Element element, ActionSelectedHandler handler, KeyBindingAgent keyBindingAgent, MenuResources.Css css) { this.group = group; this.actionManager = actionManager; this.managerProvider = managerProvider; this.presentationFactory = presentationFactory; this.element = element; this.actionSelectedHandler = handler; this.keyBindingAgent = keyBindingAgent; this.css = css; Presentation presentation = presentationFactory.getPresentation(group); title = presentation.getText(); element.setInnerText(presentation.getText()); setEnabled(Utils.hasVisibleChildren(group, presentationFactory, actionManager, managerProvider.get())); } /** Close opened Popup Menu. */ public void closePopupMenu() { popupMenu.closePopup(); } /** {@inheritDoc} */ public boolean isEnabled() { return enabled; } /** {@inheritDoc} */ public void setEnabled(boolean enabled) { this.enabled = enabled; updateEnabledState(); } /** Mouse Down handler */ public boolean onMouseDown() { if (enabled && hasVisibleItems) { element.setClassName(css.menuBarItemSelected()); pressed = true; actionSelectedHandler.onActionSelected(group); return true; } return false; } /** Mouse Out Handler */ public void onMouseOut() { if (pressed) { return; } if (enabled && hasVisibleItems) { element.setClassName(css.menuBarItem()); } else { element.setClassName(css.menuBarItemDisabled()); } } /** Mouse Over Handler */ public void onMouseOver() { if (pressed) { return; } if (enabled && hasVisibleItems) { element.setClassName(css.menuBarItemOver()); } } /** * Open sub Popup Menu * * @param menuLockLayer * - lock layer which will receive PopupMenu visual component and */ public void openPopupMenu(MenuLockLayer menuLockLayer) { int x = element.getAbsoluteLeft(); int y = 0; popupMenu = new PopupMenu(group, actionManager, managerProvider, presentationFactory, menuLockLayer, this, keyBindingAgent, "topmenu/" + title); menuLockLayer.add(popupMenu, x, y); } /** Reset visual state of Menu Bar Item to default. */ public void setNormalState() { pressed = false; element.setClassName(css.menuBarItem()); } private void updateEnabledState() { pressed = false; if (enabled && hasVisibleItems) { element.setClassName(css.menuBarItem()); } else { element.setClassName(css.menuBarItemDisabled()); } UIObject.ensureDebugId(element, "MenuItem/" + actionManager.getId(group) + "-" + enabled); } /** {@inheritDoc} */ @Override public void onActionSelected(Action action) { setNormalState(); actionSelectedHandler.onActionSelected(action); } public String getTitle() { return title; } public void update() { setEnabled(Utils.hasVisibleChildren(group, presentationFactory, actionManager, managerProvider.get())); } }