eu.geclipse.info.ui.GlueInfoViewer.java Source code

Java tutorial

Introduction

Here is the source code for eu.geclipse.info.ui.GlueInfoViewer.java

Source

/******************************************************************************
 * Copyright (c) 2007, 2008 g-Eclipse consortium
 * 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
 *
 * Initial development of the original code was made for
 * project g-Eclipse founded by European Union
 * project number: FP6-IST-034327  http://www.geclipse.eu/
 *
 * Contributor(s):
 *     UCY (http://www.ucy.cs.ac.cy)
 *      - George Tsouloupas (georget@cs.ucy.ac.cy)
 *      - Nikolaos Tsioutsias
 *****************************************************************************/
package eu.geclipse.info.ui;

import java.lang.reflect.Field;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
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.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
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.ViewerFilter;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.DrillDownAdapter;
import org.eclipse.ui.part.ViewPart;

import eu.geclipse.core.model.GridModel;
import eu.geclipse.core.model.IGridElement;
import eu.geclipse.core.model.IGridInfoService;
import eu.geclipse.core.model.IGridModelEvent;
import eu.geclipse.core.model.IGridModelListener;
import eu.geclipse.core.model.IGridProject;
import eu.geclipse.core.reporting.ProblemException;
import eu.geclipse.info.InfoCacheListenerHandler;
import eu.geclipse.info.glue.AbstractGlueTable;
import eu.geclipse.info.glue.GlueCE;
import eu.geclipse.info.glue.GlueCEAccessControlBaseRule;
import eu.geclipse.info.glue.GlueQuery;
import eu.geclipse.info.model.FetchJob;
import eu.geclipse.info.model.IExtendedGridInfoService;
import eu.geclipse.info.model.IGlueStoreChangeListerner;
import eu.geclipse.info.model.InfoTopTreeCategory;
import eu.geclipse.info.model.InfoTopTreeElement;
import eu.geclipse.info.ui.internal.Activator;
import eu.geclipse.info.ui.internal.Messages;

/**
 * @author George Tsouloupas
 */
