org.eclipse.edt.ide.ui.internal.CodeFormatterUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.edt.ide.ui.internal.CodeFormatterUtil.java

Source

/*******************************************************************************
 * Copyright  2008, 2013 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.edt.ide.ui.internal;

import java.util.Map;

import org.eclipse.edt.compiler.core.ast.ISyntaxErrorRequestor;
import org.eclipse.edt.ide.ui.editor.CodeFormatter;
import org.eclipse.edt.ide.ui.internal.formatting.EGLCodeFormatter;
import org.eclipse.edt.ide.ui.internal.formatting.ui.ProfileManager;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.TextUtilities;
import org.eclipse.text.edits.TextEdit;

public class CodeFormatterUtil {

    /**
     * Gets the current tab width.
     * 
     * @param project The project where the source is used, used for project
     *        specific options or <code>null</code> if the project is unknown
     *        and the workspace default should be used
     * @return The tab width
     */
    public static int getTabWidth(IJavaProject project) {
        /*
         * If the tab-char is SPACE, FORMATTER_INDENTATION_SIZE is not used
         * by the core formatter.
         * We piggy back the visual tab length setting in that preference in
         * that case.
         */
        String key;
        if (JavaCore.SPACE.equals(getCoreOption(project, DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR)))
            key = DefaultCodeFormatterConstants.FORMATTER_INDENTATION_SIZE;
        else
            key = DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE;

        return getCoreOption(project, key, 4);
    }

    /**
     * Returns the current indent width.
     * 
     * @param project the project where the source is used or <code>null</code>
     *        if the project is unknown and the workspace default should be used
     * @return the indent width
     * @since 3.1
     */
    public static int getIndentWidth(IJavaProject project) {
        String key;
        if (DefaultCodeFormatterConstants.MIXED
                .equals(getCoreOption(project, DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR)))
            key = DefaultCodeFormatterConstants.FORMATTER_INDENTATION_SIZE;
        else
            key = DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE;

        return getCoreOption(project, key, 4);
    }

    /**
     * Returns the possibly <code>project</code>-specific core preference
     * defined under <code>key</code>.
     * 
     * @param project the project to get the preference from, or
     *        <code>null</code> to get the global preference
     * @param key the key of the preference
     * @return the value of the preference
     * @since 3.1
     */
    private static String getCoreOption(IJavaProject project, String key) {
        if (project == null)
            return JavaCore.getOption(key);
        return project.getOption(key, true);
    }

    /**
     * Returns the possibly <code>project</code>-specific core preference
     * defined under <code>key</code>, or <code>def</code> if the value is
     * not a integer.
     * 
     * @param project the project to get the preference from, or
     *        <code>null</code> to get the global preference
     * @param key the key of the preference
     * @param def the default value
     * @return the value of the preference
     * @since 3.1
     */
    private static int getCoreOption(IJavaProject project, String key, int def) {
        try {
            return Integer.parseInt(getCoreOption(project, key));
        } catch (NumberFormatException e) {
            return def;
        }
    }

    /**
     * get the option map given a profile name, 
     * if the profile is null or empty, use the current selected profile option map in the preferece
     * else change the current selected profile to the given profile name, 
     *       so user should save returned original selected profile before calling this method 
     *        then reset it back after it's done by calling profileMgr.setSelectedProfile(originalSelProfile);
     * 
     * @param formatProfileName
     * @param profileMgr
     * @return
     */
    public static Map getFormattingOptionMapByProfileName(String formatProfileName, ProfileManager profileMgr) {
        if (formatProfileName != null && formatProfileName.length() > 0) {
            //select the passed in profile as the current profile
            EObject profile = profileMgr.getProfileByName(formatProfileName, true);
            profileMgr.setSelectedProfile(profile);
        }

        return profileMgr.getCurrentPreferenceSettingMap();
    }

    private static TextEdit format(IDocument document, int offset, int length, int indentationLevel,
            String lineSeprator, Map options, ISyntaxErrorRequestor syntaxErrRequestor) {
        CodeFormatter eglCodeFormatter = new EGLCodeFormatter(options);
        return eglCodeFormatter.format(document, offset, length, indentationLevel, lineSeprator,
                syntaxErrRequestor);
    }

    public static TextEdit format(IDocument document, int offset, int length, Map options,
            ISyntaxErrorRequestor syntaxErrRequestor) {
        int indentationLevel = 0;
        String lineSeprator = TextUtilities.getDefaultLineDelimiter(document);

        return format(document, offset, length, indentationLevel, lineSeprator, options, syntaxErrRequestor);
    }

}