diff options
Diffstat (limited to 'common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/ListValueModelWrapper.java')
-rw-r--r-- | common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/ListValueModelWrapper.java | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/ListValueModelWrapper.java b/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/ListValueModelWrapper.java new file mode 100644 index 0000000000..7e01a399f3 --- /dev/null +++ b/common/plugins/org.eclipse.jpt.common.utility/src/org/eclipse/jpt/common/utility/internal/model/value/ListValueModelWrapper.java @@ -0,0 +1,164 @@ +/******************************************************************************* + * Copyright (c) 2007, 2009 Oracle. 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: + * Oracle - initial API and implementation + ******************************************************************************/ +package org.eclipse.jpt.common.utility.internal.model.value; + +import org.eclipse.jpt.common.utility.model.event.ListAddEvent; +import org.eclipse.jpt.common.utility.model.event.ListChangeEvent; +import org.eclipse.jpt.common.utility.model.event.ListClearEvent; +import org.eclipse.jpt.common.utility.model.event.ListMoveEvent; +import org.eclipse.jpt.common.utility.model.event.ListRemoveEvent; +import org.eclipse.jpt.common.utility.model.event.ListReplaceEvent; +import org.eclipse.jpt.common.utility.model.listener.ListChangeListener; +import org.eclipse.jpt.common.utility.model.value.ListValueModel; + +/** + * This abstract class provides the infrastructure needed to wrap + * another list value model, "lazily" listen to it, and propagate + * its change notifications. Subclasses must implement the appropriate + * {@link ListValueModel}. + */ +public abstract class ListValueModelWrapper<E> + extends AbstractListValueModel +{ + /** The wrapped list value model. */ + protected final ListValueModel<? extends E> listHolder; + + /** A listener that allows us to synch with changes to the wrapped list holder. */ + protected final ListChangeListener listChangeListener; + + + // ********** constructors ********** + + /** + * Construct a list value model with the specified wrapped + * list value model. + */ + protected ListValueModelWrapper(ListValueModel<? extends E> listHolder) { + super(); + if (listHolder == null) { + throw new NullPointerException(); + } + this.listHolder = listHolder; + this.listChangeListener = this.buildListChangeListener(); + } + + + // ********** initialization ********** + + protected ListChangeListener buildListChangeListener() { + return new ListChangeListener() { + public void itemsAdded(ListAddEvent event) { + ListValueModelWrapper.this.itemsAdded(event); + } + public void itemsRemoved(ListRemoveEvent event) { + ListValueModelWrapper.this.itemsRemoved(event); + } + public void itemsReplaced(ListReplaceEvent event) { + ListValueModelWrapper.this.itemsReplaced(event); + } + public void itemsMoved(ListMoveEvent event) { + ListValueModelWrapper.this.itemsMoved(event); + } + public void listCleared(ListClearEvent event) { + ListValueModelWrapper.this.listCleared(event); + } + public void listChanged(ListChangeEvent event) { + ListValueModelWrapper.this.listChanged(event); + } + @Override + public String toString() { + return "list change listener"; //$NON-NLS-1$ + } + }; + } + + + // ********** behavior ********** + + /** + * Start listening to the list holder. + */ + @Override + protected void engageModel() { + this.listHolder.addListChangeListener(ListValueModel.LIST_VALUES, this.listChangeListener); + } + + /** + * Stop listening to the list holder. + */ + @Override + protected void disengageModel() { + this.listHolder.removeListChangeListener(ListValueModel.LIST_VALUES, this.listChangeListener); + } + + // minimized scope of suppressed warnings + @SuppressWarnings("unchecked") + protected Iterable<E> getItems(ListAddEvent event) { + return (Iterable<E>) event.getItems(); + } + + // minimized scope of suppressed warnings + @SuppressWarnings("unchecked") + protected Iterable<E> getItems(ListRemoveEvent event) { + return (Iterable<E>) event.getItems(); + } + + // minimized scope of suppressed warnings + @SuppressWarnings("unchecked") + protected Iterable<E> getNewItems(ListReplaceEvent event) { + return (Iterable<E>) event.getNewItems(); + } + + // minimized scope of suppressed warnings + @SuppressWarnings("unchecked") + protected Iterable<E> getOldItems(ListReplaceEvent event) { + return (Iterable<E>) event.getOldItems(); + } + + + // ********** list change support ********** + + /** + * Items were added to the wrapped list holder; + * propagate the change notification appropriately. + */ + protected abstract void itemsAdded(ListAddEvent event); + + /** + * Items were removed from the wrapped list holder; + * propagate the change notification appropriately. + */ + protected abstract void itemsRemoved(ListRemoveEvent event); + + /** + * Items were replaced in the wrapped list holder; + * propagate the change notification appropriately. + */ + protected abstract void itemsReplaced(ListReplaceEvent event); + + /** + * Items were moved in the wrapped list holder; + * propagate the change notification appropriately. + */ + protected abstract void itemsMoved(ListMoveEvent event); + + /** + * The wrapped list holder was cleared; + * propagate the change notification appropriately. + */ + protected abstract void listCleared(ListClearEvent event); + + /** + * The value of the wrapped list holder has changed; + * propagate the change notification appropriately. + */ + protected abstract void listChanged(ListChangeEvent event); + +} |