Last modified on Thu Mar 12 09:34:00 PST 1998 by heydon 
     modified on Thu Aug 28 17:36:57 PDT 1997 by leifer 
     modified on Thu Nov 30 13:55:52 PDT 1995 by gnelson

This file describes problems, enhancements, and inefficiencies in the current
top-level Juno application. It was initially created from the notes on Allan's
whiteboard on Tue Mar 30, 1993.

BUGS ==========================================================================

  o When the dragged point cannot track the mouse exactly, the value
  reported by "JunoUI.DragLoc" trails the drag by one frame. This
  seems inevitable, since the "draggee" field of a "Drag.T" is not
  updated until the end of the drag loop.

  o When a template is instantiated and the current command is
  subsequently modified, the AST for the template is modified too. We
  need to make a copy of the template's AST when it is instantiated.

  o If a template is part of a bundled in module, a compilation error
  will occur when the template is instantiated if the instantiated
  command refers to a top-level name of the bundled module.

  o The drawing's bounding box is not being drawn when "PS.SetBBox" is
  run incrementally. Applying this tool should re-run the current
  command from scratch. The proposed solution is to have different
  subtypes of a "ProcTool": one for incremental point procedures, one
  for incremental text procedures, and one for non-incremental point
  procedures. The tool for "PS.SetBBox" would be of the latter
  variety.

  o Clicking "PS.Fill" does not erase the red path outline of the filled
  area. This could be fixed by making "PS.Fill" non-incremental.

  o The path returned by "PS.CurrentPath" may not correspond to the current
  path, since the path is represented by a Trestle path, and Trestle's paths
  have integer coordinates.

  o When Juno source is unparsed, the program doesn't always get the margin
  width correct [heydon, ramshaw].

  o The "Solve" button should be passive any time it becomes a no-op due to
  repainting the drawing view (e.g., on repaint, or after a point is adjusted).

  o "Fold" should normalize the editor.

  o Normalize isn't good enough; TextPort should center the error.

  o Marquee too narrow for 8 arguments?

Done on Thu Mar 12 09:33:52 PST 1998 by heydon
  o Sharon reports the following bug. If a Juno.modlist is used, and
  one of the modules named in it contains errors, Juno will load the
  offending module as the "current module" at start-up time and high-
  light the error. However, the name of the offending module will
  also appear in the module list. Selecting that module causes Juno
  to crash. The fix is not to add a module to the module list in
  Juno.CompileModules until *after* it has been successfully compiled.

Done on Sun Oct 26 13:59:34 PST 1997 by heydon
  o Lyle reports that the "Solve" button is not updating the locations
  of the points in the current command. To see the problem, create two
  points, add a HOR constraint between them, and then click "Solve".
  The points are moved, but their hints are not updated. The same test
  also reveals that the "Run" button has a similar problem! The
  problem was fixed by changing "Drawing.ExecCurrCmd" to call
  "Drawing.SourceUntrue" in the event that running the current command
  via "CurrCmd.Run" caused the current command's hints to be updated.
  This required changing "CurrCmd.Run" and "CurrCmd.UpdateHints" to
  return a BOOLEAN indicating if the hints had been updated or not.

Done on Sun Oct 26 11:49:19 PST 1997 by heydon
  o Fixed bug in "CurrCmd.MovePoint1" in which a point value could be
  created that contained negative literals. The procedure now calls
  "JunoASTUtils.NewNumber" to create a number wrapped in a
  "JunoAST.UMinus" node if the number is negative.

Done on Thu Jul 24 13:29:04 PDT 1997 by leifer and heydon
  o Changed JunoPt.ToASTPair to call JunoASTUtils.NewPoint so that
  literal pairs with negated values get allocated with JunoAST.UMinus nodes.

Done on Sat Mar  1 01:21:44 PST 1997 by heydon
  o Changing the code font does not change the font of any module
  views that are already open. Moreover, changes to the code font
  are never applied to *private* module views. The latter was easy to
  fix (a line simply had to be moved). The former required adding
  code to "Juno.DoConfigure" to walk over all of the modules to see
  which ones had help windows and calling "JunoConfig.SetFonts" and
  "VBT.Mark" on each one.

Done on Thu Jan 30 11:36:06 PST 1997 by heydon
  o Due to the recent change that makes the test for a total command
  more strict, one of the procedure bodies compiled by the "Fold As
  Animation..." command had to be bracketed in IF..FI.

Done on Tue Jan 28 14:55:15 PST 1997 by heydon
  o Due to the recent change that makes the test for a total command
  more strict, the command compiled for the drag command had to be
  bracketed in IF..FI to make it total.

Done on Mon Jan 27 19:16:01 PST 1997 by heydon
  o Made changes to many bundled modules to accomodate the recent
  change to the code that checks that a procedure body is total.

Done on Tue Oct  1 15:43:03 PDT 1996 by heydon
  o Renamed "PenStroke" module to "Pen", hid its "Line" and "Curve"
  procedures, and renamed "CurrentPath" -> "Stroke". Replaced
  "MoveTo", "LineTo", and "CurveTo" procedures in the "Dash" module by
  a single "Stroke" procedure. Now, the client should use the
  procedures in the PS module to construct a path, and the "Stroke"
  procedure in the "Pen" or "Dash" module to stroke it.
   
Done on Tue Jul 16 14:15:30 PDT 1996 by heydon
  o In some cases, when one animation is played after another, the
  last frame of the first animation becomes part of the background of
  the second. The fix is to call "DblBufferVBT.ClearSaved" in
  "Drawing.ExecCurrCmd" just before running the current command.

Done on Thu Apr 18 11:50:46 PDT 1996 by heydon
  o There was a bug introduced in the "Drag" and "Freeze" shortcuts.
  The shortcuts were not working if no tool was selected.

Done on Mon Apr 15 09:47:58 PDT 1996 by heydon
  o The Adjust tool would erase paint wherever the adjusted point
  label was moved. Now that we have DblBufferVBT.Save/Restore, that
  could be avoided by saving the drawing on the tool's "pre" method
  and restoring it on the "during" method.

Done on Sun Apr 14 18:44:50 PDT 1996 by heydon
  o Now that we are no longer re-compiling and running the current
  command after a drag completes, any highlights produced during the
  drag are not taken down. This was easily fixed by changing
  "Drag.PostDrag" to simulate "Drag.DuringDrag" once so the drag loop
  would execute one more time.

Done on Sun Apr 14 18:43:15 PDT 1996 by heydon
  o If an error occurs during a drag, no error message is displayed
  (one used to be displayed by re-compiling and running the current
  command after the drag). This was fixed by displaying an error in
  "Drag.ApplyDrag" if the compiled drag command did not complete
  successfully.

Done on Sun Apr 14 18:39:52 PDT 1996 by heydon
  o At the end of a drag, the current command was being recompiled and
  re-run. This was a problem, since if the point being dragged was not
  frozen, it may have been moved on the final running of the current
  command. The code to re-run the current command is not necessary; it
  was added for Lyle a while ago to take down highlighting at the end
  of the drag.

Done on Mon Feb 19 15:47:01 PST 1996 by heydon
  o Fixed the "Print" command to use "/usr/bin/lpr" and to use the
  current module name as the name to print on the header page.

