Monday, March 31, 2008

v7.00.0000 - 2008-03-31 12:00

Main changes since last release:

  • +++ Scripting. Ultimate file management efficiency. Roll your own custom commands, wrap them in an XYplorer Script file (XYS), or a User-Defined Command, and trigger them by just a click or a keystroke. Can't get any better? It can! Share scripts with colleagues: Just drop a script file into your app folder and fresh plug-in commands are at your finger tips.
  • +++ Now tabs can be iconized. Shrunk to the size of an icon. A mind-blowing space saver.
  • +++ Now you can freely determine XYplorer's application data path and thus banish any UAC (User Account Control) issues.
  • +++ Now you can search for folders by size.
  • +++ Now you can turn a text or image from clipboard directly into a new file.
  • +++ Now there's secondary sorting. Simply hold Shift while you click on a column header to sub-sort the file list by this column.

v6.80.0118 - 2008-03-31 10:47

  • ! The default secondary sorting (which is always on Name) got lost when switching folders. Fixed.
  • ! A CKS to pop up a menu would not work sometimes because the menu was still disabled when it should be enabled. Fixed.

Sunday, March 30, 2008

v6.80.0117 - 2008-03-30 17:14

  • * Updated the help file.
  • + Scripting command enhanced:
      - addstr
        Now it can take up to 10 arguments:
        ::addstr $x, 1,2,3,4,5,6,7,8,9,10,11
        Sets $x to "12345678910". The 11th argument is discarded.

Saturday, March 29, 2008

v6.80.0116 - 2008-03-29 09:41

  • ! Configuration dialog did not keep position on DPI settings other than 96. Fixed.
  • ! Variable <focitem> returned paths with a backslash while it should not. Fixed.
  • ! Toolbar button Nuke: Could not nuke files that were locked due to being previewed or raw viewed. Fixed. Any preview is closed now before nuke is executed.
    Remark: Take care with "Nuke"! While it currently does not erase data beyond restorability, you will need specialized software to restore a nuked file. In a planned future version of Nuke, not even this will help...
  • ! Reposition of tree in some cases didn't always give desired results. Fixed.

Friday, March 28, 2008

