blob: 6ecaf36b13cbd6bbf9b056f1f79f482472a0609b [file] [log] [blame]
package org.eclipse.ote.ui.message.search;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.framework.ui.swt.Displays;
import org.eclipse.osee.framework.ui.swt.Widgets;
import org.eclipse.ote.message.lookup.MessageAssociationLookup;
import org.eclipse.ote.message.lookup.MessageLookup;
import org.eclipse.ote.message.lookup.MessageLookupResult;
import org.eclipse.ote.ui.message.search.internal.MessageViewServiceUtility;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class MessageInfoComposite extends Composite {
private static final int OFFSET = 10;
private static final int HALF_OFFSET = 5;
private final Color TEXT_BACKGROUND_COLOR = new Color(null, 230, 230, 230);
private final Color NOT_FOUND_COLOR = new Color(null, 255, 180, 180);
private StyledText labelMessage;
private StyledText labelType;
private StyledText labelPublishers;
private StyledText labelSubscribers;
private StyledText labelAssociated;
private Text labelByteSize;
private Text labelPhase;
private Text labelRate;
private Text labelScheduled;
private List<String> associatedMsgs;
private MessageInfoSelectionListener selectionListener;
public MessageInfoComposite(Composite parent) {
super(parent, SWT.NONE);
associatedMsgs = null;
selectionListener = null;
createComposite(this);
}
private void createComposite(Composite parent) {
FormLayout layout = new FormLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
parent.setLayout(layout);
Composite labelBorder = new Composite(parent, SWT.NONE);
labelBorder.setBackground(new Color(null, 0,0,0));
FillLayout labelBorderLayout = new FillLayout();
labelBorderLayout.marginHeight = 1;
labelBorderLayout.marginWidth = 1;
labelBorder.setLayout(labelBorderLayout);
labelMessage = new StyledText(labelBorder, SWT.BORDER | SWT.WRAP | SWT.READ_ONLY);
labelMessage.setBackground(TEXT_BACKGROUND_COLOR);
Widgets.attachToParent(labelBorder, SWT.LEFT, 0, HALF_OFFSET);
Widgets.attachToParent(labelBorder, SWT.RIGHT, 100, -HALF_OFFSET);
Widgets.attachToControl(labelBorder, parent, SWT.TOP, SWT.TOP, HALF_OFFSET);
labelType = createWideStyled(parent, "Type:", labelBorder, labelBorder);
labelPublishers = createWideStyled(parent, "Publishers:", labelBorder, labelType);
labelSubscribers = createWideStyled(parent, "Subscribers:", labelBorder, labelPublishers);
labelAssociated = createWideStyled(parent, "Associated:", labelBorder, labelSubscribers);
Composite comp = new Composite(parent, SWT.NONE);
Widgets.attachToParent(comp, SWT.LEFT, 0, OFFSET);
Widgets.attachToControl(comp, labelAssociated, SWT.TOP, SWT.BOTTOM, 0);
GridLayoutFactory.swtDefaults().numColumns(4).applyTo(comp);
labelByteSize = createGridEntry(comp, "Byte Size:");
labelPhase = createGridEntry(comp, "Phase:");
labelRate = createGridEntry(comp, "Rate:");
labelScheduled = createGridEntry(comp, "Scheduled:");
labelAssociated.addListener(SWT.MouseDown, new Listener() {
@Override
public void handleEvent(Event event) {
if (event.button == 1) {
try {
int offset = labelAssociated.getOffsetAtLocation(new Point (event.x, event.y));
StyleRange[] styleRanges = labelAssociated.getStyleRanges(true);
String classname = null;
for (int i=0; i < styleRanges.length; i++) {
int start = styleRanges[i].start;
int end = start+styleRanges[i].length;
if (start <= offset && end > offset) {
classname = associatedMsgs.get(i);
break;
}
}
if (classname != null && !classname.isEmpty() && selectionListener != null) {
selectionListener.associatedClassSelected(classname);
}
} catch (IllegalArgumentException e) {
// no character under event.x, event.y
}
}
}
});
parent.layout();
}
private Text createGridEntry(Composite parent, String text) {
Label label = new Label(parent, SWT.NONE);
label.setText(text);
label.setAlignment(SWT.RIGHT);
Text value = new Text(parent, SWT.BORDER | SWT.READ_ONLY);
value.setBackground(TEXT_BACKGROUND_COLOR);
GridDataFactory.fillDefaults().applyTo(value);
return value;
}
private StyledText createWideStyled(Composite parent, String text, Control lrControl, Control topControl) {
Label label = new Label(parent, SWT.NONE);
label.setText(text);
label.setAlignment(SWT.RIGHT);
FormData formData = new FormData(SWT.DEFAULT, 30);
label.setLayoutData(formData);
StyledText value = new StyledText (parent, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.READ_ONLY);
value.setBackground(TEXT_BACKGROUND_COLOR);
layoutWide(lrControl, topControl, label, value);
return value;
}
private void layoutWide(Control lrControl, Control topControl, Control label, Control value) {
Widgets.attachToControl(label, lrControl, SWT.LEFT, SWT.LEFT, 0);
Widgets.attachToControl(label, topControl, SWT.TOP, SWT.BOTTOM, OFFSET);
Widgets.attachToControl(value, label, SWT.TOP, SWT.TOP, -HALF_OFFSET);
Widgets.attachToControl(value, label, SWT.LEFT, SWT.RIGHT, HALF_OFFSET);
Widgets.attachToControl(value, lrControl, SWT.RIGHT, SWT.RIGHT, 0);
}
public void search(final String className) {
final MessageLookup messageLookup = MessageViewServiceUtility.getService(MessageLookup.class);
final MessageAssociationLookup associationLookup = MessageViewServiceUtility.getService(MessageAssociationLookup.class);
Displays.ensureInDisplayThread(new Runnable() {
@Override
public void run() {
if (messageLookup != null && associationLookup != null) {
MessageLookupResult result = messageLookup.lookupClass(className);
associatedMsgs = associationLookup.lookupAssociatedMessages(className);
if (result != null) {
try {
labelMessage.setText(result.getClassName());
labelMessage.setBackground(TEXT_BACKGROUND_COLOR);
labelType.setText(result.getMessageType());
labelPublishers.setText(toMessageCsv(result.getPublishers()));
labelSubscribers.setText(toMessageCsv(result.getSubscribers()));
labelAssociated.setText("");
labelByteSize.setText(Integer.toString(result.getByteSize()));
labelPhase.setText(result.getPhase());
labelRate.setText(result.getRate());
labelScheduled.setText(result.getScheduled());
updateAssociated();
}
catch (Exception e) {
setNotFound(className);
}
}
else {
setNotFound(className);
}
}
else {
OseeLog.log(getClass(), Level.SEVERE, new Exception("Required Services not found for message info search"));
setNotFound(className);
}
layout(true, true);
}
});
}
private void updateAssociated() {
final String associated = toMessageCsv(associatedMsgs);
final int size = associatedMsgs.size();
labelAssociated.setText(associated);
StyleRange[] styles = new StyleRange[size];
for (int i=0; i<size; i++) {
final String msgName = getMessageName(associatedMsgs.get(i));
StyleRange style = new StyleRange();
style.underline = true;
style.underlineStyle = SWT.UNDERLINE_LINK;
style.start = associated.indexOf(msgName);
style.length = msgName.length();
styles[i] = style;
}
labelAssociated.setStyleRanges(styles);
}
private String toMessageCsv(List<String> associatedResult) {
StringBuilder sb = new StringBuilder();
final int size = associatedResult.size();
for (int i=0; i<size; i++) {
String msgName = getMessageName(associatedResult.get(i));
sb.append(msgName).append(", ");
}
if (sb.length() > 2) {
sb.delete(sb.length()-2, sb.length()-1);
}
return sb.toString();
}
private String getMessageName(final String classname) {
return classname.substring(classname.lastIndexOf('.')+1);
}
private void setNotFound(final String className) {
labelMessage.setText(className);
labelMessage.setBackground(NOT_FOUND_COLOR);
labelType.setText("");
labelPublishers.setText("");
labelSubscribers.setText("");
labelAssociated.setText("");
labelByteSize.setText("");
labelPhase.setText("");
labelRate.setText("");
labelScheduled.setText("");
associatedMsgs = null;
}
public void setSelectionListener(MessageInfoSelectionListener listener) {
selectionListener = listener;
}
private void test() {
labelMessage.setText("osee.test.core.message.pubsub.WEAP_IN");
if (labelMessage.getBackground().equals(TEXT_BACKGROUND_COLOR)) {
labelMessage.setBackground(NOT_FOUND_COLOR);
} else {
labelMessage.setBackground(TEXT_BACKGROUND_COLOR);
}
labelType.setText("PUB_SUB");
labelPublishers.setText("IOP_P");
labelSubscribers.setText("INSTR, IOP_O, WPS_B, AND, MANY1, MANY2, MANY3, MANY4, MANY5, MANY6, MORE");
labelByteSize.setText("20");
labelPhase.setText("0");
labelRate.setText("50.0");
labelScheduled.setText("false");
associatedMsgs = new ArrayList<String>();
associatedMsgs.add("osee.test.core.message.aiu.WEAP_IN_AIL_AIU_WIRE");
associatedMsgs.add("osee.test.core.message.mux.CH5_23T06");
associatedMsgs.add("osee.test.core.message.mux.CH5_22T06");
associatedMsgs.add("osee.test.core.message.mux.CH5_25T06");
associatedMsgs.add("osee.test.core.message.mux.CH5_21T06");
associatedMsgs.add("osee.test.core.message.mux.CH5_26T06");
associatedMsgs.add("osee.test.core.message.mux.CH5_24T06");
associatedMsgs.add("osee.test.core.message.pats.WEAP_IN_PATS_WIRE");
updateAssociated();
layout(true, true);
}
public static void main(String[] args) {
Display display = new Display ();
Shell shell = new Shell (display);
shell.setText ("Shell");
shell.setLayout(new FormLayout());
final MessageInfoComposite view = new MessageInfoComposite(shell);
Button button = new Button(shell, SWT.NONE);
button.setText("Push it real good");
Widgets.attachToParent(view, SWT.TOP, 0, 0);
Widgets.attachToParent(view, SWT.LEFT, 0, 0);
Widgets.attachToParent(view, SWT.RIGHT, 100, 0);
Widgets.attachToControl(view, button, SWT.BOTTOM, SWT.TOP, 0);
Widgets.attachToParent(button, SWT.BOTTOM, 100, 0);
button.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
view.test();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}
});
shell.layout();
shell.pack();
shell.open ();
shell.setSize (600, 400);
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
}