package com.redhat.ceylon.eclipse.code.imports; 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 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.IDialogConstants; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider; 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.eclipse.ui.CeylonPlugin; import com.redhat.ceylon.eclipse.ui.CeylonResources; import com.redhat.ceylon.eclipse.util.Highlights; final class ImportSelectionDialog extends FilteredItemsSelectionDialog { private List<Declaration> proposals; ImportSelectionDialog(Shell shell, List<Declaration> proposals) { super(shell); this.proposals = proposals; setTitle("Organize Imports"); setMessage("Select declaration to import:"); setListLabelProvider(new LabelProvider()); setDetailsLabelProvider(new DetailsLabelProvider()); } protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.OK_ID, IDialogConstants.PROCEED_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.SKIP_LABEL, false); } @Override protected Control createExtendedContentArea(Composite parent) { return null; } @Override protected IDialogSettings getDialogSettings() { return CeylonPlugin.getInstance().getDialogSettings(); } @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<Object> getItemsComparator() { return new Comparator<Object>() { @Override public int compare(Object o1, Object o2) { Declaration d1 = (Declaration) o1; Declaration d2 = (Declaration) o2; return d1.getQualifiedNameString() .compareTo(d2.getQualifiedNameString()); } }; } @Override protected void fillContentProvider( AbstractContentProvider contentProvider, ItemsFilter itemsFilter, IProgressMonitor progressMonitor) throws CoreException { for (Declaration d: proposals) { contentProvider.add(d, itemsFilter); } } @Override public String getElementName(Object item) { return ((Declaration) item).getQualifiedNameString(); } } 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) { Declaration d = (Declaration) element; return getPackageLabel(d); } @Override public Image getImage(Object element) { return CeylonResources.PACKAGE; } } 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; StyledString label = getStyledDescriptionFor(d); label.append(" \u2014 ", Highlights.PACKAGE_STYLER) .append(getPackageLabel(d), Highlights.PACKAGE_STYLER); return label; } } @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); } } }