nz.ac.massey.cs.jquest.views.ViewContentProvider.java Source code

Java tutorial

Introduction

Here is the source code for nz.ac.massey.cs.jquest.views.ViewContentProvider.java

Source

/*
 * Copyright 2014 Ali Shah Licensed under the GNU AFFERO GENERAL PUBLIC LICENSE, Version 3
 * (the "License"); you may not use this file except in compliance with the
 * License. You may obtain a copy of the License at
 * http://www.gnu.org/licenses/agpl.html Unless required by applicable law
 * or agreed to in writing, software distributed under the License is
 * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package nz.ac.massey.cs.jquest.views;

import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;

import nz.ac.massey.cs.jdg.Dependency;
import nz.ac.massey.cs.jdg.TypeNode;
//import nz.ac.massey.cs.gql4jung.Dependency;
import nz.ac.massey.cs.jquest.handlers.GraphBuilderHandler;
import nz.ac.massey.cs.jquest.utils.Utils;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.ITypeRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.progress.IProgressService;
import org.eclipse.zest.core.viewers.GraphViewer;
import org.eclipse.zest.core.viewers.IGraphEntityContentProvider;

import edu.uci.ics.jung.graph.DirectedGraph;

/**
 * The content provider class is responsible for providing objects to the
 * view. It can wrap existing objects in adapters or simply return objects
 * as-is. These objects may be sensitive to the current input of the view,
 * or ignore it and always show the same content (like Task List, for
 * example).
 */
class ViewContentProvider implements AbstractContentProvider {
    private static DirectedGraph<TypeNode, Dependency> g = null;
    private static DirectedGraph<TypeNode, Dependency> pg = null;
    //   private GraphViewer viewer;
    private IJavaElement selection;
    private static ElementChangedListener l = null;
    private static String selectedNodeName = null;
    private static TypeNode baseNode = null;
    private static IProject selectedProject = null;
    private GraphBuilderHandler h;
    private boolean showClassNameOnly = false;
    private boolean showIncoming = true;
    private boolean showOutgoing = true;
    private boolean showExternal = true;

    public ViewContentProvider(Object selectedItem, ElementChangedListener l2, boolean showIncoming,
            boolean showOutgoing, boolean external) {
        l = l2;
        this.showIncoming = showIncoming;
        this.showOutgoing = showOutgoing;
        this.showExternal = external;
        this.selection = (IJavaElement) selectedItem;
        selectedProject = selection.getJavaProject().getProject();
    }

    public ViewContentProvider(Object selectedNode, Object selectedItem, ElementChangedListener l2,
            boolean showIncoming, boolean showOutgoing, boolean external) {
        l = l2;
        this.showIncoming = showIncoming;
        this.showOutgoing = showOutgoing;
        this.showExternal = external;
        this.selection = (IJavaElement) selectedItem;
        selectedProject = selection.getJavaProject().getProject();
        baseNode = (TypeNode) selectedNode;
    }

    public ViewContentProvider() {
        // TODO Auto-generated constructor stub
    }

    public Object[] getElements(Object inputElement) {
        Object[] typenodes = null;
        try {
            if (inputElement != null && inputElement instanceof TypeNode) {
                return getTypeNodesFromSelection(inputElement);
            }
            typenodes = getTypeNodes(inputElement);

        } catch (Exception e) {
            e.printStackTrace();
            return new Object[] {}; //an empty array
        }
        return typenodes;
    }

    //   private void displayMessage() {
    //      MessageBox mb = new MessageBox(getSite().getWorkbenchWindow().getShell(),SWT.ICON_ERROR);
    //      mb.setMessage("An error has occured. Close and restart the view.");
    //      mb.setText("Status");
    //      mb.open();
    //   }

    private Object[] getTypeNodesFromSelection(Object inputElement) {
        TypeNode selectedNode = (TypeNode) inputElement;
        baseNode = selectedNode;
        selectedNodeName = Utils.removeTrailingDot(selectedNode.getFullname());
        return getNodes(selectedNode);
        //      if(selectedNode.getId().equals("package")){
        //         
        //      }
    }

