blob: dba3a1e1e2d0db21cc5891c748b40111377845e2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 Boeing.
* 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:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.ote.ui.message.watch;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.osee.ote.message.Message;
import org.eclipse.osee.ote.message.elements.Element;
import org.eclipse.osee.ote.message.elements.RecordElement;
import org.eclipse.osee.ote.message.elements.RecordMap;
import org.eclipse.ote.ui.message.tree.WatchedMessageNode;
/**
* @author Andrew M. Finkbeiner
*/
public class ChildElementNodeContentProvider implements ITreeContentProvider {
private WatchedMessageNode input;
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof RecordMap<?>) {
RecordMap<?> recordMap = (RecordMap<?>) parentElement;
List<Element> list = new ArrayList<Element>();
for (int i = 0; i < recordMap.length(); i++) {
RecordElement element = recordMap.get(i);
if (recordHasChildrenNotListening(element)) {
list.add(element);
}
}
return list.toArray();
} else if (parentElement instanceof RecordElement) {
RecordElement recordElement = (RecordElement) parentElement;
List<Element> list = new ArrayList<Element>();
for (final Element element : recordElement.getElementMap().values()) {
if (!(element instanceof RecordElement)) {
if (!input.hasDescendant(new ElementPath(element.getElementPath()))) {
list.add(element);
}
} else {
if (recordHasChildrenNotListening((RecordElement) element)) {
list.add(element);
}
}
}
return list.toArray();
} else if (parentElement instanceof Element) {
return new Object[0];
}
return new Object[0];
}
private boolean recordHasChildrenNotListening(RecordElement element) {
if (element instanceof RecordMap<?>) {
RecordMap<?> recordMap = (RecordMap<?>) element;
for (int i = 0; i < recordMap.length(); i++) {
RecordElement recelement = recordMap.get(i);
if (recordHasChildrenNotListening(recelement)) {
return true;
}
}
} else {
for (Element recelement : element.getElementMap().values()) {
if (!(recelement instanceof RecordElement)) {
if (!input.hasDescendant(new ElementPath(recelement.getElementPath()))) {
return true;
}
} else {
if (recordHasChildrenNotListening((RecordElement) recelement)) {
return true;
}
}
}
}
return false;
}
@Override
public Object getParent(Object element) {
return null;
}
@Override
public boolean hasChildren(Object element) {
if (element instanceof RecordElement) {
return getChildren(element).length > 0;
} else {
return false;
}
}
@Override
public Object[] getElements(Object inputElement) {
WatchedMessageNode data = (WatchedMessageNode) inputElement;
List<Element> list = new ArrayList<Element>();
Message<?, ?, ?> message = data.getSubscription().getMessage();
for (final Element element : message.getElements()) {
if (!(element instanceof RecordElement)) {
if (data.findChildElement(new ElementPath(element.getElementPath())) == null) {
list.add(element);
}
} else {
list.add(element);
}
}
return list.toArray();
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
input = (WatchedMessageNode) newInput;
}
}