org.eclipse.che.ide.ui.dropdown.DropDownWidgetImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.che.ide.ui.dropdown.DropDownWidgetImpl.java

Source

/*******************************************************************************
 * Copyright (c) 2012-2016 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.dropdown;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
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.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Provider;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;

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.ActionGroup;
import org.eclipse.che.ide.api.action.ActionManager;
import org.eclipse.che.ide.api.action.ActionSelectedHandler;
import org.eclipse.che.ide.api.action.DefaultActionGroup;
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.vectomatic.dom.svg.ui.SVGResource;

import javax.validation.constraints.NotNull;

import static com.google.gwt.dom.client.Style.Unit.PX;

/**
 * Class provides general view representation for header of drop down list.
 *
 * @author Valeriy Svydenko
 * @author Oleksii Orel
 * @author Vitaliy Guliy
 */
public class DropDownWidgetImpl extends Composite implements ActionSelectedHandler, ClickHandler, DropDownWidget {

    interface DropDownWidgetImplUiBinder extends UiBinder<Widget, DropDownWidgetImpl> {
    }

    private static final DropDownWidgetImplUiBinder UI_BINDER = GWT.create(DropDownWidgetImplUiBinder.class);

    @UiField
    FlowPanel marker;

    @UiField
    Label selectedElementName;

    @UiField
    FlowPanel selectedElement;

    @UiField
    FlowPanel listHeader;

    private final String actionGroupId;

    private final Resources resources;
    private final ActionManager actionManager;
    private final KeyBindingAgent keyBindingAgent;
    private final PresentationFactory presentationFactory;
    private final DefaultActionGroup actions;
    private final Provider<PerspectiveManager> managerProvider;

    private String selectedId;
    private String selectedName;
    private PopupMenu popupMenu;
    private MenuLockLayer lockLayer;

    @AssistedInject
    public DropDownWidgetImpl(Resources resources, ActionManager actionManager, KeyBindingAgent keyBindingAgent,
            Provider<PerspectiveManager> managerProvider, @NotNull @Assisted String actionGroupId) {
        this.resources = resources;
        this.actionGroupId = actionGroupId;

        initWidget(UI_BINDER.createAndBindUi(this));

        resources.dropdownListCss().ensureInjected();

        listHeader.setStyleName(resources.dropdownListCss().menuElement());

        marker.getElement().appendChild(resources.expansionImage().getSvg().getElement());
        marker.addStyleName(resources.dropdownListCss().expandedImage());

        addDomHandler(this, ClickEvent.getType());

        this.actionManager = actionManager;
        this.keyBindingAgent = keyBindingAgent;
        this.managerProvider = managerProvider;

        presentationFactory = new PresentationFactory();
        actions = new DefaultActionGroup(actionManager);

        Window.addResizeHandler(new ResizeHandler() {
            @Override
            public void onResize(ResizeEvent event) {
                updatePopup();
            }
        });
    }

    /** {@inheritDoc} */
    @Override
    public void selectElement(String id, String name) {
        selectedId = id;
        selectedName = name;
        selectedElementName.setText(name == null ? "---" : name);
    }

    /** {@inheritDoc} */
    @Nullable
    @Override
    public String getSelectedName() {
        return selectedName;
    }

    public String getSelectedId() {
        return selectedId;
    }

    /** {@inheritDoc} */
    @Override
    public void onClick(ClickEvent event) {
        int left = getAbsoluteLeft();
        int top = getAbsoluteTop() + listHeader.getOffsetHeight();
        int width = listHeader.getOffsetWidth();
        show(left, top, width);
    }

    /** {@inheritDoc} */
    @Override
    public void updatePopup() {
        if (popupMenu == null || !popupMenu.isAttached()) {
            return;
        }
        this.hide();
        int top = getAbsoluteTop() + listHeader.getOffsetHeight();
        show(getAbsoluteLeft(), top, listHeader.getOffsetWidth());
    }

    /** {@inheritDoc} */
    @Override
    public Action createAction(String id, String name) {
        return new SimpleListElementAction(id, name);
    }

    /** {@inheritDoc} */
    @Override
    public void onActionSelected(Action action) {
        this.hide();
    }

    /**
     * Shows a content menu and moves it to specified position.
     *
     * @param left
     *         horizontal position
     * @param top
     *         vertical position
     * @param width
     *         header width
     */
    private void show(int left, int top, int width) {
        hide();
        updateActions();

        lockLayer = new MenuLockLayer();
        popupMenu = new PopupMenu(actions, actionManager, managerProvider, presentationFactory, lockLayer, this,
                keyBindingAgent, actionGroupId);
        popupMenu.addStyleName(resources.dropdownListCss().dropDownListMenu());
        popupMenu.getElement().getStyle().setTop(top, PX);
        popupMenu.getElement().getStyle().setLeft(left, PX);
        popupMenu.getElement().getStyle().setWidth(width, PX);

        lockLayer.add(popupMenu);
    }

    /**
     * Refresh the list of visible actions.
     */
    private void updateActions() {
        actions.removeAll();

        ActionGroup mainActionGroup = (ActionGroup) actionManager.getAction(actionGroupId);
        if (mainActionGroup == null) {
            return;
        }

        Action[] children = mainActionGroup.getChildren(null);
        for (Action action : children) {
            Presentation presentation = presentationFactory.getPresentation(action);
            ActionEvent e = new ActionEvent(presentation, actionManager, managerProvider.get());

            action.update(e);
            if (presentation.isVisible()) {
                actions.add(action);
            }
        }
    }

    /** Hides opened content menu. */
    private void hide() {
        if (popupMenu != null) {
            popupMenu.removeFromParent();
            popupMenu = null;
        }

        if (lockLayer != null) {
            lockLayer.removeFromParent();
            lockLayer = null;
        }
    }

    /**
     * The action which describes simple element of the custom drop down list.
     */
    private class SimpleListElementAction extends Action {
        private final String id;
        private final String name;

        public SimpleListElementAction(String id, String name) {
            super(name);
            this.id = id;
            this.name = name;
        }

        /** {@inheritDoc} */
        @Override
        public void actionPerformed(ActionEvent e) {
            selectElement(id, name);
        }

        /** @return the id of the element */
        @NotNull
        public String getId() {
            return id;
        }

        /** @return the title of the element */
        @NotNull
        public String getName() {
            return name;
        }
    }

    /** Item style selectors for a categories list item. */
    public interface DropdownCss extends CssResource {
        String expandedImage();

        String menuElement();

        String dropDownListMenu();
    }

    public interface Resources extends ClientBundle {
        @Source({ "DropdownList.css", "org/eclipse/che/ide/api/ui/style.css" })
        DropdownCss dropdownListCss();

        @Source("expansionIcon.svg")
        SVGResource expansionImage();
    }

}