blob: 904fa021a93bccd625f74ccf5d3f27bfc06f8ed4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 IBM 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.debug.internal.ui.viewers;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @since 3.2
*
*/
public class AsynchronousTableModel extends AsynchronousModel {
/**
* Constructs a new table model.
*
* @param viewer
*/
public AsynchronousTableModel(AsynchronousViewer viewer) {
super(viewer);
}
/* (non-Javadoc)
* @see org.eclipse.debug.internal.ui.model.viewers.AsynchronousModel#add(org.eclipse.debug.internal.ui.model.viewers.ModelNode, java.lang.Object)
*/
protected void add(ModelNode parent, Object element) {}
/**
* Adds the given elements to the table.
*
* @param elements
*/
public void add(Object[] elements) {
TableAddRequestMonitor update = new TableAddRequestMonitor(getRootNode(), elements, this);
requestScheduled(update);
update.done();
}
/**
* Notification add request is complete.
*
* @param elements elements to add
*/
protected void added(Object[] elements) {
List kids = null;
boolean changed = false;
synchronized (this) {
ModelNode[] childrenNodes = getRootNode().getChildrenNodes();
if (childrenNodes == null) {
kids = new ArrayList(elements.length);
} else {
kids = new ArrayList(elements.length + childrenNodes.length);
for (int i = 0; i < childrenNodes.length; i++) {
kids.add(childrenNodes[i].getElement());
}
}
for (int i = 0; i < elements.length; i++) {
if (!kids.contains(elements[i])) {
kids.add(elements[i]);
changed = true;
}
}
}
if (changed) {
setChildren(getRootNode(), kids);
}
}
/**
* Inserts the given elements to the table.
*
* @param elements
* @param index
*/
public void insert(Object[] elements, int index) {
TableAddRequestMonitor update = new TableInsertRequestMonitor(getRootNode(), elements, index, this);
requestScheduled(update);
update.done();
}
/**
* Notification insert request is complete.
*
* @param elements elements to add
* @param index index to insert at
*/
protected void inserted(Object[] elements, int index) {
List kids = null;
boolean changed = false;
synchronized (this) {
ModelNode[] childrenNodes = getRootNode().getChildrenNodes();
if (childrenNodes == null) {
kids = new ArrayList(elements.length);
} else {
kids = new ArrayList(elements.length + childrenNodes.length);
for (int i = 0; i < childrenNodes.length; i++) {
kids.add(childrenNodes[i].getElement());
}
}
for (int i = 0; i < elements.length; i++) {
if (!kids.contains(elements[i])) {
kids.add(index, elements[i]);
index++;
changed = true;
}
}
}
if (changed) {
setChildren(getRootNode(), kids);
}
}
/**
* Removes the given elements from the table.
*
* @param elements
*/
public void remove(Object[] elements) {
TableRemoveRequestMonitor update = new TableRemoveRequestMonitor(getRootNode(), elements, this);
requestScheduled(update);
update.done();
}
/**
* Notification remove request is complete.
*
* @param elements elements to remove
*/
protected void removed(Object[] elements) {
List kids = null;
boolean changed = false;
synchronized (this) {
ModelNode[] childrenNodes = getRootNode().getChildrenNodes();
if (childrenNodes != null) {
kids = new ArrayList(childrenNodes.length);
for (int i = 0; i < childrenNodes.length; i++) {
kids.add(childrenNodes[i].getElement());
}
}
for (int i = 0; i < elements.length; i++) {
if (kids.remove(elements[i])) {
changed = true;
}
}
}
if (changed) {
setChildren(getRootNode(), kids);
}
}
/**
* Adds the given elements to the table.
*
* @param elements
*/
public void replace(Object element, Object replacement) {
TableReplaceRequestMonitor update = new TableReplaceRequestMonitor(getRootNode(), element, replacement, this);
requestScheduled(update);
update.done();
}
/**
* Notification add request is complete.
*
* @param elements elements to add
*/
protected void replaced(Object element, Object replacement) {
Object[] filtered = filter(getRootNode().getElement(), new Object[] { replacement });
if (filtered.length == 0) {
remove(new Object[]{element});
return;
}
List list = new ArrayList();
synchronized (this) {
ModelNode[] nodes = getNodes(element);
for (int i = 0; i < nodes.length; i++) {
ModelNode node = nodes[i];
node.remap(replacement);
list.add(node);
}
}
if (!list.isEmpty()) {
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
ModelNode node = (ModelNode) iterator.next();
getViewer().nodeChanged(node);
}
}
}
}