/******************************************************************************* | |
* 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); | |
} | |
} | |
} |