// StyleSetter // (c) 2017 wowbagger // This is a script for Directory Opus. // See http://www.gpsoft.com.au/DScripts/redirect.asp?page=scripts for development information. var doFsu = DOpus.FSUtil; var doVars = DOpus.vars; var doCmd = DOpus.NewCommand; var LogLevel = { Debug: 0, Info: 1, Warning: 2, Error: 3 }; var gbUseLogging=false; var logLevel = LogLevel.Info; var lastSetVar = "StyleSetterLastSet"; // Called by Directory Opus to initialize the script function OnInit(initData) { initData.name = "StyleSetter"; initData.version = "0.7"; initData.copyright = "(c) 2017 wowbagger"; // initData.url = "https://resource.dopus.com/viewforum.php?f=35"; initData.desc = "Auto Set Styles"; initData.default_enable = true; initData.min_version = "11.9"; initData.config_desc = DOpus.NewMap(); // variable for enabling debug, so as to enable debug via a button initData.config.DebugEnableVar = "$glob:debug" initData.config.DEBUG = false initData.config_desc("RequireEnabledVariable") = "Require the EnabledVariable be set for the script to run. If false the EnabledVariable is ignored."; initData.config.RequireEnabledVariable = false; initData.config_desc("EnabledVariableName") = "Variable used to enable StyleSetter, Value set with a toolbar button."; initData.config.EnabledVariableName = "StyleSetterEnabled"; initData.config_desc("SettingsFileName") = "The name of the file that will have the settings in it."; initData.config.SettingsFileName = "folder.xml"; initData.config_desc("FallbackSettings") = "The name of the default Style."; initData.config.FallbackSettings = JSON.stringify(fallbackSettings, undefined, 2).replace(/(\n)+/g,"\r\n"); ; initData.config_desc("FoldersConfig") = "Folders config, alternative to "; initData.config.FoldersConfig = JSON.stringify(defaultFoldersConfig, undefined, 2).replace(/(\n)+/g,"\r\n"); } var fallbackSettings = { style: "StyleSetterDefault", commands: [] }; //alternative fallback var altFallbackSettings = { style: "", commands: [ "Set VIEWPANE=Off" ] }; var defaultFoldersConfig = { folders: [{ // Path of the folder to match on. path:"c:\\mytestPath", // Name of style to apply style: "ShowViewer", },{ // Path of the folder to match on. path:"c:\\mytestPath2", // Name of style to apply style: "", //Commands to run commands: [ "Set VIEWPANE=On" ] }] }; function IsDebugEnabled() { if(Script) { return gbUseLogging || Script.config.DEBUG || doCmd.IsSet(Script.config.DebugEnableVar); } return gbUseLogging; } function LogMessage(message, force) { if (force || IsDebugEnabled()) { DOpus.OutputString(message)}; } function LogErrorMessage(message, force) { if (LogLevel.Error >= logLevel) { LogMessage("Error: " + message, force); } } function LogWarningMessage(message, force) { if (LogLevel.Warning >= logLevel) { LogMessage("Warning: " + message, force); } } function LogInfoMessage(message, force) { if (LogLevel.Info >= logLevel) { LogMessage("Info: " + message, force); } } function LogDebugMessage(message, force) { if (LogLevel.Debug >= logLevel) { LogMessage("Debug: " + message, force); } } // Called after a new folder is read in a tab function OnAfterFolderChange(afterFolderChangeData) { if (!Script.config.RequireEnabledVariable || afterFolderChangeData.tab.lister.vars.Exists(Script.config.EnabledVariableName)) { var configuredFileName = Script.config.SettingsFileName; var settingsFile = afterFolderChangeData.tab.path + "\\" + configuredFileName; LogDebugMessage("OnAfterFolderChange: action:" + afterFolderChangeData.action + " file:" + settingsFile); if (afterFolderChangeData.result && (afterFolderChangeData.action == 'back' || afterFolderChangeData.action == 'forward' || afterFolderChangeData.action == 'dblclk' || afterFolderChangeData.action == 'parent')) { var selectedStye; if (doFsu.Exists(settingsFile)) { selectedStye = ReadSettingsFromFile(settingsFile); } else { var resolvedPath = doFsu.Resolve(afterFolderChangeData.tab.path); selectedStye = ReadSettingsFromConfig(resolvedPath + ""); } if (typeof(selectedStye) == "undefined") { LogDebugMessage("OnAfterFolderChange: setting default"); if (Script.config.DefaultStyle != "") { selectedStye = LoadFallback(); } } LogDebugMessage("selectedStye " + JSON.stringify(selectedStye, undefined, 2).replace(/(\n)+/g,"\r\n")) if (typeof(selectedStye.style) != "undefined" && selectedStye.style != "") { SetStyle(selectedStye.style, afterFolderChangeData.tab); } if (typeof(selectedStye.commands) != "undefined") { for(var i = 0; i < selectedStye.commands.length; ++i) { RunCommands(selectedStye.commands[i]); } } } } } function RunCommands(command, tab) { if (typeof(command) != "undefined" && command != "") { LogInfoMessage("running command :'" + command + "'"); var styleCmd = DOpus.NewCommand; //styleCmd.SetSourceTab(tab); styleCmd.RunCommand(command); } } function SetStyle(styleName, tab) { if (typeof(styleName) != "undefined" && styleName != "") { var lastSet; if (tab.lister.vars.Exists(lastSetVar)) { lastSet = tab.lister.vars.Get(lastSetVar); } if (styleName != lastSet) { LogInfoMessage("setting style :" + styleName); var styleCmd = DOpus.NewCommand; styleCmd.SetSourceTab(tab); styleCmd.RunCommand("Prefs STYLE \"" + styleName + "\""); tab.lister.vars.Set(lastSetVar, styleName); } } } function ReadSettingsFromFile(filePath) { var msxml = new ActiveXObject("MSXML2.DOMDocument.6.0"); LogDebugMessage("ReadStyleConfig: file:" + filePath); //Load and validate the specified file into the DOM. var result = {}; msxml.load(filePath); if (msxml.parseError.errorCode != 0) { LogErrorMessage("XML load error code: " + msxml.parseError.errorCode); return; } else { var styleNode = msxml.documentElement.selectSingleNode(".//*[local-name() = 'style']"); if (styleNode) { result.style = styleNode.text; } var commandsNode = msxml.documentElement.selectSingleNode(".//*[local-name() = 'commands']"); if (commandsNode) { if (commandsNode.hasChildNodes()) { result.commands = new Array(); for(var i = 0; i < commandsNode.childNodes.length; ++i) { result.commands.push(commandsNode.childNodes[i].text) } } } } return result; } function ReadSettingsFromConfig(path) { LogDebugMessage("Checking config for: " + typeof(path)+ ":" + path) var foldersConfig = LoadFoldersConfig(); LogDebugMessage("foldersConfig " + JSON.stringify(foldersConfig, undefined, 2).replace(/(\n)+/g,"\r\n")) for(var i = 0; i < foldersConfig.folders.length; ++i) { LogDebugMessage("Checking config against: " + typeof(foldersConfig.folders[i].path)+ ":" + foldersConfig.folders[i].path) if(foldersConfig.folders[i].path.toLowerCase() == path.toLowerCase()) { //if(foldersConfig.folders[i].path == path) { LogDebugMessage("Folder matched config: " + path) return foldersConfig.folders[i]; } } } function LoadFallback(){ LogDebugMessage("FallbackSettings " + Script.config.FallbackSettings); return JSON.parse(Script.config.FallbackSettings); } function LoadFoldersConfig(){ LogDebugMessage("Loading config for"); var config = JSON.parse(Script.config.FoldersConfig); LogDebugMessage("config " + JSON.stringify(config, undefined, 2).replace(/(\n)+/g,"\r\n")); if(!config) { config = defaultFoldersConfig; } return config }