org.eclipse.che.ide.extension.machine.client.outputspanel.OutputsContainerViewImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.che.ide.extension.machine.client.outputspanel.OutputsContainerViewImpl.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.extension.machine.client.outputspanel;

import com.google.gwt.dom.client.Style.Overflow;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.HandlerRegistration;
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.DeckLayoutPanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import com.google.inject.Singleton;

import org.eclipse.che.ide.api.parts.PartStackUIResources;
import org.eclipse.che.ide.api.parts.base.BaseView;
import org.eclipse.che.ide.extension.machine.client.MachineResources;
import org.vectomatic.dom.svg.ui.SVGImage;

/**
 * Implementation of {@link OutputsContainerView}.
 *
 * @author Artem Zatsarynnyi
 */
@Singleton
public class OutputsContainerViewImpl extends BaseView<OutputsContainerView.ActionDelegate>
        implements OutputsContainerView {

    @UiField
    MachineResources resources;

    @UiField
    FlowPanel tabsPanel;

    @UiField
    DeckLayoutPanel contentPanel;

    PartStackUIResources partStackUIResources;

    @Inject
    public OutputsContainerViewImpl(PartStackUIResources partStackUIResources,
            OutputsContainerViewImplUiBinder uiBinder) {
        super(partStackUIResources);
        this.partStackUIResources = partStackUIResources;

        setContentWidget(uiBinder.createAndBindUi(this));

        minimizeButton.ensureDebugId("outputs-console-minimizeButton");

        // this hack used for adding box shadow effect to tabsPanel
        tabsPanel.getElement().getParentElement().getStyle().setOverflow(Overflow.VISIBLE);
        tabsPanel.getElement().getParentElement().getStyle().setZIndex(1);
    }

    @Override
    public void addConsole(String title, IsWidget widget) {
        tabsPanel.add(createTabButton(title));
        contentPanel.add(widget);
    }

    @Override
    public void insertConsole(String title, IsWidget widget, int position) {
        tabsPanel.insert(createTabButton(title), position);
        contentPanel.insert(widget, position);
    }

    private TabButton createTabButton(String title) {
        final TabButton tabButton = new TabButton(null, title);
        tabButton.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                delegate.onConsoleSelected(tabsPanel.getWidgetIndex(tabButton));
            }
        });
        return tabButton;
    }

    @Override
    public void showConsole(int index) {
        for (int i = 0; i < tabsPanel.getWidgetCount(); i++) {
            final Widget widget = tabsPanel.getWidget(i);
            if (i == index) {
                widget.addStyleName(resources.getCss().outputsContainerConsoleTabSelected());
            } else {
                widget.removeStyleName(resources.getCss().outputsContainerConsoleTabSelected());
            }
        }

        contentPanel.showWidget(index);
    }

    @Override
    public void removeConsole(int index) {
        tabsPanel.remove(index);
        contentPanel.remove(index);
    }

    @Override
    public void removeAllConsoles() {
        tabsPanel.clear();
        contentPanel.clear();
    }

    @Override
    protected void focusView() {
        contentPanel.getElement().focus();
    }

    interface OutputsContainerViewImplUiBinder extends UiBinder<Widget, OutputsContainerViewImpl> {
    }

    private class TabButton extends Composite {

        FlowPanel tabPanel;
        InlineLabel tabTitleLabel;

        SVGImage image;

        TabButton(SVGImage icon, String title) {
            tabPanel = new FlowPanel();
            tabPanel.ensureDebugId("outputs-container-tabButton");
            initWidget(tabPanel);

            setStyleName(resources.getCss().outputsContainerConsoleTab());
            addStyleName(resources.getCss().outputsContainerConsoleTabPanel());

            if (icon != null) {
                tabPanel.add(icon);
            }

            tabTitleLabel = new InlineLabel(title);
            tabTitleLabel.addStyleName(resources.getCss().outputsContainerConsoleTabLabel());
            tabPanel.add(tabTitleLabel);

            image = new SVGImage(partStackUIResources.closeIcon());
            image.setStyleName(resources.getCss().outputsContainerConsoleTabCloseButton());
            tabPanel.add(image);

            image.addClickHandler(new ClickHandler() {
                @Override
                public void onClick(ClickEvent event) {
                    delegate.onConsoleClose(tabsPanel.getWidgetIndex(TabButton.this));
                }
            });
        }

        HandlerRegistration addClickHandler(ClickHandler handler) {
            return addDomHandler(handler, ClickEvent.getType());
        }

    }

}