// **********************************************************************
//
// <copyright>
//
// BBN Technologies
// 10 Moulton Street
// Cambridge, MA 02138
// (617) 873-8000
//
// Copyright (C) BBNT Solutions LLC. All rights reserved.
//
// </copyright>
// **********************************************************************
//
// $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/layer/link/LinkPoint.java,v $
// $RCSfile: LinkPoint.java,v $
// $Revision: 1.6 $
// $Date: 2009/01/21 01:24:41 $
// $Author: dietrick $
//
// **********************************************************************
package com.bbn.openmap.layer.link;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import com.bbn.openmap.omGraphics.OMPoint;
import com.bbn.openmap.util.Debug;
import com.bbn.openmap.util.PropUtils;
/**
* Read and write the Link protocol for points. The protocol for the point has
* location information for the point, as well as a radius value indicating the
* size associated with this point. OMPoints also support whether the point
* should be rendered as a rectangle or an oval. That choice is specified as a
* property for the LinkPoint, along with any other rendering or attribute
* information that should be applied to the point.
*/
public class LinkPoint implements LinkGraphicConstants, LinkPropertiesConstants {
/**
* The property for the LinkPoint to specify if the OMPoint should be
* rendered as an oval. The value should be true or false, depending if the
* point should be rendered as an oval.
*/
public final static String LPC_POINT_OVAL = "oval";
/**
* Create a lat/lon point.
*
* @param lt latitude of north edge, decimal degrees.
* @param ln longitude of west edge, decimal degrees.
* @param radius pixel radius of the point.
* @param properties description of drawing attributes.
* @param dos DataOutputStream
* @throws IOException
*/
public static void write(float lt, float ln, int radius,
LinkProperties properties, DataOutputStream dos)
throws IOException {
dos.write(Link.POINT_HEADER.getBytes());
dos.writeByte(GRAPHICTYPE_POINT);
dos.writeByte(RENDERTYPE_LATLON);
dos.writeFloat(lt);
dos.writeFloat(ln);
dos.writeInt(radius);
properties.write(dos);
}
/**
* Construct an XY point at a screen location..
*
* @param px1 x pixel position of the first corner relative to the window
* origin
* @param py1 y pixel position of the first corner relative to the window
* origin
* @param radius pixel radius of the point.
* @param properties description of drawing attributes.
* @param dos DataOutputStream
* @throws IOException
*/
public static void write(int px1, int py1, int radius,
LinkProperties properties, DataOutputStream dos)
throws IOException {
dos.write(Link.POINT_HEADER.getBytes());
dos.writeByte(GRAPHICTYPE_POINT);
dos.writeByte(RENDERTYPE_XY);
dos.writeInt(px1);
dos.writeInt(py1);
dos.writeInt(radius);
properties.write(dos);
}
/**
* Construct an XY point relative to a lat/lon point (RENDERTYPE_OFFSET). It
* doesn't matter which corners of the point are used, as long as they are
* opposite from each other.
*
* @param lt latitude of the reference point, decimal degrees.
* @param ln longitude of the reference point, decimal degrees.
* @param px1 x pixel position of the first corner relative to the reference
* point
* @param py1 y pixel position of the first corner relative to the reference
* point
* @param radius a pixel radius of the point.
* @param properties description of drawing attributes.
* @param dos DataOutputStream
* @throws IOException
*/
public static void write(float lt, float ln, int px1, int py1, int radius,
LinkProperties properties, DataOutputStream dos)
throws IOException {
dos.write(Link.POINT_HEADER.getBytes());
dos.writeByte(GRAPHICTYPE_POINT);
dos.writeByte(RENDERTYPE_OFFSET);
dos.writeFloat(lt);
dos.writeFloat(ln);
dos.writeInt(px1);
dos.writeInt(py1);
dos.writeInt(radius);
properties.write(dos);
}
/**
* Write an OMPoint to the Link.
*/
public static void write(OMPoint point, Link link, LinkProperties props)
throws IOException {
props.setProperty(LinkPoint.LPC_POINT_OVAL, point.isOval() ? "true"
: "false");
switch (point.getRenderType()) {
case OMPoint.RENDERTYPE_LATLON:
LinkPoint.write((float) point.getLat(),
(float) point.getLon(),
point.getRadius(),
props,
link.dos);
break;
case OMPoint.RENDERTYPE_XY:
LinkPoint.write(point.getX(),
point.getY(),
point.getRadius(),
props,
link.dos);
break;
case OMPoint.RENDERTYPE_OFFSET:
LinkPoint.write((float) point.getLat(),
(float) point.getLon(),
point.getX(),
point.getY(),
point.getRadius(),
props,
link.dos);
break;
default:
Debug.error("LinkPoint.write: point rendertype unknown.");
}
}
/**
* Read the DataInputStream, and create an OMPoint. Assumes that the
* LinkPoint header has been read from the link.
*
* @param dis DataInputStream
* @return OMPoint
* @throws IOException
* @see com.bbn.openmap.omGraphics.OMPoint
*/
public static OMPoint read(DataInputStream dis) throws IOException {
return read(dis, null);
}
/**
* Read the DataInputStream, and create an OMPoint. Assumes that the
* LinkPoint header has been read from the link.
*
* @param dis DataInputStream
* @param propertiesBuffer a LinkProperties object used to cache previous
* settings that can be set on the OMPoint being read.
* @return OMPoint
* @throws IOException
* @see com.bbn.openmap.omGraphics.OMPoint
*/
public static OMPoint read(DataInputStream dis,
LinkProperties propertiesBuffer)
throws IOException {
OMPoint point = null;
int x1, y1, radius;
float lt, ln;
int renderType = dis.readByte();
switch (renderType) {
case RENDERTYPE_LATLON:
lt = dis.readFloat();
ln = dis.readFloat();
radius = dis.readInt();
point = new OMPoint(lt, ln, radius);
break;
case RENDERTYPE_XY:
x1 = dis.readInt();
y1 = dis.readInt();
radius = dis.readInt();
point = new OMPoint(x1, y1, radius);
break;
case RENDERTYPE_OFFSET:
lt = dis.readFloat();
ln = dis.readFloat();
x1 = dis.readInt();
y1 = dis.readInt();
radius = dis.readInt();
point = new OMPoint(lt, ln, x1, y1, radius);
break;
default:
}
if (point != null) {
propertiesBuffer = LinkProperties.loadPropertiesIntoOMGraphic(dis,
point,
propertiesBuffer);
if (propertiesBuffer != null) {
point.setOval(PropUtils.booleanFromProperties(propertiesBuffer,
LPC_POINT_OVAL,
OMPoint.DEFAULT_ISOVAL));
}
}
return point;
}
}