no.javatime.inplace.ui.views.BundleListLabelProvider.java Source code

Java tutorial

Introduction

Here is the source code for no.javatime.inplace.ui.views.BundleListLabelProvider.java

Source

/*******************************************************************************
 * Copyright (c) 2011, 2012 JavaTime project 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:
 *    JavaTime project, Eirik Gronsund - initial implementation
 *******************************************************************************/
package no.javatime.inplace.ui.views;

import no.javatime.inplace.bundlemanager.BundleCommand;
import no.javatime.inplace.bundlemanager.BundleManager;
import no.javatime.inplace.bundlemanager.BundleTransition;
import no.javatime.inplace.bundlemanager.BundleTransition.Transition;
import no.javatime.inplace.bundlemanager.BundleTransition.TransitionError;
import no.javatime.inplace.bundlemanager.ProjectLocationException;
import no.javatime.inplace.bundleproject.ProjectProperties;
import no.javatime.inplace.dependencies.BundleSorter;
import no.javatime.inplace.ui.Activator;

import org.eclipse.core.resources.IProject;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
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.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.osgi.framework.Bundle;

public class BundleListLabelProvider extends LabelProvider implements ITableLabelProvider {

    final private static ImageDescriptor activatedImageDesc = Activator
            .getImageDescriptor("icons/gear_activated.png"); //$NON-NLS-1$
    final private static ImageDescriptor errorImageDesc = Activator.getImageDescriptor("icons/gear_error.png"); //$NON-NLS-1$
    final private static ImageDescriptor pendingImageDesc = Activator.getImageDescriptor("icons/gear_pending.png"); //$NON-NLS-1$
    final private static ImageDescriptor deactivatedImageDesc = Activator
            .getImageDescriptor("icons/gear_deactivated.png"); //$NON-NLS-1$
    final private static ImageDescriptor warningImageDesc = Activator.getImageDescriptor("icons/gear_warning.png"); //$NON-NLS-1$

    private Image activatedImage = activatedImageDesc.createImage(true);
    private Image errorImage = errorImageDesc.createImage(true);
    private Image warningImage = warningImageDesc.createImage(true);
    private Image pendingImage = pendingImageDesc.createImage(true);
    private Image deactivatedImage = deactivatedImageDesc.createImage(true);

    TableViewer viewer;

    public BundleListLabelProvider() {
    }

    /**
     * @see #createColumns(TableViewer)
     */
    @Override
    public String getColumnText(Object obj, int index) {
        return null;
    }

    /**
     * @see #createColumns(TableViewer)
     */
    @Override
    public Image getColumnImage(Object obj, int index) {
        return null;
    }

    private int BUNDLE_ORDER = 1;
    private int MODE_ORDER = 1;
    private int STATE_ORDER = 1;
    private int STATUS_ORDER = 1;
    private int TRANSITION_ORDER = 1;

    public final static byte BUNDLE = 0x0;
    public final static byte MODE = 0x1;
    public final static byte STATE = 0x2;
    public final static byte STATUS = 0x3;
    public final static byte TRANSITION = 0x4;

    public static int ASCENDING = 1;
    public static int DESCENDING = -1;

    public void createColumns(final TableViewer viewer) {
        this.viewer = viewer;
        final Table table = viewer.getTable();
        table.removeAll();
        createBundleColumn();
        // Uncomment to show in list page
        // createModeColumn();
        createStatusColumn();
        createStateColumn();
        // Uncomment to show in list page
        createTransitionColumn();

        table.setHeaderVisible(true);
        table.setLinesVisible(true);
    }

