/*******************************************************************************
* 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;
import com.google.gwt.event.dom.client.ContextMenuEvent;
import com.google.gwt.event.dom.client.ContextMenuHandler;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.DeckLayoutPanel;
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 com.google.inject.assistedinject.Assisted;
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 javax.validation.constraints.NotNull;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* PartStack view class. Implements UI that manages Parts organized in a Tab-like widget.
*
* @author Nikolay Zamosenchuk
* @author Dmitry Shnurenko
* @author Valeriy Svydenko
*/
public class PartStackViewImpl extends ResizeComposite implements PartStackView, MouseDownHandler, ContextMenuHandler {
private final Map<PartPresenter, TabItem> tabs;
private final AcceptsOneWidget partViewContainer;
private final DeckLayoutPanel contentPanel;
private final FlowPanel tabsPanel;
private final TabPosition tabPosition;
private ActionDelegate delegate;
private Widget focusedWidget;
@Inject
public PartStackViewImpl(PartStackUIResources resources,
final DeckLayoutPanel contentPanel,
@Assisted @NotNull TabPosition tabPosition,
@Assisted @NotNull FlowPanel tabsPanel) {
this.tabsPanel = tabsPanel;
this.tabPosition = tabPosition;
this.contentPanel = contentPanel;
this.contentPanel.setStyleName(resources.partStackCss().idePartStackContent());
initWidget(contentPanel);
this.tabs = new HashMap<>();
partViewContainer = new AcceptsOneWidget() {
@Override
public void setWidget(IsWidget widget) {
contentPanel.add(widget);
}
};
addDomHandler(this, MouseDownEvent.getType());
addDomHandler(this, ContextMenuEvent.getType());
setMaximized(false);
}
/** {@inheritDoc} */
@Override
public void onMouseDown(@NotNull MouseDownEvent event) {
delegate.onRequestFocus();
}
/** {@inheritDoc} */
@Override
public void onContextMenu(@NotNull ContextMenuEvent event) {
delegate.onRequestFocus();
}
/** {@inheritDoc} */
@Override
public void setDelegate(ActionDelegate delegate) {
this.delegate = delegate;
}
/** {@inheritDoc} */
@Override
public void addTab(@NotNull TabItem tabItem, @NotNull PartPresenter presenter) {
tabsPanel.add(tabItem.getView());
presenter.go(partViewContainer);
tabs.put(presenter, tabItem);
tabItem.setTabPosition(tabPosition);
}
/** {@inheritDoc} */
@Override
public void removeTab(@NotNull PartPresenter presenter) {
TabItem tab = tabs.get(presenter);
tabsPanel.remove(tab.getView());
contentPanel.remove(presenter.getView());
tabs.remove(presenter);
}
/** {@inheritDoc} */
@Override
public void setTabPositions(List<PartPresenter> presenters) {
for (PartPresenter partPresenter : presenters) {
int tabIndex = presenters.indexOf(partPresenter);
TabItem tabItem = tabs.get(partPresenter);
tabsPanel.insert(tabItem.getView(), tabIndex);
}
}
/** {@inheritDoc} */
@Override
public void selectTab(@NotNull PartPresenter partPresenter) {
IsWidget view = partPresenter.getView();
int viewIndex = contentPanel.getWidgetIndex(view);
boolean isWidgetExist = viewIndex != -1;
if (!isWidgetExist) {
partPresenter.go(partViewContainer);
viewIndex = contentPanel.getWidgetIndex(view);
}
contentPanel.showWidget(viewIndex);
setActiveTab(partPresenter);
}
private void setActiveTab(@NotNull PartPresenter part) {
for (TabItem tab : tabs.values()) {
tab.unSelect();
}
tabs.get(part).select();
delegate.onRequestFocus();
}
/** {@inheritDoc} */
@Override
public void setFocus(boolean focused) {
if (focusedWidget != null) {
focusedWidget.getElement().removeAttribute("focused");
}
focusedWidget = contentPanel.getVisibleWidget();
if (focused && focusedWidget != null) {
focusedWidget.getElement().setAttribute("focused", "");
}
}
/** {@inheritDoc} */
@Override
public void updateTabItem(@NotNull PartPresenter partPresenter) {
TabItem tabItem = tabs.get(partPresenter);
tabItem.update(partPresenter);
}
@Override
public void setMaximized(boolean maximized) {
getElement().setAttribute("maximized", "" + maximized);
}
}