com.google.eclipse.mechanic.samples.ShowViewScanner.java Source code

Java tutorial

Introduction

Here is the source code for com.google.eclipse.mechanic.samples.ShowViewScanner.java

Source

/*******************************************************************************
 * Copyright (C) 2014, Google 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
 *******************************************************************************/

package com.google.eclipse.mechanic.samples;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;

import com.google.common.base.Charsets;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.common.io.CharStreams;
import com.google.eclipse.mechanic.CompositeTask;
import com.google.eclipse.mechanic.IResourceTaskProvider;
import com.google.eclipse.mechanic.IResourceTaskReference;
import com.google.eclipse.mechanic.ListCollector;
import com.google.eclipse.mechanic.ResourceTaskScanner;
import com.google.eclipse.mechanic.TaskCollector;

/**
 * Processes files with the extension '.showview'. Each file contains
 * view ids which will be opened when run.
 *
 * When the task is executed, the view will either appear, or hide.
 */
public class ShowViewScanner extends ResourceTaskScanner {
    private static final Logger LOG = Logger.getLogger(ShowViewScanner.class.getName());

    @Override
    protected void scan(IResourceTaskProvider source, TaskCollector collector) {
        /**
         * Scan our source. Add a new Task for each EPF found.
         */
        ListCollector<IResourceTaskReference> taskCollector = ListCollector.create();
        source.collectTaskReferences(".showview", taskCollector);
        for (IResourceTaskReference taskRef : taskCollector.get()) {
            processTaskRef(collector, taskRef);
        }
    }

    public void processTaskRef(TaskCollector collector, IResourceTaskReference taskRef) {
        try {
            InputStream inputStream = taskRef.newInputStream();
            InputStreamReader reader = new InputStreamReader(inputStream, Charsets.UTF_8);
            String inputText = CharStreams.toString(reader);
            // This example doesn't deal with Windows newlines.
            List<String> list = Lists.newArrayList();
            for (String line : Splitter.on("\n").split(inputText)) {
                line = line.trim();
                if (line.startsWith("#") || line.length() == 0) {
                    continue;
                }
                list.add(line);
            }
            collector.collect(new ShowViewTask(taskRef.getName(), list));
        } catch (IOException e) {
            LOG.log(Level.SEVERE, "Can't process task " + taskRef, e);
        } catch (RuntimeException e) {
            LOG.log(Level.SEVERE, "Can't process task " + taskRef, e);
        }
    }

    public class ShowViewTask extends CompositeTask {

        private final String name;
        private final ImmutableList<String> list;

        public ShowViewTask(String name, List<String> list) {
            this.name = name;
            this.list = ImmutableList.copyOf(list);
        }

        public String getId() {
            return ShowViewTask.class.getName() + ":" + name;
        }

        public String getTitle() {
            return "Show views: " + name;
        }

        public String getDescription() {
            return "Enables and disables views. More details.";
        }

        public boolean evaluate() {
            if (!PlatformUI.isWorkbenchRunning()) {
                return true;
            }
            final IWorkbench workbench = PlatformUI.getWorkbench();
            if (workbench == null) {
                return true;
            }

            final Set<String> remaining = Sets.newHashSet(list);
            Display.getDefault().syncExec(new Runnable() {
                public void run() {
                    for (IWorkbenchWindow workbenchWindow : workbench.getWorkbenchWindows()) {
                        for (IWorkbenchPage workbenchPage : workbenchWindow.getPages()) {
                            for (IViewReference viewReference : workbenchPage.getViewReferences()) {
                                remaining.remove(viewReference.getId());
                            }
                        }
                    }
                }
            });
            return remaining.isEmpty();
        }

        public void run() {
            Display.getDefault().syncExec(new Runnable() {
                public void run() {
                    IWorkbench workbench = PlatformUI.getWorkbench();
                    IWorkbenchWindow activeWorkbenchWindow = workbench.getActiveWorkbenchWindow();
                    IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
                    for (String viewId : list) {
                        try {
                            activePage.showView(viewId);
                        } catch (PartInitException e) {
                            LOG.log(Level.SEVERE, "Can't open view " + viewId, e);
                        }
                    }
                }
            });
        }
    }
}