org.jboss.tools.project.examples.cheatsheet.internal.util.CheatSheetUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.project.examples.cheatsheet.internal.util.CheatSheetUtil.java

Source

/*************************************************************************************
 * Copyright (c) 2013-2014 Red Hat, Inc. 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:
 *     JBoss by Red Hat - Initial implementation.
 ************************************************************************************/
package org.jboss.tools.project.examples.cheatsheet.internal.util;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.content.IContentDescription;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.jdt.junit.launcher.JUnitLaunchShortcut;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnLayoutData;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TableViewerEditor;
import org.eclipse.jface.viewers.TableViewerFocusCellManager;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.internal.ua.ui.editor.cheatsheet.comp.CompCSEditor;
import org.eclipse.pde.internal.ua.ui.editor.cheatsheet.simple.SimpleCSEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.internal.cheatsheets.state.DefaultStateManager;
import org.eclipse.ui.internal.cheatsheets.views.CheatSheetView;
import org.eclipse.ui.internal.cheatsheets.views.ViewUtilities;
import org.eclipse.ui.part.MultiPageEditorPart;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.wst.server.core.IModule;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.core.IServerWorkingCopy;
import org.eclipse.wst.server.ui.actions.RunOnServerAction;
import org.jboss.ide.eclipse.as.core.modules.SingleDeployableFactory;
import org.jboss.ide.eclipse.as.core.util.ServerConverter;
import org.jboss.tools.common.model.ui.editor.EditorPartWrapper;
import org.jboss.tools.project.examples.cheatsheet.Activator;
import org.jboss.tools.project.examples.cheatsheet.Messages;
import org.jboss.tools.project.examples.internal.ProjectExamplesActivator;
import org.jboss.tools.project.examples.model.ProjectExampleUtil;
import org.osgi.service.prefs.BackingStoreException;

/**
 * 
 * @author snjeza
 *
 */
public class CheatSheetUtil {

    private static final String ACTIVE_PROFILES = "activeProfiles"; //$NON-NLS-1$

    public static IProject getProject() {
        CheatSheetView view = ViewUtilities.showCheatSheetView();
        if (view != null && view.getContent() != null) {
            String href = view.getContent().getHref();
            if (href != null) {
                try {
                    URL url = new URL(href);
                    File file = null;
                    if (ProjectExampleUtil.PROTOCOL_FILE.equals(url.getProtocol())) {
                        try {
                            file = new File(new URI(url.toExternalForm()));
                        } catch (Exception e) {
                            file = new File(url.getFile());
                        }
                    }
                    return getProject(file);
                } catch (MalformedURLException e) {
                    Activator.log(e);
                }
            }
        }
        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
        if (page != null) {
            IEditorPart activeEditor = page.getActiveEditor();
            if (activeEditor instanceof SimpleCSEditor || activeEditor instanceof CompCSEditor) {
                IEditorInput input = activeEditor.getEditorInput();
                if (input instanceof IFileEditorInput) {
                    IFile file = ((IFileEditorInput) input).getFile();
                    if (file != null && file.exists()) {
                        return file.getProject();
                    }
                }
            }
        }
        return null;
    }

    public static IProject getProject(File file) {
        if (file != null && file.exists()) {
            IWorkspace workspace = ResourcesPlugin.getWorkspace();
            IPath location = Path.fromOSString(file.getAbsolutePath());
            if (location != null) {
                IFile iFile = workspace.getRoot().getFileForLocation(location);
                if (iFile != null) {
                    return iFile.getProject();
                }
            }
        }
        return null;
    }

    public static ITextEditor getTextEditor(IEditorPart editor) {
        if (editor instanceof ITextEditor) {
            return (ITextEditor) editor;
        }
        if (editor instanceof MultiPageEditorPart) {
            MultiPageEditorPart multiPageEditor = (MultiPageEditorPart) editor;
            IEditorPart[] editors = multiPageEditor.findEditors(editor.getEditorInput());
            for (int i = 0; i < editors.length; i++) {
                if (editors[i] instanceof ITextEditor) {
                    ITextEditor textEditor = (ITextEditor) editors[i];
                    if (textEditor.getDocumentProvider() != null) {
                        return (ITextEditor) editors[i];
                    }
                }
            }
        }
        if (editor instanceof EditorPartWrapper) {
            EditorPartWrapper wrapper = (EditorPartWrapper) editor;
            IEditorPart nestedEditor = wrapper.getEditor();
            return getTextEditor(nestedEditor);
        }
        return null;
    }

