package org.codemap.wizards; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.internal.ui.filters.ClosedProjectFilter; import org.eclipse.jdt.internal.ui.wizards.TypedViewerFilter; import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField; import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener; import org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter; import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter; import org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField; import org.eclipse.jdt.internal.ui.wizards.dialogfields.Separator; import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField; import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringDialogField; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.dialogs.ListSelectionDialog; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.ui.model.WorkbenchViewerComparator; import org.eclipse.ui.views.navigator.ResourceComparator; import ch.akuhn.foreach.For; @SuppressWarnings("restriction") // TODO public class NewCodemapCreationWizardPage extends WizardPage implements IDialogFieldListener, IListAdapter, IStringButtonAdapter { private ListDialogField fFileExtensionsDialogField; private StringDialogField fMapNameDialogField; private ListDialogField fProjectListDialogField; private StringButtonDialogField fFolderNameDialogField; private IResource fCurrProject; protected NewCodemapCreationWizardPage(ISelection selection) { super("wizardPage"); this.setTitle("Codemap"); this.setDescription("Create a new codemap."); initializeDialogFields(); initialize(selection); } private void initializeDialogFields() { fFolderNameDialogField= new StringButtonDialogField(this); fFolderNameDialogField.setDialogFieldListener(this); fFolderNameDialogField.setLabelText("Folder name:"); fFolderNameDialogField.setButtonLabel("Browse..."); fMapNameDialogField = new StringDialogField(); fMapNameDialogField.setDialogFieldListener(this); fMapNameDialogField.setLabelText("Map name:"); fMapNameDialogField.setText("default.map"); fProjectListDialogField= new ListDialogField(this, new String[] { "Add...", null, "Remove" }, new WorkbenchLabelProvider()); fProjectListDialogField.setDialogFieldListener(this); fProjectListDialogField.setLabelText("Projects:"); fProjectListDialogField.setRemoveButtonIndex(2); fFileExtensionsDialogField= new ListDialogField(this, new String[] { "Add...", null, "Remove" }, new LabelProvider()); fFileExtensionsDialogField.setDialogFieldListener(this); fFileExtensionsDialogField.setLabelText("File extensions:"); fFileExtensionsDialogField.setRemoveButtonIndex(2); } @Override public void createControl(Composite parent) { initializeDialogUnits(parent); Composite composite= new Composite(parent, SWT.NONE); composite.setFont(parent.getFont()); int nColumns= 3; composite.setLayout(new GridLayout(nColumns, false)); // pick & choose the wanted UI components createMapNameControls(composite, nColumns); createFolderNameControls(composite, nColumns); createSeparator(composite, nColumns); createProjectListControls(composite, nColumns); createProjectListControls(composite, nColumns); createFileExtensionsControls(composite, nColumns); setControl(composite); Dialog.applyDialogFont(composite); // PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IJavaHelpContextIds.NEW_CLASS_WIZARD_PAGE); } private void createFolderNameControls(Composite composite, int nColumns) { fFolderNameDialogField.doFillIntoGrid(composite, nColumns); } @SuppressWarnings("unchecked") private void initialize(ISelection selection) { if (selection == null || selection.isEmpty()) return; if (!(selection instanceof StructuredSelection)) return; Collection projects = new HashSet(); for (Object each: For.each(((StructuredSelection) selection).iterator())) { IResource resource = null; if (each instanceof IResource) resource = (IResource) each; else if (each instanceof IAdaptable) resource = (IResource) ((IAdaptable) each).getAdapter(IResource.class); if (resource != null) { projects.add(resource.getProject()); if (fCurrProject == null) { fCurrProject = resource.getProject(); if (resource.getType() == IResource.FILE) { fFolderNameDialogField.setText(resource.getParent().getFullPath().makeRelative().toString()); } else { fFolderNameDialogField.setText(resource.getFullPath().makeRelative().toString()); } } } } String fileExtension = "*.txt"; for (Object each: projects) { if (JavaCore.create((IProject) each) != null) fileExtension = "*.java"; } fFileExtensionsDialogField.addElement(fileExtension); for (Object each: projects) fProjectListDialogField.addElement(each); fCurrProject = (IProject) projects.iterator().next(); } private void createFileExtensionsControls(Composite composite, int nColumns) { fFileExtensionsDialogField.doFillIntoGrid(composite, nColumns); GridData gd= (GridData) fFileExtensionsDialogField.getListControl(null).getLayoutData(); gd.heightHint= convertHeightInCharsToPixels(4); gd.grabExcessVerticalSpace= false; } private void createMapNameControls(Composite composite, int nColumns) { fMapNameDialogField.doFillIntoGrid(composite, nColumns); } private void createProjectListControls(Composite composite, int nColumns) { fProjectListDialogField.doFillIntoGrid(composite, nColumns); GridData gd= (GridData) fProjectListDialogField.getListControl(null).getLayoutData(); gd.heightHint= convertHeightInCharsToPixels(8); gd.grabExcessVerticalSpace= false; } protected void createSeparator(Composite composite, int nColumns) { (new Separator(SWT.SEPARATOR | SWT.HORIZONTAL)).doFillIntoGrid(composite, nColumns, convertHeightInCharsToPixels(1)); } @Override public void customButtonPressed(ListDialogField field, int index) { if (field == fProjectListDialogField && index == 0) { chooseProjects(); } } private void chooseProjects() { ListSelectionDialog dialog= new ListSelectionDialog( getShell(), getNotYetRequiredProjects(), ArrayContentProvider.getInstance(), new WorkbenchLabelProvider(), "message"); dialog.setTitle("title"); dialog.setHelpAvailable(false); if (dialog.open() != Window.OK) return; for (Object each: dialog.getResult()) fProjectListDialogField.addElement(each); } @SuppressWarnings("unchecked") private Collection getNotYetRequiredProjects() { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); Object[] projects = root.getProjects(); new WorkbenchViewerComparator().sort(null, projects); projects = new ClosedProjectFilter().filter(null, (Object) null, projects); Collection result = new ArrayList(Arrays.asList(projects)); result.removeAll(fProjectListDialogField.getElements()); return result; } @Override public void dialogFieldChanged(DialogField field) { dialogChanged(); } @Override public void doubleClicked(ListDialogField field) { // TODO Auto-generated method stub } @Override public void selectionChanged(ListDialogField field) { dialogChanged(); } @Override public void changeControlPressed(DialogField field) { if (field == fFolderNameDialogField) { IPath initialPath= new Path(fFolderNameDialogField.getText()); String title= "title"; String message= "message"; IFolder folder= chooseFolder(title, message, initialPath); if (folder != null) { IPath path= folder.getFullPath().makeRelative(); fFolderNameDialogField.setText(path.toString()); } } dialogChanged(); } private boolean dialogChanged() { String folderName= getContainerPath(); String filename= getFilename(); if (folderName.isEmpty()) return updateStatus("Folder must be specified"); IResource container = ResourcesPlugin.getWorkspace().getRoot().findMember(folderName); if (container == null) return updateStatus("Folder container must exist"); if (container.getType() == IResource.ROOT) return updateStatus("Folder must not be the root"); if (container.getType() == IResource.FILE) return updateStatus("Folder must not be a file"); if (!container.isAccessible()) return updateStatus("Folder must be writable"); if (filename.isEmpty()) return updateStatus("File must be specified"); if (filename.indexOf('/') >= 0 || filename.indexOf('\\') >= 0) return updateStatus("File name must be valid"); if (filename.indexOf('.') >= -1 && !filename.endsWith(".map")) return updateStatus("File extension must be \"map\""); return updateStatus(null); } @SuppressWarnings("unchecked") private IFolder chooseFolder(String title, String message, IPath initialPath) { Class[] acceptedClasses= new Class[] { IContainer.class }; ViewerFilter filter= new TypedViewerFilter(acceptedClasses, null); ILabelProvider lp= new WorkbenchLabelProvider(); ITreeContentProvider cp= new WorkbenchContentProvider(); ElementTreeSelectionDialog dialog= new ElementTreeSelectionDialog(getShell(), lp, cp); dialog.setTitle(title); dialog.setMessage(message); dialog.addFilter(filter); dialog.setInput(ResourcesPlugin.getWorkspace().getRoot()); dialog.setComparator(new ResourceComparator(ResourceComparator.NAME)); // IResource res= currProject.findMember(initialPath); // if (res != null) { // dialog.setInitialSelection(res); // } if (dialog.open() == Window.OK) { return (IFolder) dialog.getFirstResult(); } return null; } private boolean updateStatus(String message) { setErrorMessage(message); setPageComplete(message == null); return message == null; } public String getFilename() { return fMapNameDialogField.getText(); } public String getContainerPath() { return fFolderNameDialogField.getText(); } }