diff options
Diffstat (limited to 'itcl/CHANGES')
-rw-r--r-- | itcl/CHANGES | 2041 |
1 files changed, 0 insertions, 2041 deletions
diff --git a/itcl/CHANGES b/itcl/CHANGES deleted file mode 100644 index b0cbdafe85d..00000000000 --- a/itcl/CHANGES +++ /dev/null @@ -1,2041 +0,0 @@ - - [incr Tcl] - CHANGE LOG -========================================================================== - ----------------------- CHANGES FROM itcl-1.5 -------------------------- -========================================================================== - - Release itcl-2.0 provides a new syntax for defining classes. The - new syntax is accessed using the new "itcl::class" command. For the - time being, the old syntax will be supported via the old "itcl_class" - command, but support for this will be phased out over time. - - Because both syntaxes are supported, the new version is "backward - compatible" with the previous itcl-1.5 release. However, there are - some semantic changes that may break existing scripts. These are - listed in detail in the section "INCOMPATIBLE CHANGES". - - - CATALOG OF NEW COMMANDS --------------------------------------------------------------------------- - Following is a brief catalog of new commands available in this release. - - == Tcl with Namespaces ================================================= - - delete namespace name ?name...? - - Deletes one or more namespaces, destroying all commands, variables, - and child namespaces within it. - - - ensemble name { - option optName arglist body - option optName arglist body - ... - ensemble optName { - option subOptName arglist body - option subOptName arglist body - ... - } - } - - Adds options to an ensemble called "name". If the ensemble does - not already exist, it is created automatically. An "ensemble" is - a toplevel command that groups a collection of sub-commands. For - example, the usual Tcl "info" command is an ensemble with options - like "globals", "level", "tclversion", etc. - - Ensembles are good for two reasons. First, new options can be - integrated in without modifying any source code or "switch" - statements. For example, [incr Tcl] adds the "info classes" - and "info objects" commands simply by adding options to the - "info" ensemble. Second, error messages are generated automatically - by the ensemble mechanism. Try invoking "info" with no options - and see the result. - - Each option declaration is just like a Tcl proc declaration, - with an option name, arglist and body. Ensembles can also - contain sub-ensembles with more options. - - - import add name ?name...? ?-where pos...? - import all ?name? - import list ?importList? - import remove name ?name...? - - Used to manipulate the "import" list for the current namespace. - When one namespace imports another, it gains access to all of - its public commands/variables as if they were part of the - same namespace. In other words, one namespace can be integrated - seamlessly into another by adding it to the import list of the - other namespace. By default, each namespace imports its parent, - so most namespaces import the global scope in some fashion. - - The form "import list" is used to query or set the import list - for the current namespace. The form "import all" returns the - namespace search path that is consulted when commands/variables - are accessed. - - - info context - - Returns the current namespace context. The global namespace - context is reported here as "", so it is easy to build - namespace paths like this: - - set path "[info context]::name" - - - info namespace all ?pattern? - - Returns a list of namespaces found in the current namespace - context, whose names match an optional string pattern. This - includes children of the current namespace, and children of - all imported namespaces. - - - info namespace children ?name? - - Returns a list of child namespaces for namespace "name", - or for the current namespace if "name" is not specified. - - - info namespace parent ?name? - - Returns the parent namespace for namespace "name", or - for the current namespace if "name" is not specified. - - - info namespace qualifiers string - - Parses a string of the form "namesp::namesp::name", and returns - the leading "namesp::namesp" scope qualifiers. - - - info namespace tail string - - Parses a string of the form "namesp::namesp::name", and returns - the trailing "name" element. - - - info protection ?-command? ?-variable? name - - Returns the protection level for an element. By default, "name" - is treated as a command name, but the "-command" or "-variable" - flags can be used to request a specific treatment. - - - info which ?-command? ?-variable? ?-namespace? name - - Reports the full namespace path (e.g., "::namesp::namesp::name") - for an element. By default, "name" is treated as a command name, - but the "-command", "-variable" and "-namespace" flags can be - used to request a specific treatment. - - - namespace name ?-local? ?-enforced val? ?--? ?commands? - - This is the usual mechanism for creating a namespace and defining - elements within it. - - If namespace "name" does not exist, it is created automatically. - The namespace name may include a full namespace path (e.g., - "namesp::namesp::namesp"). During the search for this namespace, - all imported namespaces are consulted. If the "-local" flag is - specified, then the search is restricted to the local namespace; - this prevents against accidentally importing a namespace if the - intent is to create a child namespace. - - If the "-enforced" flag is specified, then "val" is treated as a - boolean value; if true, then command/variable enforcement is - turned on for this namespace. Each time a new command is - referenced within the namespace, Tcl automatically calls a - procedure: - - enforce_cmd <name> - - with the <name> of the command that is about to be executed. The - "enforce_cmd" proc can return an error, and access to that command - will be denied. It can return another command name, or a more - specific namespace path, and that command will be used instead. - Or it can return "", and command lookup will continue via the - normal namespace rules (i.e., in local scope, imported namespaces, - etc.). - - Each time a new variable is referenced within an enforced - namespace, Tcl automatically calls a procedure: - - enforce_var <name> - - with the <name> of a global variable that is being referenced. - The "enforce_var" proc can return an error, and access to that - variable will be denied. It can return another variable name, - or a more specific namespace path, and that variable will be - used instead. Or it can return "", and variable lookup will - continue via the normal namespace rules (i.e., in local scope, - imported namespaces, etc.). - - Note that command/variable enforcement done at the Tcl language - level can be slow. There is also a C language interface for - the same functionality, which offers much better performance. - - The namespace is first found and updated with whatever flags were - specified. After that, if a "commands" string was specified, it - is executed in the context of the namespace. - - - public command ?arg arg...? - protected command ?arg arg...? - private command ?arg arg...? - - These commands attach a particular protection level to whatever - commands or variables are created while executing the specified - command. They are used in conjunction with commands like - "proc" and "variable" to create public/protected/private elements. - - - scope string - code ?-namespace name? command ?arg arg ...? - @scope namespace value - - The "scope" command takes a string and encodes it into an "@scope" - declaration. The "code" command performs a similar function, - but accepts multiple arguments and is usually used to wrap up - code fragments. The "@scope" declaration keeps a value (like a - variable name or code fragment) together with its context - namespace. It can be executed like an ordinary command: - - set cmd {@scope :: puts} - $cmd "hello world!" - - or used as an ordinary variable name: - - set var {@scope :: auto_path} - lappend $var /usr/local/mylib - - The difference, however, is that an "@scope" value bypasses the - usual access protections and guarantees that values have the - proper scope. - - Ordinary variable names refer to variables in the global - namespace. Ordinary code fragments are usually interpreted - by extensions like Tk in the global namespace. The "scope" - and "code" commands are used to wrap up variable names and - code fragments to preserve the namespace context. For example: - - namespace foo { - private variable state 0 - private proc show_state {mesg} { - global state - puts "$mesg: $state" - } - - checkbutton .cb -text "Toggle" \ - -variable [scope state] \ - -command [code show_state "current state"] - - pack .cb - } - - In this example, the checkbutton is tied to the variable - "foo::state" and executes the command "foo::show_state" - whenever it is pressed. - - When a Tk widget uses commands and variables within a - namespace, these names should be wrapped up as scoped - values, as shown above. - - - variable name ?value? - Creates a variable called "name" and initializes it to an optional - value. This is normally used in conjunction with public, protected - and private commands to declare variables within a namespace: - - namespace foo { - public variable x 0 - private variable y 1 - } - - If the variable "name" already exists, it updated to have - the protection level that is currently active. - - - == Tk with Namespaces ================================================== - - bind... - - Recognizes and expands the following fields within command - strings: - - %q => Replaced with the fully-qualified access command - for the widget receiving the event. For example, - - namespace foo { - namespace bar { - button .b -text "Hello World!" - } - } - - The fully-qualified access command for this widget - is "::foo::bar::.b". The "%q" field should be used - instead of "%W" as the widget access command: - - bind Button <Key-Return> "%q flash; %q invoke" - - - %M => Replaced with the window path name of the mega-widget - containing the window receiving the event. For example, - if an "entryfield" mega-widget ".x" contains an entry - widget ".x.entry", bindings added to ".x.entry" will - replace "%M" with ".x". This allows generic bindings - to be added to component widgets which affect the - mega-widget as a whole. - - For this to work properly, mega-widget packages must - register their component widgets using Itk_SetMegaWidget(). - - - winfo command window - - Returns the fully-qualified access command for the widget "window". - This is equivalent to the "%q" field in bindings, and is useful - in procedures where the only the window name is known: - - foreach kid [winfo children $win] { - [winfo command $kid] configure -bg blue - } - - - winfo megawidget window - - Returns the window path name of the mega-widget containing "window" - as a component. This is equivalent to the "%M" field in bindings, - and is useful in procedures where only the component window name - is known. For this to work properly, mega-widget packages must - register their component widgets using Itk_SetMegaWidget(). - - - == [incr Tcl] ========================================================== - - delete class name ?name...? - - Deletes one or more object classes. Deleting a class also - causes all derived classes, and all objects belonging to the - class, to be deleted as well. - - - delete object name ?name...? - - Deletes one or more objects. If the access command for an - object resides in another namespace, then the full namespace - path should be used: - - delete object foo::bar::x - - - info classes ?pattern? - - Returns a list of all classes in the current namespace - whose names match an optional string pattern. - - - info objects ?-class className? ?-isa className? ?pattern? - - Returns a list of all objects whose names match an optional - string pattern. If the "-class" option is specified, then - the list is further restricted to those objects whose - most-specific class is "className". If the "-isa" option - is specified, then the list is further restricted to those - objects who belong to class "className". - - - itcl::class name { definition } - - Used to create define a new class "name". The "definition" - commands include: - - inherit baseClass ?baseClass...? - - constructor arglist ?init? body - destructor body - - method name ?arglist? ?body? - proc name ?arglist? ?body? - variable name ?init? ?config? - common name ?init? - - public command ?arg arg...? - protected command ?arg arg...? - private command ?arg arg...? - - Note that the constructor statement has changed to include an - optional "init" argument. This is an initialization statement - that can be used to call out base class constructors. If it - is not included, base classes are constructors are invoked - automatically without any arguments. - - The "variable" statement is now used to create object-specific - data members. The "common" statement is used to create "common" - variables, which are global within the class namespace. Both - types of variables can be designated public, protected or - private. - - - itcl::body class::func arglist body - - Used to define the body of a class member function outside of - the class definition. If "body" declarations are kept in a - separate file, they can be sourced again and again to test - changes as bugs are fixed. If an "arglist" is specified in - the class definition, then the "arglist" for the body definition - must have the same meaning. - - - itcl::configbody class::option body - - Similar to the "body" command, but used to define the configuration - code for a public variable. - - - itcl_class name { old-style-definition } \__ backward compatibility - itcl_info option ?arg arg...? / - - - == [incr Tk] =========================================================== - - itcl::class name { - ... - itk_option define -switch resName resClass initVal ?configCode? - } - - The "itk_option define" command is recognized at the level of - the class definition. It defines a new mega-widget option with - the given switch name and X11 resource database names. The - "initVal" is used as a last resort to initialize the option - if no other value can be queried from the X11 resource database. - If "configCode" is specified, it is executed whenever the option - is modified via the "configure" method. The "configCode" can - also be specified outside of the class definition via the - "itcl::configbody" command. - - - Methods provided by itk::Archetype base class: - - component - component name - component name command ?arg arg...? - - Used to query or access components within a mega-widget. With - no arguments, this returns a list of component widgets that - are accessible in the current scope. Note that component - widgets obey any public/protected/private access restriction - that is in force when the component is created. - - With one argument, this returns the window path name for a - component with the symbolic name "name". - - In any other case, the remaining arguments are invoked as a - method on the component with the symbolic name "name". - - - configure - configure option - configure option value ?-switch value...? - - Works just like the usual Tk configure method, but for mega-widgets. - Here options are really composite widget options. When set, they - trigger changes to many different internal components, and may - invoke many bits of "configCode" for options defined by "itk_option - define". However, there is only one value for the composite option. - - - cget option - - Works just like the usual Tk cget method, but for mega-widgets. - Returns the current value for a composite widget option. - - - itk_component add name {create-commands} ?{option-commands}? - - Adds a new mega-widget component with the symbolic name "name". - Invokes the "create-commands" to create the component, and - invokes "option-commands" to integrate its options into the - composite list. By default, no options are integrated. Options - may be added using the following commands: - - keep option ?option...? - ignore option ?option...? - rename oldswitch newswitch resname resclass - usual ?tag? - - - itk_component delete name ?name...? - - Deletes an existing mega-widget component with the symbolic - name "name". The component will still exist as a widget, - but it will no longer be accessible as a component for this - mega-widget. Any options associated with the component are - removed from the composite list. - - Note that you can destroy a component like any ordinary widget: - - destroy .foo.bar.b - - Components automatically detach themselves from their mega-widget - parent when destroyed, so "itk_component delete" is not used - very often. - - - itk_option add option ?option...? \__ class::option - itk_option remove option ?option...? / component.option - - Adds or removes an option from the composite option list for - a mega-widget. These commands cannot be used at the level of - the class definition; they must be invoked for a particular - mega-widget. They usually appear in the constructor for a - mega-widget class, to add or redefine options in components - created by a base class. For example, the base classes - itk::Toplevel and itk::Widget keep only the bare minimum - options for their "hull" component: -background and -cursor. - If you want your mega-widget to have a border around it, you - can add the hull options back in: - - itcl::class MyWidget { - inherit itk::Widget - - constructor {args} { - itk_option add hull.borderwidth hull.relief - } - } - - - itk_initialize ?option value option value...? - - Initializes the composite option list for a mega-widget. - This method should be invoked within the constructor for each - mega-widget class. It is usually included the end of the - constructor, below the component creation code. It integrates - all "itk_option" options defined in the current class into - the composite configuration list, and includes "-option value" - settings usually received as arguments to the constructor. - When this is executed in the most-specific class, it scans - through the composite option list and makes sure that all - options have been properly initialized. - - itk::usual tag ?commands? - - Used outside of a mega-widget class definition to declare - the "usual" option-handling commands for the mega-widget. - These commands suggest how the configuration options should - be handled if the mega-widget becomes a component of an even - larger mega-widget. They include commands like "keep" and - "rename". - - - INCOMPATIBLE CHANGES --------------------------------------------------------------------------- - - >> Object construction/destruction now follows C++ model. - - In the previous release, object construction started at the - most-specific constructor. Base class constructors could - be called out explicitly within the body of a constructor. - If they were not, they were invoked implicitly when the - constructor finished executing. This led to a construction - model that was backward from C++, and contrary to what most - people expected. Destructors were backwards in a similar - manner. - - In the current release, object construction starts at the - least-specific class in the hierarchy, and proceeds to the - most-specific class. Therefore, each base class is fully - constructed before the derived class constructor is executed. - - Arguments are now passed to base class constructors through - an optional "initialization" statement. This statement is - included between the argument list and the body of the - constructor, so the syntax is reminiscent of C++: - - class Base { - constructor {x y} { - ...constructor body... - } - } - class Derived { - inherit Base - constructor {x y z} { - Base::constructor $x $y << "initialization" - } { - ...constructor body... - } - } - - Note that variables from the argument list (e.g., $x and $y) - can be referenced within the initialization statement. With - multiple inheritance, each of the base class constructors - can be called out individually. - - Object destruction is the exact opposite of construction. - It proceeds from most-specific to least-specific class. - - - >> All class methods are now implicitly virtual - - In the previous release, all method names were interpreted - with respect to the current class scope and its base classes. - If you wanted a method to act virtual, you had to explicitly - preface it with the "virtual" command each time you used it. - This proved to be error prone. - - In the new release, all methods are virtual by default. If - you invoke a method with a simple name, the most-specific - method with that name will be invoked, regardless of your - class scope: - - class Base { - constructor {} {show} - method show {} {puts "Base::show"} - } - class Derived { - inherit Base - constructor {} {show} - method show {} {puts "Derived::show"} - } - - The method "show" called out in the constructors for both of - these classes is virtual. When Base::constructor is executed - it finds the most-specific "show" method and prints - "Derived::show". When Derived::constructor is executed, it - finds the most-specific "show" method and prints "Derived::show" - again. - - If you want to invoke a particular method, you have to scope - it explicity: - - class Base { - constructor {} {Base::show} - method show {} {puts "Base::show"} - } - class Derived { - inherit Base - constructor {} {Derived::show} - method show {} {puts "Derived::show"} - } - - - >> Within class methods/procs the "global" command now refers to - variables within the class namespace. - - In the previous release, the "global" command was used to - access variables at the global scope. The "global" command - now refers to variables that are "global" within the current - namespace context. Within the scope of a class, this refers - to "global" class variables. Note that common data members - are global variables, but they can be accessed transparently, - without any special "global" declaration. You can also create - ordinary global variables within a class, but you will have to - declare them each time they are used with a "global" statement. - The new scheme will allow classes to have their own private - global variables (e.g., for interacting with widgets) without - flooding the global namespace. - - If you really want to access a variable at the "::" global - scope, use its complete path name: - - itcl::class Foo { - method getenv {name} { - global ::env - return $env($name) - } - } - - - >> "this" variable used to be included in every class scope - - In the previous release, each class scope included a separate - "this" variable containing the object name. There is now only - one "this" variable, kept in the most-specific class scope. - It can still be referenced as if it belongs to all classes, - e.g., "Base::this", "Derived::this". - - This change is probably not important to most applications. - But it did break my test suite, which expected to find many - different "this" variables coming back from the "info" command. - - - >> "this" variable now contains complete namespace path for the - object access command - - This change will break many scripts written for mega-widgets. - In the previous release, mega-widgets had a window name and an - access command name that were interchangeable. For example, - you would create a widget ".dialog" and configure it using - the ".dialog" command. Inside of this widget there was a - "this" variable containing the name ".dialog". - - In the current release, an object can exist in any namespace, - so the complete namespace path is a part of the object's - identity. Instead of just ".dialog", the "this" variable will - now contain a name like "::.dialog" or "::foo::.dialog". But - the window name is still just ".dialog". - - Scripts that used to use "$this" as a window name: - - wm title $this "Dialog" - - must now use the [incr Tk] "hull" component instead: - - wm title $itk_component(hull) "Dialog" - - If for some other reason you need the simple object name at the - end of the namespace path, you can get at it using the - "info namespace tail" command: - - set oldthis [info namespace tail $this] - - - >> "#auto" generated names now start with lower-case letter - - In the previous release, "#auto" could be used in place of - an object name to produce an automatically generated name: - - Toaster #auto -heat light - - The names were generated by adding a unique number onto the - class name: "Toaster0", "Toaster1", etc. - - The current release supports the same functionality, except - that the names generated are guaranteed to start with a - lowercase letter: "toaster0", "toaster1", etc. This helps - out in the mega-widget arena, where window names must start - with lowercase letters. - - - >> "config" argument used to allow multiple default values - - The magic "config" argument used to allow multiple default - values, which were simply concatenated into a single value - before processing. For example, in the previous release - you could say: - - itcl_class Foo { - method test {x y {config -foo 0 -bar 0}} { - ... - } - } - - and if the "test" method was used without extra configuration - arguments, they would default to "-foo 0 -bar 0". - - In the current release, you must make the default value for - a "config" argument a single string: - - itcl::class Foo { - method test {x y {config "-foo 0 -bar 0"}} { - ... - } - } - - >> "info class" now acts "virtual" - - In the previous release, the "info class" command would report - the current class context. In a base class method, it would - report the base class name, and in a derived class method, it - would report the derived class name. If you wanted to know - the most-specific class for an object, you would have to use - the "virtual" command explicitly: - - itcl_class Base { - method whatAmI {} { - return [virtual info class] - } - } - - The "info" command is now virtual by default, as long as an - object context is present. This means that you can drop the - "virtual" command: - - itcl::class Base { - method whatAmI {} { - return [info class] - } - } - - If you really want to know the current class scope, use the - "info context" command instead to query the current namespace - context. - - If an object context is not present (i.e., in the body of a - common class "proc"), the "info class" command reverts to - the current class context, the same as the "info context" command. - - - >> Library procedures "itcl_unload" and "itcl_reload" have been removed - - In the previous release, the library procedure "itcl_unload" - provided a way of deleting a class. You can now do the same - thing using the "delete class" command: - - delete class Toaster - - This deletes the specified class, all derived classes, and all - objects belonging to this class. If autoloading is set up, - you can reload a deleted class just by invoking its name. - The old "itcl_reload" function is now trivial: - - proc itcl_reload {class} { - delete class $class - $class - } - - - >> Class definition no longer recognizes ordinary Tcl commands. - - As an undocumented "feature" of the previous release, you could - include ordinary Tcl commands in the body of your class definition. - For example: - - itcl_class Foo { - ... - if {$somevar} { - public foo - } - } - - In the new release, only class definition commands are allowed - within the body of a class definition. You can, however, use Tcl - commands outside of the class definition to modify the class - definition as a string, and then define the class: - - set defn { - method test {} {return "test"} - } - if {$somevar} { - append defn "public variable foo" - } - class Foo $defn - - - IMPROVEMENTS --------------------------------------------------------------------------- - - >> an object can be renamed by renaming its access command - - In the previous release, an object's identity was fixed when - it was created. In the new release, the object is tied - directly to its access command. If you rename the access - command, you have renamed the object. The "this" variable - automatically keeps in sync with name changes. If you delete - the access command, you automatically delete the object. - - Toaster new -heat light - rename new fred << rename Toaster - fred toast 2 - fred toast 1 - rename fred "" << delete Toaster - - - >> Bodies of methods, procs and public variables can be defined - outside of the class definition, and can be redefined on the fly. - - In the previous release, all of the code related to a class was - defined within the class definition. This kept everything - together in one place, but it made it difficult to get an overview - of the class interface. - - In the new release, bodies can be defined outside of the class - definition, perhaps in a separate file. When debugging, the - implementations can be fixed and sourced again and again, without - having to delete existing objects and classes. - - Use the "itcl::body" command to redefine the body of a class - method or proc. Use "itcl::configbody" to redefine the configuration - code associated with a public variable. For example: - - itcl::class Toaster { - constructor {args} { - eval configure $args - } - destructor { - if {$crumbs > 0} { - error "cannot destroy dirty toaster: clean first" - } - } - - method toast {nslices} - method clean {} - - public variable heat 3 - protected variable crumbs 0 - } - - itcl::body Toaster::toast {nslices} { - if {$nslices < 1 || $nslices > 2} { - error "bad number of slices: should be 1 or 2" - } - set crumbs [expr $crumbs+$heat*$nslices] - if {$crumbs >= 50} { - puts stderr "== FIRE! FIRE! ==" - } - } - - itcl::body Toaster::clean {} { - set crumbs 0 - } - - itcl::configbody Toaster::heat { - if {$heat < 1 || $heat > 5} { - error "invalid setting \"$heat\": should be 1-5" - } - } - - If an argument list is specified in the class definition, then - the same argument list must be used when the implementation is - redefined. The variable names can change, but the meaning of - the arguments must be the same. If you leave the argument - list out of the class definition, or if you include the "args" - argument, the argument list can change. - - - >> C procedures can be integrated into class definitions - - Any method body that is specified as "@symbol" is treated as a - reference to a C procedure with the symbolic name "symbol". - Symbolic names are established by registering C procedures - via the Itcl_RegisterC() procedure. This is usually done - when the interpreter starts up in the Tcl_AppInit() procedure: - - if (Itcl_RegisterC(interp, "foo", My_FooCmd) != TCL_OK) { - return TCL_ERROR; - } - - This registers a procedure My_FooCmd() with the symbolic name - "foo". It can be used as the implementation for a class method, - proc, or bit of configuration code simply by specifying "@foo" - in place of the Tcl code body. - - These C procedures are just like ordinary Tcl command handlers. - They take the usual arguments: - - int My_FooCmd(ClientData cdata, Tcl_Interp *interp, - int argc, char** argv) - { - ... - return TCL_OK; - } - - including the (argc,argv) arguments from the command line. But - before these procedures are invoked, the proper class scope is - established so that object data members can be accessed as if - they were ordinary variables via Tcl_GetVar() and Tcl_SetVar(). - - Look at the [incr Tk] base class itk::Archetype as an example - for integrating C code. - - - >> "#auto" can be buried within an object name: ".x.y.z.#auto" - - In the previous release, "#auto" was a keyword that could be - used in place of an object name. It can now be used as a - part of the object name, making it easier to generate automatic - names for mega-widgets. - - - >> Every object now has built-in "configure" and "cget" methods - that follow the Tk paradigm. For [incr Tk] widgets, they follow - the paradigm exactly. The ordinary [incr Tcl] objects, the - X11 resource values are missing. - - - >> There is no longer a built-in "delete" method, so classes can - define their own "delete" operations. - - Instead of "objName delete", use the new "delete object" command: - - Toaster fred -heat dark - delete object fred - - - >> All data members can be declared public, protected or private. - - Private data members can only be accessed in the class where - they are defined. Protected data members can be accessed in - the defining class and all derived classes. Public data members - can be accessed like protected data members, but are also - recognized as configuration options by the built-in "configure" - and "cget" methods. - - - >> In [incr Tk], options are now defined outside of the constructor, - at the level of the class definition. - - - >> In [incr Tk], configuration options belonging to components - created in a base class can be added or removed in derived - classes. - - The base classes "itk::Toplevel" and "itk::Widget" are now stripped - down to the bare minimum options. For example, if you want to add - "-width" and "-height" options for the hull component, do this using - the "itk_option" command in the body of the constructor: - - class MyWidget { - inherit itk::Widget - - constructor {args} { - itk_option add hull.widget hull.height - ... - } - } - - Options can be added and removed on-the-fly during normal operation, - but this is not recommended, since it could lead to a confusing - interface. - - - >> In [incr Tk], components can now be added or removed on-the-fly. - - The "itk_component" method now supports "add" and "delete" - operations that are used to add/delete components. - - - >> All [incr Tk] widgets can be destroyed like normal Tk widgets. - - If you destroy a component widget, for example, it will automatically - remove itself from its parent via "itk_component delete". Likewise, - when a parent widget is destroyed, it will automatically destroy - all component widgets. - - - >> In [incr Tk], the "itk::Archetype::component" method now provides - access to mega-widget components. - - In the previous [incr Tk] prototype, the "component" method had - a different syntax and only supported query operations. You can - now access an internal component via the "component" method using - its symbolic name: - - .dialog component hull configure -width 450 -height 500 - - This example accesses the "hull" component of the ".dialog" - mega-widget, and sets the width and height options. - -========================================================================== - ---------------------- RELEASE 2.0beta - 9/6/95 ------------------------ -========================================================================== - -9/8/95 (bug fix) - Fixed menus to work properly within namespaces. Menu library code - now recognizes the proper namespace context for all "-menu" options. - -9/8/95 (new feature) - Added "winfo command name" option to report the scoped access command - for a given window. - -9/8/95 (configuration changes) - - fixed "sed" invocation in iwidgets Makefile - - added configuration guesses for Tadpole Sparcbook - - added George Howlett's test for "gcc", so that "-fwritable-strings" - is added even if gcc is masquerading as "cc" - - fixed tcl/tk configure scripts to have default prefix "/usr/local/itcl" - or wherever itclsh/itkwish is installed - - fixed makefiles to use $(MAKE) instead of "make" - -9/9/95 (bug fix) - Protected references to obj->accessCmd to avoid seg faults when - an object is being destroyed. - -9/9/95 (new features) - Changed the syntax of the "namespace" command: - - namespace name ?-local? ?-hidden val? ?-enforced val? ?--? ?commands? - - Flags now follow the namespace name, and the "commands" body is - optional. The "-hidden" option allows a namespace to be hidden - during "info namespace all" queries. The "-enforced" option turns - command/variable enforcement on or off. - - Update "info namespaces all" command to allow for display of hidden - namespaces: info namespaces all ?-hidden? ?pattern? - -9/10/95 (bug fix) - Fixed "auto_mkindex" to work properly for procs defined within - namespaces. Added support for itcl::class, itcl::body and - itcl::configbody as well. Added tests for tclIndex file generation. - -9/11/95 (configuration changes) - Fixed makefiles to reference sources and libraries properly, so - it should be possible to build different object trees for - different platforms with "gmake". - -9/13/95 (configuration changes) - Added "AC_C_CROSS" to configure files, so configuration should work - properly on Solaris 2.4. - -9/13/95 (bug fix) - Changed option configuration to work synchronously, and added - "itk_initialize" command to initialize the configuration options - for each mega-widget class. The original behavior of handling - option changes via "do-when-idle" has been removed. - -9/13/95 (bug fix) - Changed all structure members called "namespace" to "namesp". - This allows the code to compile correctly under C++. - -9/13/95 (configuration changes) - - added support for "i[34]86:BSD/OS" in "config/config.guess" - - fixed "test" target for iwidgets - -9/13/95 (bug fix) - Fixed "global" command and other places where namespace paths - are parsed to allow for a single ":" in command/variable names. - -9/13/95 (bug fix) - Fixed a problem which caused class-based options to be lost when - a widget class was defined within a proc. - -9/14/95 (bug fix) - Fixed class access command so that when it is deleted, it - automatically destroys the class. This also fixed a seg fault - that occurred when an object's access command stomped on the - class access command. - -9/14/95 (enhancement) - Fixed "scope" command and the @scope facility so that null strings - can be passed around without all of the extra scoping info. - -========================================================================== - ----------------------- RELEASE 2.0b2 - 9/14/95 ------------------------ -========================================================================== - -9/15/95 (enhancement) - Changed error messages reported when a class method/proc gets the - wrong number of arguments to report the usage information, like: - {wrong # args: should be "obj foo x y ?arg arg...?"} - -9/18/95 (bug fix) - Fixed a seg fault that occurred when the "cget" method was called - with no args. - -9/18/95 (bug fix) - Fixed a bug that caused private variables in a base class to be - uninitialized, even if an initial value was specified in the - class definition. - -9/22/95 (configuration changes) - Added the "SHELL=/bin/sh" statement to the main makefile. This - fixes build problems on SGI machines. - -10/9/95 (paradigm shift) - Removed the implicit scoping from any facility that takes a command - or variable name. Implicit scoping made it difficult to pass a - command string or variable name into a wrapper proc and yet preserve - the scope that it came from. All scoping is now explicit. All - commands and variables are interpreted in the global "::" scope - unless they are wrapped in an "@scope" declaration. Commands can - be wrapped up like this: - - button .b -text "Push Me" -command [code .b configure -bg red] - - Variable names can be wrapped up like this: - - radiobutton .rb1 -text "Choice #1" -variable [scope mode] -value 1 - - The "code" and "scope" commands wrap up strings with an "@scope" - specification which preserves the namespace context. - -10/17/95 (paradigm shift) - Changed the "%C" option of the "bind" command to return a scoped - command of the form "@scope namespace widget" that can be used to - access the widget. "%C" should be used instead of the usual "%W" - window name when attempting to access the widget. Bindings should - be written like this: - - bind Entry <FocusIn> {%C configure -bg white} - bind Entry <FocusOut> {%C configure -bg gray} - - The command "%C" can be used to access the widget regardless which - namespace it belongs to. - -10/31/95 (enhancement) - Fixed "unknown" command to support a general facility for adding - unknown command handlers. The "unknown_handler" proc is used to - register new handlers. Each time an unknown command is encountered, - each of the handlers is invoked to attempt to handle the command. - If a handler returns "-code continue", control passes to the next - handler on the list. Handlers are invoked in the order opposite to - the way they were registered. Extensions can use this facility to - add their own handlers into the "unknown" scheme. - -11/7/95 (enhancement) - Added a "backward-compatibility" mode to [incr Tcl]. By default, - widget names can now be used as access commands in any namespace, - even if the widget access command exists in another namespace. - This emulates the normal Tk behavior that widgets are global resources - in the application that can be accessed anywhere. This behavior can - be disabled by setting the global variable "itcl_purist" to "1". When - this variable is set non-zero, care must be used to use "%C" or - "[winfo command %W]" as an access command when the widget is used - outside of the namespace that contains it. From the standpoint of - the object-oriented paradigm, the "purist" mode is better since it - supports encapsulation. The "backward-compatible" mode, however, - allows [incr Tcl] to work better with existing Tk applications and - extensions. - -11/22/95 (bug fix and enhancement) - Fixed the built-in "info" command for classes to include the "info - classes" and "info objects" queries. These were initially overlooked - in a hard-wired list of "info" queries. - - Fixed the ensemble facility in general to support unknown options - via an "@error" handler. Any option registered with the name "@error" - is treated as an error handler for the ensemble. Arguments passed - to the option include the ensemble name, the unknown option, and all - remaining arguments. For the built-in "info" command, the "@error" - handler passes any unknown options to the usual Tcl "info" command, - so all of the standard options are automatically available. - -11/23/95 (bug fix) - Fixed usual tkerror dialog to truncate error messages at 5 lines. - The usage information returned by an ensemble or itcl object can - be much longer, causing the "Stack Trace" button to get lost in - many cases. - -11/27/95 (bug fix) - Removed the constructor/destructor from the list of public methods - returned as usage information when an unknown method is encountered - on an object. - -12/2/95 (bug fix) - Fixed error reporting for object construction. Used to say - something like "object constructor x y z" which made it look - like a method invocation. Now says "class object x y z" which - looks more like the call that the user made to trigger the error. - -12/4/95 (bug fix) - Fixed class creation and object creation to avoid clobbering - existing commands with new class/object access commands. This - prevents all hell from breaking loose when a command like - "class set {...}" is invoked. - -12/6/95 (configuration changes) - Fixed parsing of namespace paths to use local storage instead of - assuming that strings are writable. This means that the - "-fwritable-strings" option is no longer necessary for GCC and - other compilers that store static strings in the program text - segment. This option has been removed from all "configure.in" - files. Linux users will no longer see core dumps on start-up. - -12/8/95 (bug fix) - Fixed "upvar" so that class data members can be accessed from - another calling procedure. This fixed a problem with using - "parray" from within class methods. - -12/9/95 (bug fix) - Fixed "@scope" variable references so that variables can be created - using "@scope" in any context and referenced later. - -12/9/95 (feature change) - Removed "-hidden" option from namespaces. It seemed to complicated - and quirky to explain on the man page. Instead, all parser - namespaces like "scope-parser" and "mkindex-parser" are grouped - into a "::tcl" namespace. This keeps them somewhat hidden even - without any special treatment. - -12/9/95 (minor enhancement) - Added "array" command to class definition parser, so it can be - used along with "set" to initialize common arrays. - -12/10/95 (paradigm shift) - Removed the "%C" pattern from the expansions recognized by the - "bind" command, in favor of the following scheme: - %W ........ name of widget receiving event - %M ........ name of mega-widget containing widget receiving event - %q ........ fully-qualified command name of widget receiving event - %Q ........ fully-qualified command name of mega-widget receiving event - Fixed "winfo command" to return the fully-qualified command name of - a widget (instead of a scoped access command) to be consistent with - the "%q" bind pattern. - -12/10/95 (bug fix) - Fixed Tk library code to use "%q" and "winfo command", so that the - default widget behaviors will work even in "itcl_purist" mode. - -12/11/95 (minor enhancement) - Added "winfo megawidget" query, which will return the name of the - mega-widget containing a specified component widget. In order for - this to work, a mega-widget package must use the procedure - Itcl_SetMegaWidget() to register each component as it is added - to a mega-widget. - -12/12/95 (bug fix) - Fixed Archetype base class to keep all options sorted in alphabetical - order. This way they can be reported back by the "configure" method - in alphabetical order. Options are now initialized by "itk_initialize" - in alphabetical order as well. - -12/12/95 (bug fix) - Fixed the Archetype base class to register each component widget with - Tk via Itk_SetMegaWidget(). This means that "winfo megawidget" and - "%Q" can be used to reference the containing mega-widget for any component. - -12/12/95 (bug fix) - Fixed the "configure" method in the Archetype base class so that when - an error is encountered while setting a configuration option, the option - is set back to its previous value. - -12/12/95 (bug fix) - Fixed the "itk_component add" method to find access commands for - components even if they are created in the global scope. Components - that are meant to be shared can be created using "uplevel #0". The - access command for this component will be installed in the global scope, - and therefore available to all other namespaces. - - Syntactic sugar like a "-global" option would be nice, but references - like $itk_component(...) must be substituted in the calling scope, and - it is not possible to get these properly substituted and still maintain - the boundaries around arguments. - -12/12/95 (bug fix) - Fixed Archetype base class to handle public/protected/private components - properly. The usual public/protected/private commands can be used in - conjunction with "itk_component add" to set the protection level of a - component. The protection level affects the action of the "component" - method. Public components are reported in any namespace, and are - accessible from any namespace. Protected components are accessible - within a base class and derived classes. Private components are - accessible only within the class where they are defined. This feature - can be used to keep unimportant components (such as frames) off of the - component list that a client would see. - -12/13/95 (enhancement) - Added "usual" and "ignore" commands for processing component widget - configuration options. The "usual" command finds the usual code fragment - for the widget class of the component, and executes it. The command - "itk::usual" can be used to register option code for new widget classes. - - The "ignore" command can be used to override previous "keep" and "rename" - commands. This is useful for removing options that the "usual" code - keeps or renames. - - Fixed the "itk_component add" command so that if the option handling code - is not specified, the "usual" command is invoked automatically. - -12/13/95 (bug fix) - Fixed the Archetype base class to handle the immutable Tk options - properly. Options like -class, -colormap, -screen and -visual can only - be set at creation time. The itk_option array is now properly - initialized to report their creation value. - -12/14/95 (bug fix) - Fixed "itk_option add" command to report errors properly for unknown - options. - -12/14/95 (bug fix) - Fixed "body" command to report errors properly for unknown functions. - -12/14/95 (bug fix) - Fixed a bug in the handling of TCL_GLOBAL_ONLY flag when looking up - class variables. Previously, this was ignored, so object-specific - variables could be accessed in a "global" context by Tk widgets. - This caused some strange behavior when object-specific variables - were used in conjunction with widget options like "-textvariable". - Tk widgets now properly interact with classes via global variables. - -12/14/95 (bug fix) - Fixed "auto_mkindex" to recognize procs within class definitions and - add them to the "tclIndex" file. - -12/15/95 (bug fix) - Fixed "body" command to find functions only in the specified class. - The bug caused a base class method to be redefined whenever a "body" - command was issued for a derived class if the method was not declared - in the derived class. Made a corresponding fix to the "configbody" - command for public variables. - -12/15/95 (enhancement) - Added the following commands to the class definition parser: bind, - scope and code. This allows generic class bindings to be included - in the body of a class definition. - -12/15/95 (enhancement) - Added "-clientdata" option in itk::Archetype base class so that - all widgets will have an extra field for client data. For application - developers, this may come in handy. - -12/16/95 (bug fix) - Fixed the itk::Archetype base class so that if "itk_option add" or - "itk_option remove" is called for ordinary class-based options before - "itk_initialize" (which normally integrates them in) it does not cause - a problem. - -12/17/95 (bug fix) - Fixed namespace resolution so that a command/variable with a - specific path like "itk::body" will not be found in another - imported namespace. For the import list to be followed, the - command name must be generic like "body". - -12/19/95 (configuration changes) - Changed from generic directories like "tcl" and "tk" to directory - names with version numbers like "tcl7.4" and "tk4.0". - -12/19/95 (bug fix) - Changed names like "itcl_library" and "itcl_purist" to "itcl::library" - and "itcl::purist". This makes more sense in the documentation, since - the underbar stuff is no longer needed with namespaces, and extension - writers are discouraged from using it. - -12/21/95 (bug fix) - Changed handling of argument lists for functions with Tcl or C - implementations. All argument lists are now treated as Tcl - argument specifications. For Tcl implementations, this determines - what arguments are available in the body of the procedure; for C - implementations, this merely gives the intended usage information - for the function (the C implementation may choose to ignore this - and do something else). This fix makes it easier to override - C implementations with Tcl procedure bodies. - -12/25/95 (bug fix) - Split the usual TCL_GLOBAL_ONLY flag into two meanings: TCL_GLOBAL_ONLY - now means "a global variable in the global namespace", and ITCL_GLOBAL_VAR - means "a global variable in the current namespace". This enhancement - fixes Tk (and many other extensions) which request global variables. - A plain variable name together with TCL_GLOBAL_ONLY is now interpreted - as an ordinary Tcl global variable, so the behavior is backward-compatible. - A scoped variable reference will work properly with namespaces. If - extension writers get more ambitious, they can start using the - ITCL_GLOBAL_VAR flag, which will make their extensions namespace-friendly. - -12/26/95 (bug fix) - Fixed "@scope" command so that extra arguments added at the end are - kept as proper list elements when added to the command string. This - makes sure that boundaries around Tcl words are not lost when the - scoped command is interpreted. - -12/28/95 (minor enhancement) - Added "config" method to the Archetype base class as an alias for - the usual "configure" method. Many Tk applications use "config" - as an abbreviation for "configure", so this fix improves compatibility - with other packages. - -12/28/95 (bug fix) - Fixed Itcl_SaveInterpState() and Itcl_RestoreInterpState() to - properly save/restore the interp state even for commands like - Tcl_SetCmd(), which are sloppy about setting the interpreter - result. This fixed bad memory references that were encountered - in enforced namespaces. - -12/28/95 (bug fix) - Fixed Itcl_DeleteNamesp() to allow variable traces to be fired - off properly when a namespace is destroyed. - -12/30/95 (bug fix) - Fixed the Archetype base class to do the "ignore" operation - properly for mega-widget options. A bug was causing a single - "ignore" request not only to eliminate the desired option, but - to eliminate options that were renamed to the "ignore" name - as well. - -========================================================================== - ------------------------ RELEASE 2.0 - 12/31/95 ------------------------ -========================================================================== - -1/2/96 (cleanup) - Fixed some compiler warnings reported by Christopher Hylands - (cxh@EECS.Berkeley.EDU) - -1/4/96 (cleanup) - Fixed the description of the last test in itk/tests/option.test. - -1/4/96 (cleanup) - Fixed code examples in man pages. Lines starting with "." now - start with the null character "\&", to avoid errors with troff. - -1/5/96 (bug fix) - Fixed a bug in tkMenuUnpost. Popup menus associated with something - other than a menubutton can now be unposted properly. - -1/10/96 (bug fix) - If an error occurs during construction, all destructors are now - invoked--even if an error is encountered. All destructor errors - are completely ignored. This fixed a core dump reported by - Christopher Hylands (cxh@EECS.Berkeley.EDU). - -2/5/96 (cleanup) - Fixed memory leaks reported by Forest Rouse (rouse@flash.icemcfd.com). - Also fixed a problem in Itcl_DeleteNamesp() with the way that - the variable cache was destroyed. This caused a core dump on Solaris - systems when a namespace was deleted. - -2/8/96 (cleanup) - Fixed itk tests to ignore any resources that the user might have - on the desktop (e.g., *background: red) - -2/11/96 (bug fix) - Fixed auto_mkindex so that the "proc" command accepts arglist and - body as optional arguments. Within class definitions, these - parameters may not be specified. Also, fixed the "source" command - so that it is ignored within the file being indexed. Otherwise, - it brought in program elements that confused the index. - -2/15/96 (bug fix) - Fixed the unknown command to save errorInfo and restore it before - invoking each handler. This fixed an irritating bug that caused - the first error message to be lost as "tkerror" was autoloaded. - -2/20/96 (bug fix) - Fixed a bug in variable lookup that allowed private/protected - variables to be set from outside the normal context. On initial - lookup variables were being passed over, but since they did not - appear to exist, they were being created. Variables are now - protected from being set or redeclared from an improper context. - -3/1/96 (enhancement) - Changed namespaces to import from their parent in "protected" - mode instead of "public" mode. This is a better default, since - it emphasizes the strong relationship between a parent and a - child. They can share variables that are hidden from anyone else. - -3/5/96 (bug fix) - Fixed the "info objects" to autoload any classes referenced by - "-isa" or "-class" that are not yet defined. - -3/12/96 (enhancement) - Fixed class parser to recognize commands at the global scope. - This makes it possible to embed normal Tcl commands like an - "if" statement within a class definition. It also makes it - easy to extend the class parser by defining procs in the - ::itcl::parser namespace. - -3/17/96 (enhancement) - Fixed "usual" command so that with no arguments, it returns a - list of all known tags. Each tag name can be used to query its - associated code. - -3/19/96 (enhancement) - Fixed the "configure" method for mega-widgets to include public - variables as configuration options. Normally, mega-widget - classes use "itk_option define" to define configuration options. - However, if a mega-widget includes an ordinary itcl class as - a base class, it should provide access to the base class options. - Public variables are now integrated into the composite option - list by "itk_initialize". - -4/2/96 (enhancement) - Added a "chain" command to the built-ins available in each class. - A command like "chain 1 2 3" invokes the next implementation of - the current method/proc found looking up the inheritance hierarchy - toward base classes. This can be used to invoke a base class method - in a generic way, without hard-coding the base class name. - -4/10/96 (bug fix) - Fixed "configure" operation for mega-widgets. Previously, if an - error was encountered during configuration, the value in itk_option - was set back to the previous value, but some parts of the mega-widget - might be left in a partially configured state. Now, if an error is - encountered and the option is set back to its previous value, the - change is propagated down to all parts, so the widget remains in a - consistent state. - -4/15/96 (bug fix) - Fixed a bug reported by Karel Zuiderveld (karel.zuiderveld@cv.ruu.nl) - related to virtual method selection in "itcl_methods.c". If for some - reason a method name was not found in the virtual table, the table - access caused a core dump. This is now fixed. - -5/13/96 (bug fix) - Fixed "itk_initialize" to recognize errors when executing the "config" - code associated with configuration options. Any error immediately - causes itk_initialize to abort, which usually aborts construction. - -5/13/96 (bug fix) - Fixed a bug in Itcl_SaveInterpState() and Itcl_RestoreInterpState() - which caused error information to get lost during object construction - when errors were encountered. The new iPtr->appendResult buffer was - being ignored, and results in this buffer were getting lost. - -6/1/96 (bug fix) - Changed the internal Interp and TkWindow data structures so that all - of the extra [incr Tcl] data members are at the bottom of the structure. - This should prevent errors when modules that have been compiled against - vanilla Tcl/Tk are dynamically loaded into [incr Tcl]. - -6/12/96 (enhancement) - Integrated changes for "itcl2.0+3" release by Karel Zuiderveld, - Jan Nijtmans and Vince Darley. This added support for tcl7.5/tk4.1, - dynamic loading, canvas improvements, and support for Macintosh - environments. Many thanks to these guys for all of their hard - work! - -6/22/96 (installation) - Changed the way things are installed: - - the startup file "init.itcl" is now called "itcl.tcl" - - the startup file "init.itk" is now called "itk.tcl" - - libraries, include files and man pages are now installed under - a special "itcl" directory to avoid conflicts with a vanilla - Tcl/Tk installation. For example, if your --prefix is set - to /usr/local, things would be installed as follows: - - /usr/local/bin ............ executables: - ish = tclsh with namespaces - iwish = wish with namespaces - itclwish = tclsh with namespaces and classes - itkwish = wish with namespaces and classes - - /usr/local/include/itcl ... include files - /usr/local/lib/itcl ....... libraries - /usr/local/man/itcl ....... manual pages - -6/24/96 (bug fix) - Fixed "itkwish" so that it requires the Iwidgets package automatically - during initialization. For all other shells, you must specifically - request Iwidgets with a statement like "package require Iwidgets" - -6/26/96 (bug fix) - Fixed Tk_CanvasTagsParseProc to avoid dumping core when an item - is configured with a null tag string. - -6/26/96 (bug fix) - Fixed PolygonToPoint() in tkCanvPoly.c so that invisible polygons - (with no outline and no fill) are still considered when picking - the closest item. Without this fix, programs like the "floor plan" - in the Tk widget demo will not work. - -6/26/96 (bug fix) - Fixed the [incr Widgets] "feedback" widget to do a full update on - each step. Without this, changes appear from time to time, but - the bar does not grow smoothly. - -6/26/96 (bug fix) - Fixed fileselectiondialog and fileselectionbox to update directory - list properly when "-directory" option is configured. - -6/28/96 (bug fix) - Fixed "itk_option define" to properly preserve a "config" code - body so that it can be released if it is redefined later. - -========================================================================== - ------------------------ RELEASE 2.1 - 6/28/96 ------------------------- -========================================================================== - -7/22/96 (bug fix) - Fixed C-level variable access so flags like ITCL_FIND_LOCAL_ONLY - can be passed into Tcl_GetVar() and Tcl_SetVar(). - -7/25/96 (bug fix) - Fixed the "notebook" widget in the [incr Widgets] set. The "index" - method now supports pattern matching and index names with spaces in - them. - -8/1/96 (bug fix) - Fixed destructor invocation so that if an object is being - destructed and you try to delete it again, it will report an - error. - -8/7/96 (bug fix) - Fixed the "inherit" command to make sure all names are really - valid classes. Previously, trying to inherit from a proc would - dump core. - -8/29/96 (enhancement) - Integrated with itcl2.1+2 (tcl7.5p1/tk4.1p1). - -9/1/96 (bug fix) - Fixed the Itcl_RegisterC() procedure so that the same name can be - registered more than once, as long as it has the same function - pointer. - -9/7/96 (bug fix) - Fixed a bug in method access for protected methods. There was a - problem when a base class defined a method, and a derived class - overloaded the method, and the method was accessed from the base - class namespace. Added function Itcl_CanAccessMethod() to check - for overloaded methods and allow access accordingly. - -9/13/96 (bug fix) - Fixed the Itcl_RestoreInterpState() procedure so that the "errorCode" - variable is restored properly. There was a problem when the - error code contained a list of elements. - -9/20/96 (bug fix) - Fixed a bug in the way namespaces were deleted. The hash table of - child namespaces was being traversed while elements within it were - being deleted. This caused a core dump when you tried to exit - the application with a command like "destroy .". - -9/28/96 (bug fix) - Fixed the way that errors are reported when a base class is constructed - with the wrong arguments. Previously, the error message showed the - object creation command like "wrong # args: should be Foo name val1 val2". - Now, it shows the base class constructor name, so it is more obvious - where the error is coming from. - -10/5/96 (bug fix) - Fixed a bug in constructor invocations. All base class constructors - are now invoked properly, even if a derived class does not have a - constructor. - -10/9/96 (enhancement) - Added proper support for safe interpreters. You can now use namespace - commands in a safe interpreter, and you can load Itcl as a safe package. - -10/11/96 (bug fix) - Fixed a core dump with "namespace foo {info locals}". The namespace - call frame was not being set up properly, so the local variable table - was garbage. Normally, you don't access local variables at the - namespace level. But now it is fixed. - -10/14/96 (bug fix) - Fixed the Itcl_RegisterC() procedure so that each interpreter has - its own list of symbolic function names. This avoids global data - and makes more sense for people using multiple interpreters. - -10/20/96 (bug fix) - Fixed variable lookup so that when you try to access a variable - like "::foo::x" inside of a procedure, you get an error instead - of a local variable named "::foo::x". Variables like this need - to be declared global. - -10/22/96 (enhancement) - Fixed the built-in "isa" method to autoload class definitions as - needed for each "isa" test. If a class is not defined and cannot - be autoloaded, it is an error. - -10/26/96 (enhancement) - Fixed "delete object" command so that objects can be deleted - using scoped values for the object name. - -10/29/96 (enhancement) - Integrated with itcl2.1+5 (tcl7.6/tk4.2). - -11/1/96 (porting) - Removed "plus" and "dash" patches to allow for porting to Windows95 - and Macintosh platforms. Simplified configuration and makefiles - for Unix platforms. - -11/4/96 (installation) - Fixed configuration and makefiles to support building in a - separate directory. There is a bug in "autoconf" which prevents - this from going smoothly. You have to copy all of the configure - scripts to a separate tree (e.g., using a tar file), and then build. - -11/5/96 (bug fix) - Fixed a bug in the way variables were reported by the built-in - "info" command for classes and objects. Private variables in - a base class were incorrectly reported as "<undefined>". They - are now reported properly. - -11/10/96 (bug fix) - Fixed the "this" variable so that if an object is deleted while it - is still in use, its name is properly reported as the null string. - -11/10/96 (bug fix) - Fixed the way namespaces are deleted so that the "::errorInfo" and - "::errorCode" variables remain intact until everything else has been - destroyed. These variables are needed if any errors are encountered - as an interpreter is being destroyed. - -11/11/96 (installation) - Split the "itclConfig.sh" file into separate "itclConfig.sh" and - "itkConfig.sh" files. - -11/11/96 (installation) - Fixed the package installation to conform to tcl7.6/tk4.2. The - pkgIndex.tcl files are now stored in the library directory for - each package. - -11/13/96 (enhancement) - Overhauled the scrolledcanvas widget. It is now about an order of - magnitude faster. - -11/14/96 (enhancement) - Overhauled the [incr Widgets] "catalog" demo. When you pick any - mega-widget class, the demo displays an example widget, the code - used to build it, the class hierarchy, and the man page. - -11/23/96 (bug fix) - Fixed the way the "inherit" command autoloads class definitions. - Previously, it invoked the class name as a command. Now, it uses - the "auto_load" command. - -11/23/96 (installation) - Fixed the "configure" files to use "mkinstalldirs" instead of "mkdir" - so that the entire distribution can be built in a separate directory - starting with a single "configure" file. Fixed the way the distribution - is created to make this patch for each new distribution. - -11/23/96 (installation) - Fixed the iwidgets installation so that the installed files (instead - of the source files) are chmod'd to have the proper permissions. - -11/29/96 (installation) - Fixed iwidgets (combobox, optionmenu, shell) so that they don't rely - on "tkwait visibility" before doing a grab. On the Macintosh, this - only works the first time a window is mapped. After that, this - command does not return control, even when a window is remapped. - -11/30/96 (bug fix) - Fixed "tk4.2/library/menu.tcl", moving a comment in a switch statement - above the default case into the default case. When the comment is - above the case, it is treated as a list element and a parsing error - occurs. You can trigger the error with a command like "tkMenuFind . x". - When the comment is inside the case, everything works fine. - -11/30/96 (bug fix) - Fixed a memory error that occured when an interpreter was destroyed. - One namespace (e.g., base class) caused another (e.g., derived class) - to be destroyed. Then the namespace was destroyed again later on. - Now, as we iteration through the safeCopy list, we check to make - sure the namespace still exists. - -11/30/96 (bug fix) - Fixed entryfield mega-widget to avoid using the "%s" state field - for key presses. It was using it to find out whether or not Control, - Shift, or Alt keys were being held down during a key press. But this - field confuses Alt with NumLock when you go between Unix and Windows - platforms. The entryfield appeared to be broken when NumLock was - turned on. Nothing is lost if we simply ignore it and let all - keypresses through. - -12/1/96 (installation) - Fixed the way that "pkgIndex.tcl" files are built for Itcl/Itk. - When you build with "--enable-shared", the package files load the - shared library, but when you build without, the package files - use {load "" Itcl} to get the static package. This lets you - do "package require" commands in slave interpreters, even if - things were built with static packages. - -12/1/96 (bug fix) - Fixed how namespaces are deleted when an interpreter is deleted. - Previously, namespaces were deleted after the assocData for the - interp. If any background errors occurred while the namespace - was being deleted, they caused seg faults later on. Now, the - global namespace is cleared (but not deleted) *before* deleting - the assocData. Any background errors are deleted, and the global - namespace is finally deleted at that point. - -12/2/96 (enhancement) JCI - Defined "tkOpenDocument" in tk.tcl so that Macintosh users can - double-click on an [incr Tcl] source file, and itkwish will be - invoked to execute it. - -12/2/96 (bug fix) - Fixed the entryfield widget so that characters like: " [ ] { } \ & - are substituted properly into the "%c" field when doing character - validation. - -12/2/96 (enhancement) **POTENTIAL INCOMPATIBILITY** - Changed the HTML parsing in the scrolledhtml widget to speed it up. - Also, changed the "-feedback" option so that it appends two numbers - on the end of the feedback command: the current position and the - maximum position. This frees the caller from having to figure out - the maximum position. - -12/2/96 (enhancement) - Added "-borderwidth", "-relief" and "-elementborderwidth" options - to the feedback widget, so you can control its appearance a little - better. - -========================================================================== - ------------------------ RELEASE 2.2 - 12/3/96 ------------------------- -========================================================================== - -12/12/96 (installation) - Fixed "iwidgets.tcl" initialization file to rely on the environment - variable IWIDGETS_LIBRARY (if it exists), and use the compiled-in - path as a last resort. That way, the user can override the iwidgets - library with an environment variable setting. - -12/12/96 (installation) - Fixed the "catalog" demo for [incr Widgets] to help support Windows3.1. - The code is now arranged to make it easy to translate between the - real demo names and DOS 8.3 file names. - -12/13/96 (bug fix) - Added a "usual" test for all of the [incr Widgets]. This checks to - make sure that there is a bit of "usual" code for each widget, that - the options in the "usual" code are valid, and that all of the - widgets mix together without errors. - -4/11/97 (enhancement) - Merged in patches for tcl7.6p2/tk4.2p2 (jingham) - -5/17/97 (bug fix) - Fixed itk::Toplevel to have the hull keep the -takefocus option. - This fixed a problem with the tab ring in iwidget dialogs. - -6/1/98 (complete rewrite) - Rewrote the entire package to work with Tcl8.0 namespaces and the - new byte code compiler. - -========================================================================== - ----------------------- RELEASE 3.0a1 - 6/16/98 ------------------------ -========================================================================== - -7/23/98 (bug fix) - Removed references to Tcl internal macros such as TclDecrRefCount. - This was causing problems under Windows, since those macros use - global variables that are not available outside of tcl80.dll. - -7/23/98 (bug fix) - Added my own definition of the assert macro. Since Tcl/Tk doesn't - use assert, the default version was causing build problems with - gcc. - -7/27/98 (configuration change) - Changed all "configure" scripts to rely on tclConfig.sh and tkConfig.sh - for compile options. - -7/27/98 (configuration change) - Changed the initialization process for Itcl/Itk. Both packages now - key off of tcl_library to find their initialization scripts. - -7/27/98 (configuration change) - Removed IWIDGETS_LIBRARY environment variable from the Iwidgets - package. If Iwidgets is installed properly, this variable is not - needed. - -7/29/98 (configuration change) - Added Scott Stanton's patch to the initialization process. The - last-ditch installation directory is no longer compiled into the - itcl sources. Instead, itcl searches for the installation directory - starting from $tcl_library. Also, if the variable itcl::library is - set before loading itcl, then itcl aborts the search and uses that - as its library directory. - -7/30/98 (Macintosh) - Added Jim Ingham's patches for the Mac. - -7/30/98 (configuration) - Fixed Makefiles for Iwidgets 2.2/3.0 to avoid a problem while - installing the demo images/html. The INSTALL_DATA program may - have a relative name (../../config/install-sh) so we must be - careful to "cd" into library, demos, etc., but not into other - directories below them. - -8/8/98 (bug fix) - Fixed "namespace import" to work with autoloading. If you - execute "namespace import iwidgets::*", the auto_import proc - will create stubs for all of the iwidgets commands. Executing - one of the stubs triggers autoloading for the appropriate command. - -8/10/98 (bug fix) - Integrated changes from Scriptics team to work seamlessly with - Tcl 8.0.3. - -8/10/98 (bug fix) - Fixed the iwidgets::optionmenu to work properly under Windows 95/NT. - Extended the "get" method in iwidgets3.0 so that you can query - existing elements from an optionmenu. - -========================================================================== - ------------------------ RELEASE 3.0 - 8/11/98 ------------------------- -========================================================================== - -8/16/98 (bug fix) - Fixed the windows pkgIndex.tcl files for Itcl and Itk to properly - load their .dll. Also fixed iwidgets/catalog to package require - Itcl, Itk, and to import ::itcl::* to get "class" defined. (BW) - -12/21/99 (bug fix) - Fixed tests for auto_mkindex to work properly outside of itkwish. - Tests now include "namespace import itcl::*" instead of assuming that - this behavior is built into the wish. - -4/18/00 (feature enhancement) - Fixed itcl::find to find classes and objects in *all* namespaces - in the interpreter. Until this fix, the itcl::find command would - report only the objects in the active namespace or the global - namespace. Being able to find classes/objects in all namespaces - makes debugging easier. Thanks to Chad Smith for pushing to make - this change happen. - -6/26/00 (bug fix) - Fixed Itcl_ClassVarResolver so that the formal parameters in a - method/proc take precedence over class data members. - -6/30/00 (bug fix) - Fixed all itcl/itk/iwidgets3.0.0 tests to run cleanly with the new - tcltest package. - -7/1/00 (bug fix) - Fixed "itk_component delete" so that the composite option list is - cleaned up whenever a component is deleted. For example, suppose - a component is the sole contributor of -font. When that component - is removed via "itk_component delete", the -font option goes away - as well. Also fixed the handling of the itk-delete-* binding for - the component. When the component is removed, the binding tag - is also removed by itk::remove_destroy_hook. - -7/5/00 (bug fix) - Fixed the check done during object creation to avoid clobbering - existing commands. Previously, itcl would look for any command-- - in the local *and* global namespace--that might be clobbered. - Now, it looks for commands only in the local namespace, since - those are the only ones that could truly be clobbered. - -7/5/00 (cleanup) - Removed obsolete Makefile/configure files in the various "unix" - directories. Makefiles and configure files now reside one level - above, in the standard TEA place. - -7/11/00 (stubs cleanup) <welch@ajubasolutions.com> - Fix the build so static links do not use the stubs library. - -8/1/00 (stubs cleanup) <davygrvy@ajubasolutions.com> - Added missing declarations for Itcl_InitStubs and Itk_InitStubs - and simplified how Itcl Stubs are set in Initialize() of itk_cmds.c - -8/1/00 (Makefile) <welch@ajubasolutions.com> - Added config/installFiles.tcl and changed the various Makefile.in - files to use this instead of install-sh. installFiles.tcl can - optimize out a copy if the target file is already up-to-date. - This eliminates conflicts from parallel builds on different platforms - where one build is zipping up the installed files while another platform - is copying platform-independent files (i.e., the iwidgets demos). - -8/4/00 (stubs cleanup) <davygrvy@ajubasolutions.com> - Fixed dll linkage problem with the prototypes of the 2 XX_InitStubs - functions use. I copied the core too literally. Stubs libraries are - always static, so there's no need to play games with __declspec on - windows. - -8/7/00 (stubs cleanup) <welch@ajubasolutions.com> - Cleaned up use of Itcl_InitStubs by Itk. Finally got it right after - much flailing about. itcl.h has the correct definitions, and - itclStubLib.c has the correct #ifdefs. - Also nuked extra definitions of itclStubsPtr from the itk_cmds.c file. - -8/17/00 (more stubs cleanup) <davygrvy@ajubasolutions.com> - Tcl_InitStubs in itcl/generic/itcl_cmds.c was using the TCL_VERSION macro - set by the tcl.h header. Changed it to be "8.1" instead as it doesn't - matter unless Itcl needs special/new features of the core it's header is - from. But it doesn't.. so hard code it for an 8.1 minimum to make the - Itcl library have a better version range with the core as specific - version tracking with the core isn't needed (at this time). - -========================================================================== - ------------------------ RELEASE 3.2 - 08/18/00 ------------------------ -========================================================================== - -9/22/00 (stubs cleanup) <davygrvy@ajubasolutions.com> - Itcl_InitStub prototype in itcl/generic/itcl.h was getting name mangled - by c++ compilers. Fixed with an 'extern "C"' appropriately applied. - -4/07/01 (bug fix) <davygrvy@pobox.com> - Tcl's internal header, tclInt.h, in 8.4a2 got a small change in the Command - structure that needed 2 changes in Itcl to resolve. 1) #if/#else/#endif blocks - added in itcl_class.c and itc_ensemble.c allowing Itcl to compile. 2) added - a global variable called itclCompatFlags that's sets a flag in Itcl_Init() - that will modify the logic around access to cmdPtr->flags/deleted. This - way, any core compile will yield a fully forward/backward compatible - binary (correct logic set at runtime). - -5/22/01 (bug fixes) <davygrvy@pobox.com> - makefile.vc lives again! Brought back from it's death to conquere windows - once again for users who prefer to avoid (or can't understand or get the tools - installed for) the TEA build system. - - Also, numerous fixes relating to Kevin Kenny's Tcl API mods for better CONST - support. The latest headers for Tcl where throwing warnings all over the place - about type errors. I fixed the sources, but haven't checked against older - headers yet.
\ No newline at end of file |