blob: ae057183ece25626c0a7f2d148ad91b8d320b19b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2012 Oracle Corporation and others.
* 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:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.ui.proposal.providers;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.bpel.ui.util.ListMap;
import org.eclipse.jface.fieldassist.IContentProposal;
import org.eclipse.jface.fieldassist.IContentProposalProvider;
import org.eclipse.jface.viewers.IFilter;
import org.eclipse.jface.viewers.IStructuredContentProvider;
/**
*
* A generic proposal provider for any model elements. This class takes a
* <ul>
* <li> value provider,
* <li> a structured content provider, and
* <li> a filter.
* </ul>
*
* The value provider provides the value for the model element. Rather then passing a reference to the
* model object in question, a value provider can provide a read only value that can change over time.
* This is useful in the properties sections, where an input of a property section may change.
* <p>
* The structured content provider provides a list of content for that model object.
* <p>
* The filter applies a selection criteria as to whether the proposal ought to be shown.
* <p>
* In addition, proposals may be added at the beginning or end of the list generated from the filtered content provider.
* <p>
*
* @author Michal Chmielewski (michal.chmielewski@oracle.com)
* @date Jul 21, 2006
*
*
*/
public class ModelContentProposalProvider implements
IContentProposalProvider {
static final IContentProposal [] NO_PROPOSALS = {} ;
private ValueProvider valueProvider;
private List<IContentProposal> fEndProposals = new ArrayList<IContentProposal>();
private List<IContentProposal> fStartProposals = new LinkedList<IContentProposal>();
private IStructuredContentProvider contentProvider;
private IFilter filter;
/**
* A simple input provider to delay input providing when we don't have it
*/
static public abstract class ValueProvider {
/**
* The value for the value provider.
*
* @return the value for the value provider.
*/
public abstract Object value () ;
}
/**
* Brand new shiny ModelContentProposalProvider
* @param aValueProvider
* @param aContentProvider
*/
public ModelContentProposalProvider (ValueProvider aValueProvider, IStructuredContentProvider aContentProvider ) {
this (aValueProvider,aContentProvider, null);
}
/**
* @param aValueProvider the value provider for the model object.
* @param aContentProvider the content provider to use
* @param aFilter to filter out proposal given by the content provider
*/
public ModelContentProposalProvider(ValueProvider aValueProvider, IStructuredContentProvider aContentProvider, IFilter aFilter) {
super();
this.valueProvider = aValueProvider;
this.contentProvider = aContentProvider;
this.filter = aFilter;
}
/**
* Add proposal to start.
*
* @param proposal
*/
public void addProposalToStart ( IContentProposal proposal ) {
fStartProposals.add ( proposal );
}
/**
* Add proposal to end.
*
* @param proposal
*/
public void addProposalToEnd ( IContentProposal proposal ) {
fEndProposals.add ( proposal );
}
/** (non-Javadoc)
* @see org.eclipse.jface.fieldassist.IContentProposalProvider#getProposals(java.lang.String, int)
*/
public IContentProposal[] getProposals (String contents, int position) {
List<IContentProposal> all = new ArrayList<IContentProposal>();
all.addAll ( fStartProposals );
IContentProposal[] proposals = (IContentProposal[]) ListMap.Map (
// provider gives us the right elements, which we then filter, and ...
doFilter( contentProvider.getElements( valueProvider.value() ) ),
// ... the visitor just adapts
new ListMap.Visitor () {
public Object visit (Object obj) {
Object adapter = BPELUtil.adapt(obj, IContentProposal.class );
return (adapter != null ? adapter : ListMap.IGNORE);
}
},
NO_PROPOSALS
) ;
for (IContentProposal p : proposals) {
all.add(p);
}
all.addAll ( fEndProposals );
return all.toArray( NO_PROPOSALS );
}
Object[] doFilter (Object [] elements) {
if (filter == null || elements.length < 1) {
return elements;
}
int size = elements.length;
ArrayList<Object> out = new ArrayList<Object>(size);
for(Object e : elements) {
if (filter.select(e)) {
out.add(e);
}
}
return out.toArray();
}
}