v6.80.0115 - 2008-03-28 10:39

  • ! Find Files tab | Name field: Fixed some issues with alignment and auto-completion when using the > or : prefix in patterns.
  • ! Changing sort order when list is empty did not work anymore. Fixed.
  • ! INI tweak
    did not work as expected. (If PopupFullFavMenu=1 then the full Favorites menu is popped up on a right-click in the tree's white space.) Fixed.

Monday, March 17, 2008

v6.80.0114 - 2008-03-17 12:29

  • + Scripting got new commands:
      - StrLen
        Action: Returns the length of a string.
        Syntax: StrLen OutputVar, String
          ::strlen $a, "abcdef";  // 6
          ::strlen $a, <curitem>; // length of current item

      - StrPos
        Action: Returns position of first occurrence of a string.
        Syntax: StrPos OutputVar, Haystack, Needle, [Start],
          - OutputVar: Required, anything goes, case matters.
          - Haystack:  String to search in.
          - Needle:    String to search for.
          - Start:     [optional; defaults to 0] Allows you to specify
            which position in haystack to start searching. The
            position returned is still relative to the beginning
            of haystack.
          - MatchCase: [optional; defaults to 0] Compare method.
            0: A=a
            1: A<>a
          ::strpos $a, "abcabc", "a";      // returns 0
          ::strpos $a, "abcabc", "d";      // returns -1 (not found)
          ::strpos $a, "abcAbc", "A";      // returns 0
          ::strpos $a, "abcAbc", "A", , 1; // returns 3
          ::strpos $a, "abcAbc", "a", 1;   // returns 3
          ::strpos $a, "abcAbc", "a", 10;  // returns -1 (not found)
          ::strpos $a, "abcAbc", ""; // returns -1 (not found)
          ::strpos $a, "", "a";      // returns -1 (not found)
          ::strpos $a, "", "";       // returns -1 (not found)

      - Incr
        Action: Increment a numerical value.
        Syntax: Incr OutputVar, [Value], [Increment=1]
          - OutputVar: Required, anything goes, case matters.
          - Value:     Value defaults to OutputVar(!);
            can be negative.
          - Increment: Defaults to 1; can be negative.
          ::incr $a;          // returns $a + 1
          ::set $a, 5; incr $a;  // returns 6 (5 + 1)
          ::incr $a, 1;       // returns 2 (1 + 1)
          ::incr $a, 1, 2;    // returns 3 (1 + 2)
          ::incr $a, -1, 2;   // returns 1 (-1 + 2)
          ::incr $a, 1, -2;   // returns -1 (1 - 2)
          ::incr $a, -1, -2;  // returns -3 (-1 - 2)
          ::incr $a, "Paul";  // returns 1 (0 + 1)
          ::incr $a, "3Paul"; // returns 4 (3 + 1)
  • * Scripting: Renamed "Add" renamed to "AddStr". Reason: "Add" implies a numerical operation.
  • * Scripting: Renamed "Mid" to "SubStr". Also changed its syntax as to match SubStr in PHP. So forget yesterday's "Mid", here's "SubStr":
      - SubStr
        Action: returns part of a string
        Syntax: SubStr OutputVar, String, [Start], [Length]
          - OutputVar: Required, anything goes, case matters.
          - String:    Input string.
          - Start:     Start of returned part; defaults to 0, first
            position is 0. If Start is negative, the returned string
            will start at the start'th character from the end of
          - Length:    Length of returned part (number of characters).
            If missing then the whole string is returned (beginning
            from Start). If Length is negative, then that many
            characters will be omitted from the end of string
            (after the start position has been calculated when
            Start is negative). If Start denotes a position beyond
            this truncation, an empty string will be returned.
          ::substr $a, "abcdef", 1;       // returns "bcdef"
          ::substr $a, "abcdef", 1, 1;    // returns "b"
          ::substr $a, "abcdef", -1);     // returns "f"
          ::substr $a, "abcdef", -2);     // returns "ef"
          ::substr $a, "abcdef", -3, 1);  // returns "d"
          ::substr $a, "abcdef", 0, -1);  // returns "abcde"
          ::substr $a, "abcdef", 2, -1);  // returns "cde"
          ::substr $a, "abcdef", 4, -4);  // returns ""
          ::substr $a, "abcdef", -3, -1); // returns "de"
  • + New variable: <focitem> = currently focused item in tree or list. Useful in scripting; for example, this works in tree or list depending on focus:
      ::copytext <focitem>
    Note that, contrary to <curitem>, <focitem> will also return the focused item if it is not selected.
  • * Scripting RegExReplace: Now caret (^) & dollar ($) match the beginning & end of every line, before they'd only match the very start and very end of the entire string.

Sunday, March 16, 2008

v6.80.0112 - 2008-03-16 11:37

  • + Scripting got new commands:
      - Add
        Action: concatenates two or three strings
        Syntax: Add OutputVar, [String1], [String2], [String3]
          - OutputVar:   required, anything goes, case matters
          - String1/2/3: the strings
          ::add $x, "a", "b"      = ab
          ::add $x, "a", "b", "c" = abc

      - Mid
        Action: returns a part of a string
        Syntax: Mid OutputVar, String, [Start], [Length]
          - OutputVar: required, anything goes, case matters
          - String:    first string
          - Start:     start of returned part (defaults to 1)
          - Length:    length of returned part
          ::mid $a, "Maxi", 3    = xi
          ::mid $a, "Maxi", 3, 0 = x
          ::mid $a, "Maxi", 3, 1 = x
          ::mid $a, "Maxi", 3, 2 = xi
          ::mid $a, "Maxi", 3, 3 = xi
          ::mid $a, "Maxi", , 2  = Ma

      - Replace
        Action: replaces parts of a string
        Syntax: Replace OutputVar, String, Search, Replacement,
          - OutputVar:   required, anything goes, case matters
          - String:      string to work on (haystack)
          - Search:      string to be replaced (needle)
          - Replacement: string to replace with
          - MatchCase:   compare method
            0: A=a
            1: A<>a
          ::Replace $a, "Maxi", "max", "Min"    = Mini
          ::Replace $a, "Maxi", "max", "Min", 1 = Maxi

      - RegExReplace
        Action: replaces parts of a string using a regular
                expression pattern
        Syntax: RegExReplace OutputVar, String, RegExPattern,
                Replacement, MatchCase
          - OutputVar:    required, anything goes, case matters
          - String:       string to work on (haystack)
          - RegExPattern: string to be replaced (needle)
          - Replacement:  string to replace with; may include
                          backreferences like $1
          - MatchCase:    compare method
            0: A=a
            1: A<>a
          ::RegExReplace $a, "Image[1].png",
            "(?#Remove common IE suffix)^(.+)\[[0-9]+\](\..+)$",
            (= Image.png)
          ::RegExReplace $a, "bob", "b$", "p"
            (= bop)

      - Status
        Action: shows text in statusbar
        Syntax: Status Text
          ::Status Done!
          ::Status It's <dhh:nn:ss>