Done on Mon Feb 19 15:41:46 PST 1996 by heydon
  o Fixed the "Preview" command to write its output to a temporary
  file instead of using a pipe. This means that the previewer
  (psview(1)) does not have to run in stream mode. Also added code
  to run the previewer on the same display as the one specified
  by the "-display" argument to Juno (if any).

Done on Wed Jan  3 20:11:33 PST 1996 by heydon
  o If the user specifies a variable that is not in the current
  command as an argument to the Fold procedure, it is silently
  included in the signature. Juno should probably check for that
  mistake and report an error.

Done on Tue Jan  2 18:10:24 PST 1996 by heydon
  o The saved buffer of the drawing's DblBufferVBT needs to be cleared
  at the start of dragging.

Done on Tue Jan  2 17:34:29 PST 1996 by heydon
  o "Preview" will crash Juno if there are too many processes
  currently running, and the attempt to fork another one fails.
  Rather than declaring "OSError.E" fatal, we should handle it.

Done on Thu Dec 21 16:26:28 PST 1995 by heydon
  o Greg's code for flagging errors in bundled modules and modules
  listed in the user's "Juno.modlist" handled parse errors okay, but
  not compilation errors. I fixed the code not to crash in the latter
  case.

Done on Fri Jul  7 19:17:27 PDT 1995 by heydon
  o Juno was crashing with stack overflows [rustan, davidm]. The
  problem seems to be that a library under Juno that had been bumping
  the default stack size no longer does so. I changed the code in
  "Juno.m3" to set the minimum default stack size to 6000 Word.T's,
  which is double the initial value.

Done on Wed Jun 21 22:40:02 PDT 1995 by heydon
  o Juno was crashing if the parameter value in a "Param" UI
  declaration was an unknown (qualified) identifier [gnelson].

Done on Tue Jun 20 22:30:28 PDT 1995 by heydon
  o Fixed bug in "CurrCmd.m3" in which hints that were expressed as
  functions of other values were not being updated. The problem was
  that the absolute value of the point hadn't changed. Hence,
  "cc.changedVal[]" was FALSE for that point. However, even if a
  point's value hasn't changed, its hint must be updated it that hint
  is functional in values that have changed.

Done on Tue Jun 20 16:27:26 PDT 1995 by heydon
  o Fixed bug in "Juno.DoPushCurrCmdWork": Greg made the type of one
  of the arguments to "Juno.DoFold" narrower, but didn't change the
  use of that procedure to use a narrower type; the implicit NARROW
  was failing on a "Push Current Command" operation.

Done on Mon Jun 19 09:20:32 PDT 1995 by heydon
  o Changed form for "Help..." windows so they could be resized.

Done on Fri Jun  2 16:44:30 PDT 1995 by heydon
  o Fixed bug in implementation of "PS.CurrentPath" to handle a new
  precondition on "RTVal.FromPair" requiring both its arguments to be
  non-NIL.

Done on Thu May 11 15:46:25 PDT 1995 by heydon
  o There was a bug in "CurrCmd.FillCache": when the variable array
  was too small, it sometimes was not grown large enough. An occurrence
  of "MIN" needed to be changed to "MAX".

Done on Thu Mar 23 11:49:30 PST 1995 by heydon
  o Fixed bug in "Rect.OnC" constraint in which an existential
  variable was not getting an appropriate hint.

Done on Tue Mar 21 12:07:06 PST 1995 by heydon
  o Fixed bug in "Ellipse.OnEcc" in which an unnecessary existential
  variable was introduced that was causing the solver to converge on
  sub-optimal solutions.

Done on Thu Jan 19 15:40:07 PST 1995 by heydon
  o When loading a file, the current command should be set to "SKIP"
  if compiling the module failed, or if there was no command to pop from
  that module. The latter was already done, but not the former. [ramshaw]

Done on Thu Dec 22 16:01:53 PST 1994 by heydon
  o The bounding box computed for a string rendered on the screen is
  not as tight as possible. This is because the "VBT.BoundingBox"
  procedure is not exact. The fix is to implement new versions of
  "VBT.BoundingBox" and "ScrnFont.BoundingBox" that compute the
  tightest possible bounding box. Currently, the latter procedure not
  only does not compute the vertical extent of the bounding box
  (instead, it uses the vertical extent of the bounding box of the
  entire font), but it also computes the horizontal extent incorrectly
  by possibly including extra space before the first character and
  after the last character (it should only use the printing width to
  move the reference point).

Done on Wed Dec 21 13:22:29 PST 1994 by heydon
  o The X versions of the PostScript fonts use the PostScript
  ISOLatin1Encoding, but the metric files are defined with the
  PostScript StandardEncoding. To fix this, we must define the various
  encodings in files for the PklFonts program to read, and then change
  the PostScript code generated by Juno to replace the encoding for a
  font with the ISOLatin1Encoding the first time each font is selected.

Done on Fri Dec 16 13:04:03 PST 1994 by heydon
  o When the program first starts up, creating a point and then
  applying a text tool to it causes the tool to immediately terminate.
  The problem is that the Juno module acquires the keyboard focus
  without setting the "hasFocus" boolean in the drawing, so the drawing
  acquires the focus even though it already has it. This causes it to
  be notified that it has just lost the focus, which causes the text
  tool to complete. The fix is to simply remove all cases in Juno.m3
  where the keyboard focus is being acquired there. [heydon]

Done on Thu Dec 15 18:20:54 PST 1994 by heydon
  o When writing PostScript, the PS.StringBBox procedure fails if its
  argument contains any unmapped characters. Should it? No, we map all
  such characters to the space character, since that is how the
  ".notdef" character is defined for Adobe PostScript fonts.

Done on Thu Dec 15 18:19:57 PST 1994 by heydon
  o With the new centered coordinate system, the run-time error
  message displayed in PostScript output is not being located
  correctly.

Done on Wed Nov 23 14:33:33 PST 1994 by heydon
  o The "Run" button has strange effects when typing the text of a
  text tool [heydon].

Done on Wed Nov 23 14:33:17 PST 1994 by heydon
  o If typing the text argument of a text tool, the tool should be
  applied when the keyboard focus is lost.

Done on Thu Nov 17 11:39:50 PST 1994 by heydon
  o "Arc.SmallArc" is trapping with guard failures [najork].

Done on Thu Nov 17 11:39:39 PST 1994 by heydon
  o The hints for non-point values are being updated even if there was
  already a non-literal hint supplied [heydon].

Done on Mon Nov 14 14:45:55 PST 1994 by heydon
  o The test for when to allow mouse events in the source window was
  wrong. However, it was not noticed because it only fails if
  continuous unparsing is turned off. The user should be given an
  error message if the source is out of date *and* if the current AST
  is up-to-date (which can only happen if continuous unparsing is
  turned off). Moreover, this test should be applied only to
  keystrokes, not to mouse events. [heydon]

Done on Mon Nov 14 13:00:21 PST 1994 by heydon
  o "Fold" implicitly re-compiled the current module and current
  command. However, if the current module had changed, any newly
  declared UI tools were not added to the toolbox on this implicit
  recompilation. [heydon]

