view org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/SelectionProviderMultipleSelectionObservableList.d @ 78:0a55d2d5a946

Added file for databinding
author Frank Benoit <benoit@tionex.de>
date Tue, 14 Apr 2009 11:35:29 +0200
parents
children 6be48cf9f95c
line wrap: on
line source

/*******************************************************************************
 * Copyright (c) 2007 Peter Centgraf 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:
 *     Peter Centgraf - initial API and implementation, bug 124683
 *     Boris Bokowski, IBM Corporation - initial API and implementation
 *******************************************************************************/
module org.eclipse.jface.internal.databinding.viewers.SelectionProviderMultipleSelectionObservableList;

import java.lang.all;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.core.databinding.observable.Diffs;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.list.ListDiff;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;

/**
 * Observes multiple-selection of an {@link ISelectionProvider}.
 * 
 * @since 1.2
 */
public class SelectionProviderMultipleSelectionObservableList :
        WritableList {

    protected ISelectionProvider selectionProvider;
    protected bool handlingSelection;
    protected bool updating;
    protected SelectionListener selectionListener = new SelectionListener();

    class SelectionListener : ISelectionChangedListener {
        public void selectionChanged(SelectionChangedEvent event) {
            if (updating) {
                return;
            }
            handlingSelection = true;
            try {
                updateWrappedList(new ArrayList(getSelectionList(event.getSelection())));
            } finally {
                handlingSelection = false;
            }
        }
    }

    /**
     * Create a new observable list based on the current selection of the given
     * selection provider. Assumes that the selection provider provides
     * structured selections.
     * 
     * @param realm
     * @param selectionProvider
     * @param elementType
     */
    public this(Realm realm,
            ISelectionProvider selectionProvider, Object elementType) {
        super(realm, new ArrayList(getSelectionList(selectionProvider)), elementType);
        this.selectionProvider = selectionProvider;
        selectionProvider.addSelectionChangedListener(selectionListener);
    }

    protected void fireListChange(ListDiff diff) {
        if (handlingSelection) {
            super.fireListChange(diff);
        } else {
            // this is a bit of a hack - we are changing the diff to match the order
            // of elements returned by the selection provider after we've set the
            // selection.
            updating = true;
            try {
                List oldList = getSelectionList(selectionProvider);
                selectionProvider
                        .setSelection(new StructuredSelection(wrappedList));
                wrappedList = new ArrayList(getSelectionList(selectionProvider));
                super.fireListChange(Diffs.computeListDiff(oldList, wrappedList));
            } finally {
                updating = false;
            }
        }
    }

    protected static List getSelectionList(ISelectionProvider selectionProvider) {
        if (selectionProvider is null) {
            throw new IllegalArgumentException();
        }
        return getSelectionList(selectionProvider.getSelection());
    }

    protected static List getSelectionList(ISelection sel) {
        if (null !is cast(IStructuredSelection)sel) {
            return (cast(IStructuredSelection) sel).toList();
        }
        return Collections.EMPTY_LIST;
    }

    public synchronized void dispose() {
        selectionProvider.removeSelectionChangedListener(selectionListener);
        selectionProvider = null;
        super.dispose();
    }
}