2009.05.18

* GwtUtils and SashaMaps have been updated to use the new language features
  available in Java 1.5, the support for which was added in GWT 1.5. This
  includes use of type-parameterization, foreach loops, better use of
  Collections etc. This change affects users of SashaMaps in ways listed below.
* GWT 1.5.3 is now required to compile SashaMaps.
* Alignment is now an enum. It no longer has a public constructor, but instead
  a getInstance(HorizontalAlignmentConstant, VerticalAlignmentConstant) method.
* Callback is now parameterized with the type of the object passed to the
  callback method.
* Pair is now type-parameterized, in the obvious manner.
* ReadyListener and DelegatingReadyListenerCollection are now parameterized with
  the type of the source object.
* GroupReadyListener is now parameterized with both the type of the items in the
  interest set and the type of the source object.
* GroupReadyListener's constructor no longer allows a null value for the source
  parameter. This is because the type of the source parameter must be known at
  compile time. Previously, a null value meant that the newly created
  GroupReadyListener itself was used as the source.
* ResultCallback is now parameterized with the type of the result object.
* XmlResponseHandler is now parameterized with the type of the result object.
* An XmlResponseHandler with a null parser must either be parameterized with
  com.google.gwt.xml.client.Document or override the parseResponse(Document)
  method.
* The XmlResponseHandler constructor that does not take a parser as an argument
  has been removed as it can only be used if the result object is of type
  Document.
* The setGridRow, addWidget and addDialogButtons methods in UiUtils now take
  Lists of widgets and vertical and horizontal alignments. Previously they took
  arrays.
* Wherever the documentation of a method asked to treat the returned collection
  as unmodifiable (and in many places where it forgot to do so, but obviously
  intended to), the returned collection is now actually unmodifiable.
* MenuItemSeparator has been removed from GwtUtils, as GWT 1.5 has this
  functionality built-in.



2008.11.07

* Moved support for Google Maps into its own package -
  com.maryanovsky.map.client.google. The com.maryanovsky.map.client.impl package
  is no longer with us.
* Using Google Maps now requires a Google Maps API key.
* Added a ParseUtils class into GwtUtils. The class has some useful parsing
  utilities, mainly for processing XML documents.
* Many classes, which were not meant to be subclassed, are now declared final.
* LatLng now allows -180 as a legal longitude value.
* LatLng.equals(Object) and LatLng.hashCode() now compare LatLng objects for
  geographical identity. That is, two LatLng objects are considered equal if
  they represent the same location on the globe. For example,
  (latitude=20, longitude=-180) and (latitude=20, longitude=180) are equal.
* Added a new interface, DoublePointView, and an implementation, DoublePoint, to
  GwtUtils. Additionally, LatLng now implements DoublePointView.
* Fixed a bug in TileLayerWidget where tile width and tile height were mixed up,
  which would have caused problems for tile layers where they are different.
* The location passed to TileLayer.getTileUrl(x,y,zoom) is now the middle of the
  tile instead of the top-left. This is done to avoid tile-boundary issues and
  make it easier on TileLayer implementations to return the right tile. Existing
  correct TileLayer implementations should not be affected.
* Added support for Web Map Service maps - see the
  com.maryanovsky.map.client.opengis.wms package.
* Refactored the way projections are implemented - see the new
  com.maryanovsky.map.client.projections package and the AbstractProjection
  class.
* Replaced WidgetOverlay's 4 getters and setters of horizontal and vertical
  alignment with setAlignment(Alignment) and getAlignment().
* Improved the performance of adding many WidgetOverlays and the handling of the
  map when many have been added.
* The styling of the rectangle in the overview map widget marking the bounds of
  the main map widget is no longer hard-coded. It now sits in the overview.css
  file and can be overridden.


2008.07.28

* OverviewMapWidget.Synchronization has a new method:
  MapLocationModel createOverviewLocationModel(MapWidget mainWidget). This
  method is responsible for creating the MapLocationModel of the overview map
  widget. Assigning this responsibility to a separate method allows the
  overview MapLocationModel to be different from the model of the main map
  widget. Previously, the overview map widget used a copy of main map widget's
  model, which, for example, restricted it to the same range of zooms. The
  default implementation of the new method in
  OverviewMapWidget.StandardSynchronization now behaves as OverviewMapWidget
  used to (i.e. creates a copy of the main map widget's model).
* Moved OverviewMapWidget into com.maryanovsky.map.client.widgets.overview.
  Future map related widgets will also be placed under the widgets subpackage.
* Implemented a GoogleMaps-like LargeZoomWidget.
* Implemented a GoogleMaps-like ScaleWidget.
* Added a new method to the Projection interface - getWrapSize(int zoom), which
  returns the size of the entire map in pixels at a given zoom. This allows
  MapWidget to correctly wrap locations when the entire map (earth) is displayed
  more than once. 
* The length of pan and zoom animations in MapWidget is now customizeable.
* Changed the default length of pan and zoom animations in MapWidget from 500ms
  to 300ms.
* Fixed a bug in PilePanel (a GwtUtils class) causing PopupPanels to appear
  behind any overlays and widgets on the map.
* To improve performance, WidgetOverlay now hides (via setVisible(false)) its
  widget if the widget's bounds do not intersect with the bounds of the overlay
  panel.
* Many changes and new features in the GwtUtils library.
* Other bugfixes I implemented but didn't write down their descriptions.
* The release file now includes the tutorial and the javadoc for both Sasha Maps
  and GwtUtils.
* The released source is now obfuscated. You may receive the full unobfuscated
  source by obtaining a commercial license. 
