package com.redhat.ceylon.eclipse.core.launch; import static com.redhat.ceylon.eclipse.code.complete.CodeCompletions.getLabelDescriptionFor; import static com.redhat.ceylon.eclipse.code.complete.CodeCompletions.getStyledDescriptionFor; import static com.redhat.ceylon.eclipse.code.outline.CeylonLabelProvider.getImageForDeclaration; import static com.redhat.ceylon.eclipse.code.outline.CeylonLabelProvider.getPackageLabel; import static com.redhat.ceylon.eclipse.ui.CeylonResources.PACKAGE; import java.util.Comparator; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider; import org.eclipse.jface.viewers.ILabelDecorator; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.StyledCellLabelProvider; import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog; import com.redhat.ceylon.model.typechecker.model.Declaration; import com.redhat.ceylon.model.typechecker.model.TypeDeclaration; import com.redhat.ceylon.model.typechecker.model.TypedDeclaration; import com.redhat.ceylon.eclipse.ui.CeylonPlugin; public class CeylonTopLevelSelectionDialog extends FilteredItemsSelectionDialog { private static final String SETTINGS_ID = CeylonPlugin.PLUGIN_ID + ".toplevelSelection"; private List<Declaration> decls; public CeylonTopLevelSelectionDialog(Shell shell, boolean multi, List<Declaration> decls ) { super(shell, multi); setTitle("Ceylon Launcher"); setMessage("Select the toplevel method or class to launch:"); setListLabelProvider(new LabelProvider()); setDetailsLabelProvider(new DetailsLabelProvider()); setListSelectionLabelDecorator(new SelectionLabelDecorator()); this.decls = decls; } @Override protected Control createExtendedContentArea(Composite parent) { return null; } @Override protected IDialogSettings getDialogSettings() { IDialogSettings settings = CeylonPlugin.getInstance().getDialogSettings(); IDialogSettings section = settings.getSection(SETTINGS_ID); if (section == null) { section = settings.addNewSection(SETTINGS_ID); } return section; } @Override protected IStatus validateItem(Object item) { return Status.OK_STATUS; } @Override protected ItemsFilter createFilter() { return new ItemsFilter() { @Override public boolean matchItem(Object item) { return matches(getElementName(item)); } @Override public boolean isConsistentItem(Object item) { return true; } @Override public String getPattern() { String pattern = super.getPattern(); return pattern.isEmpty() ? "**" : pattern; } }; } @Override protected Comparator<?> getItemsComparator() { Comparator<Object> comp = new Comparator<Object>() { public int compare(Object o1, Object o2) { if (o1 instanceof Declaration && o2 instanceof Declaration) { if (o1 instanceof TypedDeclaration && o2 instanceof TypeDeclaration) { return -1; } else if (o2 instanceof TypedDeclaration && o1 instanceof TypeDeclaration) { return 1; } else { return ((Declaration)o1).getName() .compareTo(((Declaration)o2).getName()); } } return 0; } }; return comp; } @Override protected void fillContentProvider( AbstractContentProvider contentProvider, ItemsFilter itemsFilter, IProgressMonitor progressMonitor) throws CoreException { if(this.decls != null) { for(Declaration d : this.decls) { if(itemsFilter.isConsistentItem(d)) { contentProvider.add(d, itemsFilter); } } } } @Override public String getElementName(Object item) { return ((Declaration) item).getName(); } static class LabelProvider extends StyledCellLabelProvider implements DelegatingStyledCellLabelProvider.IStyledLabelProvider, ILabelProvider { @Override public void addListener(ILabelProviderListener listener) {} @Override public void dispose() {} @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void removeListener(ILabelProviderListener listener) {} @Override public Image getImage(Object element) { Declaration d = (Declaration) element; return d==null ? null : getImageForDeclaration(d); } @Override public String getText(Object element) { Declaration d = (Declaration) element; return d==null ? null : getLabelDescriptionFor(d); } @Override public StyledString getStyledText(Object element) { if (element==null) { return new StyledString(); } else { Declaration d = (Declaration) element; return getStyledDescriptionFor(d); } } @Override public void update(ViewerCell cell) { Object element = cell.getElement(); if (element!=null) { StyledString styledText = getStyledText(element); cell.setText(styledText.toString()); cell.setStyleRanges(styledText.getStyleRanges()); cell.setImage(getImage(element)); super.update(cell); } } } static class DetailsLabelProvider implements ILabelProvider { @Override public void removeListener(ILabelProviderListener listener) {} @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void dispose() {} @Override public void addListener(ILabelProviderListener listener) {} @Override public String getText(Object element) { return getPackageLabel((Declaration) element); } @Override public Image getImage(Object element) { return PACKAGE; } } static class SelectionLabelDecorator implements ILabelDecorator { @Override public void removeListener(ILabelProviderListener listener) {} @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void dispose() {} @Override public void addListener(ILabelProviderListener listener) {} @Override public String decorateText(String text, Object element) { return text + " \u2014 " + getPackageLabel((Declaration) element); } @Override public Image decorateImage(Image image, Object element) { return null; } } }