From 45e1031e5ee0693f2f788c52f8dc36aa774f8f8c Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 9 Jan 2021 22:23:38 +0100 Subject: [PATCH] fix Sonarlint warnings --- .../lib/LICENSE.txt | 177 ++++ .../ui/swt/internal/WaveformView.java | 7 +- .../database/internal/WaveformDb.java | 18 +- .../internal/status/HeapStatus.java | 969 +++++++++--------- .../e4/application/parts/WaveformViewer.java | 51 +- 5 files changed, 674 insertions(+), 548 deletions(-) create mode 100644 plugins/com.minres.scviewer.database.text/lib/LICENSE.txt diff --git a/plugins/com.minres.scviewer.database.text/lib/LICENSE.txt b/plugins/com.minres.scviewer.database.text/lib/LICENSE.txt new file mode 100644 index 0000000..f433b1a --- /dev/null +++ b/plugins/com.minres.scviewer.database.text/lib/LICENSE.txt @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS 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 64446da..8313895 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 @@ -587,10 +587,9 @@ public class WaveformView implements IWaveformView { if (evt instanceof ITxEvent) { ITx tx = ((ITxEvent) evt).getTransaction(); if ((evt.getKind() == EventKind.BEGIN || evt.getKind() == EventKind.SINGLE) - && tx.getBeginTime() <= time && tx.getEndTime() >= time) { - if (resultsList[tx.getConcurrencyIndex()] == null) - resultsList[tx.getConcurrencyIndex()] = ((ITxEvent) evt).getTransaction(); - } + && tx.getBeginTime() <= time && tx.getEndTime() >= time + && resultsList[tx.getConcurrencyIndex()] == null) + resultsList[tx.getConcurrencyIndex()] = ((ITxEvent) evt).getTransaction(); } } firstTx = entry.waveform.getEvents().lowerEntry(firstTx.getKey()); diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java index 5524e83..91f91e9 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java @@ -124,7 +124,7 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL @Override public boolean load(File inp) { for (IWaveformDbLoader loader : loaders) { - if(loader.canLoad(inp)) { + if (loader.canLoad(inp)) { try { loader.addPropertyChangeListener(this); loader.load(this, inp); @@ -186,14 +186,14 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL @Override public void propertyChange(PropertyChangeEvent evt) { - if(IWaveformDbLoader.SIGNAL_ADDED.equals(evt.getPropertyName()) || - IWaveformDbLoader.STREAM_ADDED.equals(evt.getPropertyName())) { + if (IWaveformDbLoader.SIGNAL_ADDED.equals(evt.getPropertyName()) + || IWaveformDbLoader.STREAM_ADDED.equals(evt.getPropertyName())) { IWaveform waveform = (IWaveform) evt.getNewValue(); putInHierarchy(waveform); pcs.firePropertyChange(IHierNode.WAVEFORMS, null, waveforms); pcs.firePropertyChange(IHierNode.CHILDS, null, childNodes); - } else if(IWaveformDbLoader.GENERATOR_ADDED.equals(evt.getPropertyName())) { - pcs.firePropertyChange(IHierNode.CHILDS, null, childNodes); + } else if (IWaveformDbLoader.GENERATOR_ADDED.equals(evt.getPropertyName())) { + pcs.firePropertyChange(IHierNode.CHILDS, null, childNodes); } } @@ -201,14 +201,14 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL * Builds the hierarchy nodes. */ private void buildHierarchyNodes() { - boolean needsSorting=false; + boolean needsSorting = false; for (IWaveform stream : getAllWaves()) { - if(stream.getParent()==null) { + if (stream.getParent() == null) { putInHierarchy(stream); - needsSorting=true; + needsSorting = true; } } - if(needsSorting) { + if (needsSorting) { pcs.firePropertyChange(IHierNode.WAVEFORMS, null, waveforms); pcs.firePropertyChange(IHierNode.CHILDS, null, childNodes); } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/status/HeapStatus.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/status/HeapStatus.java index 5158d49..0aa356b 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/status/HeapStatus.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/internal/status/HeapStatus.java @@ -9,14 +9,14 @@ * MINRES Technologies GmbH - initial API and implementation *******************************************************************************/ package com.minres.scviewer.e4.application.internal.status; + +import java.lang.ref.WeakReference; import java.lang.reflect.Method; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener; -import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; -import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.resource.ImageDescriptor; @@ -29,7 +29,6 @@ import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.wb.swt.ResourceManager; @@ -39,130 +38,125 @@ import org.osgi.service.prefs.Preferences; import com.minres.scviewer.e4.application.Constants; /** - * The Heap Status control, which shows the heap usage statistics in the window trim. - * Part of the code is taken from the eclipse internal implementation + * The Heap Status control, which shows the heap usage statistics in the window + * trim. Part of the code is taken from the eclipse internal implementation */ public class HeapStatus extends Composite { /** The armed. */ private boolean armed; - + /** The gc image. */ private Image gcImage; - + /** The disabled gc image. */ private Image disabledGcImage; - + /** The arm col. */ - private Color bgCol, usedMemCol, lowMemCol, freeMemCol, topLeftCol, bottomRightCol, sepCol, textCol, markCol, armCol; - - /** The button. */ - private Canvas button; - + private Color bgCol, usedMemCol, lowMemCol, freeMemCol, topLeftCol, bottomRightCol, sepCol, textCol, markCol, + armCol; + + /** The button. */ + private Canvas button; + /** The preferences. */ private Preferences preferences; - + /** The update interval. */ private int updateInterval; - + /** The show max. */ private boolean showMax; - - /** The total mem. */ - private long totalMem; - - /** The prev total mem. */ - private long prevTotalMem = -1L; - - /** The prev used mem. */ - private long prevUsedMem = -1L; - - /** The has changed. */ - private boolean hasChanged; - - /** The used mem. */ - private long usedMem; - - /** The mark. */ - private long mark = -1; - - /** The img bounds. */ - // start with 12x12 - private Rectangle imgBounds = new Rectangle(0,0,12,12); - + + /** The total mem. */ + private long totalMem; + + /** The prev total mem. */ + private long prevTotalMem = -1L; + + /** The prev used mem. */ + private long prevUsedMem = -1L; + + /** The has changed. */ + private boolean hasChanged; + + /** The used mem. */ + private long usedMem; + + /** The mark. */ + private long mark = -1; + + /** The img bounds. */ + // start with 12x12 + private Rectangle imgBounds = new Rectangle(0, 0, 12, 12); + /** The max mem. */ private long maxMem = Long.MAX_VALUE; - + /** The max mem known. */ private boolean maxMemKnown; - + /** The low mem threshold. */ private float lowMemThreshold = 0.05f; - + /** The show low mem threshold. */ private boolean showLowMemThreshold = true; - + /** The update tooltip. */ private boolean updateTooltip = false; /** The is in gc. */ protected volatile boolean isInGC = false; - /** The timer. */ - private final Runnable timer = new Runnable() { - @Override - public void run() { - if (!isDisposed()) { - updateStats(); - if (hasChanged) { - if (updateTooltip) { - updateToolTip(); - } - redraw(); - hasChanged = false; - } - getDisplay().timerExec(updateInterval, this); - } - } - }; - - /** The pref listener. */ - private final IPreferenceChangeListener prefListener = new IPreferenceChangeListener() { + /** The timer. */ + private final Runnable timer = new Runnable() { @Override - public void preferenceChange(PreferenceChangeEvent event) { - if (IHeapStatusConstants.PREF_UPDATE_INTERVAL.equals(event.getKey())) { - setUpdateIntervalInMS(preferences.getInt(IHeapStatusConstants.PREF_UPDATE_INTERVAL, 100)); + public void run() { + if (!isDisposed()) { + updateStats(); + if (hasChanged) { + if (updateTooltip) { + updateToolTip(); + } + redraw(); + hasChanged = false; + } + getDisplay().timerExec(updateInterval, this); } - else if (IHeapStatusConstants.PREF_SHOW_MAX.equals(event.getKey())) { - showMax = preferences.getBoolean(IHeapStatusConstants.PREF_SHOW_MAX, true); - } - } }; - /** - * Creates a new heap status control with the given parent, and using - * the given preference store to obtain settings such as the refresh - * interval. - * - * @param parent the parent composite - * @param preferences the preference store - */ + /** The pref listener. */ + private final IPreferenceChangeListener prefListener = event -> { + if (IHeapStatusConstants.PREF_UPDATE_INTERVAL.equals(event.getKey())) { + setUpdateIntervalInMS(preferences.getInt(IHeapStatusConstants.PREF_UPDATE_INTERVAL, 100)); + } else if (IHeapStatusConstants.PREF_SHOW_MAX.equals(event.getKey())) { + showMax = preferences.getBoolean(IHeapStatusConstants.PREF_SHOW_MAX, true); + } + }; + + /** + * Creates a new heap status control with the given parent, and using the given + * preference store to obtain settings such as the refresh interval. + * + * @param parent the parent composite + * @param preferences the preference store + */ public HeapStatus(Composite parent, Preferences preferences) { super(parent, SWT.NONE); maxMem = getMaxMem(); maxMemKnown = maxMem != Long.MAX_VALUE; - this.preferences = preferences; - if(this.preferences instanceof IEclipsePreferences) - ((IEclipsePreferences)this.preferences).addPreferenceChangeListener(prefListener); + this.preferences = preferences; + if (this.preferences instanceof IEclipsePreferences) + ((IEclipsePreferences) this.preferences).addPreferenceChangeListener(prefListener); - setUpdateIntervalInMS(preferences.getInt(IHeapStatusConstants.PREF_UPDATE_INTERVAL, 100)); - showMax = preferences.getBoolean(IHeapStatusConstants.PREF_SHOW_MAX, true); + setUpdateIntervalInMS(preferences.getInt(IHeapStatusConstants.PREF_UPDATE_INTERVAL, 100)); + showMax = preferences.getBoolean(IHeapStatusConstants.PREF_SHOW_MAX, true); - button = new Canvas(this, SWT.NONE); - button.setToolTipText("Run Garbage Collection"); + button = new Canvas(this, SWT.NONE); + button.setToolTipText("Run Garbage Collection"); ImageDescriptor imageDesc = ResourceManager.getPluginImageDescriptor(Constants.PLUGIN_ID, "icons/trash.png"); //$NON-NLS-1$ Display display = getDisplay(); @@ -172,8 +166,8 @@ public class HeapStatus extends Composite { disabledGcImage = new Image(display, gcImage, SWT.IMAGE_DISABLE); } usedMemCol = display.getSystemColor(SWT.COLOR_INFO_BACKGROUND); - lowMemCol = SWTResourceManager.getColor(255, 70, 70); // medium red - freeMemCol = SWTResourceManager.getColor(255, 190, 125); // light orange + lowMemCol = SWTResourceManager.getColor(255, 70, 70); // medium red + freeMemCol = SWTResourceManager.getColor(255, 190, 125); // light orange bgCol = SWTResourceManager.getColor(SWT.COLOR_WIDGET_BACKGROUND); sepCol = topLeftCol = armCol = SWTResourceManager.getColor(SWT.COLOR_WIDGET_NORMAL_SHADOW); bottomRightCol = SWTResourceManager.getColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW); @@ -181,87 +175,77 @@ public class HeapStatus extends Composite { createContextMenu(); - Listener listener = new Listener() { - - @Override - public void handleEvent(Event event) { - switch (event.type) { - case SWT.Dispose: - doDispose(); - break; - case SWT.Resize: - Rectangle rect = getClientArea(); - button.setBounds(rect.width - imgBounds.width - 1, 1, imgBounds.width, rect.height - 2); - break; - case SWT.Paint: - if (event.widget == HeapStatus.this) { - paintComposite(event.gc); - } - else if (event.widget == button) { - paintButton(event.gc); - } - break; - case SWT.MouseUp: - if (event.button == 1) { - if (!isInGC) { - arm(false); - gc(); - } - } - break; - case SWT.MouseDown: - if (event.button == 1) { - if (event.widget == HeapStatus.this) { - setMark(); - } else if (event.widget == button) { - if (!isInGC) - arm(true); - } - } - break; - case SWT.MouseEnter: - HeapStatus.this.updateTooltip = true; - updateToolTip(); - break; - case SWT.MouseExit: - if (event.widget == HeapStatus.this) { - HeapStatus.this.updateTooltip = false; - } else if (event.widget == button) { - arm(false); - } - break; - default: - break; - } - } - - }; - addListener(SWT.Dispose, listener); - addListener(SWT.MouseDown, listener); - addListener(SWT.Paint, listener); - addListener(SWT.Resize, listener); - addListener(SWT.MouseEnter, listener); - addListener(SWT.MouseExit, listener); - button.addListener(SWT.MouseDown, listener); - button.addListener(SWT.MouseExit, listener); - button.addListener(SWT.MouseUp, listener); - button.addListener(SWT.Paint, listener); + Listener listener = event -> { + switch (event.type) { + case SWT.Dispose: + doDispose(); + break; + case SWT.Resize: + Rectangle rect = getClientArea(); + button.setBounds(rect.width - imgBounds.width - 1, 1, imgBounds.width, rect.height - 2); + break; + case SWT.Paint: + if (event.widget == HeapStatus.this) { + paintComposite(event.gc); + } else if (event.widget == button) { + paintButton(event.gc); + } + break; + case SWT.MouseUp: + if (event.button == 1 && !isInGC) { + arm(false); + gc(); + } + break; + case SWT.MouseDown: + if (event.button == 1) { + if (event.widget == HeapStatus.this) { + setMark(); + } else if (event.widget == button && !isInGC) + arm(true); + } + break; + case SWT.MouseEnter: + HeapStatus.this.updateTooltip = true; + updateToolTip(); + break; + case SWT.MouseExit: + if (event.widget == HeapStatus.this) { + HeapStatus.this.updateTooltip = false; + } else if (event.widget == button) { + arm(false); + } + break; + default: + break; + } + }; + addListener(SWT.Dispose, listener); + addListener(SWT.MouseDown, listener); + addListener(SWT.Paint, listener); + addListener(SWT.Resize, listener); + addListener(SWT.MouseEnter, listener); + addListener(SWT.MouseExit, listener); + button.addListener(SWT.MouseDown, listener); + button.addListener(SWT.MouseExit, listener); + button.addListener(SWT.MouseUp, listener); + button.addListener(SWT.Paint, listener); // make sure stats are updated before first paint updateStats(); - getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - if (!isDisposed()) { - getDisplay().timerExec(updateInterval, timer); - } + getDisplay().asyncExec(() -> { + if (!isDisposed()) { + getDisplay().timerExec(updateInterval, timer); } }); - } + } - /* (non-Javadoc) - * @see org.eclipse.swt.widgets.Control#setBackground(org.eclipse.swt.graphics.Color) + /* + * (non-Javadoc) + * + * @see + * org.eclipse.swt.widgets.Control#setBackground(org.eclipse.swt.graphics.Color) */ @Override public void setBackground(Color color) { @@ -270,8 +254,11 @@ public class HeapStatus extends Composite { button.update(); } - /* (non-Javadoc) - * @see org.eclipse.swt.widgets.Control#setForeground(org.eclipse.swt.graphics.Color) + /* + * (non-Javadoc) + * + * @see + * org.eclipse.swt.widgets.Control#setForeground(org.eclipse.swt.graphics.Color) */ @Override public void setForeground(Color color) { @@ -285,7 +272,9 @@ public class HeapStatus extends Composite { button.update(); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.swt.widgets.Control#getForeground() */ @Override @@ -310,9 +299,9 @@ public class HeapStatus extends Composite { if (o instanceof Long) { max = ((Long) o).longValue(); } - } - catch (Exception e) { - // ignore if method missing or if there are other failures trying to determine the max + } catch (Exception e) { + // ignore if method missing or if there are other failures trying to determine + // the max } return max; } @@ -330,9 +319,9 @@ public class HeapStatus extends Composite { * Do dispose. */ private void doDispose() { - if(preferences instanceof IEclipsePreferences) - ((IEclipsePreferences)preferences).removePreferenceChangeListener(prefListener); - if (gcImage != null) { + if (preferences instanceof IEclipsePreferences) + ((IEclipsePreferences) preferences).removePreferenceChangeListener(prefListener); + if (gcImage != null) { gcImage.dispose(); } if (disabledGcImage != null) { @@ -340,37 +329,39 @@ public class HeapStatus extends Composite { } } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.swt.widgets.Composite#computeSize(int, int, boolean) */ @Override public Point computeSize(int wHint, int hHint, boolean changed) { - GC gc = new GC(this); - Point p = gc.textExtent("MMMMMMMMMMMM"); - int height = imgBounds.height; - // choose the largest of - // - Text height + margins - // - Image height + margins - // - Default Trim heightin - height = Math.max(height, p.y) + 4; - height = Math.max(TrimUtil.TRIM_DEFAULT_HEIGHT, height); - gc.dispose(); + GC gc = new GC(this); + Point p = gc.textExtent("MMMMMMMMMMMM"); + int height = imgBounds.height; + // choose the largest of + // - Text height + margins + // - Image height + margins + // - Default Trim heightin + height = Math.max(height, p.y) + 4; + height = Math.max(TrimUtil.TRIM_DEFAULT_HEIGHT, height); + gc.dispose(); return new Point(p.x + 15, height); } - /** - * Arm. - * - * @param armed the armed - */ - private void arm(boolean armed) { - if (this.armed == armed) { + /** + * Arm. + * + * @param armed the armed + */ + private void arm(boolean armed) { + if (this.armed == armed) { return; } - this.armed = armed; - button.redraw(); - button.update(); - } + this.armed = armed; + button.redraw(); + button.update(); + } /** * Gc running. @@ -382,92 +373,89 @@ public class HeapStatus extends Composite { return; } this.isInGC = isInGC; - button.redraw(); - button.update(); + button.redraw(); + button.update(); } - /** - * Creates the context menu. - */ - private void createContextMenu() { - MenuManager menuMgr = new MenuManager(); - menuMgr.setRemoveAllWhenShown(true); - menuMgr.addMenuListener(new IMenuListener() { - @Override - public void menuAboutToShow(IMenuManager menuMgr) { - fillMenu(menuMgr); - } - }); - Menu menu = menuMgr.createContextMenu(this); - setMenu(menu); - } + /** + * Creates the context menu. + */ + private void createContextMenu() { + MenuManager menuMgr = new MenuManager(); + menuMgr.setRemoveAllWhenShown(true); + menuMgr.addMenuListener(mgr -> fillMenu(mgr)); + Menu menu = menuMgr.createContextMenu(this); + setMenu(menu); + } - /** - * Fill menu. - * - * @param menuMgr the menu mgr - */ - private void fillMenu(IMenuManager menuMgr) { - menuMgr.add(new SetMarkAction()); - menuMgr.add(new ClearMarkAction()); - menuMgr.add(new ShowMaxAction()); - menuMgr.add(new CloseHeapStatusAction()); -// if (isKyrsoftViewAvailable()) { -// menuMgr.add(new ShowKyrsoftViewAction()); -// } - } + /** + * Fill menu. + * + * @param menuMgr the menu mgr + */ + private void fillMenu(IMenuManager menuMgr) { + menuMgr.add(new SetMarkAction()); + menuMgr.add(new ClearMarkAction()); + menuMgr.add(new ShowMaxAction()); + } - /** - * Sets the mark to the current usedMem level. - */ - private void setMark() { - updateStats(); // get up-to-date stats before taking the mark - mark = usedMem; - hasChanged = true; - redraw(); - } + /** + * Sets the mark to the current usedMem level. + */ + private void setMark() { + updateStats(); // get up-to-date stats before taking the mark + mark = usedMem; + hasChanged = true; + redraw(); + } - /** - * Clears the mark. - */ - private void clearMark() { - mark = -1; - hasChanged = true; - redraw(); - } + /** + * Clears the mark. + */ + private void clearMark() { + mark = -1; + hasChanged = true; + redraw(); + } - /** - * Gc. - */ - private void gc() { + /** + * Gc. + */ + private void gc() { gcRunning(true); Thread t = new Thread() { @Override public void run() { busyGC(); - getDisplay().asyncExec(() -> { if (!isDisposed()) gcRunning(false); }); + getDisplay().asyncExec(() -> { + if (!isDisposed()) + gcRunning(false); + }); } }; t.start(); - } + } - /** - * Busy gc. - */ - private void busyGC() { - for (int i = 0; i < 2; ++i) { - System.gc(); - System.runFinalization(); - } - } + /** + * Busy gc. + */ + private void busyGC() { + Object obj = new Object(); + WeakReference ref = new WeakReference<>(obj); + obj = null; + do { + System.gc(); + System.runFinalization(); + } while (ref.get() != null); + } - /** - * Paint button. - * - * @param gc the gc - */ - private void paintButton(GC gc) { - Rectangle rect = button.getClientArea(); + /** + * Paint button. + * + * @param gc the gc + */ + private void paintButton(GC gc) { + Rectangle rect = button.getClientArea(); if (isInGC) { if (disabledGcImage != null) { int buttonY = (rect.height - imgBounds.height) / 2 + rect.y; @@ -475,302 +463,281 @@ public class HeapStatus extends Composite { } return; } - if (armed) { - gc.setBackground(armCol); - gc.fillRectangle(rect.x, rect.y, rect.width, rect.height); - } - if (gcImage != null) { + if (armed) { + gc.setBackground(armCol); + gc.fillRectangle(rect.x, rect.y, rect.width, rect.height); + } + if (gcImage != null) { int by = (rect.height - imgBounds.height) / 2 + rect.y; // button y gc.drawImage(gcImage, rect.x, by); - } - } + } + } - /** - * Paint composite. - * - * @param gc the gc - */ - private void paintComposite(GC gc) { + /** + * Paint composite. + * + * @param gc the gc + */ + private void paintComposite(GC gc) { if (showMax && maxMemKnown) { paintCompositeMaxKnown(gc); } else { paintCompositeMaxUnknown(gc); } - } + } - /** - * Paint composite max unknown. - * - * @param gc the gc - */ - private void paintCompositeMaxUnknown(GC gc) { - Rectangle rect = getClientArea(); - int x = rect.x; - int y = rect.y; - int w = rect.width; - int h = rect.height; - int bw = imgBounds.width; // button width - int dx = x + w - bw - 2; // divider x - int sw = w - bw - 3; // status width - int uw = (int) (sw * usedMem / totalMem); // used mem width - int ux = x + 1 + uw; // used mem right edge - if (bgCol != null) { + /** + * Paint composite max unknown. + * + * @param gc the gc + */ + private void paintCompositeMaxUnknown(GC gc) { + Rectangle rect = getClientArea(); + int x = rect.x; + int y = rect.y; + int w = rect.width; + int h = rect.height; + int bw = imgBounds.width; // button width + int dx = x + w - bw - 2; // divider x + int sw = w - bw - 3; // status width + int uw = (int) (sw * usedMem / totalMem); // used mem width + int ux = x + 1 + uw; // used mem right edge + if (bgCol != null) { gc.setBackground(bgCol); } - gc.fillRectangle(rect); - gc.setForeground(sepCol); + gc.fillRectangle(rect); + gc.setForeground(sepCol); gc.drawLine(dx, y, dx, y + h); gc.drawLine(ux, y, ux, y + h); - gc.setForeground(topLeftCol); - gc.drawLine(x, y, x+w, y); - gc.drawLine(x, y, x, y+h); + gc.setForeground(topLeftCol); + gc.drawLine(x, y, x + w, y); + gc.drawLine(x, y, x, y + h); gc.setForeground(bottomRightCol); - gc.drawLine(x+w-1, y, x+w-1, y+h); - gc.drawLine(x, y+h-1, x+w, y+h-1); + gc.drawLine(x + w - 1, y, x + w - 1, y + h); + gc.drawLine(x, y + h - 1, x + w, y + h - 1); gc.setBackground(usedMemCol); - gc.fillRectangle(x + 1, y + 1, uw, h - 2); + gc.fillRectangle(x + 1, y + 1, uw, h - 2); - String s = convertToMegString(usedMem)+" of "+ convertToMegString(totalMem); - Point p = gc.textExtent(s); - int sx = (rect.width - 15 - p.x) / 2 + rect.x + 1; - int sy = (rect.height - 2 - p.y) / 2 + rect.y + 1; - gc.setForeground(textCol); - gc.drawString(s, sx, sy, true); + String s = convertToMegString(usedMem) + " of " + convertToMegString(totalMem); + Point p = gc.textExtent(s); + int sx = (rect.width - 15 - p.x) / 2 + rect.x + 1; + int sy = (rect.height - 2 - p.y) / 2 + rect.y + 1; + gc.setForeground(textCol); + gc.drawString(s, sx, sy, true); - // draw an I-shaped bar in the foreground colour for the mark (if present) - if (mark != -1) { - int ssx = (int) (sw * mark / totalMem) + x + 1; - paintMark(gc, ssx, y, h); - } - } + // draw an I-shaped bar in the foreground colour for the mark (if present) + if (mark != -1) { + int ssx = (int) (sw * mark / totalMem) + x + 1; + paintMark(gc, ssx, y, h); + } + } - /** - * Paint composite max known. - * - * @param gc the gc - */ - private void paintCompositeMaxKnown(GC gc) { - Rectangle rect = getClientArea(); - int x = rect.x; - int y = rect.y; - int w = rect.width; - int h = rect.height; - int bw = imgBounds.width; // button width - int dx = x + w - bw - 2; // divider x - int sw = w - bw - 3; // status width - int uw = (int) (sw * usedMem / maxMem); // used mem width - int ux = x + 1 + uw; // used mem right edge - int tw = (int) (sw * totalMem / maxMem); // current total mem width - int tx = x + 1 + tw; // current total mem right edge + /** + * Paint composite max known. + * + * @param gc the gc + */ + private void paintCompositeMaxKnown(GC gc) { + Rectangle rect = getClientArea(); + int x = rect.x; + int y = rect.y; + int w = rect.width; + int h = rect.height; + int bw = imgBounds.width; // button width + int dx = x + w - bw - 2; // divider x + int sw = w - bw - 3; // status width + int uw = (int) (sw * usedMem / maxMem); // used mem width + int ux = x + 1 + uw; // used mem right edge + int tw = (int) (sw * totalMem / maxMem); // current total mem width + int tx = x + 1 + tw; // current total mem right edge - if (bgCol != null) { + if (bgCol != null) { gc.setBackground(bgCol); } - gc.fillRectangle(rect); - gc.setForeground(sepCol); + gc.fillRectangle(rect); + gc.setForeground(sepCol); gc.drawLine(dx, y, dx, y + h); gc.drawLine(ux, y, ux, y + h); gc.drawLine(tx, y, tx, y + h); - gc.setForeground(topLeftCol); - gc.drawLine(x, y, x+w, y); - gc.drawLine(x, y, x, y+h); + gc.setForeground(topLeftCol); + gc.drawLine(x, y, x + w, y); + gc.drawLine(x, y, x, y + h); gc.setForeground(bottomRightCol); - gc.drawLine(x+w-1, y, x+w-1, y+h); - gc.drawLine(x, y+h-1, x+w, y+h-1); + gc.drawLine(x + w - 1, y, x + w - 1, y + h); + gc.drawLine(x, y + h - 1, x + w, y + h - 1); - if (lowMemThreshold != 0 && ((double)(maxMem - usedMem) / (double)maxMem < lowMemThreshold)) { - gc.setBackground(lowMemCol); - } else { - gc.setBackground(usedMemCol); - } - gc.fillRectangle(x + 1, y + 1, uw, h - 2); + if (lowMemThreshold != 0 && ((double) (maxMem - usedMem) / (double) maxMem < lowMemThreshold)) { + gc.setBackground(lowMemCol); + } else { + gc.setBackground(usedMemCol); + } + gc.fillRectangle(x + 1, y + 1, uw, h - 2); - gc.setBackground(freeMemCol); - gc.fillRectangle(ux + 1, y + 1, tx - (ux + 1), h - 2); + gc.setBackground(freeMemCol); + gc.fillRectangle(ux + 1, y + 1, tx - (ux + 1), h - 2); - // paint line for low memory threshold - if (showLowMemThreshold && lowMemThreshold != 0) { - gc.setForeground(lowMemCol); - int thresholdX = x + 1 + (int) (sw * (1.0 - lowMemThreshold)); - gc.drawLine(thresholdX, y + 1, thresholdX, y + h - 2); - } + // paint line for low memory threshold + if (showLowMemThreshold && lowMemThreshold != 0) { + gc.setForeground(lowMemCol); + int thresholdX = x + 1 + (int) (sw * (1.0 - lowMemThreshold)); + gc.drawLine(thresholdX, y + 1, thresholdX, y + h - 2); + } - String s = convertToMegString(usedMem)+" of "+convertToMegString(totalMem); - Point p = gc.textExtent(s); - int sx = (rect.width - 15 - p.x) / 2 + rect.x + 1; - int sy = (rect.height - 2 - p.y) / 2 + rect.y + 1; - gc.setForeground(textCol); - gc.drawString(s, sx, sy, true); + String s = convertToMegString(usedMem) + " of " + convertToMegString(totalMem); + Point p = gc.textExtent(s); + int sx = (rect.width - 15 - p.x) / 2 + rect.x + 1; + int sy = (rect.height - 2 - p.y) / 2 + rect.y + 1; + gc.setForeground(textCol); + gc.drawString(s, sx, sy, true); - // draw an I-shaped bar in the foreground colour for the mark (if present) - if (mark != -1) { - int ssx = (int) (sw * mark / maxMem) + x + 1; - paintMark(gc, ssx, y, h); - } - } + // draw an I-shaped bar in the foreground colour for the mark (if present) + if (mark != -1) { + int ssx = (int) (sw * mark / maxMem) + x + 1; + paintMark(gc, ssx, y, h); + } + } /** * Paint mark. * * @param gc the gc - * @param x the x - * @param y the y - * @param h the h + * @param x the x + * @param y the y + * @param h the h */ private void paintMark(GC gc, int x, int y, int h) { - gc.setForeground(markCol); - gc.drawLine(x, y+1, x, y+h-2); - gc.drawLine(x-1, y+1, x+1, y+1); - gc.drawLine(x-1, y+h-2, x+1, y+h-2); + gc.setForeground(markCol); + gc.drawLine(x, y + 1, x, y + h - 2); + gc.drawLine(x - 1, y + 1, x + 1, y + 1); + gc.drawLine(x - 1, y + h - 2, x + 1, y + h - 2); } - /** - * Update stats. - */ - private void updateStats() { - Runtime runtime = Runtime.getRuntime(); - totalMem = runtime.totalMemory(); - long freeMem = runtime.freeMemory(); - usedMem = totalMem - freeMem; + /** + * Update stats. + */ + private void updateStats() { + Runtime runtime = Runtime.getRuntime(); + totalMem = runtime.totalMemory(); + long freeMem = runtime.freeMemory(); + usedMem = totalMem - freeMem; - if (convertToMeg(prevUsedMem) != convertToMeg(usedMem)) { - prevUsedMem = usedMem; - this.hasChanged = true; - } + if (convertToMeg(prevUsedMem) != convertToMeg(usedMem)) { + prevUsedMem = usedMem; + this.hasChanged = true; + } - if (prevTotalMem != totalMem) { - prevTotalMem = totalMem; - this.hasChanged = true; - } - } + if (prevTotalMem != totalMem) { + prevTotalMem = totalMem; + this.hasChanged = true; + } + } - /** - * Update tool tip. - */ - private void updateToolTip() { - String usedStr = convertToMegString(usedMem); - String totalStr = convertToMegString(totalMem); - String maxStr = maxMemKnown ? convertToMegString(maxMem) : ""; - String markStr = mark == -1 ? "" : convertToMegString(mark); - String toolTip = "Heap size: "+usedStr+" of total: "+totalStr+" max: "+maxStr+" mark: "+markStr; - if (!toolTip.equals(getToolTipText())) { - setToolTipText(toolTip); - } - } + /** + * Update tool tip. + */ + private void updateToolTip() { + String usedStr = convertToMegString(usedMem); + String totalStr = convertToMegString(totalMem); + String maxStr = maxMemKnown ? convertToMegString(maxMem) : ""; + String markStr = mark == -1 ? "" : convertToMegString(mark); + String toolTip = "Heap size: " + usedStr + " of total: " + totalStr + " max: " + maxStr + " mark: " + markStr; + if (!toolTip.equals(getToolTipText())) { + setToolTipText(toolTip); + } + } - /** - * Converts the given number of bytes to a printable number of megabytes (rounded up). - * - * @param numBytes the num bytes - * @return the string - */ - private String convertToMegString(long numBytes) { - return Long.toString(convertToMeg(numBytes))+"M"; - } + /** + * Converts the given number of bytes to a printable number of megabytes + * (rounded up). + * + * @param numBytes the num bytes + * @return the string + */ + private String convertToMegString(long numBytes) { + return Long.toString(convertToMeg(numBytes)) + "M"; + } - /** - * Converts the given number of bytes to the corresponding number of megabytes (rounded up). - * - * @param numBytes the num bytes - * @return the long - */ + /** + * Converts the given number of bytes to the corresponding number of megabytes + * (rounded up). + * + * @param numBytes the num bytes + * @return the long + */ private long convertToMeg(long numBytes) { return (numBytes + (512 * 1024)) / (1024 * 1024); } + /** + * The Class SetMarkAction. + */ + class SetMarkAction extends Action { - /** - * The Class SetMarkAction. - */ - class SetMarkAction extends Action { - - /** - * Instantiates a new sets the mark action. - */ - SetMarkAction() { - super("&Set Mark"); - } + /** + * Instantiates a new sets the mark action. + */ + SetMarkAction() { + super("&Set Mark"); + } - /* (non-Javadoc) - * @see org.eclipse.jface.action.Action#run() - */ - @Override + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#run() + */ + @Override public void run() { - setMark(); - } - } + setMark(); + } + } - /** - * The Class ClearMarkAction. - */ - class ClearMarkAction extends Action { - - /** - * Instantiates a new clear mark action. - */ - ClearMarkAction() { - super("&Clear Mark"); - } + /** + * The Class ClearMarkAction. + */ + class ClearMarkAction extends Action { - /* (non-Javadoc) - * @see org.eclipse.jface.action.Action#run() - */ - @Override + /** + * Instantiates a new clear mark action. + */ + ClearMarkAction() { + super("&Clear Mark"); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#run() + */ + @Override public void run() { - clearMark(); - } - } + clearMark(); + } + } - /** - * The Class ShowMaxAction. - */ - class ShowMaxAction extends Action { - - /** - * Instantiates a new show max action. - */ - ShowMaxAction() { - super("Show &Max Heap", IAction.AS_CHECK_BOX); - setEnabled(maxMemKnown); - setChecked(showMax); - } + /** + * The Class ShowMaxAction. + */ + class ShowMaxAction extends Action { - /* (non-Javadoc) - * @see org.eclipse.jface.action.Action#run() - */ - @Override + /** + * Instantiates a new show max action. + */ + ShowMaxAction() { + super("Show &Max Heap", IAction.AS_CHECK_BOX); + setEnabled(maxMemKnown); + setChecked(showMax); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#run() + */ + @Override public void run() { - preferences.putBoolean(IHeapStatusConstants.PREF_SHOW_MAX, isChecked()); - redraw(); - } - } - - /** - * The Class CloseHeapStatusAction. - */ - class CloseHeapStatusAction extends Action{ - - /** - * Instantiates a new close heap status action. - */ - CloseHeapStatusAction(){ - super("&Close"); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.action.Action#run() - */ - @Override - public void run(){ -// WorkbenchWindow wbw = (WorkbenchWindow) PlatformUI.getWorkbench() -// .getActiveWorkbenchWindow(); -// if (wbw != null) { -// wbw.showHeapStatus(false); -// } - System.out.println("NYI"); - } - } - + preferences.putBoolean(IHeapStatusConstants.PREF_SHOW_MAX, isChecked()); + redraw(); + } + } } - diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java index c615af0..b7a8433 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java @@ -16,11 +16,13 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -355,8 +357,10 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis case SWT.ARROW_DOWN: waveformPane.moveSelection(GotoDirection.DOWN); return; - case SWT.HOME: return; //TODO: should be handled - case SWT.END: return; //TODO: should be handled + case SWT.HOME: + return; + case SWT.END: + return; default: break; } @@ -763,25 +767,25 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis */ protected void restoreWaveformViewerState(Map state) { Integer waves = state.containsKey(SHOWN_WAVEFORM+"S") ? Integer.parseInt(state.get(SHOWN_WAVEFORM + "S")):0; //$NON-NLS-1$ //$NON-NLS-2$ - List res = new LinkedList<>(); + List trackEntries = new LinkedList<>(); for (int i = 0; i < waves; i++) { IWaveform waveform = database.getStreamByName(state.get(SHOWN_WAVEFORM + i)); if (waveform != null) { - TrackEntry t = waveformPane.addWaveform(waveform, -1); + TrackEntry trackEntry = waveformPane.addWaveform(waveform, -1); //check if t is selected boolean isSelected = Boolean.parseBoolean(state.get(SHOWN_WAVEFORM + i + WAVEFORM_SELECTED)); if(isSelected) { - t.selected = true; + trackEntry.selected = true; } else { - t.selected = false; + trackEntry.selected = false; } - res.add(t); + trackEntries.add(trackEntry); String v = state.get(SHOWN_WAVEFORM + i + VALUE_DISPLAY); if(v!=null) - t.valueDisplay=ValueDisplay.valueOf(v); + trackEntry.valueDisplay=ValueDisplay.valueOf(v); String s = state.get(SHOWN_WAVEFORM + i + WAVE_DISPLAY); if(s!=null) - t.waveDisplay=WaveDisplay.valueOf(s); + trackEntry.waveDisplay=WaveDisplay.valueOf(s); } } Integer cursorLength = state.containsKey(SHOWN_CURSOR+"S")?Integer.parseInt(state.get(SHOWN_CURSOR + "S")):0; //$NON-NLS-1$ //$NON-NLS-2$ @@ -810,32 +814,11 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis try { Long txId = Long.parseLong(state.get(SELECTED_TX_ID)); String trackentryName = state.get(SELECTED_TRACKENTRY_NAME); - //get TrackEntry Object based on name and TX Object by id and put into selectionList - for(TrackEntry te : res) { - if(te.waveform.getFullName().compareTo(trackentryName)==0) { - boolean found = false; - // TODO: find transaction by time? To avoid 3x for-loop - for( IEvent[] lev : te.waveform.getEvents().values() ) { - if(lev != null) - for(IEvent itxe : lev) { - if(itxe instanceof ITxEvent) { - ITx itx = ((ITxEvent)itxe).getTransaction(); - if(itx.getId().equals(txId)) { - found = true; - ArrayList selectionList = new ArrayList<>(); - selectionList.add(te); - selectionList.add(itx); - waveformPane.setSelection(new StructuredSelection (selectionList)); - break; - } - } - } - if(found) break; - } - break; - } - } + trackEntries.stream().filter(e->trackentryName.equals(e.waveform.getFullName())).forEach(trackEntry -> + trackEntry.waveform.getEvents().values().stream().filter(Objects::nonNull).forEach(entries-> + Arrays.stream(entries).filter(e->e instanceof ITxEvent && txId.equals(((ITxEvent)e).getTransaction().getId())).forEach(event -> + waveformPane.setSelection(new StructuredSelection(new Object[] {((ITxEvent)event).getTransaction(), trackEntry}))))); } catch (NumberFormatException e) { } }