org.oobium.build.console.Eclipse.java Source code

Java tutorial

Introduction

Here is the source code for org.oobium.build.console.Eclipse.java

Source

/*******************************************************************************
 * Copyright (c) 2010 Oobium, Inc.
 * 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:
 *     Jeremy Dowdall <jeremy@oobium.com> - initial API and implementation
 ******************************************************************************/
package org.oobium.build.console;

import java.awt.Desktop;
import java.io.File;
import java.io.IOException;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.IClassFile;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.core.search.SearchMatch;
import org.eclipse.jdt.core.search.SearchParticipant;
import org.eclipse.jdt.core.search.SearchPattern;
import org.eclipse.jdt.core.search.SearchRequestor;
import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.swt.program.Program;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.texteditor.AbstractDecoratedTextEditor;
import org.eclipse.ui.texteditor.ITextEditor;
import org.oobium.logging.LogProvider;
import org.oobium.logging.Logger;
import org.oobium.utils.FileUtils;

public class Eclipse {

    private static final Logger logger = LogProvider.getLogger(BuilderConsoleActivator.class);

    private Eclipse() {
        // static methods only
    }

    public static void open(final File file) {
        if (!Program.launch(file.getAbsolutePath())) {
            // fall back on the Desktop API - it may not be present though...
            Display.getDefault().syncExec(new Runnable() {
                @Override
                public void run() {
                    try {
                        Desktop.getDesktop().open(file);
                    } catch (IOException e) {
                        // discard...
                    }
                }
            });
        }
    }

    public static void removeProject(String name) {
        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
        IProject project = root.getProject(name);
        try {
            IProgressMonitor monitor = new NullProgressMonitor();
            project.delete(true, monitor);
        } catch (CoreException e) {
            e.printStackTrace();
        }
    }

    public static void importProject(File project) {
        importProject(project.getName(), project);
    }

    public static void importProject(String name, File location) {
        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
        IProject project = root.getProject(name);
        IProgressMonitor monitor = new NullProgressMonitor();
        if (project.exists()) {
            try {
                project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
            } catch (CoreException e) {
                logger.warn(e);
            }
        } else {
            try {
                IProjectDescription description = root.getWorkspace().newProjectDescription(name);
                description.setLocationURI(location.toURI());
                project.create(description, monitor);
                project.open(monitor);
            } catch (CoreException e1) {
                try {
                    project.create(monitor);
                    project.open(monitor);
                } catch (CoreException e2) {
                    logger.warn(e2);
                }
            }
        }
    }

    public static void importProjects(File... projects) {
        for (File project : projects) {
            importProject(project.getName(), project);
        }
    }

    public static void openFile(File project, File file) {
        openFile(project, file, -1);
    }

    public static void openFile(File project, File file, int line) {
        String projectName = project.getName();
        String fileName = file.getAbsolutePath().substring(project.getAbsolutePath().length());
        openFile(projectName, fileName, line);
    }

    public static void openFile(String projectName, String fileName) {
        openFile(projectName, fileName, -1);
    }

