com.aptana.editor.common.util.EditorUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.editor.common.util.EditorUtil.java

Source

/**
 * Aptana Studio
 * Copyright (c) 2005-2012 by Appcelerator, Inc. All Rights Reserved.
 * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions).
 * Please see the license.html included with this distribution for details.
 * Any modifications to this file must keep this entire header intact.
 */
package com.aptana.editor.common.util;

import java.io.File;
import java.net.URI;

import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IPathEditorInput;
import org.eclipse.ui.IStorageEditorInput;
import org.eclipse.ui.IURIEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.editors.text.ILocationProvider;
import org.eclipse.ui.editors.text.ILocationProviderExtension;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.internal.editors.text.EditorsPlugin;
import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
import org.eclipse.ui.texteditor.ChainedPreferenceStore;

import com.aptana.core.logging.IdeLog;
import com.aptana.core.util.StringUtil;
import com.aptana.editor.common.AbstractThemeableEditor;
import com.aptana.editor.common.CommonEditorPlugin;
import com.aptana.index.core.Index;
import com.aptana.index.core.IndexManager;
import com.aptana.index.core.IndexPlugin;
import com.aptana.ui.util.UIUtils;

/**
 * A class of utility methods for interacting with editors
 * 
 * @author Ingo Muschenetz
 */
@SuppressWarnings("restriction")
public class EditorUtil {

    protected static final int DEFAULT_SPACE_INDENT_SIZE = 2;

    /**
     * Retrieves the indentation settings for the current editor, or falls back on default settings if the current
     * editor is not available.
     */
    public static int getSpaceIndentSize() {
        IEditorPart activeEditor = UIUtils.getActiveEditor();
        if (activeEditor != null) {
            return getSpaceIndentSize(activeEditor.getSite().getId());
        }
        return getSpaceIndentSize(null);
    }

    /**
     * Retrieves the indentation settings from the given preferences qualifier, or falls back on default settings if the
     * given qualifier is null, or the value of the indent-size is smaller than 1.
     */
    public static int getSpaceIndentSize(String preferencesQualifier) {
        int spaceIndentSize = 0;
        if (preferencesQualifier != null) {
            spaceIndentSize = Platform.getPreferencesService().getInt(preferencesQualifier,
                    AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH, 0, null);
        }
        // Fall back on CommonEditorPlugin or EditorsPlugin values if none are set for current editor
        return (spaceIndentSize > 0) ? spaceIndentSize : getDefaultSpaceIndentSize(preferencesQualifier);
    }

    public static int getDefaultSpaceIndentSize(String preferencesQualifier) {
        int spaceIndentSize = 0;
        if (CommonEditorPlugin.getDefault() != null && EditorsPlugin.getDefault() != null) {
            spaceIndentSize = new ChainedPreferenceStore(
                    new IPreferenceStore[] { CommonEditorPlugin.getDefault().getPreferenceStore(),
                            EditorsPlugin.getDefault().getPreferenceStore() })
                                    .getInt(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH);
        }
        return (spaceIndentSize > 0) ? spaceIndentSize : DEFAULT_SPACE_INDENT_SIZE;
    }

    /**
     * Converts current indent string to a specific number of spaces or tabs
     * 
     * @param indent
     * @param indentSize
     * @param useTabs
     * @return
     */
    public static String convertIndent(String indent, int indentSize, boolean useTabs) {
        if (indent == null) {
            return StringUtil.EMPTY;
        }

        if (useTabs && indent.contains(" ")) //$NON-NLS-1$
        {
            int i;
            String newIndent = ""; //$NON-NLS-1$
            int spacesCount = indent.replaceAll("\t", "").length(); //$NON-NLS-1$ //$NON-NLS-2$
            // Add tabs based on previous number of tabs, and total number of spaces (if they can be converted to the
            // tab equivalent)
            for (i = 0; i < (indent.length() - spacesCount) + (spacesCount / indentSize); i++) {
                newIndent += '\t';
            }
            // Add back remaining spaces
            for (i = 0; i < spacesCount % indentSize; i++) {
                newIndent += ' ';
            }
            return newIndent;
        }
        if (!useTabs && indent.contains("\t")) //$NON-NLS-1$
        {
            String newIndent = ""; //$NON-NLS-1$
            int tabCount = indent.replaceAll(" ", "").length(); //$NON-NLS-1$ //$NON-NLS-2$
            for (int i = 0; i < (indent.length() - tabCount) + (tabCount * indentSize); i++) {
                newIndent += " "; //$NON-NLS-1$
            }
            return newIndent;
        }
        return indent;
    }

    /**
     * Returns the editor descriptor for the given URI. The editor descriptor is computed by the last segment of the URI
     * (the file name).
     * 
     * @param uri
     *            A file URI
     * @return the descriptor of the default editor, or null if not found
     */
    public static IEditorDescriptor getEditorDescriptor(URI uri) {
        // NOTE: Moved from PHP's EditorUtils
        String uriPath = uri.getPath();
        if (StringUtil.isEmpty(uriPath) || uriPath.equals("/")) //$NON-NLS-1$
        {
            return null;
        }
        IPath path = new Path(uriPath);
        return PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor(path.lastSegment());
    }

