Thursday, October 30, 2008

v7.70.0017 - 2008-10-30 13:09

  • * Menu Go | History: The submenu has been completely removed and replaced by a popup list. Reason: With a history of up to 256 entries a submenu is not the interface of choice anymore.
  • * List Management | History:
    - The "Editor Mode" had to be disabled because it cannot handle
      the additional data structures that are needed for HPT.
    - With HPT on, items pertaining to the current tab are displayed
      in bold.
    - Change order of display to latest-item-on-top, with reverse line
      numbering. The line numbers match the numbers you see in history
      popup menus.

Wednesday, October 29, 2008

v7.70.0016 - 2008-10-29 15:56

  • * History per Tab: Changes...
    - Now, history (per tab or global) popup menus will never contain
      more than 32 items at once.
    - When HPT is active, Back and Forward do NOT cycle anymore
      through the current tab's history, but show the old school
      behavior of halting when there is no more.
    - History now can hold up to 256 items. Before it was 64.
    - Toolbar back/forward buttons are now blue if HPT is on.
  • * Hotlist: Since the history got much larger, the Hotlist now is confined to the 32 latest/youngest history entries of global history.
  • * Moved an item to a better place:
    OLD: Menu View | Current Tab | Tab List...
    NEW: Menu Go | Tablist...
  • + Menu View | Current Tab: moved these commands
      Move Tab Left (Ctrl+Shift+Left)
      Move Tab Right (Ctrl+Shift+Right)
    to the "Miscellaneous" category of CKS, into the new section "Tab Functions".
    Reason: You would most likely access the functionality either by KS, or by dragging the tabs with the mouse. The space in this menu can be used better.
    For internal reasons I decided to give them a new Function ID, which is normally a forbidden thing to do. In this case, however, it could be justified because a bug was fixed by it: Their old default KS (Ctrl+Shift+Left)/(Ctrl+Shift+Right) had been non-customizable KS, so you could not remove them, nor could you
    actually use the keys for what they were meant originally (and whence they are non-customizable): group-select in 2-dimensional list views (Thumbs, List, Small Icons...).
    The commands' original IDs are now used by the functions that replaced them in their original menu position. See next...
  • + Menu View | Current Tab: Added commands
      Tab History...
      Tab Hotlist...
    Will do what you think they do. Even when HPT is off.
  • * Icon Overlays: The recent solution for refreshing icon overlays in non-current tree items lead to severe performance problems in some systems. A new way will be found, later.

Tuesday, October 28, 2008

v7.70.0012 - 2008-10-28 15:00

  • +++ Added History per Tab (HPT). To enable it check "History per tab" in Configuration General. In a nutshell, HPT means that Back and Forward move within each tab's individual history, as opposed to the global history over all tabs.
    If HPT is enabled then:
    - Back and Forward (TB buttons and KS) are confined to each tab's
      individual history.
    - Back and Forward will cycle through the current tab's history
      (contrary to global history, where the move halts at both ends).
      Seemed more natural to me. So, if there's more than one history
      item pertaining to the current tab, then both buttons (Back and
      Forward) are enabled, else none is enabled.
    - The Back and Forward buttons's "arrow dropdowns" will each show
      one whole cycle in the repective back or forward order.
    - In the all-history popup menu (triggered via right-click
      "Back"/"Forward" TB buttons, or via KS) those history items
      belonging to the current tab are shown bold.
    - If "History without duplicates" (Config General) is enabled
      then duplicates on different tabs are tolerated.
    - The per-tab-data are saved between sessions. They are even
      maintained and saved if you untick HPT. So you can enable it at
      any time and get the desired functionality right away.
    * History now can hold up to 64 items. Before it was 32.

Monday, October 27, 2008

