/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.ui.editor.model.impl;
import java.util.*;
import java.beans.*;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.jsf.ui.editor.model.IPage;
import org.jboss.tools.jsf.ui.editor.model.IJSFElement;
import org.jboss.tools.jsf.ui.editor.model.IJSFElementList;
import org.jboss.tools.jsf.ui.editor.model.IJSFElementListListener;
public class JSFElementList extends JSFElement implements IJSFElementList, VetoableChangeListener{
List<IJSFElementListListener> listeners = new Vector<IJSFElementListListener>();
List<Object> elements = new Vector<Object>();
boolean elementListListenerEnable = true;
boolean allowDuplicate = false;
public JSFElementList() {
}
public JSFElementList(IJSFElement parent) {
super(parent);
}
public JSFElementList(IJSFElement parent, XModelObject source) {
super(parent, source);
}
public List getElements() {
return elements;
}
public JSFElementList(List<Object> vector) {
elements = vector;
}
public void dispose() {
super.dispose();
if (listeners != null)
listeners.clear();
listeners = null;
if (elements != null)
elements.clear();
elements = null;
}
public void setAllowDuplicate(boolean set) {
allowDuplicate = set;
}
public boolean isAllowDuplicate() {
return allowDuplicate;
}
public void moveTo(Object object, int index) {
int currentIndex = indexOf(object);
if (index < 0 || index >= size())
return;
if (currentIndex > index) { // move down
for (int i = currentIndex - 1; i >= index; i--) {
Object elementAt = get(i);
set(i + 1, elementAt);
}
set(index, object);
this.fireElementMoved((IJSFElement) object, index, currentIndex);
} else if (currentIndex < index) { // move up
for (int i = currentIndex + 1; i <= index; i++) {
Object elementAt = get(i);
set(i - 1, elementAt);
}
set(index, object);
this.fireElementMoved((IJSFElement) object, index, currentIndex);
}
}
public void moveUp(Object object) {
int currentIndex = indexOf(object);
if (currentIndex == 0)
return;
set(currentIndex, get(currentIndex - 1));
set(currentIndex - 1, object);
this.fireElementMoved((IJSFElement) object, currentIndex - 1,
currentIndex);
}
public void moveDown(Object object) {
int currentIndex = indexOf(object);
if (currentIndex == size())
return;
set(currentIndex, get(currentIndex + 1));
set(currentIndex + 1, object);
this.fireElementMoved((IJSFElement) object, currentIndex + 1,
currentIndex);
}
public int size() {
return elements.size();
}
public boolean isEmpty() {
return elements.isEmpty();
}
public boolean contains(Object o) {
return elements.contains(o);
}
public Iterator iterator() {
return elements.iterator();
}
public Object[] toArray() {
return elements.toArray();
}
public Object[] toArray(Object a[]) {
return elements.toArray(a);
}
public boolean add(Object o) {
boolean result = (o instanceof IJSFElement) && elements.add(o);
return result;
}
public void add(IJSFElementList list) {
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
if (o instanceof JSFElement) {
add(o);
}
}
}
public boolean remove(Object o) {
boolean result = elements.remove(o);
return result;
}
public void remove(Comparator comp) {
for (int i = size() - 1; i >= 0; i--) {
if (comp.equals(get(i))) {
remove(get(i));
}
;
}
}
public void removeAll() {
for (int i = size() - 1; i >= 0; i--) {
remove(get(i));
}
}
public Object get(int index) {
return elements.get(index);
}
public Object get(String name) {
if (name == null)
return null;
for (int i = 0; i < elements.size(); i++) {
JSFElement element = (JSFElement) elements.get(i);
if (name.equals(element.getPath()))
return element;
}
return null;
}
public Object set(int index, Object element) {
Object newElement = elements.set(index, element);
return newElement;
}
public void add(int index, Object element) {
elements.add(index, element);
}
public int indexOf(Object o) {
return elements.indexOf(o);
}
public IJSFElement findElement(Comparator comparator) {
return null;
}
public IJSFElementList findElements(Comparator comparator) {
return null;
}
public String getText() {
return toString();
}
public Object clone() {
List<Object> copy = new Vector<Object>();
copy.addAll(elements);
JSFElementList clone = new JSFElementList(copy);
return clone;
}
public JSFElementList getClone() {
JSFElementList list = (JSFElementList) clone();
return list;
}
public void vetoableChange(PropertyChangeEvent evt)
throws PropertyVetoException {
}
public void addJSFElementListListener(IJSFElementListListener l) {
listeners.add(l);
}
public void removeJSFElementListListener(IJSFElementListListener l) {
listeners.remove(l);
}
protected void fireElementMoved(IJSFElement element, int newIndex,
int oldIndex) {
for (int i = 0; i < listeners.size(); i++) {
IJSFElementListListener listener = (IJSFElementListListener) listeners
.get(i);
if (listener != null && listener.isElementListListenerEnable())
listener.listElementMove(this, element, newIndex, oldIndex);
}
((JSFModel) getJSFModel()).fireElementRemoved(element, oldIndex);
((JSFModel) getJSFModel()).fireElementInserted(element);
}
protected void fireElementAdded(IJSFElement element, int index) {
for (int i = 0; i < listeners.size(); i++) {
IJSFElementListListener listener = (IJSFElementListListener) listeners
.get(i);
if (listener != null && listener.isElementListListenerEnable())
listener.listElementAdd(this, element, index);
}
}
protected void fireElementRemoved(IJSFElement element, int index) {
for (int i = 0; i < listeners.size(); i++) {
IJSFElementListListener listener = (IJSFElementListListener) listeners
.get(i);
if (listener != null && listener.isElementListListenerEnable())
listener.listElementRemove(this, element, index);
}
}
protected void fireElementChanged(IJSFElement element, int index,
PropertyChangeEvent event) {
for (int i = 0; i < listeners.size(); i++) {
IJSFElementListListener listener = (IJSFElementListListener) listeners
.get(i);
if (listener != null && listener.isElementListListenerEnable())
listener.listElementChange(this, element, index, event);
}
}
public void remove(int index) {
Object obj = elements.get(index);
elements.remove(obj);
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class Comp implements Comparator {
String name;
public Comp(String name) {
this.name = name;
}
public int compare(Object o1, Object o2) {
return 0;
}
public boolean equals(Object obj) {
if (obj instanceof IJSFElement) {
IJSFElement element = (IJSFElement) obj;
return element.getName().equals(name);
}
return false;
}
}
class MessageNameComparator implements Comparator {
String message;
public MessageNameComparator(String message) {
this.message = message;
}
public int compare(Object obj1, Object obj2) {
return 0;
}
public boolean equals(Object obj) {
if (obj instanceof IPage) {
IPage message = (IPage) obj;
return message.getName().equals(this.message);
}
return false;
}
}
class ForwardComparator implements Comparator {
Page message;
public ForwardComparator(Page message) {
this.message = message;
}
public int compare(Object obj1, Object obj2) {
return 0;
}
public boolean equals(Object obj) {
if (obj instanceof IPage) {
IPage message = (IPage) obj;
return message.getName().equals(this.message.getName())
&& message.getParentJSFElement().getName().equals(
this.message.getParentJSFElement().getName());
}
return false;
}
}
class TransitionComparator implements Comparator {
IPage messageFrom;
IPage messageTo;
public TransitionComparator(IPage messageFrom, IPage messageTo) {
this.messageFrom = messageFrom;
this.messageTo = messageTo;
}
public boolean equals(Object transition) {
return false;
}
public int compare(Object obj1, Object obj2) {
return 0;
}
}
class ElementNameComparator implements Comparator {
String elementName;
public ElementNameComparator(String elementName) {
this.elementName = elementName;
}
public void setName(String name) {
elementName = name;
}
public boolean equals(Object object) {
if (object instanceof JSFElement) {
JSFElement unit = (JSFElement) object;
return unit.getName().equals(elementName);
}
return false;
}
public int compare(Object obj1, Object obj2) {
return 0;
}
}
class TransitionForwardComparator implements Comparator {
IPage message;
public TransitionForwardComparator(IPage message) {
this.message = message;
}
public int compare(Object obj1, Object obj2) {
return 0;
}
public boolean equals(Object obj) {
return false;
}
}