/******************************************************************************* * Copyright (c) 2000, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.internal.ui.wizards.buildpaths; import java.util.List; 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.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.jface.dialogs.StatusDialog; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.Window; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.dialogs.ISelectionStatusValidator; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.ui.views.navigator.ResourceComparator; import org.eclipse.jdt.internal.corext.util.Messages; import org.eclipse.jdt.internal.ui.IJavaHelpContextIds; import org.eclipse.jdt.internal.ui.dialogs.StatusInfo; import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels; import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages; import org.eclipse.jdt.internal.ui.wizards.TypedElementSelectionValidator; 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.IStringButtonAdapter; import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil; import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField; public class ExclusionInclusionEntryDialog extends StatusDialog { private StringButtonDialogField fExclusionPatternDialog; private StatusInfo fExclusionPatternStatus; private IContainer fCurrSourceFolder; private String fExclusionPattern; private List<String> fExistingPatterns; private boolean fIsExclusion; public ExclusionInclusionEntryDialog(Shell parent, boolean isExclusion, String patternToEdit, List<String> existingPatterns, CPListElement entryToEdit) { super(parent); fIsExclusion= isExclusion; fExistingPatterns= existingPatterns; String title, message; if (isExclusion) { if (patternToEdit == null) { title= NewWizardMessages.ExclusionInclusionEntryDialog_exclude_add_title; } else { title= NewWizardMessages.ExclusionInclusionEntryDialog_exclude_edit_title; } message= Messages.format(NewWizardMessages.ExclusionInclusionEntryDialog_exclude_pattern_label, BasicElementLabels.getPathLabel(entryToEdit.getPath(), false)); } else { if (patternToEdit == null) { title= NewWizardMessages.ExclusionInclusionEntryDialog_include_add_title; } else { title= NewWizardMessages.ExclusionInclusionEntryDialog_include_edit_title; } message= Messages.format(NewWizardMessages.ExclusionInclusionEntryDialog_include_pattern_label, BasicElementLabels.getPathLabel(entryToEdit.getPath(), false)); } setTitle(title); if (patternToEdit != null) { fExistingPatterns.remove(patternToEdit); } IWorkspaceRoot root= entryToEdit.getJavaProject().getProject().getWorkspace().getRoot(); IResource res= root.findMember(entryToEdit.getPath()); if (res instanceof IContainer) { fCurrSourceFolder= (IContainer) res; } fExclusionPatternStatus= new StatusInfo(); ExclusionPatternAdapter adapter= new ExclusionPatternAdapter(); fExclusionPatternDialog= new StringButtonDialogField(adapter); fExclusionPatternDialog.setLabelText(message); fExclusionPatternDialog.setButtonLabel(NewWizardMessages.ExclusionInclusionEntryDialog_pattern_button); fExclusionPatternDialog.setDialogFieldListener(adapter); fExclusionPatternDialog.enableButton(fCurrSourceFolder != null); if (patternToEdit == null) { fExclusionPatternDialog.setText(""); //$NON-NLS-1$ } else { fExclusionPatternDialog.setText(patternToEdit.toString()); } } @Override protected Control createDialogArea(Composite parent) { Composite composite= (Composite)super.createDialogArea(parent); int widthHint= convertWidthInCharsToPixels(60); Composite inner= new Composite(composite, SWT.NONE); GridLayout layout= new GridLayout(); layout.marginHeight= 0; layout.marginWidth= 0; layout.numColumns= 2; inner.setLayout(layout); Label description= new Label(inner, SWT.WRAP); if (fIsExclusion) { description.setText(NewWizardMessages.ExclusionInclusionEntryDialog_exclude_description); } else { description.setText(NewWizardMessages.ExclusionInclusionEntryDialog_include_description); } GridData gd= new GridData(); gd.horizontalSpan= 2; gd.widthHint= convertWidthInCharsToPixels(80); description.setLayoutData(gd); fExclusionPatternDialog.doFillIntoGrid(inner, 3); LayoutUtil.setWidthHint(fExclusionPatternDialog.getLabelControl(null), widthHint); LayoutUtil.setHorizontalSpan(fExclusionPatternDialog.getLabelControl(null), 2); LayoutUtil.setWidthHint(fExclusionPatternDialog.getTextControl(null), widthHint); LayoutUtil.setHorizontalGrabbing(fExclusionPatternDialog.getTextControl(null)); fExclusionPatternDialog.postSetFocusOnDialogField(parent.getDisplay()); applyDialogFont(composite); return composite; } // -------- ExclusionPatternAdapter -------- private class ExclusionPatternAdapter implements IDialogFieldListener, IStringButtonAdapter { // -------- IDialogFieldListener public void dialogFieldChanged(DialogField field) { doStatusLineUpdate(); } public void changeControlPressed(DialogField field) { doChangeControlPressed(); } } protected void doChangeControlPressed() { IPath pattern= chooseExclusionPattern(); if (pattern != null) { fExclusionPatternDialog.setText(pattern.toString()); } } protected void doStatusLineUpdate() { checkIfPatternValid(); updateStatus(fExclusionPatternStatus); } protected void checkIfPatternValid() { String pattern= fExclusionPatternDialog.getText().trim(); if (pattern.length() == 0) { fExclusionPatternStatus.setError(NewWizardMessages.ExclusionInclusionEntryDialog_error_empty); return; } IPath path= new Path(pattern); if (path.isAbsolute() || path.getDevice() != null) { fExclusionPatternStatus.setError(NewWizardMessages.ExclusionInclusionEntryDialog_error_notrelative); return; } if (fExistingPatterns.contains(pattern)) { fExclusionPatternStatus.setError(NewWizardMessages.ExclusionInclusionEntryDialog_error_exists); return; } fExclusionPattern= pattern; fExclusionPatternStatus.setOK(); } public String getExclusionPattern() { return fExclusionPattern; } /* * @see org.eclipse.jface.window.Window#configureShell(Shell) */ @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell, IJavaHelpContextIds.EXCLUSION_PATTERN_DIALOG); } // ---------- util method ------------ private IPath chooseExclusionPattern() { String title, message; if (fIsExclusion) { title= NewWizardMessages.ExclusionInclusionEntryDialog_ChooseExclusionPattern_title; message= NewWizardMessages.ExclusionInclusionEntryDialog_ChooseExclusionPattern_description; } else { title= NewWizardMessages.ExclusionInclusionEntryDialog_ChooseInclusionPattern_title; message= NewWizardMessages.ExclusionInclusionEntryDialog_ChooseInclusionPattern_description; } IPath initialPath= new Path(fExclusionPatternDialog.getText()); IPath[] res= chooseExclusionPattern(getShell(), fCurrSourceFolder, title, message, initialPath, false); if (res == null) { return null; } return res[0]; } public static IPath[] chooseExclusionPattern(Shell shell, IContainer currentSourceFolder, String title, String message, IPath initialPath, boolean multiSelection) { Class<?>[] acceptedClasses= new Class[] { IFolder.class, IFile.class }; ISelectionStatusValidator validator= new TypedElementSelectionValidator(acceptedClasses, multiSelection); ViewerFilter filter= new TypedViewerFilter(acceptedClasses); ILabelProvider lp= new WorkbenchLabelProvider(); ITreeContentProvider cp= new WorkbenchContentProvider(); IResource initialElement= null; if (initialPath != null) { IContainer curr= currentSourceFolder; int nSegments= initialPath.segmentCount(); for (int i= 0; i < nSegments; i++) { IResource elem= curr.findMember(initialPath.segment(i)); if (elem != null) { initialElement= elem; } if (elem instanceof IContainer) { curr= (IContainer) elem; } else { break; } } } ElementTreeSelectionDialog dialog= new ElementTreeSelectionDialog(shell, lp, cp); dialog.setTitle(title); dialog.setValidator(validator); dialog.setMessage(message); dialog.addFilter(filter); dialog.setInput(currentSourceFolder); dialog.setInitialSelection(initialElement); dialog.setComparator(new ResourceComparator(ResourceComparator.NAME)); dialog.setHelpAvailable(false); if (dialog.open() == Window.OK) { Object[] objects= dialog.getResult(); int existingSegments= currentSourceFolder.getFullPath().segmentCount(); IPath[] resArr= new IPath[objects.length]; for (int i= 0; i < objects.length; i++) { IResource currRes= (IResource) objects[i]; IPath path= currRes.getFullPath().removeFirstSegments(existingSegments).makeRelative(); if (currRes instanceof IContainer) { path= path.addTrailingSeparator(); } resArr[i]= path; } return resArr; } return null; } }