CapeSoft.Com
Clarion Accessories
AnyFont
Documentation
CapeSoft Logo

CapeSoft AnyFont
Documentation

Download Latest Version JumpStart FAQ History
Installed Version Latest Version

Introduction

CapeSoft AnyFont extension allows you to change different properties of your application font at run-time. Settings can be saved using an .INI file or the registry.  The great thing about AnyFont is that it resizes the window to accommodate the different font sizes, as well as moving the window controls proportionally.  If you don't want AnyFont to be quite so clever, you can disable certain features so that you can use other moving and sizing programs. You can even control the behavior of individual window controls. Using AnyFont you can change the application's font name, size, color, style and character set.  AnyFont supports Clarion 8 and later and both the ABC and Legacy (Clarion) template chains.

Installation

Run the supplied installation file:

JumpStart

This jumpstart shows you how to add font resizing to your application. You won't even have to type a single line of code.

Adding AnyFont to your Application.


To add the AnyFont template to your program, do the following: This will add the global extension to you application. It will also add local extensions to each of your windows.

NOTE: For Multi-DLL applications, you will need to do this in each DLL (and EXE) that has windows. See the Global Multi-DLL Tab on the Global Extension template for settings pertaining to Multi-DLL applications.

Changing your Application's Default Font
This can be done in the Global Default Font tab. (For Multi-DLL apps, this is done in the EXE)

Adding the Embedded Code to Change the Font.

This is normally done via a menu command using the FontDialog procedure. To make your life easier, embedded code has already been written for you.
  1. Create a "Change Font..." menu item in your application's menu editor.
  2. Go to the Embeds section in the Actions tab.
  3. Expand the whole tree and double-click on the "Accepted | Generated Code" item.
  4. Select "AnyFontDialog - Call FontDialog to set Font parameters". The name of the Change Font window is editable, but the default has already been added for you.
Your application is now ready for use!

Examples

There are 4 examples that ship with Anyfont. They include

ABC
Legacy
Multi-DLL ABC
Multi-DLL Legacy
 

Why Windows sometimes flicker a lot when they open, after applying AnyFont

Before discussing possible solutions, it's helpful to understand the problem.

It all starts with the Window structure - which is how we "describe" a window in Clarion. The window structure is OPENed (using the cunningly named OPEN command), then there is an ACCEPT command which acts as the event loop. Once the loop ends the window is closed. In code this looks something like this;

OPEN(window)
ACCEPT
END
CLOSE(window)

One thing to understand is that the OPEN does not DISPLAY the window. The window only becomes visible when the ACCEPT command is reached. This means that code (like AnyFont) can manipulate the window between it
being OPENed and being visible. Something like this;

OPEN(window)
! AnyFont manipulations here
ACCEPT

If you wish to DISPLAY the window before the ACCEPT command then the DISPLAY command is used.

OPEN(window)
! Some Code
DISPLAY
! Some other code
ACCEPT

The flickering effect occurs when there is a call to DISPLAY before AnyFont has manipulated the window. In other words;

OPEN(window)
! Some Code
DISPLAY
! AnyFont manipulations here
ACCEPT

The key to fixing the flicker is to isolate and (ideally) remove the offending DISPLAY command.

The following bug was fixed in Clarion 11, and the line removed. If you are using Clarion 11 or later you no longer need to do this.

First things first - there is a known errant  DISPLAY command in the ABC library (Clarion 10 and earlier) which you should fix. To do this;
  1.  Open your ABTOOLBA.clw file in a text editor.
  2.  Search for ToolbarUpdateClass.DisplayButtons PROCEDURE
  3.  Go to the last line of the procedure:

    DISPLAY(Toolbar:First,Toolbar:Last)

    and comment it out (probably line 240 of ABTOOLBA.clw):

    !DISPLAY(Toolbar:First,Toolbar:Last)

  4. Save and exit.
The following applies to all versions of Clarion, and relates to your program, not Clarion itself.

Secondly (if the flicker persists) examine your own code to see if there is a DISPLAY command between the Self.Open and the AnyFont initialization.

In ABC the key is the INIT method. This is the method where the Window is opened, and where the AnyFont code exists. Something in this method is causing the window to display. To find it is recommended to use the STOP command as a debugging tool.

So what you want to do is right-click on the procedure in question and choose SOURCE. Use search to find the ThisWindow.INIT method. Scroll down to the self.OPEN command put a STOP immediately after that - for example

