diff --git a/ipscan.iml b/ipscan.iml index c766cc95..0532e422 100644 --- a/ipscan.iml +++ b/ipscan.iml @@ -1,5 +1,5 @@ - + diff --git a/src/net/azib/ipscan/core/PluginLoader.java b/src/net/azib/ipscan/core/PluginLoader.java index 079211cf..7c49ade2 100644 --- a/src/net/azib/ipscan/core/PluginLoader.java +++ b/src/net/azib/ipscan/core/PluginLoader.java @@ -6,7 +6,6 @@ import net.azib.ipscan.config.LoggerFactory; import javax.inject.Singleton; import java.io.File; -import java.io.FilenameFilter; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; @@ -74,12 +73,7 @@ public class PluginLoader { File parentDir = ownFile.getParentFile(); if (parentDir == null || !parentDir.exists()) return; - File[] jars = parentDir.listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return name.endsWith(".jar") && !name.equals(ownFile.getName()); - } - }); + File[] jars = parentDir.listFiles((dir, name) -> name.endsWith(".jar") && !name.equals(ownFile.getName())); if (jars == null) return; PluginClassLoader loader = new PluginClassLoader(); diff --git a/src/net/azib/ipscan/core/ScanningResult.java b/src/net/azib/ipscan/core/ScanningResult.java index 0ceafb70..4449572e 100644 --- a/src/net/azib/ipscan/core/ScanningResult.java +++ b/src/net/azib/ipscan/core/ScanningResult.java @@ -128,6 +128,4 @@ public class ScanningResult { } return details.toString(); } - - } diff --git a/src/net/azib/ipscan/gui/AboutDialog.java b/src/net/azib/ipscan/gui/AboutDialog.java index 721cd3f3..64f74ae3 100644 --- a/src/net/azib/ipscan/gui/AboutDialog.java +++ b/src/net/azib/ipscan/gui/AboutDialog.java @@ -1,104 +1,104 @@ -package net.azib.ipscan.gui; - -import net.azib.ipscan.config.Labels; -import net.azib.ipscan.config.Version; -import net.azib.ipscan.gui.actions.BrowserLauncher; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.*; - -import javax.inject.Inject; - -import static net.azib.ipscan.config.Version.*; - -/** - * About Dialog - * - * @author Anton Keks - */ -public class AboutDialog extends AbstractModalDialog { - - @Inject - public AboutDialog() { - } - - @Override - protected void populateShell() { - shell.setText(Labels.getLabel("title.about")); - shell.setSize(new Point(400, 393)); - - Label iconLabel = new Label(shell, SWT.ICON); - iconLabel.setLocation(10, 10); - if (shell.getImage() != null) { - iconLabel.setImage(shell.getImage()); - } - iconLabel.pack(); - int leftBound = iconLabel.getBounds().width + 20; - - String aboutText = Labels.getLabel("text.about"); - aboutText = aboutText.replace("%NAME", NAME); - aboutText = aboutText.replace("%VERSION", getVersion()); - aboutText = aboutText.replace("%DATE", getBuildDate()); - aboutText = aboutText.replace("%COPYLEFT", COPYLEFT); - Label aboutLabel = new Label(shell, SWT.NONE); - aboutLabel.setText(aboutText); - aboutLabel.setLocation(leftBound, 10); - aboutLabel.pack(); - - Label websiteLabel = createLinkLabel(WEBSITE, WEBSITE); - websiteLabel.setLocation(leftBound, 10 + aboutLabel.getBounds().height); - - String systemText = Labels.getLabel("text.about.system"); - systemText = systemText.replace("%JAVA", System.getProperty("java.vm.vendor") + " " + System.getProperty("java.runtime.version")); - systemText = systemText.replace("%OS", System.getProperty("os.name") + " " + System.getProperty("os.version") + " (" + System.getProperty("os.arch") + ")"); - Label systemLabel = new Label(shell, SWT.NONE); - systemLabel.setText(systemText); - systemLabel.setLocation(leftBound, 20 + aboutLabel.getBounds().height + websiteLabel.getBounds().height); - systemLabel.pack(); - - Button button = createCloseButton(); - - Text licenseText = new Text(shell, SWT.BORDER | SWT.MULTI | SWT.READ_ONLY | SWT.V_SCROLL | SWT.WRAP); - licenseText.setBounds(leftBound, systemLabel.getBounds().y + systemLabel.getBounds().height + 10, - shell.getClientArea().width - leftBound - 10, - button.getLocation().y - systemLabel.getBounds().y - systemLabel.getBounds().height - 20); - licenseText.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); - licenseText.setText("Licensed under the GNU General Public License Version 2\n\n" + - NAME + " is free software; you can redistribute it and/or " + - "modify it under the terms of the GNU General Public License " + - "as published by the Free Software Foundation; either version 2 " + - "of the License, or (at your option) any later version.\n\n" + - NAME + " is distributed in the hope that it will be useful, " + - "but WITHOUT ANY WARRANTY; without even the implied warranty of " + - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " + - "GNU General Public License for more details."); - - Label fullLicenseLabel = createLinkLabel("Full license", Version.FULL_LICENSE_URL); - fullLicenseLabel.setLocation(leftBound, licenseText.getBounds().y + licenseText.getBounds().height + 10); - - Label privacyLabel = createLinkLabel("Privacy", Version.PRIVACY_URL); - privacyLabel.setLocation(leftBound + privacyLabel.getBounds().width + 40, fullLicenseLabel.getBounds().y); - } - - @Override - protected int getShellStyle() { - return super.getShellStyle() | SWT.SHEET; - } - - private Label createLinkLabel(final String text, final String url) { - final Label link = new Label(shell, SWT.NONE); - link.setForeground(new Color(null, 0, 0, 0xCC)); - link.setCursor(shell.getDisplay().getSystemCursor(SWT.CURSOR_HAND)); - link.setText(text); - link.addListener(SWT.MouseUp, new Listener() { - public void handleEvent(Event event) { - BrowserLauncher.openURL(url); - link.setForeground(new Color(null, 0x88, 0, 0xAA)); - } - }); - link.pack(); - return link; - } - -} +package net.azib.ipscan.gui; + +import net.azib.ipscan.config.Labels; +import net.azib.ipscan.config.Version; +import net.azib.ipscan.gui.actions.BrowserLauncher; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +import javax.inject.Inject; + +import static net.azib.ipscan.config.Version.*; + +/** + * About Dialog + * + * @author Anton Keks + */ +public class AboutDialog extends AbstractModalDialog { + + @Inject + public AboutDialog() { + } + + @Override + protected void populateShell() { + shell.setText(Labels.getLabel("title.about")); + shell.setSize(new Point(400, 393)); + + Label iconLabel = new Label(shell, SWT.ICON); + iconLabel.setLocation(10, 10); + if (shell.getImage() != null) { + iconLabel.setImage(shell.getImage()); + } + iconLabel.pack(); + int leftBound = iconLabel.getBounds().width + 20; + + String aboutText = Labels.getLabel("text.about"); + aboutText = aboutText.replace("%NAME", NAME); + aboutText = aboutText.replace("%VERSION", getVersion()); + aboutText = aboutText.replace("%DATE", getBuildDate()); + aboutText = aboutText.replace("%COPYLEFT", COPYLEFT); + Label aboutLabel = new Label(shell, SWT.NONE); + aboutLabel.setText(aboutText); + aboutLabel.setLocation(leftBound, 10); + aboutLabel.pack(); + + Label websiteLabel = createLinkLabel(WEBSITE, WEBSITE); + websiteLabel.setLocation(leftBound, 10 + aboutLabel.getBounds().height); + + String systemText = Labels.getLabel("text.about.system"); + systemText = systemText.replace("%JAVA", System.getProperty("java.vm.vendor") + " " + System.getProperty("java.runtime.version")); + systemText = systemText.replace("%OS", System.getProperty("os.name") + " " + System.getProperty("os.version") + " (" + System.getProperty("os.arch") + ")"); + Label systemLabel = new Label(shell, SWT.NONE); + systemLabel.setText(systemText); + systemLabel.setLocation(leftBound, 20 + aboutLabel.getBounds().height + websiteLabel.getBounds().height); + systemLabel.pack(); + + Button button = createCloseButton(); + + Text licenseText = new Text(shell, SWT.BORDER | SWT.MULTI | SWT.READ_ONLY | SWT.V_SCROLL | SWT.WRAP); + licenseText.setBounds(leftBound, systemLabel.getBounds().y + systemLabel.getBounds().height + 10, + shell.getClientArea().width - leftBound - 10, + button.getLocation().y - systemLabel.getBounds().y - systemLabel.getBounds().height - 20); + licenseText.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); + licenseText.setText("Licensed under the GNU General Public License Version 2\n\n" + + NAME + " is free software; you can redistribute it and/or " + + "modify it under the terms of the GNU General Public License " + + "as published by the Free Software Foundation; either version 2 " + + "of the License, or (at your option) any later version.\n\n" + + NAME + " is distributed in the hope that it will be useful, " + + "but WITHOUT ANY WARRANTY; without even the implied warranty of " + + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " + + "GNU General Public License for more details."); + + Label fullLicenseLabel = createLinkLabel("Full license", Version.FULL_LICENSE_URL); + fullLicenseLabel.setLocation(leftBound, licenseText.getBounds().y + licenseText.getBounds().height + 10); + + Label privacyLabel = createLinkLabel("Privacy", Version.PRIVACY_URL); + privacyLabel.setLocation(leftBound + privacyLabel.getBounds().width + 40, fullLicenseLabel.getBounds().y); + } + + @Override + protected int getShellStyle() { + return super.getShellStyle() | SWT.SHEET; + } + + private Label createLinkLabel(final String text, final String url) { + final Label link = new Label(shell, SWT.NONE); + link.setForeground(new Color(null, 0, 0, 0xCC)); + link.setCursor(shell.getDisplay().getSystemCursor(SWT.CURSOR_HAND)); + link.setText(text); + link.addListener(SWT.MouseUp, event -> { + BrowserLauncher.openURL(url); + link.setForeground(new Color(null, 0x88, 0, 0xAA)); + }); + link.pack(); + return link; + } + +} diff --git a/src/net/azib/ipscan/gui/AbstractModalDialog.java b/src/net/azib/ipscan/gui/AbstractModalDialog.java index 433a59eb..46ff44f3 100644 --- a/src/net/azib/ipscan/gui/AbstractModalDialog.java +++ b/src/net/azib/ipscan/gui/AbstractModalDialog.java @@ -150,11 +150,9 @@ public abstract class AbstractModalDialog { button.setText(Labels.getLabel("button.close")); positionButtons(button, null); - button.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - shell.close(); - shell.dispose(); - } + button.addListener(SWT.Selection, event -> { + shell.close(); + shell.dispose(); }); button.setFocus(); diff --git a/src/net/azib/ipscan/gui/DetailsWindow.java b/src/net/azib/ipscan/gui/DetailsWindow.java index d5fcc950..9a11fb8f 100644 --- a/src/net/azib/ipscan/gui/DetailsWindow.java +++ b/src/net/azib/ipscan/gui/DetailsWindow.java @@ -1,124 +1,120 @@ -package net.azib.ipscan.gui; - -import net.azib.ipscan.config.CommentsConfig; -import net.azib.ipscan.config.GUIConfig; -import net.azib.ipscan.config.Labels; -import net.azib.ipscan.core.ScanningResult; -import net.azib.ipscan.core.ScanningResultList; -import net.azib.ipscan.fetchers.CommentFetcher; -import net.azib.ipscan.gui.util.LayoutHelper; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.FocusEvent; -import org.eclipse.swt.events.FocusListener; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.layout.FormAttachment; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Text; - -import javax.inject.Inject; - -/** - * The "Show IP Details" Window - * - * @author Anton Keks - */ -public class DetailsWindow extends AbstractModalDialog { - @Inject CommentsConfig commentsConfig; - - private GUIConfig guiConfig; - private ResultTable resultTable; - private ScanningResultList scanningResults; - - int resultIndex; - private Text commentsText; - - @Inject public DetailsWindow(GUIConfig guiConfig, ResultTable resultTable, ScanningResultList scanningResults) { - this.guiConfig = guiConfig; - this.resultTable = resultTable; - this.scanningResults = scanningResults; - } - - @Override - protected int getShellStyle() { - return SWT.TOOL | SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.RESIZE; - } - - @Override - protected void populateShell() { - shell.setText(Labels.getLabel("title.details")); - shell.setLayout(LayoutHelper.formLayout(3, 3, 3)); - shell.setSize(guiConfig.detailsWindowSize); - - resultIndex = resultTable.getSelectionIndex(); - ScanningResult result = resultTable.getSelectedResult(); - - commentsText = new Text(shell, SWT.BORDER); // TODO: change to SWT.SEARCH in SWT 3.5 - commentsText.pack(); - commentsText.setLayoutData(LayoutHelper.formData(new FormAttachment(0), new FormAttachment(100), null, new FormAttachment(100))); - CommentsTextListener commentsTextListener = new CommentsTextListener(); - commentsText.addFocusListener(commentsTextListener); - commentsText.addModifyListener(commentsTextListener); - - String comment = commentsConfig.getComment(scanningResults, resultIndex); - if (comment != null) commentsText.setText(comment); - else commentsTextListener.focusLost(null); - - Text detailsText = new Text(shell, SWT.BORDER | SWT.READ_ONLY | SWT.MULTI | SWT.V_SCROLL | SWT.WRAP); - detailsText.setText(result.toString()); - detailsText.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); - detailsText.setTabs(32); - detailsText.setLayoutData(LayoutHelper.formData(new FormAttachment(0), new FormAttachment(100), new FormAttachment(0), new FormAttachment(commentsText))); - - Listener traverseListener = new TraverseListener(); - detailsText.addListener(SWT.Traverse, traverseListener); - commentsText.addListener(SWT.Traverse, traverseListener); - - shell.layout(); - detailsText.forceFocus(); - - shell.addListener(SWT.Close, new Listener() { - @Override public void handleEvent(Event event) { - guiConfig.detailsWindowSize = shell.getSize(); - } - }); - } - - class CommentsTextListener implements FocusListener, ModifyListener { - String defaultText = Labels.getLabel("text.comment.edit"); - - public void focusGained(FocusEvent e) { - if (commentsText.getText().equals(defaultText)) { - commentsText.setText(""); - commentsText.setForeground(commentsText.getDisplay().getSystemColor(SWT.COLOR_WIDGET_FOREGROUND)); - } - } - - public void focusLost(FocusEvent e) { - if (commentsText.getText().length() == 0) { - commentsText.setText(defaultText); - commentsText.setForeground(commentsText.getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW)); - } - } - - public void modifyText(ModifyEvent e) { - String newComment = commentsText.getText(); - if (!defaultText.equals(newComment)) { - // store the new comment - commentsConfig.setComment(scanningResults, resultIndex, newComment); - // now update the result table for user to immediately see the change - resultTable.updateResult(resultIndex, CommentFetcher.ID, newComment); - } - } - } - - class TraverseListener implements Listener { - public void handleEvent(Event e) { - if (e.detail == SWT.TRAVERSE_RETURN) { - shell.close(); - shell.dispose(); - } - } - } -} +package net.azib.ipscan.gui; + +import net.azib.ipscan.config.CommentsConfig; +import net.azib.ipscan.config.GUIConfig; +import net.azib.ipscan.config.Labels; +import net.azib.ipscan.core.ScanningResult; +import net.azib.ipscan.core.ScanningResultList; +import net.azib.ipscan.fetchers.CommentFetcher; +import net.azib.ipscan.gui.util.LayoutHelper; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.FocusListener; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.layout.FormAttachment; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Text; + +import javax.inject.Inject; + +/** + * The "Show IP Details" Window + * + * @author Anton Keks + */ +public class DetailsWindow extends AbstractModalDialog { + @Inject CommentsConfig commentsConfig; + + private GUIConfig guiConfig; + private ResultTable resultTable; + private ScanningResultList scanningResults; + + int resultIndex; + private Text commentsText; + + @Inject public DetailsWindow(GUIConfig guiConfig, ResultTable resultTable, ScanningResultList scanningResults) { + this.guiConfig = guiConfig; + this.resultTable = resultTable; + this.scanningResults = scanningResults; + } + + @Override + protected int getShellStyle() { + return SWT.TOOL | SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.RESIZE; + } + + @Override + protected void populateShell() { + shell.setText(Labels.getLabel("title.details")); + shell.setLayout(LayoutHelper.formLayout(3, 3, 3)); + shell.setSize(guiConfig.detailsWindowSize); + + resultIndex = resultTable.getSelectionIndex(); + ScanningResult result = resultTable.getSelectedResult(); + + commentsText = new Text(shell, SWT.BORDER); // TODO: change to SWT.SEARCH in SWT 3.5 + commentsText.pack(); + commentsText.setLayoutData(LayoutHelper.formData(new FormAttachment(0), new FormAttachment(100), null, new FormAttachment(100))); + CommentsTextListener commentsTextListener = new CommentsTextListener(); + commentsText.addFocusListener(commentsTextListener); + commentsText.addModifyListener(commentsTextListener); + + String comment = commentsConfig.getComment(scanningResults, resultIndex); + if (comment != null) commentsText.setText(comment); + else commentsTextListener.focusLost(null); + + Text detailsText = new Text(shell, SWT.BORDER | SWT.READ_ONLY | SWT.MULTI | SWT.V_SCROLL | SWT.WRAP); + detailsText.setText(result.toString()); + detailsText.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); + detailsText.setTabs(32); + detailsText.setLayoutData(LayoutHelper.formData(new FormAttachment(0), new FormAttachment(100), new FormAttachment(0), new FormAttachment(commentsText))); + + Listener traverseListener = new TraverseListener(); + detailsText.addListener(SWT.Traverse, traverseListener); + commentsText.addListener(SWT.Traverse, traverseListener); + + shell.layout(); + detailsText.forceFocus(); + + shell.addListener(SWT.Close, event -> guiConfig.detailsWindowSize = shell.getSize()); + } + + class CommentsTextListener implements FocusListener, ModifyListener { + String defaultText = Labels.getLabel("text.comment.edit"); + + public void focusGained(FocusEvent e) { + if (commentsText.getText().equals(defaultText)) { + commentsText.setText(""); + commentsText.setForeground(commentsText.getDisplay().getSystemColor(SWT.COLOR_WIDGET_FOREGROUND)); + } + } + + public void focusLost(FocusEvent e) { + if (commentsText.getText().length() == 0) { + commentsText.setText(defaultText); + commentsText.setForeground(commentsText.getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW)); + } + } + + public void modifyText(ModifyEvent e) { + String newComment = commentsText.getText(); + if (!defaultText.equals(newComment)) { + // store the new comment + commentsConfig.setComment(scanningResults, resultIndex, newComment); + // now update the result table for user to immediately see the change + resultTable.updateResult(resultIndex, CommentFetcher.ID, newComment); + } + } + } + + class TraverseListener implements Listener { + public void handleEvent(Event e) { + if (e.detail == SWT.TRAVERSE_RETURN) { + shell.close(); + shell.dispose(); + } + } + } +} diff --git a/src/net/azib/ipscan/gui/GettingStartedDialog.java b/src/net/azib/ipscan/gui/GettingStartedDialog.java index e6624991..c1318b65 100644 --- a/src/net/azib/ipscan/gui/GettingStartedDialog.java +++ b/src/net/azib/ipscan/gui/GettingStartedDialog.java @@ -1,95 +1,89 @@ -package net.azib.ipscan.gui; - -import net.azib.ipscan.config.Labels; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.*; - -import java.util.ArrayList; -import java.util.List; - -public class GettingStartedDialog extends AbstractModalDialog { - private int activePage; - private List texts = new ArrayList(); - private Text gettingStartedText; - private Button closeButton; - private Button nextButton; - - public GettingStartedDialog() { - int num = 1; - try { - while (true) { - texts.add(Labels.getLabel("text.gettingStarted" + num++)); - } - } - catch (Exception noMoreTexts) {} - } - - GettingStartedDialog prependText(String text) { - texts.add(0, text); - return this; - } - - @Override - protected void populateShell() { - Display currentDisplay = Display.getCurrent(); - Shell parent = currentDisplay != null ? currentDisplay.getActiveShell() : null; - shell = new Shell(parent, SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM); - - shell.setText(Labels.getLabel("title.gettingStarted")); - shell.setSize(new Point(500, 300)); - - Label iconLabel = new Label(shell, SWT.ICON); - iconLabel.setLocation(10, 10); - - if (parent != null) { - iconLabel.setImage(parent.getImage()); - shell.setImage(parent.getImage()); - } - iconLabel.pack(); - int leftBound = iconLabel.getBounds().width + 20; - - closeButton = new Button(shell, SWT.NONE); - closeButton.setText(Labels.getLabel("button.close")); - - nextButton = new Button(shell, SWT.NONE); - nextButton.setText(Labels.getLabel("button.next")); - nextButton.setFocus(); - - positionButtons(nextButton, closeButton); - - gettingStartedText = new Text(shell, SWT.BORDER | SWT.MULTI | SWT.READ_ONLY | SWT.V_SCROLL | SWT.WRAP); - gettingStartedText.setBounds(leftBound, 10, shell.getClientArea().width - leftBound - 10, closeButton.getLocation().y - 20); - gettingStartedText.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); - - closeButton.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - shell.close(); - shell.dispose(); - } - }); - nextButton.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - displayActivePage(); - } - }); - - displayActivePage(); - } - - @Override - protected int getShellStyle() { - return super.getShellStyle() | SWT.SHEET; - } - - private void displayActivePage() { - gettingStartedText.setText(texts.get(activePage++)); - - if (activePage >= texts.size()) { - nextButton.setEnabled(false); - shell.setDefaultButton(closeButton); - closeButton.setFocus(); - } - } - -} +package net.azib.ipscan.gui; + +import net.azib.ipscan.config.Labels; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.*; + +import java.util.ArrayList; +import java.util.List; + +public class GettingStartedDialog extends AbstractModalDialog { + private int activePage; + private List texts = new ArrayList(); + private Text gettingStartedText; + private Button closeButton; + private Button nextButton; + + public GettingStartedDialog() { + int num = 1; + try { + while (true) { + texts.add(Labels.getLabel("text.gettingStarted" + num++)); + } + } + catch (Exception noMoreTexts) {} + } + + GettingStartedDialog prependText(String text) { + texts.add(0, text); + return this; + } + + @Override + protected void populateShell() { + Display currentDisplay = Display.getCurrent(); + Shell parent = currentDisplay != null ? currentDisplay.getActiveShell() : null; + shell = new Shell(parent, SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM); + + shell.setText(Labels.getLabel("title.gettingStarted")); + shell.setSize(new Point(500, 300)); + + Label iconLabel = new Label(shell, SWT.ICON); + iconLabel.setLocation(10, 10); + + if (parent != null) { + iconLabel.setImage(parent.getImage()); + shell.setImage(parent.getImage()); + } + iconLabel.pack(); + int leftBound = iconLabel.getBounds().width + 20; + + closeButton = new Button(shell, SWT.NONE); + closeButton.setText(Labels.getLabel("button.close")); + + nextButton = new Button(shell, SWT.NONE); + nextButton.setText(Labels.getLabel("button.next")); + nextButton.setFocus(); + + positionButtons(nextButton, closeButton); + + gettingStartedText = new Text(shell, SWT.BORDER | SWT.MULTI | SWT.READ_ONLY | SWT.V_SCROLL | SWT.WRAP); + gettingStartedText.setBounds(leftBound, 10, shell.getClientArea().width - leftBound - 10, closeButton.getLocation().y - 20); + gettingStartedText.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); + + closeButton.addListener(SWT.Selection, event -> { + shell.close(); + shell.dispose(); + }); + nextButton.addListener(SWT.Selection, event -> displayActivePage()); + + displayActivePage(); + } + + @Override + protected int getShellStyle() { + return super.getShellStyle() | SWT.SHEET; + } + + private void displayActivePage() { + gettingStartedText.setText(texts.get(activePage++)); + + if (activePage >= texts.size()) { + nextButton.setEnabled(false); + shell.setDefaultButton(closeButton); + closeButton.setFocus(); + } + } + +} diff --git a/src/net/azib/ipscan/gui/MacApplicationMenu.java b/src/net/azib/ipscan/gui/MacApplicationMenu.java index 47bf2811..fc86840a 100644 --- a/src/net/azib/ipscan/gui/MacApplicationMenu.java +++ b/src/net/azib/ipscan/gui/MacApplicationMenu.java @@ -22,11 +22,7 @@ public class MacApplicationMenu { @Inject CheckVersion checkVersionListener; @Inject public MacApplicationMenu(final Display display) { - display.syncExec(new Runnable() { - public void run() { - initApplicationMenu(display); - } - }); + display.syncExec(() -> initApplicationMenu(display)); } private void initApplicationMenu(Display display) { diff --git a/src/net/azib/ipscan/gui/MainWindow.java b/src/net/azib/ipscan/gui/MainWindow.java index 64f0239c..38330079 100644 --- a/src/net/azib/ipscan/gui/MainWindow.java +++ b/src/net/azib/ipscan/gui/MainWindow.java @@ -86,11 +86,9 @@ public class MainWindow { startup.onStart(); stateMachine.addTransitionListener(new EnablerDisabler()); - Display.getCurrent().asyncExec(new Runnable() { - public void run() { - // asynchronously run init handlers outside of the constructor - stateMachine.init(); - } + Display.getCurrent().asyncExec(() -> { + // asynchronously run init handlers outside of the constructor + stateMachine.init(); }); } @@ -104,11 +102,9 @@ public class MainWindow { Image image = new Image(shell.getDisplay(), getClass().getResourceAsStream("/images/icon.png")); shell.setImage(image); - shell.addListener(SWT.Close, new Listener() { - public void handleEvent(Event event) { - // save dimensions! - guiConfig.setMainWindowSize(shell.getSize(), shell.getMaximized()); - } + shell.addListener(SWT.Close, event -> { + // save dimensions! + guiConfig.setMainWindowSize(shell.getSize(), shell.getMaximized()); }); } diff --git a/src/net/azib/ipscan/gui/PreferencesDialog.java b/src/net/azib/ipscan/gui/PreferencesDialog.java index f7ca7a94..3b566cf3 100644 --- a/src/net/azib/ipscan/gui/PreferencesDialog.java +++ b/src/net/azib/ipscan/gui/PreferencesDialog.java @@ -325,11 +325,7 @@ public class PreferencesDialog extends AbstractModalDialog { adaptTimeoutCheckbox = new Button(timingGroup, SWT.CHECK); adaptTimeoutCheckbox.setText(Labels.getLabel("preferences.ports.timing.adaptTimeout")); adaptTimeoutCheckbox.setLayoutData(gridData1); - adaptTimeoutCheckbox.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - minPortTimeoutText.setEnabled(adaptTimeoutCheckbox.getSelection()); - } - }); + adaptTimeoutCheckbox.addListener(SWT.Selection, event -> minPortTimeoutText.setEnabled(adaptTimeoutCheckbox.getSelection())); label = new Label(timingGroup, SWT.NONE); label.setText(Labels.getLabel("preferences.ports.timing.minTimeout")); diff --git a/src/net/azib/ipscan/gui/ResultTable.java b/src/net/azib/ipscan/gui/ResultTable.java index ef59c905..33fe2f6d 100644 --- a/src/net/azib/ipscan/gui/ResultTable.java +++ b/src/net/azib/ipscan/gui/ResultTable.java @@ -130,23 +130,21 @@ public class ResultTable extends Table implements FetcherRegistryUpdateListener, public void addOrUpdateResultRow(final ScanningResult result) { if (isDisposed()) return; - getDisplay().asyncExec(new Runnable() { - public void run() { - if (isDisposed()) - return; - - if (scanningResults.isRegistered(result)) { - // just redraw the item - int index = scanningResults.update(result); - clear(index); - } - else { - // first register, then add - otherwise first redraw may fail (the table is virtual) - int index = getItemCount(); - scanningResults.registerAtIndex(index, result); - // setItemCount(index+1) - this seems to rebuild TableItems inside, so is slower - new TableItem(ResultTable.this, SWT.NONE); - } + getDisplay().asyncExec(() -> { + if (isDisposed()) + return; + + if (scanningResults.isRegistered(result)) { + // just redraw the item + int index = scanningResults.update(result); + clear(index); + } + else { + // first register, then add - otherwise first redraw may fail (the table is virtual) + int index = getItemCount(); + scanningResults.registerAtIndex(index, result); + // setItemCount(index+1) - this seems to rebuild TableItems inside, so is slower + new TableItem(ResultTable.this, SWT.NONE); } }); } diff --git a/src/net/azib/ipscan/gui/SWTAwareStateMachine.java b/src/net/azib/ipscan/gui/SWTAwareStateMachine.java index b43a28a7..0771a837 100644 --- a/src/net/azib/ipscan/gui/SWTAwareStateMachine.java +++ b/src/net/azib/ipscan/gui/SWTAwareStateMachine.java @@ -34,11 +34,7 @@ public class SWTAwareStateMachine extends StateMachine { return; // call super asynchronously in the correct thread - display.asyncExec(new Runnable() { - public void run() { - SWTAwareStateMachine.super.notifyAboutTransition(transition); - } - }); + display.asyncExec(() -> SWTAwareStateMachine.super.notifyAboutTransition(transition)); } } diff --git a/src/net/azib/ipscan/gui/SelectFetchersDialog.java b/src/net/azib/ipscan/gui/SelectFetchersDialog.java index 4c3d9857..899f40dc 100644 --- a/src/net/azib/ipscan/gui/SelectFetchersDialog.java +++ b/src/net/azib/ipscan/gui/SelectFetchersDialog.java @@ -144,18 +144,14 @@ public class SelectFetchersDialog extends AbstractModalDialog { shell.pack(); - cancelButton.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event e) { - shell.close(); - shell.dispose(); - } + cancelButton.addListener(SWT.Selection, e -> { + shell.close(); + shell.dispose(); }); - okButton.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event event) { - saveFetchersToRegistry(selectedFetchersList.getItems()); - shell.close(); - shell.dispose(); - } + okButton.addListener(SWT.Selection, event -> { + saveFetchersToRegistry(selectedFetchersList.getItems()); + shell.close(); + shell.dispose(); }); } diff --git a/src/net/azib/ipscan/gui/Startup.java b/src/net/azib/ipscan/gui/Startup.java index 02fc6d07..2a2e6d93 100644 --- a/src/net/azib/ipscan/gui/Startup.java +++ b/src/net/azib/ipscan/gui/Startup.java @@ -21,18 +21,16 @@ public class Startup { public void onStart() { if (guiConfig.isFirstRun) { new GoogleAnalytics().asyncReport("First run"); - Display.getCurrent().asyncExec(new Runnable() { - public void run() { - GettingStartedDialog dialog = new GettingStartedDialog(); - if (Platform.CRIPPLED_WINDOWS) - dialog.prependText(Labels.getLabel("text.crippledWindowsInfo")); - if (Platform.GNU_JAVA) - dialog.prependText(Labels.getLabel("text.gnuJavaInfo")); + Display.getCurrent().asyncExec(() -> { + GettingStartedDialog dialog = new GettingStartedDialog(); + if (Platform.CRIPPLED_WINDOWS) + dialog.prependText(Labels.getLabel("text.crippledWindowsInfo")); + if (Platform.GNU_JAVA) + dialog.prependText(Labels.getLabel("text.gnuJavaInfo")); - shell.forceActive(); - dialog.open(); - guiConfig.isFirstRun = false; - } + shell.forceActive(); + dialog.open(); + guiConfig.isFirstRun = false; }); } else if (!Version.getVersion().equals(guiConfig.lastRunVersion)) { diff --git a/src/net/azib/ipscan/gui/actions/FeederActions.java b/src/net/azib/ipscan/gui/actions/FeederActions.java index ec1a1190..b6db7229 100644 --- a/src/net/azib/ipscan/gui/actions/FeederActions.java +++ b/src/net/azib/ipscan/gui/actions/FeederActions.java @@ -1,127 +1,125 @@ -package net.azib.ipscan.gui.actions; - -import net.azib.ipscan.config.LoggerFactory; -import net.azib.ipscan.feeders.FeederException; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.TraverseEvent; -import org.eclipse.swt.events.TraverseListener; -import org.eclipse.swt.widgets.*; - -import java.net.*; -import java.util.Enumeration; -import java.util.logging.Level; -import java.util.logging.Logger; - -import static java.net.NetworkInterface.getNetworkInterfaces; - -/** - * FeederActions - * TODO: tests - * - * @author Anton Keks - */ -public class FeederActions { - - static final Logger LOG = LoggerFactory.getLogger(); - - public static class HostnameButton extends SelectionAdapter implements TraverseListener { - private Text hostnameText; - private Text ipText; - private Combo netmaskCombo; - - public HostnameButton(Text hostnameText, Text ipText, Combo netmaskCombo) { - this.hostnameText = hostnameText; - this.ipText = ipText; - this.netmaskCombo = netmaskCombo; - } - - public void widgetSelected(SelectionEvent event) { - String hostname = hostnameText.getText(); - - try { - if (hostname.equals(InetAddress.getLocalHost().getHostName())) { - askLocalIPAddress(); - } - else { - // resolve remote address - InetAddress address = InetAddress.getByName(hostname); - ipText.setText(address.getHostAddress()); - - // now update the hostname itself using a reverse lookup - String realHostname = address.getCanonicalHostName(); - if (!address.getHostAddress().equals(realHostname)) { - // if a hostname was returned, not the same IP address - hostnameText.setText(realHostname); - hostnameText.setSelection(realHostname.length()); - } - } - } - catch (UnknownHostException e) { - throw new FeederException("invalidHostname"); - } - } - - public void keyTraversed(TraverseEvent e) { - if (e.detail == SWT.TRAVERSE_RETURN) { - widgetSelected(null); - e.doit = false; - } - } - - /** - * Asks user which local IP address they want to use - */ - private void askLocalIPAddress() { - try { - Menu popupMenu = new Menu(Display.getCurrent().getActiveShell(), SWT.POP_UP); - Listener menuItemListener = new Listener() { - public void handleEvent(Event event) { - MenuItem menuItem = (MenuItem) event.widget; - String address = (String) menuItem.getData(); - ipText.setText(address.substring(0, address.lastIndexOf('/'))); - netmaskCombo.setText(address.substring(address.lastIndexOf('/'))); -// netmaskCombo.traverse(SWT.TRAVERSE_RETURN); - menuItem.getParent().dispose(); - } - }; - - for (Enumeration i = getNetworkInterfaces(); i.hasMoreElements(); ) { - NetworkInterface networkInterface = i.nextElement(); - for (InterfaceAddress ifaddr : networkInterface.getInterfaceAddresses()) { - if (ifaddr == null) continue; - InetAddress address = ifaddr.getAddress(); - if (address instanceof Inet4Address && !address.isLoopbackAddress()) { - MenuItem menuItem = new MenuItem(popupMenu, 0); - menuItem.setText(networkInterface.getDisplayName() + ": " + address.getHostAddress()); - menuItem.setData(address.getHostAddress() + "/" + ifaddr.getNetworkPrefixLength()); - menuItem.addListener(SWT.Selection, menuItemListener); - } - } - } - - if (popupMenu.getItemCount() > 1) { - popupMenu.setLocation(Display.getCurrent().getCursorLocation()); - popupMenu.setVisible(true); - } - else { - // emulate click on the single menu item - if (popupMenu.getItemCount() == 1) { - Event event = new Event(); - event.widget = popupMenu.getItem(0); - menuItemListener.handleEvent(event); - popupMenu.dispose(); - } - // otherwise, unable to retrieve any sane local addresses, - // leave the field as-is, which probably shows the loopback address already - } - } - catch (SocketException e) { - LOG.log(Level.FINE, "Cannot enumerate network interfaces", e); - } - } - } - -} - +package net.azib.ipscan.gui.actions; + +import net.azib.ipscan.config.LoggerFactory; +import net.azib.ipscan.feeders.FeederException; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.TraverseEvent; +import org.eclipse.swt.events.TraverseListener; +import org.eclipse.swt.widgets.*; + +import java.net.*; +import java.util.Enumeration; +import java.util.logging.Level; +import java.util.logging.Logger; + +import static java.net.NetworkInterface.getNetworkInterfaces; + +/** + * FeederActions + * TODO: tests + * + * @author Anton Keks + */ +public class FeederActions { + + static final Logger LOG = LoggerFactory.getLogger(); + + public static class HostnameButton extends SelectionAdapter implements TraverseListener { + private Text hostnameText; + private Text ipText; + private Combo netmaskCombo; + + public HostnameButton(Text hostnameText, Text ipText, Combo netmaskCombo) { + this.hostnameText = hostnameText; + this.ipText = ipText; + this.netmaskCombo = netmaskCombo; + } + + public void widgetSelected(SelectionEvent event) { + String hostname = hostnameText.getText(); + + try { + if (hostname.equals(InetAddress.getLocalHost().getHostName())) { + askLocalIPAddress(); + } + else { + // resolve remote address + InetAddress address = InetAddress.getByName(hostname); + ipText.setText(address.getHostAddress()); + + // now update the hostname itself using a reverse lookup + String realHostname = address.getCanonicalHostName(); + if (!address.getHostAddress().equals(realHostname)) { + // if a hostname was returned, not the same IP address + hostnameText.setText(realHostname); + hostnameText.setSelection(realHostname.length()); + } + } + } + catch (UnknownHostException e) { + throw new FeederException("invalidHostname"); + } + } + + public void keyTraversed(TraverseEvent e) { + if (e.detail == SWT.TRAVERSE_RETURN) { + widgetSelected(null); + e.doit = false; + } + } + + /** + * Asks user which local IP address they want to use + */ + private void askLocalIPAddress() { + try { + Menu popupMenu = new Menu(Display.getCurrent().getActiveShell(), SWT.POP_UP); + Listener menuItemListener = event -> { + MenuItem menuItem = (MenuItem) event.widget; + String address = (String) menuItem.getData(); + ipText.setText(address.substring(0, address.lastIndexOf('/'))); +netmaskCombo.setText(address.substring(address.lastIndexOf('/'))); +// netmaskCombo.traverse(SWT.TRAVERSE_RETURN); + menuItem.getParent().dispose(); + }; + + for (Enumeration i = getNetworkInterfaces(); i.hasMoreElements(); ) { + NetworkInterface networkInterface = i.nextElement(); + for (InterfaceAddress ifaddr : networkInterface.getInterfaceAddresses()) { + if (ifaddr == null) continue; + InetAddress address = ifaddr.getAddress(); + if (address instanceof Inet4Address && !address.isLoopbackAddress()) { + MenuItem menuItem = new MenuItem(popupMenu, 0); + menuItem.setText(networkInterface.getDisplayName() + ": " + address.getHostAddress()); + menuItem.setData(address.getHostAddress() + "/" + ifaddr.getNetworkPrefixLength()); + menuItem.addListener(SWT.Selection, menuItemListener); + } + } + } + + if (popupMenu.getItemCount() > 1) { + popupMenu.setLocation(Display.getCurrent().getCursorLocation()); + popupMenu.setVisible(true); + } + else { + // emulate click on the single menu item + if (popupMenu.getItemCount() == 1) { + Event event = new Event(); + event.widget = popupMenu.getItem(0); + menuItemListener.handleEvent(event); + popupMenu.dispose(); + } + // otherwise, unable to retrieve any sane local addresses, + // leave the field as-is, which probably shows the loopback address already + } + } + catch (SocketException e) { + LOG.log(Level.FINE, "Cannot enumerate network interfaces", e); + } + } + } + +} + diff --git a/src/net/azib/ipscan/gui/actions/HelpMenuActions.java b/src/net/azib/ipscan/gui/actions/HelpMenuActions.java index 9a08be8b..41bf5bde 100644 --- a/src/net/azib/ipscan/gui/actions/HelpMenuActions.java +++ b/src/net/azib/ipscan/gui/actions/HelpMenuActions.java @@ -147,16 +147,14 @@ public class HelpMenuActions { // show the box in the SWT thread final String messageToShow = message; final int messageStyleToShow = messageStyle; - Display.getDefault().asyncExec(new Runnable() { - public void run() { - statusBar.setStatusText(null); - if (messageToShow == null) return; - MessageBox messageBox = new MessageBox(statusBar.getShell(), messageStyleToShow | SWT.SHEET); - messageBox.setText(Version.getFullName()); - messageBox.setMessage(messageToShow); - if (messageBox.open() == SWT.YES) { - BrowserLauncher.openURL(Version.DOWNLOAD_URL); - } + Display.getDefault().asyncExec(() -> { + statusBar.setStatusText(null); + if (messageToShow == null) return; + MessageBox messageBox = new MessageBox(statusBar.getShell(), messageStyleToShow | SWT.SHEET); + messageBox.setText(Version.getFullName()); + messageBox.setMessage(messageToShow); + if (messageBox.open() == SWT.YES) { + BrowserLauncher.openURL(Version.DOWNLOAD_URL); } }); } diff --git a/src/net/azib/ipscan/gui/actions/ScanMenuActions.java b/src/net/azib/ipscan/gui/actions/ScanMenuActions.java index 6abb81dd..15b68a29 100644 --- a/src/net/azib/ipscan/gui/actions/ScanMenuActions.java +++ b/src/net/azib/ipscan/gui/actions/ScanMenuActions.java @@ -181,11 +181,7 @@ public class ScanMenuActions { // in case of isSelection we need to create our filter ScanningResultFilter filter = null; if (isSelection) { - filter = new ScanningResultFilter() { - public boolean apply(int index, ScanningResult result) { - return resultTable.isSelected(index); - } - }; + filter = (index, result) -> resultTable.isSelected(index); } exportProcessor.process(resultTable.getScanningResults(), filter); diff --git a/src/net/azib/ipscan/gui/actions/StartStopScanningAction.java b/src/net/azib/ipscan/gui/actions/StartStopScanningAction.java index 303eb317..717c6dff 100644 --- a/src/net/azib/ipscan/gui/actions/StartStopScanningAction.java +++ b/src/net/azib/ipscan/gui/actions/StartStopScanningAction.java @@ -250,27 +250,25 @@ public class StartStopScanningAction implements SelectionListener, ScanningProgr public void updateProgress(final InetAddress currentAddress, final int runningThreads, final int percentageComplete) { if (display.isDisposed()) return; - display.asyncExec(new Runnable() { - public void run() { - if (statusBar.isDisposed()) return; - - // update status bar - if (currentAddress != null) { - statusBar.setStatusText(Labels.getLabel("state.scanning") + currentAddress.getHostAddress()); - } - statusBar.setRunningThreads(runningThreads); - statusBar.setProgress(percentageComplete); - if (taskBarItem != null) taskBarItem.setProgress(percentageComplete); - - // show percentage in main window title - if (!stateMachine.inState(IDLE)) - statusBar.getShell().setText(percentageComplete + "% - " + mainWindowTitle); - else - statusBar.getShell().setText(mainWindowTitle); + display.asyncExec(() -> { + if (statusBar.isDisposed()) return; - // change button image according to the current state - button.setImage(buttonImages[stateMachine.getState().ordinal()]); + // update status bar + if (currentAddress != null) { + statusBar.setStatusText(Labels.getLabel("state.scanning") + currentAddress.getHostAddress()); } + statusBar.setRunningThreads(runningThreads); + statusBar.setProgress(percentageComplete); + if (taskBarItem != null) taskBarItem.setProgress(percentageComplete); + + // show percentage in main window title + if (!stateMachine.inState(IDLE)) + statusBar.getShell().setText(percentageComplete + "% - " + mainWindowTitle); + else + statusBar.getShell().setText(mainWindowTitle); + + // change button image according to the current state + button.setImage(buttonImages[stateMachine.getState().ordinal()]); }); } diff --git a/src/net/azib/ipscan/gui/feeders/AbstractFeederGUI.java b/src/net/azib/ipscan/gui/feeders/AbstractFeederGUI.java index b8a08b1c..01b92f87 100644 --- a/src/net/azib/ipscan/gui/feeders/AbstractFeederGUI.java +++ b/src/net/azib/ipscan/gui/feeders/AbstractFeederGUI.java @@ -82,15 +82,13 @@ public abstract class AbstractFeederGUI extends Composite implements FeederCreat localName = localInterface.getAddress().getHostName(); } } - Display.getDefault().asyncExec(new Runnable() { - public void run() { - // fill the IP and hostname fields with local hostname and IP addresses - if ("".equals(hostnameText.getText())) - hostnameText.setText(localName); - if ("".equals(ipText.getText())) { - ipText.setText(localInterface.getAddress().getHostAddress()); - afterLocalHostInfoFilled(localInterface); - } + Display.getDefault().asyncExec(() -> { + // fill the IP and hostname fields with local hostname and IP addresses + if ("".equals(hostnameText.getText())) + hostnameText.setText(localName); + if ("".equals(ipText.getText())) { + ipText.setText(localInterface.getAddress().getHostAddress()); + afterLocalHostInfoFilled(localInterface); } }); } diff --git a/src/net/azib/ipscan/gui/feeders/RandomFeederGUI.java b/src/net/azib/ipscan/gui/feeders/RandomFeederGUI.java index 2d9daa4f..aa95de3f 100644 --- a/src/net/azib/ipscan/gui/feeders/RandomFeederGUI.java +++ b/src/net/azib/ipscan/gui/feeders/RandomFeederGUI.java @@ -9,8 +9,6 @@ import net.azib.ipscan.feeders.Feeder; import net.azib.ipscan.feeders.RandomFeeder; import net.azib.ipscan.gui.actions.FeederActions; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.TraverseEvent; -import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; @@ -91,14 +89,12 @@ public class RandomFeederGUI extends AbstractFeederGUI { countSpinner.setMaximum(100000000); countSpinner.setMinimum(1); countSpinner.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - countSpinner.addTraverseListener(new TraverseListener() { - public void keyTraversed(TraverseEvent e) { - // this due to a bug either in SWT or GTK: - // spinner getText() returns the new value only if - // it has lost the focus first - ipPrototypeText.forceFocus(); - countSpinner.forceFocus(); - } + countSpinner.addTraverseListener(e -> { + // this due to a bug either in SWT or GTK: + // spinner getText() returns the new value only if + // it has lost the focus first + ipPrototypeText.forceFocus(); + countSpinner.forceFocus(); }); pack();