gov.redhawk.sca.ui.ScaPropertiesViewer.java Source code

Java tutorial

Introduction

Here is the source code for gov.redhawk.sca.ui.ScaPropertiesViewer.java

Source

/*******************************************************************************
 * This file is protected by Copyright. 
 * Please refer to the COPYRIGHT file distributed with this source distribution.
 *
 * This file is part of REDHAWK IDE.
 *
 * 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
 *******************************************************************************/
package gov.redhawk.sca.ui;

import gov.redhawk.model.sca.ScaAbstractProperty;
import gov.redhawk.model.sca.commands.ScaModelCommand;
import gov.redhawk.model.sca.util.ModelUtil;
import gov.redhawk.sca.ui.compatibility.ColumnViewerToolTipSupport;
import gov.redhawk.sca.ui.compatibility.CompatibilityUtil;
import gov.redhawk.sca.ui.properties.AbstractPropertyEditingSupport;
import gov.redhawk.sca.ui.properties.ScaPropertiesAdapterFactory;
import gov.redhawk.sca.ui.properties.ScaPropertiesContentProvider;

import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationListener;
import org.eclipse.jface.viewers.ColumnViewerEditorDeactivationEvent;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
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.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.views.properties.IPropertySourceProvider;

/**
 * @since 9.3
 */
public class ScaPropertiesViewer extends Composite {

    private static class PropertyViewerComparator extends ViewerComparator {

        @Override
        public int compare(final Viewer viewer, final Object e1, final Object e2) {
            final Tree tree = ((Tree) viewer.getControl());

            if (tree.getSortDirection() == SWT.UP) {
                return super.compare(viewer, e1, e2);
            } else {
                return -1 * super.compare(viewer, e1, e2);
            }
        }
    }

    private TreeColumnLayout treeColumnLayout;
    private Action revertAction;
    private TreeViewer viewer;
    private AdapterFactory adapterFactory;

    public ScaPropertiesViewer(Composite parent, int style, int treeStyle, AdapterFactory adapterFactory) {
        super(parent, style);
        this.adapterFactory = adapterFactory;
        init(this, treeStyle | SWT.FULL_SELECTION);
    }

    public ScaPropertiesViewer(Composite parent, int style, int treeStyle) {
        this(parent, style, treeStyle, null);
    }

    protected TreeColumnLayout getTreeColumnLayout() {
        return treeColumnLayout;
    }

    protected void init(Composite parent, int style) {
        treeColumnLayout = new TreeColumnLayout();
        parent.setLayout(treeColumnLayout);

        viewer = createTreeViewer(parent, style);

        if (this.adapterFactory == null) {
            adapterFactory = createAdapterFactory();
        }

        ColumnViewerToolTipSupport.enableFor(viewer);

        createActions();

        addEditorActivationListener();

        createContextMenu();

        viewer.setContentProvider(createContentProvider());

        viewer.setComparator(createComparator());
        viewer.getTree().setSortDirection(SWT.UP);

        ILabelProvider rootLabelProvider = createRootLabelProvider();
        viewer.setLabelProvider(rootLabelProvider);

        createPropertyColumn(rootLabelProvider);

        createValueColumn(rootLabelProvider);
    }

    protected TreeViewer createTreeViewer(Composite parent, int style) {
        final Tree tree = new Tree(parent, style | SWT.FULL_SELECTION);
        TreeViewer retVal;
        if ((SWT.CHECK & tree.getStyle()) == SWT.CHECK) {
            retVal = new CheckboxTreeViewer(tree);
        } else {
            retVal = new TreeViewer(tree);
        }
        retVal.getTree().setHeaderVisible(true);
        retVal.getTree().setLinesVisible(true);
        return retVal;
    }

    protected void createValueColumn(ILabelProvider rootLabelProvider) {
        TreeViewerColumn column = new TreeViewerColumn(viewer, SWT.None);
        column.getColumn().setMoveable(false);
        column.getColumn().setResizable(true);
        column.getColumn().setText("Value");
        treeColumnLayout.setColumnData(column.getColumn(),
                new ColumnPixelData(50, column.getColumn().getResizable()));
        column.setLabelProvider(createValueColumnLabelProvider(rootLabelProvider));
        column.setEditingSupport(createValueColumnEditingSupport());
    }

    protected AbstractPropertyEditingSupport createValueColumnEditingSupport() {
        return new ScaPropertiesEditingSupport(getViewer(),
                (IPropertySourceProvider) getViewer().getContentProvider());
    }

    protected CellLabelProvider createValueColumnLabelProvider(ILabelProvider rootLabelProvider) {
        return createPropertyColumnLabelProvider(rootLabelProvider);
    }

