//v0.3 - 2016.03 //- new file type (group) column //- another size column for grouping items by name //- added ConfigHelper, updated XLog, using experimental ColumnGrinder //v0.4 - 2016.04 //- new random number column //v0.4.1 - 2017.01 //- bug fixes //v0.4.2 - 2017.01 //- added "Kind" column (code by Leo, taken from ../viewtopic.php?f=35&t=28603) /////////////////////////////////////////////////////////////////////////////// var SUCCESS = false; var FAILURE = true; var global = this; /////////////////////////////////////////////////////////////////////////////// function OnInit(data){ //uid added via script wizard (do not change after publishing this script) var uid = "96F05ED0-CFD8-4485-A7D1-90EF2882D880"; //resource center url added via script wizard (required for updating) var url = "http://resource.dopus.com/viewtopic.php?f=35&t=22853"; data.name = "Column.Generic: CustomGrouping"; data.desc = "Various columns supporting custom ranges and names for grouping items."; data.copyright = "tbone"; data.log_prefix = "CustomGrouping"; data.version = "0.4.2"; /////////////////////////////////////////////////////////////////////////// function ConfigHelper(data){ //v1.2 var t=this; t.d=data; t.c=data.config; t.cd=DOpus.Create.Map(); t.add=function(name, val, des){ t.l={n:name,ln:name. toLowerCase()}; return t.val(val).des(des);} t.des=function(des){ if (!des) return t; if (t.cd.empty) t.d.config_desc=t.cd; t.cd(t.l.n)=des; return t;} t.val=function(val){ var l=t.l; if (l.v!==l.x&&typeof l.v=="object") l.v.push_back(val);else l.v=t.c[l.n]=val;return t;} t.trn=function(){return t.des(t("script.config."+t.l.ln));}} /////////////////////////////////////////////////////////////////////////// var cfg = new ConfigHelper(data); cfg.add('XLog', DOpus.Create.Vector()). val(5). //first value is the default index for dropdown selections like this val("Off").val("Xception").val("Error").val("Warning").val("Info").val("Normal").val("Trace").val("Dump").val("All"). des('Console output level. The higher, the more output will be visible in the console window. '); cfg.add('Groups.Size', DOpus.Create.Vector()). val("0;0;0byte;Empty"). val("1;1024;1b - 1kb;Tiny"). val("1025;10240;1kb - 10kb;Mini"). val("10241;1048576;10kb - 1mb;MiniNoMore"). val("1048577;10485760;1mb - 10mb;Growing"). val("10485761;104857600;10mb - 100mb;Still Growing"). val("104857601;1073741824;100mb - 1gb;Serious Size"). val("1073741825;5368709120;1gb - 5gb;Big"). val("5368709121;10737418240;5gb - 10gb;Even Bigger"). val("10737418241;21474836480;10gb - 20gb;Getting Huge"). val("21474836481;32212254720;20gb - 30gb;Now it's Huge"). val("32212254721;53687091200;30gb - 50gb;Double Huge"). val("53687091201;107374182400;50gb - 100gb;Takes long to copy"). val("107374182401;524288000;100gb - 500gb;10 for a diskfull"). val("524288001;1099511627776;500gb - 1tb;Ok, stop it!"). val("1099511627777;5497558138880;1tb - 5tb;Out of disk space"). val("5497558138881;10995116277760;5tb - 10tb;Doesn't fit"). val("10995116277761;21990232555520;10tb - 20tb;Bucket full of discs"). val("21990232555521;54975581388800;20tb - 50tb;You need a pushcart"). val("54975581388801;109951162777600;50tb - 100tb;Colossal!"). des('Ranges and names of size range groups.'); } /////////////////////////////////////////////////////////////////////////////// //getting column grinder instance, passing script specific prefix for //all column labels (so they align in the folder options dailog e.g). //notice: "CG" means [C]ustom [G]rouping, nothing to do with ColumnGrinder var ColGrinder = new ColumnGrinder("CG"); if (typeof this.Script != "unknown") { GrindColumns(); } /////////////////////////////////////////////////////////////////////////////// function GrindColumns(){ Log("GrindColumns():"); /////////////////////////////////////////////////////////////////////////// var setName = "SizeGroup"; var colSet = new ColGrinder.ColumnSet(setName) /////////////////////////////////////////////////////////////////////////// .multiSet() //enable multicol (added cols are multicol automatically) .set("defwidth", 10) .set("justify", "right") //callback for all the columns in the set .onCall( function (data){ if(data.item.is_dir){ data.columns(setName+".Size1").group = "na"; data.columns(setName+".Size2").group = "na"; data.columns(setName+".Size3").group = "na"; return; } var fileSize = data.item.size.cy * 10000; data.columns(setName+".Size1").value = data.item.size; //.fmt; data.columns(setName+".Size2").value = data.item.size; //.fmt; data.columns(setName+".Size3").value = data.item.size; //.fmt; for(var v=0;v=parseInt(parts[0],10) && fileSize<=parseInt(parts[1],10)){ data.columns(setName+".Size1").group = parts[3]; data.columns(setName+".Size2").group = parts[2]; data.columns(setName+".Size3").group = parts[3] + " ("+parts[2]+")"; break; } } } ); ColGrinder.addColumnSet(colSet); /////////////////////////////////////////////////////////////////////////// var colName = "Size1"; /////////////////////////////////////////////////////////////////////////// colSet.addColumn( new ColGrinder.Column(colName, null, colName+" (Name)") //set column type to 'stars' //.set("type", "stars") .set("type", "size") .groupBy( function() { var groupNames = "na", cfgItem = Script.config["Groups.Size"]; for(var v=0;v12) groups += groupName.substring(0,10)+".."; else groups += groupName; if (i+1= 0) strKind = strKind.substring(0, posSemi); data.group = strKind; } }) ); } } /////////////////////////////////////////////////////////////////////////// var colName = "RandomNumber"; /////////////////////////////////////////////////////////////////////////// ColGrinder.addColumn( new ColGrinder.Column(colName, "Rnd", colName) .set("defwidth", "60px") .set("justify", "right") .set("autorefresh", true) .set("namerefresh", true) .onCall( function (data) { data.value = Math.floor(Math.random()*999999); }) ); } /////////////////////////////////////////////////////////////////////////////// function OnScriptConfigChange(data){ Script.InitColumns(); ColGrinder.refresh(); } /////////////////////////////////////////////////////////////////////////////// function OnAddColumns(data){ GrindColumns(); ColGrinder.bind(data); } /////////////////////////////////////////////////////////////////////////////// function ColumnGrinder(labelPrefix){ this.labelPrefix = (labelPrefix ? labelPrefix : "UnSet")+"."; this.sets = new Array(); this.columns = new Array(); /////////////////////////////////////////////////////////////////////////// this.Column = function (name, header, label){ Log("new ColGrinder.Column():", "t"); this.grinder = null; this.columnSet = null; this.props = new Array(); this.groupOrde = null; /////////////////////////////////////////////////////////////////////// this.construct = function( name, header, label){ this.set("name", name); this.set("header", (header?header:name)); this.set("label", (label?label:name)); } /////////////////////////////////////////////////////////////////////// this.onCall = function( func){ var funcName = "ColGrinderSingleFunc_"+this.props["name"]; global[funcName] = func; this.set("method", funcName); return this; } /////////////////////////////////////////////////////////////////////// this.groupBy = function(stringFunc){ this.groupOrder = stringFunc; this.set("autogroup", false); return this; } /////////////////////////////////////////////////////////////////////// this.set = function( propName, propValue){ this.props[propName] = propValue; return this; } /////////////////////////////////////////////////////////////////////// this._bindProps = function( doCol){ if (this.columnSet) for(propKey in this.columnSet.props) doCol[propKey] = this.columnSet.props[propKey]; for(propKey in this.props) doCol[propKey] = this.props[propKey]; return this; } /////////////////////////////////////////////////////////////////////// this._bind = function( data){ Log("ColGrinder.Column._bind():", "t", 1); var doCol = data.AddColumn(); if (this.columnSet){ this.set("name", this.columnSet.name + "." + this.props["name"]); this.set("label", this.grinder.labelPrefix + this.columnSet.name + "." + this.props["label"]); } else { this.set("label", this.grinder.labelPrefix + this.props["label"]); } Log("col name : "+this.props["name"], "d"); Log("col header: "+this.props["header"], "d"); Log("col label : "+this.props["label"], "d"); if (typeof this.groupOrder == "function") this.set("grouporder", this.groupOrder()); if (typeof this.groupOrder == "string") this.set("grouporder", this.groupOrder); this._bindProps(doCol); if (!doCol.method) throw new Error("No method given for column ["+this.props["name"]+"]"); Log("funcname: "+doCol.method+"()", "d"); Log("-", "t", -1); return this; } /////////////////////////////////////////////////////////////////////// this._refresh = function(){ Script.RefreshColumn(this.props['name']); } /////////////////////////////////////////////////////////////////////// this.construct( name, header, label); } /////////////////////////////////////////////////////////////////////////// this.ColumnSet = function (name, prefix){ Log("new ColGrinder.ColumnSet():", "t"); this.grinder = null; this.data = null; this.prefix = prefix; this.name = name; this.columns = new Array(); this.props = new Array(); /////////////////////////////////////////////////////////////////////// this.onCall = function( func){ var funcName = "ColGrinderSetFunc_"+this.name; global[funcName] = func; this.set("method", funcName); return this; } /////////////////////////////////////////////////////////////////////// this.multiSet = function(){ this.set("multicol", true); return this; } /////////////////////////////////////////////////////////////////////// this.set = function( propName, propValue){ this.props[propName] = propValue; return this; } /////////////////////////////////////////////////////////////////////// this.addColumn = function(column){ Log("ColGrinder.ColumnSet.AddColumn():", "t", 1); column.columnSet = this; column.grinder = this.grinder; this.columns[this.columns.length] = column; Log("-", "t", -1) return this; } /////////////////////////////////////////////////////////////////////// this._bind = function(data){ this.data = data; Log("ColGrinder.ColumnSet._bind():", "t", 1); Log("setname : "+this.name, "d"); for(var c=0;c