/******************************************************************************* * 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 GroupOrderedChildren extends RegularChildren { protected XModelObject[] list = EMPTY; int[] limits = new int[getGroupCount()]; public GroupOrderedChildren() {} public boolean areChildrenOrdered() { return true; } protected int getGroupCount() { return 2; } protected int getGroup(XModelObject o) { return 0; } public void clear() { super.clear(); if(list != EMPTY) synchronized (this) { list = EMPTY; for (int i = 0; i < limits.length; i++) limits[i] = 0; } } public XModelObject[] getObjects() { return list; } public boolean addObject(XModelObject o) { if(!super.addObject(o)) return false; int g = getGroup(o); int i = limits[g]; synchronized (this) { XModelObject[] ls = new XModelObject[list.length + 1]; System.arraycopy(list, 0, ls, 0, i); ls[i] = o; System.arraycopy(list, i, ls, i + 1, list.length - i); for (int k = g; k < limits.length; k++) limits[k]++; list = ls; } return true; } public boolean removeObject(XModelObject o) { if(!super.removeObject(o)) return false; int i = getIndex(o); if(i >= 0) { if(list.length == 1) { list = EMPTY; } else { XModelObject[] ls = new XModelObject[list.length - 1]; if(i > 0) System.arraycopy(list, 0, ls, 0, i); System.arraycopy(list, i + 1, ls, i, list.length - i - 1); list = ls; } for (int g = 0; g < limits.length; g++) { if(limits[g] > i) limits[g]--; } } return true; } private int getGroup(int i) { for (int g = 0; g < limits.length; g++) { if(limits[g] > i) return g; } return -1; } public int getIndex(XModelObject o) { for (int i = 0; i < list.length; i++) { if(o == list[i]) return i; } return -1; } public boolean move(int from, int to) { int c = list.length; if(c == 0) return false; if(to >= c) to = c - 1; int g = getGroup(from); if(g < 0) return false; int goff = (g == 0) ? 0 : limits[g - 1]; int gend = limits[g]; if(to < goff) to = goff; else if(to >= gend) to = gend - 1; if(from < 0 || from >= c || from == to) return false; XModelObject o = list[from]; int delta = to > from ? 1 : -1; for (int k = from; k != to; k += delta) { list[k] = list[k + delta]; } list[to] = o; return true; } public void sort(Comparator c) {} }