/******************************************************************************* * 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 * Alex Blewitt - https://bugs.eclipse.org/bugs/show_bug.cgi?id=168954 *******************************************************************************/ package org.eclipse.jdt.internal.ui.fix; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import com.ibm.icu.text.MessageFormat; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.internal.corext.fix.CleanUpConstants; import org.eclipse.jdt.internal.corext.fix.SortMembersFix; import org.eclipse.jdt.ui.cleanup.CleanUpContext; import org.eclipse.jdt.ui.cleanup.CleanUpRequirements; import org.eclipse.jdt.ui.cleanup.ICleanUpFix; import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels; public class SortMembersCleanUp extends AbstractCleanUp { private HashSet<IResource> fTouchedFiles; public SortMembersCleanUp() { super(); } public SortMembersCleanUp(Map<String, String> options) { super(options); } /** * {@inheritDoc} */ @Override public ICleanUpFix createFix(CleanUpContext context) throws CoreException { CompilationUnit compilationUnit= context.getAST(); if (compilationUnit == null) return null; boolean sortMembers= isEnabled(CleanUpConstants.SORT_MEMBERS); ICleanUpFix fix= SortMembersFix.createCleanUp(compilationUnit, sortMembers, sortMembers && isEnabled(CleanUpConstants.SORT_MEMBERS_ALL)); if (fix != null) { if (fTouchedFiles == null) { fTouchedFiles= new HashSet<IResource>(); } fTouchedFiles.add(((ICompilationUnit)compilationUnit.getJavaElement()).getResource()); } return fix; } /** * {@inheritDoc} */ @Override public RefactoringStatus checkPostConditions(IProgressMonitor monitor) throws CoreException { if (fTouchedFiles == null) { return super.checkPostConditions(monitor); } else { if (monitor == null) monitor= new NullProgressMonitor(); monitor.beginTask("", fTouchedFiles.size()); //$NON-NLS-1$ try { RefactoringStatus result= new RefactoringStatus(); for (Iterator<IResource> iterator= fTouchedFiles.iterator(); iterator.hasNext();) { IFile file= (IFile)iterator.next(); if (containsRelevantMarkers(file)) { String fileLocation= BasicElementLabels.getPathLabel(file.getProjectRelativePath(), false); String projectName= file.getProject().getName(); result.addWarning(MessageFormat.format(MultiFixMessages.SortMembersCleanUp_RemoveMarkersWarning0, new Object[] {fileLocation, projectName})); } monitor.worked(1); } return result; } finally { monitor.done(); fTouchedFiles= null; } } } /** * {@inheritDoc} */ @Override public String[] getStepDescriptions() { if (isEnabled(CleanUpConstants.SORT_MEMBERS)) { if (isEnabled(CleanUpConstants.SORT_MEMBERS_ALL)) { return new String[] {MultiFixMessages.SortMembersCleanUp_AllMembers_description}; } else { return new String[] {MultiFixMessages.SortMembersCleanUp_Excluding_description}; } } return null; } /** * {@inheritDoc} */ @Override public String getPreview() { StringBuffer buf= new StringBuffer(); buf.append("class SortExample {\n"); //$NON-NLS-1$ if ((isEnabled(CleanUpConstants.SORT_MEMBERS) && isEnabled(CleanUpConstants.SORT_MEMBERS_ALL))) { buf.append(" private String bar;\n"); //$NON-NLS-1$ buf.append(" private String foo;\n"); //$NON-NLS-1$ } else { buf.append(" private String foo;\n"); //$NON-NLS-1$ buf.append(" private String bar;\n"); //$NON-NLS-1$ } if (isEnabled(CleanUpConstants.SORT_MEMBERS)) { buf.append(" private void bar() {}\n"); //$NON-NLS-1$ buf.append(" private void foo() {}\n"); //$NON-NLS-1$ } else { buf.append(" private void foo() {}\n"); //$NON-NLS-1$ buf.append(" private void bar() {}\n"); //$NON-NLS-1$ } buf.append("}\n"); //$NON-NLS-1$ return buf.toString(); } /** * {@inheritDoc} */ @Override public CleanUpRequirements getRequirements() { return new CleanUpRequirements(isEnabled(CleanUpConstants.SORT_MEMBERS), false, false, null); } private static boolean containsRelevantMarkers(IFile file) throws CoreException { IMarker[] bookmarks= file.findMarkers(IMarker.BOOKMARK, true, IResource.DEPTH_INFINITE); if (bookmarks.length != 0) return true; IMarker[] tasks= file.findMarkers(IMarker.TASK, true, IResource.DEPTH_INFINITE); if (tasks.length != 0) return true; IMarker[] breakpoints= file.findMarkers(IBreakpoint.BREAKPOINT_MARKER, true, IResource.DEPTH_INFINITE); if (breakpoints.length != 0) return true; return false; } }