framework.rst 11.2 KB
Newer Older
1 2 3 4 5 6 7

:mod:`FrameWork` --- Interactive application framework
======================================================

.. module:: FrameWork
   :platform: Mac
   :synopsis: Interactive application framework.
8
   :deprecated:
9 10 11 12 13 14 15 16 17 18


The :mod:`FrameWork` module contains classes that together provide a framework
for an interactive Macintosh application. The programmer builds an application
by creating subclasses that override various methods of the bases classes,
thereby implementing the functionality wanted. Overriding functionality can
often be done on various different levels, i.e. to handle clicks in a single
dialog window in a non-standard way it is not necessary to override the complete
event handling.

19 20 21 22
.. warning::

   This module is removed in 3.0.

23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
Work on the :mod:`FrameWork` has pretty much stopped, now that :mod:`PyObjC` is
available for full Cocoa access from Python, and the documentation describes
only the most important functionality, and not in the most logical manner at
that. Examine the source or the examples for more details.  The following are
some comments posted on the MacPython newsgroup about the strengths and
limitations of :mod:`FrameWork`:


.. epigraph::

   The strong point of :mod:`FrameWork` is that it allows you to break into the
   control-flow at many different places. :mod:`W`, for instance, uses a different
   way to enable/disable menus and that plugs right in leaving the rest intact.
   The weak points of :mod:`FrameWork` are that it has no abstract command
   interface (but that shouldn't be difficult), that its dialog support is minimal
   and that its control/toolbar support is non-existent.

The :mod:`FrameWork` module defines the following functions:


.. function:: Application()

   An object representing the complete application. See below for a description of
   the methods. The default :meth:`__init__` routine creates an empty window
   dictionary and a menu bar with an apple menu.


.. function:: MenuBar()

   An object representing the menubar. This object is usually not created by the
   user.


.. function:: Menu(bar, title[, after])

   An object representing a menu. Upon creation you pass the ``MenuBar`` the menu
   appears in, the *title* string and a position (1-based) *after* where the menu
   should appear (default: at the end).


.. function:: MenuItem(menu, title[, shortcut, callback])

   Create a menu item object. The arguments are the menu to create, the item title
   string and optionally the keyboard shortcut and a callback routine. The callback
   is called with the arguments menu-id, item number within menu (1-based), current
   front window and the event record.

   Instead of a callable object the callback can also be a string. In this case
   menu selection causes the lookup of a method in the topmost window and the
   application. The method name is the callback string with ``'domenu_'``
   prepended.

   Calling the ``MenuBar`` :meth:`fixmenudimstate` method sets the correct dimming
   for all menu items based on the current front window.


.. function:: Separator(menu)

   Add a separator to the end of a menu.


.. function:: SubMenu(menu, label)

   Create a submenu named *label* under menu *menu*. The menu object is returned.


.. function:: Window(parent)

   Creates a (modeless) window. *Parent* is the application object to which the
   window belongs. The window is not displayed until later.


.. function:: DialogWindow(parent)

   Creates a modeless dialog window.


.. function:: windowbounds(width, height)

   Return a ``(left, top, right, bottom)`` tuple suitable for creation of a window
   of given width and height. The window will be staggered with respect to previous
   windows, and an attempt is made to keep the whole window on-screen. However, the
   window will however always be the exact size given, so parts may be offscreen.


.. function:: setwatchcursor()

   Set the mouse cursor to a watch.


.. function:: setarrowcursor()

   Set the mouse cursor to an arrow.


.. _application-objects:

Application Objects
-------------------

Application objects have the following methods, among others:


.. method:: Application.makeusermenus()

   Override this method if you need menus in your application. Append the menus to
   the attribute :attr:`menubar`.


.. method:: Application.getabouttext()

   Override this method to return a text string describing your application.
   Alternatively, override the :meth:`do_about` method for more elaborate "about"
   messages.


.. method:: Application.mainloop([mask[, wait]])

   This routine is the main event loop, call it to set your application rolling.
   *Mask* is the mask of events you want to handle, *wait* is the number of ticks
   you want to leave to other concurrent application (default 0, which is probably
   not a good idea). While raising *self* to exit the mainloop is still supported
   it is not recommended: call ``self._quit()`` instead.

   The event loop is split into many small parts, each of which can be overridden.
   The default methods take care of dispatching events to windows and dialogs,
   handling drags and resizes, Apple Events, events for non-FrameWork windows, etc.

   In general, all event handlers should return ``1`` if the event is fully handled
   and ``0`` otherwise (because the front window was not a FrameWork window, for
   instance). This is needed so that update events and such can be passed on to
   other windows like the Sioux console window. Calling :func:`MacOS.HandleEvent`
   is not allowed within *our_dispatch* or its callees, since this may result in an
   infinite loop if the code is called through the Python inner-loop event handler.


.. method:: Application.asyncevents(onoff)

   Call this method with a nonzero parameter to enable asynchronous event handling.
   This will tell the inner interpreter loop to call the application event handler
   *async_dispatch* whenever events are available. This will cause FrameWork window
   updates and the user interface to remain working during long computations, but
   will slow the interpreter down and may cause surprising results in non-reentrant
   code (such as FrameWork itself). By default *async_dispatch* will immediately
   call *our_dispatch* but you may override this to handle only certain events
   asynchronously. Events you do not handle will be passed to Sioux and such.

   The old on/off value is returned.


.. method:: Application._quit()

   Terminate the running :meth:`mainloop` call at the next convenient moment.


.. method:: Application.do_char(c, event)

   The user typed character *c*. The complete details of the event can be found in
   the *event* structure. This method can also be provided in a ``Window`` object,
   which overrides the application-wide handler if the window is frontmost.


.. method:: Application.do_dialogevent(event)

   Called early in the event loop to handle modeless dialog events. The default
   method simply dispatches the event to the relevant dialog (not through the
   ``DialogWindow`` object involved). Override if you need special handling of
   dialog events (keyboard shortcuts, etc).


.. method:: Application.idle(event)

   Called by the main event loop when no events are available. The null-event is
   passed (so you can look at mouse position, etc).


.. _window-objects:

Window Objects
--------------

Window objects have the following methods, among others:


.. method:: Window.open()

209
   Override this method to open a window. Store the Mac OS window-id in
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340
   :attr:`self.wid` and call the :meth:`do_postopen` method to register the window
   with the parent application.


.. method:: Window.close()

   Override this method to do any special processing on window close. Call the
   :meth:`do_postclose` method to cleanup the parent state.


.. method:: Window.do_postresize(width, height, macoswindowid)

   Called after the window is resized. Override if more needs to be done than
   calling ``InvalRect``.


.. method:: Window.do_contentclick(local, modifiers, event)

   The user clicked in the content part of a window. The arguments are the
   coordinates (window-relative), the key modifiers and the raw event.


.. method:: Window.do_update(macoswindowid, event)

   An update event for the window was received. Redraw the window.


.. method:: Window.do_activate(activate, event)

   The window was activated (``activate == 1``) or deactivated (``activate == 0``).
   Handle things like focus highlighting, etc.


.. _controlswindow-object:

ControlsWindow Object
---------------------

ControlsWindow objects have the following methods besides those of ``Window``
objects:


.. method:: ControlsWindow.do_controlhit(window, control, pcode, event)

   Part *pcode* of control *control* was hit by the user. Tracking and such has
   already been taken care of.


.. _scrolledwindow-object:

ScrolledWindow Object
---------------------

ScrolledWindow objects are ControlsWindow objects with the following extra
methods:


.. method:: ScrolledWindow.scrollbars([wantx[, wanty]])

   Create (or destroy) horizontal and vertical scrollbars. The arguments specify
   which you want (default: both). The scrollbars always have minimum ``0`` and
   maximum ``32767``.


.. method:: ScrolledWindow.getscrollbarvalues()

   You must supply this method. It should return a tuple ``(x, y)`` giving the
   current position of the scrollbars (between ``0`` and ``32767``). You can return
   ``None`` for either to indicate the whole document is visible in that direction.


.. method:: ScrolledWindow.updatescrollbars()

   Call this method when the document has changed. It will call
   :meth:`getscrollbarvalues` and update the scrollbars.


.. method:: ScrolledWindow.scrollbar_callback(which, what, value)

   Supplied by you and called after user interaction. *which* will be ``'x'`` or
   ``'y'``, *what* will be ``'-'``, ``'--'``, ``'set'``, ``'++'`` or ``'+'``. For
   ``'set'``, *value* will contain the new scrollbar position.


.. method:: ScrolledWindow.scalebarvalues(absmin, absmax, curmin, curmax)

   Auxiliary method to help you calculate values to return from
   :meth:`getscrollbarvalues`. You pass document minimum and maximum value and
   topmost (leftmost) and bottommost (rightmost) visible values and it returns the
   correct number or ``None``.


.. method:: ScrolledWindow.do_activate(onoff, event)

   Takes care of dimming/highlighting scrollbars when a window becomes frontmost.
   If you override this method, call this one at the end of your method.


.. method:: ScrolledWindow.do_postresize(width, height, window)

   Moves scrollbars to the correct position. Call this method initially if you
   override it.


.. method:: ScrolledWindow.do_controlhit(window, control, pcode, event)

   Handles scrollbar interaction. If you override it call this method first, a
   nonzero return value indicates the hit was in the scrollbars and has been
   handled.


.. _dialogwindow-objects:

DialogWindow Objects
--------------------

DialogWindow objects have the following methods besides those of ``Window``
objects:


.. method:: DialogWindow.open(resid)

   Create the dialog window, from the DLOG resource with id *resid*. The dialog
   object is stored in :attr:`self.wid`.


.. method:: DialogWindow.do_itemhit(item, event)

   Item number *item* was hit. You are responsible for redrawing toggle buttons,
   etc.