STOP('a')

then at further embed points in the method

STOP('b')
and
STOP('c')

and so on. Then run the program. Go to the procedure. The STOPs will appear, but after one of them the window will appear. So, for example you might see the 'a' and then the 'b' and then the window appears, and the 'c' STOP also appears. So you know that between the Stop('b') and the Stop('c') that DISPLAY is being called.

You may be able to isolate that part further (more stops, repeat test) or you may not. If you have hand-code in the errant section (a common case) then you can obviously inspect the hand code to determine which line is causing the
Display. Be especially aware that do SomeThing lines call routines, and these in turn may trigger a DISPLAY.

Programmer's Guide

Writing Code for AnyFont
Normally, the only code you will have to add is the FontDialog embed point. This is called "AnyFontDialog - Call FontDialog to set Font parameters". The Jump Start guide shows how to add this embed point.

If you want to be more adventurous and not use the font dialog, the AnyFont global variables are just what you need. To change the font parameters, follow these steps. Setting the font manually, along with window-resizing templates
If you set the font using the AnyFont dialog box, no extra code needs to be written. However, if you change the font size manually you will have to insert some code if you are using a window-resizing template.

NOTE: In all the following examples, the parameters shown by (...) must be supplied as specified in this document.

FAQ

Compile Errors? Check out general product CompilerErrors.

  1. Why don't all my open windows' fonts update immediately?
  2. When I change the font properties, why does moving and resizing of the controls not work properly?
  3. When I increase the font size so that the window is too large for the screen, some controls disappear when I decrease the font size. How do I fix this?
  4. AnyFont doesn't remember my window's position correctly.
  5. The controls on my MDI child window don't resize.
  6. How do I disable AnyFont dynamically?
  7. My windows flicker a lot when I open/resize them.
  8. How do I restrict my users to select a certain range of font settings?
  9. My decimal fields are not correctly justified when using a larger font.
  10. I lost my settings after upgrading AnyFont.
  11. I need to refresh the Font manually. How do I do this?


  1. Why don't all my open windows' fonts update immediately?

    Answer: All windows, except the window in which the font was changed, will display their new font only when they are newly opened. To update all the windows' fonts, close the application and re-open it.


  2. When I change the font properties, why does moving and resizing of the controls not work properly?

    Answer: You're probably using a move-and-resize template that isn't supported yet. At the moment the resizers that AnyFont supports are the standard WindowResize template and CapeSoft's ResizeAndSplit. However, support for more resizers is on the way. In the meantime, there are a few ways to fix this...

    • Override the way these templates handle moving and sizing, or
    • Disable AnyFont's moving and sizing using the local window template and handle these functions either manually or using one of the 3rd-party templates, or
    • Change to a supported resizer template.

  3. When I increase the font size so that the window is too large for the screen, some controls disappear when I decrease the font size. How do I fix this?

    Answer: When the window becomes too large for the screen, the size of the window (in Clarion units) decreases even though the actual size, in pixels, increases. Here are two ways to fix this.

    1. Put in a valid value for the window's minimum size. This will stop the window shrinking.
    2. Add one of the supported resizer templates to your window (see FAQ number 3). This won't stop the window shrinking but the window controls will adjust their size and positions accordingly.

  4. AnyFont doesn't remember my window's position correctly.

    Answer: This may be caused by other code that executes after AnyFont.SetWindow has been called, such as the INI manager or a resizer template. To find out if AnyFont is the culprit, insert the following lines after the call to SetWindow:

    display()
    stop(
    'SetWindow called')

    If the window displays in the wrong place, then AnyFont is indeed causing the problem. Please call support if this the case.


  5. The controls on my MDI child window don't resize.

    Answer: This is probably caused by setting the font directly in the child window. The correct way of setting the font in an MDI application is to do it in the MDI menu.


  6. How do I disable AnyFont dynamically?

    Answer: To disable AnyFont globally, set the global variable AnyFont:Disable to true. To disable AnyFont in a single window, set the ThisAnyFont.AFdisable variable to true, or call ThisAnyFont.Disable().


  7. My windows flicker a lot when I open/resize them.

    See the section on flickering.

  8. How do I restrict my users to select a certain range of font settings?

    Answer: You can quite easily reject the settings if the font settings fall outside the parameters that you require.

    You'll need to handcode before the template generated code (in the Validate User Font Selection embed):

    if ValidateFontSettings() = false  !This is a function you create to return whether the font settings are valid or not
      message('Warn user he has selected the incorrect font settings')
      cycle
    end
    ThisAnyFont.SetWindow(AnyFont:FontName,AnyFont:FontSize,AnyFont:FontColor,AnyFont:FontStyle,AnyFont:FontCharset,0) !Template generated code
  9. My decimal fields are not correctly justified when using a larger font.

    Answer: You will need to Right-justify decimal settings as the RTL does not position a font adjustment decimal justification after the control is created.


  10. I lost my settings after upgrading AnyFont.

    Answer: Vista (operating under UAC) does not allow programs to write to the Local Machine section of the registry settings. In version 1.51, AnyFont now supports storing the AnyFont settings in the Current User section of the registry by default. you can revert back to using the Local Machine section of the registry (a setting in the Global Save & Load Tab), which will maintain your current settings, but will make your program Vista unfriendly.
  11. I need to refresh the Font manually. How do I do this?

    Answer:
    You need to set the global AnyFont variables, and the call the SetWindow and the Refresh methods:

    First set the AnyFont:Fontname, etc variables to what they should be then call:

    ThisAnyFont.SetWindow(AnyFont:Fontname,Anyfont:Fontsize,
    Anyfont:Fontcolor, Anyfont:FontStyle, Anyfont:FontCharset, true)
    ThisAnyFont.Refresh()

