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
This commit is contained in:
angryziber 2007-11-06 21:32:17 +00:00
parent e7ad7cb7d4
commit 6b11be87b2
5 changed files with 86 additions and 13 deletions

3
TODO
View File

@ -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

View File

@ -26,3 +26,5 @@ xml
lst
clipboard
ctrl
compiz
placeholder

View File

@ -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"),

View File

@ -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());
}
}
}
});
}
}
}

View File

@ -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);
}
});
}
}
}