blob: 70c1d0ff593be90a1fc490d0f51f7a9b114181a7 [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.Collection;
import java.util.HashMap;
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.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
/**
* Defines a node in a {@link org.eclipse.swt.widgets.Tree} that maintains detials on
* {@link org.eclipse.osee.ote.message.Message} for display
*
* @author Ken J. Aguilar
*/
public class MessageNode extends AbstractTreeNode {
private final Map<String, ElementNode> pathToElementNode = new HashMap<String, ElementNode>();
protected static final Image normalImg = ImageManager.getImage(WatchImages.GEAR);
@SuppressWarnings("unused")
private static final Image wireAIUImg = ImageManager.getImage(WatchImages.WIRE_AIU);
protected static final Image errorImg =
new OverlayImage(normalImg, ImageDescriptor.createFromImage(ImageManager.getImage(WatchImages.ERROR_SM)),
Location.BOT_RIGHT).createImage();
private final String shortenedMessageName;
private final String packageName;
private final String type;
public MessageNode(String msgClassName, Image image) {
super(msgClassName, image);
shortenedMessageName = msgClassName.substring(msgClassName.lastIndexOf('.') + 1);
packageName = msgClassName.substring(0, msgClassName.lastIndexOf('.'));
type = packageName.substring(packageName.lastIndexOf('.') + 1);
}
public MessageNode(String msgClassName) {
this(msgClassName, normalImg);
}
public String getType() {
return type;
}
public String getPackageName() {
return packageName;
}
@Override
public boolean canSetValue() {
return false;
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
if (!enabled) {
setImage(errorImg);
}
}
@Override
String getLabel() {
return getName();
}
@Override
public <T> T visit(INodeVisitor<T> visitor) {
return visitor.messageNode(this);
}
@Override
public Image getImage(XViewerColumn columns) {
if (columns == null) {
return null;
}
if (columns.equals(MessageXViewerFactory.name)) {
return getImage();
}
return null;
}
@Override
public String getLabel(XViewerColumn columns) {
if (columns == null) {
return "";
}
if (columns.equals(MessageXViewerFactory.name)) {
return getName();
}
return "";
}
@Override
public Color getBackground(XViewerColumn col) {
if (col == null) {
return null;
}
if (col.equals(MessageXViewerFactory.name)) {
return getBackground();
}
return null;
}
public ElementNode findChildElement(ElementPath element) {
return pathToElementNode.get(element.asString());
}
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) {
String path = element.asString();
ElementNode node = pathToElementNode.get(path);
if (node == null) {
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;
}
@Override
public String getName() {
return shortenedMessageName;
}
public String getMessageClassName() {
return super.getName();
}
public void addChild(ElementNode node) {
pathToElementNode.put(node.getElementPath().asString(), node);
node.setParent(this);
}
@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();
}
}
public void collectDescendants(Collection<? super ElementNode> descendants) {
for (ElementNode node : pathToElementNode.values()) {
descendants.add(node);
node.collectDescendants(descendants);
}
}
}