Support

Your questions, comments and suggestions are welcome.  You can contact us in one of the following ways:

CapeSoft Support
Support Page Find support page with various options here
Email support@capesoft.com
Telephone +27 87 828 0123

Upgrading From AnyFont 1.72 or Earlier

Note: This section is obsolete. This change has been reverted in build 1.76.

Build 1.73 introduced a change in the way AnyFont settings were loaded and saved. This will (only) affect Multi-DLL (ie Multi-app) ABC systems.

In build 1.72 and earlier the load and save settings were only set in the Exe, and the settings were only loaded once a procedure in the exe had executed. This can be a problem if procedures are called before any procedures in the Exe app, or if there are no procedures in the Exe app. To solve this problem the settings are now used in the Program Setup embed (which in an ABC Multi-DLL app means that this needs to happen in the Data DLL.)

The default place to store the Anyfont settings is in the Program INI file. However in many systems this is set as a different name for each app. In this situation it is recommended you specify the INI File Name so that the Load and Save can happen in different apps.

Clarion Legacy based programs (single apps, or multi-dll)  are unaffected by this change. In legacy apps the startup code in the Exe runs first, so the Font settings are set in the Exe app and are applied there, although the loading has moved to the program setup embed point, and not the Frame procedure.

Clarion ABC programs, with just a single Exe app are also unaffected by this change. The settings in the Exe app are used, although the loading has moved to the program setup embed point, and not the Frame procedure.

Distribution

No additional files are required for shipping.

The Global AnyFont Extension

See the Jump Start for information on how to add the Global Extension. The global extension allows you to set the default font for your application, as well as allowing you to save your font settings in a .INI file.

General Tab
Default Font Tab
Multi-DLL Tab
Save & Load Tab

General Tab

Disable All AnyFont Features
This disables the AnyFont template, and no AnyFont code will be generated into the application. This is useful for debugging.
Disable on Reports
This disables the AnyFont template on Report procedures, and prevents AnyFont from changing the font on reports.

Default Font Tab

Font Parameters
These parameters override the application font settings. All the fields can accept either literal values or program variables. To enter a variable, check the 'Var' button next to the relevant field.
Support ClearType
If you're using ClearType fonts, checking this option will change the font of all your Entries, Spin Buttons and Combos into MS Sans Serif. You only need to do this in Clarion 6, Clarion 7 and up support ClearType natively.
IF (expr)
Allows a conditional expression to determine if ClearType support (in Clarion 6) is needed or not.
Font Name
The application font name. This can be any supported windows font. If the default application font is the same as the window font, leave the field empty.
NOTE: The font name can be entered with or without quote marks.
Font Size
The application font size in points. See the note at the end of this section. For default size, set the value to -1.
Font Color
Choose a color from the color box or enter the value manually. You can use either a color definition (e.g. color:black) or an RGB value. For default colour, set the value to -1 (color:none).
Font Style
Choose a font style from the drop-down list. The default is 'None', which equates to -1.
Font Charset
Choose a font character set from the drop-down list. The default is 'None', which equates to -1.
Change Font...
This is an alternative method to set the font parameters.