Saturday, March 15, 2008

v6.80.0111 - 2008-03-15 11:35

  • + Menu Help: Added command to open the help file at section Scripting Commands Reference.
  • * Menu File | Settings: the Save... commands now feedback via statusbar, not via message box anymore.
  • * Time-stamping, aka "Touch": From now on, the milliseconds (yes, NTFS supports milliseconds in file times) will be set to 0 (zero) when you touch a file date. Before they were ignored, resp. set to some uncontrolled random value.
    Tip 1: Use the undocumented scripting command "msecs" to toggle showing milliseconds in the file list! :)
    Tip 2: Use the undocumented scripting command "touch" to set all three file dates of all currently selected items to now (setting the milliseconds to zero! :)

Friday, March 14, 2008

v6.80.0110 - 2008-03-14 13:42

  • + Added scripting to the help file. This was harder for me than coding scripting, and I'm ultra-ready for holiday now.
    A big thanks to jacky, the wicked wiki master -- the XYwiki helped a lot in organizing the stuff and even providing some copy+paste text snippets!
  • * Variables: <srctitle> is deprecated (but still supported). Use <srcname> instead.
  • ! Network: The logon dialog would not pop for mapped drives. Fixed.

Wednesday, March 12, 2008

v6.80.0108 - 2008-03-12 11:38

  • + Secondary Sorting: Now it's remembered between sessions and in tabs. Note that it was not possible to write backward compatibility code for all possible situations, so some of your saved tabs might be sorted differently than they were before when you open them the first time.
  • + Info Panel | Find Files: the "..." (Browse) button's context menu got two more entries. Just like that.

Tuesday, March 11, 2008

v6.80.0107 - 2008-03-11 13:13

  • +++ List: Added secondary sorting. Simply hold Shift while you click on another column header to secondary-sort by this column. Of course, secondary sorting makes only sense where the primary sorting results in groups. This typically is the case with the following columns: Ext, Type, and Attr; less so with Size and Dates. The column that's sorted secondarily is marked by a smaller sorting icon. Currently not remembered between sessions. Will add tomorrow.
  • ! Scripting: Issue with loading script files from other script files using relative path syntax when one of the script files happened to be located in the Current Directory (OS global). Fixed.

Monday, March 10, 2008

v6.80.0105 - 2008-03-10 18:01

  • - Configuration | Interface Colors: Removed option "Info Panel in classic style" -- probably the shortlived interface element in history so far. Now the (new) classic style is back to be the only one!
  • + Configuration | Tabs: Added option "Yellow highlight marks selected tab in classic style". Check it to have a thin yellow stripe on top of the selected tab. This setting controls the tabs on the Info Panel, and the main browsing tabs if they are in classic style. The latter had been hard-coded before to: yes, show the yellow stripe.

v6.80.0104 - 2008-03-10 15:17

  • * Info Panel got a new look, #2. Now the selected tabs are bold, and some other things have been improved as well.
  • + Configuration | Interface Colors: Added option "Info Panel in classic style". If you set it to "Classic" then the Info Panel will like pretty much as it did the day before yesterday. But with selected tabs bold and without yellow ribbon on top.
  • * Info Panel | Find Files: Changed two captions:
    - "Contents", was "Contained Text"
    - "Excluded", was "Excluded Folders"
    Accordingly the filter "Text" was renamed to "Cont.".

Sunday, March 9, 2008

v6.80.0103 - 2008-03-09 15:00

  • *** Info Panel got a new look. Gone are the last remnants of Win95 look and feel... :)
  • + Configuration | Startup & Exit | "Permanent startup path": Now accepts portable syntax. E.g. "?:\" to start XY always in the root of its installation drive, or "..\Stuff" to always start in folder "Stuff" which is a sibling of XY's application folder.
  • + Toolbar: Added small context menu to button "Calculate Folder Sizes".
  • * Now, if Configuration | Advanced | "Assume that servers exist" is enabled and you go to a non-available server, the list will be greyed with the usual "Currently not available..." message. Before this did only happen with Assume off.
  • ! List: "Move On Rename" did not work when you entered an absolute path. Fixed.
  • ! List: "Move On Rename" did not reliably work on more complex relative patterns using ".." syntax. Fixed.
  • ! List: "Move On Rename" did not set Last Target path (for menu Go | Go to Last Target). Fixed.
  • ! UDC: Couldn't edit multi-line scripts anymore since some days. Fixed.

