blob: c0d5be134ca5e3de51929bcdbfe4483a8a09a3f4 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.authoring.ui.views;
import java.util.Collection;
import java.util.Collections;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.ui.viewer.IViewerProvider;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EValidator;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
import org.eclipse.epf.authoring.ui.AuthoringUIResources;
import org.eclipse.epf.authoring.ui.UIActionDispatcher;
import org.eclipse.epf.authoring.ui.actions.ILibraryActionBarContributor;
import org.eclipse.epf.authoring.ui.providers.IContentProviderFactory;
import org.eclipse.epf.library.ILibraryManager;
import org.eclipse.epf.library.ILibraryServiceListener;
import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.library.ui.LibraryUIManager;
import org.eclipse.epf.library.ui.LibraryUIUtil;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.MethodLibrary;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.IContentProvider;
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.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWindowListener;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.ide.IGotoMarker;
import org.eclipse.ui.views.properties.IPropertySheetPage;
import org.eclipse.ui.views.properties.PropertySheetPage;
import org.osgi.framework.Bundle;
/**
* The abstract base class for all Method Library views.
*
* @author Phong Nguyen Le
* @author Shilpa Toraskar
* @author Kelvin Low
* @since 1.0
*/
public abstract class AbstractBaseView extends SaveableLibraryViewPart
implements IEditingDomainProvider, ISelectionProvider,
ILibraryServiceListener, IMenuListener, IViewerProvider, IGotoMarker {
protected AdapterFactoryEditingDomain editingDomain;
protected PropertySheetPage propertySheetPage;
protected UIActionDispatcher actionDispatcher = null;
protected AdapterFactory adapterFactory;
protected ILibraryActionBarContributor actionBarContributor;
protected ISelectionChangedListener selectionChangedListener;
protected IPartListener partListener = new IPartListener() {
public void partActivated(IWorkbenchPart part) {
if (part == AbstractBaseView.this) {
handleActivate(part);
}
}
public void partBroughtToTop(IWorkbenchPart part) {
}
public void partClosed(IWorkbenchPart part) {
}
public void partDeactivated(IWorkbenchPart part) {
}
public void partOpened(IWorkbenchPart part) {
}
};
/**
* Handles the activation of this view.
*/
protected void handleActivate(IWorkbenchPart part) {
// Set the right adapter factory for the editing domain.
editingDomain.setAdapterFactory(adapterFactory);
// Recompute the read only state.
if (editingDomain.getResourceToReadOnlyMap() != null) {
editingDomain.getResourceToReadOnlyMap().clear();
// Refresh any actions that may become enabled or disabled.
setSelection(getSelection());
}
}
// this window listener is for opening the library when the
// view first becomes visible
private IWindowListener windowListener = new IWindowListener() {
public void windowActivated(IWorkbenchWindow window) {
}
public void windowClosed(IWorkbenchWindow window) {
}
public void windowDeactivated(IWorkbenchWindow window) {
}
public void windowOpened(IWorkbenchWindow window) {
window.getWorkbench().removeWindowListener(this);
boolean isVisible = getSite().getPage().isPartVisible(AbstractBaseView.this);
if (isVisible) {
LibraryUIManager.getInstance().startupOpenLibrary();
} else {
LibraryUIManager.getInstance().addMethodViewPartListener(getViewId());
}
}
};
private IContentProviderFactory contentProviderFactory;
/**
* Displays a dialog that asks if conflicting changes should be discarded.
*/
protected boolean handleDirtyConflict() {
String title = AuthoringUIResources._UI_FileConflict_label;
String msg = AuthoringUIResources._WARN_FileConflict;
return AuthoringUIPlugin.getDefault().getMsgDialog().displayPrompt(
title, msg);
}
/**
* Handles changed resources when this view is activated.
*/
protected void handleChangedResources() {
}
/**
* @see org.eclipse.ui.part.WorkbenchPart#createPartControl(Composite)
*/
public void createPartControl(Composite parent) {
init();
actionDispatcher = new UIActionDispatcher(this);
// Create the viewer.
createViewer(parent);
// Create and initialize the action bar contributor.
try {
actionBarContributor = createActionBarContributor();
actionBarContributor.init(getViewSite().getActionBars(), getSite()
.getPage());
} catch (Exception e) {
AuthoringUIPlugin.getDefault().getLogger().logError(e);
}
// Add a selection change listener for the viewer.
Viewer viewer = getViewer();
if (viewer != null) {
if (selectionChangedListener == null) {
selectionChangedListener = new ISelectionChangedListener() {
public void selectionChanged(
SelectionChangedEvent selectionChangedEvent) {
setSelection(selectionChangedEvent.getSelection());
}
};
}
viewer.addSelectionChangedListener(selectionChangedListener);
}
// Add a library service listener.
LibraryService.getInstance().addListener(this);
Object library = LibraryService.getInstance().getCurrentMethodLibrary();
if (library != null) {
setInputForViewer(library);
LibraryUIUtil.updateShellTitle();
}
IWorkbench workbench = AuthoringUIPlugin.getDefault().getWorkbench();
if (workbench != null) {
workbench.addWindowListener(windowListener);
}
}
private void init() {
ILibraryManager manager = (ILibraryManager) LibraryService
.getInstance().getCurrentLibraryManager();
if (manager != null) {
editingDomain = manager.getEditingDomain();
adapterFactory = (ComposedAdapterFactory) editingDomain
.getAdapterFactory();
}
IViewSite site = (IViewSite) this.getSite();
site.setSelectionProvider(this);
site.getPage().addPartListener(partListener);
}
/**
* creates a context menu for the viewer
* @param viewer
*/
public void createContextMenuFor(final StructuredViewer viewer) {
MenuManager contextMenu = new MenuManager("#PopUp"); //$NON-NLS-1$
contextMenu.add(new Separator("additions")); //$NON-NLS-1$
contextMenu.setRemoveAllWhenShown(true);
contextMenu.addMenuListener(this);
Menu menu = contextMenu.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(contextMenu, viewer);
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.action.IMenuListener#menuAboutToShow(org.eclipse.jface.action.IMenuManager)
*/
public void menuAboutToShow(IMenuManager menuManager) {
try {
actionBarContributor.setActiveView(this);
actionBarContributor.menuAboutToShow(menuManager);
} catch (RuntimeException e) {
AuthoringUIPlugin.getDefault().getLogger().logError(e);
throw e;
}
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#setFocus()
*/
public void setFocus() {
}
/**
* @see org.eclipse.emf.edit.domain.IEditingDomainProvider#getEditingDomain()
*/
public EditingDomain getEditingDomain() {
return editingDomain;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
*/
public void addSelectionChangedListener(ISelectionChangedListener listener) {
actionDispatcher.addSelectionChangedListener(listener);
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
*/
public void removeSelectionChangedListener(
ISelectionChangedListener listener) {
actionDispatcher.removeSelectionChangedListener(listener);
}
/**
* @see org.eclipse.ui.part.WorkbenchPart#getAdapter(Class)
*/
public Object getAdapter(Class key) {
if (key.equals(IGotoMarker.class)) {
return this;
} else {
return super.getAdapter(key);
}
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
*/
public ISelection getSelection() {
return actionDispatcher.getSelection();
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
*/
public void setSelection(ISelection selection) {
setSelection(this, selection);
}
private void setSelection(ISelectionProvider source, ISelection selection) {
actionDispatcher.setSelection(source, selection);
UIActionDispatcher.getInstance().setSelection(source, selection);
}
/**
* @see org.eclipse.epf.library.ILibraryServiceListener#libraryCreated(MethodLibrary)
*/
public void libraryCreated(MethodLibrary library) {
}
/**
* @see org.eclipse.epf.library.ILibraryServiceListener#libraryOpened(MethodLibrary)
*/
public void libraryOpened(MethodLibrary library) {
}
/**
* @see org.eclipse.epf.library.ILibraryServiceListener#libraryReopened(MethodLibrary)
*/
public void libraryReopened(MethodLibrary library) {
}
/**
* @see org.eclipse.epf.library.ILibraryServiceListener#libraryClosed(MethodLibrary)
*/
public void libraryClosed(MethodLibrary library) {
setInputForViewer(null);
if (adapterFactory instanceof ComposedAdapterFactory) {
((ComposedAdapterFactory) adapterFactory).dispose();
}
}
/**
* @see org.eclipse.epf.library.ILibraryServiceListener#librarySet(MethodLibrary)
*/
public void librarySet(MethodLibrary library) {
setInputForViewer(library);
if (library != null) {
actionBarContributor.setActiveView(AbstractBaseView.this);
}
}
/**
* @see org.eclipse.epf.library.ILibraryServiceListener#configurationSet(MethodConfiguration)
*/
public void configurationSet(MethodConfiguration config) {
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#dispose()
*/
public void dispose() {
// ResourcesPlugin.getWorkspace().removeResourceChangeListener(
// resourceChangeListener);
getSite().getPage().removePartListener(partListener);
if (adapterFactory instanceof ComposedAdapterFactory) {
((ComposedAdapterFactory) adapterFactory).dispose();
}
if (actionBarContributor.getActiveView() == this) {
actionBarContributor.setActiveView(null);
}
if (propertySheetPage != null) {
propertySheetPage.dispose();
}
IWorkbench workbench = AuthoringUIPlugin.getDefault().getWorkbench();
if (workbench != null) {
workbench.removeWindowListener(windowListener);
}
LibraryService.getInstance().removeListener(this);
super.dispose();
}
/**
* This accesses a cached version of the property sheet.
*/
public IPropertySheetPage getPropertySheetPage() {
if (propertySheetPage == null) {
propertySheetPage = new PropertySheetPage() {
public void makeContributions(IMenuManager menuManager,
IToolBarManager toolBarManager,
IStatusLineManager statusLineManager) {
super.makeContributions(menuManager, toolBarManager,
statusLineManager);
}
public void setActionBars(IActionBars actionBars) {
super.setActionBars(actionBars);
if (actionBarContributor != null) {
actionBarContributor.shareGlobalActions(this,
actionBars);
}
}
};
propertySheetPage
.setPropertySourceProvider(new AdapterFactoryContentProvider(
adapterFactory));
}
return propertySheetPage;
}
/**
* @see org.eclipse.ui.ide.IGotoMarker#gotoMarker(IMarker)
*/
public void gotoMarker(IMarker marker) {
try {
if (marker.getType().equals(EValidator.MARKER)) {
String uriAttribute = marker.getAttribute(
EValidator.URI_ATTRIBUTE, null);
if (uriAttribute != null) {
URI uri = URI.createURI(uriAttribute);
EObject eObject = editingDomain.getResourceSet()
.getEObject(uri, true);
if (eObject != null) {
setSelectionToViewer(Collections
.singleton(editingDomain.getWrapper(eObject)));
}
}
}
} catch (CoreException e) {
AuthoringUIPlugin.getDefault().getLogger().logError(e);
}
}
/**
* This sets the selection into whichever viewer is active.
*/
public void setSelectionToViewer(Collection collection) {
final Collection theSelection = collection;
if (theSelection != null && !theSelection.isEmpty()) {
Runnable runnable = new Runnable() {
public void run() {
// Try to select the items in the current content viewer of
// the editor.
Viewer viewer = getViewer();
if (viewer != null) {
viewer.setSelection(new StructuredSelection(
theSelection.toArray()), true);
}
}
};
runnable.run();
}
}
protected IContentProviderFactory getContentProviderFactory() {
if(contentProviderFactory == null) {
// Process the contributors.
//
IExtensionRegistry extensionRegistry = Platform
.getExtensionRegistry();
IExtensionPoint extensionPoint = extensionRegistry
.getExtensionPoint(AuthoringUIPlugin.getDefault().getId(),
"contentProviderFactories"); //$NON-NLS-1$
if (extensionPoint != null) {
IExtension[] extensions = extensionPoint.getExtensions();
Object ext = null;
ext_walk:
for (int i = 0; i < extensions.length; i++) {
IExtension extension = extensions[i];
String pluginId = extension.getNamespaceIdentifier();
Bundle bundle = Platform.getBundle(pluginId);
IConfigurationElement[] configElements = extension
.getConfigurationElements();
for (int j = 0; j < configElements.length; j++) {
IConfigurationElement configElement = configElements[j];
try {
String viewId = configElement.getAttribute("view"); //$NON-NLS-1$
if (getViewId().equals(viewId)) {
String className = configElement
.getAttribute("class"); //$NON-NLS-1$
if (className != null) {
ext = bundle.loadClass(className)
.newInstance();
if (ext instanceof IContentProviderFactory) {
contentProviderFactory = (IContentProviderFactory) ext;
break ext_walk;
}
}
}
} catch (Exception e) {
AuthoringUIPlugin.getDefault().getLogger()
.logError(e);
}
}
}
}
}
return contentProviderFactory;
}
/**
* @return a new AdapterFactoryContentProvider
*/
protected AdapterFactoryContentProvider createContentProvider() {
IContentProviderFactory factory = getContentProviderFactory();
AdapterFactoryContentProvider cp = null;
if(factory != null) {
IContentProvider contentProvider = factory.createProvider(adapterFactory, this);
if(contentProvider instanceof AdapterFactoryContentProvider) {
cp = (AdapterFactoryContentProvider) contentProvider;
}
}
return cp != null ? cp : new AdapterFactoryContentProvider(adapterFactory);
}
/**
* @return the viewer
*/
public abstract Viewer getViewer();
/**
* Creates the viewer in the given parent
* @param parent
*/
public abstract void createViewer(Composite parent);
/**
* @return a new actionBarContributer
*/
public abstract ILibraryActionBarContributor createActionBarContributor();
/**
* Sets the input for the viewer
* @param model new input for the viewer
*/
public abstract void setInputForViewer(Object model);
public abstract String getViewId();
}