org.ofbiz.plugin.ExplorerView.java Source code

Java tutorial

Introduction

Here is the source code for org.ofbiz.plugin.ExplorerView.java

Source

/**
 * Copyright 2008 Anders Hessellund 
 * 
 * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 
 *     
 * 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.
 *
 * $Id: ExplorerView.java,v 1.2 2008/01/18 12:31:23 hessellund Exp $
 */
package org.ofbiz.plugin;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.views.properties.IPropertySheetPage;
import org.eclipse.ui.views.properties.PropertySheetPage;
import org.ofbiz.plugin.analysis.Analysis;
import org.ofbiz.plugin.ofbiz.Attribute;
import org.ofbiz.plugin.ofbiz.Component;
import org.ofbiz.plugin.ofbiz.Directory;
import org.ofbiz.plugin.ofbiz.Entity;
import org.ofbiz.plugin.ofbiz.ExtendEntity;
import org.ofbiz.plugin.ofbiz.HasDocumentation;
import org.ofbiz.plugin.ofbiz.HasUrl;
import org.ofbiz.plugin.ofbiz.HasXmlDefinition;
import org.ofbiz.plugin.ofbiz.IEntity;
import org.ofbiz.plugin.ofbiz.OfbizFactory;
import org.ofbiz.plugin.ofbiz.Project;
import org.ofbiz.plugin.ofbiz.Root;
import org.ofbiz.plugin.ofbiz.Service;
import org.ofbiz.plugin.ofbiz.ServiceMode;
import org.ofbiz.plugin.ofbiz.ViewEntity;
import org.ofbiz.plugin.ofbiz.provider.OfbizItemProviderAdapterFactory;
import org.ofbiz.plugin.parser.GoToFile;

public class ExplorerView extends ViewPart {
    private FilteredTree filteredTree;
    private ComposedAdapterFactory adapterFactory;
    private PropertySheetPage propertySheetPage;
    private IAction analyzeAllAction;
    private IAction filterAction;
    private ViewerFilter filter;
    private boolean filterOn;
    private IAction refreshAction;
    private Action doubleClickAction;
    private Action analyzeSourceAction;
    private Root root;

    class Myfilter extends PatternFilter {
        private String pattern;

        @Override
        public boolean isElementVisible(Viewer viewer, Object element) {
            //i want to show every children object of a visible element
            //try to figure out that the element's parent is visible and show up if it's visible
            boolean isElementVisible = isParentObjectMatch(viewer, element);

            //fall back to default behavior
            return isElementVisible || super.isElementVisible(viewer, element);
        }

        private boolean isParentObjectMatch(Viewer viewer, Object element) {
            EObject eObject = (EObject) element;
            do {
                eObject = eObject.eContainer();
                if (isLeafMatch(viewer, eObject)) {
                    return true;
                }
            } while (eObject != null);
            return false;
        }

        @Override
        protected boolean isLeafMatch(Viewer viewer, Object element) {
            if (element instanceof HasUrl) {
                HasUrl hasUrl = (HasUrl) element;
                if (hasUrl.getUrl() != null && hasUrl.getUrl().startsWith(pattern)) {
                    return true;
                }
            }
            return super.isLeafMatch(viewer, element);
        }

        @Override
        public void setPattern(String patternString) {
            this.pattern = patternString;
            super.setPattern(patternString);
        }

    }