Friday, March 7, 2008

v6.80.0101 - 2008-03-07 14:33

  • ! Little glitch with the script name resolving added earlier today. Fixed.

v6.80.0100 - 2008-03-07 11:34

  • + New variable: <curitem> = currently focused/selected list item, i.e. the one that's displayed in the statusbar. Up to now this variable was only recognized in the Source field of a UDC "New". But there's good use for it in other contexts as well, especially in scripting.
    For example:
      ::load <curitem>
    If a script file is currently selected, this script will load it.
  • * Scripting: To improve the interaction between script files I slightly redesigned the logic of resolving the name of a script file to load:
    - If the passed file argument does not contain any extension, the
      *.xys is assumed immediately (there is no test whether a
      file without any extension exists).
    - If a script file was called from another ("parent") script file,
      then the first path to look for the file is the path of
      the parent script file. If no file is found in that path, then
      the application data path will be searched.
    The latter is an important imporvement because it enables you to run script files that depend on other script files from any directory! For example, you have a lot of script files and organize them into various folders. In one folder called E:\XY\Scripts\Rename\ you have these four files:
      Rename - IE.xys
      Rename - Insert.xys
      Rename - Remove.xys
    Now Rename.xys calls the other files in statements like this:
      load "Rename - Remove";
    This would not have been possible without the new logic added here, because "Rename - Remove.xys" would have been looked for only in xy app data path and, of course, not been found. Now it is found in E:\XY\Scripts\Rename\. So, now you can e.g. load script files from some network server and need not to worry about paths.
    Also, when users share script files, you don't have to worry about name collisions anymore because each script file package can run in its own folder.

Thursday, March 6, 2008

v6.80.0099 - 2008-03-06 12:57

  • + Scripting command enhanced:
      - load
        Now the first argument (resource) can be set to * in order to
        refer to *this* resource! Kind of a recursion trigger,
        and very useful.
        Example (multi-script):
        "Copy 0"
          copytext "0", a;
          // load this script resource (file or script)
          load *;
        "Copy 1"
          copytext "1", a;
          // load this script resource (file or script)
          load *;
        Run this script through the Try Script... dialog, or load it
        as a script file -- it will work just the same. Tip: Use the
        keyboard to select the menu items else your menu will try to
        leave the screen towards south-east... ;)
  • + Configuration | Advanced: Added option "Assume that servers exist". If enabled then the check for existence is skipped, with two possible effects:
    (1) It might speed up browsing and start up.
    (2) In some rare configurations the checks are not reliable (servers that do exist are not seen), so if YOU know the servers do exist, you don't need the check and can turn it off.
    The factory default is ON (skip the check).
    Note that this setting has already been available as INI tweak since v6.30.0044 - 2007-10-03 14:58.

Wednesday, March 5, 2008