public class GlueInfoViewer extends ViewPart
        implements ISelectionProvider, IGlueStoreChangeListerner, IGridModelListener {

    FetchJob fetchJob;
    TreeViewer viewer;
    boolean showOnlyFilledInfoElements = false;

    private String currentVO = null;
    private DrillDownAdapter drillDownAdapter;

    private boolean SHOW_VO_LIST = false;
    private Combo comboVOList;
    private Label label = null;

    /**
     * @author George Tsouloupas
     */
    public class TreeObject implements IAdaptable {

        private String prefix;
        private String name;
        private TreeParent parent;

        /**
         * @param name
         * @param prefix
         */
        public TreeObject(final String name, final String prefix) {
            this.name = name;
            this.prefix = prefix;
        }

        /**
         * @return The name.
         */
        public String getName() {
            return this.name;
        }

        /**
         * @param parent
         */
        public void setParent(final TreeParent parent) {
            this.parent = parent;
        }

        /**
         * @return The parent.
         */
        public TreeParent getParent() {
            return this.parent;
        }

        @Override
        public String toString() {
            return ((this.prefix != null) ? this.prefix + ": " : "") + getName(); //$NON-NLS-1$  //$NON-NLS-2$
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
         */
        @SuppressWarnings("unchecked")
        public Object getAdapter(final Class key) {
            return null;
        }
    }

    /**
     * @author George Tsouloupas
     */
    public class TreeParent extends TreeObject {

        private AbstractGlueTable agt;

        private ArrayList<AbstractGlueTable> agtList;
        private ArrayList<InfoTopTreeElement> queries;
        private InfoTopTreeElement query;

        /**
         * @param agt
         * @param prefix
         */
        public TreeParent(final AbstractGlueTable agt, final String prefix) {
            super(agt.getDisplayName(), prefix);
            this.setAgt(agt);
        }

        /**
         * @param name
         * @param query
         * @param agtList
         */
        public TreeParent(final String name, final InfoTopTreeElement query,
                final ArrayList<AbstractGlueTable> agtList) {
            super(name, null);
            this.agtList = agtList;
            this.query = query;
        }

        /**
         * @param name
         * @param agtList
         */
        public TreeParent(final String name, final ArrayList<AbstractGlueTable> agtList) {
            super(name, null);
            this.agtList = agtList;
        }

        /**
         * @param queries
         */
        public TreeParent(final ArrayList<InfoTopTreeElement> queries) {
            super("", null); //$NON-NLS-1$
            this.queries = queries;
        }

        /**
         * Gets the query
         * @return a GlueInfoTopTreeElement object or null
         */
        public InfoTopTreeElement getQuery() {
            return this.query;
        }

        /**
         * @return Returns an array of the children
         */
        @SuppressWarnings("unchecked")
        public TreeObject[] getChildren() {
            ArrayList<TreeObject> toList = new ArrayList<TreeObject>();

            // Create the tree parents that will be the top level tree elements
            if (this.queries != null) {
                for (InfoTopTreeElement s : this.queries) {
                    toList.add(new TreeParent(s.getDisplayName(), s, null));
                }
            }
            if (this.query != null) {
                this.agtList = new ArrayList<AbstractGlueTable>();
                for (int i = 0; i < this.query.getGlueInfoTopTreeCategory().size(); i++) {
                    String myObjectTableName = this.query.getGlueInfoTopTreeCategory().get(i).getObjectTableName();
                    String myGlueObjectName = this.query.getGlueInfoTopTreeCategory().get(i).getGlueObjectName();

                    this.agtList
                            .addAll(GlueQuery.getGlueTable(myGlueObjectName, myObjectTableName, getCurrentVO()));
                }
            }
            if (this.getAgt() != null) {
                String fieldName;
                Field[] fields = this.getAgt().getClass().getFields();
                for (int i = 0; i < fields.length; i++) {
                    Field field = fields[i];
                    Object value;
                    try {
                        fieldName = field.getName();
                        value = field.get(this.getAgt());
                        if (fieldName.endsWith("List")) { //$NON-NLS-1$
                            ArrayList<AbstractGlueTable> list = (ArrayList<AbstractGlueTable>) value;
                            TreeObject to = new TreeParent(fieldName, list);
                            toList.add(to);
                        } else if (value instanceof AbstractGlueTable) {
                            AbstractGlueTable agt1 = (AbstractGlueTable) value;
                            toList.add(new TreeParent(agt1, agt1.tableName));
                        } else if (!((fieldName.equals("byRefOnly") //$NON-NLS-1$ 
                                || fieldName.equals("key") //$NON-NLS-1$
                                || fieldName.equals("keyName") || fieldName.equals("tableName") //$NON-NLS-1$  //$NON-NLS-2$
                                || fieldName.equals("glueIndex") || fieldName.equals("glueService") //$NON-NLS-1$ //$NON-NLS-2$
                                || fieldName.equals("displayName")))) {//$NON-NLS-1$
                            String s = fieldName + " = " //$NON-NLS-1$
                                    + ((value == null || value == "") //$NON-NLS-1$
                                            ? "Not available from the information service" //$NON-NLS-1$
                                            : value.toString());
                            TreeObject to = new TreeObject(s, null);
                            toList.add(to);

                        }
                    } catch (IllegalArgumentException e) {
                        Activator.logException(e);
                    } catch (IllegalAccessException e) {
                        Activator.logException(e);
                    }
                }
            }
            if (this.agtList != null) {
                for (AbstractGlueTable table : this.agtList) {
                    if (table.getID() != null) {
                        if (!table.byRefOnly) {
                            toList.add(new TreeParent(table, null));
                        }
                    }
                }
            }

            TreeObject[] treeObjectArray = toList.toArray(new TreeObject[toList.size()]);
            return treeObjectArray;
        }

        /**
         * Always returns true
         * @return always true
         */
        public boolean hasChildren() {
            boolean hc = true;
            return hc;
        }

        /**
         * @param agt an AbstractGlueTable
         */
        public void setAgt(final AbstractGlueTable agt) {
            this.agt = agt;
        }

        /**
         * @return an AbstractGlueTable or null
         */
        public AbstractGlueTable getAgt() {
            return this.agt;
        }

    }

    class ViewContentProvider implements IStructuredContentProvider, ITreeContentProvider {

        private TreeParent glueRoot;

        public void inputChanged(final Viewer v, final Object oldInput, final Object newInput) {
            // empty implementation
        }

        public void dispose() {
            // empty implementation
        }

        public Object[] getElements(final Object parent) {
            Object[] result;
            if (parent.equals(getViewSite())) {
                if (this.glueRoot == null) {
                    initialize();
                }
                result = getChildren(this.glueRoot);
            } else {
                result = getChildren(parent);
            }
            return result;
        }

        public Object getParent(final Object child) {
            Object result = null;
            if (child instanceof TreeObject) {
                result = ((TreeObject) child).getParent();
            }
            return result;
        }

        public Object[] getChildren(final Object parent) {
            Object[] result;
            if (parent instanceof TreeParent) {
                result = ((TreeParent) parent).getChildren();
            } else {
                result = new Object[0];
            }
            return result;
        }

        public boolean hasChildren(final Object parent) {
            boolean result = false;
            if (parent instanceof TreeParent) {
                result = ((TreeParent) parent).hasChildren();
            }
            return result;
        }

        private void initialize() {
            buildTopLevel();
        }

        private void addObjectTablename(final HashSet<InfoTopTreeElement> uniqueList,
                final InfoTopTreeElement otherElement) {
            if (uniqueList != null && otherElement != null) {
                Iterator<InfoTopTreeElement> it = uniqueList.iterator();
                while (it.hasNext()) {
                    InfoTopTreeElement currentElement = it.next();
                    if (currentElement != null && currentElement.getGlueInfoTopTreeCategory() != null
                            && otherElement.getGlueInfoTopTreeCategory() != null
                            && currentElement.equals(otherElement)) {
                        ArrayList<InfoTopTreeCategory> currentGlueInfoTopTreeCategory = currentElement
                                .getGlueInfoTopTreeCategory();
                        for (int i = 0; i < otherElement.getGlueInfoTopTreeCategory().size(); i++) {
                            if (!(currentGlueInfoTopTreeCategory
                                    .contains(otherElement.getGlueInfoTopTreeCategory().get(i)))) {
                                currentGlueInfoTopTreeCategory
                                        .add(otherElement.getGlueInfoTopTreeCategory().get(i));
                            }
                        }
                    }
                }
            }
        }

        private void buildTopLevel() {
            ArrayList<InfoTopTreeElement> list = new ArrayList<InfoTopTreeElement>();
            HashSet<InfoTopTreeElement> uniqueList = new HashSet<InfoTopTreeElement>();

            // We build the top level elements according to the existing projects
            IGridElement[] projectElements;
            try {
                projectElements = GridModel.getRoot().getChildren(null);
                for (IGridElement element : projectElements) {
                    IGridProject igp = (IGridProject) element;
                    if (igp.isOpen() && igp.getVO() != null) {
                        IGridInfoService infoService = igp.getVO().getInfoService();
                        if (infoService != null && infoService instanceof IExtendedGridInfoService) {
                            ArrayList<InfoTopTreeElement> result = ((IExtendedGridInfoService) infoService)
                                    .getTopTreeElements();

                            for (int i = 0; result != null && i < result.size(); i++) {
                                InfoTopTreeElement currentElement = result.get(i);
                                if (!uniqueList.contains(currentElement)) {
                                    uniqueList.add(currentElement);
                                } else {
                                    addObjectTablename(uniqueList, currentElement);
                                }
                            }
                        }
                    }
                }

            } catch (ProblemException e) {
                Activator.logException(e);
            }

            Iterator<InfoTopTreeElement> it = uniqueList.iterator();
            while (it.hasNext()) {
                list.add(it.next());
            }
            this.glueRoot = new TreeParent(list);
        }
    }

    static class ViewLabelProvider extends LabelProvider {

        @Override
        public String getText(final Object obj) {
            String result;
            if (obj instanceof AbstractGlueTable) {
                result = ((AbstractGlueTable) obj).getID();
            } else {
                result = obj.toString();
            }
            return result;
        }

        @Override
        public Image getImage(final Object obj) {
            String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
            if (obj instanceof TreeParent) {
                imageKey = ISharedImages.IMG_OBJ_FOLDER;
            }
            return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
        }
    }

    static class NameSorter extends ViewerSorter {
        @Override
        public int compare(final Viewer myViewer, final Object p1, final Object p2) {

            int result = 0;

            if ((p1 instanceof TreeParent && !(p2 instanceof TreeParent))
                    || (p2 instanceof TreeParent && !(p1 instanceof TreeParent))) {
                if ((p1 instanceof TreeParent))
                    result = -1;
                else if ((p2 instanceof TreeParent))
                    result = 1;
                else
                    result = super.compare(myViewer, p1, p2);
            } else
                result = super.compare(myViewer, p1, p2);

            return result;
        }

    }

    /**
     * The constructor.
     */
    public GlueInfoViewer() {

        InfoCacheListenerHandler.getInstance().addListener(GlueInfoViewer.this);
        GridModel.getRoot().addGridModelListener(GlueInfoViewer.this);

        this.fetchJob = FetchJob.getInstance(" Retrieving Information"); //$NON-NLS-1$
        this.showOnlyFilledInfoElements = false;

        // Fill in the InfoSystem info when this view is opened
        this.fetchJob.schedule();
    }

    /**
     * This is a callback that will allow us to create the viewer and initialize
     * it.
     */
    @Override
    public void createPartControl(final Composite parent) {
        GridLayout parentLayout = new GridLayout(3, false);
        parentLayout.marginTop = 0;
        parentLayout.marginBottom = parentLayout.marginTop;
        parentLayout.marginLeft = parentLayout.marginTop;
        parentLayout.marginRight = parentLayout.marginTop;
        parentLayout.marginHeight = 0;
        parentLayout.marginWidth = 0;
        // parentLayout.horizontalSpacing = 0;
        // parentLayout.verticalSpacing = 0;
        parent.setLayout(parentLayout);
        GridData gData;

        if (this.SHOW_VO_LIST) {
            this.label = new Label(parent, SWT.NONE);
            this.label.setText("VO:"); //$NON-NLS-1$
            gData = new GridData();
            this.label.setLayoutData(gData);

            this.comboVOList = new Combo(parent, SWT.NONE);
            gData = new GridData(GridData.FILL_HORIZONTAL);
            gData.widthHint = 150;
            gData.verticalAlignment = GridData.CENTER;
            this.comboVOList.setLayoutData(gData);
        }

        this.viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        gData = new GridData(GridData.FILL_BOTH);
        gData.grabExcessHorizontalSpace = true;
        gData.grabExcessVerticalSpace = true;
        gData.horizontalSpan = 3;
        this.viewer.getTree().setLayoutData(gData);
        this.drillDownAdapter = new DrillDownAdapter(this.viewer);
        this.viewer.setContentProvider(new ViewContentProvider());
        this.viewer.setLabelProvider(new ViewLabelProvider());
        this.viewer.setSorter(new NameSorter());
        this.viewer.setInput(getViewSite());
        this.viewer.setComparer(new GlueInfoComparator());

        // The viewerFilter that is used consists of 2 filters. One to show all or only filled info
        // elements and another to show all/glite/gria elements.
        ViewerFilter[] initialFilters = new ViewerFilter[2];
        initialFilters[0] = new InfoViewerFilter();
        initialFilters[1] = new InfoViewerFilter();
        this.viewer.setFilters(initialFilters);

        if (this.SHOW_VO_LIST) {
            // Label filler = new Label(parent, SWT.NONE);

            this.comboVOList.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetDefaultSelected(final SelectionEvent e) {
                    updateVOList();
                }

                @SuppressWarnings("synthetic-access")
                @Override
                public void widgetSelected(final SelectionEvent arg0) {
                    setCurrentVO(GlueInfoViewer.this.comboVOList.getText());
                    GlueInfoViewer.this.viewer.refresh();
                }
            });
        }
        hookContextMenu();
        contributeToActionBars();

        setCurrentVO("none"); //$NON-NLS-1$
    }

    void updateVOList() {
        ArrayList<AbstractGlueTable> agtList = GlueQuery.getGlueTable("GlueCEAccessControlBaseRule", //$NON-NLS-1$
                "GlueCEAccessControlBaseRule", null); //$NON-NLS-1$
        ArrayList<String> vos = new ArrayList<String>();
        int i = 0;
        for (AbstractGlueTable table : agtList) {
            GlueCEAccessControlBaseRule rule = (GlueCEAccessControlBaseRule) table;
            String[] s = rule.Value.split(":"); //$NON-NLS-1$
            if (s[0].equals("VO")) { //$NON-NLS-1$
                if (s[1] != null) {
                    vos.add(s[1]);
                }
            }
        }
        String[] voArray = new String[vos.size()];
        i = 0;
        for (String voString : vos) {
            voArray[i++] = voString;
        }
        Arrays.sort(voArray);

        this.comboVOList.setItems(voArray);
    }

    @SuppressWarnings("unused")
    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("Information Source"); //$NON-NLS-1$
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {

            public void menuAboutToShow(final IMenuManager manager) {
                GlueInfoViewer.this.fillContextMenu(manager);
            }
        });
        Menu menu = menuMgr.createContextMenu(this.viewer.getControl());
        this.viewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, this.viewer);
    }

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

    private void fillLocalPullDown(final IMenuManager manager) {

        // Create a new action for every filter that exists.
        ArrayList<InfoViewerFilter> infoFilterArray = new ArrayList<InfoViewerFilter>();
        InfoViewerFilter infoFilter = null;
        IExtensionRegistry myRegistry = Platform.getExtensionRegistry();
        IExtensionPoint extensionPoint = myRegistry.getExtensionPoint("eu.geclipse.info.infoViewerFilter"); //$NON-NLS-1$
        IExtension[] extensions = extensionPoint.getExtensions();

        for (int i = 0; i < extensions.length; i++) {
            IExtension extension = extensions[i];

            IConfigurationElement[] elements = extension.getConfigurationElements();
            for (IConfigurationElement element : elements) {

                try {
                    infoFilter = (InfoViewerFilter) element.createExecutableExtension("class"); //$NON-NLS-1$
                    if (infoFilter != null) {
                        infoFilterArray.add(infoFilter);
                    }
                } catch (CoreException e) {
                    // do nothing
                }
            }
        }

        // Add the default Filter
        FilterAction filterAction = new FilterAction(null, this.viewer);
        filterAction.setText("Show everything"); //$NON-NLS-1$
        filterAction.setToolTipText("Show everything"); //$NON-NLS-1$
        filterAction.setImageDescriptor(
                PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
        manager.add(filterAction);

        // Create an action for each filter and show it in the view
        for (int i = 0; i < infoFilterArray.size(); i++) {
            filterAction = new FilterAction(infoFilterArray.get(i), this.viewer);

            filterAction.setText(infoFilterArray.get(i).getText());
            filterAction.setToolTipText(infoFilterArray.get(i).getText());
            filterAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
                    .getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
            manager.add(filterAction);
        }

    }

    void fillContextMenu(final IMenuManager manager) {
        ISelection selection = this.viewer.getSelection();
        Object obj = ((IStructuredSelection) selection).getFirstElement();
        if (obj instanceof TreeParent) {
            TreeParent tp = (TreeParent) obj;
            if (tp.getAgt() instanceof GlueCE) {
                manager.add(new Separator());

            }
        }

        this.drillDownAdapter.addNavigationActions(manager);
        // Other plug-ins can contribute there actions here
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    private void fillLocalToolBar(final IToolBarManager manager) {

        IAction refreshAction = new Action() {
            @Override
            public void run() {

                GlueInfoViewer.this.fetchJob.schedule();
            }
        };
        refreshAction.setToolTipText(Messages.getString("GlueInfoView.refresh")); //$NON-NLS-1$
        URL imgUrl = Activator.getDefault().getBundle().getEntry("icons/elcl16/refresh_nav.gif"); //$NON-NLS-1$
        refreshAction.setImageDescriptor(ImageDescriptor.createFromURL(imgUrl));
        manager.add(refreshAction);

        IAction showFilledInfoElementsAction = new Action() {
            @Override
            public void run() {
                URL imageURL = null;

                if (GlueInfoViewer.this.showOnlyFilledInfoElements == true) {
                    GlueInfoViewer.this.showOnlyFilledInfoElements = false;
                    this.setToolTipText(Messages.getString("GlueInfoView.showOnlyFilledInfoElements")); //$NON-NLS-1$
                    imageURL = Activator.getDefault().getBundle().getEntry("icons/elcl16/hide.png"); //$NON-NLS-1$
                    this.setImageDescriptor(ImageDescriptor.createFromURL(imageURL));

                    ViewerFilter[] myViewerFilter = GlueInfoViewer.this.viewer.getFilters();
                    myViewerFilter[0] = new InfoViewerFilter();
                    GlueInfoViewer.this.viewer.setFilters(myViewerFilter);
                } else {
                    GlueInfoViewer.this.showOnlyFilledInfoElements = true;
                    this.setToolTipText(Messages.getString("GlueInfoView.showAllInfoElements")); //$NON-NLS-1$
                    imageURL = Activator.getDefault().getBundle().getEntry("icons/elcl16/show_all.png"); //$NON-NLS-1$
                    this.setImageDescriptor(ImageDescriptor.createFromURL(imageURL));

                    ViewerFilter[] myViewerFilter = GlueInfoViewer.this.viewer.getFilters();
                    myViewerFilter[0] = new InfoViewFilterShowFilledElements();
                    GlueInfoViewer.this.viewer.setFilters(myViewerFilter);
                }

                GlueInfoViewer.this.viewer.refresh();
            }
        };
        imgUrl = Activator.getDefault().getBundle().getEntry("icons/elcl16/hide.png"); //$NON-NLS-1$
        showFilledInfoElementsAction.setImageDescriptor(ImageDescriptor.createFromURL(imgUrl));
        showFilledInfoElementsAction.setToolTipText(Messages.getString("GlueInfoView.showOnlyFilledInfoElements")); //$NON-NLS-1$
        manager.add(showFilledInfoElementsAction);

        this.drillDownAdapter.addNavigationActions(manager);
    }

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

    /**
     * @return Returns the current VO
     */
    public String getCurrentVO() {
        return this.currentVO;
    }

    /**
     * @param currentVO
     */
    public void setCurrentVO(final String currentVO) {
        this.currentVO = currentVO;
    }

    public void addSelectionChangedListener(final ISelectionChangedListener arg0) {
        this.viewer.addSelectionChangedListener(arg0);
    }

    public ISelection getSelection() {
        this.viewer.getSelection();
        return null;
    }

    public void removeSelectionChangedListener(final ISelectionChangedListener arg0) {
        this.viewer.removeSelectionChangedListener(arg0);
    }

    public void setSelection(final ISelection arg0) {
        this.viewer.setSelection(arg0);
    }

    public void infoChanged() {
        getSite().getShell().getDisplay().syncExec(new Runnable() {
            @SuppressWarnings("synthetic-access")
            public void run() {
                if (GlueInfoViewer.this.SHOW_VO_LIST) {
                    updateVOList();
                }

                // Get the expanded nodes
                Object[] currentExpanded = GlueInfoViewer.this.viewer.getExpandedElements();
                GlueInfoViewer.this.viewer.setContentProvider(new ViewContentProvider());
                // Refresh the tree with the new model
                GlueInfoViewer.this.viewer.refresh();
                // Remember the expanded status of the tree.
                GlueInfoViewer.this.viewer.setExpandedElements(currentExpanded);
            }
        });
    }

    @SuppressWarnings("unused")
    private void showMessage(final String message) {
        MessageDialog.openInformation(this.viewer.getControl().getShell(), "Grid Information View", //$NON-NLS-1$
                message);
    }

    @Override
    public void dispose() {

        // Remove the listener that is added in the constructor.
        InfoCacheListenerHandler.getInstance().removeListener(GlueInfoViewer.this);
        GridModel.getRoot().removeGridModelListener(GlueInfoViewer.this);
    }

    public void gridModelChanged(IGridModelEvent event) {
        int type = event.getType();
        switch (type) {
        case IGridModelEvent.ELEMENTS_ADDED:
        case IGridModelEvent.ELEMENTS_REMOVED:
        case IGridModelEvent.PROJECT_CLOSED:
        case IGridModelEvent.PROJECT_OPENED:

            for (IGridElement gridElement : event.getElements()) {
                if (gridElement instanceof IGridProject) {
                    FetchJob myFetchJob = FetchJob.getInstance(" Retrieving Information"); //$NON-NLS-1$
                    myFetchJob.schedule(); // Getting the information from the info services.
                    break;
                }
            }
            break;
        default:
            break;
        }
    }
}