org.eclipse.che.ide.part.editor.EditorPartStackView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.che.ide.part.editor.EditorPartStackView.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.part.editor;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.DeckLayoutPanel;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.ResizeComposite;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;

import org.eclipse.che.ide.api.parts.PartPresenter;
import org.eclipse.che.ide.api.parts.PartStackUIResources;
import org.eclipse.che.ide.api.parts.PartStackView;
import org.eclipse.che.ide.part.widgets.listtab.ListButton;

import javax.validation.constraints.NotNull;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import static com.google.gwt.dom.client.Style.Display.BLOCK;
import static com.google.gwt.dom.client.Style.Display.NONE;
import static com.google.gwt.dom.client.Style.Unit.PCT;

/**
 * @author Evgen Vidolob
 * @author Dmitry Shnurenko
 * @author Vitaliy Guliy
 */
public class EditorPartStackView extends ResizeComposite implements PartStackView, MouseDownHandler {

    interface PartStackUiBinder extends UiBinder<Widget, EditorPartStackView> {
    }

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

    @UiField
    DockLayoutPanel parent;

    @UiField
    FlowPanel tabsPanel;

    @UiField
    DeckLayoutPanel contentPanel;

    private final Map<PartPresenter, TabItem> tabs;
    private final AcceptsOneWidget partViewContainer;
    private final LinkedList<PartPresenter> contents;
    private final PartStackUIResources resources;

    private ActionDelegate delegate;
    private ListButton listButton;
    private TabItem activeTab;

    @Inject
    public EditorPartStackView(PartStackUIResources resources) {
        this.resources = resources;
        this.tabs = new HashMap<>();
        this.contents = new LinkedList<>();

        initWidget(UI_BINDER.createAndBindUi(this));

        partViewContainer = new AcceptsOneWidget() {
            @Override
            public void setWidget(IsWidget widget) {
                contentPanel.add(widget);
            }
        };

        addDomHandler(this, MouseDownEvent.getType());
    }

    /** {@inheritDoc} */
    @Override
    protected void onAttach() {
        super.onAttach();

        Style style = getElement().getParentElement().getStyle();
        style.setHeight(100, PCT);
        style.setWidth(100, PCT);
    }

    /**
     * Adds list button in special place on view.
     *
     * @param listButton
     *         button which will be added
     */
    public void setListButton(@NotNull ListButton listButton) {
        this.listButton = listButton;
        tabsPanel.add(listButton);
        listButton.setVisible(false);
    }

    /** {@inheritDoc} */
    @Override
    public void onMouseDown(@NotNull MouseDownEvent event) {
        delegate.onRequestFocus();
    }

    /** {@inheritDoc} */
    @Override
    public void setDelegate(ActionDelegate delegate) {
        this.delegate = delegate;
    }

    /** {@inheritDoc} */
    @Override
    public void addTab(@NotNull TabItem tabItem, @NotNull PartPresenter partPresenter) {
        /** Show editor area if it is empty and hidden */
        if (contents.isEmpty()) {
            getElement().getParentElement().getStyle().setDisplay(BLOCK);
        }

        /** Add editor tab to tab panel */
        tabsPanel.add(tabItem.getView());

        /** Process added editor tab */
        tabs.put(partPresenter, tabItem);
        contents.add(partPresenter);
        partPresenter.go(partViewContainer);
    }

    /**
     * Updates visibility of file list button.
     */
    private void updateDropdownVisibility() {
        if (tabsPanel.getWidgetCount() == 1) {
            listButton.setVisible(false);
            return;
        }

        int width = 0;
        for (int i = 0; i < tabsPanel.getWidgetCount(); i++) {
            if (listButton != null && listButton != tabsPanel.getWidget(i)) {
                if (tabsPanel.getWidget(i).isVisible()) {
                    width += tabsPanel.getWidget(i).getOffsetWidth();
                } else {
                    tabsPanel.getWidget(i).setVisible(true);
                    width += tabsPanel.getWidget(i).getOffsetWidth();
                    tabsPanel.getWidget(i).setVisible(false);
                }
            }
        }

        listButton.setVisible(width >= tabsPanel.getOffsetWidth());
    }

    /**
     * Makes active tab visible.
     */
    private void ensureActiveTabVisible() {
        if (activeTab == null) {
            return;
        }

        for (int i = 0; i < tabsPanel.getWidgetCount(); i++) {
            if (listButton != null && listButton != tabsPanel.getWidget(i)) {
                tabsPanel.getWidget(i).setVisible(true);
            }
        }

        for (int i = 0; i < tabsPanel.getWidgetCount(); i++) {
            if (listButton != null && listButton != tabsPanel.getWidget(i)) {
                if (activeTab.getView().asWidget().getAbsoluteTop() > tabsPanel.getAbsoluteTop()) {
                    tabsPanel.getWidget(i).setVisible(false);
                }
            }
        }
    }

    /** {@inheritDoc} */
    @Override
    public void removeTab(@NotNull PartPresenter presenter) {
        TabItem tab = tabs.get(presenter);
        tabsPanel.remove(tab.getView());
        contentPanel.remove(presenter.getView());

        tabs.remove(presenter);
        contents.remove(presenter);

        if (contents.isEmpty()) {
            getElement().getParentElement().getStyle().setDisplay(NONE);
        } else {
            selectTab(contents.getLast());
        }

        //this hack need to force redraw dom element to apply correct styles
        tabsPanel.getElement().getStyle().setDisplay(NONE);
        tabsPanel.getElement().getOffsetHeight();
        tabsPanel.getElement().getStyle().setDisplay(BLOCK);
    }

    /** {@inheritDoc} */
    @Override
    public void selectTab(@NotNull PartPresenter partPresenter) {
        IsWidget view = partPresenter.getView();

        int viewIndex = contentPanel.getWidgetIndex(view);
        if (viewIndex < 0) {
            partPresenter.go(partViewContainer);
            viewIndex = contentPanel.getWidgetIndex(view);
        }

        contentPanel.showWidget(viewIndex);
        setActiveTab(partPresenter);
    }

    /**
     * Switches to specified tab.
     *
     * @param part tab part
     */
    private void setActiveTab(@NotNull PartPresenter part) {
        for (TabItem tab : tabs.values()) {
            tab.unSelect();
            tab.getView().asWidget().getElement().removeAttribute("active");
        }

        activeTab = tabs.get(part);
        activeTab.select();

        activeTab.getView().asWidget().getElement().setAttribute("active", "");

        delegate.onRequestFocus();

        updateDropdownVisibility();
        ensureActiveTabVisible();
    }

    /** {@inheritDoc} */
    @Override
    public void setTabPositions(List<PartPresenter> partPositions) {
        throw new UnsupportedOperationException("The method doesn't allowed in this class " + getClass());
    }

    /** {@inheritDoc} */
    @Override
    public void setFocus(boolean focused) {
        if (focused) {
            activeTab.select();
        } else {
            activeTab.unSelect();
        }
    }

    /** {@inheritDoc} */
    @Override
    public void updateTabItem(@NotNull PartPresenter partPresenter) {
        TabItem tab = tabs.get(partPresenter);
        tab.update(partPresenter);
    }

    @Override
    public void onResize() {
        super.onResize();
        updateDropdownVisibility();
        ensureActiveTabVisible();
    }

}