v6.80.0098 - 2008-03-05 12:52

  • + List: Now there's "Move On Rename", a cute little time saver that enables you to move & rename files in one go. Simply enter a relative (to the current path of the file!) or absolute path into the inline rename box (F2) and "Move On Rename" will happen. If the new folder (or multi-folder path!) does not exist yet, you will be prompted to create it on the fly. Note that "Move On Rename" does work only for one item at a time. For example, select a file in the List and enter this into the rename box:
      - C:\new.png = Move file to C:\ renaming it to new.png.
      - C:\1\2\3\new.png = Move file to C:\1\2\3 renaming it to
        new.png. If "C:\1\2\3\" does not exist it is created.
      - ..\new.png = Move file one up renaming it to new.png.
      - stuff\new.png = Move file one down to subfolder "stuff"
        renaming it to new.png. If "stuff" does not exist it is
    For logistic reasons this is currently only implemented as an INI tweak. You have to manually enable it by editing the INI file:

  • * Menu File | Move/Copy/Backup To: Now the submenu MRU items are prefixed with serial numbers. Also items containing an "&" are displayed correctly now.

  • + CKS | Miscellaneous | Tree: Added command "Create New Subfolder Here". Creates new folder under the current Tree folder, and opens rename box in Tree.
    Note: This command is featured in the Tree items' context menu since long. Before, the keyboard shortcut for New Folder (Ctrl+N) was displayed here, but that was not correct because the commands are not the same: "New Folder" opens the rename box in the List, whereas "Create New Subfolder Here" opens it in the tree.

  • + Menu User | Run Script: items now have icons.

  • + Menu User | Load Script File: items now have icons.

  • * Toolbar: Removed the only two special tooltips for pressed state, namely:
    - "Reactivate Auto-Refresh" of button "Suspend Auto-Refresh"
    - "Unlock Tab" of button "Lock Tab"
    It's more consistent like this, and clearer: With toggle-state buttons, the tooltip always describes what happens when the button is pressed, and the opposite happens when it is unpressed.

  • *% List: From now on, the "Len" column will only be filled with data when visible. This increases the listing speed for most users (since the Len is not very commonly used) and makes no difference for users that actually use the column. The only downside:
    - When you switch the Len column from hidden to visible you have to refresh the list (F5) in order to fill it.
    - You cannot sort by Len while Len is hidden.

  • * Menu Edit | New | New Folder: Now, the rename box is opened in Tree when the focus was on Tree when the command was triggered by keyboard. Before, the rename box was always opened in List when the command was triggered by keyboard.

Tuesday, March 4, 2008

v6.80.0097 - 2008-03-04 09:39

  • +++ Menu Edit | Paste Special: Added "Paste Image Into New [EXT] File" [Ctrl+Shift+Alt+V]. Creates a new image file filled with the image (if any) currently on the clipboard. Call it bloat, but me loves this feature and missed it ever since! If you are a visual artist or web hunter it will save you hours of tedious maneuvers. The standard image format is PNG. But you can change this to JPG, GIF, BMP or TIF using a new INI Tweak:
    Allowed values are: png (default), jpg, gif, bmp, and tif.
    In the case of JPG you can control the quality by appending a number from 1 (worst) to 100 (best) inclusively, for example:
    The default value is 85.
    Note that the GIF quality is very bad (dithered) and practially unusable. The other formats, however, are of high quality. This feature requires GDI+.
  • * Menu Edit | Paste Special: Renamed "Paste Clipboard Into New Textfile" to "Paste Text Into New File".
  • * Statusbar: Now the click duration (time between MouseDown and MouseUp) must be smaller 500 msec to trigger an info pane toggle. This allows you to activate the window by clicking on the statusbar without toggling the info panel.

Monday, March 3, 2008

v6.80.0093 - 2008-03-03 10:53

  • + Toolbar learned to have special images for the pressed state. First applied to the "Step Through Scripts" button: Now, when pressed it turns red.
  • + Scripting command enhanced:
      - msg
        Now you can show OK/Cancel buttons and clicking Cancel
        (pressing ESC) will immediately terminate the script.
        Syntax: msg text, [buttons: 0 = OK | 1 = OK/Cancel]
          ::msg "Continue script?", 1; msg "Won't show if
            you cancelled."
  • ! Tree and List: The control would lose its Ux Theme Borders when you dragged an item from it towards another application, under certain circumstances. Fixed.
  • ! Keyboard Shortcuts: commands File / To Clipboard / Item Base(s) and File / To Clipboard / Item Short Path/Name(s) were not found. Fixed.

Sunday, March 2, 2008

v6.80.0091 - 2008-03-02 12:12

  • +++ Menu Edit Paste Special: Added "Paste Clipboard Into New Textfile" [Ctrl+Alt+V]. Creates a new textfile filled with the current clipboard contents.
    The pasted text depends on the actual data format on the clipboard; it is identical to what variable <clipboard> would return:
      Clipboard contents   Text
      ------------------   ----
      Text                 The text
      File items           One item per line, CRLF ends a line
      Else (e.g. empty, or images) Nothing
    The new file is called something like "Clipboard- 20080302.txt".
    The "-20080302" part is the date now (format defined in
    Configuration | Report | Date suffix). The file is appended to the
    current file list (aka "lazy sort"), and after creation of the file, rename-mode is invoked. As you see, all this is just like the Drop-Text-To-File feature that creates files named "DroppedText...".
  • % Slightly higher speed in browsing and searching. Even after years of optimizing you can still find something that can be improved a bit.
  • * Menu View | Show Items | WOW64 Redirection (64-bit only): Now it's remembered between sessions.