org.eclipse.emf.ecp.internal.ui.composites.CheckedEStructuralFeatureCompositeImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.ecp.internal.ui.composites.CheckedEStructuralFeatureCompositeImpl.java

Source

/*******************************************************************************
 * Copyright (c) 2011-2013 EclipseSource Muenchen GmbH 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:
 * Johannes Faltermeier - initial API and implementation
 ******************************************************************************/
package org.eclipse.emf.ecp.internal.ui.composites;

import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.emf.ecp.internal.ui.Messages;
import org.eclipse.emf.ecp.ui.common.CheckedEStructuralFeatureComposite;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ICheckStateProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;

/**
 * This class provides a list with {@link org.eclipse.emf.ecore.EStructuralFeature EStructuralFeature}s that can be
 * selected with a checkbox.
 * 
 * @author jfaltermeier
 * 
 */
public class CheckedEStructuralFeatureCompositeImpl extends SelectModelElementCompositeImpl
        implements CheckedEStructuralFeatureComposite {

    private final Object[] input;
    private FilteredViewerContentProvider provider;
    private final Map<Object, Boolean> objectToCheckedMap;

    /**
     * Constructor.
     * 
     * @param input the input for the viewer
     */
    public CheckedEStructuralFeatureCompositeImpl(Object input) {
        super(input);
        this.input = (Object[]) input;
        objectToCheckedMap = new LinkedHashMap<Object, Boolean>();
    }

    /**
     * {@inheritDoc}.
     * 
     * @see org.eclipse.emf.ecp.internal.ui.composites.AbstractFilteredSelectionComposite#createUI(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public Composite createUI(Composite parent) {
        final Composite composite = super.createUI(parent);
        final Composite buttons = new Composite(composite, SWT.NONE);
        GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(true).applyTo(buttons);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).span(2, 1).applyTo(buttons);

        final Button buttonAll = new Button(buttons, SWT.PUSH);
        buttonAll.setText(Messages.CheckedModelElementHelper_SelectAllLabel);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(buttonAll);
        buttonAll.addSelectionListener(new SelectionAdapter() {
            private static final long serialVersionUID = 13806279721956126L;

            @Override
            public void widgetSelected(SelectionEvent e) {
                getViewer().setCheckedElements(input);
                provider.setCheckStateForAll(true);
            }
        });

        final Button buttonNone = new Button(buttons, SWT.PUSH);
        buttonNone.setText(Messages.CheckedModelElementHelper_DeselectAllLabel);
        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(buttonNone);
        buttonNone.addSelectionListener(new SelectionAdapter() {
            private static final long serialVersionUID = 709950696987260126L;

            @Override
            public void widgetSelected(SelectionEvent e) {
                getViewer().setCheckedElements(new Object[0]);
                provider.setCheckStateForAll(false);
            }
        });

        return composite;
    }

    /**
     * 
     * {@inheritDoc}
     * 
     * @see org.eclipse.emf.ecp.internal.ui.composites.SelectModelElementCompositeImpl#createViewer(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected CheckboxTableViewer createViewer(Composite composite) {
        final CheckboxTableViewer tableViewer = CheckboxTableViewer.newCheckList(composite,
                SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
        tableViewer.setLabelProvider(getLabelProvider());
        provider = new FilteredViewerContentProvider(tableViewer);
        tableViewer.setContentProvider(provider);
        tableViewer.setCheckStateProvider(provider);
        tableViewer.setInput(getInput());
        return tableViewer;
    }

    /**
     * {@inheritDoc}
     * 
     * @see org.eclipse.emf.ecp.internal.ui.composites.AbstractFilteredSelectionComposite#getViewer()
     */
    @Override
    public CheckboxTableViewer getViewer() {
        return (CheckboxTableViewer) super.getViewer();
    }

    /**
     * {@inheritDoc}
     * 
     * @see org.eclipse.emf.ecp.internal.ui.composites.AbstractFilteredSelectionComposite#getSelection()
     */
    @Override
    public Object[] getSelection() {
        final List<Object> result = new ArrayList<Object>();
        for (int i = 0; i < input.length; i++) {
            final Object cur = input[i];
            if (objectToCheckedMap.containsKey(cur) && objectToCheckedMap.get(cur)) {
                result.add(cur);
            }
        }
        return result.toArray();
    }

    /**
     * {@link IStructuredContentProvider} that also handles the checked state of a viewer with a filter.
     * 
     * @author jfaltermeier
     * 
     */
    private class FilteredViewerContentProvider implements IStructuredContentProvider, ICheckStateProvider {

        public FilteredViewerContentProvider(CheckboxTableViewer viewer) {
            viewer.addCheckStateListener(new ICheckStateListener() {
                public void checkStateChanged(CheckStateChangedEvent event) {
                    objectToCheckedMap.put(event.getElement(), event.getChecked());
                }
            });
        }

        /**
         * {@inheritDoc}
         * 
         * @see org.eclipse.jface.viewers.ICheckStateProvider#isChecked(java.lang.Object)
         */
        public boolean isChecked(Object element) {
            return getCheckedState(element);
        }

        private boolean getCheckedState(Object element) {
            if (!objectToCheckedMap.containsKey(element)) {
                objectToCheckedMap.put(element, Boolean.FALSE);
            }
            return objectToCheckedMap.get(element);
        }

        /**
         * {@inheritDoc}
         * 
         * @see org.eclipse.jface.viewers.ICheckStateProvider#isGrayed(java.lang.Object)
         */
        public boolean isGrayed(Object element) {
            return false;
        }

        public void setCheckStateForAll(boolean state) {
            final Set<Object> keySet = objectToCheckedMap.keySet();
            for (final Object o : keySet) {
                objectToCheckedMap.put(o, state);
            }
        }

        /**
         * {@inheritDoc}
         * 
         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
         */
        public void dispose() {
            // nothing to dispose
        }

        /**
         * {@inheritDoc}
         * 
         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
         *      java.lang.Object, java.lang.Object)
         */
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            // ignore until actually needed =)
        }

        /**
         * {@inheritDoc}
         * 
         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
         */
        @SuppressWarnings("rawtypes")
        public Object[] getElements(Object inputElement) {
            // Copied from ArrayContentProvider since its illegal to extend it
            if (inputElement instanceof Object[]) {
                return (Object[]) inputElement;
            }
            if (inputElement instanceof Collection) {
                return ((Collection) inputElement).toArray();
            }
            return new Object[0];
        }

    }

}