/*
* 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.extension.ui.editors;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
import org.teiid.designer.extension.ui.model.MedContentProvider;
import org.teiid.designer.extension.ui.model.MedLabelProvider;
import org.teiid.designer.extension.ui.model.MedModelNode;
import org.teiid.designer.extension.ui.model.MedModelNode.ModelType;
/**
* MedOutlinePage is the ContentOutlinePage for the ModelEditor. It contains a PageBook which can display a TreeViewer of the Model,
* plus any other controls that are contributed by ModelEditorPage extensions.
*/
public class MedOutlinePage extends ContentOutlinePage {
private ModelExtensionDefinitionEditor medEditor;
private MedSelectionProvider selectionProvider;
public MedOutlinePage( ModelExtensionDefinitionEditor editor ) {
super();
this.medEditor = editor;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.views.contentoutline.ContentOutlinePage#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl( Composite parent ) {
super.createControl(parent);
TreeViewer viewer = getTreeViewer();
viewer.setAutoExpandLevel(3);
viewer.setContentProvider(new MedContentProvider());
viewer.setLabelProvider(new MedLabelProvider());
ColumnViewerToolTipSupport.enableFor(viewer);
// hook selection synchronizer
MedSelectionSynchronizer selectionSynchronizer = getSelectionSynchronizer();
this.selectionProvider = new OutlineSelectionProvider(viewer);
selectionSynchronizer.addSelectionProvider(this.selectionProvider);
// populate view
viewer.setInput(this.medEditor);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.part.Page#dispose()
*/
@Override
public void dispose() {
getSelectionSynchronizer().removeSelectionProvider(this.selectionProvider);
super.dispose();
}
MedSelectionSynchronizer getSelectionSynchronizer() {
return this.medEditor.getSelectionSynchronizer();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.views.contentoutline.ContentOutlinePage#setFocus()
*/
@Override
public void setFocus() {
super.setFocus();
this.selectionProvider.setSelection(getSelectionSynchronizer().getSelection());
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.views.contentoutline.ContentOutlinePage#setSelection(org.eclipse.jface.viewers.ISelection)
*/
@Override
public void setSelection( ISelection selection ) {
}
class OutlineSelectionProvider implements MedSelectionProvider {
private final List<ISelectionChangedListener> listeners;
private final Viewer viewer;
public OutlineSelectionProvider( Viewer viewer ) {
this.viewer = viewer;
this.viewer.addSelectionChangedListener(new ISelectionChangedListener() {
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
@Override
public void selectionChanged( SelectionChangedEvent event ) {
fireSelectionChanged(event);
}
});
this.listeners = new ArrayList<ISelectionChangedListener>(1); // should only be synchronizer
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
*/
@Override
public void addSelectionChangedListener( ISelectionChangedListener listener ) {
if (!this.listeners.contains(listener)) {
this.listeners.add(listener);
}
}
void fireSelectionChanged( SelectionChangedEvent viewerEvent ) {
SelectionChangedEvent event = new SelectionChangedEvent(this, viewerEvent.getSelection());
for (ISelectionChangedListener listener : this.listeners) {
listener.selectionChanged(event);
}
}
/**
* {@inheritDoc}
*
* @see org.teiid.designer.extension.ui.editors.MedSelectionProvider#getMedEditorPage()
*/
@Override
public MedEditorPage getMedEditorPage() {
return null; // not connected to a editor page
}
/**
* {@inheritDoc}
*
* @see org.teiid.designer.extension.ui.editors.MedSelectionProvider#getSelectedNode(org.teiid.designer.extension.ui.model.MedModelNode.ModelType)
*/
@Override
public MedModelNode getSelectedNode( ModelType type ) {
IStructuredSelection selection = (IStructuredSelection)getSelection();
if (!selection.isEmpty()) {
MedModelNode modelNode = (MedModelNode)selection.getFirstElement();
if (modelNode.getType() == type) {
return modelNode;
}
// walk up ancestry to find
modelNode = modelNode.getParent();
while (modelNode != null) {
if (modelNode.getType() == type) {
return modelNode;
}
modelNode = modelNode.getParent();
}
}
return null;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
*/
@Override
public ISelection getSelection() {
return this.viewer.getSelection();
}
/**
* {@inheritDoc}
*
* @see org.teiid.designer.extension.ui.editors.MedSelectionProvider#isApplicable(org.eclipse.jface.viewers.IStructuredSelection)
*/
@Override
public boolean isApplicable( IStructuredSelection selection ) {
return true;
}
/**
* {@inheritDoc}
*
* @see org.teiid.designer.extension.ui.editors.MedSelectionProvider#refresh()
*/
@Override
public void refresh() {
this.viewer.refresh();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
*/
@Override
public void removeSelectionChangedListener( ISelectionChangedListener listener ) {
this.listeners.remove(listener);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
*/
@Override
public void setSelection( ISelection selection ) {
if (!selection.equals(this.viewer.getSelection())) {
this.viewer.setSelection(selection);
}
}
}
}