Done on Sat Nov 12 19:25:06 PST 1994 by heydon
  o The change on 8-Sept-94 to the way IMPORT is handled introduced a
  bug: if the current module contains any IMPORT declarations and a
  tool from some other module not named in the imports is applied, the
  program crashes (there is a compilation error compiling the
  incremental command, and such compilation errors are asserted to be
  impossible). There are three possible fixes. One is to compile the
  current command in a scope that includes all the bundled modules,
  independent of any IMPORT lines in the current command; then, the
  compilation error will occur when/if the current command is folded
  or pushed. The second solution is to handle the compilation error by
  highlighting the error and displaying an error message. The third
  solution is to somehow update the IMPORT list in the current module
  to include the new module name.

  For now, we do option 1. However, the folded/pushed version of the
  current command is not compiled under the restricted module scope at
  fold/push time, so the compilation error for such commands is
  delayed until the current module is rebuilt.

Done on Sat Nov 12 18:23:26 PST 1994 by heydon
  o There are bugs with text tools, especially when using text tools
  with a single (text) argument. When using such a tool, if the user
  selects another tool, the text tool is applied as it should be, but
  it then seems to be applied again with the argument "|". If the
  newly selected tool is a tool with no arguments or a set tool
  (hence, not requiring the user to supply any arguments directly), an
  application of the text tool to the argument "|" also appears in the
  current command. [heydon]

Done on Sat Nov 12 18:18:47 PST 1994 by heydon
  o The "setup" method associated with set tools is never being called
  [heydon]. This bug never manifested itself because a set tool's default
  "setup" method is a no-op.

Done on Wed Nov  9 13:51:28 PST 1994 by heydon
  o Juno is crashing with an "exception not in raises list" failure on
  the exception JunoCompileErr.Error [najork]. This is due to a bug in
  the Modula-3 compiler used to build Juno-2 v1.07c in which exception
  scopes were not being handled correctly in the face of nested
  procedures. The bug seems to have been fixed in the latest version
  of the compiler.

Done on Mon Nov  7 14:49:48 PST 1994 by heydon
  o If the current command contains two projections at top-level, one
  directly nested inside the other, the program crashes on "Fold" if
  any of the variables in the inner projection is referred to in the
  command [najork]. The same bug also manifests itself if the current
  command has this form and the users tries to drag a point [heydon].
  The fix was to change the code in CurrCmd so that if multiple
  projections are nested inside each other at top-level in the current
  command, the command is considered to have an empty constraint and a
  body starting at the second projection.

Done on Tue Nov  1 18:35:49 PST 1994 by heydon
  o The change on 18-Oct-94 updated pair-valued hints too often. The
  hint should only be updated if it is a literal. For example, the hint
  should not be updated if it is a function.

Done on Tue Oct 18 17:00:23 PDT 1994 by heydon
  o If there was a hint for a current command variable, and the hint
  was neither a point nor a REL expression, and if the body of the
  current command set the variable to be a pair of reals (i.e., a
  point), the hint for the variable was not being updated.

Done on Thu Sep 22 12:38:17 PDT 1994 by heydon
  o The values of "PS.NonZeroWinding" and "PS.OddWinding" were
  reversed in the bundled "PS" Juno module [rustan, heydon].

Done on Sun Sep 11 16:37:13 PDT 1994 by heydon
  o The code that updates the hints incrementally at the end of
  running the current command has a bug: if the user types in a new
  value for the hint and clicks "Run", but the command changes the value
  back to the exact same value it had from the previous run, the new
  value of the variable is not displayed. When the current command is
  set to a new value through "CurrCmd.Change", the value caches must
  be reset, since the invariant that the unparsed values match the
  cache values is no longer guaranteed to hold.

Done on Thu Sep  8 12:45:10 PDT 1994 by heydon
  o The implementation does not check that names defined in the module
  and imported names are distinct. They should also all be distinct
  from the name of the module itself.

Done on Thu Sep  8 12:44:45 PDT 1994 by heydon
  o The implementation should report an error if CLOSE and APPLY are
  redefined.

Done on Thu Sep  8 09:18:30 PDT 1994 by heydon
  o If the "MODULE" declaration is not first in the module, the error
  that gets reported is "Only one MODULE header is allowed". Instead, it
  should be something like, "The MODULE header may only be preceded by
  comments".

Done on Thu Aug  4 10:29:09 PDT 1994 by heydon
  o Even though the default PS.LineWidth is 1.0, "PSImpl" was writing out the
  default as 0.0 in PostScript output. I changed the PostScript header output
  so it would print the actual default values. I also changed "defaultColor"
  from a "VAR (* CONST *)" to a "CONST" named "DefaultColor".

Done on Fri Jul 29 18:52:23 PDT 1994 by heydon
  o If the current command's constraint contains a global variable, Juno
  crashes if the current command is folded as a predicate (since by
  definition, predicates may not contain references to global variables,
  whereas constraints in general may). The fix is to relax the definition of
  "pure" in the language definition to allow references to global variables.

Done on Wed Jul 27 19:13:28 PDT 1994 by heydon
  o Juno crashes at startup if the startup file does not exist in the
  current directory and the current directory is unwritable, or if the named
  startup file is a directory.

Done on Thu Jul 21 17:25:49 PDT 1994 by heydon
  o The keyboard focus is not being acquired by the dialogue boxes for opening
  and saving files. The problem seems to be that when the top-level window
  is made dormant, the Trestle timestamp becomes stale. The actual problem was
  a bug in FormsVBT [heydon].

Done on Thu Jul 12 17:27:40 PDT 1994 by heydon
  o Juno crashes if a "UI Param" declaration's value is a QId that does not
  name a CONST, VAR, or PROC [heydon].

Done on Fri Jul  1 17:48:43 PDT 1994 by heydon
  o If a compilation error occurs in the module editor, it is not being
  highlighted on *subsequent* compilations (nor is an error message displayed).

Done on Thu Jun 23 11:22:05 PDT 1994 by heydon
  o If the user kills the previewer process while Juno is still generating
  PostScript output, the external procedures are not being restored correctly,
  so subsequent attempts to draw to the screen cause Juno to crash.

Done on Tue Jun 21 14:27:17 PDT 1994 by heydon
  o The grid points aren't erased when the grid is turned off.

Done on Mon Jun 20 15:06:58 PDT 1994 by heydon
  o Juno crashes at startup with "TrestleComm.Failure" if an X connection
  cannot be established, for example, if one is running Juno remotely and has
  not xhost'ed the remote machine.

Done on Thu Jun 16 17:09:10 PDT 1994 by heydon
  o Juno crashes with an assertion failure if the user has clicked in a cycle
  of near constraints with the REL tool and tries dragging. For example, click
  in two points "a" and "b", select the REL tool, then click "a", "b", "a" and
  try dragging [detlefs]. The solution is to highlight the compilation error
  in the source window instead of pretty-printing the drag command and
  crashing.

Done on Fri May 27 12:30:36 PDT 1994 by heydon
  o  When using a text tool, the keyboard focus is not regained if it is lost
  (for example, by clicking in the current command editor, or moving the
  cursor out of the Juno window).

Done on Fri May 27 12:30:07 PDT 1994 by heydon
  o The filebrowsers sometimes fail when they shouldn't, and when they do
  fail, the error message is sometimes displayed the *next* time they are
  used. This only seems to happen when the user types in directory/file names.
  The problem is that the "OK" buttons in the dialogues could cause the
  filebrowser callbacks to be invoked with a strange value, so get rid of the
  "OK" buttons altogether.

