blob: c002b326f49b584e680e5905688bafd4cfbcc9f0 [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.tree;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
import org.eclipse.osee.framework.ui.swt.ImageManager;
import org.eclipse.osee.framework.ui.swt.OverlayImage;
import org.eclipse.osee.framework.ui.swt.OverlayImage.Location;
import org.eclipse.ote.ui.message.internal.WatchImages;
import org.eclipse.ote.ui.message.messageXViewer.MessageXViewerFactory;
import org.eclipse.ote.ui.message.watch.ElementPath;
import org.eclipse.ote.ui.message.watch.recording.IElementPath;
import org.eclipse.swt.graphics.Image;
/**
* Represents an {@link org.eclipse.osee.ote.message.elements.Element} of a {@link org.eclipse.osee.ote.message.Message}
* in a tree view
*
* @author Ken J. Aguilar
*/
public class ElementNode extends AbstractTreeNode implements IElementPath {
private final ElementPath messageElementPath;
private final Map<String, ElementNode> pathToElementNode = new HashMap<String, ElementNode>();
private static final Image normalImg = ImageManager.getImage(WatchImages.PIPE);
private static final Image errorImg =
new OverlayImage(normalImg, ImageDescriptor.createFromImage(ImageManager.getImage(WatchImages.ERROR_SM)),
Location.BOT_RIGHT).createImage();
private MessageNode messageNode;
/**
* Convience Constructor
*/
public ElementNode(final ElementPath elementName) {
super(elementName.get(elementName.size() - 1).toString(), normalImg);
this.messageElementPath = elementName;
}
public void addChild(ElementNode node) {
if (getParent() == null) {
throw new IllegalStateException("parent not set");
}
ElementNode elementNode = node;
pathToElementNode.put(elementNode.getElementPath().asString(), elementNode);
node.setParent(this);
}
protected void setParent(MessageNode node) {
messageNode = node;
super.setParent(node);
}
protected void setParent(ElementNode node) {
messageNode = node.messageNode;
super.setParent(node);
}
public void collectDescendants(Collection<? super ElementNode> descendants) {
for (ElementNode node : pathToElementNode.values()) {
descendants.add(node);
node.collectDescendants(descendants);
}
}
public String getMessageName() {
return getElementPath().getMessageName();
}
public boolean hasDescendant(ElementPath element) {
if (pathToElementNode.containsKey(element.asString())) {
return true;
}
String path = element.asString();
for (Map.Entry<String, ElementNode> entry : pathToElementNode.entrySet()) {
if (entry.getKey().startsWith(path)) {
if (entry.getValue().hasDescendant(element)) {
return true;
}
}
}
return false;
}
public ElementNode findDescendant(ElementPath element) {
ElementNode node = pathToElementNode.get(element.asString());
if (node == null) {
String path = element.asString();
for (Map.Entry<String, ElementNode> entry : pathToElementNode.entrySet()) {
if (path.startsWith(entry.getKey())) {
node = entry.getValue().findDescendant(element);
if (node != null) {
return node;
}
}
}
}
return node;
}
/**
* gets the name of the element that this tree node represents
*
* @return Returns element name string.
*/
public String getElementName() {
return getElementPath().getElementName();
}
@Override
public String getName() {
return getElementName();
}
public MessageNode getMessageNode() {
return messageNode;
}
@Override
public boolean canSetValue() {
return true;
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
setImage(enabled ? normalImg : errorImg);
}
@Override
public void setHasMappingToCurrentMemType(boolean isEditable) {
super.setHasMappingToCurrentMemType(isEditable);
setImage(isEditable ? normalImg : errorImg);
}
@Override
public String getLabel() {
return getName();
}
@Override
public <T> T visit(INodeVisitor<T> visitor) {
return visitor.elementNode(this);
}
@Override
public Image getImage(XViewerColumn column) {
if (column == null) {
return null;
}
if (column.equals(MessageXViewerFactory.name)) {
return getImage();
}
return null;
}
@Override
public Image getImage() {
if (hasMappingToCurrentMemType() && isEnabled()) {
return ElementNode.normalImg;
} else {
return ElementNode.errorImg;
}
}
@Override
public String getLabel(XViewerColumn columns) {
if (columns == null) {
return "";
}
if (columns.equals(MessageXViewerFactory.name)) {
return getElementName();
}
if (columns.equals(MessageXViewerFactory.value)) {
return "";
}
// Object obj = get(columns);
return ""; // obj == null ? "" : get(columns).toString();
}
@Override
public ElementPath getElementPath() {
return messageElementPath;
}
public List<ElementNode> getAllChildren() {
List<ElementNode> allChildren = new ArrayList<ElementNode>();
for (AbstractTreeNode node : getChildren()) {
getChildren(node, allChildren);
}
return allChildren;
}
private void getChildren(AbstractTreeNode node, List<ElementNode> children) {
if (node instanceof ElementNode) {
children.add((ElementNode) node);
}
for (AbstractTreeNode child : node.getChildren()) {
getChildren(child, children);
}
}
@Override
public Collection<ElementNode> getChildren() {
return pathToElementNode.values();
}
@Override
public boolean hasChildren() {
return !pathToElementNode.isEmpty();
}
@Override
public void removeAll() {
for (AbstractTreeNode child : pathToElementNode.values()) {
child.dispose();
}
pathToElementNode.clear();
}
@Override
public void deleteChildren(Collection<AbstractTreeNode> children) {
for (AbstractTreeNode child : children) {
pathToElementNode.remove(((ElementNode) child).getElementPath().asString());
child.dispose();
}
}
}