Changed between GEV v04 and v05.

1. Spawning a new editor frame now uses
"this.getClass().newInstance()", so the implementation of clone() in
Editor can now be used in subclasses. That is to say, if you define a
subclass of Editor, you no longer have to override clone(), although
you now must provide a constructor with no arguments.

2. When Perspectives are deleted, they remove themselves as Observers
on their parent NetNode in the net level model. ArcPerspectives now
add themselves as Observers when constructed and remove themselves as
Observers in removeFrom().

3. NetNode and NetArc now send notifications when they are
disposed. Perspective and ArcPerspective catch these notifications and
remove themselves.

4. Changed all calls to notifyObservers and all implementations of
update such that if they used a String to indicate what had happend
(e.g., "remove" to indicate a DiagramElement had been removed) then
they will now use unique String constants defined in class
Globals.

5. Fixed a bug that prevented event processing in an editor read from
disk. Basically the _eventQueue and _eventHandler instance variables
in Editor are transient so that they will not be serialized. My
original intent was to reinitialize their values when the Editor was
read from disk. However, I mistakenly forgot to add the
reinitialization.

6. Fixed a somewhat mysterious bug that caused the MenuBar to overlap
the drawing area in the first window opened when running
BasicApplication. Apparently overlap happens when the menubar of a
frame is set before a panel is added to the frame. Changing the order
of operations seems to have solved the problem.

7. Totally reimplemented the property sheet to be faster and simpler
and better documented. The new property sheet uses the new IProps interface.

8. Replaced existing graphical attribute access methods with a new
implementation. Originally DiagramElements implemented
getGraphicalAttribute() and setGraphicalAttribute() where the key was a
string and the value was an Object and the interpretation of that
Object was hard coded in various places. In implementing the original
PropertySheet, new code was added getProperties() and setProperties() that
used vectors of UiProperty objects that contained a key, value, and
UiType object that indicated how the value object was to be
interperted. Having code for both systems of attributes caused a lot
of duplicated and confusing code. Now I have returned to something
closer to the original design, but more efficent. DiagramElements
implement interface IProps which defines some simple access methods
(various forms of get() and put()) as well as separate methods for
meta-data about what properties are available and which are read-write
(as opposed to read-only). The new system is somewhat faster for these
reasons: property names are interned strings that can be compared with
== instead of using String.equals(); the properties are broken into
categories so that the property sheet does not need to display them
all; fewer Vector, Integer and Boolean objects are created.

9. Fixed several errors that prevented serialization from working
properly under JDK1.0.2 and JDK1.1. Now all classes that need to have
instances saved implement interface GEF (see below). Also under
JDK1.1 the observers of an Observable object are not saved. For this
reason I now use Observable/Observer pairs only for relationships that
will not be saved (e.g., the PropSheet is an observer of a currently
selected DiagramElement). Logic that did use Observable/Observer
relationships now uses direct pointers in addition. For example,
DiagramElement now has a pointer to the Layer that contains it. And
all Layers notify Editors that are editing them directly, change
notifications no longer walk up the nested LayerComposite hierarchy.

10. Added interface GEF. Many classes implement interface GEF. GEF
defines constants that I want to be available in all classes, and it
can also extend "marker interfaces" such as java.io.Serializable or
Cloneable. Since some marker interfaces are not present in JDK1.0.2, I
have provided an m4 file that can generate two versions of GEF.java
(one for jdk1.0.2 and one for jdk1.1).

11. Many (but not all) classes now use getXXX() and setXXX() names for
their accessor methods. This makes the code closer to widely accepted
coding standards. This naming convention also helps to open
possibilities for integrating with JavaBeans, although I do not have
any real plans for that yet.

12. Fixed a typo in EditorMenus "Preferences" is now spelled correcly.

13. Increased the default refresh rate in RedrawManager, also
increased the maximum refresh rate that can be set. I think this is a
good idea because the framework is now faster and I would like to show
off that speed. If you find that you are getting ahead of the editor,
you can lower the refresh rate through the preferences dialog box.

14. Added properties in FigText to support underline, strike out, and
shadowed text. These are not implemented yet and would make excelent
small projects for people that want to contribute to GEF.

