tinyos.yeti.properties.source.SourceFolderDecorator.java Source code

Java tutorial

Introduction

Here is the source code for tinyos.yeti.properties.source.SourceFolderDecorator.java

Source

/*
 * Yeti 2, NesC development in Eclipse.
 * Copyright (C) 2009 ETH Zurich
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Web:  http://tos-ide.ethz.ch
 * Mail: tos-ide@tik.ee.ethz.ch
 */
package tinyos.yeti.properties.source;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ILightweightLabelDecorator;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.ui.progress.UIJob;

import tinyos.yeti.TinyOSCore;
import tinyos.yeti.TinyOSPlugin;
import tinyos.yeti.editors.NesCIcons;
import tinyos.yeti.model.INesCPathListener;
import tinyos.yeti.model.NesCPath;
import tinyos.yeti.utility.TinyOSProjects;
import tinyos.yeti.utility.TinyOSProjectsListener;

public class SourceFolderDecorator implements ILightweightLabelDecorator, INesCPathListener {
    private List<ILabelProviderListener> listeners = new ArrayList<ILabelProviderListener>();
    private ImageDescriptor image = NesCIcons.icons().getImageDescriptor(NesCIcons.ICON_NESC_DECORATION);

    private TinyOSProjects projects;

    private Map<NesCPath, IFolder[]> paths = new HashMap<NesCPath, IFolder[]>();

    public SourceFolderDecorator() {
        projects = TinyOSPlugin.getDefault().getProjects();
        projects.addListener(new TinyOSProjectsListener() {
            public void projectAdded(IProject project) {
                link(project);
            }

            public void projectRemoved(IProject project) {
                unlink(project);
            }
        });
        for (IProject project : projects.getProjects()) {
            link(project);
        }
    }

    private void link(IProject project) {
        synchronized (paths) {
            NesCPath path = TinyOSPlugin.getDefault().getPaths(project);
            paths.put(path, path.getSourceFolders());
            path.addListener(SourceFolderDecorator.this);
        }
    }

    private void unlink(IProject project) {
        synchronized (paths) {
            NesCPath path = TinyOSPlugin.getDefault().getPaths(project);
            paths.remove(path);
            path.removeListener(SourceFolderDecorator.this);
        }
    }

    public void sourceFoldersChanged(final NesCPath path) {
        UIJob job = new UIJob("Update Decoration") {
            @Override
            public IStatus runInUIThread(IProgressMonitor monitor) {
                monitor.beginTask("Update Decorations", IProgressMonitor.UNKNOWN);
                synchronized (paths) {
                    Set<IFolder> changed = new HashSet<IFolder>();
                    IFolder[] folders = paths.get(path);
                    for (IFolder folder : folders) {
                        changed.add(folder);
                    }

                    folders = path.getSourceFolders();
                    paths.put(path, folders);
                    for (IFolder folder : folders) {
                        changed.add(folder);
                    }

                    changed(changed.toArray(new IFolder[changed.size()]));
                }
                return Status.OK_STATUS;
            }
        };
        job.setRule(path.getProject());
        job.setPriority(Job.DECORATE);
        job.setSystem(true);
        job.schedule();
    }

    public void decorate(Object element, IDecoration decoration) {
        if (element instanceof IAdaptable) {
            IFolder folder = (IFolder) ((IAdaptable) element).getAdapter(IFolder.class);
            if (folder != null) {
                IProject project = folder.getProject();
                try {
                    if (project.hasNature(TinyOSCore.NATURE_ID)) {
                        TinyOSPlugin plugin = TinyOSPlugin.getDefault();
                        if (plugin != null) {
                            NesCPath path = plugin.getPaths(project);
                            IFolder[] folders = path.getSourceFolders();
                            for (IFolder check : folders) {
                                if (check.equals(folder)) {
                                    decoration.addOverlay(image, IDecoration.TOP_RIGHT);
                                    return;
                                }
                            }
                        }
                    }
                } catch (CoreException ex) {
                    // swallow, it is not *that* important that the icons are correct...
                }
            }
        }
    }

    public void addListener(ILabelProviderListener listener) {
        if (listener != null && !listeners.contains(listener)) {
            listeners.add(listener);
        }
    }

    public void removeListener(ILabelProviderListener listener) {
        listeners.remove(listener);
    }

    private void changed(IFolder[] folders) {
        LabelProviderChangedEvent event = new LabelProviderChangedEvent(this, folders);

        for (ILabelProviderListener listener : listeners.toArray(new ILabelProviderListener[listeners.size()])) {
            listener.labelProviderChanged(event);
        }
    }

    public void dispose() {
        projects.dispose();
    }

    public boolean isLabelProperty(Object element, String property) {
        return false;
    }
}