2015-10-22 00:25:12 +02:00
|
|
|
/*******************************************************************************
|
|
|
|
* Copyright (c) 2015 MINRES Technologies GmbH and others.
|
|
|
|
* 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:
|
|
|
|
* MINRES Technologies GmbH - initial API and implementation
|
|
|
|
*******************************************************************************/
|
2015-10-22 00:05:29 +02:00
|
|
|
package com.minres.scviewer.e4.application.parts;
|
|
|
|
|
2019-03-15 08:31:13 +01:00
|
|
|
import java.util.ArrayList;
|
2015-10-27 23:39:33 +01:00
|
|
|
import java.util.Vector;
|
|
|
|
|
2015-10-22 00:05:29 +02:00
|
|
|
import javax.annotation.PostConstruct;
|
|
|
|
import javax.inject.Inject;
|
|
|
|
import javax.inject.Named;
|
|
|
|
|
|
|
|
import org.eclipse.e4.core.di.annotations.Optional;
|
|
|
|
import org.eclipse.e4.core.services.events.IEventBroker;
|
|
|
|
import org.eclipse.e4.ui.di.Focus;
|
2015-10-27 23:39:33 +01:00
|
|
|
import org.eclipse.e4.ui.di.UIEventTopic;
|
2015-10-22 00:05:29 +02:00
|
|
|
import org.eclipse.e4.ui.services.IServiceConstants;
|
|
|
|
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
|
2015-10-27 23:39:33 +01:00
|
|
|
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
|
|
|
|
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
|
|
|
|
import org.eclipse.jface.viewers.DoubleClickEvent;
|
|
|
|
import org.eclipse.jface.viewers.IDoubleClickListener;
|
|
|
|
import org.eclipse.jface.viewers.ISelection;
|
|
|
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
|
|
|
import org.eclipse.jface.viewers.ITreeContentProvider;
|
2019-03-14 19:28:38 +01:00
|
|
|
import org.eclipse.jface.viewers.ITreeViewerListener;
|
2015-10-27 23:39:33 +01:00
|
|
|
import org.eclipse.jface.viewers.LabelProvider;
|
|
|
|
import org.eclipse.jface.viewers.StructuredSelection;
|
|
|
|
import org.eclipse.jface.viewers.StyledString;
|
2019-03-14 19:28:38 +01:00
|
|
|
import org.eclipse.jface.viewers.TreeExpansionEvent;
|
2015-10-27 23:39:33 +01:00
|
|
|
import org.eclipse.jface.viewers.TreeViewer;
|
|
|
|
import org.eclipse.jface.viewers.TreeViewerColumn;
|
2015-10-22 00:05:29 +02:00
|
|
|
import org.eclipse.jface.viewers.Viewer;
|
2017-01-21 13:13:05 +01:00
|
|
|
import org.eclipse.jface.viewers.ViewerComparator;
|
2019-03-15 08:31:13 +01:00
|
|
|
import org.eclipse.jface.viewers.ViewerFilter;
|
2015-10-22 00:05:29 +02:00
|
|
|
import org.eclipse.swt.SWT;
|
|
|
|
import org.eclipse.swt.events.ControlAdapter;
|
|
|
|
import org.eclipse.swt.events.ControlEvent;
|
|
|
|
import org.eclipse.swt.events.ModifyEvent;
|
|
|
|
import org.eclipse.swt.events.ModifyListener;
|
|
|
|
import org.eclipse.swt.events.SelectionAdapter;
|
|
|
|
import org.eclipse.swt.events.SelectionEvent;
|
|
|
|
import org.eclipse.swt.graphics.Point;
|
|
|
|
import org.eclipse.swt.graphics.Rectangle;
|
|
|
|
import org.eclipse.swt.layout.GridData;
|
|
|
|
import org.eclipse.swt.layout.GridLayout;
|
|
|
|
import org.eclipse.swt.widgets.Composite;
|
|
|
|
import org.eclipse.swt.widgets.Text;
|
2015-10-27 23:39:33 +01:00
|
|
|
import org.eclipse.swt.widgets.Tree;
|
2019-03-14 19:28:38 +01:00
|
|
|
import org.eclipse.swt.widgets.TreeItem;
|
2015-10-22 00:05:29 +02:00
|
|
|
|
2019-03-15 08:31:13 +01:00
|
|
|
import com.minres.scviewer.database.DataType;
|
2015-10-22 00:05:29 +02:00
|
|
|
import com.minres.scviewer.database.ITx;
|
|
|
|
import com.minres.scviewer.database.ITxAttribute;
|
2015-10-27 23:39:33 +01:00
|
|
|
import com.minres.scviewer.database.ITxRelation;
|
2017-01-23 22:53:14 +01:00
|
|
|
import com.minres.scviewer.e4.application.Messages;
|
2015-10-22 00:05:29 +02:00
|
|
|
import com.minres.scviewer.e4.application.provider.TxPropertiesLabelProvider;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/**
|
|
|
|
* The Class TransactionDetails shows the details of a selected transaction.
|
|
|
|
*/
|
2015-10-22 00:05:29 +02:00
|
|
|
public class TransactionDetails {
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/** The Constant COLUMN_FIRST. */
|
2015-10-22 00:05:29 +02:00
|
|
|
// Column constants
|
|
|
|
public static final int COLUMN_FIRST = 0;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/** The Constant COLUMN_SECOND. */
|
2015-10-22 00:05:29 +02:00
|
|
|
public static final int COLUMN_SECOND = 1;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/** The Constant COLUMN_THIRD. */
|
2015-10-27 23:39:33 +01:00
|
|
|
public static final int COLUMN_THIRD = 2;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/** The event broker. */
|
2015-10-22 00:05:29 +02:00
|
|
|
@Inject IEventBroker eventBroker;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/** The selection service. */
|
2015-10-22 00:05:29 +02:00
|
|
|
@Inject ESelectionService selectionService;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/** The name filter. */
|
2015-10-22 00:05:29 +02:00
|
|
|
private Text nameFilter;
|
2015-10-27 23:39:33 +01:00
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/** The tree viewer. */
|
2015-10-27 23:39:33 +01:00
|
|
|
private TreeViewer treeViewer;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/** The col3. */
|
2015-10-27 23:39:33 +01:00
|
|
|
private TreeViewerColumn col1, col2, col3;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/** The attribute filter. */
|
2015-10-22 00:05:29 +02:00
|
|
|
TxAttributeFilter attributeFilter;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/** The view sorter. */
|
2015-10-27 23:39:33 +01:00
|
|
|
TxAttributeViewerSorter viewSorter;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/** The waveform viewer part. */
|
|
|
|
private WaveformViewer waveformViewerPart;
|
2015-10-27 23:39:33 +01:00
|
|
|
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/**
|
|
|
|
* Creates the composite.
|
|
|
|
*
|
|
|
|
* @param parent the parent
|
|
|
|
*/
|
2015-10-22 00:05:29 +02:00
|
|
|
@PostConstruct
|
|
|
|
public void createComposite(final Composite parent) {
|
|
|
|
parent.setLayout(new GridLayout(1, false));
|
|
|
|
|
|
|
|
nameFilter = new Text(parent, SWT.BORDER);
|
2017-01-23 22:53:14 +01:00
|
|
|
nameFilter.setMessage(Messages.TransactionDetails_0);
|
2015-10-22 00:05:29 +02:00
|
|
|
nameFilter.addModifyListener(new ModifyListener() {
|
|
|
|
@Override
|
|
|
|
public void modifyText(ModifyEvent e) {
|
|
|
|
attributeFilter.setSearchText(((Text) e.widget).getText());
|
2015-10-27 23:39:33 +01:00
|
|
|
treeViewer.refresh();
|
2015-10-22 00:05:29 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
nameFilter.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
|
|
|
|
|
|
|
attributeFilter = new TxAttributeFilter();
|
2015-10-27 23:39:33 +01:00
|
|
|
viewSorter = new TxAttributeViewerSorter();
|
2015-10-22 00:05:29 +02:00
|
|
|
|
2015-10-27 23:39:33 +01:00
|
|
|
treeViewer = new TreeViewer(parent);
|
|
|
|
treeViewer.setContentProvider(new TransactionTreeContentProvider());
|
|
|
|
treeViewer.setLabelProvider(new TxPropertiesLabelProvider());
|
|
|
|
treeViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
|
|
|
|
treeViewer.addFilter(attributeFilter);
|
2017-01-21 13:13:05 +01:00
|
|
|
treeViewer.setComparator(viewSorter);
|
2015-10-27 23:39:33 +01:00
|
|
|
treeViewer.setAutoExpandLevel(2);
|
2019-03-14 19:28:38 +01:00
|
|
|
treeViewer.addTreeListener(new ITreeViewerListener() {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void treeCollapsed(TreeExpansionEvent event) {
|
|
|
|
treeViewer.getSelection();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void treeExpanded(TreeExpansionEvent event) {
|
|
|
|
treeViewer.getSelection();
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
2015-10-27 23:39:33 +01:00
|
|
|
|
2015-10-22 00:05:29 +02:00
|
|
|
// Set up the table
|
2015-10-27 23:39:33 +01:00
|
|
|
Tree tree = treeViewer.getTree();
|
|
|
|
tree.setLayoutData(new GridData(GridData.FILL_BOTH));
|
|
|
|
// Add the name column
|
|
|
|
col1 = new TreeViewerColumn(treeViewer, SWT.NONE);
|
2017-01-23 22:53:14 +01:00
|
|
|
col1.getColumn().setText(Messages.TransactionDetails_1);
|
2015-10-27 23:39:33 +01:00
|
|
|
col1.getColumn().setResizable(true);
|
|
|
|
col1.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(AttributeLabelProvider.NAME)));
|
|
|
|
col1.getColumn().addSelectionListener(new SelectionAdapter() {
|
2015-10-22 00:05:29 +02:00
|
|
|
public void widgetSelected(SelectionEvent event) {
|
2017-01-21 13:13:05 +01:00
|
|
|
((TxAttributeViewerSorter) treeViewer.getComparator()).doSort(COLUMN_FIRST);
|
2015-10-27 23:39:33 +01:00
|
|
|
treeViewer.refresh();
|
2015-10-22 00:05:29 +02:00
|
|
|
}
|
|
|
|
});
|
2015-10-27 23:39:33 +01:00
|
|
|
// Add the type column
|
|
|
|
col2 = new TreeViewerColumn(treeViewer, SWT.NONE);
|
2017-01-23 22:53:14 +01:00
|
|
|
col2.getColumn().setText(Messages.TransactionDetails_2);
|
2015-10-27 23:39:33 +01:00
|
|
|
col2.getColumn().setResizable(true);
|
|
|
|
col2.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(AttributeLabelProvider.TYPE)));
|
|
|
|
col2.getColumn().addSelectionListener(new SelectionAdapter() {
|
2015-10-22 00:05:29 +02:00
|
|
|
public void widgetSelected(SelectionEvent event) {
|
2017-01-21 13:13:05 +01:00
|
|
|
((TxAttributeViewerSorter) treeViewer.getComparator()).doSort(COLUMN_SECOND);
|
2015-10-27 23:39:33 +01:00
|
|
|
treeViewer.refresh();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
// Add the value column
|
|
|
|
col3 = new TreeViewerColumn(treeViewer, SWT.NONE);
|
2017-01-23 22:53:14 +01:00
|
|
|
col3.getColumn().setText(Messages.TransactionDetails_3);
|
2015-10-27 23:39:33 +01:00
|
|
|
col3.getColumn().setResizable(true);
|
|
|
|
col3.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(AttributeLabelProvider.VALUE)));
|
|
|
|
col3.getColumn().addSelectionListener(new SelectionAdapter() {
|
|
|
|
public void widgetSelected(SelectionEvent event) {
|
2017-01-21 13:13:05 +01:00
|
|
|
((TxAttributeViewerSorter) treeViewer.getComparator()).doSort(COLUMN_SECOND);
|
2015-10-27 23:39:33 +01:00
|
|
|
treeViewer.refresh();
|
2015-10-22 00:05:29 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
// Pack the columns
|
2015-10-27 23:39:33 +01:00
|
|
|
// for (int i = 0, n = table.getColumnCount(); i < n; i++) {
|
|
|
|
// table.getColumn(i).pack();
|
|
|
|
// }
|
2015-10-22 00:05:29 +02:00
|
|
|
|
|
|
|
// Turn on the header and the lines
|
2015-10-27 23:39:33 +01:00
|
|
|
tree.setHeaderVisible(true);
|
|
|
|
tree.setLinesVisible(true);
|
2015-10-22 00:05:29 +02:00
|
|
|
|
2015-10-27 23:39:33 +01:00
|
|
|
treeViewer.addDoubleClickListener(new IDoubleClickListener(){
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void doubleClick(DoubleClickEvent event) {
|
|
|
|
ISelection selection = treeViewer.getSelection();
|
|
|
|
if(selection instanceof IStructuredSelection){
|
|
|
|
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
|
|
|
|
Object selected = structuredSelection.getFirstElement();
|
|
|
|
if(selected instanceof Object[]){
|
|
|
|
Object[] selectedArray = (Object[]) selected;
|
|
|
|
if(selectedArray.length==3 && selectedArray[2] instanceof ITx){
|
|
|
|
waveformViewerPart.setSelection(new StructuredSelection(selectedArray[2]));
|
2019-03-15 08:31:13 +01:00
|
|
|
setInput(selectedArray[2]);
|
2015-10-27 23:39:33 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
2015-10-22 00:05:29 +02:00
|
|
|
parent.addControlListener(new ControlAdapter() {
|
|
|
|
public void controlResized(ControlEvent e) {
|
2015-10-27 23:39:33 +01:00
|
|
|
Tree table = treeViewer.getTree();
|
2015-10-22 00:05:29 +02:00
|
|
|
Rectangle area = parent.getClientArea();
|
|
|
|
Point preferredSize = table.computeSize(SWT.DEFAULT, SWT.DEFAULT);
|
|
|
|
int width = area.width - 2*table.getBorderWidth();
|
|
|
|
if (preferredSize.y > area.height + table.getHeaderHeight()) {
|
|
|
|
// Subtract the scrollbar width from the total column width
|
|
|
|
// if a vertical scrollbar will be required
|
|
|
|
Point vBarSize = table.getVerticalBar().getSize();
|
|
|
|
width -= vBarSize.x;
|
|
|
|
}
|
|
|
|
Point oldSize = table.getSize();
|
|
|
|
if (oldSize.x > area.width) {
|
|
|
|
// table is getting smaller so make the columns
|
|
|
|
// smaller first and then resize the table to
|
|
|
|
// match the client area width
|
2015-10-27 23:39:33 +01:00
|
|
|
col1.getColumn().setWidth(width/3);
|
|
|
|
col2.getColumn().setWidth(width/4);
|
|
|
|
col3.getColumn().setWidth(width - col1.getColumn().getWidth());
|
2015-10-22 00:05:29 +02:00
|
|
|
table.setSize(area.width, area.height);
|
|
|
|
} else {
|
|
|
|
// table is getting bigger so make the table
|
|
|
|
// bigger first and then make the columns wider
|
|
|
|
// to match the client area width
|
|
|
|
table.setSize(area.width, area.height);
|
2015-10-27 23:39:33 +01:00
|
|
|
col1.getColumn().setWidth(width/3);
|
|
|
|
col2.getColumn().setWidth(width/4);
|
|
|
|
col3.getColumn().setWidth(width - col1.getColumn().getWidth()- col2.getColumn().getWidth());
|
2015-10-22 00:05:29 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/**
|
|
|
|
* Sets the focus.
|
|
|
|
*/
|
2015-10-22 00:05:29 +02:00
|
|
|
@Focus
|
|
|
|
public void setFocus() {
|
2015-10-27 23:39:33 +01:00
|
|
|
treeViewer.getTree().setFocus();
|
|
|
|
}
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/**
|
|
|
|
* Gets the status event.
|
|
|
|
*
|
|
|
|
* @param part the part
|
|
|
|
* @return the status event
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
@Inject @Optional
|
2015-11-22 12:47:07 +01:00
|
|
|
public void getStatusEvent(@UIEventTopic(WaveformViewer.ACTIVE_WAVEFORMVIEW) WaveformViewer part) {
|
2015-10-27 23:39:33 +01:00
|
|
|
this.waveformViewerPart=part;
|
2015-10-22 00:05:29 +02:00
|
|
|
}
|
|
|
|
|
2019-03-14 19:28:38 +01:00
|
|
|
public void setInput(Object object) {
|
|
|
|
if(object instanceof ITx){
|
2019-03-15 08:31:13 +01:00
|
|
|
ArrayList<String> names = new ArrayList<>();
|
|
|
|
int indexInParent=getTopItemHier(names);
|
|
|
|
ArrayList<Boolean> states = getExpandedState(treeViewer.getTree().getItems());
|
2019-03-14 19:28:38 +01:00
|
|
|
treeViewer.setInput(object);
|
2019-03-15 08:31:13 +01:00
|
|
|
setExpandedState(treeViewer.getTree().getItems(), states);
|
|
|
|
setTopItemFromHier(names, indexInParent);
|
2019-03-14 19:28:38 +01:00
|
|
|
} else {
|
|
|
|
treeViewer.setInput(null);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2019-03-15 08:31:13 +01:00
|
|
|
|
|
|
|
private void setExpandedState(TreeItem[] treeItems, ArrayList<Boolean> states) {
|
|
|
|
for (int i = 0; i < treeItems.length; i++) {
|
|
|
|
treeItems[i].setExpanded(states.size()>i?states.get(i):true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private ArrayList<Boolean> getExpandedState(TreeItem[] items){
|
|
|
|
ArrayList<Boolean> ret = new ArrayList<>();
|
|
|
|
for (TreeItem treeItem : items)
|
|
|
|
ret.add(treeItem.getItemCount()>0?treeItem.getExpanded():true);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
private int getTopItemHier(ArrayList<String> names){
|
|
|
|
int indexInParent=-1;
|
|
|
|
TreeItem obj = treeViewer.getTree().getTopItem();
|
|
|
|
if(obj!=null) {
|
|
|
|
names.add(0, obj.getText(0));
|
|
|
|
if(obj.getParentItem()!=null) {
|
|
|
|
TreeItem pobj=obj.getParentItem();
|
|
|
|
names.add(0, pobj.getText(0));
|
|
|
|
TreeItem[] items = pobj.getItems();
|
|
|
|
for (int i = 0; i < items.length; i++) {
|
|
|
|
if(items[i]==obj) {
|
|
|
|
indexInParent=i;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return indexInParent;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void setTopItemFromHier(ArrayList<String> names, int indexInParent) {
|
|
|
|
if(indexInParent<0 || names.size()==0 ) return;
|
|
|
|
TreeItem selItem=null;
|
|
|
|
for (TreeItem item : treeViewer.getTree().getItems()) { // find item from category
|
|
|
|
if(item.getText(0).equals(names.get(0))) {
|
|
|
|
if(names.size()>1) { // if we had an attribute as top item
|
|
|
|
TreeItem[] subItems=item.getItems();
|
|
|
|
for(TreeItem it : subItems) { // try to align by name
|
|
|
|
if(it.getText(0).equals(names.get(1))) {
|
|
|
|
selItem=it;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(selItem==null && indexInParent>=0 && subItems.length>0) // name based match failed so try to use position
|
|
|
|
selItem=subItems[subItems.length>indexInParent?indexInParent:subItems.length-1];
|
|
|
|
}
|
|
|
|
if(selItem==null) // no match in attributes so set the category as top item
|
|
|
|
selItem=item;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(selItem!=null)
|
|
|
|
treeViewer.getTree().setTopItem(selItem);
|
|
|
|
}
|
2015-11-22 12:47:07 +01:00
|
|
|
/**
|
|
|
|
* Sets the selection.
|
|
|
|
*
|
|
|
|
* @param selection the new selection
|
|
|
|
*/
|
2015-10-22 00:05:29 +02:00
|
|
|
@Inject
|
2015-10-27 23:39:33 +01:00
|
|
|
public void setSelection(@Named(IServiceConstants.ACTIVE_SELECTION) @Optional IStructuredSelection selection){
|
|
|
|
if(treeViewer!=null && selection!=null && !treeViewer.getTree().isDisposed()){
|
|
|
|
if( selection instanceof IStructuredSelection) {
|
2019-03-14 19:28:38 +01:00
|
|
|
setInput(((IStructuredSelection)selection).getFirstElement());
|
2015-10-22 00:05:29 +02:00
|
|
|
}
|
2015-10-27 23:39:33 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/**
|
|
|
|
* Time to string.
|
|
|
|
*
|
|
|
|
* @param time the time
|
|
|
|
* @return the string
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
String timeToString(Long time){
|
|
|
|
return waveformViewerPart.getScaledTime(time);
|
2015-10-22 00:05:29 +02:00
|
|
|
}
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/**
|
|
|
|
* Tx to string.
|
|
|
|
*
|
|
|
|
* @param tx the tx
|
|
|
|
* @return the string
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
String txToString(ITx tx){
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2017-01-23 22:53:14 +01:00
|
|
|
sb.append("tx#").append(tx.getId()).append("[").append(timeToString(tx.getBeginTime())). //$NON-NLS-1$ //$NON-NLS-2$
|
|
|
|
append(" - ").append(timeToString(tx.getEndTime())).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
|
2015-10-27 23:39:33 +01:00
|
|
|
return sb.toString();
|
|
|
|
}
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/**
|
|
|
|
* The Class TxAttributeViewerSorter.
|
|
|
|
*/
|
2017-01-21 13:13:05 +01:00
|
|
|
class TxAttributeViewerSorter extends ViewerComparator {
|
2015-11-22 12:47:07 +01:00
|
|
|
|
|
|
|
/** The Constant ASCENDING. */
|
2015-10-22 00:05:29 +02:00
|
|
|
private static final int ASCENDING = 0;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/** The Constant DESCENDING. */
|
2015-10-22 00:05:29 +02:00
|
|
|
private static final int DESCENDING = 1;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/** The column. */
|
2015-10-22 00:05:29 +02:00
|
|
|
private int column;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/** The direction. */
|
2015-10-22 00:05:29 +02:00
|
|
|
private int direction;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Does the sort. If it's a different column from the previous sort, do an
|
|
|
|
* ascending sort. If it's the same column as the last sort, toggle the sort
|
|
|
|
* direction.
|
2015-11-22 12:47:07 +01:00
|
|
|
*
|
|
|
|
* @param column the column
|
2015-10-22 00:05:29 +02:00
|
|
|
*/
|
|
|
|
public void doSort(int column) {
|
|
|
|
if (column == this.column) {
|
|
|
|
// Same column as last sort; toggle the direction
|
|
|
|
direction = 1 - direction;
|
|
|
|
} else {
|
|
|
|
// New column; do an ascending sort
|
|
|
|
this.column = column;
|
|
|
|
direction = ASCENDING;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2015-11-22 12:47:07 +01:00
|
|
|
* Compares the object for sorting.
|
|
|
|
*
|
|
|
|
* @param viewer the viewer
|
|
|
|
* @param e1 the e1
|
|
|
|
* @param e2 the e2
|
|
|
|
* @return the int
|
2015-10-22 00:05:29 +02:00
|
|
|
*/
|
|
|
|
public int compare(Viewer viewer, Object e1, Object e2) {
|
|
|
|
int rc = 0;
|
2015-10-27 23:39:33 +01:00
|
|
|
if(e1 instanceof ITxAttribute && e2 instanceof ITxAttribute){
|
|
|
|
ITxAttribute p1 = (ITxAttribute) e1;
|
|
|
|
ITxAttribute p2 = (ITxAttribute) e2;
|
|
|
|
// Determine which column and do the appropriate sort
|
|
|
|
switch (column) {
|
|
|
|
case COLUMN_FIRST:
|
|
|
|
rc = getComparator().compare(p1.getName(), p2.getName());
|
|
|
|
break;
|
|
|
|
case COLUMN_SECOND:
|
|
|
|
rc = getComparator().compare(p1.getDataType().name(), p2.getDataType().name());
|
|
|
|
break;
|
|
|
|
case COLUMN_THIRD:
|
2017-01-21 13:13:05 +01:00
|
|
|
rc = getComparator().compare(p1.getValue().toString(), p2.getValue().toString());
|
2015-10-27 23:39:33 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
// If descending order, flip the direction
|
|
|
|
if (direction == DESCENDING) rc = -rc;
|
|
|
|
}
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/**
|
|
|
|
* The Class TxAttributeFilter.
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
class TxAttributeFilter extends ViewerFilter {
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/** The search string. */
|
2015-10-27 23:39:33 +01:00
|
|
|
private String searchString;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/**
|
|
|
|
* Sets the search text.
|
|
|
|
*
|
|
|
|
* @param s the new search text
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
public void setSearchText(String s) {
|
2017-01-23 22:53:14 +01:00
|
|
|
this.searchString = ".*" + s + ".*"; //$NON-NLS-1$ //$NON-NLS-2$
|
2015-10-27 23:39:33 +01:00
|
|
|
}
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/* (non-Javadoc)
|
|
|
|
* @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
@Override
|
|
|
|
public boolean select(Viewer viewer, Object parentElement, Object element) {
|
|
|
|
if (searchString == null || searchString.length() == 0) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if(element instanceof ITxAttribute){
|
|
|
|
ITxAttribute p = (ITxAttribute) element;
|
|
|
|
if (p.getName().matches(searchString)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
} else if(element instanceof TreeNode)
|
|
|
|
return true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/**
|
|
|
|
* The Enum Type.
|
|
|
|
*/
|
|
|
|
enum Type {/** The props. */
|
|
|
|
PROPS, /** The attrs. */
|
|
|
|
ATTRS, /** The in rel. */
|
|
|
|
IN_REL, /** The out rel. */
|
|
|
|
OUT_REL}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The Class TreeNode.
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
class TreeNode{
|
2015-11-22 12:47:07 +01:00
|
|
|
|
|
|
|
/** The type. */
|
2015-10-27 23:39:33 +01:00
|
|
|
public Type type;
|
2015-11-22 12:47:07 +01:00
|
|
|
|
|
|
|
/** The element. */
|
2015-10-27 23:39:33 +01:00
|
|
|
public ITx element;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/**
|
|
|
|
* Instantiates a new tree node.
|
|
|
|
*
|
|
|
|
* @param element the element
|
|
|
|
* @param type the type
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
public TreeNode(ITx element, Type type){
|
|
|
|
this.element=element;
|
|
|
|
this.type=type;
|
|
|
|
}
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/* (non-Javadoc)
|
|
|
|
* @see java.lang.Object#toString()
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
public String toString(){
|
|
|
|
switch(type){
|
2017-01-23 22:53:14 +01:00
|
|
|
case PROPS: return Messages.TransactionDetails_10;
|
|
|
|
case ATTRS: return Messages.TransactionDetails_11;
|
|
|
|
case IN_REL: return Messages.TransactionDetails_12;
|
|
|
|
case OUT_REL: return Messages.TransactionDetails_13;
|
2015-10-22 00:05:29 +02:00
|
|
|
}
|
2017-01-23 22:53:14 +01:00
|
|
|
return ""; //$NON-NLS-1$
|
2015-10-27 23:39:33 +01:00
|
|
|
}
|
|
|
|
}
|
2015-10-22 00:05:29 +02:00
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/**
|
|
|
|
* The Class TransactionTreeContentProvider.
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
class TransactionTreeContentProvider implements ITreeContentProvider {
|
2015-10-22 00:05:29 +02:00
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/* (non-Javadoc)
|
|
|
|
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
@Override
|
|
|
|
public void dispose() { }
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/* (non-Javadoc)
|
|
|
|
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
@Override
|
|
|
|
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
|
|
|
|
}
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/* (non-Javadoc)
|
|
|
|
* @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(java.lang.Object)
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
@Override
|
|
|
|
public Object[] getElements(Object element) {
|
|
|
|
return new Object[]{
|
|
|
|
new TreeNode((ITx)element, Type.PROPS),
|
2015-11-12 23:35:13 +01:00
|
|
|
new TreeNode((ITx)element, Type.ATTRS),
|
2015-10-27 23:39:33 +01:00
|
|
|
new TreeNode((ITx)element, Type.IN_REL),
|
|
|
|
new TreeNode((ITx)element, Type.OUT_REL)
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/* (non-Javadoc)
|
|
|
|
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
@Override
|
|
|
|
public Object[] getChildren(Object element) {
|
|
|
|
if(element instanceof TreeNode){
|
|
|
|
TreeNode propertyHolder=(TreeNode) element;
|
2015-11-12 23:35:13 +01:00
|
|
|
if(propertyHolder.type == Type.PROPS){
|
2015-10-27 23:39:33 +01:00
|
|
|
return new Object[][]{
|
2017-01-23 22:53:14 +01:00
|
|
|
{Messages.TransactionDetails_1, Messages.TransactionDetails_16, propertyHolder.element.getStream().getFullName()},
|
|
|
|
{Messages.TransactionDetails_2, Messages.TransactionDetails_16, propertyHolder.element.getGenerator().getName()},
|
|
|
|
{Messages.TransactionDetails_19, Messages.TransactionDetails_20, timeToString(propertyHolder.element.getBeginTime())},
|
|
|
|
{Messages.TransactionDetails_21, Messages.TransactionDetails_20, timeToString(propertyHolder.element.getEndTime())}
|
2015-11-12 23:35:13 +01:00
|
|
|
};
|
|
|
|
}else if(propertyHolder.type == Type.ATTRS)
|
2015-10-27 23:39:33 +01:00
|
|
|
return propertyHolder.element.getAttributes().toArray();
|
|
|
|
else if(propertyHolder.type == Type.IN_REL){
|
|
|
|
Vector<Object[] > res = new Vector<>();
|
|
|
|
for(ITxRelation rel:propertyHolder.element.getIncomingRelations()){
|
|
|
|
res.add(new Object[]{
|
|
|
|
rel.getRelationType(),
|
|
|
|
rel.getSource().getGenerator().getName(),
|
2015-10-29 20:02:08 +01:00
|
|
|
rel.getSource()});
|
2015-10-27 23:39:33 +01:00
|
|
|
}
|
|
|
|
return res.toArray();
|
|
|
|
} else if(propertyHolder.type == Type.OUT_REL){
|
|
|
|
Vector<Object[] > res = new Vector<>();
|
|
|
|
for(ITxRelation rel:propertyHolder.element.getOutgoingRelations()){
|
|
|
|
res.add(new Object[]{
|
|
|
|
rel.getRelationType(),
|
|
|
|
rel.getTarget().getGenerator().getName(),
|
2015-10-29 20:02:08 +01:00
|
|
|
rel.getTarget()});
|
2015-10-27 23:39:33 +01:00
|
|
|
}
|
|
|
|
return res.toArray();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/* (non-Javadoc)
|
|
|
|
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
@Override
|
|
|
|
public Object getParent(Object element) {
|
|
|
|
return null;
|
2015-10-22 00:05:29 +02:00
|
|
|
}
|
2015-10-27 23:39:33 +01:00
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/* (non-Javadoc)
|
|
|
|
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
@Override
|
|
|
|
public boolean hasChildren(Object element) {
|
|
|
|
return getChildren(element)!=null;
|
|
|
|
}
|
|
|
|
|
2015-10-22 00:05:29 +02:00
|
|
|
}
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/**
|
|
|
|
* The Class AttributeLabelProvider.
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
class AttributeLabelProvider extends LabelProvider implements IStyledLabelProvider {
|
2015-11-22 12:47:07 +01:00
|
|
|
|
|
|
|
/** The field. */
|
2015-10-27 23:39:33 +01:00
|
|
|
final int field;
|
2015-11-22 12:47:07 +01:00
|
|
|
|
|
|
|
/** The Constant NAME. */
|
2015-10-27 23:39:33 +01:00
|
|
|
public static final int NAME=0;
|
2015-11-22 12:47:07 +01:00
|
|
|
|
|
|
|
/** The Constant TYPE. */
|
2015-10-27 23:39:33 +01:00
|
|
|
public static final int TYPE=1;
|
2015-11-22 12:47:07 +01:00
|
|
|
|
|
|
|
/** The Constant VALUE. */
|
2015-10-27 23:39:33 +01:00
|
|
|
public static final int VALUE=2;
|
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/**
|
|
|
|
* Instantiates a new attribute label provider.
|
|
|
|
*
|
|
|
|
* @param field the field
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
public AttributeLabelProvider(int field) {
|
|
|
|
this.field=field;
|
2015-10-22 00:05:29 +02:00
|
|
|
}
|
2015-10-27 23:39:33 +01:00
|
|
|
|
2015-11-22 12:47:07 +01:00
|
|
|
/* (non-Javadoc)
|
|
|
|
* @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getStyledText(java.lang.Object)
|
|
|
|
*/
|
2015-10-27 23:39:33 +01:00
|
|
|
@Override
|
|
|
|
public StyledString getStyledText(Object element) {
|
|
|
|
switch(field){
|
|
|
|
case NAME:
|
|
|
|
if (element instanceof ITxAttribute) {
|
|
|
|
ITxAttribute attribute = (ITxAttribute) element;
|
|
|
|
return new StyledString(attribute.getName());
|
|
|
|
}else if (element instanceof ITxRelation) {
|
2017-01-23 22:53:14 +01:00
|
|
|
return new StyledString(Messages.TransactionDetails_4);
|
2015-10-27 23:39:33 +01:00
|
|
|
}else if(element instanceof Object[]){
|
|
|
|
Object[] elements = (Object[]) element;
|
|
|
|
return new StyledString(elements[field].toString());
|
|
|
|
} else
|
|
|
|
return new StyledString(element.toString());
|
|
|
|
case TYPE:
|
|
|
|
if (element instanceof ITxAttribute) {
|
|
|
|
ITxAttribute attribute = (ITxAttribute) element;
|
|
|
|
return new StyledString(attribute.getDataType().toString());
|
|
|
|
}else if(element instanceof Object[]){
|
|
|
|
Object[] elements = (Object[]) element;
|
|
|
|
return new StyledString(elements[field].toString());
|
|
|
|
}else
|
2017-01-23 22:53:14 +01:00
|
|
|
return new StyledString(""); //$NON-NLS-1$
|
2015-10-27 23:39:33 +01:00
|
|
|
default:
|
|
|
|
if (element instanceof ITxAttribute) {
|
|
|
|
ITxAttribute attribute = (ITxAttribute) element;
|
2017-10-13 09:36:44 +02:00
|
|
|
String value = attribute.getValue().toString();
|
|
|
|
if((DataType.UNSIGNED == attribute.getDataType() || DataType.INTEGER==attribute.getDataType()) && !"0".equals(value)) {
|
|
|
|
try {
|
|
|
|
value = attribute.getValue().toString() + " [0x"+Long.toHexString(Long.parseLong(attribute.getValue().toString()))+"]";
|
|
|
|
} catch(NumberFormatException e) { }
|
|
|
|
}
|
|
|
|
return new StyledString(value);
|
2015-10-27 23:39:33 +01:00
|
|
|
}else if(element instanceof Object[]){
|
|
|
|
Object[] elements = (Object[]) element;
|
|
|
|
return new StyledString(elements[field].toString());
|
2015-10-29 20:02:08 +01:00
|
|
|
} else if(element instanceof ITx){
|
|
|
|
return new StyledString(txToString((ITx) element));
|
2015-10-27 23:39:33 +01:00
|
|
|
}else
|
2017-01-23 22:53:14 +01:00
|
|
|
return new StyledString(""); //$NON-NLS-1$
|
2015-10-27 23:39:33 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|