Done on Wed Apr 20 16:46:01 PDT 1994 by heydon
  o If the module view has height 0 (i.e., is an empty window), declarations
  unparsed into it as a result of folding have a fixed, small width. The width
  of the current command window should be used instead. Note: the current
  command view does not exhibit this problem. Why not? Does the current
  command get unparsed whenever the size of the current command view changes,
  even if only its height is changed? [gnelson, heydon]

Done on Thu Apr 21 10:04:54 PDT 1994 by heydon
  o If the user has turned on the grid, and then deletes either of the points
  defining the grid (for example, by editing the current command, folding it,
  etc.), the grid tool should automatically change to "Grid On", i.e., the
  grid should be turned off.

Done on Tue Apr 19 17:03:52 PDT 1994 by heydon
  o When the middle divider bar is dragged to the left, it doesn't end up
  as far left as where you dragged it [heydon]. This was a compiler bug: Bill
  was not compiling LAST(INTEGER) correctly. This problem was probably
  actually "fixed" a while ago with a release of a fixed compiler.

Done on Tue Apr 12 19:15:50 PDT 1994 by heydon
  o Juno crashes when previewing if the previewer is killed from the shell
  while the PostScript program is still being sent to the previewer down the
  pipe (you have to be displaying a complicated PostScript program to have
  time to trigger this bug). This causes a "Wr.Failure" exception, which is
  uncaught [heydon]. The fix was to catch the exception and report it as a
  "Failed external procedure" run-time error.

Done on Wed Apr  6 12:15:12 PDT 1994 by heydon
  o The first frame during dragging is not being painted over with white, so
  it is possible to see the first two frames at once. To see this effect,
  choose the "Drag" tool, and press the mouse button a substantial distance
  from any of the existing points. Then, move the mouse 1 pixel. The bug was
  that "damaged" was not being set to "Rect.Full" the first time
  "Drag.AnimateProc" was called.

Done on Tue Mar 29 15:41:46 PST 1994 by heydon
  o Resizing the editor window causes its contents to be recompiled when the
  "Make" button is pressed, even though its parse trees have not changed.

Done on Tue Mar 29 15:30:45 PST 1994 by heydon
  o If I perform the following steps: first, change the signature (say the
  number of IN parameters) of a predicate in the module view that is currently
  called in the current command's <constraint>, and then "Make", I get a
  "Wrong number of IN's" error message as I should. However, there are two
  problems: 1) the "Make" button is grayed out, as if the compilation were
  successful (which it was not), and 2) the compilation error is not
  underlined. Note that if I instead change the number of IN parameters in the
  current command where the predicate is *used*, problems (1) and (2) don't
  appear.

Done on Tue Mar 29 13:45:02 PST 1994 by heydon
  o TextPort.Select doesn't always seem to work to highlight error. The
  problem was that Andrew Myers was passing 0 for the time stamp. Also, we
  needed to make the module view acquire the keyboard focus in "JunoError.P".

Done on Sun Feb 20 19:16:35 PST 1994 by heydon
  o If the current module is changed from being anonymous to being named, the
  current command scope is not being reset [heydon]. The fix was to always
  treat the current module as anonymous. This means that folded/unfolded
  pred/func/proc entities are always added to/removed from the current command
  scope.

Done on Sun Feb 20 18:56:27 PST 1994 by heydon
  o Previous changes seem to have introduced the following bug: When the make
  button is clicked and the current command re-run, the current command is not
  being updated to include the new values for the variables after a solve.

Done on Sun Feb 20 18:56:19 PST 1994 by heydon
  o When Folding (Automatic), the new pred/func/proc is not being added to the
  current command scope, so if the user attempts to apply a proc tool with the
  dummy argument name (i.e., without explicitly changing the name and clicking
  Make), the application of the tool produces an "undeclared identifier"
  compilation errors. Compilation errors are fatal when incrementally
  extending the current command [mhb]. A related problem is that identifiers
  are not being removed from the current command scope when popping the
  current command [heydon].

Done on Fri Feb 18 19:18:04 PST 1994 by heydon
  o It's possible to invoke a private pred/func/proc defined in the current
  (anonymous) module from the current command [heydon].

Done on Fri Feb 18 18:43:50 PST 1994 by heydon
  o "Drawing.ApplyProc" requires that the root AST is up-to-date. This
  condition is not always met when applying a tool with 0 arguments, so Juno
  is crashing in such situations with an ASSERT fault [mhb].

Done on Fri Feb 18 09:10:00 PST 1994 by heydon
  o Juno crashes if the current command has a run-time error while redirecting
  its output as PostScript to a file or pipe [mhb]. (See "PipePostScriptToCmd"
  in "Juno.m3".) The fix was to generate appropriate PostScript code to
  display the run-time error message in the PostScript output.

Done on Tue Feb 15 17:04:44 PST 1994 by heydon
  o Compiling the drag command fails if the body of the current command is not
  a total command [mhb].

Done on Mon Jan 17 15:49:26 PST 1994 by heydon
  o The point returned by "PS.CurrentPoint" is integer-valued, so when
  executing the statement "PS.MoveTo(a); b := PS.CurrentPoint()", it is quite
  likely that "a # b".

Done on Fri Jan  7 18:18:30 PST 1994 by heydon
  o Fold is broken if the current command contains a parse or compilation
  error as a result of the user typing in the current command editor. An error
  message is displayed, but the AST that gets folded is the one corresponding
  to the most recently successfully parsed and compiled current command.
  Hence, the user's editing is lost.

Done on Mon Nov 15 13:01:03 PST 1993 by heydon
  o "CurrCmd.m3" was not filling in the "bp" field of newly-created "JunoAST.T"
  nodes, so the program was crashing with a NIL "bp" field on some compilation
  errors.

Done on Mon Nov  8 18:00:54 PST 1993 by heydon
  o Dragging a frozen point sometimes fails when the mouse button is released.
  This is probably due to using finite-precision numbers. There are two
  possible problems: either our EQUAL bytecode does not allow enough play, or
  after dragging, we should solve for the point as if it were unfrozen (even
  if the point is frozen). Come to think of it, why do we have to re-run the
  current command at all after dragging?

  Fix: We don't even need to re-run the current command at the end of
  dragging; just add the final drawing annotations instead.

Done on Fri Oct 22 11:29:15 PDT 1993 by heydon
  o The comment for "PS.Moveto" does not specify that only the last "Moveto"
  in a sequence of "Moveto"'s takes effect [heydon].

Done on Tue Oct 19 15:08:15 PDT 1993 by heydon
  o After Dragging, Juno runs the current command one last time. If the
  dragged point was unhinted, then this can move the dragged point, since
  during dragging, we first try solving the constraints with the dragged point
  artificially frozen. So, after dragging, we should try running the current
  command with the dragged point artificially frozen, just like Adjust does.
  To see this behavior, use Lyle's OnCurve predicate, and make sure the
  dragged Bezier point is unfrozen [heydon].

Done on Thu Oct 14 17:20:25 PDT 1993 by heydon
  o "PS.ShowPage" should output page number for next new page [bourdoncle].
  We have to dump the current PS state at the start of each page, since the
  pages can be executed in any order.

Done on Thu Oct 14 17:19:56 PDT 1993 by heydon
  o Backspacing past the beginning of a text argument crashes Juno [mhb].