    public static void openFile(String projectName, String fileName, final int line) {
        try {
            IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
            if (!project.isOpen()) {
                project.open(new NullProgressMonitor());
            }
            final IFile file = project.getFile(fileName);
            file.refreshLocal(IResource.DEPTH_ONE, new NullProgressMonitor());
            if (file.exists()) {
                Display.getDefault().syncExec(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            IWorkbenchWindow window = PlatformUI.getWorkbench().getWorkbenchWindows()[0];
                            IEditorPart editor = IDE.openEditor(window.getActivePage(), file, true);
                            if (editor != null) {
                                if (line > 0 && editor instanceof AbstractDecoratedTextEditor) {
                                    AbstractDecoratedTextEditor ed = (AbstractDecoratedTextEditor) editor;
                                    IDocument doc = ed.getDocumentProvider().getDocument(ed.getEditorInput());
                                    try {
                                        int offset = doc.getLineOffset(line - 1);
                                        ed.selectAndReveal(offset, 0);
                                    } catch (BadLocationException e) {
                                        e.printStackTrace();
                                    }
                                }
                                editor.setFocus();
                                // TODO Shell#forceActive() does not currently work... check SWT bugs
                                window.getShell().forceActive();
                            }
                        } catch (PartInitException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        } catch (CoreException e) {
            logger.warn(e.getMessage());
        }
    }

    public static void openResource(String name, final int line) {
        for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
            File folder = project.getLocation().toFile();
            File file = FileUtils.find(folder, name);
            if (file != null) {
                String relativeName = file.getAbsolutePath().substring(folder.getAbsolutePath().length());
                IFile ifile = project.getFile(relativeName);
                open(ifile, null, line);
                return;
            }
        }
    }

    public static void openType(String type, final int line) {
        if (type.contains("$")) {
            // handles inner classes
            type = type.substring(0, type.indexOf('$'));
        }

        SearchPattern pattern = SearchPattern.createPattern(type, IJavaSearchConstants.TYPE,
                IJavaSearchConstants.DECLARATIONS, SearchPattern.R_EXACT_MATCH);
        IJavaSearchScope scope = SearchEngine.createWorkspaceScope();

        SearchRequestor sr = new SearchRequestor() {
            @Override
            public void acceptSearchMatch(SearchMatch match) throws CoreException {
                IResource resource = match.getResource();
                if (resource instanceof IFile) {
                    final IFile file = (IFile) match.getResource();
                    logger.debug(String.valueOf(match));
                    Display.getDefault().asyncExec(new Runnable() {
                        @Override
                        public void run() {
                            open(file, null, line);
                        }
                    });
                } else {
                    Object element = match.getElement();
                    if (element instanceof IType) {
                        final IType itype = (IType) element;
                        Display.getDefault().asyncExec(new Runnable() {
                            @Override
                            public void run() {
                                Object parent = itype.getParent();
                                if (parent instanceof IFile) {
                                    open(parent, null, line);
                                }
                                if (parent instanceof IClassFile) {
                                    // TODO is there a better way to do this?
                                    IEditorInput input = EditorUtility.getEditorInput(itype.getParent());
                                    open(input, "org.eclipse.jdt.ui.ClassFileEditor", line);
                                }
                            }
                        });
                    }
                }
            }
        };

        SearchEngine engine = new SearchEngine();
        try {
            engine.search(pattern, new SearchParticipant[] { SearchEngine.getDefaultSearchParticipant() }, scope,
                    sr, null);
        } catch (CoreException e) {
            e.printStackTrace();
        }
    }

    private static void open(Object input, String editorId, int line) {
        try {
            IWorkbenchWindow window = PlatformUI.getWorkbench().getWorkbenchWindows()[0];
            IEditorPart editor;
            if (input instanceof IFile) {
                editor = IDE.openEditor(window.getActivePage(), (IFile) input, true);
            } else if (input instanceof IEditorInput) {
                editor = IDE.openEditor(window.getActivePage(), (IEditorInput) input, editorId, true);
            } else {
                throw new IllegalArgumentException("can't open editor on " + input);
            }
            if (editor instanceof ITextEditor) {
                ITextEditor ed = (ITextEditor) editor;
                IDocument doc = ed.getDocumentProvider().getDocument(ed.getEditorInput());
                try {
                    int offset = doc.getLineOffset(line - 1);
                    ed.selectAndReveal(offset, 0);
                } catch (BadLocationException e) {
                    System.err.println("line " + line + " not found in " + input);
                }
            }
            editor.setFocus();
            // TODO Shell#forceActive() does not currently work... check SWT bugs
            window.getShell().forceActive();
        } catch (PartInitException e) {
            e.printStackTrace();
        }
    }

    public static void refreshProject(String name) {
        try {
            IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
            if (!project.isOpen()) {
                project.open(new NullProgressMonitor());
            }
            project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
        } catch (CoreException e) {
            logger.warn(e.getLocalizedMessage());
        }
    }

    public static void refresh(File project, File file) {
        String projectName = project.getName();
        String fileName = file.getAbsolutePath().substring(project.getAbsolutePath().length());
        refresh(projectName, fileName);
    }

    /**
     * Refresh the file or directory specified by fileName in the project
     * specified by projectName
     */
    public static void refresh(String projectName, String fileName) {
        try {
            IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
            if (!project.isOpen()) {
                project.open(new NullProgressMonitor());
            }

            IFile file = project.getFile(fileName);
            if (file.exists()) {
                file.refreshLocal(IResource.DEPTH_ONE, new NullProgressMonitor());
            } else {
                IFolder folder = project.getFolder(fileName);
                if (folder.exists()) {
                    folder.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
                } else {
                    logger.warn("the file \"" + fileName + "\" does not exist in project \"" + projectName);
                }
            }
        } catch (CoreException e) {
            logger.warn(e.getLocalizedMessage());
        }
    }

}