// 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.6"; 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("DefaultStyle") = "The name of the default Style."; initData.config.DefaultStyle = "StyleSetterDefault"; initData.config_desc("FoldersConfig") = "Folders config, alternative to "; initData.config.FoldersConfig = JSON.stringify(defaultFoldersConfig, undefined, 2).replace(/(\n)+/g,"\r\n"); } var defaultFoldersConfig = { folders: [{ // Path of the folder to match on. path:"c:\\mytestPath", // Name of style to apply style: "ShowViewer", }] }; 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)) { var selectedStye = ReadStyleFromFile(settingsFile); } else { var resolvedPath = doFsu.Resolve(afterFolderChangeData.tab.path); var selectedStye = ReadStyleFromConfig(resolvedPath + ""); } if (typeof(selectedStye) == "undefined" || selectedStye == "") { if (Script.config.DefaultStyle != "") { selectedStye = Script.config.DefaultStyle; } } SetStyle(selectedStye, afterFolderChangeData.tab); } } } /* var label = GetTabLabelByPath(new String(tab.path), JSON.parse(Script.config.FoldersConfig)); out("label final : " + label + " - length=" + label.length); */ 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 ReadStyleFromFile(filePath) { var msxml = new ActiveXObject("MSXML2.DOMDocument.6.0"); LogDebugMessage("ReadStyleConfig: file:" + filePath); var xpath = ".//*[local-name() = 'style']"; //Load and validate the specified file into the DOM. msxml.load(filePath); result = ""; if (msxml.parseError.errorCode != 0) { LogErrorMessage("XML load error code: " + msxml.parseError.errorCode) } else { var node = msxml.documentElement.selectSingleNode(xpath); if (node) { result = node.text; } } return result; } 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 } function ReadStyleFromConfig(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].style; } } }