/******************************************************************************* * 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.ui.multisplitpanel.panel; import com.google.gwt.user.client.ui.IsWidget; import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.AssistedInject; import org.eclipse.che.commons.annotation.Nullable; import org.eclipse.che.ide.ui.multisplitpanel.SubPanel; import org.eclipse.che.ide.ui.multisplitpanel.SubPanelFactory; import org.eclipse.che.ide.ui.multisplitpanel.WidgetToShow; import org.eclipse.che.ide.ui.multisplitpanel.actions.ClosePaneAction; import org.eclipse.che.ide.ui.multisplitpanel.actions.RemoveAllWidgetsInPaneAction; import org.eclipse.che.ide.ui.multisplitpanel.actions.SplitHorizontallyAction; import org.eclipse.che.ide.ui.multisplitpanel.actions.SplitVerticallyAction; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Presenter for {@link SubPanel}. * * @author Artem Zatsarynnyi */ public class SubPanelPresenter implements SubPanel, SubPanelView.ActionDelegate { private final SubPanelView view; private final SubPanelFactory subPanelFactory; private final List<WidgetToShow> widgets; private final Map<IsWidget, WidgetRemovingListener> removingListeners; private FocusListener focusListener; private DoubleClickListener doubleClickListener; @AssistedInject public SubPanelPresenter(SubPanelFactory subPanelFactory, SubPanelViewFactory subPanelViewFactory) { this(subPanelFactory, subPanelViewFactory, null); } @AssistedInject public SubPanelPresenter(SubPanelFactory subPanelFactory, SubPanelViewFactory subPanelViewFactory, @Assisted @Nullable SubPanel parentPanel) { this.subPanelFactory = subPanelFactory; widgets = new ArrayList<>(); this.view = subPanelViewFactory.createView(new ClosePaneAction(this), new RemoveAllWidgetsInPaneAction(this), new SplitHorizontallyAction(this), new SplitVerticallyAction(this)); removingListeners = new HashMap<>(); view.setDelegate(this); if (parentPanel != null) { view.setParentPanel(parentPanel.getView()); } else { view.setParentPanel(null); } } @Override public SubPanelView getView() { return view; } @Override public void splitHorizontally() { final SubPanel subPanel = subPanelFactory.newPanel(this); subPanel.setFocusListener(focusListener); subPanel.setDoubleClickListener(doubleClickListener); view.splitHorizontally(subPanel.getView()); } @Override public void splitVertically() { final SubPanel subPanel = subPanelFactory.newPanel(this); subPanel.setFocusListener(focusListener); subPanel.setDoubleClickListener(doubleClickListener); view.splitVertically(subPanel.getView()); } @Override public void addWidget(WidgetToShow widget, boolean removable, @Nullable WidgetRemovingListener widgetRemovingListener) { // just activate the widget if it's already exists on the panel if (widgets.contains(widget)) { activateWidget(widget); return; } widgets.add(widget); if (widgetRemovingListener != null) { removingListeners.put(widget.getWidget(), widgetRemovingListener); } view.addWidget(widget, removable); } @Override public void activateWidget(WidgetToShow widget) { view.activateWidget(widget); } @Override public List<WidgetToShow> getAllWidgets() { return new ArrayList<>(widgets); } @Override public void removeWidget(WidgetToShow widget) { view.removeWidget(widget); widgets.remove(widget); removingListeners.remove(widget.getWidget()); } @Override public void closePane() { view.closePanel(); } @Override public void setFocusListener(FocusListener listener) { focusListener = listener; } @Override public void setDoubleClickListener(DoubleClickListener listener) { doubleClickListener = listener; } @Override public void onWidgetFocused(IsWidget widget) { focusListener.focusGained(this, widget); } @Override public void onWidgetDoubleClicked(IsWidget widget) { doubleClickListener.onDoubleClicked(this, widget); } @Override public void onWidgetRemoving(IsWidget widget, RemoveCallback removeCallback) { final WidgetRemovingListener listener = removingListeners.get(widget); if (listener != null) { listener.onWidgetRemoving(removeCallback); } } }