Done on Thu Oct 14 11:52:16 PDT 1993 by heydon
  o The "CurrCmd" interface is inconsistent and buggy. The following bugs are
  almost entirely due to the fact that the restrictions on the current command
  are not well defined.
    - Dragging can crash when the drag command is compiled if the current
      command does not adhere to the restrictions on current commands. For
      example, if the current command has the form "VAR x IN VAR y IN y := x
      END END", the inner "VAR" is not being compiled into the drag command,
      so the assignment causes a compilation error [ramshaw].
    - "CurrCmd.AddConstraint" is buggy in the case that the <constraint> has
      the form "TRUE OR ...", since it naively conjoins the new constraint onto
the current <constraint> [heydon].
    - When folding a procedure, if the current command's <constraint> is TRUE,
      then there is no reason to add a guard in the folded procedure.
    - "CurrCmd" is not very robust: it can crash if the current command does
      not have a particular form.
  The fix was to remove the restrictions on the current command. The current
  command is now allowed to be an arbitrary Juno command.

Done on Mon Oct 11 11:52:47 PDT 1993 by heydon
  o The comment for "Text.GetChar" should say that it returns an integer, not
  a string of length 1 [gnelson].

Done on Sun Oct 10 17:12:51 PDT 1993 by heydon
  o Dragging deadlocks when a run-time error occurs while dragging [ramshaw,
  heydon].

Done on Tue Oct  5 10:08:45 PDT 1993 by heydon
  o The Juno machine crashes in random places while dragging with an
  over-constrained CurrCmd [jdd, hania].

  The problem was that at the very end of the Drag, the PostDrag method was
  not waiting for the other thread to finish running the compiled Juno
  command.

Done on Thu Sep 30 09:27:56 PDT 1993 by heydon
  o The "Make" button is not always deactivated initially. There seems to be
  some sort of a race condition when Juno starts up. Also, "Untitled.juno" is
  not always unparsed to the correct width at start-up.

Done on Wed Sep 15 15:35:07 PDT 1993 by heydon
  o Compiler is crashing because not all "JunoAST.T" nodes created by the
  application have their backpointers initialized to "JunoAST.End".

Done on Tue Sep  7 20:14:08 PDT 1993 by heydon
  o Current tool is deselected if it adds a constraint to the current command
  (thereby activating the "Make" button).

Done on Wed Sep  1 09:51:36 PDT 1993 by heydon
  o XOR'ing of crosses is broken in drawing view.

Done on Wed Sep  1 09:50:22 PDT 1993 by heydon
  o Drag.RunDeltaCmd currently asserts that the computation ended with a
  "HALT" error. But if some other kind of run-time error occurs while
  dragging, we should report it instead of crashing. The current fix is to
  ignore the trap code result while dragging.

Done on Fri Aug 20 20:57:13 PDT 1993 by heydon
  o The PS and Text module implementations need to be (Modula-3) NIL-safe.

Done on Thu Jul  8 00:21:53 PDT 1993 by heydon
  o Juno crashes on a VAR declaration without an initializer. Pass3 in
  JunoBuild is not checking if an initializer was supplied or not. We should
  actually initialize uninitialized variables to NIL.

Done on Wed Jul  7 23:39:09 PDT 1993 by heydon
  o When generating PostScript, the third argument to the "curveto" command is
  always the same as the second argument. Easily fixed.

Done on Tue Jun 22 14:36:35 PDT 1993 by heydon
  o When writing PostScript code, strings need escapes inserted in
  non-printing characters and in the special characters '(', ')', and '\'.

Done on Tue Jun 22 14:35:45 PDT 1993 by heydon
  o The X model of stroking degenerate paths does not match the PostScript
  model. Namely, a MoveTo that is not followed by a LineTo or CurveTo or Close
  should not produce any ink when the path is stroked.

Done on Tue Jun 15 18:35:32 PDT 1993 by heydon
  o Andrew's scheme of appending "ABORT" to the current command breaks if the
  user's current command contains "ABORT". We need a way of laying down a
  unique machine instruction that traps and can be recognized from the trap
  type (perhaps by adding another error trap?).

Done on Tue Jun 15 18:35:14 PDT 1993 by heydon
  o Opening a module causes the name of the current file name to be
  highlighted in red.

Done on Fri May 21 12:25:48 PDT 1993 by heydon
  o Editor windows have funny shapes when switching from one view to another.

Done on Fri Apr  9 18:38:46 PDT 1993 by heydon
  o The Drag tool currently allows the user to drag the point to a location
  where the guard fails. This should not be possible.

Done on Tue Mar 30 11:30:35 PST 1993 by heydon (actually done a while ago)
  o Program crashes on start-up if Untitled.juno contains errors. The window
  system has problems popping up the error window.

TO DO =========================================================================

  o Fork threads for "DoLoadFileWork", "DoSaveWork", "DoSaveAsWork",
  "DoModuleWork", "DoFoldDialogueWork", "DoPushCurrCmdWork", and
  "DoPopCurrCmdWork" in the "Juno" module. 

  o Fork a separate thread to generate PostScript so the menu will pop down
  immediately. This requires making the background dormant before forking the
  thread, waiting for the thread to finish, and then making the background
  active again. The same technique should be used for the "Make",
  "PushCurrCmd", "PopCurrCmd", and "SavePSAs" commands. This code was all
  written at one point, but we had some deadlocks, so it was removed. We will
  have to do more thorough locking-level checks before adding it again.

  o Add an option to the "Labels" menu (which should probably be
  renamed) to show only those points with absolute hints [najork].

  o Make the built-in tools part of a fake module with a "Help..."
  menu option.

  o Add REL3 to the language and UI? Add REL1 to the language?

  o Add a way to interrupt infinite loops. Perhaps a "Stop" button in the UI?

  o Make the "Load", "Save As...", and "Save PostScript As..." dialogues all
  have the same directory state.

  o Make the filebrowsers understand "~" in filenames.

  o Add way to select a group of points and adjust them in the drawing view.

  o Provide gesture for "grouping" objects into a single procedure?

  o Implement "Unfold": If the current command is a call to a procedure or
  predicate only, then unfolding inlines the procedure or predicate body, and
  sets the "Refold" name to the name of the procedure or predicate deleted
  from the module view. There should also be a new "Refold <name>" menu item
  whenever a procedure has been unfolded. This menu item is disabled after
  folding or refolding. Perhaps the name "Automatic" should change to
  something like "New" (or even "New PRED" or "New PROC" as the case may be)?
  [heydon, gnelson].

  o Add support for "IMPORTS". This requires building a new kind of scope that
  looks up identifiers by searching the file system. The system must provide
  support to prevent cyclic imports.

  o When a new tool is selected, unparse the signature and comment for the
  tool in a special window.

  o Make "TRUE OR ..." work as a UI gesture, and in the CurrCmd interface (see
  CurrCmd.AddConstraint). This will also require changes to the compiler,
  since "OR" is no longer recognized in constraints.

  o Allow folding as a predicate or function in the "Fold..." dialogue?

  o Add a "Merge Point" tool for merging two top-level points. Applying this
  tool to the two points "a" and "b" would remove the declaration for "b" in
  the current command, and replace all occurrences of "b" by "a" in the
  current command.

  o Provide gestures for entering arguments other than points. Possibilities
  include: pairs, lists, nested function / functional-procedure calls,
  scalers. Anything else?

  o Add means for displaying/hiding marquee?

  o Read-eval-print loop available on run-time errors.

