public void transitionTo(final ScanningState state, final Transition transition) {
    if (statusBar.isDisposed() || transition == Transition.INIT) return;

    // TODO: separate GUI and non-GUI stuff
    switch (state) {
      case IDLE:
        // reset state text
        button.setEnabled(true);
        updateProgress(null, 0, 0);
        statusBar.setStatusText(null);
        break;
      case STARTING:
        // start the scan from scratch!
        resultTable.removeAll();
        try {
          scannerThread =
              scannerThreadFactory.createScannerThread(
                  feederRegistry.createFeeder(),
                  StartStopScanningAction.this,
                  createResultsCallback(state));
          stateMachine.startScanning();
          mainWindowTitle = statusBar.getShell().getText();
        } catch (RuntimeException e) {
          stateMachine.reset();
          throw e;
        }
        break;
      case RESTARTING:
        // restart the scanning - rescan
        resultTable.resetSelection();
        try {
          scannerThread =
              scannerThreadFactory.createScannerThread(
                  feederRegistry.createRescanFeeder(resultTable.getSelection()),
                  StartStopScanningAction.this,
                  createResultsCallback(state));
          stateMachine.startScanning();
          mainWindowTitle = statusBar.getShell().getText();
        } catch (RuntimeException e) {
          stateMachine.reset();
          throw e;
        }
        break;
      case SCANNING:
        scannerThread.start();
        break;
      case STOPPING:
        statusBar.setStatusText(Labels.getLabel("state.waitForThreads"));
        break;
      case KILLING:
        button.setEnabled(false);
        statusBar.setStatusText(Labels.getLabel("state.killingThreads"));
        break;
    }
    // change button image
    button.setImage(buttonImages[state.ordinal()]);
    button.setText(buttonTexts[state.ordinal()]);
  }
  /** This method initializes main controls of the main window */
  private void initControlsArea(
      final Composite controlsArea,
      final Combo feederSelectionCombo,
      final Button startStopButton,
      final StartStopScanningAction startStopScanningAction,
      final ToolsActions.Preferences preferencesListener,
      final ToolsActions.ChooseFetchers chooseFetchersListsner) {
    controlsArea.setLayoutData(
        LayoutHelper.formData(
            new FormAttachment(feederArea),
            new FormAttachment(100),
            new FormAttachment(0),
            new FormAttachment(feederArea, 0, SWT.BOTTOM)));
    controlsArea.setLayout(LayoutHelper.formLayout(7, 3, 3));

    // steal the height from the second child of the FeederGUI - this must be the first edit box.
    // this results in better visual alignment with FeederGUIs
    Control secondControl = feederRegistry.current().getChildren()[1];
    // initialize global standard button height
    buttonHeight = secondControl.getSize().y + 2;

    // feeder selection combobox
    this.feederSelectionCombo = feederSelectionCombo;
    feederSelectionCombo.pack();
    IPFeederSelectionListener feederSelectionListener = new IPFeederSelectionListener();
    feederSelectionCombo.addSelectionListener(feederSelectionListener);
    // initialize the selected feeder GUI
    feederSelectionCombo.select(guiConfig.activeFeeder);
    feederSelectionCombo.setToolTipText(Labels.getLabel("combobox.feeder.tooltip"));

    // start/stop button
    this.startStopButton = startStopButton;
    shell.setDefaultButton(startStopButton);
    startStopButton.addSelectionListener(startStopScanningAction);

    // traverse the button before the combo (and don't traverse other buttons at all)
    controlsArea.setTabList(new Control[] {startStopButton, feederSelectionCombo});

    prefsButton = new ToolBar(controlsArea, SWT.FLAT);
    prefsButton.setCursor(prefsButton.getDisplay().getSystemCursor(SWT.CURSOR_HAND));
    ToolItem item = new ToolItem(prefsButton, SWT.PUSH);
    item.setImage(new Image(null, Labels.getInstance().getImageAsStream("button.preferences.img")));
    item.setToolTipText(Labels.getLabel("title.preferences"));
    item.addListener(SWT.Selection, preferencesListener);

    fetchersButton = new ToolBar(controlsArea, SWT.FLAT);
    fetchersButton.setCursor(fetchersButton.getDisplay().getSystemCursor(SWT.CURSOR_HAND));
    item = new ToolItem(fetchersButton, SWT.PUSH);
    item.setImage(new Image(null, Labels.getInstance().getImageAsStream("button.fetchers.img")));
    item.setToolTipText(Labels.getLabel("title.fetchers.select"));
    item.addListener(SWT.Selection, chooseFetchersListsner);

    feederSelectionListener.widgetSelected(null);
  }
  private void relayoutControls() {
    boolean twoRowToolbar = Math.abs(feederRegistry.current().getSize().y - buttonHeight * 2) <= 10;

    feederSelectionCombo.setLayoutData(
        LayoutHelper.formData(
            SWT.DEFAULT, buttonHeight, new FormAttachment(0), null, new FormAttachment(0), null));
    if (twoRowToolbar) {
      startStopButton.setLayoutData(
          LayoutHelper.formData(
              feederSelectionCombo.getSize().x,
              Platform.MAC_OS ? SWT.DEFAULT : buttonHeight,
              new FormAttachment(0),
              null,
              new FormAttachment(feederSelectionCombo, 0),
              null));
      prefsButton.setLayoutData(
          LayoutHelper.formData(
              new FormAttachment(feederSelectionCombo),
              null,
              new FormAttachment(feederSelectionCombo, 0, SWT.CENTER),
              null));
      fetchersButton.setLayoutData(
          LayoutHelper.formData(
              new FormAttachment(startStopButton),
              null,
              new FormAttachment(startStopButton, 0, SWT.CENTER),
              null));
    } else {
      startStopButton.setLayoutData(
          LayoutHelper.formData(
              feederSelectionCombo.getSize().x,
              Platform.MAC_OS ? SWT.DEFAULT : buttonHeight,
              new FormAttachment(feederSelectionCombo),
              null,
              new FormAttachment(-1),
              null));
      prefsButton.setLayoutData(
          LayoutHelper.formData(
              new FormAttachment(startStopButton),
              null,
              new FormAttachment(feederSelectionCombo, 0, SWT.CENTER),
              null));
      fetchersButton.setLayoutData(
          LayoutHelper.formData(
              new FormAttachment(prefsButton),
              null,
              new FormAttachment(startStopButton, 0, SWT.CENTER),
              null));
    }
  }