/* * 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.Iterator; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.metamodel.MetamodelDescriptor; import org.teiid.designer.ui.UiConstants; import org.teiid.designer.ui.common.util.WidgetFactory; /** * MetamodelSelectionDialog is a tree selection dialog specialized to optionally filter out all non-primary metamodels. * * @since 8.0 */ public class MetamodelSelectionDialog extends ElementTreeSelectionDialog { private static final String PRIMARY_METAMODELS = UiConstants.Util.getString("MetamodelClassDialog.primaryOnly"); //$NON-NLS-1$ private static final String ALL_METAMODELS = UiConstants.Util.getString("MetamodelClassDialog.allMetamodels"); //$NON-NLS-1$ private boolean primaryMetamodelsOnly = true; Collection primaryMetamodelResources; TreeViewer treeViewer; private PrimaryMetamodelFilter filter; private ILabelProvider labelProvider; /** * Construct an instance of MetamodelSelectionDialog. * * @param parent * @param labelProvider * @param contentProvider */ public MetamodelSelectionDialog( Shell parent, ILabelProvider labelProvider, ITreeContentProvider contentProvider ) { super(parent, labelProvider, contentProvider); this.labelProvider = labelProvider; } /** * @see org.eclipse.ui.dialogs.ElementTreeSelectionDialog#createTreeViewer(org.eclipse.swt.widgets.Composite) */ @Override protected TreeViewer createTreeViewer( Composite parent ) { Composite panel = new Composite(parent, SWT.NONE); panel.setLayout(new GridLayout()); treeViewer = super.createTreeViewer(panel); GridData gd = new GridData(GridData.FILL_BOTH); panel.setLayoutData(gd); Button radioButton = WidgetFactory.createRadioButton(panel, PRIMARY_METAMODELS, true); radioButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent event ) { setMetamodelFilter(true); } }); radioButton = WidgetFactory.createRadioButton(panel, ALL_METAMODELS, false); radioButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent event ) { setMetamodelFilter(false); } }); filter = new PrimaryMetamodelFilter(); treeViewer.addFilter(filter); return treeViewer; } public IBaseLabelProvider getViewerLabelProvider() { return this.labelProvider; } protected void setMetamodelFilter( boolean primaryOnly ) { this.primaryMetamodelsOnly = primaryOnly; if (this.primaryMetamodelsOnly) { filter.enable = true; // treeViewer.setInput(this.primaryMetamodelDescriptors); } else { // treeViewer.setInput(this.metamodelDescriptors); filter.enable = false; } Display.getCurrent().asyncExec(new Runnable() { @Override public void run() { treeViewer.refresh(); } }); } /** * @see org.eclipse.ui.dialogs.ElementTreeSelectionDialog#setInput(java.lang.Object) */ @Override public void setInput( Object input ) { if (input instanceof Collection) { Collection metamodelDescriptors = (Collection)input; // build a collection of all the MetamodelResources that are primary metamodels // ... this collection is for the filter to use primaryMetamodelResources = new ArrayList(metamodelDescriptors.size()); for (Iterator iter = metamodelDescriptors.iterator(); iter.hasNext();) { MetamodelDescriptor mmd = (MetamodelDescriptor)iter.next(); if (mmd.isPrimary()) { String stringUri = mmd.getNamespaceURI(); URI uri = URI.createURI(stringUri); Resource r = ModelerCore.getMetamodelRegistry().getResource(uri); primaryMetamodelResources.add(r); } } } super.setInput(input); } /** * @see org.eclipse.jface.dialogs.Dialog#createContents(org.eclipse.swt.widgets.Composite) * @since 4.2 */ @Override protected Control createContents( Composite theParent ) { Control control = super.createContents(theParent); // setting the initial selection was not working with this subclass. Adding this code fixes it. getTreeViewer().setSelection(new StructuredSelection(getInitialElementSelections()), true); updateOKStatus(); return control; } public class PrimaryMetamodelFilter extends ViewerFilter { public boolean enable = true; /** * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, * java.lang.Object) */ @Override public boolean select( Viewer viewer, Object parentElement, Object element ) { if (enable) { if (element instanceof Resource) { return primaryMetamodelResources.contains(element); } } return true; } } }