metabup.perspective.views.OpenIssuesView.java Source code

Java tutorial

Introduction

Here is the source code for metabup.perspective.views.OpenIssuesView.java

Source

/*******************************************************************************
 * Copyright (c) 2015 IBM Corporation and others.
 * 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
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package metabup.perspective.views;

import java.util.List;

import metabup.issues.general.categories.Conflict;
import metabup.Activator;
import metabup.SessionState;
import metabup.issues.general.OpenIssue;
import metabup.issues.general.categories.Automatic;
import metabup.perspective.views.actions.UpdateMetamodelByOpenIssue;
import metabup.ui.editor.editors.MetamodelInteractiveEditor;

import org.eclipse.jface.action.Action;
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.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.DrillDownAdapter;
import org.eclipse.ui.part.ViewPart;

/**
 * Shows a list of suggested refactorings over the active metamodel
 * 
 * @author jesusl
 */
// See TODO: http://wiki.eclipse.org/FAQ_How_to_decorate_a_TableViewer_or_TreeViewer_with_Columns%3F
public class OpenIssuesView extends ViewPart {

    /**
     * The ID of the view as specified by the extension.
     */
    public static final String ID = "metabup.perspective.views.OpenIssuesView";
    private TreeViewer viewer;
    private Action doubleClickAction;
    private DrillDownAdapter drillDownAdapter;
    private int conflictCount = 0;
    private int automaticCount = 0;

    public int getConflictCount() {
        return conflictCount;
    }

    public int getAutomaticCount() {
        return automaticCount;
    }

    // The connection with the editor
    protected SessionState session;

    class Category<T> {
        private Class<T> clazz;

        public Category(Class<T> clazz) {
            this.clazz = clazz;
        }

        public String toString() {
            return clazz.getSimpleName();
        }

        public String getIcon() {
            return clazz.getSimpleName().toLowerCase() + ".gif";
        }

        public Object[] filterIssues() {
            List<OpenIssue> issues = session.getIssues(clazz);
            Object[] result = new Object[issues.size()];
            for (int i = 0; i < issues.size(); i++)
                result[i] = issues.get(i).getDescription();
            return result;
        }

        public boolean hasChildrenIssues() {
            return session.getIssues(clazz).size() > 0;
        }
    }

    class ViewLabelProvider extends LabelProvider {

        public String getText(Object obj) {
            if (obj instanceof Category<?>)
                return obj.toString();
            return obj.toString();
        }

        public Image getImage(Object obj) {
            if (obj instanceof Category<?>) {
                return getIconImage(((Category<?>) obj).getIcon());
            }
            return getIconImage("issue.gif");
        }
    }

    private Image getIconImage(String iconName) {
        ImageDescriptor desc = Activator.getImageDescriptor("icons/" + iconName);
        if (desc != null)
            return desc.createImage();
        return null;
    }

    class NameSorter extends ViewerSorter {
    }

    /*
     * 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 IStructuredContentProvider, ITreeContentProvider {
        public void inputChanged(Viewer v, Object oldInput, Object newInput) {
        }

        public void dispose() {
        }

        public Object[] getElements(Object parent) {
            if (session == null)
                return new Object[] {};

            if (parent.equals(getViewSite())) {
                Category<Conflict> c = new Category<Conflict>(Conflict.class);
                Category<Automatic> a = new Category<Automatic>(Automatic.class);

                return new Object[] { a, c };
            }

            return getChildren(parent);
        }

        @Override
        public Object[] getChildren(Object parentElement) {
            if (parentElement instanceof Category<?>) {
                Object children[] = ((Category<?>) parentElement).filterIssues();

                /*Category<?> cat = (Category<?>) parentElement;
                //System.out.println("toString returns: "+ cat.toString());
                if(cat.toString().equals("Conflict")) conflictCount = children.length;
                else if(cat.toString().equals("Automatic")) automaticCount = children.length;*/

                return children;
            }
            return null;
        }

        @Override
        public Object getParent(Object element) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public boolean hasChildren(Object element) {
            if (element instanceof Category<?>)
                return (((Category<?>) element).hasChildrenIssues());
            return false;
        }
    }

    /*class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
       public String getColumnText(Object obj, int index) {
     return getText(obj);
       }
       public Image getColumnImage(Object obj, int index) {
     return getImage(obj);
       }
       public Image getImage(Object obj) {
     return PlatformUI.getWorkbench().
           getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
       }
    }*/

    public OpenIssuesView() {
    }

    /**
     * This is a callback that will allow us
     * to create the viewer and initialize it.
     */
    public void createPartControl(Composite parent) {
        viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        drillDownAdapter = new DrillDownAdapter(viewer);
        viewer.setContentProvider(new ViewContentProvider());
        viewer.setLabelProvider(new ViewLabelProvider());
        viewer.setSorter(new NameSorter());
        viewer.setInput(getViewSite());
        viewer.expandAll();

        // Create the help context id for the viewer's control
        PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "metabup.perspective.viewer");
        makeActions();
        hookContextMenu();
        hookDoubleClickAction();
        contributeToActionBars();

        getSite().getWorkbenchWindow().getPartService().addPartListener(new AssistanceListener());
    }

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

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

    private void fillLocalPullDown(IMenuManager manager) {
        //manager.add(action1);
        //manager.add(new Separator());
        //manager.add(action2);
    }

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

    private void fillLocalToolBar(IToolBarManager manager) {
        //manager.add(action1);
        //manager.add(action2);
    }

    private void makeActions() {
        doubleClickAction = new Action() {
            public void run() {
                ISelection selection = viewer.getSelection();
                Object obj = ((IStructuredSelection) selection).getFirstElement();
                UpdateMetamodelByOpenIssue action = new UpdateMetamodelByOpenIssue();
                action.setEditor((MetamodelInteractiveEditor) PlatformUI.getWorkbench().getActiveWorkbenchWindow()
                        .getActivePage().getActiveEditor());
                action.run((String) obj);
                refresh(session);
            }
        };

        doubleClickAction.setToolTipText("Apply this open issue's associated operation");
    }

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

    private void showMessage(String message) {
        MessageDialog.openInformation(viewer.getControl().getShell(), "Assistance View", message);
    }

    public void refresh(SessionState session) {
        if (session != null) {
            viewer.refresh();
            viewer.expandAll();
        }
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    public void setFocus() {
        viewer.getControl().setFocus();
    }

    protected class AssistanceListener implements IPartListener {

        @Override
        public void partActivated(IWorkbenchPart part) {
            ////System.out.println("Activated metamodel editor");
            if (part instanceof MetamodelInteractiveEditor) {
                MetamodelInteractiveEditor metamodelInteractiveEditor = (MetamodelInteractiveEditor) part;
                session = metamodelInteractiveEditor.getSession();
                viewer.refresh();
                viewer.expandAll();
            }
        }

        @Override
        public void partBroughtToTop(IWorkbenchPart part) {
        }

        @Override
        public void partClosed(IWorkbenchPart part) {
        }

        @Override
        public void partDeactivated(IWorkbenchPart part) {
        }

        @Override
        public void partOpened(IWorkbenchPart part) {
        }
    }
}