/******************************************************************************* * 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.ext.dashboard.client; import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.EventListener; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; import com.google.web.bindery.event.shared.EventBus; import org.eclipse.che.ide.api.action.Action; import org.eclipse.che.ide.api.action.ActionEvent; import org.eclipse.che.ide.api.action.CustomComponentAction; import org.eclipse.che.ide.api.action.Presentation; import org.eclipse.che.ide.api.app.AppContext; import org.eclipse.che.ide.api.workspace.event.WorkspaceStartedEvent; import org.eclipse.che.ide.api.workspace.event.WorkspaceStoppedEvent; import org.eclipse.che.ide.ui.Tooltip; import static org.eclipse.che.ide.ui.menu.PositionController.HorizontalAlign.LEFT; import static org.eclipse.che.ide.ui.menu.PositionController.VerticalAlign.BOTTOM; /** * Action to provide Dashboard button onto toolbar. * * @author Oleksii Orel */ public class RedirectToDashboardAction extends Action implements CustomComponentAction, WorkspaceStartedEvent.Handler, WorkspaceStoppedEvent.Handler { private final DashboardLocalizationConstant constant; private final DashboardResources resources; private final AppContext appContext; private Element arrow; private Tooltip tooltip; @Inject public RedirectToDashboardAction(DashboardLocalizationConstant constant, DashboardResources resources, EventBus eventBus, AppContext appContext) { this.constant = constant; this.resources = resources; this.appContext = appContext; eventBus.addHandler(WorkspaceStartedEvent.TYPE, this); eventBus.addHandler(WorkspaceStoppedEvent.TYPE, this); } @Override public void actionPerformed(ActionEvent e) { } @Override public Widget createCustomComponent(Presentation presentation) { FlowPanel panel = new FlowPanel(); panel.setWidth("24px"); panel.setHeight("24px"); /** * Show button Expanded by default if IDE is loaded in frame. */ if (isInFrame()) { arrow = DOM.createDiv(); arrow.setClassName(resources.dashboardCSS().dashboardArrow()); panel.getElement().appendChild(arrow); tooltip = Tooltip.create((elemental.dom.Element) arrow, BOTTOM, LEFT, constant.hideDashboardNavBarToolbarButtonTitle()); showExpanded(); DOM.setEventListener(arrow, new EventListener() { @Override public void onBrowserEvent(Event event) { onArrowClicked(); } }); DOM.sinkEvents(arrow, Event.ONMOUSEDOWN); } else { arrow = DOM.createAnchor(); arrow.setClassName(resources.dashboardCSS().dashboardArrow()); panel.getElement().appendChild(arrow); tooltip = Tooltip.create((elemental.dom.Element) arrow, BOTTOM, LEFT, constant.openDashboardToolbarButtonTitle()); showCollapsed(); arrow.setAttribute("href", constant.openDashboardUrlWorkspace(appContext.getWorkspace().getConfig().getName())); arrow.setAttribute("target", "_blank"); } return panel; } @Override public void onWorkspaceStarted(WorkspaceStartedEvent event) { if (arrow != null) { arrow.setAttribute("href", constant.openDashboardUrlWorkspace(event.getWorkspace().getConfig().getName())); } } @Override public void onWorkspaceStopped(WorkspaceStoppedEvent event) { if (arrow != null) { arrow.setAttribute("href", constant.openDashboardUrlWorkspaces()); } } /** * Determines whether the IDE is loaded inside frame. * @return <b>true</b> if IDE is loaded in frame */ private native boolean isInFrame() /*-{ if ($wnd == $wnd.parent) { return false; } return true; }-*/; /** * Makes arrow left-oriented. * Dashboard navigation bar should be visible. */ private native void showExpanded() /*-{ var elem = this.@org.eclipse.che.ide.ext.dashboard.client.RedirectToDashboardAction::arrow; if (!elem) { return; } elem.innerHTML = "<i class=\"fa fa-chevron-left\" />"; elem.expanded = true; var tooltip = this.@org.eclipse.che.ide.ext.dashboard.client.RedirectToDashboardAction::tooltip; if (!tooltip) { return; } var constant = this.@org.eclipse.che.ide.ext.dashboard.client.RedirectToDashboardAction::constant; var message = constant.@org.eclipse.che.ide.ext.dashboard.client.DashboardLocalizationConstant::hideDashboardNavBarToolbarButtonTitle()(); tooltip.@org.eclipse.che.ide.ui.Tooltip::setTitle(*)(message); }-*/; /** * Makes arrow right-oriented. * Dashboard navigation bar should be hidden. */ private native void showCollapsed() /*-{ var elem = this.@org.eclipse.che.ide.ext.dashboard.client.RedirectToDashboardAction::arrow; if (!elem) { return; } elem.innerHTML = "<i class=\"fa fa-chevron-right\" />"; elem.expanded = false; var tooltip = this.@org.eclipse.che.ide.ext.dashboard.client.RedirectToDashboardAction::tooltip; if (!tooltip) { return; } var constant = this.@org.eclipse.che.ide.ext.dashboard.client.RedirectToDashboardAction::constant; var message = constant.@org.eclipse.che.ide.ext.dashboard.client.DashboardLocalizationConstant::showDashboardNavBarToolbarButtonTitle()(); tooltip.@org.eclipse.che.ide.ui.Tooltip::setTitle(*)(message); }-*/; /** * Handles clicking on the arrow. */ private native void onArrowClicked() /*-{ var elem = this.@org.eclipse.che.ide.ext.dashboard.client.RedirectToDashboardAction::arrow; if (!elem) { return; } if (elem.expanded) { $wnd.parent.postMessage("hide-navbar", "*"); this.@org.eclipse.che.ide.ext.dashboard.client.RedirectToDashboardAction::showCollapsed()(); } else { $wnd.parent.postMessage("show-navbar", "*"); this.@org.eclipse.che.ide.ext.dashboard.client.RedirectToDashboardAction::showExpanded()(); } }-*/; }