Multi-DLL Tab

This is part of a Multi-DLL program
If this app is part of a suite of apps, where you are making your own DLL's, then tick this option on in all the apps, including the DLL apps and the EXE apps in the suite.
Export AnyFont Class from this DLL
Check this box if this app is the root DLL of the app suite.

Save & Load Tab

Save Settings
Check this box if you want to save the font settings.
Which Storage Method?
Choose to save the settings in either an INI file or the system registry.
Save in Program's INI
Check this box if you want to store the settings in the program's INI file. For Multi-DLL, ABC apps this setting is not recommended. In a Multi-DLL, ABC, system it is better to specify the INI name below.
INI File Name
If you want to store the settings in another INI file, enter its name here.
INI Section
Enter the section name to contain the AnyFont settings in your INI file.

Local AnyFont Extension

This allows you to control how AnyFont will behave for each window in your application.

General Tab
Options Tab
Classes Tab

General Tab

Disable AnyFont in this Procedure
Disables all AnyFont code in this procedure. This is useful for debugging.
Disable Moving and Sizing of Controls
Stops AnyFont from changing the position and size of the window controls. This is useful when you want other code to do the moving and sizing instead.
Override Individual Control Behavior
You can set individual controls so that AnyFont doesn't resize it or change its font.

Options Tab

Preserve Menubar
If this is on then AnyFont changes will not be applied to the Menubar in this procedure.
Preserve Toolbar
If this is on then the AnyFont changes will not be applied to the Toolbar in this procedure.
Maximum Style Number
AnyFont is applied to the List-Box Styles which are used in the window. By default AnyFont will detect the number of styles defined in your ListBox Styles options of the window, and will only apply to those styles. If you are adding styles by hand then you may want to override that detection with your own maximum style number.

Classes Tab

Object Name
The name of the AnyFont instance used in the window. ThisAnyFont is used by default.
Class Name
You can specify your own class to use. AnyFont is used by default.

Relationship with other 3rdParty products

PowerToolbar

Most of the time your PowerToolbar will reside on the frame of your application together with your AnyFont code templates. The best solution is to partially disable AnyFont locally on the Frame. You do this by going to the AnyFont Local Extension prompts on the frame and checking the Disable AnyFont in this Procedure checkbox. You can leave the Disable Change Font dialog code and/or the Disable AnyFont Disable code checkboxes unchecked here to still use this functionality for your application.

Class Methods

SetWindow
SetControlFont
SetControlTypeFont
Disable
Enable
Refresh

SetWindow

SetWindow (<string p_FontName>, long p_FontSize= -1, long p_Fontcolor= -1, long p_FontStyle= -1, long p_FontCharset= -1, byte p_NoMoveSize=0)

Description

Sets the font of the current window.

Parameters

Parameter Description
p_FontName Name of the new font required. This can either be a variable name or a literal font name, e.g. 'Arial'.
p_FontSize Size of the new font.
p_Fontcolor The new font's colour.
p_FontStyle The style of the new font (bold, italic, etc.)
p_FontCharset The character set of the new font. The character set values are listed in the global template in the Default Font tab.
p_NoMoveSize Set to 1 if the window controls are not to be moved or sized.


Return Value

none

Example

If the font is to be set for the entire application, do this (AnyFont does this automatically). Moving and sizing is enabled in this example.
Example
Anyfont:Fontname = 'Tahoma' 
Anyfont:Fontsize = 8
Anyfont:Fontcolor =
color:red
Anyfont:Fontstyle =
style:bold
Anyfont:FontCharset =
charset:ansi
thisAnyFont.SetWindow (Anyfont:Fontname, Anyfont:Fontsize, Anyfont:Fontcolor
, |
                       Anyfont:Fontstyle, Anyfont:FontCharset
, false)

The font can be set for only one window, in which case don't use the global variables in the font setting. Here is an example, with moving and sizing disabled:
Example
thisAnyFont.SetWindow(' Tahoma',8, color:red, style:bold, charset:ansi, true)

SetControlFont

SetControlFont (long p_Ctrl, <string p_FontName>, long p_FontSize= -1, long p_Fontcolor= -1, long p_FontStyle= -1, long p_FontCharset= -1)

Description

Sets the font of the selected window control. If this control is the window, then resizing also takes place.

Parameters

