/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.ui.editors;
import java.util.ArrayList;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorActionBarContributor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IKeyBindingService;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.internal.PopupMenuExtender;
/**
* ModelEditorSite is an IEditorSite layer between the ModelEditor multi-page editor and the ModelEditorPage IEditorParts that it
* contains. Each ModelEditorPage has a ModelEditorSite. This class was overridden because ModelEditorSelectionProvider handles
* the selection for all ModelEditorPages.
*
* @since 8.0
*/
@SuppressWarnings( "deprecation" )
public class ModelEditorSite implements IEditorSite {
/**
* The nested editor.
*/
private IEditorPart editor;
/**
* The multi-page editor.
*/
private MultiPageModelEditor multiPageEditor;
/**
* The selection provider; <code>null</code> if none.
*
* @see #setSelectionProvider
*/
private ISelectionProvider selectionProvider = null;
/**
* The selection change listener, initialized lazily; <code>null</code> if not yet created.
*/
private ISelectionChangedListener selectionChangedListener = null;
/**
* Creates a site for the given page nested within the given multi-page editor.
*
* @param editor the multi-page editor
* @param page the nested editor
*/
public ModelEditorSite( MultiPageModelEditor editor,
IEditorPart page ) {
this.multiPageEditor = editor;
this.editor = page;
}
/**
* Dispose the contributions.
*/
public void dispose() {
}
/**
* The <code>MultiPageEditorSite</code> implementation of this <code>IEditorSite</code> method returns <code>null</code>,
* since nested editors do not have their own action bar contributor.
*/
@Override
public IEditorActionBarContributor getActionBarContributor() {
return null;
}
/**
* The <code>MultiPageEditorSite</code> implementation of this <code>IEditorSite</code> method forwards to the multi-page
* editor to return the action bars.
*/
@Override
public IActionBars getActionBars() {
return multiPageEditor.getEditorSite().getActionBars();
}
/**
* The <code>MultiPageEditorSite</code> implementation of this <code>IWorkbenchPartSite</code> method forwards to the
* multi-page editor to return the decorator manager.
*
* @deprecated use IWorkbench.getDecoratorManager()
*/
@Deprecated
public ILabelDecorator getDecoratorManager() {
return getWorkbenchWindow().getWorkbench().getDecoratorManager().getLabelDecorator();
}
/**
* Returns the nested editor.
*
* @return the nested editor
*/
public IEditorPart getEditor() {
return editor;
}
/**
* The <code>MultiPageEditorSite</code> implementation of this <code>IWorkbenchPartSite</code> method returns an empty string
* since the nested editor is not created from the registry.
*/
@Override
public String getId() {
return ""; //$NON-NLS-1$
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.IWorkbenchPartSite#getKeyBindingService()
*/
@Override
public IKeyBindingService getKeyBindingService() {
return getMultiPageEditor().getEditorSite().getKeyBindingService();
}
/**
* Returns the multi-page editor.
*
* @return the multi-page editor
*/
public MultiPageModelEditor getMultiPageEditor() {
return multiPageEditor;
}
/**
* The <code>MultiPageEditorSite</code> implementation of this <code>IWorkbenchPartSite</code> method forwards to the
* multi-page editor to return the workbench page.
*/
@Override
public IWorkbenchPage getPage() {
return getMultiPageEditor().getSite().getPage();
}
/**
* The <code>MultiPageEditorSite</code> implementation of this <code>IWorkbenchPartSite</code> method returns an empty string
* since the nested editor is not created from the registry.
*/
@Override
public String getPluginId() {
return ""; //$NON-NLS-1$
}
/**
* The <code>MultiPageEditorSite</code> implementation of this <code>IWorkbenchPartSite</code> method returns an empty string
* since the nested editor is not created from the registry.
*/
@Override
public String getRegisteredName() {
return ""; //$NON-NLS-1$
}
/**
* Returns the selection changed listener which listens to the nested editor's selection changes, and calls
* <code>handleSelectionChanged</code>.
*
* @return the selection changed listener
*/
private ISelectionChangedListener getSelectionChangedListener() {
if (selectionChangedListener == null) {
selectionChangedListener = new ISelectionChangedListener() {
@Override
public void selectionChanged( SelectionChangedEvent event ) {
ModelEditorSite.this.handleSelectionChanged(event);
}
};
}
return selectionChangedListener;
}
/**
* The <code>MultiPageEditorSite</code> implementation of this <code>IWorkbenchPartSite</code> method returns the selection
* provider set by <code>setSelectionProvider</code>.
*/
@Override
public ISelectionProvider getSelectionProvider() {
return selectionProvider;
}
/**
* The <code>MultiPageEditorSite</code> implementation of this <code>IWorkbenchPartSite</code> method forwards to the
* multi-page editor to return the shell.
*/
@Override
public Shell getShell() {
return getMultiPageEditor().getSite().getShell();
}
/**
* The <code>MultiPageEditorSite</code> implementation of this <code>IWorkbenchPartSite</code> method forwards to the
* multi-page editor to return the workbench window.
*/
@Override
public IWorkbenchWindow getWorkbenchWindow() {
return getMultiPageEditor().getSite().getWorkbenchWindow();
}
/**
* Handles a selection changed event from the nested editor. The default implementation gets the selection provider from the
* multi-page editor's site, and calls <code>fireSelectionChanged</code> on it (only if it is an instance of
* <code>MultiPageSelectionProvider</code>), passing a new event object.
* <p>
* Subclasses may extend or reimplement this method.
* </p>
*
* @param event the event
*/
protected void handleSelectionChanged( SelectionChangedEvent event ) {
ISelectionProvider parentProvider = getMultiPageEditor().getSite().getSelectionProvider();
if (parentProvider instanceof ModelEditorSelectionProvider) {
SelectionChangedEvent newEvent = new SelectionChangedEvent(parentProvider, event.getSelection());
((ModelEditorSelectionProvider)parentProvider).fireSelectionChanged(newEvent);
}
}
/**
* The <code>MultiPageEditorSite</code> implementation of this <code>IWorkbenchPartSite</code> method forwards to the
* multi-page editor for registration.
*/
@Override
public void registerContextMenu( String menuID,
MenuManager menuMgr,
ISelectionProvider selProvider ) {
getMultiPageEditor().getSite().registerContextMenu(menuMgr, selectionProvider);
}
/**
* The <code>MultiPageEditorSite</code> implementation of this <code>IWorkbenchPartSite</code> method forwards to the
* multi-page editor for registration.
*/
@Override
public void registerContextMenu( MenuManager menuManager,
ISelectionProvider selectionProvider ) {
getMultiPageEditor().getSite().registerContextMenu(menuManager, selectionProvider);
}
/**
* The <code>MultiPageEditorSite</code> implementation of this <code>IWorkbenchPartSite</code> method forwards to the
* multi-page editor for registration.
*/
@Override
public void registerContextMenu( final String menuId,
final MenuManager menuManager,
final ISelectionProvider selectionProvider,
final boolean includeEditorInput ) {
registerContextMenu(menuId, menuManager, selectionProvider);
}
/**
* The <code>MultiPageEditorSite</code> implementation of this <code>IWorkbenchPartSite</code> method forwards to the
* multi-page editor for registration.
*/
@Override
public void registerContextMenu( final MenuManager menuManager,
final ISelectionProvider selectionProvider,
final boolean includeEditorInput ) {
registerContextMenu(menuManager, selectionProvider);
}
/**
* The <code>MultiPageEditorSite</code> implementation of this <code>IWorkbenchPartSite</code> method remembers the selection
* provider, and also hooks a listener on it, which calls <code>handleSelectionChanged</code> when a selection changed event
* occurs.
*
* @see #handleSelectionChanged
*/
@Override
public void setSelectionProvider( ISelectionProvider provider ) {
ISelectionProvider oldSelectionProvider = selectionProvider;
selectionProvider = provider;
if (oldSelectionProvider != null) {
oldSelectionProvider.removeSelectionChangedListener(getSelectionChangedListener());
}
if (selectionProvider != null) {
selectionProvider.addSelectionChangedListener(getSelectionChangedListener());
}
}
/**
* @see org.eclipse.ui.IWorkbenchPartSite#getPart()
* @since 5.0.1
*/
@Override
public IWorkbenchPart getPart() {
return this.multiPageEditor;
}
@Override
public Object getAdapter( Class adapter ) {
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.services.IServiceLocator#getService(java.lang.Class)
*/
@Override
public Object getService( Class api ) {
return getMultiPageEditor().getEditorSite().getService(api);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.services.IServiceLocator#hasService(java.lang.Class)
*/
@Override
public boolean hasService( Class api ) {
return false;
}
}
// /* (non-Javadoc)
// * @see org.eclipse.ui.IWorkbenchSite#getSelectionProvider()
// */
// public ISelectionProvider getSelectionProvider() {
// return modelEditor.getSite().getSelectionProvider();
// }
//
// /* (non-Javadoc)
// * @see org.eclipse.ui.IWorkbenchSite#setSelectionProvider(org.eclipse.jface.viewers.ISelectionProvider)
// */
// public void setSelectionProvider(ISelectionProvider provider) {
// super.setSelectionProvider(provider);
// }
//
// /* (non-Javadoc)
// * @see org.eclipse.ui.IEditorSite#getActionBarContributor()
// */
// public IEditorActionBarContributor getActionBarContributor() {
// return modelEditor.getEditorSite().getActionBarContributor();
// }