    public void createPartControl(Composite parent) {

        Myfilter pFilter = new Myfilter();

        filteredTree = new FilteredTree(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL, pFilter, true);

        adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
        adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory());
        adapterFactory.addAdapterFactory(new OfbizItemProviderAdapterFactory());
        adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());
        TreeViewer viewer = filteredTree.getViewer();
        viewer.addDoubleClickListener(new IDoubleClickListener() {

            @Override
            public void doubleClick(DoubleClickEvent arg0) {
                ISelection selection = arg0.getSelection();
                if (selection instanceof TreeSelection) {
                    TreeSelection treeSelection = (TreeSelection) selection;
                    Object source = treeSelection.getFirstElement();
                    ;
                    if (source instanceof Service) {
                        GoToFile.gotoFile((Service) source);
                    } else if (source instanceof HasXmlDefinition) {
                        GoToFile.gotoFile((HasXmlDefinition) source);
                    } else if (source instanceof IEntity) {
                        GoToFile.gotoFile((IEntity) source);
                    }
                }
            }
        });
        viewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
        viewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));

        root = OfbizFactory.eINSTANCE.createRoot();

        viewer.setInput(root);

        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                getPropertySheetPage().selectionChanged(ExplorerView.this, event.getSelection());
            }
        });

        viewer.setSorter(new ViewerSorter() {
            @Override
            public int category(Object element) {
                if (element instanceof Service)
                    return 1;
                else if (element instanceof Entity)
                    return 2;
                else if (element instanceof ExtendEntity)
                    return 3;
                else if (element instanceof ViewEntity)
                    return 4;
                else if (element instanceof Attribute) {
                    Attribute attr = (Attribute) element;
                    switch (attr.getMode().getValue()) {
                    case ServiceMode.IN_VALUE:
                        return 5;
                    case ServiceMode.INOUT_VALUE:
                        return 6;
                    case ServiceMode.OUT_VALUE:
                        return 7;
                    default:
                        return super.category(element);
                    }
                } else
                    return super.category(element);
            }
        });
        filter = new ViewerFilter() {
            @Override
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                if (element instanceof Service) {
                    return ((Service) element).getEngine().equals("java");
                }
                if (element instanceof IEntity) {
                    return false;
                }
                return true;
            }
        };

        hookContextMenu();
        makeActions();
        hookDoubleClickAction();
        contributeToActionBars();

        try {
            LoadOperation refresh = new LoadOperation(this);
            new ProgressMonitorDialog(getSite().getShell()).run(true, true, refresh);
            viewer.refresh();
        } catch (InvocationTargetException e) {
            // handle exception
        } catch (InterruptedException e) {
            // handle cancelation
        }
    }

    public Root getRoot() {
        return this.root;
    }

    public TreeViewer getViewer() {
        TreeViewer viewer = filteredTree.getViewer();
        return viewer;
    }

    public IPropertySheetPage getPropertySheetPage() {
        if (propertySheetPage == null) {
            propertySheetPage = new PropertySheetPage() {
                @Override
                public void selectionChanged(IWorkbenchPart part, ISelection selection) {
                    super.selectionChanged(part, selection);
                }
            };
            propertySheetPage.setPropertySourceProvider(new AdapterFactoryContentProvider(adapterFactory));
        }
        return propertySheetPage;
    }

    @SuppressWarnings("unchecked")
    @Override
    public Object getAdapter(Class key) {
        if (key.equals(IPropertySheetPage.class)) {
            return getPropertySheetPage();
        } else {
            return super.getAdapter(key);
        }
    }

    public void setFocus() {
        TreeViewer viewer = filteredTree.getViewer();
        viewer.getControl().setFocus();
    }

    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu");
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                ExplorerView.this.fillContextMenu(manager);
            }
        });
        TreeViewer viewer = filteredTree.getViewer();
        Menu menu = menuMgr.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, viewer);
    }

    private void contributeToActionBars() {
        IActionBars bars = getViewSite().getActionBars();
        fillLocalToolBar(bars.getToolBarManager());
    }

    private void fillContextMenu(IMenuManager manager) {
        manager.add(refreshAction);
        manager.add(filterAction);
        manager.add(analyzeAllAction);
        // Other plug-ins can contribute there actions here
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    private void fillLocalToolBar(IToolBarManager manager) {
        manager.add(refreshAction);
        manager.add(filterAction);
        manager.add(analyzeAllAction);
    }

    private void makeActions() {
        //
        refreshAction = new RefreshAction(this);
        refreshAction.setText("Refresh");
        refreshAction.setToolTipText("Refresh");
        refreshAction.setImageDescriptor(Plugin.create("icons/refresh.gif"));

        //
        filterAction = new Action() {
            public void run() {
                TreeViewer viewer = filteredTree.getViewer();
                if (filterOn) {
                    viewer.removeFilter(filter);
                    viewer.refresh();
                } else {
                    viewer.addFilter(filter);
                    viewer.refresh();
                }
                filterOn = !filterOn;
            }
        };
        filterAction.setText("Filter");
        filterAction.setToolTipText("Toggle filter for java-based services");
        filterAction.setImageDescriptor(Plugin.create("icons/filter.gif"));

        //
        analyzeAllAction = new Action() {
            public void run() {
                new WorkspaceJob("analyze all java-based services") {
                    @Override
                    public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
                        List<Service> services = new ArrayList<Service>();
                        for (Project p : root.getProjects()) {
                            for (Directory d : p.getDirectories()) {
                                for (Component c : d.getComponents()) {
                                    for (Service s : c.getServices()) {
                                        if (s.getEngine().equals("java")) {
                                            services.add(s);
                                        }
                                    }
                                }
                            }
                            new Analysis(p.getJavaproject(), services, p).run(true);

                        }
                        return Status.OK_STATUS;
                    }

                }.schedule();
            }
        };
        analyzeAllAction.setText("Analyze all");
        analyzeAllAction.setToolTipText("Analyze all java-based serviceimplementations");
        analyzeAllAction.setImageDescriptor(Plugin.create("icons/analyzeall.gif"));

        // 
        doubleClickAction = new Action() {
            public void run() {
                TreeViewer viewer = filteredTree.getViewer();
                Object selObj = viewer.getSelection();
                if (selObj instanceof TreeSelection) {
                    TreeSelection treeSelObj = (TreeSelection) selObj;
                    Object selection = treeSelObj.getFirstElement();
                    if (selection != null && selection instanceof Service) {
                        Service service = (Service) selection;
                        IJavaProject java = service.getComponent().getDirectory().getProject().getJavaproject();
                        Analysis analysis = new Analysis(java, service,
                                service.getComponent().getDirectory().getProject());
                        analysis.run(true);
                    }
                }
            }
        };
    }

    private void hookDoubleClickAction() {
        TreeViewer viewer = filteredTree.getViewer();
        viewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                doubleClickAction.run();
            }
        });
    }

}