    /**
     * Gets the indexing associated with the editor.
     * 
     * @param editor
     * @return
     */
    public static Index getIndex(AbstractThemeableEditor editor) {
        // NOTE: Moved from CommonContentAssistProcessor
        if (editor != null) {
            IEditorInput editorInput = editor.getEditorInput();

            if (editorInput instanceof IFileEditorInput) {
                IFileEditorInput fileEditorInput = (IFileEditorInput) editorInput;
                IFile file = fileEditorInput.getFile();

                return getIndexManager().getIndex(file.getProject().getLocationURI());
            }
            if (editorInput instanceof IURIEditorInput) {
                IURIEditorInput uriEditorInput = (IURIEditorInput) editorInput;

                // FIXME This file may be a child, we need to check to see if there's an index with a parent URI.
                return getIndexManager().getIndex(uriEditorInput.getURI());
            }
            if (editorInput instanceof IPathEditorInput) {
                IPathEditorInput pathEditorInput = (IPathEditorInput) editorInput;

                // FIXME This file may be a child, we need to check to see if there's an index with a parent URI.
                return getIndexManager().getIndex(URIUtil.toURI(pathEditorInput.getPath()));
            }
        }

        return null;
    }

    protected static IndexManager getIndexManager() {
        return IndexPlugin.getDefault().getIndexManager();
    }

    /**
     * Gets the URI associated with the editor.
     * 
     * @param editor
     * @return
     */
    public static URI getURI(IEditorPart editor) {
        // NOTE: Moved from CommonContentAssistProcessor
        if (editor != null) {
            IEditorInput editorInput = editor.getEditorInput();

            if (editorInput instanceof IURIEditorInput) {
                IURIEditorInput uriEditorInput = (IURIEditorInput) editorInput;
                return uriEditorInput.getURI();
            }
            if (editorInput instanceof IPathEditorInput) {
                IPathEditorInput pathEditorInput = (IPathEditorInput) editorInput;
                return URIUtil.toURI(pathEditorInput.getPath());
            }
            if (editorInput instanceof IFileEditorInput) {
                IFileEditorInput fileEditorInput = (IFileEditorInput) editorInput;
                return fileEditorInput.getFile().getLocationURI();
            }
            try {
                if (editorInput instanceof IStorageEditorInput) {
                    IStorageEditorInput storageEditorInput = (IStorageEditorInput) editorInput;
                    IStorage storage = storageEditorInput.getStorage();
                    if (storage != null) {
                        IPath path = storage.getFullPath();
                        if (path != null) {
                            return URIUtil.toURI(path);
                        }
                    }
                }
            } catch (CoreException e) {
                IdeLog.logError(CommonEditorPlugin.getDefault(), e);
            }
            if (editorInput instanceof ILocationProviderExtension) {
                ILocationProviderExtension lpe = (ILocationProviderExtension) editorInput;
                return lpe.getURI(null);
            }
            if (editorInput instanceof ILocationProvider) {
                ILocationProvider lp = (ILocationProvider) editorInput;
                return URIUtil.toURI(lp.getPath(null));
            }
        }

        return null;
    }

    public static String getFileName(IEditorPart editor) {
        URI uri = getURI(editor);
        return com.aptana.core.util.URIUtil.getFileName(uri);
    }

    /**
     * Open a file in an editor and return the opened editor part.<br>
     * This method will try to open the file in an internal editor, unless there is no editor descriptor assigned to
     * that file type.
     * 
     * @param file
     * @return The {@link IEditorPart} that was created when the file was opened; Return null in case of an error
     */
    public static IEditorPart openInEditor(File file) {
        // NOTE: Moved from PHP's EditorUtils
        if (file == null) {
            IdeLog.logError(CommonEditorPlugin.getDefault(), "Error open a file in the editor", //$NON-NLS-1$
                    new IllegalArgumentException("file is null")); //$NON-NLS-1$
            return null;
        }
        try {
            URI uri = file.toURI();
            IEditorDescriptor desc = getEditorDescriptor(uri);
            String editorId = (desc == null) ? IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID : desc.getId();
            IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();

            return IDE.openEditor(page, uri, editorId, true);
        } catch (Exception e) {
            IdeLog.logError(CommonEditorPlugin.getDefault(), "Error open a file in the editor", e); //$NON-NLS-1$
        }
        return null;
    }

    /**
     * Returns the project that the file for the editor belongs.
     * 
     * @param editor
     *            a file editor
     * @return the project the editor belongs
     */
    public static IProject getProject(AbstractThemeableEditor editor) {
        if (editor != null) {
            IEditorInput editorInput = editor.getEditorInput();

            if (editorInput instanceof IFileEditorInput) {
                IFileEditorInput fileEditorInput = (IFileEditorInput) editorInput;
                return fileEditorInput.getFile().getProject();
            }
        }

        return null;
    }

    /**
     * Gets the project URI associated with the editor.
     * 
     * @return the project URI
     */
    public static URI getProjectURI(AbstractThemeableEditor editor) {
        IProject project = getProject(editor);
        return (project == null) ? null : project.getLocationURI();
    }

    /**
     * Finds the editor for the specified file in the specified project and prompts a save if the editor is dirty
     * 
     * @param project
     * @param fileName
     * @param promptQuestion
     * @return
     */
    public static boolean verifySaveEditor(final IProject project, final String fileName,
            final String promptQuestion) {
        final boolean[] result = new boolean[] { true };
        UIUtils.getDisplay().syncExec(new Runnable() {
            public void run() {
                IEditorPart[] dirtyEditors = UIUtils.getDirtyEditors();
                if (dirtyEditors != null && dirtyEditors.length > 0) {
                    IFile tiappFile = project.getFile(fileName);
                    // Try to locate the tiapp resource
                    for (IEditorPart editor : dirtyEditors) {
                        IFile file = (IFile) (editor.getEditorInput().getAdapter(IFile.class));
                        if (file != null && file.equals(tiappFile)) {
                            // prompt for save
                            if (MessageDialog.openQuestion(UIUtils.getActiveShell(),
                                    Messages.EditorUtil_VerfiySavePromptTitle_lbl, promptQuestion)) {
                                editor.doSave(new NullProgressMonitor());
                            } else {
                                result[0] = false;
                            }
                            break;
                        }
                    }
                }
            }
        });

        return result[0];
    }
}