| /** |
| * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany) |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Florian Pirchner - Initial implementation |
| */ |
| package org.eclipse.osbp.runtime.web.vaadin.databinding.values; |
| |
| import java.util.ArrayList; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Set; |
| |
| import org.eclipse.core.databinding.observable.Diffs; |
| import org.eclipse.core.databinding.observable.list.IListChangeListener; |
| import org.eclipse.core.databinding.observable.list.ListChangeEvent; |
| import org.eclipse.core.databinding.observable.list.ListDiffEntry; |
| import org.eclipse.core.databinding.observable.list.WritableList; |
| import org.eclipse.core.databinding.observable.set.IObservableSet; |
| import org.eclipse.core.databinding.observable.set.ISetChangeListener; |
| import org.eclipse.core.databinding.observable.set.SetChangeEvent; |
| |
| // TODO: Auto-generated Javadoc |
| /** |
| * The Class SetToListAdapter. |
| */ |
| @SuppressWarnings({ "rawtypes", "unchecked" }) |
| public class SetToListAdapter extends WritableList implements |
| IVaadinObservableList, IListChangeListener { |
| |
| /** The set. */ |
| private final IObservableSet set; |
| |
| /** The source. */ |
| private final Object source; |
| |
| /** The set listener. */ |
| private ISetChangeListener setListener = new ISetChangeListener() { |
| public void handleSetChange(SetChangeEvent event) { |
| List originalList = new ArrayList(wrappedList); |
| for (Object addedElement : event.diff.getAdditions()) { |
| if (!wrappedList.contains(addedElement)) { |
| wrappedList.add(addedElement); |
| } |
| } |
| for (Object removedElement : event.diff.getRemovals()) { |
| wrappedList.remove(removedElement); |
| } |
| fireListChange(Diffs.computeListDiff(originalList, wrappedList)); |
| } |
| }; |
| |
| /** |
| * Instantiates a new sets the to list adapter. |
| * |
| * @param set |
| * the set |
| * @param source |
| * the source |
| */ |
| public SetToListAdapter(IObservableSet set, Object source) { |
| super(set.getRealm(), new ArrayList(), set.getElementType()); |
| this.set = set; |
| this.source = source; |
| wrappedList.addAll(set); |
| this.set.addSetChangeListener(setListener); |
| this.addListChangeListener(this); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.core.databinding.observable.list.ObservableList#dispose() |
| */ |
| public synchronized void dispose() { |
| super.dispose(); |
| |
| this.removeListChangeListener(this); |
| |
| if (set != null && setListener != null) { |
| set.removeSetChangeListener(setListener); |
| setListener = null; |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.osbp.runtime.web.vaadin.databinding.values.IVaadinObservableList#getSource() |
| */ |
| @Override |
| public Object getSource() { |
| return source; |
| } |
| |
| /** |
| * Observes changes of this instance of the list and transforms it to |
| * changes for the set. Set listeners are beeing detached during update. |
| * |
| * @param event |
| * the event |
| */ |
| @Override |
| public void handleListChange(ListChangeEvent event) { |
| |
| try { |
| Set<Object> addons = new HashSet<Object>(); |
| Set<Object> removals = new HashSet<Object>(); |
| |
| set.removeSetChangeListener(setListener); |
| ListDiffEntry[] differences = event.diff.getDifferences(); |
| for (int i = 0; i < differences.length; i++) { |
| ListDiffEntry entry = differences[i]; |
| Object element = entry.getElement(); |
| if (entry.isAddition()) { |
| addons.add(element); |
| } else { |
| removals.add(element); |
| } |
| } |
| |
| // remove double entries |
| addons.removeAll(removals); |
| |
| set.addAll(addons); |
| set.removeAll(removals); |
| } finally { |
| set.addSetChangeListener(setListener); |
| } |
| } |
| |
| } |