    private static void setStatusMessage(IWorkbenchPage page, String message) {
        IWorkbenchPart activePart = page.getActivePart();
        IWorkbenchPartSite site = activePart.getSite();
        IActionBars actionBar = null;
        if (site instanceof IViewSite) {
            IViewSite viewSite = (IViewSite) site;
            actionBar = viewSite.getActionBars();
        } else if (site instanceof IEditorSite) {
            IEditorSite editorSite = (IEditorSite) site;
            actionBar = editorSite.getActionBars();
        }
        if (actionBar == null) {
            return;
        }
        IStatusLineManager lineManager = actionBar.getStatusLineManager();
        if (lineManager == null) {
            return;
        }
        lineManager.setMessage(message);
    }

    public static void openFile(String pathName, String fromLine, String toLine, String editorID) {
        String fileName = pathName;
        IPath path = new Path(fileName);
        IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
        IFile file = workspaceRoot.getFile(path);
        if (!file.exists()) {
            setStatusMessage(page, NLS.bind(Messages.OpenFileInEditor_Cannot_open, path));
            return;
        }
        IEditorPart editor = null;
        try {
            if (editorID != null && editorID.trim().length() > 0) {
                try {
                    editor = IDE.openEditor(page, file, editorID, true);
                } catch (Exception e) {
                }
            }
            if (editor == null) {
                editor = IDE.openEditor(page, file, true);
            }
        } catch (PartInitException e) {
            setStatusMessage(page, NLS.bind(Messages.OpenFileInEditor_Cannot_open, path));
            return;
        }
        ITextEditor textEditor = CheatSheetUtil.getTextEditor(editor);
        if (fromLine != null && textEditor != null) {
            try {
                int lineStart = Integer.parseInt(fromLine);
                int lineEnd = lineStart;
                if (toLine != null) {
                    lineEnd = Integer.parseInt(toLine);
                }
                IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
                IRegion lineInfoStart = document.getLineInformation(lineStart - 1);
                IRegion lineInfoEnd = document.getLineInformation(lineEnd - 1);
                textEditor.selectAndReveal(lineInfoStart.getOffset(),
                        lineInfoEnd.getOffset() - lineInfoStart.getOffset() + lineInfoEnd.getLength());
            } catch (Exception e) {
                setStatusMessage(page, e.getLocalizedMessage());
            }
        }
    }

    public static void runOnServer(String name, String path) {
        IWorkspaceRoot wRoot = ResourcesPlugin.getWorkspace().getRoot();
        String projectName = name;
        IProject project = wRoot.getProject(projectName);
        if (project == null || !project.isOpen()) {
            return;
        }
        if (path != null) {
            IFile file = wRoot.getFile(new Path(path));
            if (file != null && file.exists()) {
                try {
                    SingleDeployableFactory.makeDeployable(file.getFullPath());
                    IServer[] deployableServersAsIServers = ServerConverter.getDeployableServersAsIServers();
                    if (deployableServersAsIServers.length == 1) {
                        IServer server = deployableServersAsIServers[0];
                        IServerWorkingCopy copy = server.createWorkingCopy();
                        IModule[] modules = new IModule[1];
                        modules[0] = SingleDeployableFactory.findModule(file.getFullPath());
                        copy.modifyModules(modules, new IModule[0], new NullProgressMonitor());
                        IServer saved = copy.save(false, new NullProgressMonitor());
                        saved.publish(IServer.PUBLISH_INCREMENTAL, new NullProgressMonitor());
                    }
                } catch (CoreException e) {
                    IStatus status = new Status(IStatus.INFO, Activator.PLUGIN_ID, e.getMessage(), e);
                    Activator.getDefault().getLog().log(status);
                }
            }
        }
        IAction action = new RunOnServerAction(project);
        action.run();
    }

