blob: 002a529e178bc35c04c2f89bdf889b64742007df [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2003, 2007 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
****************************************************************************/
package org.eclipse.gmf.runtime.diagram.ui.properties.views;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.common.ui.action.actions.global.GlobalActionManager;
import org.eclipse.gmf.runtime.common.ui.action.global.GlobalActionId;
import org.eclipse.gmf.runtime.emf.ui.internal.MslUIPlugin;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.views.properties.PropertySheet;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
/**
* A property sheet page for modeler.
*
* @author Anthony Hunter <a
* href="mailto:anthonyh@ca.ibm.com">anthonyh@ca.ibm.com </a>
*/
public class PropertiesBrowserPage
extends TabbedPropertySheetPage
implements IPropertyChangeListener {
/**
* the contributor for this property sheet page
*/
private ITabbedPropertySheetPageContributor contributor;
/**
* save reference to the workbench window if there is a
* modelerViewActivationListener.
*/
private IWorkbenchWindow modelerViewWorkbenchWindow;
/**
* the current selection from model explorer.
*/
private IStructuredSelection modelerViewSelection = null;
/**
* When the property sheet page is active for the model explorer (or other
* modeler view such as diagram navigator) and when you close a model using
* CTRL + F4 or File + Close All, a selection change event is not sent to
* the workbench, but the model explorer selection has changed. This could
* result in a model being closed, but the tabs still being displayed for
* that model based on the old selection (resulting in NPE when you do
* something). This listener is similar to what the PageRecBook does,
* listens for the editor close and then gets the next model explorer
* selection change event to refresh.
*/
private IPartListener modelerViewActivationListener = new IPartListener() {
private boolean propertiesBrowserActive = false;
public void partActivated(IWorkbenchPart part) {
/*
* keep track whether the properties view is active.
*/
propertiesBrowserActive = (part instanceof PropertySheet && ((PropertySheet) part)
.getCurrentPage().equals(PropertiesBrowserPage.this));
}
public void partBroughtToTop(IWorkbenchPart part) {
/* not implemented */
}
public void partClosed(IWorkbenchPart part) {
if (part instanceof IEditorPart && propertiesBrowserActive) {
/*
* The properties view is active and we closed an editor.
*/
final IViewPart modelerView = (IViewPart) contributor;
modelerView.getSite().getSelectionProvider()
.addSelectionChangedListener(
new ISelectionChangedListener() {
public void selectionChanged(
SelectionChangedEvent event) {
IStructuredSelection newModelerViewSelection = (IStructuredSelection) modelerView
.getSite().getSelectionProvider()
.getSelection();
modelerView.getSite().getSelectionProvider()
.removeSelectionChangedListener(this);
if (!newModelerViewSelection
.equals(modelerViewSelection)) {
/*
* the closed editor caused a selection
* change in the modeler view, send this to
* the property sheet page.
*/
PropertiesBrowserPage.this
.selectionChanged(modelerView,
newModelerViewSelection);
}
}
});
}
}
public void partDeactivated(IWorkbenchPart part) {
/* not implemented */
}
public void partOpened(IWorkbenchPart part) {
/* not implemented */
}
};
private IStructuredSelection selectedElements;
/**
* Constructor
* @param contributor the <code>ITabbedPropertySheetPageContributor</code>
* for this property sheet page
*/
public PropertiesBrowserPage(ITabbedPropertySheetPageContributor contributor) {
super(contributor);
this.contributor = contributor;
// preference listener
MslUIPlugin.getDefault().getPreferenceStore()
.addPropertyChangeListener(this);
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.IPage#dispose()
*/
public void dispose() {
super.dispose();
/**
* Remove the part activation listener.
*/
if (modelerViewWorkbenchWindow != null) {
modelerViewWorkbenchWindow.getPartService().removePartListener(
modelerViewActivationListener);
modelerViewWorkbenchWindow = null;
}
/**
* Remove the preference listener
*/
MslUIPlugin.getDefault().getPreferenceStore()
.removePropertyChangeListener(this);
/**
* Clean up
*/
contributor = null;
selectedElements = null;
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.IPage#setActionBars(org.eclipse.ui.IActionBars)
*/
public void setActionBars(IActionBars actionBars) {
if (contributor != null && contributor instanceof IWorkbenchPart) {
/*
* Override the undo and redo global action handlers to use the
* contributors action handlers
*/
IAction action = GlobalActionManager.getInstance()
.getGlobalActionHandler((IWorkbenchPart) contributor,
GlobalActionId.UNDO);
if (action != null) {
actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
action);
}
action = GlobalActionManager.getInstance().getGlobalActionHandler(
(IWorkbenchPart) contributor, GlobalActionId.REDO);
if (action != null) {
actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
action);
}
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent event) {
/* not implemented */
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.IPage#setFocus()
*/
public void setFocus() {
getControl().setFocus();
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent) {
super.createControl(parent);
if (contributor instanceof IViewPart) {
/**
* If this is the modeler view, add the special part activation
* listener.
*/
modelerViewWorkbenchWindow = getSite().getWorkbenchWindow();
modelerViewWorkbenchWindow.getPartService().addPartListener(
modelerViewActivationListener);
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
*/
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
super.selectionChanged(part, selection);
if (selection instanceof IStructuredSelection)
selectedElements = (IStructuredSelection) selection;
if (modelerViewWorkbenchWindow != null && part.equals(contributor)) {
/*
* save the current selection.
*/
IViewPart modelerView = (IViewPart) part;
modelerViewSelection = (IStructuredSelection) modelerView.getSite()
.getSelectionProvider().getSelection();
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ILabelProviderListener#labelProviderChanged(org.eclipse.jface.viewers.LabelProviderChangedEvent)
*/
public void labelProviderChanged(LabelProviderChangedEvent event) {
if (event.getElements() == null && getControl() != null) {
super.labelProviderChanged(event);
return;
}
IStructuredSelection structuredSelection = getSelectedElements();
if (structuredSelection == null) {
return;
}
List selection = new ArrayList();
for (Iterator e = structuredSelection.iterator(); e.hasNext();) {
Object next = e.next();
if (next instanceof IAdaptable) {
Object object = ((IAdaptable) next).getAdapter(EObject.class);
if (object != null)
selection.add(object);
} else if (next instanceof EObject) {
selection.add(next);
}
}
if (selection.isEmpty()) // no point in expensive calculations if there
// are no elements
return;
List elementsAffected = new ArrayList();
for (int i = 0; i < event.getElements().length; i++) {
Object next = event.getElements()[i];
if (next instanceof IAdaptable) {
Object object = ((IAdaptable) next).getAdapter(EObject.class);
if (object != null)
elementsAffected.add(object);
} else if (next instanceof EObject) {
elementsAffected.add(next);
}
}
selection.retainAll(elementsAffected);
if (!selection.isEmpty())
super.labelProviderChanged(event);
}
/**
* Get the property sheet page contributor.
*
* @return the property sheet page contributor.
*/
public ITabbedPropertySheetPageContributor getContributor() {
return contributor;
}
/**
* @return Returns the selectedElements.
*/
protected IStructuredSelection getSelectedElements() {
return selectedElements;
}
}