/*******************************************************************************
* 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.part.widgets.panemenu;
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.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.eclipse.che.ide.Resources;
import org.eclipse.che.ide.api.parts.EditorPartStack;
import javax.validation.constraints.NotNull;
/**
* Menu for managing opened editors for corresponding {@link EditorPartStack}.
*
* @author Dmitry Shnurenko
* @author Vitaliy Guliy
* @author Roman Nikitenko
*/
public class EditorPaneMenuWidget extends Composite implements EditorPaneMenu {
interface EditorPaneMenuWidgetUiBinder extends UiBinder<Widget, EditorPaneMenuWidget> {
}
private static final String GWT_POPUP_STANDARD_STYLE = "gwt-PopupPanel";
private static final EditorPaneMenuWidgetUiBinder UI_BINDER = GWT.create(EditorPaneMenuWidgetUiBinder.class);
private final PopupPanel popupPanel;
private final FlowPanel actionsPanel;
private final FlowPanel itemsPanel;
@UiField(provided = true)
final Resources resources;
private long closeTime;
@Inject
public EditorPaneMenuWidget(Resources resources) {
this.resources = resources;
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;
}
show();
}
}, MouseDownEvent.getType());
FlowPanel rootPanel = new FlowPanel();
rootPanel.addStyleName(resources.partStackCss().listItemPanel());
itemsPanel = new FlowPanel();
actionsPanel = new FlowPanel();
popupPanel = new PopupPanel();
popupPanel.setAutoHideEnabled(true);
popupPanel.removeStyleName(GWT_POPUP_STANDARD_STYLE);
popupPanel.add(rootPanel);
rootPanel.add(itemsPanel);
rootPanel.add(getDelimiter());
rootPanel.add(actionsPanel);
popupPanel.addCloseHandler(new CloseHandler<PopupPanel>() {
@Override
public void onClose(CloseEvent<PopupPanel> event) {
closeTime = System.currentTimeMillis();
}
});
}
@Override
public void show() {
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 hide() {
popupPanel.hide();
}
@Override
public void addItem(@NotNull EditorPaneMenuItem item) {
addItem(item, false);
}
/** {@inheritDoc} */
@Override
public void addItem(@NotNull EditorPaneMenuItem item, boolean isSeparated) {
FlowPanel targetPanel = item instanceof PaneMenuActionItemWidget ? actionsPanel : itemsPanel;
targetPanel.add(item);
if (isSeparated) {
targetPanel.add(getDelimiter());
}
}
/** {@inheritDoc} */
@Override
public void removeItem(@NotNull EditorPaneMenuItem item) {
FlowPanel targetPanel = item instanceof PaneMenuActionItemWidget ? actionsPanel : itemsPanel;
targetPanel.remove(item);
}
private FlowPanel getDelimiter() {
final FlowPanel delimiter = new FlowPanel();
delimiter.addStyleName(resources.coreCss().editorPaneMenuDelimiter());
return delimiter;
}
}