|
|
|
@ -15,6 +15,8 @@ import java.beans.PropertyChangeListener;
|
|
|
|
|
import java.lang.annotation.Annotation;
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.regex.Matcher;
|
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
import java.util.regex.PatternSyntaxException;
|
|
|
|
|
|
|
|
|
|
import javax.annotation.PostConstruct;
|
|
|
|
@ -35,14 +37,18 @@ 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.DoubleClickEvent;
|
|
|
|
|
import org.eclipse.jface.viewers.IContentProvider;
|
|
|
|
|
import org.eclipse.jface.viewers.IDoubleClickListener;
|
|
|
|
|
import org.eclipse.jface.viewers.ISelection;
|
|
|
|
|
import org.eclipse.jface.viewers.ISelectionChangedListener;
|
|
|
|
|
import org.eclipse.jface.viewers.IStructuredContentProvider;
|
|
|
|
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
|
|
|
|
import org.eclipse.jface.viewers.ITreeContentProvider;
|
|
|
|
|
import org.eclipse.jface.viewers.ITreePathContentProvider;
|
|
|
|
|
import org.eclipse.jface.viewers.SelectionChangedEvent;
|
|
|
|
|
import org.eclipse.jface.viewers.StructuredSelection;
|
|
|
|
|
import org.eclipse.jface.viewers.TableViewer;
|
|
|
|
|
import org.eclipse.jface.viewers.TreePath;
|
|
|
|
|
import org.eclipse.jface.viewers.TreeViewer;
|
|
|
|
|
import org.eclipse.jface.viewers.Viewer;
|
|
|
|
|
import org.eclipse.jface.viewers.ViewerFilter;
|
|
|
|
@ -68,6 +74,7 @@ import org.eclipse.swt.widgets.ToolItem;
|
|
|
|
|
import org.eclipse.wb.swt.ResourceManager;
|
|
|
|
|
import org.eclipse.wb.swt.SWTResourceManager;
|
|
|
|
|
|
|
|
|
|
import com.minres.scviewer.database.HierNode;
|
|
|
|
|
import com.minres.scviewer.database.IHierNode;
|
|
|
|
|
import com.minres.scviewer.database.ITx;
|
|
|
|
|
import com.minres.scviewer.database.IWaveform;
|
|
|
|
@ -110,8 +117,17 @@ public class DesignBrowser {
|
|
|
|
|
/** The tree viewer. */
|
|
|
|
|
private TreeViewer treeViewer;
|
|
|
|
|
|
|
|
|
|
/** The name filter of the design browser tree. */
|
|
|
|
|
private Text treeNameFilter;
|
|
|
|
|
|
|
|
|
|
/** The attribute filter. */
|
|
|
|
|
StreamTTreeFilter treeAttributeFilter;
|
|
|
|
|
|
|
|
|
|
/** The name filter. */
|
|
|
|
|
private Text nameFilter;
|
|
|
|
|
private Text tableNameFilter;
|
|
|
|
|
|
|
|
|
|
/** The attribute filter. */
|
|
|
|
|
StreamTableFilter tableAttributeFilter;
|
|
|
|
|
|
|
|
|
|
/** The tx table viewer. */
|
|
|
|
|
private TableViewer txTableViewer;
|
|
|
|
@ -119,9 +135,6 @@ public class DesignBrowser {
|
|
|
|
|
/** The append all item. */
|
|
|
|
|
ToolItem appendItem, insertItem, insertAllItem, appendAllItem;
|
|
|
|
|
|
|
|
|
|
/** The attribute filter. */
|
|
|
|
|
WaveformAttributeFilter attributeFilter;
|
|
|
|
|
|
|
|
|
|
/** The other selection count. */
|
|
|
|
|
int thisSelectionCount=0, otherSelectionCount=0;
|
|
|
|
|
|
|
|
|
@ -189,10 +202,25 @@ public class DesignBrowser {
|
|
|
|
|
*/
|
|
|
|
|
public void createTreeViewerComposite(Composite parent) {
|
|
|
|
|
parent.setLayout(new GridLayout(1, false));
|
|
|
|
|
|
|
|
|
|
treeNameFilter = new Text(parent, SWT.BORDER);
|
|
|
|
|
treeNameFilter.setMessage(Messages.DesignBrowser_3);
|
|
|
|
|
treeNameFilter.addModifyListener(new ModifyListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void modifyText(ModifyEvent e) {
|
|
|
|
|
treeAttributeFilter.setSearchText(((Text) e.widget).getText());
|
|
|
|
|
treeViewer.refresh();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
treeNameFilter.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
|
|
|
|
|
|
|
|
|
treeAttributeFilter = new StreamTTreeFilter();
|
|
|
|
|
|
|
|
|
|
treeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
|
|
|
|
|
treeViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
|
|
|
|
|
treeViewer.setContentProvider(new TxDbContentProvider());
|
|
|
|
|
treeViewer.setLabelProvider(new TxDbLabelProvider());
|
|
|
|
|
treeViewer.addFilter(treeAttributeFilter);
|
|
|
|
|
treeViewer.setUseHashlookup(true);
|
|
|
|
|
treeViewer.setAutoExpandLevel(2);
|
|
|
|
|
treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
|
|
|
|
@ -223,25 +251,25 @@ public class DesignBrowser {
|
|
|
|
|
public void createTableComposite(Composite parent) {
|
|
|
|
|
parent.setLayout(new GridLayout(1, false));
|
|
|
|
|
|
|
|
|
|
nameFilter = new Text(parent, SWT.BORDER);
|
|
|
|
|
nameFilter.setMessage(Messages.DesignBrowser_2);
|
|
|
|
|
nameFilter.addModifyListener(new ModifyListener() {
|
|
|
|
|
tableNameFilter = new Text(parent, SWT.BORDER);
|
|
|
|
|
tableNameFilter.setMessage(Messages.DesignBrowser_2);
|
|
|
|
|
tableNameFilter.addModifyListener(new ModifyListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void modifyText(ModifyEvent e) {
|
|
|
|
|
attributeFilter.setSearchText(((Text) e.widget).getText());
|
|
|
|
|
tableAttributeFilter.setSearchText(((Text) e.widget).getText());
|
|
|
|
|
updateButtons();
|
|
|
|
|
txTableViewer.refresh();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
nameFilter.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
|
|
|
|
tableNameFilter.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
|
|
|
|
|
|
|
|
|
attributeFilter = new WaveformAttributeFilter();
|
|
|
|
|
tableAttributeFilter = new StreamTableFilter();
|
|
|
|
|
|
|
|
|
|
txTableViewer = new TableViewer(parent);
|
|
|
|
|
txTableViewer.setContentProvider(new TxDbContentProvider(true));
|
|
|
|
|
txTableViewer.setLabelProvider(new TxDbLabelProvider());
|
|
|
|
|
txTableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
|
|
|
|
|
txTableViewer.addFilter(attributeFilter);
|
|
|
|
|
txTableViewer.addFilter(tableAttributeFilter);
|
|
|
|
|
txTableViewer.addDoubleClickListener(new IDoubleClickListener() {
|
|
|
|
|
@Override
|
|
|
|
|
public void doubleClick(DoubleClickEvent event) {
|
|
|
|
@ -445,12 +473,13 @@ public class DesignBrowser {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The Class WaveformAttributeFilter.
|
|
|
|
|
* The Class StreamTableFilter.
|
|
|
|
|
*/
|
|
|
|
|
public class WaveformAttributeFilter extends ViewerFilter {
|
|
|
|
|
public class StreamTableFilter extends ViewerFilter {
|
|
|
|
|
|
|
|
|
|
/** The search string. */
|
|
|
|
|
private String searchString;
|
|
|
|
|
private Pattern pattern;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets the search text.
|
|
|
|
@ -458,7 +487,10 @@ public class DesignBrowser {
|
|
|
|
|
* @param s the new search text
|
|
|
|
|
*/
|
|
|
|
|
public void setSearchText(String s) {
|
|
|
|
|
this.searchString = ".*" + s + ".*"; //$NON-NLS-1$ //$NON-NLS-2$
|
|
|
|
|
try {
|
|
|
|
|
pattern = Pattern.compile(".*" + s + ".*"); //$NON-NLS-1$ //$NON-NLS-2$
|
|
|
|
|
this.searchString = ".*" + s + ".*"; //$NON-NLS-1$ //$NON-NLS-2$
|
|
|
|
|
} catch (PatternSyntaxException e) {}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* (non-Javadoc)
|
|
|
|
@ -469,17 +501,103 @@ public class DesignBrowser {
|
|
|
|
|
if (searchString == null || searchString.length() == 0) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
IWaveform p = (IWaveform) element;
|
|
|
|
|
try {
|
|
|
|
|
if (p.getName().matches(searchString))
|
|
|
|
|
if(element instanceof IWaveform) {
|
|
|
|
|
if (pattern.matcher(((IWaveform) element).getName()).matches())
|
|
|
|
|
return true;
|
|
|
|
|
} catch (PatternSyntaxException e) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class StreamTTreeFilter extends ViewerFilter {
|
|
|
|
|
|
|
|
|
|
/** The search string. */
|
|
|
|
|
private String searchString;
|
|
|
|
|
private Pattern pattern;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets the search text.
|
|
|
|
|
*
|
|
|
|
|
* @param s the new search text
|
|
|
|
|
*/
|
|
|
|
|
public void setSearchText(String s) {
|
|
|
|
|
try {
|
|
|
|
|
pattern = Pattern.compile(".*" + s + ".*");
|
|
|
|
|
this.searchString = ".*" + s + ".*"; //$NON-NLS-1$ //$NON-NLS-2$
|
|
|
|
|
} catch (PatternSyntaxException e) {}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* (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) {
|
|
|
|
|
return selectTreePath(viewer, new TreePath(new Object[] { parentElement }), element);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean selectTreePath(Viewer viewer, TreePath parentPath, Object element) {
|
|
|
|
|
// Cut off children of elements that are shown repeatedly.
|
|
|
|
|
for (int i = 0; i < parentPath.getSegmentCount() - 1; i++) {
|
|
|
|
|
if (element.equals(parentPath.getSegment(i))) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!(viewer instanceof TreeViewer)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
if (searchString == null || searchString.length() == 0) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
TreeViewer treeViewer = (TreeViewer) viewer;
|
|
|
|
|
Boolean matchingResult = isMatchingOrNull(element);
|
|
|
|
|
if (matchingResult != null) {
|
|
|
|
|
return matchingResult;
|
|
|
|
|
}
|
|
|
|
|
return hasUnfilteredChild(treeViewer, parentPath, element);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Boolean isMatchingOrNull(Object element) {
|
|
|
|
|
if(element instanceof IWaveform) {
|
|
|
|
|
if (pattern.matcher(((IWaveform) element).getName()).matches())
|
|
|
|
|
return Boolean.TRUE;
|
|
|
|
|
} else if(element instanceof IWaveformDb) {
|
|
|
|
|
return Boolean.TRUE;
|
|
|
|
|
} else if(element instanceof HierNode) {
|
|
|
|
|
HierNode n = (HierNode) element;
|
|
|
|
|
try {
|
|
|
|
|
if (pattern.matcher(n.getFullName()).matches())
|
|
|
|
|
return Boolean.TRUE;
|
|
|
|
|
} catch (PatternSyntaxException e) {
|
|
|
|
|
return Boolean.TRUE;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
return Boolean.FALSE;
|
|
|
|
|
}
|
|
|
|
|
/* maybe children are matching */
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean hasUnfilteredChild(TreeViewer viewer, TreePath parentPath, Object element) {
|
|
|
|
|
TreePath elementPath = parentPath.createChildPath(element);
|
|
|
|
|
IContentProvider contentProvider = viewer.getContentProvider();
|
|
|
|
|
Object[] children = contentProvider instanceof ITreePathContentProvider
|
|
|
|
|
? ((ITreePathContentProvider) contentProvider).getChildren(elementPath)
|
|
|
|
|
: ((ITreeContentProvider) contentProvider).getChildren(element);
|
|
|
|
|
|
|
|
|
|
/* avoid NPE + guard close */
|
|
|
|
|
if (children == null || children.length == 0) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
for (int i = 0; i < children.length; i++) {
|
|
|
|
|
if (selectTreePath(viewer, elementPath, children[i])) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Gets the filtered children.
|
|
|
|
|
*
|
|
|
|
|