v7.70.0010 - 2008-10-27 14:38

  • +++ Scripting: Now there are global variables.
    By default, all variables in XY scripting are local, i.e. they are not shared between called and calling scripts. In other words, whenever one script calls another script (e.g. using commands "sub" or "load"), a new local namespace is created by the called script and pushed on the stack.
    Generally, global variables are shared between scripts. However, the mechanism of "globalization" -- (almost) identical to the one used in PHP -- now added to scripting gives you maximum control over what is shared and where. It's implemented by means of a new command:
    Name: Global
    Action: Define one or more variables as global
    Syntax: global variable(s)
      variable: A single variable, or a comma-separated list of up to
        10 variables. If a variable has already been defined as global
        before, then the global command initializes it to its current
        global value, else it is initialized to an empty string.
      Here are 2 scripts where the first is calling the second:
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        $foo = 4; // set local value: new local var $foo is created
        msg $foo; // 4 (local)
        // now make $foo global
        // it's initialized to [empty] (assuming nothing created
        // a global $foo before with a different value, which is
        // possible when "script1" has been called by yet another
        // script that has declared $foo as global)
        global $foo;
        msg $foo; // [empty] (global)
        $foo = 8; // set global value
        msg $foo; // 8 (global)

        sub script2; // go down

        msg $foo; // 16 (global, as set in script2)
        msg $bar; // $bar (uninitialized, not a variable)
        // make $bar global
        // it's set to "tequila" (as previously set in script2)
        global $bar;
        msg $bar; // tequila

        msg $foo;  // $foo (uninitialized, not a variable)
        $foo = 15; // set local value: new local var $foo is created
        msg $foo;  // 15 (local)
        // now make $foo global
        // it's set to 8 (as previously set in script1)
        // also create a new global $bar
        global $foo, $bar;
        msg $foo;  // 8 (global)
        $foo = 16; // set global value
        $bar = "tequila"; // set global value
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    - You can have as many global vars as you like, but it be no more
      than 10 per "global" statement for internal reasons. IOW, add a
      new "global" line for each pack of 10 variables if you really
      need that many.
    - It's recommended that you reflect the global nature of a variable
      in the variable name, for example by prepending $g_ to global
      vars. It will make your code easier to read and maintain.
  • * Scripting Step Mode: Improved handling of binary data. There were some display glitches with binary file data, and unnecessary slowness. Now you can make a pretty fast copy of the current file, even if the file is not small and with step mode enabled, using e.g. this:
        readfile("<curname>", "b"), ,"b");
  • * Scripting Step Mode: Variables on stack are now displayed with up to 256 chars (rest cropped). Non-printable chars are displayed as ".".

Friday, October 24, 2008

v7.70.0007 - 2008-10-24 17:40

