/******************************************************************************* * 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.multisplitpanel.menu; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; import org.vectomatic.dom.svg.ui.SVGResource; /** * Widget that represents the {@link Menu}. * * @author Artem Zatsarynnyi */ public class MenuWidget extends Composite implements Menu { private static final String GWT_POPUP_STANDARD_STYLE = "gwt-PopupPanel"; private static final ListButtonWidgetUiBinder UI_BINDER = GWT.create(ListButtonWidgetUiBinder.class); @UiField(provided = true) final Resources resources; private final PopupPanel popupPanel; private final FlowPanel listPanel; private ActionDelegate delegate; private long closeTime; private MenuItem.ActionDelegate itemDelegate = new MenuItem.ActionDelegate() { @Override public void onItemSelected(MenuItem menuItem) { popupPanel.hide(); if (delegate != null) { delegate.onMenuItemSelected(menuItem); } } @Override public void onItemClosing(MenuItem menuItem) { popupPanel.hide(); if (delegate != null) { delegate.onMenuItemClosing(menuItem); } } }; @Inject public MenuWidget(Resources resources) { this.resources = resources; resources.css().ensureInjected(); initWidget(UI_BINDER.createAndBindUi(this)); closeTime = System.currentTimeMillis(); addDomHandler(new MouseDownHandler() { @Override public void onMouseDown(MouseDownEvent event) { long time = System.currentTimeMillis(); if (time - closeTime < 100) { return; } showList(); } }, MouseDownEvent.getType()); listPanel = new FlowPanel(); listPanel.addStyleName(resources.css().listItemPanel()); popupPanel = new PopupPanel(); popupPanel.setAutoHideEnabled(true); popupPanel.removeStyleName(GWT_POPUP_STANDARD_STYLE); popupPanel.add(listPanel); popupPanel.addCloseHandler(new CloseHandler<PopupPanel>() { @Override public void onClose(CloseEvent<PopupPanel> event) { closeTime = System.currentTimeMillis(); } }); } public void showList() { int x = getAbsoluteLeft() + getOffsetWidth() - 6; int y = getAbsoluteTop() + 19; popupPanel.show(); popupPanel.getElement().getStyle().setProperty("position", "absolute"); popupPanel.getElement().getStyle().clearProperty("left"); popupPanel.getElement().getStyle().setProperty("right", "calc(100% - " + x + "px"); popupPanel.getElement().getStyle().setProperty("top", "" + y + "px"); } @Override public void addListItem(MenuItem menuItem) { menuItem.setDelegate(itemDelegate); listPanel.add(menuItem); } @Override public void removeListItem(MenuItem menuItem) { listPanel.remove(menuItem); } @Override public void setDelegate(ActionDelegate delegate) { this.delegate = delegate; } public interface Resources extends ClientBundle { @Source({"style.css", "org/eclipse/che/ide/api/ui/style.css"}) Resources.Styles css(); @Source("multi-file-icon.svg") SVGResource multiFileIcon(); interface Styles extends CssResource { String listItemPanel(); } } interface ListButtonWidgetUiBinder extends UiBinder<Widget, MenuWidget> { } }