]> SALOME platform Git repositories - tools/eficas.git/blob - Pmw/Pmw_1_2/doc/todo.html
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Pmw / Pmw_1_2 / doc / todo.html
1
2     <html>
3     <head>
4     <meta name="description" content="Pmw - a toolkit for building high-level compound widgets in Python">
5     <meta name="content" content="python, megawidget, mega widget, compound widget, gui, tkinter">
6     <title>Pmw todo list</title>
7     </head>
8
9     <body bgcolor="#ffffff" text="#000000" link="#0000ee"
10         vlink="551a8b" alink="ff0000">
11
12     <h1 ALIGN="CENTER">Pmw todo list</h1>
13     
14 <p>
15 This is a long list of suggestions and enhancements for Pmw.  If
16 you are interested in doing any of these, please let the Pmw maintainer
17 (<em>gregm@iname.com</em>) know.</p>
18
19 <p><strong>New Pmw megawidgets</strong></p>
20 <ul><li><p>Multicolumn listbox.</p>
21 <p>      Useful features - smooth scrolling, embedded images, different
22       fonts and colours, text correctly masked when it is longer than
23       its column width, interactive resizing of columns.</p>
24
25 <p>      Probably should be implemented as canvas widget rather than by
26       using multiple frames or multiple listboxes.  There would be a
27       lot of work needed to position all the elements - you can't just
28       pack or grid them.</p>
29
30
31 </li>
32 <li><p>File dialog.</p>
33
34 </li>
35 <li><p>Main window class (App class), with menu bar, information line
36       with status boxes and an about box.  (See iwidgets' mainwindow
37       class for example.) This should handle creation of multiple main
38       windows, recycling of unused main windows and should exit if
39       last open main window is closed.</p>
40
41 </li>
42 <li><p>Searchable text megawidget.</p>
43
44 </li>
45 <li><p>Tree browser.</p>
46
47 </li>
48 <li><p>Check out Doug Hellmann's contributed megawidgets at
49       &lt;http://www.mindspring.com/~doughellmann/Projects/PmwContribD&gt; or
50       &lt;http://members.home.net/doughellmann/PmwContribD/&gt;
51       and integrate into Pmw.</p>
52
53 </li></ul>
54
55 <p><strong>Changes to current megawidgets</strong></p>
56 <p>    MegaToplevel</p>
57 <ul><li><p>Modify activate() geometry argument to allow window positioning
58           relative to the pointer, another window or the screen and
59           allow the centering of the window relative to the
60           positioning point or by a specified offset.  Also add the
61           ability to position the window so that the mouse is over a
62           particular widget in the toplevel.</p>
63 <p>          Should handle all combinations of</p>
64 <dl><dd><pre> when (always/first)
65  where (center/geometry/mouse)
66  parent (screen/window)
67
68  and None (don't position)</pre></dd></dl>
69
70
71 <p>          Check Tix4.1.0/library/DialogS.tcl center method for how to
72           center over another window</p>
73
74 <p>          Check iwidget's shell.itk for code to center widget over
75           screen or another widget.</p>
76
77 <p>          See Pmw.Balloon code for how to position over pointer.</p>
78
79 <p>          Tcl code to center over another (parent) window:</p>
80 <dl><dd><pre> # center client relative to master (default xoff, yoff = -1)
81  set geomaster [split [wm geometry $master] "x+"]
82  set geoclient [split [wm geometry $client] "x+"]
83
84  if {$xoff == -1} {
85    set xoff [expr (
86      ([lindex $geomaster 0] - [lindex $geoclient 0]) / 2)]
87  }
88  set newxpos [expr [lindex $geomaster 2] + $xoff]
89
90  if {$yoff == -1} {
91    set yoff [expr (
92      ([lindex $geomaster 1] - [lindex $geoclient 1]) / 2)]
93  }
94  set newypos [expr [lindex $geomaster 3] + $yoff]
95
96  wm geometry $client +$newxpos+$newypos</pre></dd></dl>
97
98
99 <p>          More tcl code to center dialog over another (parent) window:</p>
100 <dl><dd><pre> (args: parent dlg)
101  # First, display the dialog offscreen to get dimensions.
102  set screenW [winfo screenwidth $parent]
103  set screenH [winfo screenheight $parent]
104  set w [expr $screenW + 1]
105  wm geometry $dlg +$w+0
106  update
107
108  # Get relative center of parent. 
109  set w [winfo width $parent]
110  set h [winfo height $parent]
111  set w [expr $w/2]
112  set h [expr $h/2]
113
114  # Get and add screen offset of parent.
115  set w [expr $w + [winfo rootx $parent]]
116  set h [expr $h + [winfo rooty $parent]]
117
118  # Get dimensions of dialog.
119  set dlgW [winfo width $dlg]
120  set dlgH [winfo height $dlg]
121
122  # Make adjustments for actual dimensions of dialog.
123  set w [expr $w - $dlgW / 2]
124  set h [expr $h - $dlgH / 2]
125
126  # Let's keep the entire dialog onscreen at all times.
127  # Center in screen if things are awry.
128  set recenter 0
129  if { $w &lt; 0 } { set recenter 1 }
130  if { $h &lt; 0 } { set recenter 1 }
131  if { [expr $w + $dlgW] &gt; $screenW } { set recenter 1 }
132  if { [expr $h + $dlgH] &gt; $screenH } { set recenter 1 }
133  if { $recenter } {
134    set w [expr ($screenW -$dlgW) / 2]
135    set h [expr ($screenH - $dlgH) / 2]
136  }
137
138  wm geometry $dlg +$w+$h</pre></dd></dl>
139
140
141
142 </li>
143 <li><p>Add geometry argument to show() (same as activate() above).</p>
144
145 </li></ul>
146
147 <p>    Dialog</p>
148 <ul><li><p>Add label (header?) to Dialog class.  May not be necessary, or
149           too complicated.</p>
150
151 </li></ul>
152
153 <p>    ButtonBox</p>
154 <ul><li><p>When a horizontal ButtonBox is stretched, the left button
155           stays anchored to the left edge and there is too much space
156           between the last button and the right edge.</p>
157
158 </li>
159 <li><p>Add an option to either evenly space the buttons across the
160           button box, or to keep them together and justify them to the
161           left, right or center.  Check that deleting buttons works
162           correctly.</p>
163
164 </li></ul>
165
166 <p>    ComboBox</p>
167 <ul><li><p>Remove arrowrelief option from ComboBox and do what counter
168           does:  gets value of arrow's relief just before sinking it,
169           then restores it later.</p>
170
171 </li>
172 <li><p>Change bindings: remove all bindings from arrow key and remove
173           arrow key from &lt;tab&gt; focus sequence; only implement these
174           bindings on the entry widget:</p>
175 <dl><dd><pre> Up    popup dropdown list, scroll up if already displayed
176  Down  popup dropdown list, scroll down if already displayed
177  Esc   popdown dropdown list, return entry to previous value
178  Enter popdown dropdown list, execute current selection</pre></dd></dl>
179
180 <p>          Remove bindings from listbox and scrollbar(s), so that all
181           bindings are via the entry widget?</p>
182
183
184 </li>
185 <li><p>When entering keys when list is displayed, scroll list to
186           first entry beginning with entered keys.  If no match,
187           scroll list to top.</p>
188
189 </li>
190 <li><p>Remove many of the arrow bindings from Pmw.ComboBox - there
191           are just too many key bindings on the arrow button.  There
192           is no need for it to respond to keys such as the up/down
193           keys when the adjacent Entry widget already does so.  I
194           propose to remove all Pmw.ComboBox arrow button key bindings
195           except for &lt;space&gt;, which can be used to bring up the
196           dropdown list.  The Entry widget behaviour would remain
197           unchanged:  when it has focus, you can use the up/down keys
198           to go to the next/previous entries and then use &lt;Return&gt; to
199           invoke the selection command.</p>
200 <p>          Alternatively, make the bindings the same as the MS-Windows
201           combobox. (Use the url entry field in Navigator or IE as an
202           example of MS-Windows behaviour).  These have been reported
203           to be:</p>
204 <ul><li><p>All mouse actions are exclusively triggered by the left
205               button.</p>
206
207 </li>
208 <li><p>Right button displays "Direkthilfe" on my german system
209               ("Direct Help").  This is a floating button, that
210               triggers display of a tool tip like the |?| button that
211               appears next to the |x| at the right end of the title
212               bar of some native windows dialogs.</p>
213
214 </li>
215 <li><p>The arrow is very slim (acutally flat:  width/height is
216               about 2/1)</p>
217
218 </li>
219 <li><p>Entry and popup have the same color ("window color")</p>
220
221 </li>
222 <li><p>The popup has a 1 pixel dark border, no spacing between
223               popup and scrollbar.</p>
224
225 </li>
226 <li><p>If the box has the focus, the full entry is displayed in
227               "selected" style.</p>
228
229 </li>
230 <li><p>If the box has the focus, up and left keys rotate items
231               up, down and right keys rotate items down, all with
232               immediate effect.</p>
233
234 </li>
235 <li><p>If the box has the focus, keys a-z (not case sensitive)
236               rotate through the items with same first character, with
237               immediate effect.</p>
238
239 </li>
240 <li><p>No separate focus for the arrowbutton</p>
241
242 </li>
243 <li><p>Discussing how the combobox behaves with arrow keys when
244               it has the focus:  "The concept is almost identical to
245               what you already have, just gives more visual feedback. 
246               In your current implementation you allow to rotate
247               through the values with the up and down arrow keys,
248               showing the strings in the entryfield, and accepting the
249               values when the user presses the spacebar (hmmm, how can
250               I exit this without moving back to the original value
251               manually?).  On Windows, the choice is not shown in the
252               entryfield, but the popup opens when you press the up or
253               down arrow keys, as if you clicked on the arrowbutton,
254               and you then navigate the values in the listbox.  This
255               avoids the display of not finally selected values in the
256               entryfield and is a lot more obvious and less confusing. 
257               The current behaviour certainly confused me, which is
258               why I first proposed the changes to the moveup/down
259               methods." (Georg Mischler)</p>
260
261 </li></ul>
262
263 <p>          Also, check bindings on other megawidgets for consistency.</p>
264
265
266 </li>
267 <li><p>Modify Pmw.ComboBox so that the width of the entry widget is
268           forced to be the same as the width of the dropdown listbox. 
269           If the "width" option to the standard listbox is 0, Tk sets
270           the requested width of the listbox to be just large enough
271           to hold the widest element in the listbox.  Using this
272           option, I can see that listbox.winfo_reqwidth() is changing
273           as I insert items into an unmapped listbox.  The question
274           is, how do I get notified of these events so that I can set
275           the width of the entry?</p>
276 <p>          The problem is that the listbox is in another toplevel which
277           has not yet been displayed, so I can't bind to &lt;Configure&gt;
278           to determine its width.</p>
279
280 <p>          One suggestion is to override the insert and delete methods
281           of the Listbox class.  The problem with this is what if the
282           font changed, or the borderwidth, etc?  You would need to
283           override and check many more methods.</p>
284
285
286 </li>
287 <li><p>Add ability to tearoff dropdown list (suggested by Dean N. 
288           Williams).</p>
289
290 </li>
291 <li><p>Should be able to disable/enable arrow button.</p>
292
293 </li></ul>
294
295 <p>    Counter</p>
296 <ul><li><p>Add option for different increment/decrement behaviour.  For
297           example, assuming increment is 1:</p>
298 <ol><li><p>Current behaviour - move to the next multiple of the
299                increment, eg:  1.0 -&gt; 2.0, 1.234 -&gt; 2.0</p>
300
301 </li>
302 <li><p>Add or subtract the increment to whatever is displayed,
303                eg:  1.0 -&gt; 2.0, 1.234 -&gt; 2.234</p>
304
305 </li>
306 <li><p>Move to the next multiple of the increment, offset by some value.
307                eg: (if offset is 0.5) 0.5 -&gt; 1.5, 1.234 -&gt; 1.5, 1.678 -&gt; 2.5</p>
308
309 </li></ol>
310
311 </li>
312 <li><p>Add wrap option (to wrap around at limits) (then don't need
313           time24 arg to <strong>'time'</strong> datatype).</p>
314
315 </li>
316 <li><p>Add a state option to disable Counter.</p>
317
318 </li>
319 <li><p>Add option to Counter to allow the buttons to be on the same
320           side, one on top of the other, like Tix, Itcl, Motif,
321           Windows 95, etc.  There should probably also be an option to
322           lay the current large buttons on the same side of the entry
323           field, next to each other.</p>
324
325 </li>
326 <li><p>Redo TimeCounter using vertical Counter, add limitcommand
327           option to Counter to allow overflow from seconds to minutes
328           to hours</p>
329
330 </li></ul>
331
332 <p>    Arrowed megawidgets (Counter, ComboBox, TimeCounter)</p>
333 <ul><li><p>Potential construction speed up if Canvas arrows are replaced 
334           by Label with Bitmap or BitmapImage.  The hard part would be
335           to make the bitmap change size depending on size of Label.</p>
336
337 </li>
338 <li><p>Pmw.drawarrow should draw arrows which look like Tk cascade
339           menu arrows.</p>
340
341 </li></ul>
342
343 <p>    EntryField</p>
344 <ul><li><p>Can it be modified to change all entered characters to upper
345           or lower case automatically?  Or first-upper or
346           first-of-each-word-upper?</p>
347
348 </li>
349 <li><p>If the validity of the currently displayed text is ERROR,
350           allow any changes, even those which result in invalid text. 
351           This is useful when invalid data has been given to the
352           <strong>value</strong> option and the user is trying to correct it.</p>
353
354 </li></ul>
355
356 <p>    LabeledWidget</p>
357 <ul><li><p>Add tix-style border.</p>
358
359 </li></ul>
360
361 <p>    MenuBar</p>
362 <ul><li><p>Maybe Pmw.MenuBar should also have (optional) balloon help
363           for menu items as well as menu buttons.  I am not sure
364           whether users would find this useful.</p>
365
366 </li>
367 <li><p>The status help hints do not appear when using F10/arrow
368           keys.</p>
369
370 </li>
371 <li><p>Look at the Tk8.0 menu demo and check the help bindings for
372           ideas, in particular, how can you get help when using
373           keyboard bindings.</p>
374
375 </li>
376 <li><p>Check the new menu features in Tk8.0 for creating "native"
377           menu bars and the special ".help" menu.</p>
378
379 </li>
380 <li><p>Add index() method.</p>
381
382 </li>
383 <li><p>Add a <strong>'position'</strong> option to addmenu and deletemenu methods. 
384           This option should accept an index number, a menuName or
385           <strong>Pmw.END</strong>.</p>
386
387 </li>
388 <li><p>Look at itcl menubar for ideas.</p>
389
390 </li></ul>
391
392 <p>    Balloon</p>
393 <ul><li><p>Positioning of the balloon with respect to the target
394           widget or canvas item: There are a number of ways that
395           Pmw.Balloon could be improved.  For example, currently the
396           the top left corner of the balloon is positioned relative to
397           the bottom left corner of the target, offset by the
398           [xy]offset options.  These options apply to all targets -
399           they can not be set differently for different targets.</p>
400 <p>          To make it more configurable, the user should be able to
401           specify, for each target:</p>
402 <ul><li><p>the base position in the target relative to which the
403               balloon should be placed (n, s, e, w, nw, sw, ne, se, c)
404               (Currently sw)</p>
405
406 </li>
407 <li><p>the x and y offsets (Default (20, 1))</p>
408
409 </li>
410 <li><p>the position in the balloon that should be placed at the
411               offset position (n, s, e, w, nw, sw, ne, se, c)
412               (Currently nw)</p>
413 <p>              Note, if this is anything other than nw,
414               update_idletasks() will need to be called to get the
415               size of the balloon before it is positioned - there is a
416               possibility that this may cause weird ugly flashing.</p>
417
418
419 </li>
420 <li><p>whether either the base x or y position should be taken
421               relative to the current mouse position rather than as
422               one of the corners of the target.  This would be useful
423               for large targets, such as text widgets, or strange
424               shaped canvas items.  This could be specified using
425               special base positions, such as (nm, sm, em, wm).  For
426               example, for <strong>'sm'</strong>, the x base position is the mouse x
427               position and y base position is the bottom (south) edge
428               of the target.</p>
429
430 </li></ul>
431
432 <p>          The user should be able to specify global defaults for all
433           of these, as well as be able to override them for each
434           target.  The Pmw.Balloon options and their defaults could
435           be:</p>
436 <dl><dd><pre> basepoint   sw        # Position on target.
437  anchor      nw        # Position on the balloon
438  xoffset     20        # x distance between basepoint and anchor
439  yoffset     1         # y distance between basepoint and anchor</pre></dd></dl>
440
441
442 <p>          To be able to override these, the bind() and tagbind()
443           methods would have to accept these as additional arguments. 
444           Each would default to None, in which case the default values
445           at the time the balloon is deiconified would be used.</p>
446
447 <p>          I'm not sure about how to handle the case when the balloon
448           is configured to come up under the mouse.  When this happens
449           the balloon flashes on and off continuously.  This can
450           happen now if you set the yoffset to a negative number. 
451           Should the balloon widget detect this and do something about
452           it?</p>
453
454
455 </li>
456 <li><p>Add showballoon(x, y, text) method to Balloon and use in
457           balloon help for a listbox:</p>
458 <p>          On 3 Dec, Michael Lackhoff wrote:</p>
459
460 <dl><dd><pre> And another question:
461  Is it possible to create a balloon-help for the entries
462  in the listbox?  Not all the information is in the
463  listbox and it would be nice if a balloon help could
464  give addtional information.</pre></dd></dl>
465
466 <p>          Rather than popup a balloon help window as the mouse moves
467           over items in the listbox, I think it would be better if it
468           pops up after you clicked on an item (or a short time
469           afterwards).  Pmw.Balloon displays the balloon help a short
470           time after the mouse enters a widget, so is not directly
471           usable in this case.  However, a method could be added to
472           Pmw.Balloon to request it to popup the balloon at a
473           particular x,y position.  This method could be called from
474           the listbox_focus method above.  Something like:</p>
475 <dl><dd><pre> def listbox_focus(self, event):
476      self.indexlist.component('listbox').focus_set()</pre></dd></dl>
477
478 <dl><dd><pre>     text = self.indexlist.getcurselection()
479      # expand text to whatever you want:
480      text = 'This is ' + text
481      self.balloon.showballoon(x, y, text)</pre></dd></dl>
482
483
484 <p>          The Pmw.Balloon showballoon() method would have to set a
485           timer which sometime later calls another method which
486           displays the text.  You would also need to bind
487           &lt;ButtonRelease-1&gt; to a hideballoon() method which withdraws
488           the popup.</p>
489
490
491 </li>
492 <li><p>The balloon can be displayed off-screen if the window is
493           near the edge of the screen.  Add a fix so that the balloon
494           always stays on the screen (but does not popup under the
495           mouse, otherwise it will immediately pop down).</p>
496
497 </li>
498 <li><p>Add a fix so that the balloon does not disappear if the
499           mouse enters it.  Could do this by setting a short timer on
500           the Leave event before withdrawing the balloon and if there
501           is an Enter event on the balloon itself, do not withdraw it.</p>
502
503 </li>
504 <li><p>For tagged items in text widgets, the balloon is placed
505           relative to the character in the tagged item closest to the
506           mouse.  This is not consistent:  in the other cases
507           (including canvas), the balloon is placed relative to the
508           bottom left corner of the widget or canvas item.  This
509           should also be the case for text items.</p>
510
511 </li>
512 <li><p>Is the new (in Tk8) "&lt;&lt;MenuSelect&gt;&gt;" event useful for
513           balloon and/or status help.</p>
514
515 </li></ul>
516
517 <p>    MessageBar</p>
518 <ul><li><p>Finish logmessage functionality.</p>
519
520 </li>
521 <li><p>Add colours and fonts to MessageBar message types.  For
522           example, systemerror message types could have bold font on a
523           red background.</p>
524
525 </li>
526 <li><p>Add message logging history view (like the ddd debugger).</p>
527
528 </li></ul>
529
530 <p>    NoteBook</p>
531 <ul><li><p>Notebook should recalculate layout if the requested size of a tab
532           changes (eg font size, text, etc).</p>
533
534 </li>
535 <li><p>The tabpos option should accept <em>s</em>, <em>e</em> and <em>w</em> as well as <em>n</em>.</p>
536
537 </li>
538 <li><p>Possible new options (borrowed from iwidgets):</p>
539 <ul><li><p><strong>equaltabs</strong></p>
540 <p>                If set to true, causes horizontal tabs to be equal in
541                 in width and vertical tabs to equal in height.</p>
542
543 <p>                Specifies whether to force tabs to be  equal  sized  or
544                 not.  A  value of true means constrain tabs to be equal
545                 sized. A value of false allows each tab to  size  based
546                 on  the  text label size. The value may have any of the
547                 forms accepted by the  Tcl_GetBoolean,  such  as  true,
548                 false, 0, 1, yes, or no.</p>
549
550 <p>                For horizontally positioned tabs (tabpos is either s or
551                 n),  true  forces all tabs to be equal width (the width
552                 being equal to the longest label plus any  padX  speci-
553                 fied). Horizontal tabs are always equal in height.</p>
554
555 <p>                For vertically positioned tabs (tabpos is either  w  or
556                 e), true forces all tabs to be equal height (the height
557                 being equal to the height of the label with the largest
558                 font).  Vertically  oriented  tabs  are always equal in
559                 width.</p>
560
561 <p>                Could have a special value which sets equal sized and
562                 also forces tabs to completely fill notebook width
563                 (apparently like
564                 Windows).</p>
565
566
567 </li>
568 <li><p><strong>tabgap</strong></p>
569 <p>                Specifies the amount of pixel space  to  place  between
570                 each tab. Value may be any pixel offset value. In addi-
571                 tion, a special keyword overlap  can  be  used  as  the
572                 value to achieve a standard overlap of tabs. This value
573                 may have any of the forms acceptable to Tk_GetPixels.  </p>
574
575
576 </li>
577 <li><p><strong>raiseselect</strong></p>
578 <p>                Sets whether to raise selected tabs slightly (2 pixels).</p>
579
580 <p>                Specifes whether to slightly  raise  the  selected  tab
581                 from  the rest of the tabs. The selected tab is drawn 2
582                 pixels closer to the outside of  the  tabnotebook  than
583                 the  unselected  tabs.  A  value  of true says to raise
584                 selected tabs, a value of false turns this feature off.
585                 The  default  is  false.  The value may have any of the
586                 forms accepted by the  Tcl_GetBoolean,  such  as  true,
587                 false, 0, 1, yes, or no.</p>
588
589
590 </li>
591 <li><p><strong>bevelamount</strong></p>
592 <p>                Specifies pixel size of tab corners. 0 means no corners.</p>
593
594
595 </li></ul>
596
597 </li>
598 <li><p>There should be a way to temporarily hide a page, without
599             deleting it (like pack_forget).  (Suggested by Michel Sanner)</p>
600
601 </li></ul>
602
603 <p>    OptionMenu</p>
604 <ul><li><p>Should accept focus and obey up and down arrow keys.</p>
605
606 </li></ul>
607
608 <p>    PanedWidget</p>
609 <ul><li><p>Add index() method</p>
610
611 </li>
612 <li><p>Modify all methods so that they accept <strong>Pmw.END</strong> as a pane
613           identifier as well as an index or a name.</p>
614
615 </li>
616 <li><p>Check iwidgets pane and panedwindow classes.</p>
617
618 </li></ul>
619
620 <p>    RadioSelect</p>
621 <ul><li><p>Add insert() and delete() methods.</p>
622
623 </li>
624 <li><p>The index method should have <strong>forInsert</strong> argument.</p>
625
626 </li>
627 <li><p>Add Pmw.SELECT to index() method.  For single selectmode
628           this returns an integer, for multiple selectmode this
629           returns a list of integers.</p>
630
631 </li>
632 <li><p>Add option to set background color on selected buttons. 
633           Maybe should also be able set selected foreground as well. 
634           Any others?</p>
635
636 </li></ul>
637
638 <p>    LogicalFont</p>
639 <ul><li><p>Add boldFixed fonts,</p>
640
641 </li>
642 <li><p>Search for closest size font if no exact match.</p>
643
644 </li>
645 <li><p>Maybe replace with Tk8.0 font mechanism.</p>
646
647 </li>
648 <li><p>Can the Tk8.0 font measuring functionality be used in Pmw somehow?</p>
649
650 </li></ul>
651
652 <p>    Scrolled widgets</p>
653 <ul><li><p>Can some common scrolling methods be factored out, either as
654           a base class, "ScrolledMixin" mixin class or as helper functions? 
655           Candidate methods: constructor, destroy, interior, _hscrollMode,
656           _vscrollMode, _configureScrollCommands, _scrollXNow, _scrollYNow,
657           _scrollBothLater, _scrollBothNow, _toggleHorizScrollbar,
658           _toggleVertScrollbar.</p>
659
660 </li>
661 <li><p>ScrolledField should have optional arrow buttons, so that it
662           can still be scrolled even if the mouse does not have a
663           middle button.</p>
664
665 </li></ul>
666
667 <p>    Miscellaneous</p>
668 <ul><li><p>Add a button to the Pmw "Stack trace window" which
669           optionally removes all grabs:</p>
670 <p>            I normally interact with the "Stack trace window"
671             immediately, and dismiss it afterwards.  In many cases
672             where a bug appears like this, the rest of the application
673             is still functional (many of the problems appearing at
674             this stage of development of my application are unforeseen
675             exceptions communicating with a robot on the other end of
676             a socket, not affecting the GUI per se).  For that reason
677             I'd prefer if the "stack trace window" would push another
678             grab on the grab stack (if any grabs are active at the
679             moment the exception occurs).  Could the window have an
680             extra "Terminate application" option for this case?</p>
681
682
683 </li>
684 <li><p>need to handle component option queries in configure():</p>
685 <dl><dd><pre> foo = Pmw.AboutDialog(applicationname = 'abc XYZ')
686  foo.component('message').configure('text')    - works
687  foo.cget('message_text')                      - works
688  foo.configure('message_text')                 - doesn't</pre></dd></dl>
689
690
691 </li>
692 <li><p>Implement bindings (ComboBox, etc) via a dictionary lookup,
693           to allow people to invent new bindings, such as for
694           handicapped users.  (Suggested by Michael McLay)</p>
695
696 </li>
697 <li><p>Modify bundlepmw.py so that it checks Pmw.def to see that no
698           files have been missed.</p>
699
700 </li>
701 <li><p>Potential cheap speedup by adding this to each module, or
702           inside functions if it has a loop containing calls to
703           builtins:</p>
704 <dl><dd><pre> from __builtin__ import *</pre></dd></dl>
705
706
707 </li>
708 <li><p>Look at how update_idletasks and after_* are used in Pmw -
709           are they consistent?  could it be improved?  What are the
710           problems of using these on other bits of an application
711           (such as when the size of the toplevel is being determined
712           for the window manager).</p>
713
714 </li>
715 <li><p>If lots of errors occur (such as in a fast time callback)
716           the error window may not appear, since Tk will wait until it
717           is idle - which may never occur.  The solution is to call
718           update_idletask when updating the error window, but only
719           after a short time has passed.  This will provide better
720           user response.  However, it may not be possible to do this
721           if some python interpretes (omppython, for example) do not
722           handle calls to update_idletasks at certain times.</p>
723
724 </li>
725 <li><p>In the Pmw FAQ, in the "Why don't Pmw megawidgets have a
726           <strong>'state'</strong> option?" section, it mentions several Pmw
727           megawidgets that can not be disabled.  Fix them.</p>
728
729 </li>
730 <li><p>Add RCSID version string to all files.</p>
731
732 </li>
733 <li><p>When raising exceptions use the third argument to raise:</p>
734 <dl><dd><pre> raise SimulationException, msg, sys.exc_info()[2]</pre></dd></dl>
735
736
737 </li>
738 <li><p>When update_idletasks is called all pending changes are
739           flushed to the window system server.  However, it may take
740           some time for the server to display the changes.  If it is
741           required that the display be up-to-date, update_idletasks
742           should be followed by a call that blocks until processed by
743           the server and a reply received.  This may be useful in
744           Pmw.busycallback to ensure the busy cursor remains visible
745           until the display is actually modified.</p>
746
747 </li>
748 <li><p>There is a small bug which appears only with Tk8.0 (the bug
749           is not apparent with Tk4.2).  If a dialog is activated and
750           pops up directly over the cursor and the dialog has a
751           default button, then pressing the &lt;strong&gt;Return&lt;/strong&gt;
752           key will not invoke the default button.  If you move the
753           mouse out of and then back into the dialog, pressing the
754           &lt;strong&gt;Return&lt;/strong&gt; key will work.  This behaviour has
755           been noticed in Tcl-only programs, so it is probably a bug
756           in Tk.  (Tested on Solaris.)</p>
757
758 </li>
759 <li><p>Modify PmwBlt.py to use blt2.4 instead of blt8.0.unoff.
760           Nick Belshaw &lt;nickb@earth.ox.ac.uk&gt; is looking at wrapping
761           the new BLT StripChart and TabSet into Pmw.</p>
762
763 </li>
764 <li><p>Perhaps Pmw should have its own exception defined, like
765           TkInters's TclError, perhaps called PmwError.</p>
766
767 </li>
768 <li><p>This one is caused by a bug in the implementation of Tcl/Tk
769           for Microsoft Windows NT (and maybe other Microsoft
770           products).  Mouse release events can get lost if the
771           grab_set and grab_release commands are used and the mouse
772           goes outside of the window while the mouse button is down. 
773           This can occur while Pmw modal dialogs are active.  Below
774           is some Tkinter-only code which demonstrates the problem.
775           Maybe there is a work around.</p>
776 <dl><dd><pre> # Test script to demonstrate bug in Tk
777  #implementation of grab under NT.
778                                  
779  # Click on "Dialog" to bring up the modal
780  # dialog window.  Then button down on the scale,
781  # move the mouse outside the window,
782  # then button up.  The scale slider will still
783  # be sunken and clicks on the "OK" button
784  # will be ineffective.
785  
786  import Tkinter
787  
788  def activate():
789      waitVar.set(0)
790      toplevel.deiconify()
791      toplevel.wait_visibility()
792      toplevel.grab_set()        # Problem here
793      toplevel.focus_set()
794      toplevel.wait_variable(waitVar)
795  
796  def deactivate():
797      toplevel.withdraw()
798      toplevel.grab_release()    # and here
799      waitVar.set(1)
800  
801  root = Tkinter.Tk()
802  toplevel = Tkinter.Toplevel()
803  waitVar = Tkinter.IntVar()
804  toplevel.withdraw()
805  scale = Tkinter.Scale(toplevel, orient='horizontal', length=200)
806  scale.pack()
807  button = Tkinter.Button(toplevel, text='OK', command=deactivate)
808  button.pack()
809  
810  button = Tkinter.Button(text='Dialog', command=activate)
811  button.pack()
812  button = Tkinter.Button(text='Exit', command=root.destroy)
813  button.pack()
814  
815  root.mainloop()</pre></dd></dl>
816
817
818 </li></ul>
819
820
821 <p><strong>Documentation</strong></p>
822 <ul><li><p>Document how to get Pmw working on a Mac, for example:</p>
823 <ul><li><p>Unzip and untar</p>
824 <p>            This depends on what you use to unpack the tar file.  If
825             you use (macgzip and) SunTar you have to tell it that files
826             with ".py" extensions are text files (in the
827             preferences/file type section).  If you use stuffit
828             expander:  this can be made to do the conversion
829             correctly, but it could be that this only works if you set
830             the .py extension correctly in Internet Config.</p>
831
832 <ul><li><p>Where do you untar Pmw?</p>
833
834 </li>
835 <li><p>How do you get line terminators correct (carriage
836               return/line feed)?</p>
837
838 </li>
839 <li><p>Is there any problem with file name case?  (mixed
840               upper/lower case)</p>
841
842 </li>
843 <li><p>Is there any problem with file name length?</p>
844
845 </li></ul>
846 <p>            (Joseph Saltiel says:  It was the same type of operation
847             as in Windows/Unix.  Run a program that unzips it and
848             untars it.  It seems to get case and length right on its
849             own.)</p>
850
851
852 </li>
853 <li><p>Let python know where Pmw is</p>
854 <ul><li><p>If Pmw is in its own folder you will have to add the
855               parent of that folder to the sys paths in Edit
856               PythonPaths.  If it is in the Python home folder, you
857               do not need to do this.</p>
858
859 </li>
860 <li><p>Make sure that the Pmw folder is called "Pmw" and not
861               something else.  Since Pmw is a package, python expects
862               to find a "Pmw" folder somewhere in sys.path.</p>
863
864 </li></ul>
865 <p>            (Joseph Saltiel says:  With the Python distribution on the
866             Mac there is an application called editPythonPrefs, when
867             you run it it gives you a list of a paths.  These paths
868             are similiar to the PYTHONPATH variable.  I just added the
869             path to Pmw at the bottom of this list.)</p>
870
871
872 </li></ul>
873
874 </li>
875 <li><p>Document general ideas about building guis, eg:</p>
876 <p>      When I write gui applications, I usually defer creation of windows
877       as much as possible - this means that the application starts up
878       quickly because it usually only has to create the main window. 
879       Whenever another window is required for the first time, it is
880       created then.  When the user has finished with the window, the
881       window is withdrawn, not deleted, so that next time it is required
882       it much faster to come up.</p>
883
884 <p>      In summary - don't create a window until you need and
885       don't destroy a window if you may want it again.</p>
886
887 <p>      The amount of memory required to keep the windows should not be
888       very much - except for very long running programs where the user
889       may create thousands of different windows.</p>
890
891
892 </li>
893 <li><p>Add class hierarchy diagram to documentation:</p>
894 <dl><dd><pre> MegaArchetype
895      MegaToplevel
896         etc
897      MegaWidget
898         etc</pre></dd></dl>
899
900
901 </li>
902 <li><p>Add to doco something like:  "Another way to extend a Pmw
903       megawidget is to specify a non-default type for one of the
904       components.  For example <code>text_pytype = FontText</code>."</p>
905
906 </li>
907 <li><p>Document pyclass and pyclass = None (options for null components
908       are ignored; the only time this can be used is with the
909       Group's tag component - all
910       other's use the component widget in some way)</p>
911
912 </li>
913 <li><p>Create index of all Pmw methods, functions, options, components.</p>
914
915 </li>
916 <li><p>Add description of how to run the Pmw demos without installing.</p>
917
918 </li>
919 <li><p>Add description of how to install Pmw.</p>
920
921 </li>
922 <li><p>Describe grid structure of megawidgets, so that it is possible
923       to extend megawidgets by adding new widgets into the interior
924       (hence avoiding a childsite in most megawidgets)</p>
925
926 </li>
927 <li><p>Document error display and difference between callback and
928       binding error reports.</p>
929
930 </li>
931 <li><p>Document difference between <strong>'Helvetica 12'</strong> and <strong>'Helvetica size: 12'</strong>
932       in logicalfont.</p>
933
934 </li>
935 <li><p>Add to howtouse, to describe using the option database to set
936         options for a specific megawidget:</p>
937 <dl><dd><pre> import Pmw
938  root = Pmw.initialise(useTkOptionDb = 1)
939  root.option_add('*entryfield24*Label.text', 'German')
940  e = Pmw.EntryField(hull_name = 'entryfield24', labelpos = 'w')
941  e.pack()
942  root.update()</pre></dd></dl>
943
944
945 </li>
946 <li><p>Also document hull_name and hull_class.</p>
947
948 </li>
949 <li><p>Finish FAQ, ReleaseProcedure and StructuredText test.</p>
950
951 </li>
952 <li><p>Put html through gifwizard and html lint.</p>
953 <dl><dd><pre> http://www.cen.uiuc.edu/cgi-bin/weblint
954  (eg: http://www.cre.canon.co.uk/~neilb/weblint/manpage.html)</pre></dd></dl>
955
956
957 </li>
958 <li><p>Delete comments from source if they have been added to docs
959       (should not have two copies of anything).</p>
960
961 </li>
962 <li><p>Need to document non-standard initial values for component
963       options, such as border in ButtonBox and Dialog's childsite.</p>
964
965 </li>
966 <li><p>Docs should have DEFAULT BINDINGS section (like iwidget combobox).</p>
967
968 </li>
969 <li><p>Promote home page:</p>
970 <dl><dd><pre> http://www.geocities.com/homestead/promote.html
971  http://www.submit-it.com/subopt.htm, etc</pre></dd></dl>
972
973
974 </li>
975 <li><p>Create man pages as well as html (modify createmanuals to produce both).</p>
976
977 </li>
978 <li><p>Maybe something with html frames like: itcl2.2/html/index.html</p>
979
980 </li>
981 <li><p>Add to starting.html a note that Pmw is a python "package" and add
982       a pointer to python documentation on packages.</p>
983
984 </li>
985 <li><p>Document scrolled widget implementations, explaining why they
986       are all slightly different (because the underlying widgets which
987       are being scrolled have different behaviors).</p>
988
989 </li>
990 <li><p>Make copyright clearer. Maybe borrow python's?</p>
991
992 </li></ul>
993
994 <p><strong>Demos</strong></p>
995 <ul><li><p>Check for missing demos.</p>
996
997 </li>
998 <li><p>In all demos can move the three lines beginning with "Import Pmw
999       from the sibling directory", to inside "if __name__" clause.
1000       Also, "sibling directory" is now incorrect.  Also, add note that
1001       this is only necessary when running demos without installing Pmw.</p>
1002
1003 </li>
1004 <li><p>Change demo/All.py so that it displays the traceback if it
1005       cannot load or run a demo (easier for users to report errors).</p>
1006
1007 </li>
1008 <li><p>Add option to demo/All.py:  "Display demos in separate window"
1009       to allow resizing of sub-demos</p>
1010
1011 </li>
1012 <li><p>TimeCounter and Spectrum demos beep when they come up, using:</p>
1013 <dl><dd><pre> root.option_add('*EntryField*value', 'VALUE')</pre></dd></dl>
1014
1015
1016 </li>
1017 <li><p>In demos, add <code>title = 'blah'</code> to top of file and replace
1018       <code>root.title(..)</code> with <code>root.title(title)</code> at bottom.</p>
1019
1020 </li>
1021 <li><p>Add comprehensive speed test demo which creates one or more of
1022       each (common) megawidget.  Remove old SpeedTest demo.</p>
1023
1024 </li>
1025 <li><p>Check demos work when called from ptui.  (Changes have to do
1026       with calling compile/exec where __name__ is not the name of the
1027       All.py script, but is <strong>'__builtin__'</strong>)</p>
1028
1029 </li>
1030 <li><p>PromptDialog demo should not remember password.</p>
1031
1032 </li>
1033 <li><p>Finish Counter, Radioselect demos.</p>
1034
1035 </li>
1036 <li><p>Modify the All demo so that you can reload a demo module.</p>
1037
1038 </li>
1039 <li><p>The syntax-coloured code viewer looks strange on Microsoft NT,
1040       because the size of the fonts differ.  Check out Guido's
1041       idle-0.1 text colouring for Pmw code viewer.</p>
1042
1043 </li>
1044 <li><p>Document restrictions on adding bindings to a megawidget:  you
1045       probably need to bind to components of the megawidget and also
1046       check that you are not destroying bindings set up by the
1047       megawidget itself.</p>
1048
1049 </li>
1050 <li><p>Add a demo that demonstrates setting the color scheme at run time.</p>
1051
1052 </li></ul>
1053
1054 <p><strong>Tests</strong></p>
1055 <ul><li><p>Check for missing tests, such as TimeCounter, RadioSelect,
1056       SelectionDialog, MessageBar, MenuBar, ComboBoxDialog, Balloon.</p>
1057
1058 </li>
1059 <li><p>Create test for useTkOptionDb option to Pmw.initialise().</p>
1060
1061 </li>
1062 <li><p>Check that destroyed widgets' python classes are garbage
1063       collected (add test and/or demo).</p>
1064
1065 </li>
1066 <li><p>Add tests for changecolor, setscheme, etc.</p>
1067
1068 </li>
1069 <li><p>Need Resources test.</p>
1070
1071 </li>
1072 <li><p>Create tests for deriving from Pmw classes (eg ComboBox).</p>
1073
1074 </li></ul>
1075
1076 <p><strong>Ideas</strong></p>
1077 <ul><li><p>Add more Tix (www.xpi.com/tix/screenshot.html) and iwidgets widgets.</p>
1078
1079 </li>
1080 <li><p>Look at spinner.itk for how to do vertical orientation on
1081       same side for Counter.</p>
1082
1083 </li>
1084 <li><p>Investigate these new features in Tk8.0 and see if they could be
1085       used in Pmw:</p>
1086 <dl><dd><pre> embedded images in text widgets
1087  destroy command ignores windows that don't exist
1088 </pre></dd></dl>
1089
1090
1091 </li></ul>
1092
1093
1094
1095     <center><P ALIGN="CENTER">
1096     <IMG SRC = blue_line.gif ALT = "" WIDTH=320 HEIGHT=5>
1097     </p></center>
1098     
1099
1100     <font size=-1>
1101     <center><P ALIGN="CENTER">
1102     Pmw 1.2 -
1103      5 Aug 2003
1104      - <a href="index.html">Home</a>
1105     
1106     </p></center>
1107     </font>
1108
1109     </body>
1110     </html>
1111