mirror of
https://github.com/angryip/ipscan.git
synced 2025-10-26 11:18:17 +00:00
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:
parent
e7ad7cb7d4
commit
6b11be87b2
3
TODO
3
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
|
||||
|
||||
|
||||
@ -26,3 +26,5 @@ xml
|
||||
lst
|
||||
clipboard
|
||||
ctrl
|
||||
compiz
|
||||
placeholder
|
||||
|
||||
@ -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"),
|
||||
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user