blob: 008d2d0aa002a76625b9dbfb1f6e68f32b207830 [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 org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
import org.eclipse.osee.ote.client.msg.core.IMessageSubscription;
import org.eclipse.osee.ote.message.Message;
import org.eclipse.osee.ote.message.data.MessageData;
import org.eclipse.osee.ote.message.elements.DiscreteElement;
import org.eclipse.osee.ote.message.elements.Element;
import org.eclipse.osee.ote.message.elements.NumericElement;
import org.eclipse.osee.ote.message.elements.RecordMap;
import org.eclipse.ote.ui.message.messageXViewer.MessageXViewerFactory;
import org.eclipse.ote.ui.message.watch.ElementPath;
/**
* @author Ken J. Aguilar
*/
public class WatchedElementNode extends ElementNode {
private Object value = "???";
private final HashMap<XViewerColumn, Object> columnValues = new HashMap<XViewerColumn, Object>();
private Element element;
public WatchedElementNode(ElementPath elementName) {
super(elementName);
}
@Override
public String getLabel(XViewerColumn columns) {
if (columns == null) {
return "";
}
if (columns.equals(MessageXViewerFactory.name)) {
return getElementName();
}
if (columns.equals(MessageXViewerFactory.value)) {
return value.toString();
}
Object obj = columnValues.get(columns);
return obj == null ? "" : obj.toString();
}
public String getHex() {
if (element != null && element instanceof NumericElement<?>) {
NumericElement<?> e = (NumericElement<?>) element;
return String.format("%08X", e.getNumericBitValue());
}
return "--";
}
public IMessageSubscription getSubscription() {
return ((WatchedMessageNode) getMessageNode()).getSubscription();
}
public Integer getByteOffset() {
Object obj = columnValues.get(MessageXViewerFactory.byteOffset);
if (obj != null) {
return (Integer) obj;
}
return null;
}
public Integer getMsb() {
Object obj = columnValues.get(MessageXViewerFactory.msb);
if (obj != null) {
return (Integer) obj;
}
return null;
}
public Integer getLsb() {
Object obj = columnValues.get(MessageXViewerFactory.lsb);
if (obj != null) {
return (Integer) obj;
}
return null;
}
public void setResolved(boolean isResolved) {
if (isResolved) {
Message<?, ?, ?> message = getSubscription().getMessage();
element = message.getElement(getElementPath().getElementPath(), getSubscription().getMemType());
setEnabled(true);
setDisabledReason("");
if (element == null) {
columnValues.clear();
value = "???";
setEnabled(false);
setDisabledReason("could not find the element " + getElementPath().getElementName());
return;
}
if (element.isNonMappingElement()) {
columnValues.clear();
value = "???";
setEnabled(false);
setDisabledReason("this element does not map in " + getSubscription().getMemType());
return;
}
columnValues.put(MessageXViewerFactory.lsb, Integer.valueOf(element.getLsb()));
columnValues.put(MessageXViewerFactory.msb, Integer.valueOf(element.getMsb()));
columnValues.put(MessageXViewerFactory.bitSize, Integer.valueOf(element.getBitLength()));
if (element instanceof DiscreteElement<?>) {
value = ((DiscreteElement<?>) element).getValue();
columnValues.put(MessageXViewerFactory.byteOffset, Integer.valueOf(element.getByteOffset()));
} else if (element instanceof RecordMap<?>) {
value = "";
columnValues.put(MessageXViewerFactory.byteOffset,
Integer.valueOf(((RecordMap<?>) element).get(0).getByteOffset()));
} else {
value = "";
columnValues.put(MessageXViewerFactory.byteOffset, Integer.valueOf(element.getByteOffset()));
}
} else {
columnValues.clear();
value = "???";
element = null;
}
for (ElementNode child : getChildren()) {
((WatchedElementNode) child).setResolved(isResolved);
}
}
public void determineDeltas(Collection<AbstractTreeNode> deltas) {
if (!isEnabled() || element == null) {
return;
}
if (element instanceof DiscreteElement<?>) {
MessageData data = element.getMessage().getActiveDataSource();
int headerSize = data.getMsgHeader() == null ? 0 : data.getMsgHeader().getHeaderSize();
if (element.getByteOffset() >= data.getCurrentLength() - headerSize) {
value = "???";
deltas.add(this);
} else {
DiscreteElement<?> discrete = (DiscreteElement<?>) element;
Object newValue = discrete.getValue();
if (!newValue.equals(value)) {
value = newValue;
deltas.add(this);
}
}
}
for (ElementNode node : getChildren()) {
((WatchedElementNode) node).determineDeltas(deltas);
}
}
@Override
protected void setParent(MessageNode node) {
super.setParent(node);
setResolved(getSubscription().isResolved());
}
@Override
protected void setParent(ElementNode node) {
super.setParent(node);
setResolved(getSubscription().isResolved());
}
public String getValue() {
return value.toString();
}
public Element getElement() {
return element;
}
}