From 6b11be87b20dedfbd322959d1359de36e9bc29f4 Mon Sep 17 00:00:00 2001 From: angryziber Date: Tue, 6 Nov 2007 21:32:17 +0000 Subject: [PATCH] enabling/disabling of menu items and other controls during scanning implemented using StateTransitionListeners git-svn-id: https://ipscan.svn.sourceforge.net/svnroot/ipscan/trunk@232 375186e5-ef17-0410-b0b6-91563547dcda --- TODO | 3 +- dictionary.txt | 2 + .../azib/ipscan/config/ComponentRegistry.java | 2 + src/net/azib/ipscan/gui/MainMenu.java | 67 ++++++++++++++++--- src/net/azib/ipscan/gui/MainWindow.java | 25 ++++++- 5 files changed, 86 insertions(+), 13 deletions(-) diff --git a/TODO b/TODO index 89e51b16..84b29136 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,7 @@ Before 3.0 beta: * export/import of settings (profiles?) -* disabling of buttons/menus during scanning +* NetBIOS fetchers (like in 2.x) Before 3.0: @@ -11,7 +11,6 @@ Before 3.0: * multiple port support web-detect * add new fetchers by configuration of PortTextFetcher * startup as root option -* NetBIOS fetchers (like in 2.x) * compile librocksaw for mac * preferences & select fetchers buttons in the toolbar diff --git a/dictionary.txt b/dictionary.txt index 8faaab38..ed642880 100644 --- a/dictionary.txt +++ b/dictionary.txt @@ -26,3 +26,5 @@ xml lst clipboard ctrl +compiz +placeholder diff --git a/src/net/azib/ipscan/config/ComponentRegistry.java b/src/net/azib/ipscan/config/ComponentRegistry.java index 6cdb8973..1efe34c4 100755 --- a/src/net/azib/ipscan/config/ComponentRegistry.java +++ b/src/net/azib/ipscan/config/ComponentRegistry.java @@ -145,6 +145,7 @@ public class ComponentRegistry { anyComponentParameter, anyComponentParameter, anyComponentParameter, + anyComponentParameter, anyComponentParameter}); container.registerComponentImplementation(ResultTable.class, ResultTable.class, new Parameter[] { new ComponentParameter("mainShell"), @@ -160,6 +161,7 @@ public class ComponentRegistry { new ComponentParameter("mainShell"), new ComponentParameter("mainMenu"), new ComponentParameter("commandsMenu"), + anyComponentParameter, new ConstantParameter(container)}); container.registerComponentImplementation(MainMenu.ColumnsMenu.class, MainMenu.ColumnsMenu.class, new Parameter[] { new ComponentParameter("mainShell"), diff --git a/src/net/azib/ipscan/gui/MainMenu.java b/src/net/azib/ipscan/gui/MainMenu.java index 368266aa..e0ec8b4a 100755 --- a/src/net/azib/ipscan/gui/MainMenu.java +++ b/src/net/azib/ipscan/gui/MainMenu.java @@ -7,6 +7,9 @@ package net.azib.ipscan.gui; import net.azib.ipscan.config.Labels; import net.azib.ipscan.config.Platform; +import net.azib.ipscan.core.state.ScanningState; +import net.azib.ipscan.core.state.StateMachine; +import net.azib.ipscan.core.state.StateTransitionListener; import net.azib.ipscan.gui.actions.ColumnsActions; import net.azib.ipscan.gui.actions.CommandsActions; import net.azib.ipscan.gui.actions.FavoritesActions; @@ -36,7 +39,7 @@ public class MainMenu { private MutablePicoContainer container; - public MainMenu(Shell shell, Menu mainMenu, CommandsMenu resultsContextMenu, PicoContainer parentContainer) { + public MainMenu(Shell shell, Menu mainMenu, CommandsMenu resultsContextMenu, StateMachine stateMachine, PicoContainer parentContainer) { // create the menu-specific child container container = new DefaultPicoContainer(parentContainer); @@ -58,6 +61,9 @@ public class MainMenu { createMainMenuItems(mainMenu); createCommandsMenuItems(resultsContextMenu); + + stateMachine.addTransitionListener(new MenuEnablerDisabler(mainMenu)); + stateMachine.addTransitionListener(new MenuEnablerDisabler(resultsContextMenu)); } private void createMainMenuItems(Menu menu) { @@ -65,8 +71,8 @@ public class MainMenu { Menu subMenu = initMenu(menu, "menu.file"); // initMenuItem(subMenu, "menu.file.newWindow", "Ctrl+N", new Integer(SWT.MOD1 | 'N'), initListener(FileActions.NewWindow.class)); // initMenuItem(subMenu, null, null, null, null); - initMenuItem(subMenu, "menu.file.saveAll", "Ctrl+S", new Integer(SWT.MOD1 | 'S'), initListener(FileActions.SaveAll.class)); - initMenuItem(subMenu, "menu.file.saveSelection", null, null, initListener(FileActions.SaveSelection.class)); + initMenuItem(subMenu, "menu.file.saveAll", "Ctrl+S", new Integer(SWT.MOD1 | 'S'), initListener(FileActions.SaveAll.class), true); + initMenuItem(subMenu, "menu.file.saveSelection", null, null, initListener(FileActions.SaveSelection.class), true); initMenuItem(subMenu, null, null, null, null); initMenuItem(subMenu, "menu.file.exportPreferences", null, null, null); initMenuItem(subMenu, "menu.file.importPreferences", null, null, null); @@ -88,8 +94,8 @@ public class MainMenu { createFavoritesMenu(menu); subMenu = initMenu(menu, "menu.tools"); - initMenuItem(subMenu, "menu.tools.preferences", "Ctrl+O", new Integer(SWT.MOD1 | (Platform.MAC_OS ? ',' : 'O')), initListener(ToolsActions.Preferences.class)); - initMenuItem(subMenu, "menu.tools.fetchers", "Ctrl+Shift+O", new Integer(SWT.MOD1 | SWT.MOD2 | (Platform.MAC_OS ? ',' : 'O')), initListener(ToolsActions.SelectFetchers.class)); + initMenuItem(subMenu, "menu.tools.preferences", "Ctrl+O", new Integer(SWT.MOD1 | (Platform.MAC_OS ? ',' : 'O')), initListener(ToolsActions.Preferences.class), true); + initMenuItem(subMenu, "menu.tools.fetchers", "Ctrl+Shift+O", new Integer(SWT.MOD1 | SWT.MOD2 | (Platform.MAC_OS ? ',' : 'O')), initListener(ToolsActions.SelectFetchers.class), true); initMenuItem(subMenu, null, null, null, null); initMenuItem(subMenu, "menu.tools.delete", null, null, null); initMenuItem(subMenu, "menu.tools.scanInfo", "Ctrl+I", new Integer(SWT.MOD1 | 'I'), initListener(ToolsActions.ScanInfo.class)); @@ -111,8 +117,8 @@ public class MainMenu { private void createCommandsMenuItems(Menu menu) { initMenuItem(menu, "menu.commands.details", null, null, initListener(CommandsActions.Details.class)); initMenuItem(menu, null, null, null, null); - initMenuItem(menu, "menu.commands.rescan", "Ctrl+R", new Integer(SWT.MOD1 | 'R'), initListener(CommandsActions.Rescan.class)); - initMenuItem(menu, "menu.commands.delete", "Del", /* this is not a global key binding */ null, initListener(CommandsActions.Delete.class)); + initMenuItem(menu, "menu.commands.rescan", "Ctrl+R", new Integer(SWT.MOD1 | 'R'), initListener(CommandsActions.Rescan.class), true); + initMenuItem(menu, "menu.commands.delete", "Del", /* this is not a global key binding */ null, initListener(CommandsActions.Delete.class), true); initMenuItem(menu, null, null, null, null); initMenuItem(menu, "menu.commands.copy", "Ctrl+C", /* this is not a global key binding */ null, initListener(CommandsActions.CopyIP.class)); initMenuItem(menu, "menu.commands.copyDetails", null, null, initListener(CommandsActions.CopyIPDetails.class)); @@ -156,6 +162,10 @@ public class MainMenu { } static MenuItem initMenuItem(Menu parent, String label, String acceleratorText, Integer accelerator, Listener listener) { + return initMenuItem(parent, label, acceleratorText, accelerator, listener, false); + } + + static MenuItem initMenuItem(Menu parent, String label, String acceleratorText, Integer accelerator, Listener listener, boolean disableDuringScanning) { MenuItem menuItem = new MenuItem(parent, label == null ? SWT.SEPARATOR : SWT.PUSH); if (label != null) @@ -169,6 +179,10 @@ public class MainMenu { else menuItem.setEnabled(false); + if (disableDuringScanning) { + menuItem.setData("disableDuringScanning", Boolean.TRUE); + } + return menuItem; } @@ -179,6 +193,7 @@ public class MainMenu { public CommandsMenu(Decorations parent) { super(parent, SWT.POP_UP); } + protected void checkSubclass() { } // allow extending of Menu class } @@ -232,5 +247,41 @@ public class MainMenu { } protected void checkSubclass() { } // allow extending of Menu class } - + + /** + * State transition listener in order to enable/disable menu items of the + * specified menu. + */ + public static class MenuEnablerDisabler implements StateTransitionListener { + private Menu menu; + + public MenuEnablerDisabler(Menu menu) { + this.menu = menu; + } + + public void transitionTo(final ScanningState state) { + if (state != ScanningState.SCANNING && state != ScanningState.IDLE) + return; + + menu.getDisplay().asyncExec(new Runnable() { + public void run() { + processMenu(menu); + } + + public void processMenu(Menu menu) { + // processes menu items recursively + for (MenuItem item : menu.getItems()) { + if (item.getData("disableDuringScanning") == Boolean.TRUE) { + item.setEnabled(state == ScanningState.IDLE); + } + else + if (item.getMenu() != null) { + processMenu(item.getMenu()); + } + } + } + }); + } + } + } diff --git a/src/net/azib/ipscan/gui/MainWindow.java b/src/net/azib/ipscan/gui/MainWindow.java index bc62f9bb..4e7052df 100755 --- a/src/net/azib/ipscan/gui/MainWindow.java +++ b/src/net/azib/ipscan/gui/MainWindow.java @@ -10,6 +10,9 @@ import net.azib.ipscan.config.GlobalConfig; import net.azib.ipscan.config.Labels; import net.azib.ipscan.config.Platform; import net.azib.ipscan.config.Version; +import net.azib.ipscan.core.state.ScanningState; +import net.azib.ipscan.core.state.StateMachine; +import net.azib.ipscan.core.state.StateTransitionListener; import net.azib.ipscan.gui.MainMenu.CommandsMenu; import net.azib.ipscan.gui.actions.StartStopScanningAction; import net.azib.ipscan.gui.feeders.AbstractFeederGUI; @@ -55,7 +58,7 @@ public class MainWindow { /** * Creates and initializes the main window. */ - public MainWindow(Shell shell, GlobalConfig globalConfig, Composite feederArea, Composite controlsArea, Combo feederSelectionCombo, Button startStopButton, StartStopScanningAction startStopScanningAction, ResultTable resultTable, StatusBar statusBar, CommandsMenu resultsContextMenu, FeederGUIRegistry feederGUIRegistry) { + public MainWindow(Shell shell, GlobalConfig globalConfig, Composite feederArea, Composite controlsArea, Combo feederSelectionCombo, Button startStopButton, StartStopScanningAction startStopScanningAction, ResultTable resultTable, StatusBar statusBar, CommandsMenu resultsContextMenu, FeederGUIRegistry feederGUIRegistry, StateMachine stateMachine) { this.globalConfig = globalConfig; initShell(shell); @@ -73,7 +76,8 @@ public class MainWindow { shell.setMaximized(true); } else { - // set bounds twice - a workaround for a bug in SWT GTK + Compiz (otherwise window gets smaller and smaller each time) + // set bounds twice - a workaround for a bug in SWT GTK + Compiz + // (otherwise window gets smaller and smaller each time) shell.setBounds(Config.getDimensionsConfig().getWindowBounds()); } @@ -88,6 +92,8 @@ public class MainWindow { new GettingStartedDialog().open(); globalConfig.isFirstRun = false; } + + stateMachine.addTransitionListener(new EnablerDisabler()); } /** @@ -190,7 +196,7 @@ public class MainWindow { feederRegistry.select(feederSelectionCombo.getSelectionIndex()); // all this 'magic' is needed in order to resize everything properly - // and accomodate feeders with different sizes + // and accommodate feeders with different sizes Rectangle bounds = feederRegistry.current().getBounds(); FormData feederAreaLayoutData = ((FormData)feederArea.getLayoutData()); feederAreaLayoutData.height = bounds.height; @@ -201,5 +207,18 @@ public class MainWindow { shell.setText(feederRegistry.current().getFeederName() + " - " + Version.NAME); } } + + class EnablerDisabler implements StateTransitionListener { + public void transitionTo(final ScanningState state) { + if (state != ScanningState.SCANNING && state != ScanningState.IDLE) + return; + + shell.getDisplay().asyncExec(new Runnable() { + public void run() { + feederSelectionCombo.setEnabled(state == ScanningState.IDLE); + } + }); + } + } }