Publication of this update was unfortunately skipped due to very complex editing required and personal medical issues at that time. Doing now for compete documentation purposes. Sorry about the omission!

  • + Implemented the first "On Event Action" (OEA), but for now only as a tweak (still meditating about the interface).
    The event is "right-click on the list's white space", and you can currently choose between the following actions:
      0 = Popup the Edit menu (as has been before all the time)
      1 = Popup the Shell menu for the current folder
      2 = Do nothing
    Conc. option 0: Just to remind you, in Configuration Advanced, you currently have two checkboxes where you can specify which commands are shown in the Edit menu.
  • + Tree and List: Now, the shell context menu will show "extended verbs" when you hold SHIFT while right-clicking an item. What those "extended verbs" are depends on your system and software.
  • * SC writefile(): Now, the filename may be relative to the current path. For example, this line will generate a standard report of the current folder in the current folder:
      ::writefile("report.txt", report());
  • * SC WriteFile(): Changed the mode argument to better match
    ReadFile() (see below).
    Syntax: writefile(filename, data, [on_exist], [mode])
      t:  [default] text;
          auto-detects whether text can be written as ASCII or needs
          to be written as UNICODE
      ta: text ASCII (1 byte per char);
          wide chars (upper Unicode) are represented by "?"
      tu: text UNICODE (2 bytes per char);
          with LE BOM at file beginning
          LE BOM = Little Endian Byte Order Mark: 0xFFFE
      b:  binary: raw bytes
          each byte is internally stored as double-byte character
          with a zero big byte
          corresponds to mode "b" in ReadFile()
  • + Scripting got a new function.
      Name:     ReadFile
      Action:   Read data from file into string.
      Syntax:   readfile(filename, [mode])
      filename: file full path/name, or relative to current path mode:
        t: [default] text
           whether file is ASCII or UNICODE is auto-detected
        b: binary: raw bytes
           each byte is internally stored as double-byte character
           with a zero big byte
           corresponds to mode "b" in WriteFile()
        ::$a = readfile("test-in.txt");
          writefile("test-out.txt", $a);
          = Reads text from "test-in.txt" (ASCII or UNICODE) and writes
            it back to "test-out.txt" (ASCII or UNICODE).
        ::$a = readfile("test-in.txt");
          writefile("test-out-A.txt", $a, , "ta");
          = Reads text from "test-in.txt" (ASCII or UNICODE) and writes
            it back to "test-out-A.txt" in ASCII (1 byte per char).
        ::$a = readfile("test-in.txt");
          writefile("test-out-U.txt", $a, , "tu");
          = Reads text from "test-in.txt" (ASCII or UNICODE) and writes
            it back to "test-out-U.txt" in UNICODE (2 bytes per char).
    You can actually use ReadFile() and WriteFile() for file copying
    on a low level (bypassing the Shell):
      ::writefile("test-out.txt", readfile("test-in.txt"));
        = Copy "test-in.txt" to "test-out.txt" (text file).
      ::writefile("xy-out.png", readfile("xy.png", "b"), , "b");
        = Copy "xy.png" to "xy-out.png" (any file, binary or text).
  • * SC report(): Changed handling of line feeds.
    - Now, if the template is omitted, each line is terminated with
      a line feed (0x0D0A). Before, the last line was excluded from
    - Now, if you use a template, *you* are responsible for adding any
      line feed at the end of each line if you want to have one.
      Before, this was done automatically for all non-last lines.
      To add the standard Windows line feed (0x0D0A) you can use
      the internal variable <crlf>, or alternatively the functions
      chr(13) and/or chr(10).
  • ! It could happen (under quite rare circumstances) that Auto-Refresh was magically suspended. Fixed.
  • + Rename Special | Batch Rename: Since long, the self-referential wildcard (*) is replaced by the original file base (file title excluding extension). Now, there's a 2nd self-referential wildcard (?) that stands for the original file extension.
       Old    Pattern             New
      a.jpg ?                    jpg.jpg
      a.jpg *.?.bak /e           a.jpg.bak
      a.jpg ?-<#001>             jpg-001.jpg
      a.jpg *.?.<date yymmdd>    a.jpg.081023.jpg
      a.jpg *.?.<date yymmdd> /e a.jpg.081023
  • * Dialogs User | Manage Commands and Edit Copy/Move/Backup To... are now centered in screen. Before they were centered in the main window.

Tuesday, October 21, 2008

