blob: 75407553e629ae95f706fe4efd21cdf43fba83c2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2008 Oracle Corporation 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:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.common.internal.policy;
import java.util.List;
/**
* Provides a list of order, enablement-modifiable objects.
*
* @author cbateman
*
*/
public abstract class OrderedListProvider
{
private List<OrderableObject> _orderableObjects;
/**
*
* @return the list of ordered objects
*/
public final List<OrderableObject> getOrderedObjects()
{
if (_orderableObjects == null)
{
_orderableObjects = createAndPopulateOrderedObjects();
}
return _orderableObjects;
}
/**
* <p>Clears the orderableObjects collection so that the next call
* of getOrderedObjects() </p>
*/
public final void resetOrderedObjects()
{
_orderableObjects = null;
}
/**
* Move the object one toward the front of the list
*
* @param object
*/
public final void moveUp(final OrderableObject object)
{
final List<OrderableObject> list = getOrderedObjects();
final int index = list.indexOf(object);
if (index > 0)
{
OrderableObject item = list.remove(index);
list.add(index - 1, item);
}
}
/**
* Move the object one toward the end
* @param object
*/
public final void moveDown(final OrderableObject object)
{
final List<OrderableObject> list = getOrderedObjects();
int index = list.indexOf(object);
if (index < list.size() - 1)
{
OrderableObject item = list.remove(index);
list.add(index + 1, item);
}
}
/**
* @return a new list orderable objects populate in their initial order
* The list must be modifiable.
*/
protected abstract List<OrderableObject> createAndPopulateOrderedObjects();
/**
* Proxy object for ordering in list
*
* @author cbateman
*
*/
public static class OrderableObject implements Cloneable
{
private boolean _enabled;
private Object _object;
/**
* @param object
* @param enabled
*/
public OrderableObject(final Object object, final boolean enabled)
{
_object = object;
_enabled = enabled;
}
private OrderableObject(final OrderableObject copyMe)
{
_object = copyMe._object;
_enabled = copyMe._enabled;
}
/**
* @return true if this object is enabled
*/
public boolean isEnabled()
{
return _enabled;
}
/**
* @param enabled
*/
public void setEnabled(boolean enabled)
{
_enabled = enabled;
}
/**
* @return the object in the ordered list
*/
public Object getObject()
{
return _object;
}
/**
* @param object
*/
public void setObject(Object object)
{
_object = object;
}
@Override
public OrderableObject clone()
{
return new OrderableObject(this);
}
@Override
public boolean equals(Object obj)
{
if (obj instanceof OrderableObject)
{
if (_enabled == ((OrderableObject)obj)._enabled)
{
Object other = ((OrderableObject)obj)._object;
if (other != null)
{
return other.equals(_object);
}
return _object == null;
}
}
return false;
}
@Override
public int hashCode()
{
int enabledCode = _enabled ? 0xcccccccc : 0x33333333;
if (_object == null)
{
return enabledCode;
}
return _object.hashCode() ^ enabledCode;
}
}
}