blob: 287a76a6f7e3fb980988beb80f9230294f640368 [file] [log] [blame]
/**
* 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);
}
}
}