private void register(ModeController modeController) {
    modeController.addExtension(
        IScriptEditorStarter.class,
        new IScriptEditorStarter() {
          public String startEditor(final String pScriptInput) {
            final ScriptModel scriptModel = new ScriptModel(pScriptInput);
            final ScriptEditorPanel scriptEditorPanel = new ScriptEditorPanel(scriptModel, false);
            scriptEditorPanel.setVisible(true);
            return scriptModel.getScript();
          }

          public ComboBoxEditor createComboBoxEditor(Dimension minimumSize) {
            final ScriptComboBoxEditor scriptComboBoxEditor = new ScriptComboBoxEditor();
            if (minimumSize != null) scriptComboBoxEditor.setMinimumSize(minimumSize);
            return scriptComboBoxEditor;
          }
        });
    modeController.addExtension(
        IScriptStarter.class,
        new IScriptStarter() {
          public void executeScript(NodeModel node, String script) {
            ScriptingEngine.executeScript(node, script);
          }
        });
    registerScriptAddOns();
    if (!modeController.getController().getViewController().isHeadless()) {
      final IUserInputListenerFactory userInputListenerFactory =
          modeController.getUserInputListenerFactory();
      addPropertiesToOptionPanel();
      final MenuBuilder menuBuilder = userInputListenerFactory.getMenuBuilder();
      modeController.addAction(new ScriptEditor());
      modeController.addAction(new ExecuteScriptForAllNodes());
      modeController.addAction(new ExecuteScriptForSelectionAction());
      final ManageAddOnsAction manageAddOnsAction = new ManageAddOnsAction();
      modeController.addAction(manageAddOnsAction);
      modeController.addExtension(
          AddOnInstaller.class,
          new AddOnInstaller() {
            public void install(final URL url) {
              final ManageAddOnsDialog dialog = manageAddOnsAction.getDialog();
              // FIXME: method does not exist --> boercher
              // dialog.install(url);
            }
          });
      final ScriptingConfiguration configuration = new ScriptingConfiguration();
      ScriptingEngine.setClasspath(configuration.getClasspath());
      ScriptCompiler.compileScriptsOnPath(configuration.getClasspath());
      modeController.addMenuContributor(
          new IMenuContributor() {
            public void updateMenus(ModeController modeController, MenuBuilder builder) {
              registerScripts(menuBuilder, configuration);
            }
          });
      createUserScriptsDirectory();
    }
    FilterController.getCurrentFilterController()
        .getConditionFactory()
        .addConditionController(10, new ScriptConditionController());
  }
 private void registerScripts(
     final MenuBuilder menuBuilder, ScriptingConfiguration configuration) {
   final HashSet<String> registeredLocations = new HashSet<String>();
   for (final String scriptsParentLocation : ScriptingConfiguration.getScriptsParentLocations()) {
     final String scriptsLocation =
         ScriptingConfiguration.getScriptsLocation(scriptsParentLocation);
     addSubMenu(
         menuBuilder,
         scriptsParentLocation,
         scriptsLocation,
         TextUtils.getText("ExecuteScripts.text"));
     registeredLocations.add(scriptsLocation);
     if (configuration.getNameScriptMap().isEmpty()) {
       final String message =
           "<html><body><em>"
               + TextUtils.getText("ExecuteScripts.noScriptsAvailable")
               + "</em></body></html>";
       menuBuilder.addElement(scriptsLocation, new JMenuItem(message), 0);
     }
     for (final Entry<String, String> entry : configuration.getNameScriptMap().entrySet()) {
       final String scriptName = entry.getKey();
       final ScriptMetaData metaData = configuration.getNameScriptMetaDataMap().get(scriptName);
       // in the worst case three actions will cache a script - should not matter that much since
       // it's unlikely
       // that one script is used in multiple modes by the same user
       for (final ExecutionMode executionMode : metaData.getExecutionModes()) {
         final String titleKey;
         final String scriptLocation;
         String location = metaData.getMenuLocation(executionMode);
         // FIXME: reduce code duplication (VB)
         if (location == null) {
           location = scriptsLocation + "/" + scriptName;
           if (!registeredLocations.contains(location)) {
             final String parentMenuTitle = pimpMenuTitle(metaData.getScriptName());
             addSubMenu(menuBuilder, parentLocation(location), location, parentMenuTitle);
             registeredLocations.add(location);
           }
           titleKey = metaData.getTitleKey(executionMode);
           scriptLocation = location + "/" + titleKey;
         } else {
           if (!registeredLocations.contains(location)) {
             addSubMenu(menuBuilder, parentLocation(location), location, getMenuTitle(location));
             registeredLocations.add(location);
           }
           titleKey = metaData.getTitleKey(executionMode);
           scriptLocation = location + "/" + titleKey;
         }
         if (!registeredLocations.contains(scriptLocation)) {
           addMenuItem(menuBuilder, location, entry, executionMode, titleKey, metaData);
           registeredLocations.add(scriptLocation);
         }
       }
     }
   }
 }