blob: b67ed8c7559e8196034faf89340ed953051bb987 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 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: Sian January - initial version
* ...
******************************************************************************/
package org.eclipse.ajdt.internal.ui.refactoring;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.ajdt.core.BuildConfig;
import org.eclipse.ajdt.core.codeconversion.CodeChecker;
import org.eclipse.ajdt.internal.ui.text.UIMessages;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
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.ui.actions.WorkspaceModifyDelegatingOperation;
/**
* Dialog that renames file extensions for an entire project. Three options are
* presented to the user - convert all extensions to .java, convert all
* extensions to .aj and convert aspects to .aj and classes to .java.
*/
public class RenameFileExtensionsDialog extends Dialog {
// The project
private IProject project;
private Button convertAllToJavaButton;
private Button convertAllToAJButton;
private Button convertAspectsToAJButton;
private Button includeFilesNotInBuildButton;
private Button updateBuildConfigsButton;
/**
* @param parentShell
*/
public RenameFileExtensionsDialog(Shell parentShell, IProject project) {
super(parentShell);
this.project = project;
}
/**
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText(UIMessages.Refactoring_ConvertFileExtensions);
}
protected Control createDialogArea(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
convertAspectsToAJButton = new Button(composite, SWT.RADIO);
convertAspectsToAJButton
.setText(UIMessages.Refactoring_ConvertAspectsToAJAndClassesToJava);
convertAspectsToAJButton.setSelection(true);
convertAllToAJButton = new Button(composite, SWT.RADIO);
convertAllToAJButton.setText(UIMessages.Refactoring_ConvertAllToAJ);
convertAllToJavaButton = new Button(composite, SWT.RADIO);
convertAllToJavaButton.setText(UIMessages.Refactoring_ConvertAllToJava);
new Label(composite, SWT.NONE);
includeFilesNotInBuildButton = new Button(composite, SWT.CHECK);
includeFilesNotInBuildButton.setText(UIMessages.Refactoring_IncludeFilesNotInBuild);
includeFilesNotInBuildButton.setSelection(true);
updateBuildConfigsButton = new Button(composite, SWT.CHECK);
updateBuildConfigsButton.setText(UIMessages.Refactoring_UpdateBuildConfigs);
updateBuildConfigsButton.setSelection(true);
applyDialogFont(composite);
return composite;
}
protected void okPressed() {
boolean updateBuildConfigs = updateBuildConfigsButton.getSelection();
if (convertAllToAJButton.getSelection()) {
convertAllExtensions(true, includeFilesNotInBuildButton
.getSelection(), updateBuildConfigs);
} else if (convertAllToJavaButton.getSelection()) {
convertAllExtensions(false, includeFilesNotInBuildButton
.getSelection(), updateBuildConfigs);
} else if (convertAspectsToAJButton.getSelection()) {
convertAspectsToAJAndOthersToJava(includeFilesNotInBuildButton
.getSelection(), updateBuildConfigs);
}
super.okPressed();
}
/**
* Convert aspects' file extensions to .aj, and classes and interfaces to
* .java. Also converts files containing any inner aspects or pointcuts to
* .aj.
*
* @param includeNotBuiltFiles -
* include files not included in the active build configuration.
* @param monitor -
* progress monitor
* @param updateBuildConfigs -
* update build configurations
*/
private void convertAspectsToAJAndOthersToJava(
final boolean includeNonBuiltFiles, final boolean updateBuildConfigs) {
IRunnableWithProgress runnable = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) {
IJavaProject jp = JavaCore.create(project);
try {
IPackageFragment[] packages = jp.getPackageFragments();
monitor
.beginTask(UIMessages.Refactoring_ConvertingFileExtensions,
packages.length);
// map of old to new names - needed to update build config
// files.
Map oldToNewNames = new HashMap();
for (int i = 0; i < packages.length; i++) {
if (!(packages[i].isReadOnly())) {
try {
ICompilationUnit[] files = packages[i]
.getCompilationUnits();
for (int j = 0; j < files.length; j++) {
IResource resource = files[j].getResource();
if (!includeNonBuiltFiles
&& !(BuildConfig
.isIncluded(resource))) {
// do not rename this file if it is not
// active
continue;
}
boolean isAspect = CodeChecker.containsAspectJConstructs((IFile)resource);
if (!isAspect
&& resource.getFileExtension()
.equals("aj")) { //$NON-NLS-1$
RenamingUtils.renameFile(false, resource, monitor,
oldToNewNames);
} else if (isAspect
&& resource.getFileExtension()
.equals("java")) { //$NON-NLS-1$
RenamingUtils.renameFile(true, resource, monitor,
oldToNewNames);
}
}
} catch (JavaModelException e) {
}
}
monitor.worked(1);
}
if (updateBuildConfigs) {
RenamingUtils.updateBuildConfigurations(oldToNewNames, project,
monitor);
}
} catch (JavaModelException e) {
}
}
};
IRunnableWithProgress op = new WorkspaceModifyDelegatingOperation(
runnable);
try {
new ProgressMonitorDialog(getShell()).run(true, true, op);
} catch (InvocationTargetException e) {
} catch (InterruptedException e) {
}
}
/**
* Convert all the extensions for files in a project
*
* @param convertToAJ -
* if true convert to .aj, otherwise convert to .java
* @param includeNotBuiltFiles -
* include files not included in the active build configuration.
* @param updateBuildConfigs -
* update build configuration files if true.
*/
private void convertAllExtensions(final boolean convertToAJ,
final boolean includeNotBuiltFiles, final boolean updateBuildConfigs) {
IRunnableWithProgress runnable = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) {
IJavaProject jp = JavaCore.create(project);
try {
IPackageFragment[] packages = jp.getPackageFragments();
monitor
.beginTask(UIMessages.Refactoring_ConvertingFileExtensions,
packages.length);
// Map of old to new names - needed to update build config
// files.
Map oldNamesToNewNames = new HashMap();
for (int i = 0; i < packages.length; i++) {
if (!(packages[i].isReadOnly())) {
try {
ICompilationUnit[] files = packages[i]
.getCompilationUnits();
for (int j = 0; j < files.length; j++) {
IResource resource = files[j].getResource();
if (!includeNotBuiltFiles
&& !(BuildConfig.isIncluded(resource))) {
// do not rename this file if it is not
// active
continue;
}
if ((!convertToAJ && resource
.getFileExtension().equals("aj")) //$NON-NLS-1$
|| (convertToAJ && resource
.getFileExtension().equals(
"java"))) { //$NON-NLS-1$
RenamingUtils.renameFile(convertToAJ, resource,
monitor, oldNamesToNewNames);
}
}
} catch (JavaModelException e) {
}
}
monitor.worked(1);
}
if (updateBuildConfigs) {
RenamingUtils.updateBuildConfigurations(oldNamesToNewNames, project,
monitor);
}
} catch (JavaModelException e) {
}
}
};
IRunnableWithProgress op = new WorkspaceModifyDelegatingOperation(
runnable);
try {
new ProgressMonitorDialog(getShell()).run(true, true, op);
} catch (InvocationTargetException e) {
} catch (InterruptedException e) {
}
}
}