/*
* 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.xsd.ui.editor;
import java.util.Collections;
import java.util.EventObject;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.provider.INotifyChangedListener;
import org.eclipse.emf.edit.provider.ItemProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.ide.IGotoMarker;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.XSDSimpleTypeDefinition;
import org.eclipse.xsd.provider.XSDSemanticItemProviderAdapterFactory;
import org.eclipse.xsd.util.XSDResourceImpl;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.workspace.ModelUtil;
import org.teiid.designer.core.workspace.ModelWorkspaceException;
import org.teiid.designer.ui.editors.AbstractModelEditorPageActionBarContributor;
import org.teiid.designer.ui.editors.ModelEditorPage;
import org.teiid.designer.ui.editors.ModelEditorPageOutline;
import org.teiid.designer.ui.event.ModelResourceEvent;
import org.teiid.designer.xsd.ui.ModelerXsdUiConstants;
import org.teiid.designer.xsd.ui.ModelerXsdUiPlugin;
import org.teiid.designer.xsd.ui.PluginConstants;
/**
* @since 8.0
*/
public class XsdSemanticsEditorPage implements ModelEditorPage, ISelectionChangedListener, IGotoMarker {
private static final String NAME = ModelerXsdUiConstants.Util.getString("xsdSemanticsEditor.name"); //$NON-NLS-1$
private static final String TOOLTIP = ModelerXsdUiConstants.Util.getString("xsdSemanticsEditor.tooltip"); //$NON-NLS-1$
TreeViewer treeViewer;
private XSDSemanticItemProviderAdapterFactory semanticAdapterFactory;
private INotifyChangedListener notificationListener;
/** This keeps track of the root object of the model. */
protected XSDSchema xsdSchema;
/** This is the model resource for the current xsd file being displayed in the editor */
private Resource xsdResource;
private XsdSemanticsEditorActionContributor actionContributor;
private IEditorSite theSite;
private IEditorInput theInput;
/**
* Construct an instance of XsdSemanticsEditorPage.
*/
public XsdSemanticsEditorPage() {
super();
}
// This just notifies those things that are affected by the section.
//
@Override
public void selectionChanged( SelectionChangedEvent selectionChangedEvent ) {
// swjTODO: hook this into the selection provider for ModelEditor
}
/**
* @return
*/
public XSDSchema getXsdSchema() {
if (xsdSchema != null && xsdSchema.eResource() != null) {
return xsdSchema;
}
if (xsdResource != null && xsdResource instanceof XSDResourceImpl) {
XSDResourceImpl rsrc = (XSDResourceImpl)xsdResource;
if (rsrc != null) {
xsdSchema = rsrc.getSchema();
}
}
return xsdSchema;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#addPropertyListener(org.eclipse.ui.IPropertyListener)
*/
@Override
public void addPropertyListener( IPropertyListener listener ) {
}
/* (non-Javadoc)
* @See org.teiid.designer.ui.editors.ModelEditorPage#canDisplay(org.eclipse.ui.IEditorInput)
*/
@Override
public boolean canDisplay( IEditorInput input ) {
if (input instanceof IFileEditorInput) {
return ModelUtil.isXsdFile(((IFileEditorInput)input).getFile());
}
return false;
}
/* (non-Javadoc)
* @See org.teiid.designer.ui.editors.ModelEditorPage#canOpenContext(java.lang.Object)
*/
@Override
public boolean canOpenContext( Object input ) {
return false;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createPartControl( Composite parent ) {
treeViewer = new TreeViewer(parent);
semanticAdapterFactory = new XSDSemanticItemProviderAdapterFactory();
treeViewer.setContentProvider(new AdapterFactoryContentProvider(semanticAdapterFactory));
treeViewer.setLabelProvider(new AdapterFactoryLabelProvider(semanticAdapterFactory));
treeViewer.setAutoExpandLevel(2);
treeViewer.addFilter(new ViewerFilter() {
@Override
public boolean select( Viewer viewer,
Object parentElement,
Object element ) {
// filter built-ins if needed:
if (!(parentElement instanceof EObject) && element instanceof XSDSimpleTypeDefinition) {
// parent is not an EObject, and kid is a STD; need to filter out built-ins.
XSDSimpleTypeDefinition std = (XSDSimpleTypeDefinition)element;
return std.getSchema() == xsdSchema;
} // endif
return true;
}
});
treeViewer.addSelectionChangedListener(this);
treeViewer.setInput(new ItemProvider(Collections.singleton(getXsdSchema())));
// new AdapterFactoryTreeEditor(treeViewer.getTree(), semanticAdapterFactory);
createContextMenu();
}
protected void createContextMenu() {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#dispose()
*/
@Override
public void dispose() {
if (this.semanticAdapterFactory != null) {
this.semanticAdapterFactory.dispose();
}
}
/* (non-Javadoc)
* @See org.teiid.designer.ui.editors.ModelEditorPage#preDispose()
*/
@Override
public void preDispose() {
// Default Implementation
}
/* (non-Javadoc)
* @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void doSave( IProgressMonitor monitor ) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.ISaveablePart#doSaveAs()
*/
@Override
public void doSaveAs() {
}
/* (non-Javadoc)
* @See org.teiid.designer.ui.editors.ModelEditorPage#getActionBarContributor()
*/
@Override
public AbstractModelEditorPageActionBarContributor getActionBarContributor() {
if (actionContributor == null) {
actionContributor = new XsdSemanticsEditorActionContributor(this);
}
return actionContributor;
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
@Override
public Object getAdapter( Class adapter ) {
return null;
}
/* (non-Javadoc)
* @See org.teiid.designer.ui.editors.ModelEditorPage#getControl()
*/
@Override
public Control getControl() {
return treeViewer.getControl();
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorPart#getEditorInput()
*/
@Override
public IEditorInput getEditorInput() {
return theInput;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorPart#getEditorSite()
*/
@Override
public IEditorSite getEditorSite() {
return theSite;
}
/* (non-Javadoc)
* @See org.teiid.designer.ui.editors.ModelEditorPage#getModelObjectSelectionChangedListener()
*/
@Override
public ISelectionChangedListener getModelObjectSelectionChangedListener() {
return null;
}
/* (non-Javadoc)
* @See org.teiid.designer.ui.editors.ModelEditorPage#getModelObjectSelectionProvider()
*/
@Override
public ISelectionProvider getModelObjectSelectionProvider() {
return treeViewer;
}
/* (non-Javadoc)
* @See org.teiid.designer.ui.editors.ModelEditorPage#getNotifyChangedListener()
*/
@Override
public INotifyChangedListener getNotifyChangedListener() {
if (notificationListener == null) {
notificationListener = new XsdSemanticsNotificationHandler(treeViewer, this.xsdResource,
getSite().getPage().getActiveEditor());
}
return notificationListener;
}
/* (non-Javadoc)
* @See org.teiid.designer.ui.editors.ModelEditorPage#getOutlineContribution()
*/
@Override
public ModelEditorPageOutline getOutlineContribution() {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#getSite()
*/
@Override
public IWorkbenchPartSite getSite() {
return theSite;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#getTitle()
*/
@Override
public String getTitle() {
return NAME;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#getTitleImage()
*/
@Override
public Image getTitleImage() {
return ModelerXsdUiPlugin.getDefault().getImage(PluginConstants.Images.SEMANTICS_ICON);
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#getTitleToolTip()
*/
@Override
public String getTitleToolTip() {
return TOOLTIP;
}
/* (non-Javadoc)
* @See org.teiid.designer.ui.editors.ModelEditorPage#setTitleText(java.lang.String)
*/
@Override
public void setTitleText( String title ) {
// do nothing;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorPart#gotoMarker(org.eclipse.core.resources.IMarker)
*/
@Override
public void gotoMarker( IMarker marker ) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
*/
@Override
public void init( IEditorSite site,
IEditorInput input ) throws PartInitException {
theSite = site;
theInput = input;
if (input instanceof IFileEditorInput) {
// get the XSD resource.
try {
// Get the IFile associated with the editor
final IResource xsdFile = ((IFileEditorInput)input).getFile();
if (xsdFile == null) {
final String msg = ModelerXsdUiConstants.Util.getString("XsdEditor.Input_Error__Model_Editor_cannot_open_{0}_2", input.getName()); //$NON-NLS-1$
throw new PartInitException(msg);
}
// Get the EMF resource for the IFile in the workspace
final String xsdLocation = xsdFile.getLocation().toString();
final URI xsdUri = URI.createFileURI(xsdLocation);
xsdResource = ModelerCore.getModelContainer().getResource(xsdUri, true);
// The resource must exist in the container
if (xsdResource == null) {
final String msg = ModelerXsdUiConstants.Util.getString("XsdEditor.Input_Error__Model_Editor_cannot_open_{0}_1", input.getName()); //$NON-NLS-1$
throw new PartInitException(msg);
}
xsdFile.getProject();
} catch (ModelWorkspaceException e) {
final String msg = ModelerXsdUiConstants.Util.getString("XsdEditor.Input_Error__Model_Editor_cannot_open_{0}_2", input.getName()); //$NON-NLS-1$
throw new PartInitException(msg, e);
} catch (CoreException e) {
final String msg = ModelerXsdUiConstants.Util.getString("XsdEditor.Input_Error__Model_Editor_cannot_open_{0}_2", input.getName()); //$NON-NLS-1$
throw new PartInitException(msg, e);
}
} else {
throw new PartInitException(
ModelerXsdUiConstants.Util.getString("XsdEditor.Invalid_Input__Must_be_IFileEditorInput._33")); //$NON-NLS-1$
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.ISaveablePart#isDirty()
*/
@Override
public boolean isDirty() {
return false;
}
/* (non-Javadoc)
* @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
*/
@Override
public boolean isSaveAsAllowed() {
return false;
}
/* (non-Javadoc)
* @see org.eclipse.ui.ISaveablePart#isSaveOnCloseNeeded()
*/
@Override
public boolean isSaveOnCloseNeeded() {
return false;
}
/**
* (non-Javadoc)
*
* @see org.teiid.designer.ui.editors.ModelEditorPage#initializeEditorPage()
* @since 5.0.2
*/
@Override
public void initializeEditorPage() {
}
/* (non-Javadoc)
* @See org.teiid.designer.ui.editors.ModelEditorPage#openContext(java.lang.Object)
*/
@Override
public void openContext( Object input ) {
}
/* (non-Javadoc)
* @See org.teiid.designer.ui.editors.ModelEditorPage#openContext(java.lang.Object)
*/
@Override
public void openContext( Object input,
boolean forceRefresh ) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#removePropertyListener(org.eclipse.ui.IPropertyListener)
*/
@Override
public void removePropertyListener( IPropertyListener listener ) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#setFocus()
*/
@Override
public void setFocus() {
}
/* (non-Javadoc)
* @See org.teiid.designer.ui.editors.ModelEditorPage#setLabelProvider(org.eclipse.jface.viewers.ILabelProvider)
*/
@Override
public void setLabelProvider( ILabelProvider provider ) {
}
/* (non-Javadoc)
* @See org.teiid.designer.ui.editors.ModelEditorPage#updateReadOnlyState(boolean)
*/
@Override
public void updateReadOnlyState( boolean isReadOnly ) {
// swjTODO: implement
}
/**
* @see org.teiid.core.designer.event.EventObjectListener#processEvent(java.util.EventObject)
* @since 4.2
*/
@Override
public void processEvent( EventObject obj ) {
ModelResourceEvent event = (ModelResourceEvent)obj;
if (event.getType() == ModelResourceEvent.RELOADED) {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
treeViewer.setAutoExpandLevel(2);
treeViewer.setInput(new ItemProvider(Collections.singleton(getXsdSchema())));
}
});
}
}
/**
* @see org.teiid.designer.ui.editors.ModelEditorPage#openComplete()
* @since 4.2
*/
@Override
public void openComplete() {
// Default Implementation
}
/**
* @return False.
* @see org.teiid.designer.ui.editors.ModelEditorPage#isSelectedFirst(org.eclipse.ui.IEditorInput)
* @since 5.0.1
*/
@Override
public boolean isSelectedFirst( IEditorInput input ) {
return false;
}
}