Code: Select all
v9.60.0123 - 2010-11-02 17:45
* List | Thumbnails: Slight improvements in performance and minor
glitch fixes.
Note that BETA versions are work in progress and might contain fresh bugs. You have been warned.
Code: Select all
v9.60.0123 - 2010-11-02 17:45
* List | Thumbnails: Slight improvements in performance and minor
glitch fixes.
Code: Select all
v9.70.0000 - 2010-11-03 12:00
= NEW OFFICIAL RELEASE. Main changes since last release:
+++ Admin Settings. You use XYplorer in your company and don't want
your employees to check for updates? You don't want them to change
the configuration? All this and more is now possible through Admin
Settings!
+++ Switch Catalogs. Finally you can switch catalogs on the fly and
manage any number of Catalog (aka Favorites Panel) resources right
from the user interface.
+++ Color Filters by Size. Using size-based color filters you now can,
for example, color all empty files in a certain way, or all files
bigger than a certain size.
+++ Whole Word Content Search. Finding files by contents now supports
whole word matching. As an extra bonus the content search now
supports files with overlong filenames (> 260 chars).
+++ Confirm Drag and Drop. Optionally pop a confirmation prompt for
every left-mouse drag and drop operation. A reliable protection
from accidental drops!
Code: Select all
v9.70.0001 - 2010-11-06 16:12
+ Scripting got a new function.
Name: formatlist
Action: Formats a list of items.
Syntax: formatlist(list, [format], [separator=|])
list: The list to format.
format: Switches for the desired formatting. Can be freely
combined in any order.
t = trim (remove surrounding spaces)
u = unquote the items
s = sort ascending (by default case-insensitive: A==a)
r = sort descending (reverse sort)
c = sort case-sensitive (A!=a)
n = sort naturally (can only be case-insensitive!)
e = remove empty items
d = remove duplicate items
q = quote the items
separator: Separates the items in the list;
defaults to | (pipe).
return: The formatted list.
Notes:
- Trimming is done before unquoting.
- Unquoting is done before sorting.
- Sorting is done before removing duplicates.
- Sorting is by default case-insensitive (A==a). Passing switch
"c" forces it to be case-sensitive, unless "n" is passed as well
which overwrites "c" and forces case-insensitive sorting.
- Sorting naturally (3 < 20 < 100) is only supported from XP onwards.
- Passing "r", "c", or "n" implies "s".
- Removing empty items is done before removing duplicates.
- Removing duplicates only works on adjacent items, so if the list
is not sorted non-adjacent duplicates remain in the list.
- Duplicates are matched case-insensitive (A==a).
- Quoting is done as the last step. Items that are already quoted
in the source are not quoted again.
- If "list" is empty then an empty (and unquoted) string is
returned, even if the "q"-switch is passed.
- If "format" is empty then "list" is returned unchanged.
Examples:
text formatlist("b|a|c", "s"); //a|b|c
text formatlist("b|a|c", "r"); //c|b|a
text formatlist("b||a|c", "s"); //|a|b|c
text formatlist("b||a|c", "se"); //a|b|c
text formatlist(" b | |a | c", "s"); // | c| b |a
text formatlist(" b | |a | c", "set"); //a|b|c
text formatlist('b|"a"|c', "s"); //"a"|b|c
text formatlist('b|"a"|c', "su"); //a|b|c
text formatlist("3b|10a|200c", "s"); //10a|200c|3b
text formatlist("3b|10a|200c", "n"); //3b|10a|200c
text formatlist("3b|10a|200c", "nr"); //200c|10a|3b
text formatlist("b|a|C|D", "s"); //a|b|C|D
text formatlist("b|a|C|D", "c"); //C|D|a|b
text formatlist("b|a|a|a|c", "s"); //a|a|a|b|c
text formatlist("b|a|a|a|c", "sd"); //a|b|c
text formatlist("b|b|a|b|c", "d"); //b|a|b|c
text formatlist("b||b|a|b|c", "ed"); //b|a|b|c
text formatlist("b||b|a|b|c", "eds"); //a|b|c
text formatlist("b||b|a|b|c", "edsq"); //"a"|"b"|"c"
text formatlist("b|a|c", "q"); //"b"|"a"|"c"
text formatlist("b", "q"); //"b"
text formatlist("", "q"); //returns empty string, *not* quoted
+ SC recase enhanced: Added new mode "camel" and a new flags parameter.
Syntax: recase(string, [mode], flags)
string: String to change case of.
mode: One of the following:
lower = [default] to lower case
upper = to upper case
title = to title case (first letter of each word to upper
case, other letters to lower case)
camel = like "title" but preserves any caMel-case.
flags: (binary field)
1 = set extensions to lower case
return: String with changed case.
Examples:
::text recase("the caMel can't.", "lower"); //the camel can't.
::text recase("the caMel can't.", "upper"); //THE CAMEL CAN'T.
::text recase("the caMel can't.", "title"); //The Camel Can't.
::text recase("the caMel can't.", "camel"); //The CaMel Can't.
// returns This Is A Test.htm
::text recase("this is a test.HTM", "title", 1)
* Color Filters: Now when a back color is defined it is drawn with
the lower right corner snipped off to better distinguish it from
the selection back color.
! Scripting: HereDoc constructs containing unclosed quotes lead to
parsing trouble. Fixed.
! Scripting: Multiline scripts stored in the INI file (Run Script,
or User Buttons Scripts) did not fold/unfold well in rare cases.
Fixed.
Code: Select all
v9.70.0002 - 2010-11-06 18:10
! Scripting: Multiline scripts stored in the INI file (Run Script,
or User Buttons Scripts) were not correctly read when upgrading to
v9.70.0001. Fixed.
Code: Select all
[General]
LastVer=9.70.0000
Code: Select all
v9.70.0003 - 2010-11-08 10:52
+ Tweak to define a minimal duration of all background jobs within
one queue until the sound defined in BJSoundAllDone is played.
BJSoundAllDuration=<number of seconds>
* Action Log: Improved the captions for actions concerning a folder.
When you delete, rename, copy, or move a single folder, then the
attribute "folder" is added to the caption.
! Background Jobs: When adding a new job the Statusbar always showed
"job #1 ..." instead of the correct number. Fixed.
! List: Scrolling down by Arrow Down moved the pane content page by
page instead row by row (since 20101030). Fixed.
! List: Scrolling the list by arrow keys updated the Info Panel for
every focused item even while the key was still down. This shouldn't
happen, of course, and was added by stupidity on 20100707. Fixed.
Code: Select all
v9.70.0004 - 2010-11-09 13:27
+ New variable <get bytesselected [pane]> returns the sum of bytes
of all selected items of any of the two panes. If folder sizes are
shown then they are included in the byte count.
The optional "pane" argument can be:
a = [default] active pane
i = inactive pane
1 = pane 1
2 = pane 2
For example:
<get bytesselected> //active pane's sel. bytes
<get bytesselected i> //inactive pane's sel. bytes
As always, SC get supports the same argument:
echo get("bytesselected"); //active pane's sel. bytes
echo get("bytesselected", i); //inactive pane's sel. bytes
+ New variable <get bytestotal [pane]> returns the sum of bytes of
all items of any of the two panes. Syntax see above.
+ Also the following variables now support the optional "pane"
argument (syntax see above):
<get countitems [pane]>
<get focusedpos [pane]>
<get countselected [pane]>
<get sort [pane]>
<get view [pane]>
<get selecteditemsnames [separator=CRLF] [pane]>
<get selecteditemspathnames [separator=CRLF] [pane]>
Note that you can omit the "separator" argument, which then leads
to two adjacent spaces. For example this script line lists all
selected item names of the inactive pane, one per line:
text <get selecteditemsnames i>;
As always, SC get supports the same argument. For example the
above line using SC get:
text get("selecteditemsnames", , "i");
+ New variable <get [Command ID] [ReturnOnTrue = 1] [ReturnOnFalse =
0]>. Here you can retrieve the current state of a couple of toggles
that have a command ID, and control what is returned on what state.
Currently supported are the following Command IDs:
#800 = Dual Pane
#801 = Horizontal Panes
For example, this returns "DP" when Dual Pane is enabled, and "SP"
when it's not:
text <get #800 DP SP>;
And this returns "DualPane" resp. "SinglePane":
text <get #800 DualPane SinglePane>;
And this returns "1" resp. "0":
text <get #800>;
As always, SC get supports the same argument:
text get("#800", "DP", "SP");
So now you have a Ternary Conditional wrapped into a variable.
+ Variables: Now parameters of variables may be quoted. This is
useful to pass parameters containing spaces (because the space
characters also serves to separate the paramters in this context).
The parameters themselves are unquoted after parsing.
For example, this returns "Dual Pane" when Dual Pane is enabled,
and "Single Pane" when it's not:
text <get #800 "Dual Pane" "Single Pane">;
You can even pass embedded quotes by doubling them:
text <get #800 """Dual Pane""" "Single Pane">;
! Scripting: Still parsing trouble with HereDoc constructs in
combination with unclosed quotes contained in block comments. Fixed.
! There was a problem when you had an extraordinarily high number of
drives. Should be fixed.
Code: Select all
v9.70.0005 - 2010-11-09 20:57
+ Scripting: Added unary boolean operator "not" or "!". It inverts
the truth value of its operand.
Note that "not" must be separated by at least one space from its
operand. This is not necessary (but allowed) with "!".
Examples:
echo not 1; // 0
echo not 0; // 1
echo ! 1; // 0
echo !1; // 0
echo !0; // 1
echo !(1 and 0); // 1
The following scripts all turn on dual pane (if it is not on
already):
if (!get('#800')) { #800; };
if (! get('#800')) { #800; };
if (not get('#800')) { #800; };
if (not not not get('#800')) { #800; };
! Scripting: Still parsing trouble with HereDoc constructs in
combination with block comments. Sigh. Fixed.
Code: Select all
v9.70.0006 - 2010-11-10 12:27
+ Logging To File: Up to now, this was only possible using the
undocumented scripting command "logtofile". From now on, you can
also pass a command switch to enable logging to file.
Currently supported IDs:
eLTFBackgroundJobAdded = 1
eLTFBackgroundJobTriggered = 2
For example, log all using a script:
::logtofile 3;
For example, log all using a command switch:
/log=3
* Logging To File:
- From now on, also the milliseconds are logged.
- NOTE: From now on, the setting is NOT remembered across sessions
anymore!
Code: Select all
v9.70.0007 - 2010-11-11 13:29
+ Configuration | Startup & Exit: Added dropdown "Startup pane".
Allows you to always start on a certain pane, or on the last pane
(factory default).
+ Scripting got a new function.
Name: formatbytes
Action: Formats a number as bytes, resp. converts byte formats.
Syntax: formatbytes(bytes, [format=FLEX], [decimals=-1])
bytes: The number to format.
Can be a raw number or a string like "2 KB".
format: The desired formatting. One of the following:
FLEX = [Default] Flexible (best unit is auto-selected).
FLEXR = FLEX, but rounded up.
KB, MB, GB, TB, or PB = usual bytes unit.
KBR = KB, but rounded up.
BB = Bytes (with unit)
B = Bytes (no unit)
RAW = Raw number (no unit, no thousand separators).
decimals: The number of decimal points.
Ignored if the unit is B, BB, KBR, or FLEXR.
-1 = System default.
return: Formatted number.
Remarks:
- The returned numbers are rounded to 2 digits and have thousand
separators (unless "R" is stated as format).
- Note that the function is locale-specific! Decimal and thousand
separators may be different from locale to locale.
Examples for US locale:
::text formatbytes("1.34 MB", "KB"); //1,372.16 KB
::text formatbytes("1,372.16 KB", "MB"); //1.34 MB
Examples for German locale:
::text formatbytes("1,34 MB", "KB"); //1.372,16 KB
::text formatbytes("1.372,16 KB", "MB"); //1,34 MB
More examples for German locale:
::text formatbytes("2 kb", "b"); //2.048
::text formatbytes("2 kb", "bb"); //2.048 bytes
::text formatbytes(2560); //2,50 KB
::text formatbytes("2560"); //2,50 KB
::text formatbytes("2560", "FLEX"); //2,50 KB
::text formatbytes("2560", "FLEXR"); //3 KB
::text formatbytes(2048 * 1024); //2,00 MB
::text formatbytes(2048 * 1024 . "KB"); //2,00 GB
::text formatbytes("1,5 MB", "RAW"); //1572864
Rounding (German locale):
::text formatbytes(1, "KB"); //0,00 KB
::text formatbytes(1, "KB", 0); //0 KB
::text formatbytes(1, "KB", 2); //0,00 KB
::text formatbytes(1, "KBR"); //1 KB
::text formatbytes(512, "KB"); // 0,50 KB
::text formatbytes(512, "KB", 0); // 1 KB
::text formatbytes(512, "KB", 2); // 0,50 KB
::text formatbytes(512, "KBR"); // 1 KB
+ Scripting got a new function.
Name: listpane
Action: Lists the contents of a pane.
Syntax: listpane([pane=<curpane>], [pattern=*], [flags], _
[separator="|"])
pane: Pane to list.
a = [default] active pane
i = inactive pane
1 = pane 1
2 = pane 2
pattern: Wildcard (?, *) pattern to filter returned items;
defaults to "*" (show all).
If no wildcards are contained, the pattern is auto-
embraced by "*".
flags: (binary field)
0: return folders and files with full paths [default]
1: NoFolders (= return only files)
2: NoFiles (= return only folders)
4: NoPaths (= return the filenames without paths)
separator: Separates the items in the returned list;
defaults to | (pipe).
return: List of items.
Notes:
- As you might have noted, this command is analogue to SC
listfolder with the exception of the first argument.
- The command also works on Search Results, Drives, Recycle Bin
and whatever list modes we will get int he future.
- The order of items is determined by the current list order.
- The possibilities this command brings to scripting are mind-
boggling.
Examples:
::inputselect("Items on pane 1", listpane(1));
::inputselect("Items on pane 2", listpane(2));
::inputselect("Items on active pane", listpane());
::inputselect("Items on inactive pane", listpane("i"));
::inputselect("Items a* on active pane", listpane(, "a*"));
* Logging To File: Well, from now on, the setting IS remembered
across sessions again IF it was set by ::logtofile. Logging set by
command switch /log=... is not remembered.
Note that both ways of setting the logging can be done
simultaneously: their values will be combined (bitwise OR-ed). So
when ::logtofile 1 has been set, and you start the app with
/log=2, then both events, eLTFBackgroundJobAdded (1) and
eLTFBackgroundJobTriggered (2) are logged.
! Scripting: The Math parser got stuff like this wrong:
::echo 3 * 3 . 3 * 3;
This should be analyzed as (3 * 3) . (3 * 3) = 9 . 9 = "99",
but the parser returned a very different result! Fixed.
Code: Select all
v9.70.0009 - 2010-11-12 12:30
* SCs listfolder and listpane enhanced. Added flag to force the
pattern to be an exact match, i.e. to suppress auto-adding of
wildcards when no wildcards are contained in the pattern (aka
"loose match").
flags: (binary field)
0: return folders and files with full paths [default]
1: NoFolders (= return only files)
2: NoFiles (= return only folders)
4: NoPaths (= return the filenames without paths)
8: NoAutoWildcards (= allow exact matches)
Example:
//list all folders that are named "code" in active pane
::inputselect("Test", listpane(, "code", 2 + 8));
! Info Panel | Find Files: The Location field was not correctly
updated on startup when the startpath was passed via command line
and "Auto sync" was enabled. Fixed.
Code: Select all
v9.70.0010 - 2010-11-12 20:51
+ Menu Tools | Customize List | Size Column Format: Added units TB
and PB. These two and also EB are now supported everywhere in the
app.
Note that backward compatibility has been provided, so your Size
columns in the Lists should look the same as before upgrading.
+ Configuration | Startup & Exit: Added option "Check for updates on
startup". Check it to perform a quick online check whether your
current version is still up-to-date. If there is a newer version
available you get a message.
The check is only performed if you are online already.
Note that if Admin Settings are set to eAPHide_Help_XYOnTheWeb
(64), this option is hidden and the functionality disabled.
Note that unfortunately the check can take a couple of seconds. I
investigated this for several hours without finding a solution.
One day I will find one.
* Menu Help | XYplorer on the Web | Check for Updates: Now it shows
the result of the update check in a dialog. Before, it opened a
website in the default browser.
! Spot & Jump: A single jump pattern containing a space, e.g.
">chuck berry|" would not jump but just spot. Fixed.
FYI, the trailing | in ">chuck berry|" is necessary to have a
space within the pattern, else spaces are used as pattern
separators.
! There was a problem (well, a crash) with very large drives (> 1
ExaByte). Not that these actually exist, but certain buggy drives
have been seen to return such a size. Fixed. Now drives up to 8.00
EB are supported. And even larger drives will not crash the app
anymore.
Code: Select all
v9.70.0011 - 2010-11-14 14:36
+ Scripting: Comparisons now support the UnLike (UnLikeI) operator.
General form:
String UnLike Pattern (case-sensitive)
String UnLikeI Pattern (case-insensitive)
Where string is any string expression and Pattern may contain the
usual wildcards and special chars used in XY patterns (*?#[]).
UnLike is obviously the inverse of Like, so the UnLike comparison
returns 1 (TRUE) if String and Pattern do not match.
Examples:
::echo "abc" UnLike "a*"; //0
::echo "Abc" UnLike "a*"; //1
::echo "Abc" UnLikeI "a*"; //0
Notes:
- Exact capitalization matters: "Unlike" or "unlike" won't work.
- Like "Like" and "LikeI" these operators must be surrounded by
spaces.
% Thumbnails: Display of cached thumbnails about 20% faster.
! You could crash the app by passing an illegal key. Fixed. Now YOU
are crashed. ;)
Code: Select all
v9.70.0017 - 2010-11-15 15:18
+ SC md5 enhanced: Now you can pass file names in place of the
string.
Syntax: md5(string, [flags])
flags: (binary field)
0: string is data that will be md5-ed
1: string is a file spec whose contents will be md5-ed
Example:
::text md5("<xypath>\<xyexe>", 1);
% MD5: The MD5 algorithm more than doubled its speed.
* MD5: MD5 now can be escaped by press ESC. Hold down ESC until the
operation is aborted.
Note that the maximum supported size for MD5 is 2GB data.
! Scripting: Unary operators + and - were not always parsed
correctly. Fixed. Now stuff like this works:
::echo 1 + --1; //2
::echo --(1 * ----2); //2
Code: Select all
v9.70.0025 - 2010-11-16 20:25
+ Scripting got a new function.
Name: hash
Action: Creates hash of a string or file.
Syntax: hash([algo=md5], [string], [flags])
algo: Hash algorithm; one of the following:
md5: [Default] MD5.
sha1: SHA-1.
sha256: SHA-256.
NOTE: SHA-256 is NOT supported on all systems! It
should work in Vista and higher.
string: Data or file to be hashed (see flags).
Defaults to current list file if flags AND 1.
flags: (binary field)
0: [default] String is data to hash.
1: String is a file spec whose contents to hash.
return: Hash.
Notes:
- The maximum supported size is 2GB data.
- You cannot abort the process by ESC. XY will be blocked while
the process is running.
- SC hash("md5" ...) is about 20 times faster than SC md5. :)
- SC md5 is kept for compatibility, and for systems where hash is
not supported (which might be the case on older Windows).
Example:
::text hash("md5", ""); //d41d8cd98f00b204e9800998ecf8427e
::text hash("sha1", ""); //da39a3ee5e6b4b0d3255bfef95601890afd80709
::text hash(,,1); //md5 of current list file
! List: Line numbers column of the inactive pane was not fully
painted when enabling dual pane. Fixed.
Code: Select all
v9.70.0026 - 2010-11-17 12:16
+++ Configuration | Color Filters: Added color filters by file date.
All three file dates (Created, Modified, Accessed) are supported.
You now can, for example, color all files that were modified on a
certain day, or that were created before the year 2008. A useful
thing if you ask me.
General syntax:
/dateC: = Date Created
/dateM: = Date Modified
/dateA: = Date Accessed
/dateM: [date] = exact date (down to the second)
/dateM: == [date] = exact date (down to the second)
/dateM: < [date] = earlier than
/dateM: > [date] = later than
/dateM: <= [date] = same or earlier
/dateM: >= [date] = same or later
/dateM: [date] - [date] = from earliest to latest (both inclusive)
/dateM: [date] - = same or later (same as >= )
/dateM: - [date] = same or earlier (same as <= )
Examples:
/dateC: < 2008.01.01 (all items created before 2008)
/dateM: 2010.01.01 - (all items modified 2010 and later)
/dateM: 2010.11.14 - 2010.11.15 (all items modified 2010.11.14)
/dateM: == 2010.11.16 10:30:12 (all items modified then)
/dateA: >= 11.11.2010 11:11:11 (all items accessed in this Carnival)
Notes:
- The date has to be given in a form that is recognized as a valid
date format on your locale. The time part can be skipped in which
case it is internally set to 00:00:00.
- The selector is not case-sensitive: /DaTem: would work as well.
/date: = defaults to "Date Modified".
- A trailing ";" is optional. Like with all color filters, ";" can
also be used to concatenate patterns assigned to the same colors.
- These filters work for files and folders but only in the List
(not in the Tree).
* Color Filters: Now if you define a backcolor for a Color Filter,
the shape is drawn slightly different depending on the type of the
Color Filter (Name, Attribute, Size, Date), so that you can
immediately recognize which sort of filter made the match.