/*******************************************************************************
* 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.common.model.impl;
import java.util.*;
import org.jboss.tools.common.model.*;
public class OrderedChildren extends RegularChildren {
protected XModelObject[] list = EMPTY;
protected List<XModelObject> alist = new ArrayList<XModelObject>();
public OrderedChildren() {}
public boolean areChildrenOrdered() {
return true;
}
public void clear() {
super.clear();
if(size() > 0) synchronized (this) {
alist.clear();
list = EMPTY;
}
}
public XModelObject[] getObjects() {
if(list == null) synchronized (this) {
list = alist.toArray(new XModelObject[0]);
}
return list;
}
public boolean addObject(XModelObject o) {
if(!super.addObject(o)) return false;
synchronized (this) {
alist.add(o);
list = null;
}
return true;
}
public boolean removeObject(XModelObject o) {
if(!super.removeObject(o)) return false;
int i = getIndex(o);
if(i >= 0) synchronized (this) {
if(alist.size() == 1) {
list = EMPTY;
alist.clear();
} else {
alist.remove(i);
list = null;
}
}
return true;
}
public synchronized int getIndex(XModelObject o) {
return alist.indexOf(o);
}
public synchronized boolean move(int from, int to) {
int size = size();
if(size == 0) throw new IndexOutOfBoundsException();
if(to >= size) to = size - 1;
if(from < 0 || from >= size || from == to) return false;
XModelObject o = alist.get(from);
int delta = to > from ? 1 : -1;
for (int k = from; k != to; k += delta) {
alist.set(k, alist.get(k + delta));
if(list != null) list[k] = list[k + delta];
}
alist.set(to, o);
if(list != null) list[to] = o;
return true;
}
public void sort(Comparator<XModelObject> c) {
if(c == null) c = comparator;
if(c == null) return;
getObjects();
synchronized(this) {
Arrays.sort(list, c);
alist = asList(list);
}
}
public void replaceChildren(XModelObject[] objects) {
super.replaceChildren(objects);
synchronized (this) {
alist = asList(objects);
list = null;
}
}
private List<XModelObject> asList(XModelObject[] objects) {
ArrayList<XModelObject> n = new ArrayList<XModelObject>();
for (int i = 0; i < objects.length; i++) {
n.add(objects[i]);
}
return n;
}
}