/*******************************************************************************
* Copyright (c) 2008, 2012 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.eef.runtime.ui.views;
import java.util.List;
import org.eclipse.emf.common.notify.AdapterFactory;
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.UnwrappingSelectionProvider;
import org.eclipse.emf.eef.runtime.ui.widgets.masterdetails.AbstractEEFMasterDetailsBlock;
import org.eclipse.emf.eef.runtime.ui.widgets.masterdetails.tree.EEFTreeMasterDetailsBlock;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.forms.ManagedForm;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.part.ViewPart;
/**
* @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a>
*/
public class EEFView extends ViewPart implements IEditingDomainProvider {
/**
* The toolkit to use
*/
private FormToolkit toolkit;
/**
* The view's form
*/
protected ManagedForm form;
/**
* The master/details block for model edition
*/
protected AbstractEEFMasterDetailsBlock block;
/**
* The editor/view sychronizer
*/
private IPartListener2 partListener;
/**
* @return the toolkit
*/
public FormToolkit getToolkit() {
if (toolkit == null)
toolkit = new FormToolkit(Display.getCurrent());
return toolkit;
}
/**
* @param toolkit
* the toolkit to set
*/
public void setToolkit(FormToolkit toolkit) {
this.toolkit = toolkit;
}
/**
* @return the adapterFactory
*/
public AdapterFactory getAdapterFactory() {
return block.getAdapterFactory();
}
/**
* @param adapterFactory
* the adapterFactory to set
*/
public void setAdapterFactory(ComposedAdapterFactory adapterFactory) {
block.setAdapterFactory(adapterFactory);
}
/**
* @return the editingDomain
*/
public EditingDomain getEditingDomain() {
return block.getEditingDomain();
}
/**
* @param editingDomain
* the editingDomain to set
*/
public void setEditingDomain(EditingDomain editingDomain) {
block.setEditingDomain(editingDomain);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createPartControl(Composite parent) {
form = new ManagedForm(parent);
block = new EEFTreeMasterDetailsBlock() {
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.eef.runtime.ui.widgets.masterdetails.AbstractEEFMasterDetailsBlock#additionalPageActions()
*/
protected List<Action> additionalPageActions() {
return EEFView.this.additionalPageUserActions();
}
};
block.createContent(form);
block.getMasterPart().addSelectionChangeListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
form.fireSelectionChanged(block.getMasterPart(), event.getSelection());
}
});
createContextMenuFor(block.getMasterPart().getModelViewer());
// Initialize the partListener and register it
getSite().getPage().addPartListener(getPartListener());
}
/**
* @return
*/
protected IPartListener2 getPartListener() {
partListener = new IPartListener2() {
public void partVisible(IWorkbenchPartReference partRef) {
}
public void partOpened(IWorkbenchPartReference partRef) {
}
public void partInputChanged(IWorkbenchPartReference partRef) {
}
public void partHidden(IWorkbenchPartReference partRef) {
}
public void partDeactivated(IWorkbenchPartReference partRef) {
}
public void partClosed(IWorkbenchPartReference partRef) {
}
public void partBroughtToTop(IWorkbenchPartReference partRef) {
}
public void partActivated(IWorkbenchPartReference partRef) {
IWorkbenchPart part = partRef.getPart(false);
if (part instanceof IEditorPart) {
if (part instanceof IEditingDomainProvider) {
IEditingDomainProvider editingDomainProvider = (IEditingDomainProvider)part;
EditingDomain editingDomain = editingDomainProvider.getEditingDomain();
setEditingDomain(editingDomain);
editingDomainChanged(editingDomain);
}
}
}
};
return partListener;
}
/**
* This creates a context menu for the viewer and adds a listener as well registering the menu for
* extension.
*/
protected void createContextMenuFor(StructuredViewer viewer) {
MenuManager contextMenu = new MenuManager("#PopUp"); //$NON-NLS-1$
contextMenu.add(new Separator("additions")); //$NON-NLS-1$
contextMenu.setRemoveAllWhenShown(true);
Menu menu = contextMenu.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(contextMenu, new UnwrappingSelectionProvider(viewer));
}
protected List<Action> additionalPageUserActions() {
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.part.WorkbenchPart#setFocus()
*/
@Override
public void setFocus() {
// TODO Auto-generated method stub
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.part.WorkbenchPart#dispose()
*/
@Override
public void dispose() {
if (partListener != null)
getSite().getPage().removePartListener(partListener);
super.dispose();
}
/**
* @param editingDomain
* the {@link EditingDomain} of the new selected part
*/
protected void editingDomainChanged(EditingDomain editingDomain) {
block.setInput(editingDomain.getResourceSet());
}
}