diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java index aac936a..d7a90cd 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java @@ -164,8 +164,8 @@ public class WaveformView implements IWaveformView { } else { setSelection(new StructuredSelection(entry.getValue()), (e.stateMask & SWT.CTRL) !=0 , false); } + lastClickedEntry = entry.getValue(); } - lastClickedEntry = entry.getValue(); } } }; diff --git a/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF b/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF index 8d335f5..a380eac 100644 --- a/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF +++ b/plugins/com.minres.scviewer.e4.application/META-INF/MANIFEST.MF @@ -29,7 +29,9 @@ Require-Bundle: javax.inject;bundle-version="1.0.0", org.eclipse.e4.core.di.extensions, org.eclipse.e4.ui.css.swt.theme;bundle-version="0.10.0", org.eclipse.core.resources;bundle-version="3.13.0", - javax.annotation;bundle-version="1.2.0" + javax.annotation;bundle-version="1.2.0", + org.eclipse.core.databinding, + org.eclipse.jface.databinding Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: com.minres.scviewer.database, javax.inject;version="1.0.0" diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/E4LifeCycle.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/E4LifeCycle.java index 6f91a1d..054b8be 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/E4LifeCycle.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/E4LifeCycle.java @@ -10,17 +10,11 @@ *******************************************************************************/ package com.minres.scviewer.e4.application; -import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; import javax.annotation.PostConstruct; -import javax.inject.Inject; import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.preferences.IEclipsePreferences.INodeChangeListener; -import org.eclipse.e4.core.contexts.ContextInjectionFactory; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.ui.model.application.MApplication; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SearchHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SearchHandler.java index 9c45219..858d2e7 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SearchHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SearchHandler.java @@ -15,11 +15,9 @@ import org.eclipse.e4.core.di.annotations.Execute; import org.eclipse.e4.ui.model.application.ui.basic.MPart; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Shell; import com.minres.scviewer.database.ui.TrackEntry; -import com.minres.scviewer.e4.application.parts.SearchTxDialog; import com.minres.scviewer.e4.application.parts.WaveformViewer; public class SearchHandler { @@ -44,13 +42,14 @@ public class SearchHandler { Object obj = activePart.getObject(); if(obj instanceof WaveformViewer){ WaveformViewer wfv = (WaveformViewer)obj; - ISelection sel = wfv.getSelection(); - if(sel instanceof StructuredSelection) { - TrackEntry e = findTrackEntry(((StructuredSelection)sel).toArray()); - SearchTxDialog dlg = new SearchTxDialog(shell, e.getStream()); - if (dlg.open() != Window.OK) return; - wfv.search(dlg.getPropName(), dlg.getPropType(), dlg.getPropValue()); - } + wfv.showSearch(); +// ISelection sel = wfv.getSelection(); +// if(sel instanceof StructuredSelection) { +// TrackEntry e = findTrackEntry(((StructuredSelection)sel).toArray()); +// SearchTxDialog dlg = new SearchTxDialog(shell, e.getStream()); +// if (dlg.open() != Window.OK) return; +// wfv.search(dlg.getPropName(), dlg.getPropType(), dlg.getPropValue()); +// } } } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/SearchTxDialog.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/SearchTxDialog.java index 3dddefd..e73870a 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/SearchTxDialog.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/SearchTxDialog.java @@ -1,6 +1,5 @@ package com.minres.scviewer.e4.application.parts; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -17,11 +16,9 @@ import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; @@ -166,7 +163,6 @@ public class SearchTxDialog extends TitleAreaDialog { @Override protected void okPressed() { - //propName=propNameCombo.getItem(propNameCombo.getSelectionIndex()); propValue=propValueText.getText(); super.okPressed(); } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionDetails.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionDetails.java index acd8d35..9d1c81f 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionDetails.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionDetails.java @@ -10,15 +10,10 @@ *******************************************************************************/ package com.minres.scviewer.e4.application.parts; -import java.util.AbstractMap; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Objects; -import java.util.TreeMap; -import java.util.Vector; -import java.util.regex.PatternSyntaxException; import java.util.stream.Collectors; import javax.annotation.PostConstruct; @@ -34,23 +29,16 @@ import org.eclipse.e4.ui.services.IServiceConstants; import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.e4.ui.workbench.modeling.ESelectionService; 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; import org.eclipse.jface.viewers.ITreeViewerListener; -import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.TreeExpansionEvent; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.viewers.ViewerComparator; -import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; @@ -68,11 +56,14 @@ import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; -import com.minres.scviewer.database.DataType; import com.minres.scviewer.database.ITx; -import com.minres.scviewer.database.ITxAttribute; -import com.minres.scviewer.database.ITxRelation; import com.minres.scviewer.e4.application.Messages; +import com.minres.scviewer.e4.application.parts.txTableTree.AttributeLabelProvider; +import com.minres.scviewer.e4.application.parts.txTableTree.AbstractTransactionTreeContentProvider; +import com.minres.scviewer.e4.application.parts.txTableTree.TransactionTreeNode; +import com.minres.scviewer.e4.application.parts.txTableTree.TransactionTreeNodeType; +import com.minres.scviewer.e4.application.parts.txTableTree.TxAttributeFilter; +import com.minres.scviewer.e4.application.parts.txTableTree.TxAttributeViewerSorter; import com.minres.scviewer.e4.application.provider.TxPropertiesLabelProvider; /** @@ -145,7 +136,18 @@ public class TransactionDetails { viewSorter = new TxAttributeViewerSorter(); treeViewer = new TreeViewer(top); - treeViewer.setContentProvider(new TransactionTreeContentProvider()); + treeViewer.setContentProvider(new AbstractTransactionTreeContentProvider(waveformViewerPart) { + + @Override + public Object[] getElements(Object element) { + return new Object[]{ + new TransactionTreeNode((ITx)element, TransactionTreeNodeType.PROPS), + new TransactionTreeNode((ITx)element, TransactionTreeNodeType.ATTRS), + new TransactionTreeNode((ITx)element, TransactionTreeNodeType.IN_REL), + new TransactionTreeNode((ITx)element, TransactionTreeNodeType.OUT_REL) + }; + } + }); treeViewer.setLabelProvider(new TxPropertiesLabelProvider()); treeViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); treeViewer.addFilter(attributeFilter); @@ -171,7 +173,7 @@ public class TransactionDetails { col1 = new TreeViewerColumn(treeViewer, SWT.NONE); col1.getColumn().setText(Messages.TransactionDetails_1); col1.getColumn().setResizable(true); - col1.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(AttributeLabelProvider.NAME))); + col1.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(waveformViewerPart, AttributeLabelProvider.NAME))); col1.getColumn().addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { ((TxAttributeViewerSorter) treeViewer.getComparator()).doSort(COLUMN_FIRST); @@ -182,7 +184,7 @@ public class TransactionDetails { col2 = new TreeViewerColumn(treeViewer, SWT.NONE); col2.getColumn().setText(Messages.TransactionDetails_2); col2.getColumn().setResizable(true); - col2.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(AttributeLabelProvider.TYPE))); + col2.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(waveformViewerPart, AttributeLabelProvider.TYPE))); col2.getColumn().addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { ((TxAttributeViewerSorter) treeViewer.getComparator()).doSort(COLUMN_SECOND); @@ -193,7 +195,7 @@ public class TransactionDetails { col3 = new TreeViewerColumn(treeViewer, SWT.NONE); col3.getColumn().setText(Messages.TransactionDetails_3); col3.getColumn().setResizable(true); - col3.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(AttributeLabelProvider.VALUE))); + col3.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(waveformViewerPart, AttributeLabelProvider.VALUE))); col3.getColumn().addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { ((TxAttributeViewerSorter) treeViewer.getComparator()).doSort(COLUMN_SECOND); @@ -333,15 +335,15 @@ public class TransactionDetails { if(paths==null) treeViewer.setAutoExpandLevel(2); else { - TransactionTreeContentProvider cp = (TransactionTreeContentProvider) treeViewer.getContentProvider(); + AbstractTransactionTreeContentProvider cp = (AbstractTransactionTreeContentProvider) treeViewer.getContentProvider(); Object[] elems = cp.getElements(treeViewer.getInput()); for(TreePath path: paths) { - TreeNode firstSeg = (TreeNode)path.getFirstSegment(); + TransactionTreeNode firstSeg = (TransactionTreeNode)path.getFirstSegment(); for(Object elem : elems) { - if(((TreeNode)elem).type == firstSeg.type) { + if(((TransactionTreeNode)elem).type == firstSeg.type) { treeViewer.setExpandedState(elem, true); - if(firstSeg.type==TransactionDetails.Type.ATTRS && path.getSegmentCount()>1) - expandSubNodes(path, 1, (TreeNode)elem); + if(firstSeg.type==TransactionTreeNodeType.ATTRS && path.getSegmentCount()>1) + expandSubNodes(path, 1, (TransactionTreeNode)elem); break; } } @@ -349,14 +351,14 @@ public class TransactionDetails { } } - private void expandSubNodes(TreePath path, int level, TreeNode elem) { + private void expandSubNodes(TreePath path, int level, TransactionTreeNode elem) { if(level==path.getSegmentCount()) return; - TransactionTreeContentProvider cp = (TransactionTreeContentProvider) treeViewer.getContentProvider(); + AbstractTransactionTreeContentProvider cp = (AbstractTransactionTreeContentProvider) treeViewer.getContentProvider(); Object[] childs = cp.getChildren(elem); - TreeNode nextSeg = (TreeNode)path.getSegment(level); + TransactionTreeNode nextSeg = (TransactionTreeNode)path.getSegment(level); for(Object child:childs) { - if(child instanceof TreeNode) { - TreeNode node = (TreeNode) child; + if(child instanceof TransactionTreeNode) { + TransactionTreeNode node = (TransactionTreeNode) child; if(nextSeg.toString().equals(node.toString())) { treeViewer.setExpandedState(node, true); expandSubNodes(path, level+1, node); @@ -398,7 +400,7 @@ public class TransactionDetails { public void setSelection(@Named(IServiceConstants.ACTIVE_SELECTION) @Optional IStructuredSelection selection, EPartService partService){ // only react if selection is actually from the WaveformViewer and nothing else MPart part = partService.getActivePart(); - if( part == null || ! (part.getObject() instanceof WaveformViewer ) ) + if( part == null || ! (part.getObject() instanceof WaveformViewer ) || part.getObject() != waveformViewerPart) return; if(treeViewer!=null && selection!=null && !treeViewer.getTree().isDisposed()){ if( selection instanceof IStructuredSelection && !selection.isEmpty()) { @@ -406,406 +408,5 @@ public class TransactionDetails { } } } - - /** - * Time to string. - * - * @param time the time - * @return the string - */ - String timeToString(Long time){ - return waveformViewerPart.getScaledTime(time); - } - - /** - * Tx to string. - * - * @param tx the tx - * @return the string - */ - String txToString(ITx tx){ - StringBuilder sb = new StringBuilder(); - sb.append("tx#").append(tx.getId()).append("[").append(timeToString(tx.getBeginTime())); //$NON-NLS-1$ //$NON-NLS-2$ - sb.append(" - ").append(timeToString(tx.getEndTime())).append("]"); //$NON-NLS-1$ //$NON-NLS-2$ - return sb.toString(); - } - - /** - * The Class TxAttributeViewerSorter. - */ - class TxAttributeViewerSorter extends ViewerComparator { - - /** The Constant ASCENDING. */ - private static final int ASCENDING = 0; - - /** The Constant DESCENDING. */ - private static final int DESCENDING = 1; - - /** The column. */ - private int column; - - /** The direction. */ - 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. - * - * @param column the column - */ - 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; - } - } - - /** - * Compares the object for sorting. - * - * @param viewer the viewer - * @param e1 the e1 - * @param e2 the e2 - * @return the int - */ - public int compare(Viewer viewer, Object e1, Object e2) { - int rc = 0; - 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: - rc = getComparator().compare(p1.getValue().toString(), p2.getValue().toString()); - break; - } - // If descending order, flip the direction - if (direction == DESCENDING) rc = -rc; - } - return rc; - } - } - - /** - * The Class TxAttributeFilter. - */ - class TxAttributeFilter extends ViewerFilter { - - /** The search string. */ - private String searchString; - - /** - * Sets the search text. - * - * @param s the new search text - */ - public void setSearchText(String s) { - this.searchString = ".*" + s + ".*"; //$NON-NLS-1$ //$NON-NLS-2$ - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) - */ - @Override - public boolean select(Viewer viewer, Object parentElement, Object element) { - - if (searchString == null || searchString.length() == 0) { - return true; - } - if(element instanceof TreeNode) { - return true; - } - if(element instanceof ITxAttribute){ - try { - return (((ITxAttribute) element).getName().toLowerCase().matches(searchString.toLowerCase())); - } catch (PatternSyntaxException e) { - return true; - } - } - if(element instanceof Object[]) { - try { - return (((Object[])element)[0]).toString().toLowerCase().matches(searchString.toLowerCase()); - } catch (PatternSyntaxException e) { - return true; - } - } - return false; - } - } - - /** - * The Enum Type. - */ - enum Type { - PROPS, /** The props. */ - ATTRS, /** The attrs. */ - IN_REL, /** The in rel. */ - OUT_REL,/** The out rel. */ - HIER - } - - /** - * The Class TreeNode. - */ - class TreeNode implements Comparable{ - - /** The type. */ - public Type type; - - /** The element. */ - public ITx element; - - private String hier_path; - /** - * Instantiates a new tree node. - * - * @param element the element - * @param type the type - */ - public TreeNode(ITx element, Type type){ - this.element=element; - this.type=type; - this.hier_path=""; - } - - public TreeNode(ITx element, String path){ - this.element=element; - this.type=Type.HIER; - this.hier_path=path; - } - - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - public String toString(){ - switch(type){ - 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; - case HIER:{ - String[] tokens = hier_path.split("\\."); - return tokens[tokens.length-1]; - } - } - return ""; //$NON-NLS-1$ - } - - public Object[] getAttributeListForHier() { - if(childs==null) { - Map res = element.getAttributes().stream() - .filter(txAttr -> txAttr.getName().startsWith(hier_path)) - .map(txAttr -> { - String target = hier_path.length()==0?txAttr.getName():txAttr.getName().replace(hier_path+'.', ""); - String[] tokens = target.split("\\."); - if(tokens.length==1) - return new AbstractMap.SimpleEntry<>(tokens[0], txAttr); - else - return new AbstractMap.SimpleEntry<>(tokens[0], new TreeNode(element, hier_path.length()>0?hier_path+"."+tokens[0]:tokens[0])); - }) - .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue(), (first, second) -> first)); - childs = new TreeMap(res).values().toArray(); - } - return childs; - } - - private Object[] childs=null; - - @Override - public boolean equals(Object o) { - if(o instanceof TreeNode) { - TreeNode t = (TreeNode) o; - return type==t.type && hier_path.equals(t.hier_path); - } - return false; - } - - @Override - public int compareTo(TreeNode o) { - int res1 = type.compareTo(o.type); - if(res1==0) { - return hier_path.compareTo(o.hier_path); - } else - return res1; - } - } - - /** - * The Class TransactionTreeContentProvider. - */ - class TransactionTreeContentProvider implements ITreeContentProvider { - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.IContentProvider#dispose() - */ - @Override - public void dispose() { } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) - */ - @Override - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(java.lang.Object) - */ - @Override - public Object[] getElements(Object element) { - return new Object[]{ - new TreeNode((ITx)element, Type.PROPS), - new TreeNode((ITx)element, Type.ATTRS), - new TreeNode((ITx)element, Type.IN_REL), - new TreeNode((ITx)element, Type.OUT_REL) - }; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) - */ - @Override - public Object[] getChildren(Object element) { - if(element instanceof TreeNode){ - TreeNode propertyHolder=(TreeNode) element; - if(propertyHolder.type == Type.PROPS){ - return new Object[][]{ - {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())} - }; - }else if(propertyHolder.type == Type.ATTRS || propertyHolder.type == Type.HIER) - return propertyHolder.getAttributeListForHier(); - else if(propertyHolder.type == Type.IN_REL){ - Vector res = new Vector<>(); - for(ITxRelation rel:propertyHolder.element.getIncomingRelations()){ - res.add(new Object[]{ - rel.getRelationType(), - rel.getSource().getGenerator().getName(), - rel.getSource()}); - } - return res.toArray(); - } else if(propertyHolder.type == Type.OUT_REL){ - Vector res = new Vector<>(); - for(ITxRelation rel:propertyHolder.element.getOutgoingRelations()){ - res.add(new Object[]{ - rel.getRelationType(), - rel.getTarget().getGenerator().getName(), - rel.getTarget()}); - } - return res.toArray(); - } - } - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) - */ - @Override - public Object getParent(Object element) { - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) - */ - @Override - public boolean hasChildren(Object element) { - return getChildren(element)!=null; - } - - } - - /** - * The Class AttributeLabelProvider. - */ - class AttributeLabelProvider extends LabelProvider implements IStyledLabelProvider { - - /** The field. */ - final int field; - - /** The Constant NAME. */ - public static final int NAME=0; - - /** The Constant TYPE. */ - public static final int TYPE=1; - - /** The Constant VALUE. */ - public static final int VALUE=2; - - /** - * Instantiates a new attribute label provider. - * - * @param field the field - */ - public AttributeLabelProvider(int field) { - this.field=field; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getStyledText(java.lang.Object) - */ - @Override - public StyledString getStyledText(Object element) { - switch(field){ - case NAME: - if (element instanceof ITxAttribute) { - ITxAttribute attribute = (ITxAttribute) element; - String[] tokens = attribute.getName().split("\\."); - return new StyledString(tokens[tokens.length-1]); - }else if (element instanceof ITxRelation) { - return new StyledString(Messages.TransactionDetails_4); - }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 - return new StyledString(""); //$NON-NLS-1$ - default: - if (element instanceof ITxAttribute) { - ITxAttribute attribute = (ITxAttribute) element; - String value = attribute.getValue().toString(); - if((DataType.UNSIGNED == attribute.getDataType() || DataType.INTEGER==attribute.getDataType()) && !"0".equals(value)) { - try { - value += " [0x"+Long.toHexString(Long.parseLong(attribute.getValue().toString()))+"]"; - } catch(NumberFormatException e) { } - } - return new StyledString(value); - }else if(element instanceof Object[]){ - Object[] elements = (Object[]) element; - Object o = elements[field]; - if(o instanceof ITx) { - ITx tx = (ITx)o; - return new StyledString(txToString(tx)+" ("+tx.getStream().getFullName()+")"); - } else - return new StyledString(o.toString()); - } else if(element instanceof ITx){ - return new StyledString(txToString((ITx) element)); - }else - return new StyledString(""); //$NON-NLS-1$ - } - } - } } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionList.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionList.java new file mode 100644 index 0000000..cae3de4 --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/TransactionList.java @@ -0,0 +1,286 @@ +package com.minres.scviewer.e4.application.parts; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +import org.eclipse.core.databinding.observable.list.ObservableList; +import org.eclipse.core.databinding.observable.list.WritableList; +import org.eclipse.jface.databinding.viewers.ObservableListContentProvider; +import org.eclipse.jface.viewers.ComboViewer; +import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider; +import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.ITreeSelection; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.TreeViewerColumn; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.swt.widgets.TreeColumn; + +import com.minres.scviewer.database.DataType; +import com.minres.scviewer.database.ITx; +import com.minres.scviewer.database.ITxAttribute; +import com.minres.scviewer.database.ITxEvent; +import com.minres.scviewer.database.ITxEvent.Type; +import com.minres.scviewer.database.ITxStream; +import com.minres.scviewer.database.ui.TrackEntry; +import com.minres.scviewer.e4.application.parts.txTableTree.AbstractTransactionTreeContentProvider; +import com.minres.scviewer.e4.application.parts.txTableTree.AttributeLabelProvider; +import com.minres.scviewer.e4.application.parts.txTableTree.TxFilter; + +public class TransactionList extends Composite { + public class AttributeNameBean { + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public DataType getType() { + return type; + } + public void setType(DataType type) { + this.type = type; + } + public AttributeNameBean(String name, DataType type) { + super(); + this.name = name; + this.type = type; + } + String name; + DataType type; + + } + + private ComboViewer searchPropComboViewer = null; + + private ComboViewer viewPropComboViewer = null; + + private Text searchPropValue; + + private TreeViewer treeViewer = null; + + private TreeColumn valueColumn = null; + + private AttributeLabelProvider nameLabelProvider = null; + + private ITxStream stream; + + private ObservableList attrNames = new WritableList(); + + private List eventList = new ArrayList(); + + private List emptyList = new ArrayList(); + + TxFilter txFilter; + + /** + * Create the composite. + * @param parent + * @param style + */ + public TransactionList(Composite parent, int style, WaveformViewer waveformViewer) { + super(parent, style); + setLayout(new GridLayout(3, false)); + txFilter = new TxFilter(); + + searchPropComboViewer = new ComboViewer(this, SWT.NONE); + searchPropComboViewer.setLabelProvider(new LabelProvider() { + public String getText(Object element) { + AttributeNameBean entry = (AttributeNameBean) element; + return entry.getName()+" ["+entry.getType().toString()+"]"; + } + }); + searchPropComboViewer.setContentProvider(new ObservableListContentProvider()); + searchPropComboViewer.setInput(attrNames); + Combo searchPropCombo = searchPropComboViewer.getCombo(); + searchPropCombo.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, false, 1, 1)); + searchPropCombo.addSelectionListener(new SelectionListener() { + @Override + public void widgetSelected(SelectionEvent e) { + int idx = searchPropCombo.getSelectionIndex(); + AttributeNameBean sel = attrNames.get(idx); + txFilter.setSearchProp(sel.getName(), sel.getType()); + } + @Override + public void widgetDefaultSelected(SelectionEvent e) { + int idx = searchPropCombo.getSelectionIndex(); + AttributeNameBean sel = attrNames.get(idx); + txFilter.setSearchProp(sel.getName(), sel.getType()); + } + }); + + searchPropValue = new Text(this, SWT.BORDER); + searchPropValue.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); + searchPropValue.addModifyListener(new ModifyListener() { + @Override + public void modifyText(ModifyEvent e) { + txFilter.setSearchValue(((Text) e.widget).getText()); + treeViewer.refresh(); + //treeViewer.expandAll(false); + } + }); + + viewPropComboViewer = new ComboViewer(this, SWT.NONE); + viewPropComboViewer.setLabelProvider(new LabelProvider() { + public String getText(Object element) { + AttributeNameBean entry = (AttributeNameBean) element; + return entry.getName()+" ["+entry.getType().toString()+"]"; + } + }); + viewPropComboViewer.setContentProvider(new ObservableListContentProvider()); + viewPropComboViewer.setInput(attrNames); + Combo viewPropCombo = viewPropComboViewer.getCombo(); + viewPropCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); + viewPropCombo.addSelectionListener(new SelectionListener() { + @Override + public void widgetSelected(SelectionEvent e) { + int idx = viewPropCombo.getSelectionIndex(); + AttributeNameBean sel = attrNames.get(idx); + nameLabelProvider.setShowProp(sel.getName()); + treeViewer.refresh(true); + } + @Override + public void widgetDefaultSelected(SelectionEvent e) { } + }); + + treeViewer = new TreeViewer(this, SWT.BORDER); + treeViewer.setContentProvider(new AbstractTransactionTreeContentProvider(waveformViewer) { + + @SuppressWarnings("rawtypes") + @Override + public Object[] getElements(Object inputElement) { + if (inputElement instanceof Object[]) { + return (Object[]) inputElement; + } + if (inputElement instanceof Collection) { + return ((Collection) inputElement).toArray(); + } + return new Object[0]; + } + }); + treeViewer.addFilter(txFilter); + treeViewer.addDoubleClickListener(new IDoubleClickListener() { + @Override + public void doubleClick(DoubleClickEvent event) { + ITreeSelection treeSelection = treeViewer.getStructuredSelection(); + Object selected = treeSelection.getFirstElement(); + if(selected instanceof ITx){ + waveformViewer.setSelection(new StructuredSelection(selected)); + } + } + }); + + Tree tree = treeViewer.getTree(); + tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1)); + + TreeViewerColumn nameColumnViewer = new TreeViewerColumn(treeViewer, SWT.NONE); + TreeColumn nameColumn = nameColumnViewer.getColumn(); + nameColumn.setWidth(200); + nameColumn.setText("Tx ID"); + nameColumn.setResizable(true); + nameColumnViewer.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(waveformViewer, AttributeLabelProvider.NAME))); + + TreeViewerColumn timeColumnViewer = new TreeViewerColumn(treeViewer, SWT.NONE); + TreeColumn timeColumn = timeColumnViewer.getColumn(); + timeColumn.setAlignment(SWT.RIGHT); + timeColumn.setWidth(150); + timeColumn.setText("Start time"); + timeColumn.setResizable(true); + timeColumnViewer.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(waveformViewer, AttributeLabelProvider.TX_TIME))); + + TreeViewerColumn typeColumnViewer = new TreeViewerColumn(treeViewer, SWT.NONE); + TreeColumn typeColumn = typeColumnViewer.getColumn(); + typeColumn.setAlignment(SWT.RIGHT); + typeColumn.setWidth(150); + typeColumn.setText("Type"); + typeColumn.setResizable(true); + typeColumnViewer.setLabelProvider(new DelegatingStyledCellLabelProvider(new AttributeLabelProvider(waveformViewer, AttributeLabelProvider.TYPE))); + + TreeViewerColumn valueColumnViewer = new TreeViewerColumn(treeViewer, SWT.NONE); + valueColumn = valueColumnViewer.getColumn(); + valueColumn.setWidth(150); + valueColumn.setText("Value"); + valueColumn.setResizable(true); + nameLabelProvider= new AttributeLabelProvider(waveformViewer, AttributeLabelProvider.VALUE); + valueColumnViewer.setLabelProvider(new DelegatingStyledCellLabelProvider(nameLabelProvider)); + + // Turn on the header and the lines + tree.setHeaderVisible(true); + tree.setLinesVisible(true); + } + + public void setInput(TrackEntry trackEntry) { + if(trackEntry==null || !trackEntry.isStream()) { + attrNames.clear(); + treeViewer.setInput(emptyList); + } else { + stream=trackEntry.getStream(); + treeViewer.setInput(emptyList); + new Thread() { + private ConcurrentHashMap propNames=new ConcurrentHashMap(); + + private List getEntries() { + return propNames.entrySet().stream() + .sorted((e1,e2)->e1.getKey().compareTo(e2.getKey())) + .map(e -> new AttributeNameBean(e.getKey(), e.getValue())) + .collect(Collectors.toList()); + } + + public void run() { + stream.getEvents().values().parallelStream().forEach(evtLst -> { + evtLst.forEach(evt -> { + if(evt.getType()==Type.BEGIN) { + eventList.add(evt.getTransaction()); + for(ITxAttribute attr: evt.getTransaction().getAttributes()) { + propNames.put(attr.getName(), attr.getDataType()); + } + } + }); + }); + eventList = eventList.parallelStream().sorted((t1, t2)-> t1.getBeginTime().compareTo(t2.getBeginTime())).collect(Collectors.toList()); + getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + treeViewer.setInput(eventList); + attrNames.clear(); + attrNames.addAll(getEntries()); + searchPropComboViewer.getCombo().select(0); + txFilter.setSearchProp(attrNames.get(0).getName(), attrNames.get(0).getType()); + if (searchPropComboViewer!=null) { + searchPropComboViewer.setInput(attrNames); + searchPropComboViewer.setSelection(new StructuredSelection(searchPropComboViewer.getElementAt(0))); + } + } + }); + } + }.run(); + } + } + + public void setSearchProps(String propName, DataType type, String propValue) { + for(int i=0; i res = new Vector<>(); + for(ITxRelation rel:propertyHolder.element.getIncomingRelations()){ + res.add(new Object[]{ + rel.getRelationType(), + rel.getSource().getGenerator().getName(), + rel.getSource()}); + } + return res.toArray(); + } else if(propertyHolder.type == TransactionTreeNodeType.OUT_REL){ + Vector res = new Vector<>(); + for(ITxRelation rel:propertyHolder.element.getOutgoingRelations()){ + res.add(new Object[]{ + rel.getRelationType(), + rel.getTarget().getGenerator().getName(), + rel.getTarget()}); + } + return res.toArray(); + } + } + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) + */ + @Override + public Object getParent(Object element) { + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) + */ + @Override + public boolean hasChildren(Object element) { + return getChildren(element)!=null; + } + +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/AttributeLabelProvider.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/AttributeLabelProvider.java new file mode 100644 index 0000000..0579cac --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/AttributeLabelProvider.java @@ -0,0 +1,160 @@ +package com.minres.scviewer.e4.application.parts.txTableTree; + +import java.util.List; +import java.util.stream.Collectors; + +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.StyledString; +import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider; + +import com.minres.scviewer.database.DataType; +import com.minres.scviewer.database.ITx; +import com.minres.scviewer.database.ITxAttribute; +import com.minres.scviewer.database.ITxRelation; +import com.minres.scviewer.e4.application.Messages; +import com.minres.scviewer.e4.application.parts.WaveformViewer; + +/** + * The Class AttributeLabelProvider. + */ +public class AttributeLabelProvider extends LabelProvider implements IStyledLabelProvider { + + /** + * + */ + private final WaveformViewer waveformViewerPart; + + /** The field. */ + final int field; + + /** The Constant NAME. */ + public static final int NAME=0; + + /** The Constant TYPE. */ + public static final int TYPE=1; + + /** The Constant VALUE. */ + public static final int VALUE=2; + + /** The Constant VALUE. */ + public static final int TX_TIME=3; + + String showProp; + + public String getShowProp() { + return showProp; + } + + public void setShowProp(String showProp) { + this.showProp = showProp; + } + + /** + * Instantiates a new attribute label provider. + * + * @param field the field + * @param transactionDetails TODO + */ + public AttributeLabelProvider(WaveformViewer waveformViewerPart, int field) { + this.waveformViewerPart = waveformViewerPart; + this.field=field; + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getStyledText(java.lang.Object) + */ + @Override + public StyledString getStyledText(Object element) { + if(element instanceof ITx) { + ITx iTx = (ITx) element; + switch(field){ + case NAME: + return new StyledString(iTx.getId().toString()); + case TX_TIME: + return new StyledString(waveformViewerPart.getScaledTime(iTx.getBeginTime())); + case VALUE: + if(showProp!=null){ + List res = iTx.getAttributes().stream().filter(a -> showProp.equals(a.getName())).collect(Collectors.toList()); + if(res.size()==1) + return getAttrValueAsStyledString(res.get(0)); + } + return new StyledString(""); + } + } else { + switch(field){ + case NAME: + if (element instanceof ITxAttribute) { + ITxAttribute attribute = (ITxAttribute) element; + String[] tokens = attribute.getName().split("\\."); + return new StyledString(tokens[tokens.length-1]); + }else if (element instanceof ITxRelation) { + return new StyledString(Messages.TransactionDetails_4); + }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 + return new StyledString(""); //$NON-NLS-1$ + case TX_TIME: + return new StyledString(""); //$NON-NLS-1$ + default: + if (element instanceof ITxAttribute) { + ITxAttribute attribute = (ITxAttribute) element; + return getAttrValueAsStyledString(attribute); + }else if(element instanceof Object[]){ + Object[] elements = (Object[]) element; + Object o = elements[field]; + if(o instanceof ITx) { + ITx tx = (ITx)o; + return new StyledString(this.txToString(tx)+" ("+tx.getStream().getFullName()+")"); + } else + return new StyledString(o.toString()); + } else if(element instanceof ITx){ + return new StyledString(this.txToString((ITx) element)); + } + } + } + return new StyledString(""); //$NON-NLS-1$ + } + + public StyledString getAttrValueAsStyledString(ITxAttribute attribute) { + String value = attribute.getValue().toString(); + if((DataType.UNSIGNED == attribute.getDataType() || DataType.INTEGER==attribute.getDataType()) && !"0".equals(value)) { + try { + value += " [0x"+Long.toHexString(Long.parseLong(attribute.getValue().toString()))+"]"; + } catch(NumberFormatException e) { } + } + return new StyledString(value); + } + /** + * Tx to string. + * + * @param tx the tx + * @return the string + */ + String txToString(ITx tx){ + StringBuilder sb = new StringBuilder(); + sb.append("tx#").append(tx.getId()).append("[").append(timeToString(tx.getBeginTime())); //$NON-NLS-1$ //$NON-NLS-2$ + sb.append(" - ").append(timeToString(tx.getEndTime())).append("]"); //$NON-NLS-1$ //$NON-NLS-2$ + return sb.toString(); + } + + /** + * Time to string. + * + * @param time the time + * @return the string + */ + String timeToString(Long time){ + return waveformViewerPart.getScaledTime(time); + } + +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TransactionTreeNode.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TransactionTreeNode.java new file mode 100644 index 0000000..e8ccf00 --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TransactionTreeNode.java @@ -0,0 +1,95 @@ +package com.minres.scviewer.e4.application.parts.txTableTree; + +import java.util.AbstractMap; +import java.util.Map; +import java.util.TreeMap; +import java.util.stream.Collectors; + +import com.minres.scviewer.database.ITx; +import com.minres.scviewer.e4.application.Messages; + +/** + * The Class TreeNode. + */ +public class TransactionTreeNode implements Comparable{ + + /** The type. */ + public TransactionTreeNodeType type; + + /** The element. */ + public ITx element; + + private String hier_path; + /** + * Instantiates a new tree node. + * + * @param element the element + * @param type the type + */ + public TransactionTreeNode(ITx element, TransactionTreeNodeType type){ + this.element=element; + this.type=type; + this.hier_path=""; + } + + public TransactionTreeNode(ITx element, String path){ + this.element=element; + this.type=TransactionTreeNodeType.HIER; + this.hier_path=path; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + public String toString(){ + switch(type){ + 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; + case HIER:{ + String[] tokens = hier_path.split("\\."); + return tokens[tokens.length-1]; + } + } + return ""; //$NON-NLS-1$ + } + + public Object[] getAttributeListForHier() { + if(childs==null) { + Map res = element.getAttributes().stream() + .filter(txAttr -> txAttr.getName().startsWith(hier_path)) + .map(txAttr -> { + String target = hier_path.length()==0?txAttr.getName():txAttr.getName().replace(hier_path+'.', ""); + String[] tokens = target.split("\\."); + if(tokens.length==1) + return new AbstractMap.SimpleEntry<>(tokens[0], txAttr); + else + return new AbstractMap.SimpleEntry<>(tokens[0], new TransactionTreeNode(element, hier_path.length()>0?hier_path+"."+tokens[0]:tokens[0])); + }) + .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue(), (first, second) -> first)); + childs = new TreeMap(res).values().toArray(); + } + return childs; + } + + private Object[] childs=null; + + @Override + public boolean equals(Object o) { + if(o instanceof TransactionTreeNode) { + TransactionTreeNode t = (TransactionTreeNode) o; + return type==t.type && hier_path.equals(t.hier_path); + } + return false; + } + + @Override + public int compareTo(TransactionTreeNode o) { + int res1 = type.compareTo(o.type); + if(res1==0) { + return hier_path.compareTo(o.hier_path); + } else + return res1; + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TransactionTreeNodeType.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TransactionTreeNodeType.java new file mode 100644 index 0000000..93003ca --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TransactionTreeNodeType.java @@ -0,0 +1,12 @@ +package com.minres.scviewer.e4.application.parts.txTableTree; + +/** + * The Enum Type. + */ +public enum TransactionTreeNodeType { + PROPS, /** The props. */ + ATTRS, /** The attrs. */ + IN_REL, /** The in rel. */ + OUT_REL,/** The out rel. */ + HIER + } \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxAttributeFilter.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxAttributeFilter.java new file mode 100644 index 0000000..f91b0d3 --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxAttributeFilter.java @@ -0,0 +1,55 @@ +package com.minres.scviewer.e4.application.parts.txTableTree; + +import java.util.regex.PatternSyntaxException; + +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerFilter; + +import com.minres.scviewer.database.ITxAttribute; + +/** + * The Class TxAttributeFilter. + */ +public class TxAttributeFilter extends ViewerFilter { + + /** The search string. */ + private String searchString; + + /** + * Sets the search text. + * + * @param s the new search text + */ + public void setSearchText(String s) { + this.searchString = ".*" + s + ".*"; //$NON-NLS-1$ //$NON-NLS-2$ + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) + */ + @Override + public boolean select(Viewer viewer, Object parentElement, Object element) { + + if (searchString == null || searchString.length() == 0) { + return true; + } + if(element instanceof TransactionTreeNode) { + return true; + } + if(element instanceof ITxAttribute){ + try { + return (((ITxAttribute) element).getName().toLowerCase().matches(searchString.toLowerCase())); + } catch (PatternSyntaxException e) { + return true; + } + } + if(element instanceof Object[]) { + try { + return (((Object[])element)[0]).toString().toLowerCase().matches(searchString.toLowerCase()); + } catch (PatternSyntaxException e) { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxAttributeViewerSorter.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxAttributeViewerSorter.java new file mode 100644 index 0000000..1b1dc4d --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxAttributeViewerSorter.java @@ -0,0 +1,73 @@ +package com.minres.scviewer.e4.application.parts.txTableTree; + +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerComparator; + +import com.minres.scviewer.database.ITxAttribute; + +/** + * The Class TxAttributeViewerSorter. + */ +public class TxAttributeViewerSorter extends ViewerComparator { + + /** The Constant ASCENDING. */ + private static final int ASCENDING = 0; + + /** The Constant DESCENDING. */ + private static final int DESCENDING = 1; + + /** The column. */ + private int column; + + /** The direction. */ + 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. + * + * @param column the column + */ + 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; + } + } + + /** + * Compares the object for sorting. + * + * @param viewer the viewer + * @param e1 the e1 + * @param e2 the e2 + * @return the int + */ + public int compare(Viewer viewer, Object e1, Object e2) { + int rc = 0; + 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 0: + rc = getComparator().compare(p1.getName(), p2.getName()); + break; + case 1: + rc = getComparator().compare(p1.getDataType().name(), p2.getDataType().name()); + break; + case 2: + rc = getComparator().compare(p1.getValue().toString(), p2.getValue().toString()); + break; + } + // If descending order, flip the direction + if (direction == DESCENDING) rc = -rc; + } + return rc; + } +} \ No newline at end of file diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxFilter.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxFilter.java new file mode 100644 index 0000000..2efa00a --- /dev/null +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/txTableTree/TxFilter.java @@ -0,0 +1,92 @@ +package com.minres.scviewer.e4.application.parts.txTableTree; + +import java.math.BigInteger; +import java.util.List; +import java.util.regex.PatternSyntaxException; +import java.util.stream.Collectors; + +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerFilter; + +import com.minres.scviewer.database.DataType; +import com.minres.scviewer.database.ITx; +import com.minres.scviewer.database.ITxAttribute; + +/** + * The Class TxAttributeFilter. + */ +public class TxFilter extends ViewerFilter { + + /** The search string. */ + private String searchProp; + /** The search type. */ + private DataType searchType; + /** The search string. */ + private String searchValue; + + /** + * Sets the search text. + * + * @param s the new search text + * @param dataType + */ + public void setSearchProp(String s, DataType type) { + this.searchProp = s; + this.searchType = type; + } + /** + * Sets the search text. + * + * @param s the new search text + */ + public void setSearchValue(String s) { + this.searchValue = s; //$NON-NLS-1$ //$NON-NLS-2$ + } + + /* (non-Javadoc) + * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) + */ + @Override + public boolean select(Viewer viewer, Object parentElement, Object element) { + if (searchValue == null || searchValue.length() == 0) + return true; + if(element instanceof ITx) { + ITx iTx = (ITx) element; + List res = iTx.getAttributes().stream().filter(a -> searchProp.equals(a.getName())).collect(Collectors.toList()); + if(res.size()==1) { + try { + ITxAttribute attr =res.get(0); + switch(searchType) { + case BOOLEAN: // bool + case ENUMERATION: + return searchValue.equalsIgnoreCase((String) attr.getValue()); + case INTEGER: + case UNSIGNED: + BigInteger lval = new BigInteger(attr.getValue().toString()); + BigInteger sval = parseBigInteger(searchValue); + return lval.equals(sval); + case STRING: + try { + return (((ITxAttribute) element).getName().toLowerCase().matches(searchValue.toLowerCase())); + } catch (PatternSyntaxException e) { + return true; + } + default: + break; + } + } catch(RuntimeException ex) { + return false; + } + } + return true; + } + return false; + } + + private BigInteger parseBigInteger(String value) { + if(value.startsWith("0x") || value.startsWith("0X")) + return new BigInteger(value.substring(2), 16); + else + return new BigInteger(value); + } +} \ No newline at end of file