/**
   * Refreshes the elements in the Macros menu to be in sync with the macros the user has defined.
   */
  private void refreshMacrosMenu() {

    while (macrosMenu.getMenuComponentCount() > 3) {
      macrosMenu.remove(3);
    }

    if (MacroManager.get().getMacroCount() > 0) {
      Iterator<Macro> i = MacroManager.get().getMacroIterator();
      while (i.hasNext()) {
        Macro macro = i.next();
        RunMacroAction a = new RunMacroAction(app, this, macro);
        macrosMenu.add(createMenuItem(a));
      }
    } else {
      String text = MacroPlugin.msg.getString("NoMacrosDefined");
      JMenuItem item = new JMenuItem(text);
      item.setEnabled(false);
      macrosMenu.add(item);
    }
  }
 /**
  * Saves our current set of macros.
  *
  * @see #loadMacros()
  */
 private void saveMacros() {
   try {
     MacroManager.get().saveMacros(getMacroDir());
   } catch (IOException ioe) {
     String text = ioe.getMessage();
     if (text == null) {
       text = ioe.toString();
     }
     String desc = getString("Error.SavingMacros");
     desc = MessageFormat.format(desc, new Object[] {text});
     app.displayException(ioe, desc);
   }
 }
  /** {@inheritDoc} */
  public void install(AbstractPluggableGUIApplication app) {

    MacroManager.get().addPropertyChangeListener(MacroManager.PROPERTY_MACROS, this);

    // Add a new menu for selecting macros
    RText rtext = (RText) app;
    MenuBar mb = (org.fife.ui.app.MenuBar) rtext.getJMenuBar();
    macrosMenu = new JMenu(getString("Plugin.Name"));
    Action a = rtext.getAction(MacroPlugin.NEW_MACRO_ACTION);
    macrosMenu.add(createMenuItem(a)); // createMenuItem(a));
    a = rtext.getAction(MacroPlugin.EDIT_MACROS_ACTION);
    macrosMenu.add(createMenuItem(a)); // createMenuItem(a));
    macrosMenu.addSeparator();
    mb.addExtraMenu(macrosMenu);
    mb.revalidate();

    loadMacros(); // Do after menu has been added
  }
  /**
   * Loads the previously saved macros.
   *
   * @see #saveMacros()
   */
  private void loadMacros() {

    // First time through, this directory won't exist.
    File macroDir = getMacroDir();
    if (!macroDir.isDirectory()) {
      macroDir.mkdirs();
    }

    try {
      MacroManager.get().loadMacros(macroDir);
    } catch (IOException ioe) {
      String text = ioe.getMessage();
      if (text == null) {
        text = ioe.toString();
      }
      String desc = getString("Error.LoadingMacros");
      desc = MessageFormat.format(desc, new Object[] {text});
      app.displayException(ioe, desc);
    }
  }