    private Object[] getTypeNodes(Object inputElement) throws JavaModelException {
        if (selection == null)
            return new Object[] {};
        else {
            selectedProject = selection.getJavaProject().getProject();
            validateOrAddGraph();
        }
        //      if(inputElement == null) return new Object[]{};
        //      if(inputElement instanceof IJavaElement) {
        //         selection = (IJavaElement) inputElement;
        //         selectedProject = selection.getJavaProject().getProject();
        //         validateOrAddGraph();
        //      }
        TypeNode selectedNode = null;
        if (selection.getElementType() == IJavaElement.COMPILATION_UNIT) {
            String classname = ((ICompilationUnit) selection).getTypes()[0].getFullyQualifiedName();
            selectedNode = Utils.getNode(g, classname);
            selectedNodeName = classname;
            baseNode = selectedNode;
        } else if (selection.getElementType() == IJavaElement.PACKAGE_FRAGMENT) {
            String packageName = ((IPackageFragment) selection).getElementName();
            if (pg == null) {
                if (h == null)
                    h = new GraphBuilderHandler();
                pg = h.loadPackageGraph(g, new NullProgressMonitor());
            }
            selectedNode = Utils.getNode(pg, packageName);
            selectedNodeName = packageName;
            baseNode = selectedNode;

        } else {
            return new Object[] {};
        }
        if (selectedNode == null) {
            //         displayMessage();
            return new Object[] {};
        }
        return getNodes(selectedNode);

    }

    private Object[] getNodes(TypeNode selectedNode) {
        Object[] inNodes = new Object[selectedNode.getInEdges().size()];
        int i = 0;
        Iterator<Dependency> iter = selectedNode.getInEdges().iterator();
        while (iter.hasNext()) {
            inNodes[i++] = iter.next().getStart();
        }
        if (showIncoming && showOutgoing) {
            Object[] typenodes = new Object[inNodes.length + 1];
            typenodes[0] = selectedNode;
            i = 1;
            for (Object node : inNodes) {
                typenodes[i++] = node;
            }
            return typenodes;
        } else if (showIncoming) {
            Object[] typenodes = new Object[inNodes.length];
            i = 0;
            for (Object node : inNodes) {
                typenodes[i++] = node;
            }
            return typenodes;
        } else if (showOutgoing) {
            return new Object[] { selectedNode };
        } else {
            return new Object[] {};
        }
    }

    public Object[] getConnectedTo(Object entity) {
        TypeNode n = (TypeNode) entity;
        Iterator<Dependency> iter = n.getOutEdges().iterator();
        Object[] outNodes = new Object[n.getOutEdges().size()];
        int i = 0;
        String fullname = Utils.removeTrailingDot(n.getFullname());
        if (fullname.equals(selectedNodeName)) {
            while (iter.hasNext()) {
                Object end = iter.next().getEnd();
                TypeNode node = (TypeNode) end;
                if (!showExternal) {
                    if (node.getContainer().equals(baseNode.getContainer())) {
                        outNodes[i++] = end;
                    }
                } else {
                    outNodes[i++] = end;
                }
            }
        } else {
            while (iter.hasNext()) {
                Object end = iter.next().getEnd();
                String fullname1 = Utils.removeTrailingDot(((TypeNode) end).getFullname());
                if (fullname1.equals(selectedNodeName)) {
                    outNodes[i++] = end;
                }
            }
        }
        return outNodes;
    }

    private void validateOrAddGraph() {
        if (g == null || l.hasProjectModified() || l.hasProjectChanged(selectedProject)) {
            try {
                IWorkbench wb = PlatformUI.getWorkbench();
                IProgressService ps = wb.getProgressService();
                ps.busyCursorWhile(new IRunnableWithProgress() {
                    public void run(IProgressMonitor monitor)
                            throws InvocationTargetException, InterruptedException {
                        h = new GraphBuilderHandler();
                        g = h.loadGraph(selectedProject, monitor);
                        //                  pg = h.loadPackageGraph(g, monitor);
                        l.reset();
                    }
                });
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void dispose() {
    }

    public void inputChanged(Viewer viewer1, Object oldInput, Object newInput) {
        //        this.viewer = viewer1;

    }

    public TypeNode getSelectedNode() {
        return baseNode;
    }
}