    /**
     * Launch a JUnit test and selects a Maven profile optionally
     * 
     * @param projectName - project name
     * @param profile - Maven profile
     * @param mode - mode
     * @deprecated This method will be split in the future to separate profile manipulation and junit execution
     */
    @Deprecated
    public static void launchJUnitTest(String projectName, String profile, String mode) {
        IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();

        IProject project = workspaceRoot.getProject(projectName);
        if (project == null || !project.isOpen()) {
            IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
            setStatusMessage(page, NLS.bind(Messages.LaunchJunitTest_The_project_does_not_exist, projectName));
            return;
        }
        if (profile != null) {
            IScopeContext projectScope = new ProjectScope(project);
            IEclipsePreferences projectNode = projectScope.getNode("org.eclipse.m2e.core"); //$NON-NLS-1$
            if (projectNode != null) {
                String activeProfiles = projectNode.get(ACTIVE_PROFILES, null);
                if (!profile.equals(activeProfiles)) {
                    projectNode.put(ACTIVE_PROFILES, profile);
                    try {
                        projectNode.flush();
                    } catch (BackingStoreException e) {
                        Activator.log(e);
                    }
                }
            }
        }
        ISelection selection = new StructuredSelection(project);
        JUnitLaunchShortcut launchShortcut = new JUnitLaunchShortcut();
        if (mode == null) {
            mode = ILaunchManager.RUN_MODE;
        }
        if (!ILaunchManager.RUN_MODE.equals(mode) && !ILaunchManager.DEBUG_MODE.equals(mode)) {
            mode = ILaunchManager.RUN_MODE;
        }
        launchShortcut.launch(selection, mode);
    }

    public static boolean showCheatsheet(IFile file) {
        try {
            IContentDescription contentDescription = file.getContentDescription();
            IContentType contentType = contentDescription.getContentType();
            if (contentType != null && "org.eclipse.pde.simpleCheatSheet".equals(contentType.getId())) { //$NON-NLS-1$
                CheatSheetView view = ViewUtilities.showCheatSheetView();
                if (view == null) {
                    return false;
                }
                IPath filePath = file.getFullPath();
                String id = filePath.lastSegment();
                if (id == null) {
                    id = ""; //$NON-NLS-1$
                }
                URL url = file.getLocation().toFile().toURI().toURL();
                view.getCheatSheetViewer().setInput(id, id, url, new DefaultStateManager(), false);
                return true;
            }
        } catch (Exception e) {
            Activator.log(e);
        }
        return false;
    }

    public static void showCheatsheet(final List<IFile> cheatsheets) {
        if (cheatsheets == null || cheatsheets.size() == 0) {
            return;
        }
        String value = ProjectExamplesActivator.getDefault().getShowCheatsheets();
        if (ProjectExamplesActivator.SHOW_CHEATSHEETS_NEVER.equals(value)) {
            return;
        }
        final IFile[] file = new IFile[1];
        file[0] = cheatsheets.get(0);
        if (ProjectExamplesActivator.SHOW_CHEATSHEETS_PROMPT.equals(value) || cheatsheets.size() > 0) {
            Display.getDefault().syncExec(new Runnable() {

                public void run() {
                    file[0] = promptToShowCheatsheets(cheatsheets);
                }

            });
        }
        if (file[0] != null) {
            Display.getDefault().asyncExec(new Runnable() {

                public void run() {
                    showCheatsheet(file[0]);
                }
            });

        }
    }

    private static IFile promptToShowCheatsheets(List<IFile> cheatsheets) {
        IPreferenceStore store = ProjectExamplesActivator.getDefault().getPreferenceStore();
        String key = ProjectExamplesActivator.SHOW_CHEATSHEETS;
        String value = store.getString(key);
        if (MessageDialogWithToggle.ALWAYS.equals(value) && cheatsheets.size() == 1) {
            return cheatsheets.get(0);
        }
        if (MessageDialogWithToggle.NEVER.equals(value)) {
            return null;
        }
        Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
        if (cheatsheets.size() == 1) {
            String projectName = cheatsheets.get(0).getProject().getName();
            String title = "Found cheatsheet";
            String message = "Do you wish to open the cheatsheet for the '" + projectName + "' project?";
            MessageDialogWithToggle dialog = MessageDialogWithToggle.openYesNoQuestion(shell, title, message, null,
                    false, store, key);
            int result = dialog.getReturnCode();
            if (result == Window.CANCEL || result == SWT.DEFAULT) {
                throw new OperationCanceledException();
            }
            if (dialog.getReturnCode() == IDialogConstants.YES_ID) {
                return cheatsheets.get(0);
            }
        } else {
            int kind = MessageDialog.QUESTION;
            String[] buttonLabels = new String[] { IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL };
            String title = "Found cheatsheets";
            String message = "Please select the cheatsheet you want to show:";
            MyMessageDialogWithToggle dialog = new MyMessageDialogWithToggle(shell, title, null, message, kind,
                    buttonLabels, 0, null, false, cheatsheets);
            dialog.setPrefStore(store);
            dialog.setPrefKey(key);
            dialog.open();
            int result = dialog.getReturnCode();
            if (result == Window.CANCEL || result == SWT.DEFAULT) {
                throw new OperationCanceledException();
            }
            if (dialog.getReturnCode() == IDialogConstants.OK_ID) {
                return dialog.getCheatsheet();
            }
        }
        return null;
    }