15. Added actions ActionSelectAll and ActionSelectInvert to help the
user select DiagramElements. I added these to a Select submenu under
the Edit menu. Also ActionSelectNext has been modified to accept its
direction argument in its constructor so that it can be added to the
menu. ActionSelectSuchThat is not implemented yet, but it would make
an excelent small project for people that want to contribute to
GEF. The intent is to put up a dialog box that lets the user specify a
query based on DiagramElement properties, DiagramElements that match
the query will be selected.

16. Added a title instance variable to Editor intented to store the
desired window title. However the concept of a document needs to be
more fully developed in order for this to make much sense.

17. Updated uci/graphedit/Makefile and uci/Makefile.config to handle
m4 preprocessor files better.

18. Defined FigInk so that it will never be filled and never be
rectilinear and always have line width of (at least) 1.

19. Added a work-around in Editor#createImage to try to avoid getting a
null Image. I call addNotify() if the peer has not already been
set. This work-around can itself generate a NullPointerException in
the AWT peer classes, I don't know why, but it seems harmless and the
createImage() call seems to work even if addNotify() raised an
exception.

20. Changed the way borders are drawn on FigRect, FigCircle, and
FigRRect. Now the line width is taken into account so that the line
fits inside the Fig's bbox.

21. Chaged the number of rows in the PrefsEditor so that it looks much
better.

22. Added a status bar in the Editor. This only appears if you let the
Editor make its own panel and frame and if you are not in an
applet. This Needs-More-Work.

23. Added a work around for loading documents with images. The images
are not saved and are not loaded back when the document is
loaded. Instead I draw a simple rectangle. This Needs-More-Work.

24. Guarded some operations that require an applet context with code
to check if there is an AppletContext available. For example,
PaletteFig will not show the two image buttons if you run
BasicApplication.

25. Added code to RedrawManager to avoid making new Images on each
redraw. Instead, several fixed size Images are allocated when first
needed and then reused. The disadvantage is that I redraw a little
more area than is really damaged. The advantage is that I avoid
allocating Images (which are large and complex objects) and creating
garbage. 

26. Added line spacing and margins to FigText. Also, FigText can
resize to fit the text more tightly. In previous GEF versions, the
FigText bounding box only got bigger, never smaller. Now this behavior
is controled by a boolean in FigText.

27. Fixed a bug that caused FigText to not update multiple views when
you added or removed characters. Basically, all Fig's should call
startTrans() and endTrans(), they should not make direct calls to
Editor#damage() because that only updates one Editor.

28. Added a Makefile option to compile with or without some widget
code from Symantec. In the property sheet I would like to have tabs
to select various catagories of properties. I achieved this by using
the classes that come with Symantec VisualCafe. It is my understanding
that I am allowed to redistribute the Symantec .class files, but no
their source code. I have included the needed .class files in the
current GEF distribution. If you don't want to use the Symantec
classes you can change Makefile.config and regenerate
uci/ui/TabPropFrame.java, or you can just edit that file. If you do
not use the Symantec tabs, there will be a Choice of categories
instead.

29. Changed the way that arcs and nodes are added and removed, so that
these operations can be initiated from th euser interface, or from
some other code. I had always intended this to work, but previously I
had only tested adding and removing from the UI. As soon as I tried
doing it programmatically, I realized several problems.

30. Updated my version of Sun's ObjectSerialization libary, and much
to my dispare I found that saving and loading no longer work under
jdk1.0.2. The problem is that classes such as java.util.Hashtable must
implement java.io.Serializable, but they do not in jdk1.0.2. So there
is really nothing I can do, other than stop using Hashtables and
Vectors. Instead I just use jdk1.1.1 for building applications.
(Applets cannot currently load or save anyway, but adding the ability
to use a URL would be a good project).

31. Editing a node now opens a property sheet on that node by
default. Previously, I just printed a message so that users could find
the method that they should override to define their own node editing
capabilities. For an example, perform "Edit Node" on a CPU node when
running uci/graphedit/demo/EquipmentApplet.html.

32. Enhanced the EquipmentApplet example to show off more GEF
features. It also shows what a pain it is to define new properties,
but this is the best I can do for now. Look at the CPU node and the
data cable to see some properties.



