org.eclipse.ajdt.internal.ui.refactoring.RenameFileExtensionsDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ajdt.internal.ui.refactoring.RenameFileExtensionsDialog.java

Source

/*******************************************************************************
 * 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) {
        }

    }

}