    private static class MyMessageDialogWithToggle extends MessageDialogWithToggle {

        private List<IFile> cheatsheets;
        private IFile selectedCheatsheet;

        public MyMessageDialogWithToggle(Shell parentShell, String dialogTitle, Image image, String message,
                int dialogImageType, String[] dialogButtonLabels, int defaultIndex, String toggleMessage,
                boolean toggleState, List<IFile> cheatsheets) {
            super(parentShell, dialogTitle, image, message, 0 /*dialogImageType*/, dialogButtonLabels, defaultIndex,
                    toggleMessage, toggleState);
            setShellStyle(getShellStyle() | SWT.SHEET);
            this.cheatsheets = cheatsheets;
            selectedCheatsheet = cheatsheets.get(0);
        }

        public IFile getCheatsheet() {
            return selectedCheatsheet;
        }

        @Override
        protected Control createCustomArea(Composite parent) {
            Composite composite = new Composite(parent, SWT.NONE);
            GridLayout layout = new GridLayout();
            layout.marginHeight = 0;
            layout.marginWidth = 0;
            composite.setLayout(layout);
            GridData data = new GridData(GridData.FILL_BOTH);
            data.horizontalSpan = 2;
            composite.setLayoutData(data);
            TableViewer viewer = createCheatsheetViewer(composite, cheatsheets);
            viewer.addSelectionChangedListener(new ISelectionChangedListener() {

                public void selectionChanged(SelectionChangedEvent event) {
                    getButton(IDialogConstants.OK_ID).setEnabled(false);
                    ISelection sel = event.getSelection();
                    if (sel instanceof IStructuredSelection) {
                        Object object = ((IStructuredSelection) sel).getFirstElement();
                        if (object instanceof IFile) {
                            selectedCheatsheet = (IFile) object;
                            getButton(IDialogConstants.OK_ID).setEnabled(true);
                        }
                    }
                }
            });

            return composite;
        }

        @Override
        protected void createButtonsForButtonBar(Composite parent) {
            super.createButtonsForButtonBar(parent);
            getButton(IDialogConstants.OK_ID).setEnabled(false);
        }

    }

    private static TableViewer createCheatsheetViewer(Composite parent, final List<IFile> cheatsheets) {
        final TableViewer viewer = new TableViewer(parent,
                SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.heightHint = 100;
        gd.widthHint = 100;
        viewer.getTable().setLayoutData(gd);

        Table table = viewer.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        table.setFont(parent.getFont());

        viewer.setContentProvider(new IStructuredContentProvider() {

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            }

            public Object[] getElements(Object inputElement) {
                return cheatsheets.toArray(new IFile[0]);
            }

            public void dispose() {
            }
        });

        String[] columnHeaders = { "Project", "Name" };

        for (int i = 0; i < columnHeaders.length; i++) {
            TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
            column.setLabelProvider(new CheatsheetLabelProvider(i));
            column.getColumn().setText(columnHeaders[i]);
            column.getColumn().setResizable(true);
            column.getColumn().setMoveable(true);

        }

        ColumnLayoutData[] layouts = { new ColumnWeightData(100, 100), new ColumnWeightData(60, 60) };

        TableLayout layout = new AutoResizeTableLayout(table);
        for (int i = 0; i < layouts.length; i++) {
            layout.addColumnData(layouts[i]);
        }

        viewer.getTable().setLayout(layout);

        configureViewer(viewer);

        viewer.setInput(cheatsheets);

        return viewer;
    }

    private static void configureViewer(final TableViewer viewer) {
        TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(viewer,
                new FocusCellOwnerDrawHighlighter(viewer));

        ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(viewer) {
            protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
                ViewerCell cell = viewer.getColumnViewerEditor().getFocusCell();
                if (cell != null && cell.getColumnIndex() == 1) {
                    return super.isEditorActivationEvent(event);
                }
                return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
                        || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
                        || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED
                                && event.keyCode == SWT.CR)
                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
            }
        };

        TableViewerEditor.create(viewer, focusCellManager, actSupport,
                ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
                        | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
    }

    private static class CheatsheetLabelProvider extends ColumnLabelProvider {
        private int columnIndex;

        public CheatsheetLabelProvider(int i) {
            this.columnIndex = i;
        }

        public String getText(Object element) {
            if (element instanceof IFile) {
                IFile file = (IFile) element;
                switch (columnIndex) {
                case 0:
                    return file.getProject().getName();
                case 1:
                    return file.getName();
                }
            }
            return null;
        }

    }

}