Parameter Description
p_Ctrl Handle of the control whose font is to be changed.
p_FontName Name of the new font required. This can either be a variable name or a literal font name, e.g. 'Arial'.
p_FontSize Size of the new font.
p_Fontcolor The new font's colour.
p_FontStyle The style of the new font (bold, italic, etc.)
p_FontCharset The character set of the new font. The character set values are listed in the global template in the Default Font tab.
Return value

none

Example
Example
thisAnyFont.SetControlFont (?Listbox, 'Tahoma',8, color:red, style:bold, |
                               
charset:ansi)

SetControlTypeFont

SetControlTypeFont (long p_CtrlType, <string p_FontName>, long p_FontSize= -1, long p_Fontcolor= -1, long p_FontStyle= -1, long p_FontCharset= -1)

Description

Sets the font of all the window controls of the specified type. For example, use this method if you want to change all your entry fields' fonts.

Parameters

Parameter Description
p_CtrlType Type of control whose font is to be changed. A list of all control types can be found in EQUATES.CLW.
p_FontName Name of the new font required. This can either be a variable name or a literal font name, e.g. 'Arial'.
p_FontSize Size of the new font.
p_Fontcolor The new font's colour.
p_FontStyle The style of the new font (bold, italic, etc.)
p_FontCharset The character set of the new font. The character set values are listed in the global template in the Default Font tab.
Return Value

none

Example
Example
thisAnyFont.SetControlTypeFont (create:button, 'MS Sans Serif', 8, color:red, |
                                   
style:bold, charset:ansi)

Disable

Disable()

Description

Allows dynamic disabling of AnyFont. Sets the AnyFont property AFDisable to true. This must be called before the call to ThisAnyFont.SetWindow().

Parameters

none

Return Value

none

Example

Example
thisAnyFont.Disable()

Enable

Enable()

Description

Enables AnyFont after Disable() has been called. Sets the AnyFont property AFDisable to false. This is its default value.

Parameters

none

Return Value

none

Example
Example
thisAnyFont.Enable()

Refresh

Refresh()

Description

Re-applies the Font settings to the window. Can be called manually or by posting the ThisMakevoer.RefreshEvent to the window.

Parameters

none

Return Value

none

Example
Example
thisAnyFont.Refresh()

Class Properties and Global Variable Reference

Properties

Property Description
Oldfont Group(FontParams) The font attributes used by the program on startup. The initial values of the group are taken from the global variables. The FontParams group is defined as follows. The elements of the group are self-explanatory.
FontParams group
Name string
Size long
Color long
Style long
Charset long
end
Newfont Group(FontParams) The new font attributes changed by the user.
RegistryFolder String This variable contains the folder in the registry where the AnyFont settings will be kept. The folder will be in the HKEY_LOCAL_MACHINE\Software folder.
AFDisable Long This is the variable changed by the methods AnyFont.Disable() and AnyFont.Enable(). It is used to disable AnyFont in a single window and is normally set to false. To disable AnyFont, set this variable to true just before the initial call to ThisAnyFont.SetWindow().
RefreshEvent Long If this event is posted to the window, then the Refresh method will be called, causing the new font settings to be applied to the window.

Global Variables

AnyFont:Fontname        string(31)
AnyFont:FontSize        long(-1)
AnyFont:FontColor       long(-1)
AnyFont:FontStyle       long(-1)
AnyFont:FontCharset     long(-1)

These are used to store the current application font and correspond to the variables in the FontParams group. They can be set before the AnyFont.Init procedure is called in order to determine the default application font.

AnyFont:Disable         bool(false)

This is used to disable AnyFont globally at runtime and is normally set to false. To disable AnyFont, set this global variable to true. This can be done anywhere in your code. Disabling AnyFont causes all windows to revert to the default system font. If they are already open, no change will occur. See FAQ 1.

Using the embed described below will help you when you want the user to be able to change the value of AnyFont:Disable.

Changing the value of AnyFont:Disable does not affect the value of the local AnyFont.AFdisable properties.

Embeds

Call FontDialog to set Font Parameters
Save the AnyFont global Disable Variable


Call FontDialog to set Font Parameters

Insert this embed in order to change the application's font. It opens the font dialog window and saves the results to the place you have chosen in the global extension (.INI file or registry).

Save the AnyFont Global Disable Variable

Insert this embed where you want to change the state of the AnyFont global disable variable, for example in a menu item. It toggles the value of AnyFont:Disable and saves the value to the place you have chosen in the global extension (.INI file or registry).