Done on Mon Dec 15 11:10:22 PST 1997 by heydon
  o Changed ScrnFontExtras.TightBoundingBox to remove dependence on
  the TextF interface.

Done on Mon Dec 15 10:44:18 PST 1997 by heydon
  o Removed three unnecessary ELSE clauses in TYPECASE statements
  in ToolBox.m3. These were pointed out by Bill's Critical Mass
  compiler when he built Juno.

Done on Thu Aug 28 17:37:36 PDT 1997 by heydon and leifer
  o Added Reload and Clear All buttons to the file menu.

Done on Mon Jun 16 17:32:35 PDT 1997 by heydon
  o Reorganized code so XParam procedures for parsing the "-display"
  and "-geometry" arguments are now called from within "JunoWM.Install".

Done on Tue Apr 29 17:40:33 PDT 1997 by heydon
  o Changed the implementation of "Fold As Animation..." so that the
  animation duration can be easily changed.

Done on Tue Apr 15 11:19:12 PDT 1997 by heydon
  o Changed Digital logo in "About" box so it is the proper Digital
  burgandy color.

Done on Wed Mar 19 11:52:25 PST 1997 by heydon
  o Fixed bugs in "Rect.East" and "Rect.West" procedures. Added new
  "Rect.FromCenterCorner" procedure.

Done on Sat Mar  1 00:53:14 PST 1997 by heydon
  o Change unparsing so blank lines are not inserted between
  consecutive "UI" declarations.

Done on Sat Mar  1 00:15:12 PST 1997 by heydon
  o Added new "Print" module.

Done on Mon Jan 27 19:16:55 PST 1997 by heydon
  o Changed UI to print names of modules to the start-up screen as
  they are compiled.

Done on Wed Nov 27 17:15:22 PST 1996 by heydon
  o Added "X" and "Y" to "Rel" module. Also made implementation
  of "Rel.InvX" and "Rel.InvY" slightly more efficient.

Done on Fri Nov 22 17:16:44 PST 1996 by heydon
  o Added "VerSym", "HorSym", and "LineSym" to the "Geometry" module.

Done on Tue Oct  1 15:42:50 PDT 1996 by heydon
  o Exposed more functionality in the Arrow module, such as a FUNC
  for returning the point where the base of an arrowhead starts.

Done on Sat Sep 21 15:47:44 PDT 1996 by heydon
  o Added procedures "DrawSemi" and "DrawSemiCC" to the "Ellipse"
  module.

Done on Tue Apr 16 16:49:46 PDT 1996 by heydon
  o Added short-cuts for "Drag" (middle mouse button) and "Freeze"
  (right mouse button). These shortcuts do not apply if the user is in
  the middle of using a tool.

Done on Mon Apr 15 13:42:50 PDT 1996 by heydon
  o Added horizontal and vertical dragging to the Drag and Adjust
  tools.

Done on Sun Apr 14 18:45:28 PDT 1996 by heydon
  o Added built-in "Random" module at Rustan Leino's request.

Done on Fri Mar 29 14:07:29 PST 1996 by heydon
  o Add support for configuration files. At this point, all changes do
  not take effect immediately, as would be ideal; reshaping some of
  the windows is necessary.

Done on Thu Jan 11 18:30:19 PST 1996 by heydon and gnelson
  o Break text-tool arguments at newline characters so long arguments
  will be visible when unparsed.

Done on Wed Jan  3 20:14:54 PST 1996 by heydon and gnelson
  o Design and implement a more efficient scheme for permanent ink during
  animations.

Done on Tue Jan  2 13:34:29 PST 1996 by heydon
  o Incorporated new "DblBufferVBT" save/restore functionality:
  changed dragging code to use new "DblBuffer.Save/Restore" instead of
  "DblBuffer.GetDamaged/SetDamaged"; added "PS.SavePage" and
  "PS.RestorePage"; changed "Anim.Play" to call "PS.RestorePage"
  instead of "PS.Reset".

Done on Thu Dec 28 16:55:29 PST 1995 by heydon
  o Implemented "Fold As Animation..."

Done on Tue Dec 19 13:00:44 PST 1995 by heydon
  o Added "FromCorners" and "Inset" procedures to bundled-in "Rect"
  module.

Done on Sun Dec 17 13:00:24 PST 1995 by heydon
  o Added support to "PSImpl" for rendering pages in landscape
  orientation, and added "-landscape" and "-portrait" switches
  to the application for specifying the orientation. Eventually,
  it would be better if the page size / orientation could be saved
  and restored on a per-file basis.

Done on Fri Dec 15 10:44:06 PST 1995 by heydon
  o Bundled "CharSet" and "Xform2" modules into the application.

Done on 30 Nov 95 by gnelson
  o Crash recovery 

Done on 30 Nov 95 by gnelson
  o Given the new "Juno.modlist" mechanism, it would be nice if the
  program did not crash while compiling such modules. Instead, it
  should display a parser/compiler error to Stdio.stderr. This may
  require fixes to two distinct parts of the code: one to detect parse
  errors, and another to detect compilation errors.

Done on Mon Jul  3 12:49:33 PDT 1995 by heydon
  o Added simple "Square.juno" module for drawing arbitrarily-oriented
  squares.

Done on Sun Jul  2 12:50:11 PDT 1995 by heydon
  o Added Rustan Leino's contributions to the "Bezier" and "Path" modules.
  As part of the coding for the new "Path" routines, I generalized the
  "BST.Find" procedure to take a user-supplied comparison function (as
  a closure).

Done on Tue Jun 27 14:22:48 PDT 1995 by heydon
  o Changed definition of "Triangle.Area" to be more robust.

Done on Sun Jun 25 15:41:12 PDT 1995 by heydon
  o Added notion of "line-breaking depth" to the "Unparse" module.

Done on Wed Jun 21 17:29:51 PDT 1995 by heydon
  o Added "Normalize" and "WarpTime" procedures to "Anim" module.

Done on Wed Jun 21 17:14:41 PDT 1995 by heydon
  o Added "Path" and "Curve" built-in modules.

Done on Mon Jun 19 09:10:55 PDT 1995 by heydon
  o Changed name of bundled in "Juno.juno" module to "JunoUI.juno".
  Moved "PS._ANIMATE" procedure from "PSImpl.m3" to "JunoUIImpl.m3", 
  and changed its name to "JunoUI._DRAG".

Done on Fri Jun 16 18:07:20 PDT 1995 by heydon
  o Added "Line" and "CurrentPath" procedures to "PenStroke" module.

Done sometime before Fri Jun 16 1995 by gnelson
  o Added Rel1 to the UI.

Done sometime before Fri Jun 16 1995 by gnelson
  o Added templates.

Done sometime before Fri Jun 16 1995 by gnelson
  o Added ability to specify arguments to folded procedures/predicates
  in the fold dialogue.

Done sometime before Fri Jun 16 1995 by gnelson
  o Fixed current module window so it doesn't always scroll to the top
  of the file.

Done on Tue May  2 15:21:46 PDT 1995 by heydon
  o Added "Reverse" and "Repeat" procedures to the "Anim" module.

Done on Tue Feb 21 12:04:47 PST 1995 by heydon
  o Added new "BST" module.

