blob: 913efdc44829d6c851981afe3ea8ac2043f241f6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2019 SAP AG and IBM Corporation.
* 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:
* SAP AG - initial API and implementation
* Andrew Johnson (IBM Corporation) - MAT Calcite
*******************************************************************************/
package org.eclipse.mat.ui.editor;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.mat.ui.util.ErrorHelper;
import org.eclipse.mat.ui.util.PaneState;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.PageBook;
public abstract class CompositeHeapEditorPane extends AbstractEditorPane implements ISelectionProvider,
ISelectionChangedListener
{
private PageBook container;
private AbstractEditorPane embeddedPane;
List<ISelectionChangedListener> selectionListeners = Collections
.synchronizedList(new ArrayList<ISelectionChangedListener>());
protected void createContainer(Composite parent)
{
container = new PageBook(parent, SWT.NONE);
}
protected void createResultPane(AbstractEditorPane pane, Object arguments)
{
disposeEmbeddedPane();
try
{
embeddedPane = pane;
embeddedPane.parentPane = this;
setPane(embeddedPane, getEditorInput());
embeddedPane.initWithArgument(arguments);
MultiPaneEditor multiPaneEditor = ((MultiPaneEditorSite) this.getEditorSite()).getMultiPageEditor();
multiPaneEditor.updateToolbar();
if (embeddedPane instanceof ISelectionProvider)
{
ISelectionProvider embeddedProvider = ((ISelectionProvider) embeddedPane);
embeddedProvider.addSelectionChangedListener(this);
selectionChanged(new SelectionChangedEvent(embeddedProvider, embeddedProvider.getSelection()));
}
multiPaneEditor.getNavigatorState().paneAdded(embeddedPane.getPaneState());
}
catch (PartInitException e)
{
ErrorHelper.logThrowableAndShowMessage(e);
}
}
private void disposeEmbeddedPane()
{
if (embeddedPane != null)
{
MultiPaneEditor multiPaneEditor = ((MultiPaneEditorSite) this.getEditorSite()).getMultiPageEditor();
multiPaneEditor.getNavigatorState().paneRemoved(embeddedPane.getPaneState());
if (embeddedPane instanceof ISelectionProvider)
{
((ISelectionProvider) embeddedPane).removeSelectionChangedListener(this);
}
for (Control control : container.getChildren())
{
control.setVisible(false);
control.dispose();
}
embeddedPane.dispose();
embeddedPane = null;
}
}
public void closePage(PaneState state)
{
if (embeddedPane != null && embeddedPane.getPaneState() == state)
disposeEmbeddedPane();
}
protected AbstractEditorPane getEmbeddedPane()
{
return embeddedPane;
}
private void setPane(AbstractEditorPane editor, IEditorInput input) throws PartInitException
{
editor.init(site, input);
Composite parent2 = new Composite(container, Window.getDefaultOrientation());
parent2.setLayout(new FillLayout());
editor.createPartControl(parent2);
container.showPage(parent2);
}
public void addSelectionChangedListener(ISelectionChangedListener listener)
{
selectionListeners.add(listener);
}
public ISelection getSelection()
{
if (embeddedPane != null && embeddedPane instanceof ISelectionProvider)
{
return ((ISelectionProvider) embeddedPane).getSelection();
}
else
{
return StructuredSelection.EMPTY;
}
}
public void removeSelectionChangedListener(ISelectionChangedListener listener)
{
selectionListeners.remove(listener);
}
public void setSelection(ISelection selection)
{
if (embeddedPane != null && embeddedPane instanceof ISelectionProvider)
{
((ISelectionProvider) embeddedPane).setSelection(selection);
}
}
public void selectionChanged(SelectionChangedEvent event)
{
List<ISelectionChangedListener> l = new ArrayList<ISelectionChangedListener>(selectionListeners);
for (ISelectionChangedListener listener : l)
{
listener.selectionChanged(event);
}
}
public <T> T getAdapter(Class<T> adapter)
{
if (embeddedPane != null)
return embeddedPane.getAdapter(adapter);
return super.getAdapter(adapter);
}
@Override
public void contributeToToolBar(IToolBarManager manager)
{
if (embeddedPane != null)
{
manager.add(new Separator());
embeddedPane.contributeToToolBar(manager);
}
}
}