Change Log for PLIB Version 0.4.3

:Author:        Peter A. Donis
:Last Updated:  28 June 2008

Version 0.4.3
-------------

- Added a ``plib-setup-paths.py`` post-install
  script to determine the standard path names
  that are exported in ``plib.stdlib``, instead
  of determining them on the fly each time that
  package is imported (which is overkill since
  they should not change). Also added some new
  heuristics for determining the path names.

- Added a ``setuputils`` module in the base
  ``plib`` package to provide common code for
  the post-install scripts.

- Added code to the ``BaseDispatcher`` class in
  ``plib.stdlib.async`` to fix a number of minor
  issues with ``asyncore.dispatcher``.

- Moved the ``ReadWrite`` mixin class from
  ``plib.stdlib.async`` to ``plib.classes``, and
  moved the other async classes in ``plib.stdlib``
  into a new ``AsyncServer`` module. The client
  and server communicator classes are now mixins
  so that they can be used with different protocol
  read/write mixin classes.

Version 0.4.2
-------------

- Added support for Qt 4 as a GUI toolkit (it is
  different enough from Qt 3 that it's easier to make
  it separate than to try and extend the current Qt
  support to cover it). *NOTE: Qt 4 support is still
  experimental; some widgets (in particular the table
  widget) are still buggy.*

- Added ``process_events`` method to ``PApplication``
  objects to allow GUI events to be handled while
  other processing is going on--the typical use case
  is to call this method as a callback from an
  asynchronous I/O loop. Note that this method should
  not be called from event handlers or any other code
  that might recursively call into the GUI event loop.

- Added action images for the ``darwin`` platform to
  the GUI images available.

Version 0.4.1
-------------

- Added ``PServerBase`` class to ``plib.classes`` to
  factor out functionality common to all types of
  servers (sync, async, and forking).

- Added ``PAsyncServer`` class to ``plib.classes``,
  mixes ``PServerBase`` and ``ServerDispatcher`` from
  the ``plib.stdlib.async`` module.

- Added a clause in the ``do_loop`` method of
  ``BaseDispatcher`` in ``plib.stdlib.async`` to
  allow the callback function to break out of the
  polling loop by returning ``False``.

- Added ``AsyncRequestHandler`` class to the
  ``plib.stdlib.async`` module so that the
  ``ServerCommunicator`` class can remain general.

- Added a ``try/finally`` clause to the ``serve_forever``
  method of ``ServerDispatcher`` in ``plib.stdlib.async``
  and added a similar method to ``SigMixin`` in
  ``plib.stdlib.SigSocketServer`` to ensure that
  ``server_close`` gets called if an exception is thrown
  (previously only ``PTCPServer`` had this included).

- Added ``_panels.py`` unit to ``plib.gui``, containing
  the ``PMainPanel`` class, a ``PAutoPanel`` specialized
  for use as the main panel of your application (i.e.,
  the client widget of the main window). Changed the
  ``pyidserver-gui.py`` example program to use the new
  main panel class.

- Added ``PTextFile`` class to ``plib.gui.classes`` to
  allow read/write to a PTextDisplay as a file-like
  object (this was previously implemented only in the
  ``pyidserver-gui`` example program).

Version 0.4
-----------

- ``PTCPServer`` now correctly calls ``server_close``
  whenever it receives a signal that is in its list of
  terminating signals; this ensures that it shuts
  itself down properly and also ensures that the
  inherited ``server_close`` gets called to close the
  socket.

- Added ``PGroupBox`` widget to ``plib.gui``: basically
  a ``PPanel`` with a box and caption around its child
  widgets. Also added ``PAutoGroupBox`` to allow
  specification of child widgets using Python data
  structures.

- Added ``PTextDisplay`` widget, which is basically a
  read-only version of PEditControl. The example program
  ``pyidserver-gui.py`` now uses this widget to display
  output.

- Changed ``PTopWindow`` class fields for window
  placement on screen: the ``placement`` class field
  is now a 2-tuple ``(size_type, pos_type)``, whereUTILS
  the ``size_type`` can be:
  
  * ``SIZE_NONE``,
  * ``SIZE_CLIENTWRAP``,
  * ``SIZE_MAXIMIZED``,
  * ``SIZE_OFFSET``,
  
  and the ``pos_type`` can be:
  
  * ``MOVE_NONE``,
  * ``MOVE_CENTER``.

- Enabled font settings on all widgets (previously only
  "control" type widgets had them).

- The ``plib.gui.specs`` module now allows you to use
  custom widget classes when building specs, by setting
  module variables.

- Also added ``get_listview`` to ``plib.gui.specs``.

- ``PPrefsDialog`` now supports all three types of INI
  file option specs.

- The preferences dialog now also allows two choices
  for the section grouping: each section can be a tab
  in a tab widget (the default), or a group box (just
  pass ``SECTION_GROUPBOX`` as the ``style`` parameter
  to the constructor).