Done on Tue Feb 21 12:04:21 PST 1995 by heydon
  o Made changes to the "List" module: The "Size" procedure was
  renamed "Length"; added new "Prefix", "Suffix", and "SuffixFrom"
  procedures. Updated other modules that used the "Size" procedure.

Done on Mon Jan 30 10:46:26 PST 1995 by heydon
  o The comment for "PS.Type" should describe which character
  encodings it uses. The comment for "Show.R" had a mistake. [ramshaw]

Done on Thu Jan 19 13:29:18 PST 1995 by heydon
  o Added key bindings to disable garbage collection (the "o" key) and
  to force a garbage collection (the "g" key).

Done on Mon Dec 19 18:51:12 PST 1994 by heydon
  o Fork threads for "DoPrintWork", "DoPreviewWork", and
  "DoSavePSAsWork" in the "Juno" module.

Done on Thu Dec  1 10:31:27 PST 1994 by heydon
  o Add a confirmation to the "Save As..." dialogue if the user is
  attempting to save the current module over a file that already
  exists [najork].

Done on Fri Nov 18 12:51:46 PST 1994 by heydon
  o Add a "Save PostScript" menu option that saves the PostScript to a
  file whose name is formed from the current module name by replacing
  the extension with ".ps" [perl].

Done on Wed Nov 16 16:15:26 PST 1994 by heydon
  o Change the "Load" and "Save" commands so that the current command
  is implicitly "Pushed" into a procedure with a reserved name (and no
  arguments) on "Save" and "Popped" from that reserved procedure name
  on "Load". For backward compatibility, if a loaded module does not
  contain a procedure with the reserved name, the implementation
  should treat such modules as if they contained the procedure with a
  body of "SKIP". Also, since the current command under this scheme is
  implicitly part of the current module, the module name should change
  to have a red background (and any other associated state changed)
  whenever the current command changes.

Done on Sat Nov 12 16:05:21 PST 1994 by heydon
  o Cleaned up declarations in "Drawing.i3". Now, there is no type
  "Drawing.DeclTool", and not all "Drawing.ArgTool"'s have a "text"
  method; only the type "Drawing.ProcTool" has a "text" method. Since
  the current tool stored in a "Drawing.T" has type "Drawing.ArgTool",
  extra NARROW's are required to apply the "text" method if the
  current tool is known to be a text tool.

Done on Fri Nov 11 18:42:04 PST 1994 by heydon
  o Change the implementation of the drawing view so that the origin
  of Juno's coordinate system is always in the center of the window or
  at the center of the printed page.

Done on Tue Oct 11 18:22:09 PDT 1994 by heydon
  o Change UI so a newly-created point can be made frozen by holding
  down the option key.

Done on Fri Oct  7 18:21:10 PDT 1994 by heydon
  o When the current command is pushed/folded, it always gets enclosed
  by an IF/FI, even if it is total. The program should only bracket
  the current command by IF/FI if it is not total.

Done on Tue Oct  4 11:01:10 PDT 1994 by heydon
  o Updated the "Anim" module so its "Save" and "Restore" procedures
  are point tools, and so that they save/restore the current animation
  time factor (in addition to the permanent objects).

Done on Mon Oct  3 11:05:50 PDT 1994 by heydon
  o Added the "Juno.modlist" mechanism for specifying auxiliary
  modules to be loaded without having to bundle them into the
  application. I also wrote code to fill in the module browser
  dynamically, so modules can now be bundled without any source
  changes -- only resource changes are required, so the newly bundled
  modules are available without a recompilation.

Done on Fri Sep  9 09:13:49 PDT 1994 by heydon
  o Change implementation and language definition so that any name
  starting with "_" is reserved.

Done on Thu Sep  8 17:02:19 PDT 1994 by heydon
  o Change the implementation so that if a module includes any IMPORT
  statements, then a restricted environment is created for the
  compilation of the rest of the module.

Done on Wed Aug 24 15:18:59 PDT 1994 by heydon
  o Added "OnHint", "OnCHint", and "OnRHint" functions to the "Rect"
  module, and changed "DiGraph" to support undirected edges.

Done on Fri Aug  5 18:39:43 PDT 1994 by heydon
  o Changed "CurrCmd" so that it unparses *all* values (not just points) after
  running the current command.

Done on Thu Aug  4 10:48:44 PDT 1994 by heydon
  o Augmented the "R3" module to contain functions similar to "R2".

Done on Sun Jul 31 16:39:24 PDT 1994 by heydon
  o Add processing for X command-line arguments "-geometry" and "-display".
  See the "XTrestle" and "XParam" interfaces.

Done on Fri Jun 24 10:53:42 PDT 1994 by heydon
  o Change PostScript prologue to include the "CreationDate" comment.

Done on Fri Jun 24 10:52:50 PDT 1994 by heydon
  o Add a "Unit" interface that defines constants and procedures for
  converting between screen-independent and screen-dependent units.
 
Done on Wed Jun 22 14:14:28 PDT 1994 by heydon
  o Add the notion of a bounding box to the PostScript state. The bounding box
  is an annotation drawn at the end of each frame as a greyed out box. There
  should be a PS procedure for setting the bounding box. Additionally, we use
  this new piece of state to generate a "%%BoundingBox" comment in the
  PostScript output [heydon, gnelson].

Done on Wed Jun 22 14:12:18 PDT 1994 by heydon
  o Change the implementation of the PostScript module so that Juno's
  coordinate system uses screen-independent units such as points.

Done on Mon Jun 20 15:08:26 PDT 1994 by heydon
  o Change Juno to accept the name of the module file to edit on the command
  line.

Done on Mon Jun 13 17:32:47 PDT 1994 by heydon
  o Change the implementations of the external procedures to use the new
  "JunoArgs" machine interface.

Done on Mon Jun  6 10:14:03 PDT 1994 by heydon
  o Add the "-zeus" switch so Juno can act as a server for Zeus animations.

Done on Mon Jun  6 10:11:31 PDT 1994 by heydon
  o Change the "Make" button into "Solve", and add a "Run" button. Also, add
  the "Refresh" menu to control how the drawing view is refreshed when it
  needs to be updated implicitly. These changes are necessary for making it
  easier to work with long-running commands such as animations.

Done on Fri Jun  3 09:51:30 PDT 1994 by heydon
  o If the current module is out-of-date on exit or on loading a new one, ask
  the user if the current module should be saved [mhb].

Done on Thu Jun  2 10:16:29 PDT 1994 by heydon
  o Create a new "Anim" module for producing animations.

Done on Thu Jun  2 10:08:28 PDT 1994 by heydon
  o Create a new "Time" module with the single procedure "Now" for making
  animations run against the wall clock. 

Done on Thu Jun  2 10:07:37 PDT 1994 by heydon
  o Separate the old "PS.Showpage" into two procedures: "PS.Showpage" for
  simply flushing the off-screen VBT, and "PS.Reset" for resetting the
  PostScript state.

Done on Fri May 27 12:34:08 PDT 1994 by heydon
  o In dialogue windows, change the icons for the close and grow buttons.

Done on Fri May 27 12:29:52 PDT 1994 by heydon
  o Make the program install a grey top-level window sooner, then switch over
  to the regular Juno window.

Done on Fri May 27 12:29:24 PDT 1994 by heydon
  o Make the dialogue boxes disable reactivity of the top-level background
  window. This means we have to name the "close" button so we can attach a
  call-back to it; we can get rid of the "Cancel" buttons too.

