0 Replies Latest reply on Dec 7, 2016 5:56 PM by Brian Pylant

    Building A Custom Menu Dynamically

    Brian Pylant Level 1

      I have created a custom menu of commonly-used scripts for our Prepress department. Works great, but I have to manually update the script that builds the menu and distribute a new copy whenever I add or remove a script from the collection. So I'm trying to rewrite this so it will dynamically build the menu based on the files it finds in the specified folder.

       

      I can get the script to build the menu itself, but where I'm hung up is attaching an event listener to each menu item. I think I've figured out the problem, but I don't know how to solve it.

       

      In the following code snippet (which iterates through the items to build the script menu actions and event listeners), note lines 4 and 9 (specifically the comments). I inserted these alerts as a debugging tool, and they have shown me that my array is being changed to "undefined" inside the event listener function.

       

      I'm not sure why this is happening, but I suspect that it why my menu items don't actually trigger anything. (If I swap in the filename of a script instead of this variable it works just fine).

       

      for (i=0; i < prepressScriptNames.length; i++){
          menuItemFromFilename[i] = prepressScriptNames[i].slice(0,-4);
          scriptToRun[i] = (scriptsFolder + prepressScriptNames[i]);
          alert (typeof(scriptToRun[i])); // result: string
          myScriptMenuAction[i] = app.scriptMenuActions.add(menuItemFromFilename[i]);
          myEventListener[i] = myScriptMenuAction[i].eventListeners.add("onInvoke", function()
          {
              try{app.doScript(File(scriptToRun[i]))} catch(e){}
              alert (typeof(scriptToRun[i])); // result: undefined. WHY????
          }
      )
      
      }
      

       

      Here's the full code as I have it right now:

      // #target InDesign
      #targetengine "session"
      
      
      
      // GLOBAL ARRAYS
      usrSMAs = [];
      usrMenus = [];
      
      
      
      // LOCATE PREPRESS SCRIPTS FOLDER
      var startupScriptsFolder = Folder(app.activeScript.path);
      var scriptsFolder = startupScriptsFolder.parent + "/Scripts Panel/Prepress\ Tools/";
      
      
      
      // REMOVE EXISTING PREPRESS MENU
      var myMainMenu = app.menus.item("$ID/Main");
      try{
          var myNewMenu = myMainMenu.submenus.item("Prepress Tools");
          myNewMenu.remove();
      }catch(myError){}
      
      
      
      // BUILD ARRAY FROM FILENAMES IN PREPRESS SCRIPTS FOLDER
      function GetScriptFilenames(){  
        var scriptPath = Folder(scriptsFolder); 
        var scriptFiles = scriptPath.getFiles();
        var scriptNames = [];
        for (var i=0; i<scriptFiles.length; i++){  
            var thisFile = (scriptFiles[i]);
            if (thisFile.name != ".DS_Store") {
                scriptNames.push(decodeURI(thisFile.name)); 
            }
        }  
        return scriptNames;  
      } 
      
      var prepressScriptNames = GetScriptFilenames();
      
      
      
      // ITERATE THROUGH ARRAY OF SCRIPT NAMES, CREATE MENU ITEMS AND EVENT LISTENERS
      var scriptToRun = [];
      var menuItemFromFilename = [];
      var myScriptMenuAction = [];
      var myEventListener = [];
      var myMenuItem = [];
      for (i=0; i < prepressScriptNames.length; i++){
          menuItemFromFilename[i] = prepressScriptNames[i].slice(0,-4);
          scriptToRun[i] = (scriptsFolder + prepressScriptNames[i]);
          alert (typeof(scriptToRun[i])); // result: string
          myScriptMenuAction[i] = app.scriptMenuActions.add(menuItemFromFilename[i]);
          myEventListener[i] = myScriptMenuAction[i].eventListeners.add("onInvoke", function()
          {
              try{app.doScript(File(scriptToRun[i]))} catch(e){}
              alert (typeof(scriptToRun[i])); // result: undefined. WHY????
          }
      // CREATE MENU AND SUBMENUS
      try{
          var menuPrepressTools = app.menus.item("$ID/Main").submenus.item("Prepress Tools");
          menuPrepressTools.title;
          usrMenus.push(menuPrepressTools);
      }
      catch (e){
          var menuPrepressTools = app.menus.item("$ID/Main").submenus.add("Prepress Tools");
          // usrMenus.push(menuPrepressTools);
      }
      
      
      
      // CREATE MENU ITEMS
      for (i=0; i < prepressScriptNames.length; i++){
          usrSMAs.push(menuPrepressTools.menuItems.add(myScriptMenuAction[i]));
      }
      

       

       

      Thanks in advance for any advice or nudges in the right direction!

       

      (Full disclosure: I am not a very skilled Javascripter, or coder of any sort. In fact, I'm learning JS by learning to automate a bunch of InDesign things, I'd never touched JS before now!)