public void loadEmbeddedMacros() {
    boolean altDown = IJ.altKeyDown(); // 3.8.2009
    boolean shiftDown = IJ.shiftKeyDown(); // 18.8.2009
    if (shiftDown) {
      shiftDown = shiftDown && true;
    }
    if (IJ.debugMode) {
      IJ.log("alt=" + altDown + "   shift=" + shiftDown);
    }
    String macros_text = null;
    String macroFileName = null;
    if (OJ.isProjectOpen) {
      DataOJ data = OJ.getData();
      String project_name = data.getName();

      String directory = data.getDirectory();
      macroFileName = project_name + ".txt";
      File macros_file = new File(directory, macroFileName);
      MacroInstaller mi = new MacroInstaller();
      // mechanism to remove manually loaded project files
      macros_text = OJ.getData().getLinkedMacroText(); // 18.3.2010
      boolean externalMacroExists = macros_file.exists() && macros_file.isFile();
      boolean internalMacroExists = (macros_text != null);
      if (!internalMacroExists && !externalMacroExists) {
        // mi.install(macros_text);16.9.2010
        return;
      }
      if (externalMacroExists && internalMacroExists) {
        IJ.showMessage("Project has internal macro, so external macro is ignored");
      }
      if (externalMacroExists && !internalMacroExists) {
        String thisVersion = IJ.getVersion();
        boolean is143d = thisVersion.compareToIgnoreCase("1.43d") >= 0;
        if (is143d) {
          String oldMacroName = ij.plugin.MacroInstaller.getFileName();
          if (oldMacroName != null && oldMacroName.equalsIgnoreCase(macroFileName)) {
            oldMacroName = oldMacroName + "";
            String macro = "macro 'Dummy Tool-Cf00O8822' {}\n"; // kill old tools
            mi.install(macro);

            String dir = IJ.getDirectory("macros") + "StartupMacros.txt";
            File startup_file = new File(IJ.getDirectory("macros"), "StartupMacros.txt");
            if (startup_file.exists()) {
              IJ.showMessage("Macros in \"" + macroFileName + "\" will appear under ObjectJ menu");
              mi.installFile(dir);
            }
            mi.setFileName(""); // 15.7.2009
          }
        }

        macros_text = UtilsOJ.readStringFromFile(macros_file);
      }
      OJ.getData().setLinkedMacroText(macros_text);
      doInstall(macros_text);
    }
  }
  public void doInstall(String macros_text) { // Normal Load Project Macros  //20.9.2010

    Interpreter intp = Interpreter.getInstance();
    if (intp != null) {
      Interpreter.getInstance().abortMacro(); // 11.8.2013
    }

    // ImageJAccessOJ.InterpreterAccess.
    OJ.initMacroProcessor(); // 4.7.2013
    // OJ.getMacroProcessor().setTarget("exit");//4.7.2013

    macros_text = UtilsOJ.fixLineFeeds(macros_text);
    // }
    String clean_macro_text = UtilsOJ.maskComments(macros_text);
    clean_macro_text = clean_macro_text.replaceAll("macro\"", "macro \""); // 19.10.2010
    if ((clean_macro_text != null) && (!clean_macro_text.equals(""))) {
      boolean leadingPart = !clean_macro_text.startsWith("macro");
      String[] macros = clean_macro_text.split("macro "); //
      int numMacros = macros.length;
      if (leadingPart) {
        numMacros--;
      }
      String project_name = OJ.getData().getName();
      if (numMacros > 0) { // 7.9.2010
        MacroSetOJ macroSet = OJ.getData().getMacroSet();
        macroSet = new MacroSetOJ();
        macroSet.setName(project_name);
        macroSet.installText(macros_text);
        OJ.getData().setMacroSet(macroSet);
        OJ.getEventProcessor()
            .fireMacroChangedEvent(project_name, MacroChangedEventOJ.MACROSET_EDITED);
        ij.IJ.showStatus("" + numMacros + " embedded macros have been loaded");
      }
    }
    ToolManagerOJ.getInstance().reload();
  }
        public void actionPerformed(ActionEvent e) {

          // Interpreter.abort();//17.9.2010 -checks for null instance etc removed 11.8.2013
          Editor ed = OJ.editor;

          String theText = ed.getText();
          theText = UtilsOJ.fixLineFeeds(theText); // 7.9.2010
          OJ.getData().setLinkedMacroText(theText);
          int caretPos = ed.getTextArea().getCaretPosition();
          ed.getTextArea().setText(theText);
          ed.getTextArea().setCaretPosition(caretPos);

          doInstall(theText);
          setEditorUnchanged(ed);
          ij.IJ.getInstance().setVisible(true);
        }
  public void showEmbeddedMacros(int modifier) {

    showPopUp = ((modifier & KeyEvent.ALT_MASK) != 0);
    String macros_text = OJ.getData().getLinkedMacroText();
    if (macros_text == null) {
      macros_text = "";
    }
    Window theWindow = OJ.editorWindow;
    if (theWindow != null && theWindow.isShowing() && OJ.editor != null) {
      theWindow.setVisible(true);
      return;
    }

    String version = IJ.getFullVersion();
    Editor ed;
    if (version.compareToIgnoreCase("1.49i03") >= 0) {
      ed = new EditorOJ(16, 60, 0, Editor.MONOSPACED + Editor.MENU_BAR);
    } else {
      ed = new Editor(16, 60, 0, Editor.MONOSPACED + Editor.MENU_BAR);
    }
    ed.create("Embedded Macros", macros_text);
    JButton loadButton = new JButton("Install in ObjectJ menu");
    loadButton.addActionListener(LoadEmbeddedMacroAction);

    TextArea ta = ed.getTextArea();
    ed.remove(ta);
    ed.setLayout(new BorderLayout());
    JPanel panel1 = new JPanel();

    panel1.setLayout(new FlowLayout());
    loadButton.setFont(new Font("SansSerif", Font.PLAIN, 14));
    panel1.add(loadButton);

    JLabel myLabel = new JLabel("Macros Overview");

    if (showPopUp) {
      panel1.add(myLabel);
    }
    myLabel.setForeground(Color.blue);
    myLabel.setAutoscrolls(true);

    macrosPopup = new javax.swing.JPopupMenu();

    myLabel.addMouseListener(
        new java.awt.event.MouseAdapter() {
          public void mouseEntered(java.awt.event.MouseEvent evt) {

            refreshPopupItems();
          }

          public void mouseReleased(java.awt.event.MouseEvent evt) {
            if ((evt.getModifiers() & InputEvent.BUTTON1_MASK) != 0) {
              ij.IJ.showStatus("Right-Click to navigate through macros");
              //                            + "\n-"
              //                            + "\nYou also can enter bookmark tags into the macro
              // text:"
              //                            + "\n //<<   bookmarks left part of line"
              //                            + "\n //>>   bookmarks right part of line");
            }
          }
        });

    myLabel.setComponentPopupMenu(macrosPopup);

    ed.add(BorderLayout.NORTH, panel1);
    ed.add(BorderLayout.CENTER, ta);

    Font monoFont = new Font("Monospaced", Font.PLAIN, 14);
    ta.setFont(monoFont);
    OJ.editor = ed;
    Frame[] frames = WindowManager.getNonImageWindows();
    Frame frame = frames[frames.length - 1];
    // ij.IJ.log(WindowManager.getFrontWindow().getTitle());
    // ij.IJ.log(frame.getTitle());//"Embedded Macros"
    // ij.IJ.log("---");//"Embedded Macros"
    OJ.editorWindow = WindowManager.getFrontWindow();
    refreshPopupItems();
    loadButton.transferFocus();
  }