/*
* 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.viewsupport;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.ui.UiConstants;
import org.teiid.designer.ui.common.eventsupport.SelectionUtilities;
import org.teiid.designer.ui.common.viewsupport.StatusInfo;
import org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource;
import org.teiid.designer.ui.explorer.ModelExplorerContentProvider;
import org.teiid.designer.ui.explorer.ModelExplorerLabelProvider;
/**
* WorkspaceTreeAccumulatorSource is an AccumulatorSource for the AccumulatorPanel that displays
* the workspace, with models expandable. Users may set an ISelectionStatusValidator on this
* AccumulatorSource to validate the objects selected in the tree. If no validator is used, then
* all selections in this tree are considered valid.
*
* @since 8.0
*/
public class WorkspaceTreeAccumulatorSource implements IAccumulatorSource {
private static final IStatus OK_STATUS = new StatusInfo(UiConstants.PLUGIN_ID);
private TreeViewer treeViewer;
private ISelectionStatusValidator validator;
private IStatus currentStatus = OK_STATUS;
private Collection currentValues;
private ILabelProvider labelProvider;
private ITreeContentProvider contentProvider;
private ViewerFilter viewerFilter;
/**
* Construct an instance of WorkspaceTreeAccumulatorSource.
*/
public WorkspaceTreeAccumulatorSource(Collection currentValues) {
this(currentValues, new ModelExplorerLabelProvider(), new ModelExplorerContentProvider());
}
/**
* Construct an instance of WorkspaceTreeAccumulatorSource.
*/
public WorkspaceTreeAccumulatorSource(Collection currentValues, ILabelProvider labelProvider, ITreeContentProvider contentProvider) {
this.currentValues = new ArrayList(currentValues);
this.labelProvider = labelProvider;
this.contentProvider = contentProvider;
}
public void setSelectionValidator(ISelectionStatusValidator validator) {
this.validator = validator;
}
public void setViewerFilter(ViewerFilter filter) {
this.viewerFilter = filter;
}
public ILabelProvider getLabelProvider() {
return labelProvider;
}
/**
* Obtain the Collection of current values being accumluated. This method is available
* for the validator to compare a selection against the current values to detect, among
* other things, duplicate instances.
* @return an unmodifiable collection of this accumulator's current values.
*/
public Collection getCurrentValues() {
return Collections.unmodifiableCollection(this.currentValues);
}
/* (non-Javadoc)
* @see org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource#accumulatedValuesRemoved(java.util.Collection)
*/
@Override
public void accumulatedValuesRemoved(Collection values) {
// this accumulator source does not modify the tree to reflect selected values
this.currentValues.removeAll(values);
}
/* (non-Javadoc)
* @see org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource#accumulatedValuesAdded(java.util.Collection)
*/
@Override
public void accumulatedValuesAdded(Collection values) {
// this accumulator source does not modify the tree to reflect selected values
this.currentValues.addAll(values);
// (But we must deselect to avoid the 'current value already contains' validation error.
// See defect 13000.)
treeViewer.setSelection( null, false );
}
/* (non-Javadoc)
* @see org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource#getAvailableValues()
*/
@Override
public Collection getAvailableValues() {
// since Add All is not supported, return an empty list.
return Collections.EMPTY_LIST;
}
/* (non-Javadoc)
* @see org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource#getAvailableValuesCount()
*/
@Override
public int getAvailableValuesCount() {
// must return a non-0 value or the accumulator controls will not enable.
return 10;
}
/* (non-Javadoc)
* @see org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource#getSelectedAvailableValues()
*/
@Override
public Collection getSelectedAvailableValues() {
ISelection selection = treeViewer.getSelection();
Collection result = SelectionUtilities.getSelectedObjects(selection);
if ( validator != null ) {
currentStatus = validator.validate(result.toArray());
}
return result;
}
/* (non-Javadoc)
* @see org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource#getSelectedAvailableValuesCount()
*/
@Override
public int getSelectedAvailableValuesCount() {
return getSelectedAvailableValues().size();
}
/* (non-Javadoc)
* @see org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public Control createControl(Composite parent) {
treeViewer = new TreeViewer(parent);
treeViewer.setLabelProvider(labelProvider);
treeViewer.setContentProvider(contentProvider);
if ( viewerFilter != null ) {
treeViewer.addFilter(viewerFilter);
}
treeViewer.setInput(ModelerCore.getWorkspace().getRoot());
treeViewer.expandToLevel(2);
return treeViewer.getControl();
}
/* (non-Javadoc)
* @see org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource#addSelectionListener(org.eclipse.swt.events.SelectionListener)
*/
@Override
public void addSelectionListener(SelectionListener listener) {
treeViewer.getTree().addSelectionListener(listener);
}
/* (non-Javadoc)
* @see org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource#supportsAddAll()
*/
@Override
public boolean supportsAddAll() {
return false;
}
/* (non-Javadoc)
* @see org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource#getSelectionStatus()
*/
@Override
public IStatus getSelectionStatus() {
getSelectedAvailableValues();
return currentStatus;
}
}