blob: 122eaf6ccba403f7d7a97f7656a11ab1959d13fb [file] [log] [blame]
/***********************************************************************
* Copyright (c) 2007 Anyware Technologies
*
* 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:
* Anyware Technologies - initial API and implementation
*
* $Id: AnalysisView.java,v 1.5 2008/05/19 09:26:31 jlescot Exp $
**********************************************************************/
package org.eclipse.emf.ecoretools.ui.views;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IAdapterManager;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecoretools.ui.Activator;
import org.eclipse.emf.ecoretools.ui.actions.RefreshAction;
import org.eclipse.emf.ecoretools.ui.actions.ToggleSynchronizeAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.ViewPart;
/**
* This class implements the basic behavior of an analysis view for Ecore.
*
* @author <a href="david.sciamma@anyware-tech.com">David Sciamma</a>
*/
public abstract class AnalysisView extends ViewPart implements ISelectionListener {
private static final Transfer TRANSFER = LocalSelectionTransfer.getTransfer();
private EObject lastValidObject;
private EObject analyzedObject;
private boolean isSynchronized = false;
private ToggleSynchronizeAction toggleSynchroAction;
private RefreshAction refreshAction;
/**
* Constructor
*/
public AnalysisView() {
ISelectionService selService = Activator.getDefault().getWorkbench().getActiveWorkbenchWindow().getSelectionService();
selService.addSelectionListener(this);
toggleSynchroAction = new ToggleSynchronizeAction(this);
refreshAction = new RefreshAction(this);
}
/**
* @see org.eclipse.ui.part.WorkbenchPart#dispose()
*/
@Override
public void dispose() {
ISelectionService selService = Activator.getDefault().getWorkbench().getActiveWorkbenchWindow().getSelectionService();
selService.removeSelectionListener(this);
super.dispose();
}
/**
* Return the analyzed object
*
* @return the EObject analyzed by this view
*/
protected EObject getAnalyzedObject() {
return analyzedObject;
}
/**
* Changes the analyzed object and refresh the view
*
* @param obj
* the EObject that must be analyzed
*/
public void setAnalyzedObject(EObject obj) {
if (obj != null) {
analyzedObject = obj;
refresh(analyzedObject);
}
}
/**
* Returns the synchronization state of this view
*
* @return <code>true</code> if the view is synchronized
*/
public boolean isSynchronized() {
return isSynchronized;
}
/**
* Changes the synchronization of the view
*
* @param synchro
* the new synchronization state
*/
public void setSynchronized(boolean synchro) {
isSynchronized = synchro;
}
/**
* Returns the current selection of the workbench
*
* @return the selected EObject
*/
protected EObject getActiveSelection() {
ISelectionService selService = Activator.getDefault().getWorkbench().getActiveWorkbenchWindow().getSelectionService();
if (selService.getSelection() instanceof IStructuredSelection) {
return getSelection((IStructuredSelection) selService.getSelection());
}
return null;
}
/**
* Returns the selected EObject from the given selection
*
* @param selection
* the selection which contains the EObject
* @return the selected EObject
*/
protected EObject getSelection(IStructuredSelection selection) {
Object selectedObject = selection.getFirstElement();
if (selectedObject != null) {
if (selectedObject instanceof EObject) {
return (EObject) selectedObject;
}
if (selectedObject instanceof IAdaptable) {
Object adaptedObj = ((IAdaptable) selectedObject).getAdapter(EObject.class);
if (adaptedObj instanceof EObject) {
return (EObject) adaptedObj;
}
}
IAdapterManager adapterManager = Platform.getAdapterManager();
if (adapterManager.hasAdapter(selectedObject, EObject.class.getName())) {
Object adaptedObj = adapterManager.loadAdapter(selectedObject, EObject.class.getName());
if (adaptedObj instanceof EObject) {
return (EObject) adaptedObj;
}
}
}
return null;
}
/**
* @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart,
* org.eclipse.jface.viewers.ISelection)
*/
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
if (selection instanceof IStructuredSelection) {
EObject selectedObject = getSelection((IStructuredSelection) selection);
if (selectedObject != null) {
lastValidObject = selectedObject;
}
if (isSynchronized()) {
setAnalyzedObject(selectedObject);
}
}
}
/**
* @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createPartControl(Composite parent) {
fillActionBars();
}
/**
* @see org.eclipse.ui.part.WorkbenchPart#setFocus()
*/
@Override
public void setFocus() {
// Do nothing
}
/**
* Build the action bars of the view
*/
protected void fillActionBars() {
IActionBars actionBars = getViewSite().getActionBars();
setGlobalActionHandlers(actionBars);
fillToolBar(actionBars.getToolBarManager());
fillViewMenu(actionBars.getMenuManager());
}
/**
* Registers the global action handler
*
* @param actionBars
* the view action bars
*/
protected void setGlobalActionHandlers(IActionBars actionBars) {
// Do nothing
}
/**
* Build the view toolbar
*
* @param toolBar
* the view toolbar
*/
protected void fillToolBar(IToolBarManager toolBar) {
toolBar.add(toggleSynchroAction);
toolBar.add(refreshAction);
}
/**
* Build the view menu
*
* @param menu
* the view menu
*/
protected void fillViewMenu(IMenuManager menu) {
// Do nothing
}
/**
* Refresh the view for the current selected object
*/
public void refresh() {
setAnalyzedObject(lastValidObject);
}
protected static void prepareViewerForDragToSirius(TreeViewer viewer) {
/* Configure viewer drag and drop behavior */
final Transfer[] transfers = new Transfer[] { TRANSFER };
final int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
// final Transfer[] transfers = new Transfer[] {
// LocalTransfer.getInstance() };
viewer.addDragSupport(dndOperations, transfers, new EcoreToolsViewsDragTargetAdapter(viewer));
}
/**
* Refresh the analysis view
*
* @param object
* the analyzed object
*/
protected abstract void refresh(EObject object);
}