    protected TreeViewerColumn createPropertyColumn(ILabelProvider rootLabelProvider) {
        TreeViewerColumn column = new TreeViewerColumn(viewer, SWT.None);
        viewer.getTree().setSortColumn(column.getColumn());
        column.getColumn().setMoveable(false);
        column.getColumn().setResizable(true);
        column.getColumn().setText("Property");
        treeColumnLayout.setColumnData(column.getColumn(),
                new ColumnPixelData(250, column.getColumn().getResizable()));
        column.setLabelProvider(createPropertyColumnLabelProvider(rootLabelProvider));
        column.getColumn().addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent e) {
                final Tree tree = viewer.getTree();
                if (tree.getSortDirection() == SWT.UP) {
                    tree.setSortDirection(SWT.DOWN);
                } else {
                    tree.setSortDirection(SWT.UP);
                }
                viewer.refresh();
            }
        });

        return column;
    }

    protected CellLabelProvider createPropertyColumnLabelProvider(ILabelProvider rootLabelProvider) {
        return new ScaPropertiesViewerColumnLabelProvider(rootLabelProvider);
    }

    protected ILabelProvider createRootLabelProvider() {
        final FontData[] fontData = viewer.getControl().getFont().getFontData();
        for (final FontData d : fontData) {
            CompatibilityUtil.setFontDataStyle(d, SWT.BOLD);
        }
        final Font nonDefaultFont = new Font(Display.getCurrent(), fontData);
        return new ScaModelAdapterFactoryLabelProvider(adapterFactory, viewer) {
            @Override
            public Font getFont(final Object object, final int columnIndex) {
                return getFont(object);
            }

            @Override
            public Font getFont(final Object object) {
                if (object instanceof ScaAbstractProperty<?>) {
                    final ScaAbstractProperty<?> property = (ScaAbstractProperty<?>) object;
                    if (ModelUtil.isSettable(property) && !property.isDefaultValue()) {
                        return nonDefaultFont;
                    }
                }
                return super.getFont(object);
            }

            @Override
            public void dispose() {
                nonDefaultFont.dispose();
                super.dispose();
            }
        };
    }

    protected ViewerComparator createComparator() {
        return new PropertyViewerComparator();
    }

    protected ITreeContentProvider createContentProvider() {
        return new ScaPropertiesContentProvider(adapterFactory);
    }

    protected AdapterFactory createAdapterFactory() {
        return new ScaPropertiesAdapterFactory();
    }

    protected void createContextMenu() {
        final MenuManager menuMgr = new MenuManager("#Popup");
        contributeContextMenuActions(menuMgr);

        final Menu menu = menuMgr.createContextMenu(viewer.getTree());
        viewer.getTree().setMenu(menu);
    }

    protected void contributeContextMenuActions(IMenuManager menuMgr) {
        menuMgr.add(new ActionContributionItem(revertAction));
    }

    protected void addEditorActivationListener() {
        viewer.getColumnViewerEditor().addEditorActivationListener(new ColumnViewerEditorActivationListener() {

            @Override
            public void beforeEditorDeactivated(final ColumnViewerEditorDeactivationEvent event) {

            }

            @Override
            public void beforeEditorActivated(final ColumnViewerEditorActivationEvent event) {

            }

            @Override
            public void afterEditorDeactivated(final ColumnViewerEditorDeactivationEvent event) {
                if (event.eventType == ColumnViewerEditorDeactivationEvent.EDITOR_SAVED) {
                    viewer.refresh();
                    viewer.setSelection(viewer.getSelection());
                }
            }

            @Override
            public void afterEditorActivated(final ColumnViewerEditorActivationEvent event) {

            }
        });
    }

    private void createActions() {
        revertAction = new Action("Revert to default") {
            @Override
            public void run() {
                final IStructuredSelection ss = (IStructuredSelection) viewer.getSelection();
                for (final Object o : ss.toList()) {
                    if (o instanceof ScaAbstractProperty<?>) {
                        final ScaAbstractProperty<?> prop = (ScaAbstractProperty<?>) o;
                        ScaModelCommand.execute(prop, new ScaModelCommand() {
                            @Override
                            public void execute() {
                                prop.restoreDefaultValue();
                            }
                        });
                    }
                }
                viewer.refresh();
                viewer.setSelection(viewer.getSelection());
            }
        };
        revertAction.setImageDescriptor(
                PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_UNDO));
        revertAction.setDisabledImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
                .getImageDescriptor(ISharedImages.IMG_TOOL_UNDO_DISABLED));

        viewer.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(final SelectionChangedEvent event) {
                if (event.getSelection() instanceof IStructuredSelection) {
                    final IStructuredSelection ss = (IStructuredSelection) event.getSelection();
                    boolean enabled = true;
                    for (final Object o : ss.toList()) {
                        if (o instanceof ScaAbstractProperty<?>) {
                            final ScaAbstractProperty<?> prop = (ScaAbstractProperty<?>) o;
                            enabled = !prop.isDefaultValue() && ModelUtil.isSettable(prop);
                        } else {
                            enabled = false;
                        }
                        if (!enabled) {
                            break;
                        }
                    }
                    revertAction.setEnabled(enabled);
                }
            }
        });
    }

    public TreeViewer getViewer() {
        return viewer;
    }

    protected AdapterFactory getAdapterFactory() {
        return adapterFactory;
    }

    protected Action getRevertAction() {
        return revertAction;
    }
}