- Added a ``gui_test`` variable in ``plib.gui._gui`` to
  allow testing of experimental additional toolkits that
  are not installed in PLIB. See the comments in the
  ``plib.gui._gui`` module for details.

- Fixed bug in ``plib.ini`` where int and boolean values
  were not being written correctly to INI files.

- Added ``async.py`` module in ``plib.stdlib``, providing
  basic asynchronous client/server classes (building on
  the ``asyncore`` module in the Python standard library).

- Updated to version 0.4.2 of ``SetupHelper``.

Version 0.3
-----------

- Added ``__version__`` variable to the
  top-level ``plib`` namespace. All of the
  example programs now use the plib version
  as their version number by importing this
  variable.

- Added ``PPrefsDialog`` to ``PLIB.GUI``: a
  preferences dialog that automatically builds
  its interface from a ``PIniFile``. Added a
  preferences dialog to the ``scrips-edit``
  example program to demonstrate this
  functionality.

- Added ``specs`` module to ``PLIB.GUI`` to provide
  helper variables and functions for specifying
  GUI layouts. The ``PPrefsDialog`` class above
  uses this module, and the ``pyidserver-gui.py``
  example program is also modified to use this
  functionality.

- Added ``clientwrap`` class field to ``PTopWindow``
  to automatically size the window to fit its
  client widget; this is now the default behavior.

- Added ``SIGNAL_CLOSING`` signal in ``PLIB.GUI``
  to allow notification when window has accepted
  a close but has not yet closed.

- Moved the ``ModuleProxy`` class from
  ``PLIB.CLASSES`` to ``PLIB.UTILS``, since the
  latter is intended to be closer to the 'root'
  of the dependency tree.

- Added the ``dotted_import`` function to
  ``PLIB.STDLIB`` for convenience when using the
  ``__import__`` builtin with dotted names (the
  code for this function originally came from
  the Python 2.6 documentation).

- Moved the ``options`` module from ``PLIB.UTILS``
  to ``PLIB.STDLIB`` since it basically wraps
  the standard library ``optparse`` module.

- Added the ``version`` module to ``PLIB.UTILS``,
  providing some extensions of the Python
  distutils version number functionality. Also
  added a doctest for this module.

- Added support in ``PLIB.XML`` for manually
  controlling the XML declaration and doctype
  string during serialization.

- The protocol and port number controls in the
  ``pyidserver-gui.py`` example are now disabled
  if DNS only is checked (this alerts the user
  that protocol and port number parameters are
  ignored by ``pyidserver`` in DNS only mode).

- The license for ``plib/test/runtests.py``, the
  generic test-running script, is changed to the
  PSF license so it can be detached from the rest
  of PLIB and used in non-GPL projects.

- Updated to version 0.4 of ``SetupHelper``.

Version 0.2.1
-------------

- Fixed bug in ``PLIB.GUI`` that was appending
  spurious text to ``PMainWindow`` captions.

- Updated to version 0.3.1 of ``SetupHelper``.

Version 0.2
-----------

- Added status bar to ``PMainWindow``, and added demo
  functionality for the status bar to ``pxmlview``.

- Added support for more widget signals (selection
  changed signals for combo box, list view, and tab
  widget), and ensured that all signal-handling
  widgets derive from either ``_PDialogControl`` or
  ``_PNotifyControl``.

- Corrected tab add/delete behavior for tab widget.

- Added private ``_parent`` class field to tab widget,
  for consistency with other non-dialog control
  widgets.

- Added checks to ``PEditor`` to make sure main widget
  supports the editor protocol.

- Improved handling of widget geometry; passing ``None``
  as one of the geometry parameters means that
  parameter doesn't get changed from its previous
  value (which will usually be the default).

- Changed ``PLabel`` to ``PHeaderLabel``, and made
  ``plib.gui.classes`` and ``plib.gui.edit`` into
  private modules; their classes now appear in the
  ``plib.gui.main`` namespace with all the others.

- Added support in ``PIniFile`` for linking options to
  named attributes on the ``PIniFile`` object, instead of
  having get/set functions.

- Added tab widget to ``pxmlview.py`` example program to
  allow viewing multiple files; added support for
  passing multiple file names on the command line.

- Added basic URL parsing to the pyidserver.py example
  program; it now extracts the protocol and port
  number from URLs of the form::

    <protocol>://<url>:<port>

  Protocol and port specifiers in the URL override
  any specifiers in command-line options.

- Added new example program, ``scrips.py``, and its GUI,
  ``scrips-edit.py``; these are programs to keep track
  of prescriptions, demonstrating the table widget
  and INI file functionality in PLIB.

- The ``setup.py`` script now uses a 'generic' helper
  module, ``SetupHelper``; all that is done in setup.py
  itself is to define variables and then call the
  helper module entry point. The SetupHelper module
  is available as its own PyPI project, ``setuphelper``.

- Since SetupHelper handles running post-install
  scripts, the ``install-all`` shell script is no longer
  needed and has been removed.

Version 0.1
-----------

Initial release.