Done on Fri May 27 12:28:56 PDT 1994 by heydon
  o The "Key" method should pass more characters through when using a text
  tool, and there should be a way to pass return (for example, by holding down
  a modifier key).

Done on Thu May 19 18:30:35 PDT 1994 by heydon
  o Add a "Fold" dialogue box.

Done on Wed May 18 15:06:40 PDT 1994 by heydon
  o Add UI declarations to all of the bundled-in modules.

Done on Wed May 18 15:02:49 PDT 1994 by heydon
  o Add procedures to the "PS" module for getting the current line width, end
  style, joint style, color, and winding style.

Done on Tue May 17 15:04:40 PDT 1994 by heydon
  o Add user-interface declarations for point tools, text tools, set tools,
  and parameters of set tools. Change the Juno UI to understand these
  declarations.

Done on Mon May 16 15:04:17 PDT 1994 by heydon
  o Change the UI so that the bundled-in modules are installed in a
  VPackSplit, instead of in top-level windows.

Done on Thu May  5 13:40:20 PDT 1994 by heydon
  o Add procedures for setting the font face and font size independently.
  Also, add procedures for getting the face and size values of the current
  font.

Done on Thu May  5 13:40:12 PDT 1994 by heydon
  o An X font of size "n" has capital letters that are roughly "n" pixels
  high. However, there is some variance between one font and the next. Change
  the "PS" module so font sizes are specified by symbolic names.

Done on Thu May  5 13:38:01 PDT 1994 by heydon
  o The PostScript fonts always come out smaller than the X fonts on the
  screen. The reason is that the X font "size" is (roughly) the height of a
  capital letter, whereas the PostScript font "size" is the height of a
  capital letter plus some inter-line spacing. Fix the way PostScript fonts
  are sized so they correspond to the X fonts.

Done on Thu May  5 13:35:31 PDT 1994 by heydon
  o Change "PS.SetRGB" to "PS.SetColor".

Done on Mon May  2 15:49:57 PDT 1994 by heydon
  o Add procedure "PS.StringBBox".

Done on Tue Feb 15 16:09:04 PST 1994 by heydon
  o Change the cursor into a watch while compiling the drag command [heydon].

Done on Tue Feb 15 16:12:56 PST 1994 by heydon
  o Add the notion of the current command "stack" to the module editor and the
  UI [heydon].

Done on Mon Jan 17 15:51:23 PST 1994 by heydon
  o Change definition of the current point in the PS module so that it is not
  undefined if the current sub-path is closed.

Done on Mon Nov 15 17:20:54 PST 1993 by heydon
  o Pickle AFM files with separate program.

Done on Fri Oct 22 12:02:49 PDT 1993 by heydon
  o Add "PS.CurrentPath" to "PS.juno" and "PSModule.m3" [gnelson].

Done on Thu Sep 16 16:16:25 PDT 1993 by heydon
  o Fix LoadBrowser so it is not read-only. Then, the user can create a new
  (empty) module by typing the new file's name in the "Load..." dialogue.

Done on Tue Sep  7 16:47:08 PDT 1993 by heydon
  o Make printing directly to a printer and saving PS to a named file work.

Done on Tue Sep  7 16:46:25 PDT 1993 by heydon
  o Bundle in standard modules.

Done on Tue Sep  7 16:45:56 PDT 1993 by heydon
  o Build a separate editor for the PS and TEXT modules. These editors are
  special, since they do not admit a private view.

Done on Mon Aug 30 16:30:39 PDT 1993 by heydon
  o Separate code for doing animated drags into a separate "Drag" interface?

Done on Fri Aug 27 18:22:27 PDT 1993 by heydon
  o UI for entering text

Done on Wed Jul  7 23:49:30 PDT 1993 by heydon
  o Add PS.ShowPage() and Symbol font to the "PSModule".

Done on Fri Jul  2 11:36:37 PDT 1993 by heydon
  o Implement the TEXT module.

Done on Tue Jun 15 13:39:49 PDT 1993 by heydon
  o Add text to PS interface.

Done on Tue Apr 13 13:21:16 PDT 1993 by heydon
  o Add Close procedure and width, endstyles, joint styles, and winding
  conditions to PS interface.

Done on Fri Apr  9 18:18:23 PDT 1993 by heydon
  o Make the Drag tool use the difference between the cursor and the draggee
  as the delta each time the mouse is moved.

Done on Thu Apr  8 11:17:09 PDT 1993 by heydon
  o Continuous solve

Done on Tue Mar 30 11:30:35 PST 1993 by heydon (actually done a while ago)
  o Add support for multiple editor modules, each with a button, public, and
  private view.

Done on Tue Mar 30 11:30:35 PST 1993 by heydon (actually done a while ago)
  o Create tools for functions, as well as predicates and procedures.

CODE IMPROVEMENTS =============================================================

  o Clean up the CurrCmd interface, so it simply provides syntactic
  operations on the current command.

  o Merge Source and Editor modules.

Done on Thu Jan 11 18:32:48 PST 1996 by heydon and gnelson
  o Changed "Drawing" implementation so the "text" method of a
  "Drawing.ProcTool" is invoked automatically with an empty text
  argument immediately after the "setup" method if the tool is a text
  tool with one arg. Previously, this was being done in the default
  "Drawing.ProcTool" "setup" method.

INEFFICIENCIES ================================================================

  o Add logging (make compiling lazy)

  o Add sprites to drawing view.

Done on Mon Jun 16 16:23:28 PDT 1997 by heydon
  o Changed m3makefile so the application is now compiled with
  optimization for efficiency.

Done on Thu Jan 11 18:29:19 PST 1996 by heydon and gnelson
  o Use the DblBufferVBT "saved buffer" to implement text tools more
  efficiently.

Done on Sun Jun 18 09:10:10 PDT 1995 by heydon
  o Rearranged code so the startup window is displayed as soon as possible.

Done on Tue Feb 28 11:56:00 PST 1995 by heydon
  o Change "Arc" module so any arc that is (almost exactly) an
  integral multiple of quarter circles is drawn using quarter circles
  only.

Done on Fri Jun 17 17:50:46 PDT 1994 by heydon
  o The "reshape" method of the drawing view is doing work even if the "new"
  rectangle is empty (which happens, for example, when the window is deleted).

Done on Thu May 19 18:20:27 PDT 1994 by heydon
  o Optimize "ToolBox.Update" so it does not create a new set of buttons on
  every update. In particular, if the name matches but the signature has
  changed, the current button should simply be replaced. If the name does not
  match, the new button should simply be inserted. If both the name and the
  signature match, then the button is correct as is.

Done on Wed Apr 20 17:33:21 PDT 1994 by heydon
  o The current command is being unparsed even when the current command view's
  domain is empty [heydon].

Done on Wed Apr 20 16:43:43 PDT 1994 by heydon
  o The current command is being "made" (and hence, unparsed) *twice* on each
  Fold, Push, and Pop [heydon].

Done on Sun Feb 20 18:15:19 PST 1994 by heydon  
  o "ToolBox.Update" is being called when the Make button is clicked, even if
  the current module has not changed [heydon].

Done on Thu Nov 11 18:05:40 PST 1993 by heydon
  o Make compiles the current command twice when the source view has been
  edited by hand. The first compilation is just to check for errors!