This embed also allows you to insert code to change any text in the control used. For example, if you have used a menu item labeled 'Disable AnyFont', you can change the text to 'Enable AnyFont' inside the embed when AnyFont is disabled.

License & Copyright

This template is copyright 2021 by CapeSoft Software. None of the included files may be distributed. Your programs which use AnyFont can be distributed without any royalties.

This product is provided as-is. Use it entirely at your own risk. Use of this product implies your acceptance of this, along with the recognition of the copyright stated above. In no way will CapeSoft Software, their employees or affiliates be liable in any way for any damages or losses you may incur as a direct or indirect result of using this product.

Version History

Version 1.92 (May 24, 2021) Version 1.91 (November 19, 2020) Version 1.90 (March 27, 2020) Version 1.89 (February 20, 2019) Version 1.88 (February 13, 2019) Version 1.87 (September 14, 2018) Version 1.86 (April 20, 2018) Version 1.85 (April 16, 2018) Version 1.84 (February 12, 2018) Version 1.83 (September 26, 2016) Version 1.82 (April 21, 2016) Version 1.81 (October 19, 2015) Version 1.80 (October 8, 2015) Version 1.79 (August 7, 2015) Version 1.78 (February 25, 2015) Version 1.77 (February 12, 2015) Version 1.76 (January 23, 2015) Version 1.75 (January 2, 2015) Version 1.74 (December 23, 2014) Version 1.73 (December 17, 2014) Version 1.72 (December 16, 2014) Version 1.71 (July 14, 2014) Version 1.70 (January 31, 2014) Version 1.69 (Oct 8, 2013) Version 1.68 (Aug 21, 2013) Version 1.67 (Aug 1, 2013) Version 1.66 (May 24, 2013) Version 1.65 (April 30, 2013) Version 1.64 (March 14, 2013) Version 1.63 (January 23, 2013) Version 1.62 (June 13, 2012) Version 1.62 (June 13, 2012) Version 1.61 (October 5, 2011) Version 1.60 (February 19, 2010) Version 1.59 (February 17, 2010) Version 1.58 (December 29, 2009) Version 1.57 Gold (October 20, 2009) Version 1.56 Gold (May 25, 2009) Version 1.54 Gold (November 10, 2008) Version 1.53 Gold (September 3, 2007) Version 1.52 Gold (August 29, 2007) Version 1.51 Gold (July 24, 2007) Version 1.50 Gold (November 13, 2006) Version 1.49 Gold (November 1, 2006) Version 1.48 Gold (October 4, 2006) Version 1.47 Gold (July 28, 2006) Version 1.46 Gold (July 25, 2006) Version 1.45 Gold (July 21, 2006) Version 1.44 Gold (July 10, 2006) Version 1.43 Gold (July 7, 2006) Version 1.42 Gold (June 27, 2006) Version 1.41 Gold (June 12, 2006) Version 1.40 Gold (June 12, 2006) Version 1.39 Gold (June 6, 2006) Version 1.38 Gold (June 5, 2006) Version 1.37 Gold (12 April 2006) Version 1.36 Gold (2 February 2006) Version 1.35 Gold (1 February 2006) Version 1.34 Gold (23 January 2006) Version 1.33 Gold (23 December 2005) Version 1.32 Gold (29 July 2005) Version 1.31 Gold (21 June 2005) Version 1.30 Gold (20 June 2005) Version 1.29 Gold (25 May 2005) Version 1.28 Gold (19 May 2005) Version 1.27 Gold (12 May 2005) Version 1.26 Gold (6 May 2005) Version 1.25 Gold (28 April 2005) Version 1.24 Gold (6 April 2005) Version 1.23 Gold (1 April 2005) Version 1.22 Gold (29 March 2005) Version 1.21 Gold (16 March 2005) Version 1.20 Gold (8 March 2005) Version 1.11 Beta (25 February 2005) Version 1.10 Beta (21 February 2005) Version 1.09 Beta (19 January 2005) Version 1.08 Beta (11 January 2005) Version 1.07 Beta (6 January 2005) Version 1.06 Beta (31 December 2004) Version 1.05 Beta (17 December 2004) Version 1.04 Beta (14 December 2004) Version 1.03 Beta (12 November 2004) Version 1.02 Beta (25 October 2004) Version 1.01 Beta (21 October 2004) Version 1.00 Beta (10 September 2004)