com.javapathfinder.vjp.config.tree.ModePropertyTree.java Source code

Java tutorial

Introduction

Here is the source code for com.javapathfinder.vjp.config.tree.ModePropertyTree.java

Source

/*******************************************************************************
 * Copyright  2015 Saad Naji. All Rights Reserved.
 * Copyright  2008 Sandro Badame. All Rights Reserved.
 * 
 * This software and the accompanying materials is available under the 
 * Eclipse Public License 1.0 (EPL), which accompanies this distribution, and is
 * available at http://visualjpf.sourceforge.net/epl-v10.html
 ******************************************************************************/
package com.javapathfinder.vjp.config.tree;

import java.util.ArrayList;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;

import com.javapathfinder.vjp.VJP;

/**
 * Displays the tree of JPF configuration files.
 * @author Sandro Badame
 * @author Saad Naji
 */
public class ModePropertyTree extends TreeViewer {

    private static final String Config_File_Extension = "jpf";

    /**
     * Constructs the tree to be displayed
     * @param parent the parent composite of this tree
     */
    public ModePropertyTree(Composite parent) {
        super(parent, SWT.SINGLE);
        setLabelProvider(new ModePropertyLabelProvider());
        setContentProvider(new ModePropertyContentProvider());
        updateInput();
        expandAll();
    }

    /**
     * Refreshes the layout and contents of this tree
     */
    public void refresh() {
        if (getContentProvider() == null)
            setContentProvider(new ModePropertyContentProvider());
        updateInput();
        super.refresh();
        expandAll();
    }

    /**
     * Updates the contents of this tree
     *
     */
    public void updateInput() {
        ArrayList<TreeProject> treeProjects = new ArrayList<TreeProject>();
        IProject[] workspace_projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();

        for (IProject p : workspace_projects) {

            //Expeirence tells me that closed projectes don't show up here
            //Documentation tells me that they can, so I'm just making sure.
            if (!p.exists() || !p.isOpen() || !isJavaProject(p))
                continue;

            ArrayList<IFile> configFiles = getModePropertyFiles(p);
            if (!configFiles.isEmpty()) {
                TreeProject tp = new TreeProject();
                tp.java_project = JavaCore.create(p);
                tp.modePropertyFiles = configFiles.toArray(new IFile[configFiles.size()]);
                treeProjects.add(tp);
            }
        }
        setInput(treeProjects);
    }

    private boolean isJavaProject(IProject workspace_project) {
        try {
            return workspace_project.hasNature(JavaCore.NATURE_ID);
        } catch (CoreException e) {
            VJP.logError("Error thrown attempting to test for Java Nature", e);
            return false;
        }
    }

    private ArrayList<IFile> getModePropertyFiles(IProject project) {
        ArrayList<IFile> files = new ArrayList<IFile>();
        appendConfigFiles(project, files);
        return files;
    }

    private void appendConfigFiles(IContainer container, ArrayList<IFile> configs) {
        if (!container.exists())
            return;

        try {
            for (IResource r : container.members())
                if (r instanceof IContainer) {
                    IContainer ic = (IContainer) r;
                    if (!ic.isDerived() && !ic.getResourceAttributes().isHidden())
                        appendConfigFiles((IContainer) r, configs);
                } else if (r instanceof IFile) {
                    if (r != null && r.exists() && r.getFileExtension() != null
                            && r.getFileExtension().equals(Config_File_Extension)) {
                        configs.add((IFile) r);
                    }
                }
        } catch (CoreException ce) {
            VJP.logError("Members could not be found.", ce);
        }
    }

    private class ModePropertyLabelProvider extends LabelProvider {
        public Image getImage(Object element) {
            return null;
        }

        public String getText(Object element) {
            if (element instanceof TreeProject)
                return ((TreeProject) element).java_project.getProject().getName();
            else if (element instanceof IFile)
                return ((IFile) element).getName();
            else
                VJP.logError("None IFile child in project, element:" + element);
            return null;
        }
    }

    private class ModePropertyContentProvider extends ArrayContentProvider implements ITreeContentProvider {

        public Object[] getChildren(Object parentElement) {
            if (parentElement instanceof TreeProject)
                return ((TreeProject) parentElement).modePropertyFiles;
            else
                return null;
        }

        public Object getParent(Object element) {
            return null;
        }

        public boolean hasChildren(Object element) {
            return element instanceof TreeProject;
        }
    }

}