    private void createBundleColumn() {

        TableViewerColumn viewerColumn = createTableViewerColumn("Bundle", 100, 0); //$NON-NLS-1$
        viewerColumn.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof BundleProperties) {
                    return ((BundleProperties) element).getSymbolicName();
                }
                return null;
            }

            @Override
            public Image getImage(Object element) {
                if (!(element instanceof BundleProperties)) {
                    return null;
                }
                Bundle bundle = ((BundleProperties) element).getBundle();
                IProject project = ((BundleProperties) element).getProject();
                boolean isProjectActivated = ProjectProperties.isProjectActivated(project);
                BundleCommand bundleCommand = BundleManager.getCommand();
                BundleTransition bundleTransition = BundleManager.getTransition();
                try {
                    if (!ProjectProperties.hasBuildState(project)) {
                        return warningImage;
                    } else if (ProjectProperties.hasBuildErrors(project)) {
                        return warningImage;
                    } else if (bundleTransition.containsPending(project, Transition.BUILD, false)) {
                        return pendingImage;
                    } else if (isProjectActivated
                            && bundleTransition.containsPending(project, Transition.UPDATE, false)) {
                        return pendingImage;
                    } else if (bundleTransition.hasTransitionError(project)) {
                        TransitionError error = bundleTransition.getError(project);
                        if (error == TransitionError.DEPENDENCY) {
                            return warningImage;
                        } else if (error == TransitionError.INCOMPLETE) {
                            return errorImage;
                        } else if (error == TransitionError.BUILD) {
                            return warningImage;
                        } else {
                            return errorImage;
                        }
                    } else if (bundleTransition.getTransition(project) == Transition.EXTERNAL) {
                        return pendingImage;
                    } else if (null != bundle && bundleCommand.getBundleRevisions(bundle).size() > 1) {
                        return pendingImage;
                    } else if (isProjectActivated && (bundleCommand.getState(bundle) & (Bundle.RESOLVED)) != 0
                            && !BundleSorter.isFragment(bundle)) {
                        return pendingImage;
                    } else if (isProjectActivated && (bundleCommand.getState(bundle) & (Bundle.STARTING)) != 0) {
                        return pendingImage;
                    } else {
                        if (isProjectActivated) {
                            if ((bundleCommand.getState(bundle) & (Bundle.UNINSTALLED | Bundle.INSTALLED
                                    | Bundle.RESOLVED | Bundle.STOPPING)) != 0) {
                                return pendingImage;
                            } else {
                                return activatedImage;
                            }
                        } else {
                            return deactivatedImage;
                        }
                    }
                } catch (ProjectLocationException e) {
                    return errorImage;
                }
            }
        });
        final TableColumn tableColumn = viewerColumn.getColumn();
        tableColumn.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                BUNDLE_ORDER *= -1;
                ViewerComparator comparator = getViewerComparator(BUNDLE);
                viewer.setComparator(comparator);
                setColumnSorting(tableColumn, BUNDLE_ORDER);
            }
        });
    }

    /**
     * Try without the mode column. To many columns in list view
     */
    private void createModeColumn() {

        TableViewerColumn viewerColumn = createTableViewerColumn("Mode", 0, 1); //$NON-NLS-1$
        viewerColumn.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof BundleProperties) {
                    return ((BundleProperties) element).getActivationMode();
                }
                return null;
            }
        });
        final TableColumn tableColumn = viewerColumn.getColumn();
        tableColumn.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                MODE_ORDER *= -1;
                ViewerComparator comparator = getViewerComparator(MODE);
                viewer.setComparator(comparator);
                setColumnSorting(tableColumn, MODE_ORDER);
            }
        });
    }

    /**
     * Crate a bundle status table viewer column, enable sorting and return image and column values through a
     * column label provider
     * 
     * @see BundleProperties#getBundleStatus()
     */
    private void createStatusColumn() {

        TableViewerColumn viewerColumn = createTableViewerColumn("Status", 100, 2); //$NON-NLS-1$
        viewerColumn.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof BundleProperties) {
                    return ((BundleProperties) element).getBundleStatus();
                }
                return null;
            }
        });
        final TableColumn tableColumn = viewerColumn.getColumn();
        tableColumn.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                STATUS_ORDER *= -1;
                ViewerComparator comparator = getViewerComparator(STATUS);
                viewer.setComparator(comparator);
                setColumnSorting(tableColumn, STATUS_ORDER);
            }
        });
    }

    private void createStateColumn() {

        TableViewerColumn viewerColumn = createTableViewerColumn("State", 100, 3); //$NON-NLS-1$
        viewerColumn.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof BundleProperties) {
                    return ((BundleProperties) element).getBundleState();
                }
                return null;
            }
        });
        final TableColumn tableColumn = viewerColumn.getColumn();
        tableColumn.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                STATE_ORDER *= -1;
                ViewerComparator comparator = getViewerComparator(STATE);
                viewer.setComparator(comparator);
                setColumnSorting(tableColumn, STATE_ORDER);
            }
        });
    }

    private void createTransitionColumn() {

        TableViewerColumn viewerColumn = createTableViewerColumn("Transition", 100, 4); //$NON-NLS-1$
        viewerColumn.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof BundleProperties) {
                    return ((BundleProperties) element).getLastTransition();
                }
                return null;
            }
        });
        final TableColumn tableColumn = viewerColumn.getColumn();
        tableColumn.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                TRANSITION_ORDER *= -1;
                ViewerComparator comparator = getViewerComparator(TRANSITION);
                viewer.setComparator(comparator);
                setColumnSorting(tableColumn, TRANSITION_ORDER);
            }
        });
    }

    private TableViewerColumn createTableViewerColumn(String title, int bound, final int colNumber) {
        final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.LEFT);
        final TableColumn column = viewerColumn.getColumn();
        column.setText(title);
        column.setWidth(bound);
        column.setResizable(true);
        column.setMoveable(true);
        return viewerColumn;
    }

    private ViewerComparator getViewerComparator(byte sortType) {

        if (sortType == MODE) {
            return new ViewerComparator() {
                @Override
                @SuppressWarnings("unchecked")
                public int compare(Viewer viewer, Object e1, Object e2) {
                    if ((e1 instanceof BundleProperties) && (e2 instanceof BundleProperties)) {
                        return getComparator().compare(((BundleProperties) e1).getActivationMode(),
                                ((BundleProperties) e2).getActivationMode()) * MODE_ORDER;
                    }
                    return 0;
                }
            };
        } else if (sortType == STATE) {
            return new ViewerComparator() {
                @Override
                @SuppressWarnings("unchecked")
                public int compare(Viewer viewer, Object e1, Object e2) {
                    if ((e1 instanceof BundleProperties) && (e2 instanceof BundleProperties)) {
                        return getComparator().compare(((BundleProperties) e1).getBundleState(),
                                ((BundleProperties) e2).getBundleState()) * STATE_ORDER;
                    }
                    return 0;
                }
            };
        } else if (sortType == TRANSITION) {
            return new ViewerComparator() {
                @Override
                @SuppressWarnings("unchecked")
                public int compare(Viewer viewer, Object e1, Object e2) {
                    if ((e1 instanceof BundleProperties) && (e2 instanceof BundleProperties)) {
                        return getComparator().compare(((BundleProperties) e1).getLastTransition(),
                                ((BundleProperties) e2).getLastTransition()) * TRANSITION_ORDER;
                    }
                    return 0;
                }
            };
        } else if (sortType == STATUS) {
            return new ViewerComparator() {
                @Override
                @SuppressWarnings("unchecked")
                public int compare(Viewer viewer, Object e1, Object e2) {
                    if ((e1 instanceof BundleProperties) && (e2 instanceof BundleProperties)) {
                        return getComparator().compare(((BundleProperties) e1).getBundleStatus(),
                                ((BundleProperties) e2).getBundleStatus()) * STATUS_ORDER;
                    }
                    return 0;
                }
            };
        } else { // sort type is BUNDLE
            return new ViewerComparator() {
                @Override
                @SuppressWarnings("unchecked")
                public int compare(Viewer viewer, Object e1, Object e2) {
                    if ((e1 instanceof BundleProperties) && (e2 instanceof BundleProperties)) {
                        return getComparator().compare(((BundleProperties) e1).getSymbolicName(),
                                ((BundleProperties) e2).getSymbolicName()) * BUNDLE_ORDER;
                    }
                    return 0;
                }
            };
        }
    }

    private void setColumnSorting(TableColumn column, int order) {
        Table table = viewer.getTable();
        table.setSortColumn(column);
        table.setSortDirection(order == ASCENDING ? SWT.UP : SWT.DOWN);
    }

    @Override
    public void dispose() {
        activatedImage.dispose();
        errorImage.dispose();
        pendingImage.dispose();
        deactivatedImage.dispose();
        warningImage.dispose();
        super.dispose();
    }
}