Chuck
February 5, 2023, 3:50pm
14
I have read, reread, and re-reread through the sample script and other examples several times. I understand the script must first loop through each tab and item within each tab:
for (var e = new Enumerator(tab.lister.tabs); !e.atEnd(); e.moveNext()) {
var tabItem = e.item();
The script should then check each item's extension and compare it to a given extension:
I am stuck here
Then the script should recolor the tab only if at least one item's extension (or file type group) in the tab matches the given extension (or file type group):
var R = 255;
var G = 128;
var B = 0;
cmd.RunCommand('Go TABCOLOR=' + R + ',' + G + ',' + B);
Please advise. Thanks!
lxp
February 5, 2023, 5:19pm
15
May this inspire you
for (var e = new Enumerator(tab.lister.tabs); !e.atEnd(); e.moveNext()) {
var tabItem = e.item();
var extFound = false;
for (var ee = new Enumerator(tabItem.files); !ee.atEnd(); ee.moveNext()) {
var fileItem = ee.item();
if (fileItem.ext != '.txt') continue;
extFound = true;
break;
}
cmd.SetSourceTab(tabItem);
if (extFound) {
cmd.RunCommand('Go TABCOLOR=255,128,0');
} else {
cmd.RunCommand('Go TABCOLOR=reset');
}
}
Chuck
February 5, 2023, 9:27pm
16
That worked, thanks! Here's the initial script:
function OnInit(initData) {
initData.name = 'RecolorTabBasedOnFileExtension';
initData.version = '2023-02-05';
initData.copyright = '';
initData.url = 'https://resource.dopus.com/t/tab-color-based-on-folder-content/43305';
initData.desc = 'Change tab color based on file extensions';
initData.default_enable = true;
initData.min_version = '12.0';
}
function OnOpenLister(openListerData) {
DOpus.Output('*** OnOpenLister');
if (!openListerData.after) return true;
checkFileExtension(openListerData.lister.activetab);
return false;
}
function OnActivateLister(activateListerData) {
DOpus.Output('*** OnActivateLister');
if (!activateListerData.active) return;
checkFileExtension(activateListerData.lister.activetab);
}
function OnOpenTab(openTabData) {
DOpus.Output('*** OnOpenTab');
checkFileExtension(openTabData.tab);
}
function OnActivateTab(activateTabData) {
DOpus.Output('*** OnActivateTab');
checkFileExtension(activateTabData.newtab);
}
function OnSourceDestChange(sourceDestChangeData) {
DOpus.Output('*** OnSourceDestChange');
checkFileExtension(sourceDestChangeData.tab);
}
function OnAfterFolderChange(afterFolderChangeData) {
DOpus.Output('*** OnAfterFolderChange');
checkFileExtension(afterFolderChangeData.tab);
}
function OnDoubleClick(doubleClickData) {
DOpus.Output('*** OnDoubleClick');
checkFileExtension(doubleClickData.tab);
}
function OnDisplayModeChange(displayModeChangeData) {
DOpus.Output('*** OnDisplayModeChange');
checkFileExtension(displayModeChangeData.tab);
}
function OnTabClick(tabClickData) {
DOpus.Output('*** OnTabClick');
checkFileExtension(tabClickData.tab);
}
var cmd = DOpus.Create().Command();
var fsu = DOpus.FSUtil();
function checkFileExtension(tab) {
for (var e = new Enumerator(tab.lister.tabs); !e.atEnd(); e.moveNext()) {
var tabItem = e.item();
var extFound = false;
for (var ee = new Enumerator(tabItem.files); !ee.atEnd(); ee.moveNext()) {
var fileItem = ee.item();
//if (fileItem.groups != 'programs') continue;
if (fileItem.ext != '.txt') continue;
extFound = true;
break;
}
cmd.SetSourceTab(tabItem);
if (extFound) {
cmd.RunCommand('Go TABCOLOR=255,128,0');
} else {
cmd.RunCommand('Go TABCOLOR=reset');
}
}
}
That said, want to get a bit more sophisticated and let the user choose between a file type group or extension. It does not initialize:
function OnInit(initData) {
initData.name = 'RecolorTabBasedOnFileTypeGroupOrExtension';
initData.version = '2023-02-05';
initData.copyright = '';
initData.url = 'https://resource.dopus.com/t/tab-color-based-on-folder-content/43305';
initData.desc = 'Change tab color based on file extensions';
initData.default_enable = true;
initData.min_version = '12.0';
function ConfigHelper(initData){
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(initData);
cfg.add("Highlight Type", DOpus.Create.Vector()).
des("File Type Group or Specific Extension").
val(0).val("FileTypeGroup").val("Extension");
cfg.add("FTG", "programs").
des("Name of File Type Group");
cfg.add("EXT", "exe").
des("Extension name");
cfg.add("Red Value", "0");
des("Red Value");
cfg.add("Green Value", "0");
des("Green Value");
cfg.add("Blue Value", "0");
des("Blue Value");
}
function OnOpenLister(openListerData) {
DOpus.Output('*** OnOpenLister');
if (!openListerData.after) return true;
checkFileExtension(openListerData.lister.activetab);
return false;
}
function OnActivateLister(activateListerData) {
DOpus.Output('*** OnActivateLister');
if (!activateListerData.active) return;
checkFileExtension(activateListerData.lister.activetab);
}
function OnOpenTab(openTabData) {
DOpus.Output('*** OnOpenTab');
checkFileExtension(openTabData.tab);
}
function OnActivateTab(activateTabData) {
DOpus.Output('*** OnActivateTab');
checkFileExtension(activateTabData.newtab);
}
function OnSourceDestChange(sourceDestChangeData) {
DOpus.Output('*** OnSourceDestChange');
checkFileExtension(sourceDestChangeData.tab);
}
function OnAfterFolderChange(afterFolderChangeData) {
DOpus.Output('*** OnAfterFolderChange');
checkFileExtension(afterFolderChangeData.tab);
}
function OnDoubleClick(doubleClickData) {
DOpus.Output('*** OnDoubleClick');
checkFileExtension(doubleClickData.tab);
}
function OnDisplayModeChange(displayModeChangeData) {
DOpus.Output('*** OnDisplayModeChange');
checkFileExtension(displayModeChangeData.tab);
}
function OnTabClick(tabClickData) {
DOpus.Output('*** OnTabClick');
checkFileExtension(tabClickData.tab);
}
var cmd = DOpus.Create().Command();
var fsu = DOpus.FSUtil();
function checkFileExtension(tab) {
for (var e = new Enumerator(tab.lister.tabs); !e.atEnd(); e.moveNext()) {
var tabItem = e.item();
var extFound = false;
var highlight = Script.config["Highlight Type"];
var ftg = Script.config["FTG"];
var extSelected = Script.config["EXT"];
var rValue = Script.config["Red Value"];
var gValue = Script.config["Green Value"];
var bValue = Script.config["Blue Value"];
for (var ee = new Enumerator(tabItem.files); !ee.atEnd(); ee.moveNext()) {
var fileItem = ee.item();
if (highlight != "FileTypeGroup") { continue;
if (fileItem.groups != ftg) continue;
extFound = true;
}
else (highlight != "Specific Extension")
if (fileItem.ext != extSelected) continue;
extFound = true;
break;
}
cmd.SetSourceTab(tabItem);
if (extFound) {
cmd.RunCommand('Go TABCOLOR=' + rValue + ',' + gValue + ',' + bValue);
} else {
cmd.RunCommand('Go TABCOLOR=reset');
}
}
}
What have I missed?
lxp
February 6, 2023, 10:44am
17
I have never used the external config options, especially not the config helper, which might be outdated. You'd need the consult with the author tbone himself.
In the lower part, you've got some brackets wrong, not sure what you meant to achieve. Running the script through a formatter like CyberChef will help find errors.
Chuck
February 6, 2023, 1:03pm
18
Thank you for the advice and link. I will keep at it.
Leo
February 6, 2023, 1:15pm
19
The ScriptConfig object is very simple to use, and I'd recommend using it directly, at least at first. Otherwise you have to understand how ConfigHelper works on top of how the underlying object works.
A couple of simple examples of using ScriptConfig can be found here:
Chuck
February 7, 2023, 12:54am
20
Thanks for the formatter reference @lxp and thanks for the references @Leo . I have attempted to use ScriptConfig in JScript. This fails to initialize:
function OnInit(initData) {
initData.name = 'RecolorTabBasedOnFileTypeGroupOrExtension';
initData.version = '2023-02-05';
initData.copyright = '';
initData.url = 'https://resource.dopus.com/t/tab-color-based-on-folder-content/43305';
initData.desc = 'Change tab color based on file extensions';
initData.default_enable = true;
initData.min_version = '12.0';
initData.config.HighlightType = DOpus.Create.Vector("File Type Group","Extension");
initData.config.HighlightFTG = DOpus.Create.Vector("Archives","Databases","Documents","Images","Movies","Music","Programs");
initData.config.FileType = "txt";
initData.config.RedValue = "0";
initData.config.GreenValue = "0";
initData.config.BlueValue = "0";
initData.config_desc = DOpus.Create.Map();
initData.config_desc[HighightType] = "Select File Type Group or Extension";
initData.config_desc[HighlightFTG] = "Select File Type Group; used only if File Type Group selected above"
initData.config_desc[FileType] = "Select file type; used only if Extension selected above"
initData.config_desc[RedValue] = "Enter number between 0 and 255"
initData.config_desc[GreenValue] = "Enter number between 0 and 255"
initData.config_desc[BlueValue] = "Enter number between 0 and 255"
}
function OnOpenLister(openListerData) {
DOpus.Output('*** OnOpenLister');
if (!openListerData.after) return true;
checkFileExtension(openListerData.lister.activetab);
return false;
}
function OnActivateLister(activateListerData) {
DOpus.Output('*** OnActivateLister');
if (!activateListerData.active) return;
checkFileExtension(activateListerData.lister.activetab);
}
function OnOpenTab(openTabData) {
DOpus.Output('*** OnOpenTab');
checkFileExtension(openTabData.tab);
}
function OnActivateTab(activateTabData) {
DOpus.Output('*** OnActivateTab');
checkFileExtension(activateTabData.newtab);
}
function OnSourceDestChange(sourceDestChangeData) {
DOpus.Output('*** OnSourceDestChange');
checkFileExtension(sourceDestChangeData.tab);
}
function OnAfterFolderChange(afterFolderChangeData) {
DOpus.Output('*** OnAfterFolderChange');
checkFileExtension(afterFolderChangeData.tab);
}
function OnDoubleClick(doubleClickData) {
DOpus.Output('*** OnDoubleClick');
checkFileExtension(doubleClickData.tab);
}
function OnDisplayModeChange(displayModeChangeData) {
DOpus.Output('*** OnDisplayModeChange');
checkFileExtension(displayModeChangeData.tab);
}
function OnTabClick(tabClickData) {
DOpus.Output('*** OnTabClick');
checkFileExtension(tabClickData.tab);
}
var cmd = DOpus.Create().Command();
var fsu = DOpus.FSUtil();
function checkFileExtension(tab) {
for (var e = new Enumerator(tab.lister.tabs); !e.atEnd(); e.moveNext()) {
var tabItem = e.item();
var extFound = false;
var highlight = Script.config.HighlightType;
var ftg = Script.config.HighlightFTG;
var extSelected = Script.config.FileType;
var rValue = Script.config.RedValue;
var gValue = Script.config.GreenValue;
var bValue = Script.config.BlueValue;
for (var ee = new Enumerator(tabItem.files); !ee.atEnd(); ee.moveNext()) {
var fileItem = ee.item();
if (highlight != "File Type Group") { continue;
if (fileItem.groups != ftg) continue;
extFound = true;
}
else (highlight != "Extension")
if (fileItem.ext != extSelected) continue;
extFound = true;
}
break;
}
cmd.SetSourceTab(tabItem);
if (extFound) {
cmd.RunCommand('Go TABCOLOR=' + rValue + ',' + gValue + ',' + bValue);
}
else {
cmd.RunCommand('Go TABCOLOR=reset');
}
}
What might I be missing?
Leo
February 7, 2023, 12:56am
21
First thing to try is always to simplify what you're doing.
Does it work if you only add the simple FileType = "txt"
line and no other config items?
If so, add some more lines, to work out which one(s) are the actual problem.
Once you know that, the problem may reveal itself, or you can point us to it and we can help.
Chuck
February 7, 2023, 2:03am
22
I dumbed the script down as suggested. Here's the function:
function checkFileExtension(tab) {
for (var e = new Enumerator(tab.lister.tabs); !e.atEnd(); e.moveNext()) {
var tabItem = e.item();
var extFound = false;
for (var ee = new Enumerator(tabItem.files); !ee.atEnd(); ee.moveNext()) {
var fileItem = ee.item();
//if (fileItem.groupsobject != 'Programs') continue;
if (fileItem.ext != '.txt') continue;
extFound = true;
break;
}
cmd.SetSourceTab(tabItem);
if (extFound) {
cmd.RunCommand('Go TABCOLOR=255,128,0');
} else {
cmd.RunCommand('Go TABCOLOR=reset');
}
}
}
It works as is. Changing these two lines returns a "Subscript Out of Range" error:
if (fileItem.groupsobject != 'Programs') continue;
//if (fileItem.ext != '.txt') continue;
lxp
February 7, 2023, 5:53am
23
"Subscript Out of Range" error
groupsobject
returns a FiletypeGroups object, not a string.
You can use InGroup()
instead:
if (!fileItem.InGroup('Programs')) continue;
https://www.gpsoft.com.au/help/opus12/index.html#!Documents/Scripting/Item.htm
Chuck
February 8, 2023, 2:39am
25
In your Columns example, config parameter is reflected like this:
initData.config.AvgMinSize = "5 MB";
initData.config_desc = DOpus.Create.Map("AvgMinSize", "When calculating average sizes, ignore files smaller than this unless they are the only ones. Bytes unless KB, MB or GB suffix added.")
How would you use initData.config and inti.config_desc with a vector, including options and descriptions?
Chuck
February 10, 2023, 4:29am
26
I have spent way too many hours on this and have yet to figure out how to make this work:
for (var ee = new Enumerator(tabItem.files); !ee.atEnd(); ee.moveNext()) {
var fileItem = ee.item();
if (ftg != true); {
if (!fileItem.InGroup('Programs')) { continue;
extFound = true;
} else
if (fileItem.ext != '.txt') continue;
extFound = true;}
break;
}
It works if I limit to either program or text, but I want to be able to check for the program file type group first. If it comes up empty, then check for .txt extension.
I have, in fact, checked brackets via CyberChef.
Any ideas how to make this work?
lxp
February 10, 2023, 5:28am
27
Are you sure?
Looks like you want something like this:
for (var ee = new Enumerator(tabItem.files); !ee.atEnd(); ee.moveNext()) {
var fileItem = ee.item();
if (ftg && !fileItem.InGroup('Programs')) continue;
if (fileItem.ext != '.txt') continue;
extFound = true;
break;
}
Chuck
February 10, 2023, 1:38pm
29
Thanks for this @lxp , and thanks @Jon for pointing out that semicolon. Clearly, I need to get better at this, which includes understanding how to use tools like CyberChef and put stuff in the right place.
That said, the code you suggested does not work. I dumbed the function down as much as possible, per @Leo 's earlier suggestion:
function OnInit(initData) {
initData.name = 'RecolorTabBasedOnFileExtension';
initData.version = '2023-02-05';
initData.copyright = '';
initData.url = 'https://resource.dopus.com/t/tab-color-based-on-folder-content/43305';
initData.desc = 'Change tab color based on file extensions';
initData.default_enable = true;
initData.min_version = '12.0';
}
function OnOpenLister(openListerData) {
DOpus.Output('*** OnOpenLister');
if (!openListerData.after) return true;
checkFileExtension(openListerData.lister.activetab);
return false;
}
function OnActivateLister(activateListerData) {
DOpus.Output('*** OnActivateLister');
if (!activateListerData.active) return;
checkFileExtension(activateListerData.lister.activetab);
}
function OnOpenTab(openTabData) {
DOpus.Output('*** OnOpenTab');
checkFileExtension(openTabData.tab);
}
function OnActivateTab(activateTabData) {
DOpus.Output('*** OnActivateTab');
checkFileExtension(activateTabData.newtab);
}
function OnSourceDestChange(sourceDestChangeData) {
DOpus.Output('*** OnSourceDestChange');
checkFileExtension(sourceDestChangeData.tab);
}
function OnAfterFolderChange(afterFolderChangeData) {
DOpus.Output('*** OnAfterFolderChange');
checkFileExtension(afterFolderChangeData.tab);
}
function OnDoubleClick(doubleClickData) {
DOpus.Output('*** OnDoubleClick');
checkFileExtension(doubleClickData.tab);
}
function OnDisplayModeChange(displayModeChangeData) {
DOpus.Output('*** OnDisplayModeChange');
checkFileExtension(displayModeChangeData.tab);
}
function OnTabClick(tabClickData) {
DOpus.Output('*** OnTabClick');
checkFileExtension(tabClickData.tab);
}
var cmd = DOpus.Create().Command();
var fsu = DOpus.FSUtil();
function checkFileExtension(tab) {
for (var e = new Enumerator(tab.lister.tabs); !e.atEnd(); e.moveNext()) {
var tabItem = e.item();
var extFound = false;
for (var ee = new Enumerator(tabItem.files); !ee.atEnd(); ee.moveNext()) {
var fileItem = ee.item();
if (!fileItem.InGroup('Programs')) continue;
if (fileItem.ext != '.txt') continue;
extFound = true;
break;
}
cmd.SetSourceTab(tabItem);
if (extFound) {
cmd.RunCommand('Go TABCOLOR=255,128,0');
} else {
cmd.RunCommand('Go TABCOLOR=reset');
}
}
}
If I comment out either if statement, the function works with the other if statement fine. However, with the code as is, the if statements seem to cancel each other out, with no tab color change. Very frustrating.
Besides an inept coder, what might be causing this?
Leo
February 10, 2023, 1:42pm
30
That is going to exclude everything except files that are both in the Programs group and have .txt extensions.
I doubt that is what you intended. It would usually exclude everything, unless .txt has been added to the Programs group.
Chuck
February 10, 2023, 5:21pm
31
That was not my intent. Here is what I am trying to achieve:
Color tab based on user-configured input, including:
Choose file type group or file type
If file type group selected, choose from pre-built file type group list
If file type selected, user enter extension
User enter tab color
So far - and with a lot of help - I have been able to get the tab color to change based on a hard-coded extension or specified file type group.
I have NOT been able to get the code to properly choose any configurable items listed above.
Again, I appreciate the continued assistance and will keep banging away at this. Thanks for any insights anyone has to help me move forward.
Chuck
February 11, 2023, 5:45am
32
Latest attempt. I receive this error:
Error at line 108, position 4
Case 0: if (!fileItem.InGroup('Archives')) continue;
^
Expected '}' (0x800a03f1)
Here's the script:
function OnInit(initData) {
initData.name = 'ReColorV2';
initData.version = '2023-02-05';
initData.copyright = '';
initData.url = 'https://resource.dopus.com/t/tab-color-based-on-folder-content/43305';
initData.desc = 'Change tab color based on file extensions';
initData.default_enable = true;
initData.min_version = '12.0';
initData.config_desc = DOpus.Create.Map();
initData.config_groups = DOpus.Create.Map();
var configName = "";
var vecType = DOpus.NewVector();
vecType.push_back(0);
vecType.push_back("FileTypeGroup");
vecType.push_back("Extension");
configName = "Category";
initData.Config[configName] = vecType;
initData.config_desc(configName) = "Select File Type Group or Extension";
//initData.config_groups(configName) = "Choices";
var vecGroup = DOpus.NewVector();
vecGroup.push_back(0);
vecGroup.push_back("Archives");
vecGroup.push_back("Databases");
vecGroup.push_back("Documents");
vecGroup.push_back("Images");
vecGroup.push_back("Movies");
vecGroup.push_back("Music");
vecGroup.push_back("Programs");
configName = "Group"
initData.Config[configName] = vecGroup;
initData.config_desc(configName) = "Select File Type Group";
//initData.config_groups(configName) = "Choices";
configName = "Extension";
initData.Config[configName] = "txt";
initData.config_desc(configName) = "Enter file type to highlight (e.g. doc, txt, etc.)";
initData.config_groups(configName) = "Choices";
}
function OnOpenLister(openListerData) {
DOpus.Output('*** OnOpenLister');
if (!openListerData.after) return true;
checkFileExtension(openListerData.lister.activetab);
return false;
}
function OnActivateLister(activateListerData) {
DOpus.Output('*** OnActivateLister');
if (!activateListerData.active) return;
checkFileExtension(activateListerData.lister.activetab);
}
function OnOpenTab(openTabData) {
DOpus.Output('*** OnOpenTab');
checkFileExtension(openTabData.tab);
}
function OnActivateTab(activateTabData) {
DOpus.Output('*** OnActivateTab');
checkFileExtension(activateTabData.newtab);
}
function OnSourceDestChange(sourceDestChangeData) {
DOpus.Output('*** OnSourceDestChange');
checkFileExtension(sourceDestChangeData.tab);
}
function OnAfterFolderChange(afterFolderChangeData) {
DOpus.Output('*** OnAfterFolderChange');
checkFileExtension(afterFolderChangeData.tab);
}
function OnDoubleClick(doubleClickData) {
DOpus.Output('*** OnDoubleClick');
checkFileExtension(doubleClickData.tab);
}
function OnDisplayModeChange(displayModeChangeData) {
DOpus.Output('*** OnDisplayModeChange');
checkFileExtension(displayModeChangeData.tab);
}
function OnTabClick(tabClickData) {
DOpus.Output('*** OnTabClick');
checkFileExtension(tabClickData.tab);
}
var cmd = DOpus.Create().Command();
var fsu = DOpus.FSUtil();
function checkFileExtension(tab) {
for (var e = new Enumerator(tab.lister.tabs); !e.atEnd(); e.moveNext()) {
var tabItem = e.item();
var extFound = false;
for (var ee = new Enumerator(tabItem.files); !ee.atEnd(); ee.moveNext()) {
var fileItem = ee.item();
if (Script.Config["Category"] != 0) {
switch (Script.Config["Group"]) {
Case 0: if (!fileItem.InGroup('Archives')) continue;
extFound = true;
break;
Case 1: if (!fileItem.InGroup('Databases')) continue;
extFound = true;
break;
Case 2: if (!fileItem.InGroup('Documents')) continue;
extFound = true;
break;
Case 3: if (!fileItem.InGroup('Images')) continue;
extFound = true;
break;
Case 4: if (!fileItem.InGroup('Movies')) continue;
extFound = true;
break;
Case 5: if (!fileItem.InGroup('Music')) continue;
extFound = true;
break;
Case 6: if (!fileItem.InGroup('Programs')) continue;
extFound = true;
break;
}
} Else {
if (fileItem.ext != Script.Config["Extension"]) continue;
extFound = true;
break;
}
}
cmd.SetSourceTab(tabItem);
if (extFound) {
cmd.RunCommand('Go TABCOLOR=255,128,0');
} else {
cmd.RunCommand('Go TABCOLOR=reset');
}
}
}
Appreciate any assistance.
lxp
February 11, 2023, 5:53am
33
JScript is case-sensitive: case
and else
need to be lowercase.