package com.redhat.ceylon.eclipse.core.launch; import static com.redhat.ceylon.eclipse.core.builder.CeylonBuilder.getSourceFolders; import static com.redhat.ceylon.eclipse.util.Highlights.STRING_STYLER; import java.util.Comparator; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; 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.action.IMenuManager; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider; import org.eclipse.jface.viewers.ILabelProvider; 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.Shell; import com.redhat.ceylon.eclipse.code.open.FilteredItemsSelectionDialog; import com.redhat.ceylon.eclipse.ui.CeylonPlugin; import com.redhat.ceylon.eclipse.ui.CeylonResources; import com.redhat.ceylon.ide.common.model.BaseIdeModule; import com.redhat.ceylon.ide.common.model.CeylonProject; import com.redhat.ceylon.ide.common.model.IdeModule; import com.redhat.ceylon.ide.common.model.ProjectSourceFile; import com.redhat.ceylon.model.typechecker.model.Module; public class CeylonModuleSelectionDialog extends FilteredItemsSelectionDialog { class ModuleLabelProvider extends StyledCellLabelProvider implements DelegatingStyledCellLabelProvider.IStyledLabelProvider, ILabelProvider { @Override public boolean isLabelProperty(Object arg0, String arg1) { return false; } @Override public Image getImage(Object element) { return CeylonResources.MODULE; } @Override public void update(ViewerCell cell) { cell.setImage(getImage(cell.getElement())); StyledString styledText = getStyledText(cell.getElement()); cell.setText(styledText.getString()); cell.setStyleRanges(styledText.getStyleRanges()); super.update(cell); } @Override public StyledString getStyledText(Object element) { if (element instanceof Module) { Module module = (Module) element; if (module.isDefaultModule()) { return new StyledString("(default module)"); } else { return new StyledString(module.getNameAsString()) .append(" \"" + module.getVersion() + "\"", STRING_STYLER); } } return new StyledString(); } @Override public String getText(Object element) { return getStyledText(element).getString(); } } class ModuleRepoDetailsLabelProvider extends ModuleLabelProvider { @Override public Image getImage(Object element) { if (element instanceof BaseIdeModule) { BaseIdeModule module = (BaseIdeModule) element; if (module.getIsProjectModule()) { return CeylonResources.PROJECT; } else { return CeylonResources.REPO; } } else { return null; } } @Override public String getText(Object element) { if (element instanceof IdeModule) { final IdeModule<IProject,IResource,IFolder,IFile> module = (IdeModule<IProject,IResource,IFolder,IFile>) element; if (module.getIsProjectModule()) { // ProjectSourceFile unit = (ProjectSourceFile) module.getUnit(); // return unit.getProjectResource().getName(); CeylonProject<IProject,IResource,IFolder,IFile> ceylonProject = module.getCeylonProject(); return ceylonProject.getIdeArtifact().getName(); } else { return module.getRepositoryDisplayString(); } } return ""; } } class ModuleSourceFolderLabelProvider extends ModuleLabelProvider { @Override public Image getImage(Object element) { if (element instanceof BaseIdeModule) { BaseIdeModule module = (BaseIdeModule) element; if (module.getIsProjectModule()) { if (!module.getIsDefaultModule()) { return CeylonResources.SOURCE_FOLDER; } } } return null; } @Override public String getText(Object element) { if (element instanceof IdeModule) { final IdeModule<IProject,IResource,IFolder,IFile> module = (IdeModule<IProject,IResource,IFolder,IFile>) element; if (module.getIsProjectModule()) { if (!module.getIsDefaultModule()) { CeylonProject<IProject,IResource,IFolder,IFile> ceylonProject = module.getCeylonProject(); IProject project = ceylonProject.getIdeArtifact(); ProjectSourceFile<IProject,IResource,IFolder,IFile> unit = (ProjectSourceFile<IProject,IResource,IFolder,IFile>) module.getUnit(); for (IFolder folder: getSourceFolders(project)) { if (folder.findMember(unit.getRelativePath())!=null) { return folder.getFullPath().toPortableString(); } } return null; } } } return ""; } } class ModuleItemsFilter extends ItemsFilter { @Override public boolean isConsistentItem(Object item) { return item instanceof Module; } @Override public boolean matchItem(Object item) { if (item instanceof Module) { return matches(((Module) item).getNameAsString()); } return false; } @Override public String getPattern() { String pattern = super.getPattern(); return pattern.isEmpty() ? "**" : pattern; } } Set<Module> modules; public CeylonModuleSelectionDialog(Shell shell, Set<Module> modules) { super(shell, false, "&Type part of a name with wildcard *:", "&Choose a module to run:"); setTitle("Ceylon Launcher"); this.modules = modules; initLabelProviders(new ModuleLabelProvider(), null, new ModuleRepoDetailsLabelProvider(), new ModuleSourceFolderLabelProvider(), null); } @Override protected ItemsFilter createFilter() { return new ModuleItemsFilter(); } @Override protected void fillContentProvider(AbstractContentProvider contentProvider, ItemsFilter filter, IProgressMonitor monitor) throws CoreException { if (this.modules!= null) { for (Module entry : this.modules) { contentProvider.add(entry, filter); } } } @Override public String getElementName(Object mod) { if (mod instanceof Module) { Module entry = (Module)mod; return entry.toString(); } return null; } @Override protected Comparator<Object> getItemsComparator() { return new Comparator<Object>() { public int compare(Object o1, Object o2) { if(o1 instanceof Module && o2 instanceof Module) { return o1.toString().compareTo( (o2.toString())); } return -1; } }; } private static final String SETTINGS_ID = CeylonPlugin.PLUGIN_ID + ".addDeclarationFilterDialog"; @Override public boolean enableDocArea() { return false; } @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 IDialogSettings getDialogBoundsSettings() { IDialogSettings settings = getDialogSettings(); IDialogSettings section = settings.getSection(DIALOG_BOUNDS_SETTINGS); if (section == null) { section = settings.addNewSection(DIALOG_BOUNDS_SETTINGS); section.put(DIALOG_HEIGHT, 500); section.put(DIALOG_WIDTH, 400); } return section; } @Override protected void fillViewMenu(IMenuManager menuManager) {} @Override protected IStatus validateItem(Object mod) { return Status.OK_STATUS; } }