v7.70.0004 - 2008-10-21 14:41

  • + Scripting got a new function.
      Name:   WriteFile
      Action: Write data to file.
      Syntax: writefile(filename, data, [on_exist], [mode])
        filename: file full path/name;
                  will be created if does not exist yet
        data:     string data to write
          o: [default] create new file/if existing: overwrite
          a: create new file/if existing: append
          n: create new file/if existing: do nothing
          t: [default] text ASCII (1 byte per char);
             wide chars (upper Unicode) are represented by "?"
          u: utf16: 2 bytes per char; with LE BOM at file beginning
             LE BOM = Little Endian Byte Order Mark: 0xFFFE
          b: binary: raw bytes (also 2 bytes per char, but no BOM)
        return: 1 on success, 0 on failure
        ::$a = writefile("C:\Temp\test_A.txt", "text");
          Creates a 4 byte file.
        ::$a = writefile("C:\Temp\test_A2.txt", "text ".chr(20000));
          Creates a 6 byte file.
        ::$a = writefile("C:\Temp\test-U.txt", "text ".chr(20000), ,"u");
          Creates a 14 byte file (2 bytes BOM + 2 * 6).

    Note: WriteFile() is implemented as a function (instead of a statement) because the return value will be useful once If/Then blocks are implemented. You may, however, call functions without using a dummy variable. See here below.
  • + Scripting: Now you may call functions without caring for the return. For example,
      ::writefile("C:\Temp\test_A.txt", "text");
    instead of
      ::$success = writefile("C:\Temp\test_A.txt", "text");
    Internally, the dummy statement "call" is prepended:
      ::call writefile("C:\Temp\test_A.txt", "text");
    In step mode you will see the return of writefile() as argument of
  • + Scripting: Comparisons now support the Like (LikeI) operator.
    General form:
      String Like Pattern (case-sensitive)
      String LikeI Pattern (case-insensitive)
    Where string is any string expression and Pattern may contain the usual wildcards and special chars used in XY patterns (*?#[]).
      ::echo "abc" Like "a*"; //1
      ::echo "Abc" Like "a*"; //0!
      ::echo "Abc" LikeI "a*"; //1!
      ::echo "It's " . (<date> Like "20??"?:"not ") .
        "the 21st century";

    Note that capitalization matters: "LIKE" or "Likei" won't work.
  • * File List: From now on, "Rename On Slow Double-Click" (menu View List Style) will only happen when no other than the clicked item is selected. This is a wonderful and relaxing detour from the Windows Explorer standard where clicking on any out of a bunch of selected files will enter rename mode -- did you really ever want this to happen??

Monday, October 20, 2008

v7.70.0003 - 2008-10-20 10:09

  • +++ File Find Contents: Now pattern matching is supported! This means you may enter wildcards * and ? in your content definition.
    - Since larger files are read chunkwise (performance!) there are
      certain limits to the scope of your pattern:
      A pattern "a*b" is guaranteed to be found if "a" and "b" are
      within a range of 1,024 bytes! It also *might* be found if "a"
      and "b" are within a range of 1,001 to 32,768 bytes! It will
      certainly not be found if "a" and "b" are only within an even
      larger range.
    - Just like with non-wildcard searches it is assumed that you look
      for a match anywhere within the file, so asterisks (*) are
      silently added to your pattern at both ends in case they are
      missing. This is just to spare you typing too many asterisks. So
      you may simply enter "D?g" to look for "D?g" anywhere in the file
      (match file contents with "*D?g*").
  • + Now you can define the default start location for a new tab. It's currently done as a tweak, but I'm ready to raise it to the GUI level if demand is there. For example:
    Leave empty to use the location of the current tab.
  • ! SC Report(): Returned rubbish if Line Numbers column was invisible. Fixed.

Friday, October 17, 2008

v7.70.0001 - 2008-10-17 12:28

  • * Icon Overlays: Now they are only retrieved for local locations, not for network locations. Reason: Retrieving icons slows down network browsing even if there are no overlays to be found, and the latter is quite likely the case. If you do need Icon Overlays on network locations you can use the following new tweak:
  • ! Menu File: The various "Copy Here with Suffix [...]" commands did treat folders with dots in the name as having extensions and inserted the suffix before the dot. Fixed.
  • ! XY variables and did not work as expected. Fixed.

Wednesday, October 15, 2008

v7.70.0000 - 2008-10-15 10:24

Main changes since last release:

  • +++ New Address Bar Deluxe with icons and optimized usability.
  • +++ Color Filters 2.0: Now you can define the *backcolor* of items.
  • +++ Unicode support is now complete for all parts of the application.
  • +++ Speed: Browsing folders and finding files got faster again.
  • +++ Scripting: Now with math, logic, and functions.

Sunday, October 12, 2008

v7.60.0052 - 2008-10-12 18:08

  • ! File List: Since v7.60.0025 - 2008-09-22 22:00 any current item (= item shown on Info Panel) lost its status of being current after a list refresh (F5, or by Auto-Refresh) under certain conditions. Fixed.
  • ! Rename Special | Set Extension: Prompted for a new extension when user passed an empty extension via UDC or scripting. Fixed: Now it just removes any current extension.
  • ! Rename Special | Set Extension: When an empty extension was applied to a file without any extension, the whole filename was attempted to be removed. Fixed: Now files without any extension remain untouched when you attempt to remove any extension.
  • ! Address Bar: With droplist visible the Browsing Tabs could steal away the mouse input capture with the unwanted effect that you could "click through" the list to the tabs below it. Fixed.

Saturday, October 11, 2008

v7.60.0051 - 2008-10-11 19:03

  • * SC confirm(): Now the optional linebreaker is set to "<br>" by default.
      Syntax: confirm(text, [linebreaker="<br>"])
  • ! Calling XY from Run using the line "XYplorer /ini=%tmp%\" did work alright, but the App Data Folder was not reachable because Windows (at least XP) Run converts %tmp% into an DOS 8.3 formatted path (!) which was not expected at that point by XYplorer. Fixed. Now the passed app data path is internally converted to the long file name format before processing it further.
  • ! Rename Special RegExp Rename: It was possible to create new filenames that appeared to have trailing spaces (the list showed them as such), using a pattern like "\.html$ > " (without the quotes). Fixed.
  • * Rename Special Set Extensions: Now you can remove an extension by leaving the input box empty.
  • * Rename Special: Renamed command "Aaa" (sets the file base to title case, converting any letters within the words to lower case) to "Aaa Aa.*" because the extension is actually left untouched.
  • + Rename Special: Added command "A* A*.*". It sets the file base to title case, but leaves any upper case letters within the words untouched. The extension is completely left untouched.
      XYplorer_work.ini ->
                 A* A*.*: XYplorer_Work.ini
                Aaa Aa.*: Xyplorer_Work.ini
              aaa xyplorer_work.ini
                   *.aaa: XYplorer_Work.ini
                   *.AAA: XYplorer_Work.INI

Friday, October 10, 2008

v7.60.0050 - 2008-10-10 11:48

  • * List Management: When dragging an item to a new position, pressing ESC will now abort the dragging operation but leave the dialog open. Before, it closed the dialog.
  • ! Configuration | Interface Colors | Beveled border: Catalog showed doubled border if checked. Fixed.
  • * File List, Win2K only: Worked around a Win2K bug where the Type of unregistered extensions was set to an empty string instead of "EXT File".

Thursday, October 9, 2008

v7.60.0049 - 2008-10-09 10:43

  • ! With "Resort list immediately after rename" active, the list should NOT be immediately resorted when the rename was done either using TAB (serial rename) or by clicking outside the rename box or other ways to steal the focus from the rename box (where an immediate resort would be perceived as confusing or disturbing). This worked so far, but the list was actually resorted when the
    name of the file to be renamed was not changed. So there was an unwanted exception from the exception. Fixed.
  • ! Problems when exiting app using quick script (e.g. #191; or #192;) in Address Bar. Fixed.
  • ! Rename Preview: Drawing glitch on last line. Fixed.
  • ! Tree: Possible delays in painting when scolling by wheel. Fixed.

Wednesday, October 8, 2008

v7.60.0047 - 2008-10-08 11:47

  • ! Edit controls: Due to a bug in Triple Click you could not remove the selection by a single click under certain conditions. Fixed.
  • * DropDowns: Now the selection in the dropdown list shows the standard coloring.
  • + Address Bar: Forgot to mention that click on icon selects all.

Tuesday, October 7, 2008

v7.60.0046 - 2008-10-07 12:55

  • + Edit controls: Now all Edit controls, including those of DropDown lists and multi-line boxes, support select-all-on-triple-click. The interval between the consecutive clicks must be <= DblClickTime. The SC "info" displays the current DblClickTime.
  • * DropDown/Address Bar: Droplist quits supporting the keys Home and End. They are now applied to the Edit box. It's better.
  • ! DropDowns: Match list was not positioned correctly when dropped upwards and list height changed. Fixed.
  • ! Address Bar: Horizontally mis-scrolled contents. Fixed.
  • ! Rename Special dialog: Ctrl+Enter to go to preview anymore. Fixed.
  • ! File List: When empty and in Details view, right-clicking the column headers would pop the white space context menu instead of the column headers context menu. Fixed.
  • + The FixFocusLoss tweak is back. Reason: It has a side-effect (XYplorer appears two times in the Application tab of Windows Task Manager) that's completely harmless but might disturb an innocent user.
    Set FixFocusLoss to 1 to fix the focus loss of modal popups on taskbar activation (but live with the above mentioned side-effect).
  • * The last UserControl has been removed. The long work of removing those creatures from the code is finally completed!

Saturday, October 4, 2008

v7.60.0041 - 2008-10-04 10:07

  • * Tree and List: Rename boxes now recognize the following chars as word breaker (dbl-click selection, moving cursor with CTRL):
    .:,; _-~(){}[]<>/\^°*?!§$%&=+#"'
    Note that illegal filename chars are contained. This is because the routine will later be probably applied to other rename boxes as well which may contain such chars.
  • ! List: You could fool the list control into drawing header buttons in non-Details views. Fixed.
  • ! Scripting: "+" and "-" were misinterpreted as numeric strings, so
      msg ("+" == "-");
    returned 1 (true, because +0 == -0) instead of 0 (false). Fixed.

Thursday, October 2, 2008

v7.60.0040 - 2008-10-02 11:18

  • % Address Bar: retrieving list icons should work faster now, so the list should drop down faster.
  • * Address Bar: Changed the shoot conditions.
      - If droplist is visible:
        Enter:              Undrop the list, and shoot.
        Ctrl+Enter:         Just undrop the list.
        Click on list:      Set the edit box to clicked item, undrop
                            the list, and shoot.
        Ctrl+Click on list: Set the edit box to clicked item, and undrop
                            the list.
        Click on edit box:  Just undrop the list.
        Esc:                Undrop the list, reset edit box to last
                            shot item.
      - If droplist is not visible
        Arrow Down or Up:   Open MRU list
        Ctrl+Down or Up:    Open Match List (= the parts of the MRU list
            that match the current item in edit box, sorted ascending).
            If the edit box is empty the whole MRU list is shown as
            Match List, i.e. sorted alphabetically.
        Esc:                Reset edit box to last shot item.
  • ! Address Bar: Automatic word breaking (dbl-click selection, moving cursor with CTRL) did not work okay when "Auto-complete path/file names" was on. Fixed.
  • + Tree and List: Rename boxes now recognize "." as word breaker (dbl-click selection, moving cursor with CTRL).

Wednesday, October 1, 2008

v7.60.0039 - 2008-10-01 17:57

  • ! Address Bar: Fixed a couple of glitches.

v7.60.0038 - 2008-10-01 15:20

  • *** Address Bar: Finally, the new DropDown is implemented. The main
    improvements over the old Address Bar:
    - Full Unicode support.
    - Icons in Edit Box and List.
    - Supports TABbing through the items.
    - F4, Up, Down: all open the list; F4 closes again;
      next Up or Down select list items; selection wraps around ends.
    - Shows icons for edit box and list items (where applicable).
    - Edit box ignores mouse wheel (that's good!).
    - Is not a so-called UserControl (that's very good!) and not made
      of MS parts but fully hand-made, and hence incredibly powerful
      and enhanceable, extremely fast and low in memory consumption.
    - The droplist has a minimal width of 400 (can be made
      configurable later).
    - The droplist is higher: 12 instead of 8 items.
    - If the list is dropped then the first <enter> will close the
      list, the next <enter> will go to the location. Allows you to
      further edit the item by keyboard before shooting.
  • * Address Bar: The font is now the "general" font, and not the one shared by Tree, List, and Catalog. Hence the AB will not respond to changing the font via Ctrl+Wheel anymore. Reason: I did not like it anymore (did not look good with icons).
  • * Address Bar: Text not auto-selected anymore after , nor after mousedown-selecting it from the droplist, nor after focussing the edit box by mousedown. Reason: I did not like it anymore. Most of the times I would want to edit the text instead of fully replace it.
  • ! Some lists did not wheel since v7.60.0013 (2008-09-17). Fixed.