//v0.1 - o9/2o14 //- initial //v0.3 //- skipping non existing additional commands //- usage of data.tab.format.locked instead of isSet() //- support for onafterfolderchange event //- allows adding/removing of columns //- confighelper //- min version added //- prepared for updates/scriptwizard //v0.3.1 - 12/2o14 //- added ifLabel() to check drive labels as well //v0.3.2 - 12/2o14 //- fix to prevent exception for "empty" command object //- ifPath() method non-casesensitive by default, regex modifiers can be passed ////////////////////////////////////////////////////////////////////////////// function OnInit(data){ //uid added via script wizard (do not change after publishing this script) var uid = "064A30CB-1E8F-4C55-A8FC-4D0456020969"; //resource center url added via script wizard (required for updating) var url = "http://resource.dopus.com/viewtopic.php?f=35&t=22923"; data.name = "Event.GUI: OverrideFormats"; data.desc = "Set view and content format based on folder-,filecount, path or current viewmode."; data.version = "0.3.2"; data.copyright = "tbone"; data.default_enable = true; var cmd = data.AddCommand(); cmd.name = "OverrideFormats"; cmd.method = "Command_OverrideFormats"; cmd.desc = data.desc; cmd.label = "OverrideFormats"; /////////////////////////////////////////////////////////////////////////// function ConfigHelper(data){ this.data=data; this.descriptions=null; this.last=null; this.add = function(name, val, description){ this.data.config[name]=val; this.last=[this.data.config[name],name]; if (description!=undefined) this.des(description); return this;} this.des = function(description){ if (!(description && DOpus.version.AtLeast("11.6.1"))) return this; if (!this.descriptions){ this.descriptions=DOpus.NewMap(); data.config._descriptions=this.descriptions; } this.descriptions(this.last[1])=description; return this;} this.val = function(val){ if (typeof this.last[0]=="object") this.last[0].push_back(val); else this.last[0]=val; return this;} } /////////////////////////////////////////////////////////////////////////// var cfg = new ConfigHelper(data); cfg.add("01 After.Expressions", DOpus.NewVector()). des("Expressions to evaluate on after folder change or when calling OverrideFormats directly. Variables to test against: curView, curPath, data, folderCount, fileCount. Variables to be set: newView, newFormat, newPath, addCol, remCol"). val("#enable count-column for specific path if subfolders present"). val("folderCount>0 && ifPath('D:\\\\dat\\\\gfx\\\\photo') && addCol('filecount(2)')"). val(""). val("#disable count column for all other paths"). val("remCol('filecount')"); cfg.add("02 After.BlackList", false). des("Enable blacklist of folders for on after folder change."); cfg.add("03 After.BlackList.Folders", DOpus.NewVector()). des("Blacklist of folders for on after folder change."). val(''); cfg.add("04 After.WhiteList", false). des("Enable whitelist of folders for on after folder change."); cfg.add("05 After.WhiteList.Folders", DOpus.NewVector()). des("Whitelist of folders for on after folder change."). val(''); cfg.add("06 After.AddCommands", false). des("Enable running of additional commands for after regular folder changes."); cfg.add("07 After.AddCommands.List", DOpus.NewVector()). des("List of additional commands to run after regular folder changes."). val(''); cfg.add("11 Before.Expressions", DOpus.NewVector()). des("Expressions to evaluate on before folder change. Variables to test against: curView, curPath, data, folderCount, fileCount. Variables to be set: newView, newFormat, newPath, addCol, remCol"). val("#use details view for more than 3 folders)"). val("folderCount>3 && setView('details')"). val(""). val("#use details view for more than 1000 files)"). val("fileCount>1000 && setView('details')"). val(""). val("#use a favourite format, if more than 3 folders)"). val("folderCount>3 && setFormat('my_favourite')"). val(""). val("#use music content format and details view for folders called 'music'"). val("ifPath('.*\\\\music') && setFormat('music') && setView('tiles')"). val(""). val("#switch path to C:\\ for empty folders o)"). val("#folderCount==0 && fileCount==0 && setPath('C:\\\\')"); cfg.add("12 Before.BlackList", true). des("Enable blacklist of folders for on before folder change."); cfg.add("13 Before.BlackList.Folders", DOpus.NewVector()). des("Blacklist of folders for on before folder change."). val('//disallow for non-root network locations'). val('^\\\\\\\\.*\\\\.*'). val('//disallow for ftp locations'). val('^ftp:.*'); cfg.add("14 Before.WhiteList", true). des("Enable whitelist of folders for on before folder change."); cfg.add("15 Before.WhiteList.Folders", DOpus.NewVector()). des("Whitelist of folders for on before folder change."). val('//allow for all local drives'). val('^.:\\\\.*'); cfg.add("16 Before.AddCommands", true). des("Enable running of additional commands for folder changes, which were caught to override view or format etc. "+ "Use this place to trigger regular OnAfterFolderChange() actions, because the actual event will not be fired."); cfg.add("17 Before.AddCommands.List", DOpus.NewVector()). des("List of additional commands to run after folder changes, which were caught by OverrideFormats."). val('TabLabelizer'). val('OverrideFormats'). val('CloseTabSiblings'); cfg.add("99 DebugOutput", false). des("Enable debug output for troubleshooting and viewing results of expressions."); } ////////////////////////////////////////////////////////////////////////////// var FOLDERCHANGE_PROCEED=false; var FOLDERCHANGE_CANCEL=true; ////////////////////////////////////////////////////////////////////////////// function OnBeforeFolderChange(data){ Debug("OnBeforeFolderChange():"); if (data.result){ Debug("E Folder could not be read successfully."); return FOLDERCHANGE_PROCEED; } if (data.action == "refresh"){ Debug(" Refresh, no action."); return FOLDERCHANGE_PROCEED; } var dingsbums = { action : data.action, tab : data.tab, //curView : data.tab.format.view.replace("_",""), curFormat : "", curPath : data.path, newView : "", newFormat : "", newPath : "", folderCount : 0, fileCount : 0, data : data, source : 'before'} Debug(" Action : " + dingsbums.action); Debug(" Viewmode : " + dingsbums.curView); Debug(" Path old : " + dingsbums.curPath); Debug(" Path new : " + (data.path?data.path:"")); if (data.tab.format.locked){ Debug(" Folder formats are locked, no action."); return FOLDERCHANGE_PROCEED; } var isBlackListed = IsBlackListed(data.path, "12 Before.BlackList", "13 Before.BlackList.Folders", "14 Before.WhiteList", "15 Before.WhiteList.Folders"); if (isBlackListed || !ReadFolderContent(data, dingsbums)) return FOLDERCHANGE_PROCEED; return OverrideFormats( dingsbums); } /////////////////////////////////////////////////////////////////////////////// function OnAfterFolderChange(data){ Debug("OnAfterFolderChange():"); if (data.action == "refresh"){ Debug(" Refresh, no action."); return FOLDERCHANGE_PROCEED; } if (data.tab.format.locked){ Debug(" Folder formats are locked, no action."); return FOLDERCHANGE_PROCEED; } var dingsbums = { action : data.action, tab : data.tab, curView : data.tab.format.view.replace("_",""), curFormat : "", curPath : data.tab.path, newView : "", newFormat : "", newPath : "", folderCount : data.tab.dirs.count, fileCount : data.tab.files.count, data : data, source : 'after'} return OverrideFormats( dingsbums); } /////////////////////////////////////////////////////////////////////////////// function Command_OverrideFormats(data){ Debug("OverrideFormats():"); var dingsbums = { action : 'command', tab : data.func.sourcetab, curView : data.func.sourcetab.format.view.replace("_",""), curFormat : "", curPath : data.func.sourcetab.path, newView : "", newFormat : "", newPath : "", folderCount : data.func.sourcetab.dirs.count, fileCount : data.func.sourcetab.files.count, data : data, source : 'command'} return OverrideFormats( dingsbums); } /////////////////////////////////////////////////////////////////////////////// function OverrideFormats( dingsbums ){ Debug(" Action : " + dingsbums.action); Debug(" Viewmode : " + dingsbums.curView); Debug(" Path old : " + dingsbums.curPath); Debug(" Path new : " + dingsbums.newPath); var isBlackListed = IsBlackListed(dingsbums.curPath, "02 After.BlackList", "03 After.BlackList.Folders", "04 After.WhiteList", "05 After.WhiteList.Folders"); if (isBlackListed) return FOLDERCHANGE_PROCEED; Debug(" ----------- valid path"); Debug(" FolderCount: "+dingsbums.folderCount); Debug(" FileCount : "+dingsbums.fileCount); if (!EvaluateExpressions( dingsbums )) return FOLDERCHANGE_PROCEED; if (!SwitchFolderOrFormatOrView(dingsbums.data, dingsbums)) return FOLDERCHANGE_PROCEED; return FOLDERCHANGE_CANCEL; } /////////////////////////////////////////////////////////////////////////////// function ReadFolderContent(data, dingsbums){ var itemsEnum = DOpus.FSUtil.ReadDir( data.path); //empty folders and drives are alright if (itemsEnum.error && itemsEnum.error!=18 && itemsEnum.error!=2){ Debug("E ReadDir() failed on target folder, no action."); return FOLDERCHANGE_PROCEED; //let do handle error } while (!itemsEnum.complete) { var item=itemsEnum.next(); if (item.is_dir) dingsbums.folderCount++; else dingsbums.fileCount++; } return true; } /////////////////////////////////////////////////////////////////////////////// function EvaluateExpressions( dingsbums ){ var curView = dingsbums.curView; var curFormat = dingsbums.curFormat; var curPath = dingsbums.curPath; //Debug("Curpath: " + curPath); var data = dingsbums.data; var newView = ""; var newFormat = ""; var newPath = ""; var _addCol = ""; var _remCol = ""; var folderCount = dingsbums.folderCount; var fileCount = dingsbums.fileCount; var expressionSucceeded = false; var expressions = (dingsbums.source=="before"?"11 Before.Expressions":"01 After.Expressions"); var ea=this; this.addCol = this.remCol = this.setView = this.setFormat = this.setPath = ""; this.noQuit = 0; function ifPath(path, regExModifiers){ regExModifiers || (regExModifiers = "gi"); var re = new RegExp(path.replace(/\\/g,'\\\\'),regExModifiers); if (String(curPath).match(re)) return true; return false;} function ifLabel(label){ var letter = String(curPath).substring(0,2); if (!letter.match(/^[a-z]\:/gi)) return false; var drive = new ActiveXObject("Scripting.FileSystemObject").GetDrive(letter); if (label.match(new RegExp(drive.VolumeName,"gi"))) return true; return false; } function addCol(col){ if (ea.addCol) ea.addCol+=','; ea.addCol+=col; return true;} function remCol(col){ if (ea.remCol) ea.remCol+=','; ea.remCol+=col; return true;} function setView(view){ ea.setView=view; return true;} function setFormat(format){ ea.setFormat=format; return true;} function setPath(path){ ea.setPath=path; return true;} function noquit(){ ea.noQuit++; return true;} try{ for(var e=0;e0) this.noQuit=0; } if (!expressionSucceeded){ Debug(" ------------ all expressions failed"); Debug(" Expressions failed, no action."); return false; } dingsbums.newView = this.setView.replace("_",""); dingsbums.newFormat = this.setFormat.toLowerCase(); dingsbums.setCol = this.addCol; dingsbums.remCol = this.remCol; dingsbums.newPath = this.setPath; } catch (e){ Debug("E Error in expressions, no action. " + e); throw e; return false; } Debug(" ------------ expression matched"); return true; } /////////////////////////////////////////////////////////////////////////////// function SwitchFolderOrFormatOrView(data, dingsbums){ if (dingsbums.newView=="" && dingsbums.newFormat=="" && dingsbums.newPath=="" && dingsbums.setCol=="" && dingsbums.remCol==""){ Debug(" No viewmode, format or path given, no action."); return false; } var switchView = (dingsbums.newView != "" ? " VIEW="+dingsbums.newView : ""); var switchPath = (dingsbums.newPath != "" ? ' PATH="'+dingsbums.newPath+'"' : ' PATH="'+data.path+'"'); var switchFormat = ""; var addColumns = ""; var remColumns = ""; switch (dingsbums.newFormat){ case "": break; case "music": case "images": case "documents": case "movies": case "programs": case "archive": case "archives": switchFormat = 'Set CONTENTFORMAT="'+dingsbums.newFormat+'"'; break; default: switchFormat = 'Set FORMAT="'+dingsbums.newFormat+'"'; } if (dingsbums.setCol) addColumns = 'Set COLUMNSADD="'+dingsbums.setCol+'"'; if (dingsbums.remCol) remColumns = 'Set COLUMNSREMOVE="'+dingsbums.remCol+'"'; var operation = ""; if (dingsbums.source=='before'){ switch (dingsbums.action){ case 'parent': operation = 'Go UP NOSCRIPT IGNOREQUAL' + switchView; break; case 'back': operation = 'Go BACK NOSCRIPT IGNOREQUAL' + switchView; break; case 'forward': operation = 'Go FORWARD NOSCRIPT IGNOREQUAL' + switchView; break; case 'dblclk': case 'normal': default: operation = 'Go NOSCRIPT IGNOREQUAL' + switchView + switchPath; break; } } else { if (switchView){ operation = 'Set' + switchView; } } var cmd = DOpus.NewCommand(); cmd.AddLine("//nop"); cmd.SetSourceTab(dingsbums.tab); var commands = new Array(); Debug(" Operation : " + operation); Debug(" SwitchFormat : " + switchFormat); Debug(" Columns add : " + addColumns); Debug(" Columns rem : " + remColumns); //add GO command only for onbefore event if (operation){ cmd.RunCommand(operation); dingsbums.tab.Update(); } cmd.SetSourceTab(dingsbums.tab); //commands[commands.length] = operation; if (switchFormat) commands[commands.length] = switchFormat; if (addColumns) commands[commands.length] = addColumns; if (remColumns) commands[commands.length] = remColumns; for(var c=0;c