gov.noaa.nws.mdl.viz.boundaryTool moved from its own repo

This commit is contained in:
mjames-upc 2017-10-01 10:51:30 -06:00
parent 1372fba828
commit 344058c0cd
25 changed files with 6316 additions and 0 deletions

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>gov.noaa.nws.mdl.viz.boundaryTool.common.feature</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.pde.FeatureBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.FeatureNature</nature>
</natures>
</projectDescription>

View file

@ -0,0 +1 @@
bin.includes = feature.xml

View file

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<feature
id="gov.noaa.nws.mdl.viz.boundaryTool.common.feature"
label="Feature"
version="1.0.0.qualifier">
<description url="http://www.example.com/description">
[Enter Feature Description here.]
</description>
<copyright url="http://www.example.com/copyright">
[Enter Copyright Description here.]
</copyright>
<license url="http://www.example.com/license">
[Enter License Description here.]
</license>
<requires>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="org.eclipse.ui"/>
<import plugin="com.raytheon.viz.core"/>
<import plugin="org.apache.commons.lang"/>
<import plugin="org.geotools"/>
<import plugin="com.raytheon.viz.ui.tools.map"/>
<import plugin="com.raytheon.viz.ui"/>
<import plugin="javax.measure"/>
<import plugin="com.raytheon.uf.common.pointdata"/>
<import plugin="javax.vecmath" version="1.3.1" match="greaterOrEqual"/>
<import plugin="com.raytheon.uf.common.awipstools" version="1.12.1112" match="greaterOrEqual"/>
<import plugin="com.raytheon.uf.common.serialization.comm" version="1.12.1112" match="greaterOrEqual"/>
<import plugin="com.raytheon.uf.viz.d2d.core"/>
<import plugin="com.raytheon.uf.common.dataplugin.radar" version="1.0.0" match="greaterOrEqual"/>
<import plugin="com.raytheon.uf.viz.core.maps" version="1.12.1174" match="greaterOrEqual"/>
<import plugin="com.raytheon.uf.viz.d2d.ui"/>
<import plugin="com.raytheon.viz.awipstools"/>
<import plugin="com.raytheon.uf.viz.points" version="1.0.0" match="greaterOrEqual"/>
<import plugin="com.raytheon.uf.viz.core.rsc" version="1.0.0" match="greaterOrEqual"/>
<import plugin="com.raytheon.uf.common.topo"/>
</requires>
<plugin
id="gov.noaa.nws.mdl.viz.boundaryTool"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
</feature>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>gov.noaa.nws.mdl.viz.boundaryTool</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View file

@ -0,0 +1,36 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Boundarytools Plug-in
Bundle-SymbolicName: gov.noaa.nws.mdl.viz.boundaryTool;singleton:=true
Bundle-Version: 1.15.0.qualifier
Bundle-Vendor: MDL
Eclipse-RegisterBuddy: com.raytheon.uf.viz.core.rsc
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.ui,
com.raytheon.viz.core,
org.apache.commons.lang,
org.geotools,
com.raytheon.viz.ui.tools.map,
com.raytheon.viz.ui,
javax.measure,
com.raytheon.uf.common.pointdata,
javax.vecmath;bundle-version="1.3.1",
com.raytheon.uf.common.awipstools;bundle-version="1.12.1112",
com.raytheon.uf.common.serialization.comm;bundle-version="1.12.1112",
com.raytheon.uf.viz.d2d.core,
com.raytheon.uf.common.dataplugin.radar;bundle-version="1.0.0",
com.raytheon.uf.viz.core.maps;bundle-version="1.12.1174",
com.raytheon.uf.viz.d2d.ui,
com.raytheon.viz.awipstools,
com.raytheon.uf.viz.points;bundle-version="1.0.0",
com.raytheon.uf.viz.core.rsc;bundle-version="1.0.0"
Bundle-ActivationPolicy: lazy
Export-Package: gov.noaa.nws.mdl.viz.boundaryTool,
gov.noaa.nws.mdl.viz.boundaryTool.common.boundary,
gov.noaa.nws.mdl.viz.boundaryTool.ui.action,
gov.noaa.nws.mdl.viz.boundaryTool.ui.dialog,
gov.noaa.nws.mdl.viz.boundaryTool.ui.layer
Import-Package: com.raytheon.uf.common.topo,
com.raytheon.uf.viz.d2d.core,
com.raytheon.uf.viz.d2d.ui.dialogs.procedures
Bundle-RequiredExecutionEnvironment: JavaSE-1.7

View file

@ -0,0 +1,6 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
plugin.xml,\
localization/

View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
point="org.eclipse.ui.handlers">
<handler
class="gov.noaa.nws.mdl.viz.boundaryTool.ui.action.BoundaryEditorAction"
commandId="gov.noaa.nws.mdl.viz.boundaryTool.boundaryeditor">
</handler>
</extension>
<extension
point="org.eclipse.ui.commands">
<command
id="gov.noaa.nws.mdl.viz.boundaryTool.boundaryeditor"
name="Boundary Editor">
</command>
</extension>
<extension point="org.eclipse.ui.menus">
<menuContribution
locationURI="menu:tools?after=tools.Ti">
<command commandId="gov.noaa.nws.mdl.viz.boundaryTool.boundaryeditor"
label="Boundary Tool..."
style="push">
<visibleWhen>
<reference definitionId="com.raytheon.uf.viz.d2d.ui.inD2DActionSet">
</reference>
</visibleWhen>
</command>
</menuContribution>
</extension>
</plugin>

View file

@ -0,0 +1,977 @@
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2012.07.12 at 04:10:24 PM EDT
//
package gov.noaa.nws.mdl.viz.boundaryTool.boundaries.state.xml;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.datatype.XMLGregorianCalendar;
/**
* <p>
* Java class for anonymous complex type.
*
* <p>
* The following schema fragment specifies the expected content contained within
* this class.
*
* <pre>
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="UserName" type="{http://www.w3.org/2001/XMLSchema}string"/>
* &lt;element name="TimeInfo">
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="FileCreationTime" type="{http://www.w3.org/2001/XMLSchema}dateTime"/>
* &lt;element name="FileCreationUtime" type="{http://www.w3.org/2001/XMLSchema}long"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* &lt;/element>
* &lt;element name="Boundary" maxOccurs="unbounded" minOccurs="0">
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="BoundaryId" type="{http://www.w3.org/2001/XMLSchema}int" minOccurs="0"/>
* &lt;element name="BoundaryType" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* &lt;element name="BoundaryMode" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* &lt;element name="BoundaryLifeSpan" type="{http://www.w3.org/2001/XMLSchema}int" minOccurs="0"/>
* &lt;element name="BoundaryCreationTime" type="{http://www.w3.org/2001/XMLSchema}dateTime" minOccurs="0"/>
* &lt;element name="BoundaryCreationUtime" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/>
* &lt;element name="BoundaryEditedTime" type="{http://www.w3.org/2001/XMLSchema}dateTime" minOccurs="0"/>
* &lt;element name="BoundaryEditedUtime" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/>
* &lt;element name="BoundaryExpirationTime" type="{http://www.w3.org/2001/XMLSchema}dateTime" minOccurs="0"/>
* &lt;element name="BoundaryExpirationUtime" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/>
* &lt;element name="NumberOfVertices" type="{http://www.w3.org/2001/XMLSchema}int" minOccurs="0"/>
* &lt;element name="Vertex" maxOccurs="unbounded" minOccurs="0">
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="Latitude" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;element name="Longitude" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;element name="Azimuth" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;element name="Speed" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;element name="U" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;element name="V" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* &lt;/element>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* &lt;/element>
* &lt;element name="ForbiddenBoundaryIds" maxOccurs="unbounded" minOccurs="0">
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="ForbiddenId" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* &lt;/element>
* &lt;element name="Log" maxOccurs="unbounded" minOccurs="0">
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="Comment" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* &lt;/element>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "userName", "timeInfo", "boundary",
"forbiddenBoundaryIds", "log" })
@XmlRootElement(name = "Boundaries")
public class Boundaries {
@XmlElement(name = "UserName", required = true)
protected String userName;
@XmlElement(name = "TimeInfo", required = true)
protected Boundaries.TimeInfo timeInfo;
@XmlElement(name = "Boundary")
protected List<Boundaries.Boundary> boundary;
@XmlElement(name = "ForbiddenBoundaryIds")
protected List<Boundaries.ForbiddenBoundaryIds> forbiddenBoundaryIds;
@XmlElement(name = "Log")
protected List<Boundaries.Log> log;
/**
* Gets the value of the userName property.
*
* @return possible object is {@link String }
*
*/
public String getUserName() {
return userName;
}
/**
* Sets the value of the userName property.
*
* @param value
* allowed object is {@link String }
*
*/
public void setUserName(String value) {
this.userName = value;
}
/**
* Gets the value of the timeInfo property.
*
* @return possible object is {@link Boundaries.TimeInfo }
*
*/
public Boundaries.TimeInfo getTimeInfo() {
return timeInfo;
}
/**
* Sets the value of the timeInfo property.
*
* @param value
* allowed object is {@link Boundaries.TimeInfo }
*
*/
public void setTimeInfo(Boundaries.TimeInfo value) {
this.timeInfo = value;
}
/**
* Gets the value of the boundary property.
*
* <p>
* This accessor method returns a reference to the live list, not a
* snapshot. Therefore any modification you make to the returned list will
* be present inside the JAXB object. This is why there is not a
* <CODE>set</CODE> method for the boundary property.
*
* <p>
* For example, to add a new item, do as follows:
*
* <pre>
* getBoundary().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Boundaries.Boundary }
*
*
*/
public List<Boundaries.Boundary> getBoundary() {
if (boundary == null) {
boundary = new ArrayList<Boundaries.Boundary>();
}
return this.boundary;
}
/**
* Gets the value of the forbiddenBoundaryIds property.
*
* <p>
* This accessor method returns a reference to the live list, not a
* snapshot. Therefore any modification you make to the returned list will
* be present inside the JAXB object. This is why there is not a
* <CODE>set</CODE> method for the forbiddenBoundaryIds property.
*
* <p>
* For example, to add a new item, do as follows:
*
* <pre>
* getForbiddenBoundaryIds().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Boundaries.ForbiddenBoundaryIds }
*
*
*/
public List<Boundaries.ForbiddenBoundaryIds> getForbiddenBoundaryIds() {
if (forbiddenBoundaryIds == null) {
forbiddenBoundaryIds = new ArrayList<Boundaries.ForbiddenBoundaryIds>();
}
return this.forbiddenBoundaryIds;
}
/**
* Gets the value of the log property.
*
* <p>
* This accessor method returns a reference to the live list, not a
* snapshot. Therefore any modification you make to the returned list will
* be present inside the JAXB object. This is why there is not a
* <CODE>set</CODE> method for the log property.
*
* <p>
* For example, to add a new item, do as follows:
*
* <pre>
* getLog().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Boundaries.Log }
*
*
*/
public List<Boundaries.Log> getLog() {
if (log == null) {
log = new ArrayList<Boundaries.Log>();
}
return this.log;
}
/**
* <p>
* Java class for anonymous complex type.
*
* <p>
* The following schema fragment specifies the expected content contained
* within this class.
*
* <pre>
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="BoundaryId" type="{http://www.w3.org/2001/XMLSchema}int" minOccurs="0"/>
* &lt;element name="BoundaryType" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* &lt;element name="BoundaryMode" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* &lt;element name="BoundaryLifeSpan" type="{http://www.w3.org/2001/XMLSchema}int" minOccurs="0"/>
* &lt;element name="BoundaryCreationTime" type="{http://www.w3.org/2001/XMLSchema}dateTime" minOccurs="0"/>
* &lt;element name="BoundaryCreationUtime" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/>
* &lt;element name="BoundaryEditedTime" type="{http://www.w3.org/2001/XMLSchema}dateTime" minOccurs="0"/>
* &lt;element name="BoundaryEditedUtime" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/>
* &lt;element name="BoundaryExpirationTime" type="{http://www.w3.org/2001/XMLSchema}dateTime" minOccurs="0"/>
* &lt;element name="BoundaryExpirationUtime" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/>
* &lt;element name="NumberOfVertices" type="{http://www.w3.org/2001/XMLSchema}int" minOccurs="0"/>
* &lt;element name="Vertex" maxOccurs="unbounded" minOccurs="0">
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="Latitude" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;element name="Longitude" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;element name="Azimuth" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;element name="Speed" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;element name="U" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;element name="V" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* &lt;/element>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "boundaryId", "boundaryType",
"boundaryMode", "boundaryLifeSpan", "boundaryCreationTime",
"boundaryCreationUtime", "boundaryEditedTime",
"boundaryEditedUtime", "boundaryExpirationTime",
"boundaryExpirationUtime", "numberOfVertices", "vertex" })
public static class Boundary {
@XmlElement(name = "BoundaryId")
protected Integer boundaryId;
@XmlElement(name = "BoundaryType")
protected String boundaryType;
@XmlElement(name = "BoundaryMode")
protected String boundaryMode;
@XmlElement(name = "BoundaryLifeSpan")
protected Integer boundaryLifeSpan;
@XmlElement(name = "BoundaryCreationTime")
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar boundaryCreationTime;
@XmlElement(name = "BoundaryCreationUtime")
protected Long boundaryCreationUtime;
@XmlElement(name = "BoundaryEditedTime")
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar boundaryEditedTime;
@XmlElement(name = "BoundaryEditedUtime")
protected Long boundaryEditedUtime;
@XmlElement(name = "BoundaryExpirationTime")
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar boundaryExpirationTime;
@XmlElement(name = "BoundaryExpirationUtime")
protected Long boundaryExpirationUtime;
@XmlElement(name = "NumberOfVertices")
protected Integer numberOfVertices;
@XmlElement(name = "Vertex")
protected List<Boundaries.Boundary.Vertex> vertex;
/**
* Gets the value of the boundaryId property.
*
* @return possible object is {@link Integer }
*
*/
public Integer getBoundaryId() {
return boundaryId;
}
/**
* Sets the value of the boundaryId property.
*
* @param value
* allowed object is {@link Integer }
*
*/
public void setBoundaryId(Integer value) {
this.boundaryId = value;
}
/**
* Gets the value of the boundaryType property.
*
* @return possible object is {@link String }
*
*/
public String getBoundaryType() {
return boundaryType;
}
/**
* Sets the value of the boundaryType property.
*
* @param value
* allowed object is {@link String }
*
*/
public void setBoundaryType(String value) {
this.boundaryType = value;
}
/**
* Gets the value of the boundaryMode property.
*
* @return possible object is {@link String }
*
*/
public String getBoundaryMode() {
return boundaryMode;
}
/**
* Sets the value of the boundaryMode property.
*
* @param value
* allowed object is {@link String }
*
*/
public void setBoundaryMode(String value) {
this.boundaryMode = value;
}
/**
* Gets the value of the boundaryLifeSpan property.
*
* @return possible object is {@link Integer }
*
*/
public Integer getBoundaryLifeSpan() {
return boundaryLifeSpan;
}
/**
* Sets the value of the boundaryLifeSpan property.
*
* @param value
* allowed object is {@link Integer }
*
*/
public void setBoundaryLifeSpan(Integer value) {
this.boundaryLifeSpan = value;
}
/**
* Gets the value of the boundaryCreationTime property.
*
* @return possible object is {@link XMLGregorianCalendar }
*
*/
public XMLGregorianCalendar getBoundaryCreationTime() {
return boundaryCreationTime;
}
/**
* Sets the value of the boundaryCreationTime property.
*
* @param value
* allowed object is {@link XMLGregorianCalendar }
*
*/
public void setBoundaryCreationTime(XMLGregorianCalendar value) {
this.boundaryCreationTime = value;
}
/**
* Gets the value of the boundaryCreationUtime property.
*
* @return possible object is {@link Long }
*
*/
public Long getBoundaryCreationUtime() {
return boundaryCreationUtime;
}
/**
* Sets the value of the boundaryCreationUtime property.
*
* @param value
* allowed object is {@link Long }
*
*/
public void setBoundaryCreationUtime(Long value) {
this.boundaryCreationUtime = value;
}
/**
* Gets the value of the boundaryEditedTime property.
*
* @return possible object is {@link XMLGregorianCalendar }
*
*/
public XMLGregorianCalendar getBoundaryEditedTime() {
return boundaryEditedTime;
}
/**
* Sets the value of the boundaryEditedTime property.
*
* @param value
* allowed object is {@link XMLGregorianCalendar }
*
*/
public void setBoundaryEditedTime(XMLGregorianCalendar value) {
this.boundaryEditedTime = value;
}
/**
* Gets the value of the boundaryEditedUtime property.
*
* @return possible object is {@link Long }
*
*/
public Long getBoundaryEditedUtime() {
return boundaryEditedUtime;
}
/**
* Sets the value of the boundaryEditedUtime property.
*
* @param value
* allowed object is {@link Long }
*
*/
public void setBoundaryEditedUtime(Long value) {
this.boundaryEditedUtime = value;
}
/**
* Gets the value of the boundaryExpirationTime property.
*
* @return possible object is {@link XMLGregorianCalendar }
*
*/
public XMLGregorianCalendar getBoundaryExpirationTime() {
return boundaryExpirationTime;
}
/**
* Sets the value of the boundaryExpirationTime property.
*
* @param value
* allowed object is {@link XMLGregorianCalendar }
*
*/
public void setBoundaryExpirationTime(XMLGregorianCalendar value) {
this.boundaryExpirationTime = value;
}
/**
* Gets the value of the boundaryExpirationUtime property.
*
* @return possible object is {@link Long }
*
*/
public Long getBoundaryExpirationUtime() {
return boundaryExpirationUtime;
}
/**
* Sets the value of the boundaryExpirationUtime property.
*
* @param value
* allowed object is {@link Long }
*
*/
public void setBoundaryExpirationUtime(Long value) {
this.boundaryExpirationUtime = value;
}
/**
* Gets the value of the numberOfVertices property.
*
* @return possible object is {@link Integer }
*
*/
public Integer getNumberOfVertices() {
return numberOfVertices;
}
/**
* Sets the value of the numberOfVertices property.
*
* @param value
* allowed object is {@link Integer }
*
*/
public void setNumberOfVertices(Integer value) {
this.numberOfVertices = value;
}
/**
* Gets the value of the vertex property.
*
* <p>
* This accessor method returns a reference to the live list, not a
* snapshot. Therefore any modification you make to the returned list
* will be present inside the JAXB object. This is why there is not a
* <CODE>set</CODE> method for the vertex property.
*
* <p>
* For example, to add a new item, do as follows:
*
* <pre>
* getVertex().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Boundaries.Boundary.Vertex }
*
*
*/
public List<Boundaries.Boundary.Vertex> getVertex() {
if (vertex == null) {
vertex = new ArrayList<Boundaries.Boundary.Vertex>();
}
return this.vertex;
}
/**
* <p>
* Java class for anonymous complex type.
*
* <p>
* The following schema fragment specifies the expected content
* contained within this class.
*
* <pre>
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="Latitude" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;element name="Longitude" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;element name="Azimuth" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;element name="Speed" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;element name="U" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;element name="V" type="{http://www.w3.org/2001/XMLSchema}float" minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "latitude", "longitude", "azimuth",
"speed", "u", "v" })
public static class Vertex {
@XmlElement(name = "Latitude")
protected Float latitude;
@XmlElement(name = "Longitude")
protected Float longitude;
@XmlElement(name = "Azimuth")
protected Float azimuth;
@XmlElement(name = "Speed")
protected Float speed;
@XmlElement(name = "U")
protected Float u;
@XmlElement(name = "V")
protected Float v;
/**
* Gets the value of the latitude property.
*
* @return possible object is {@link Float }
*
*/
public Float getLatitude() {
return latitude;
}
/**
* Sets the value of the latitude property.
*
* @param value
* allowed object is {@link Float }
*
*/
public void setLatitude(Float value) {
this.latitude = value;
}
/**
* Gets the value of the longitude property.
*
* @return possible object is {@link Float }
*
*/
public Float getLongitude() {
return longitude;
}
/**
* Sets the value of the longitude property.
*
* @param value
* allowed object is {@link Float }
*
*/
public void setLongitude(Float value) {
this.longitude = value;
}
/**
* Gets the value of the azimuth property.
*
* @return possible object is {@link Float }
*
*/
public Float getAzimuth() {
return azimuth;
}
/**
* Sets the value of the azimuth property.
*
* @param value
* allowed object is {@link Float }
*
*/
public void setAzimuth(Float value) {
this.azimuth = value;
}
/**
* Gets the value of the speed property.
*
* @return possible object is {@link Float }
*
*/
public Float getSpeed() {
return speed;
}
/**
* Sets the value of the speed property.
*
* @param value
* allowed object is {@link Float }
*
*/
public void setSpeed(Float value) {
this.speed = value;
}
/**
* Gets the value of the u property.
*
* @return possible object is {@link Float }
*
*/
public Float getU() {
return u;
}
/**
* Sets the value of the u property.
*
* @param value
* allowed object is {@link Float }
*
*/
public void setU(Float value) {
this.u = value;
}
/**
* Gets the value of the v property.
*
* @return possible object is {@link Float }
*
*/
public Float getV() {
return v;
}
/**
* Sets the value of the v property.
*
* @param value
* allowed object is {@link Float }
*
*/
public void setV(Float value) {
this.v = value;
}
}
}
/**
* <p>
* Java class for anonymous complex type.
*
* <p>
* The following schema fragment specifies the expected content contained
* within this class.
*
* <pre>
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="ForbiddenId" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "forbiddenId" })
public static class ForbiddenBoundaryIds {
@XmlElement(name = "ForbiddenId")
protected List<String> forbiddenId;
/**
* Gets the value of the forbiddenId property.
*
* <p>
* This accessor method returns a reference to the live list, not a
* snapshot. Therefore any modification you make to the returned list
* will be present inside the JAXB object. This is why there is not a
* <CODE>set</CODE> method for the forbiddenId property.
*
* <p>
* For example, to add a new item, do as follows:
*
* <pre>
* getForbiddenId().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link String }
*
*
*/
public List<String> getForbiddenId() {
if (forbiddenId == null) {
forbiddenId = new ArrayList<String>();
}
return this.forbiddenId;
}
}
/**
* <p>
* Java class for anonymous complex type.
*
* <p>
* The following schema fragment specifies the expected content contained
* within this class.
*
* <pre>
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="Comment" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "comment" })
public static class Log {
@XmlElement(name = "Comment")
protected List<String> comment;
/**
* Gets the value of the comment property.
*
* <p>
* This accessor method returns a reference to the live list, not a
* snapshot. Therefore any modification you make to the returned list
* will be present inside the JAXB object. This is why there is not a
* <CODE>set</CODE> method for the comment property.
*
* <p>
* For example, to add a new item, do as follows:
*
* <pre>
* getComment().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link String }
*
*
*/
public List<String> getComment() {
if (comment == null) {
comment = new ArrayList<String>();
}
return this.comment;
}
}
/**
* <p>
* Java class for anonymous complex type.
*
* <p>
* The following schema fragment specifies the expected content contained
* within this class.
*
* <pre>
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="FileCreationTime" type="{http://www.w3.org/2001/XMLSchema}dateTime"/>
* &lt;element name="FileCreationUtime" type="{http://www.w3.org/2001/XMLSchema}long"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "fileCreationTime", "fileCreationUtime" })
public static class TimeInfo {
@XmlElement(name = "FileCreationTime", required = true)
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar fileCreationTime;
@XmlElement(name = "FileCreationUtime")
protected long fileCreationUtime;
/**
* Gets the value of the fileCreationTime property.
*
* @return possible object is {@link XMLGregorianCalendar }
*
*/
public XMLGregorianCalendar getFileCreationTime() {
return fileCreationTime;
}
/**
* Sets the value of the fileCreationTime property.
*
* @param value
* allowed object is {@link XMLGregorianCalendar }
*
*/
public void setFileCreationTime(XMLGregorianCalendar value) {
this.fileCreationTime = value;
}
/**
* Gets the value of the fileCreationUtime property.
*
*/
public long getFileCreationUtime() {
return fileCreationUtime;
}
/**
* Sets the value of the fileCreationUtime property.
*
*/
public void setFileCreationUtime(long value) {
this.fileCreationUtime = value;
}
}
}

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<Boundaries xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="BoundariesStateSchema.xsd">
<UserName>UserName</UserName>
<TimeInfo>
<FileCreationTime>2001-12-31T12:00:00</FileCreationTime>
<FileCreationUtime>0</FileCreationUtime>
</TimeInfo>
<Boundary>
<BoundaryId>0</BoundaryId>
<BoundaryType>BoundaryType</BoundaryType>
<BoundaryMode>BoundaryMode</BoundaryMode>
<BoundaryLifeSpan>0</BoundaryLifeSpan>
<BoundaryCreationTime>2001-12-31T12:00:00</BoundaryCreationTime>
<BoundaryCreationUtime>0</BoundaryCreationUtime>
<BoundaryEditedTime>2001-12-31T12:00:00</BoundaryEditedTime>
<BoundaryEditedUtime>0</BoundaryEditedUtime>
<BoundaryExpirationTime>2001-12-31T12:00:00</BoundaryExpirationTime>
<BoundaryExpirationUtime>0</BoundaryExpirationUtime>
<NumberOfVertices>0</NumberOfVertices>
<Vertex/>
</Boundary>
<ForbiddenBoundaryIds>
<ForbiddenId>ForbiddenId</ForbiddenId>
</ForbiddenBoundaryIds>
<Log>
<Comment>Comment</Comment>
</Log>
</Boundaries>

View file

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema elementFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Boundaries">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="UserName" type="xsd:string"
maxOccurs="1" minOccurs="1">
</xsd:element>
<xsd:element name="TimeInfo" maxOccurs="1" minOccurs="1">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="FileCreationTime" type="xsd:dateTime"
maxOccurs="1" minOccurs="1">
</xsd:element>
<xsd:element name="FileCreationUtime" type="xsd:long"
maxOccurs="1" minOccurs="1">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Boundary" maxOccurs="unbounded"
minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="BoundaryId" type="xsd:int"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="BoundaryType" type="xsd:string"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="BoundaryMode" type="xsd:string"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="BoundaryLifeSpan" type="xsd:int"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="BoundaryCreationTime" type="xsd:dateTime"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="BoundaryCreationUtime" type="xsd:long"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="BoundaryEditedTime" type="xsd:dateTime"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="BoundaryEditedUtime" type="xsd:long"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="BoundaryExpirationTime" type="xsd:dateTime"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="BoundaryExpirationUtime" type="xsd:long"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="NumberOfVertices" type="xsd:int"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="Vertex" maxOccurs="unbounded"
minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Latitude" type="xsd:float"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="Longitude" type="xsd:float"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="Azimuth" type="xsd:float"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="Speed" type="xsd:float"
maxOccurs="1" minOccurs="0">
</xsd:element>
<xsd:element name="U" type="xsd:float" maxOccurs="1"
minOccurs="0">
</xsd:element>
<xsd:element name="V" type="xsd:float" maxOccurs="1"
minOccurs="0">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="ForbiddenBoundaryIds" maxOccurs="unbounded"
minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="ForbiddenId" type="xsd:string"
maxOccurs="unbounded" minOccurs="0">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Log" maxOccurs="unbounded" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Comment" type="xsd:string"
maxOccurs="unbounded" minOccurs="0">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

View file

@ -0,0 +1,82 @@
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2012.07.12 at 04:10:24 PM EDT
//
package gov.noaa.nws.mdl.viz.boundaryTool.boundaries.state.xml;
import javax.xml.bind.annotation.XmlRegistry;
/**
* This object contains factory methods for each Java content interface and Java
* element interface generated in the generated package.
* <p>
* An ObjectFactory allows you to programatically construct new instances of the
* Java representation for XML content. The Java representation of XML content
* can consist of schema derived interfaces and classes representing the binding
* of schema type definitions, element declarations and model groups. Factory
* methods for each of these are provided in this class.
*
*/
@XmlRegistry
public class BoundaryObjectFactory {
/**
* Create a new ObjectFactory that can be used to create new instances of
* schema derived classes for package: generated
*
*/
public BoundaryObjectFactory() {
}
/**
* Create an instance of {@link Boundaries.TimeInfo }
*
*/
public Boundaries.TimeInfo createBoundariesTimeInfo() {
return new Boundaries.TimeInfo();
}
/**
* Create an instance of {@link Boundaries.Boundary }
*
*/
public Boundaries.Boundary createBoundariesBoundary() {
return new Boundaries.Boundary();
}
/**
* Create an instance of {@link Boundaries.Boundary.Vertex }
*
*/
public Boundaries.Boundary.Vertex createBoundariesBoundaryVertex() {
return new Boundaries.Boundary.Vertex();
}
/**
* Create an instance of {@link Boundaries.Log }
*
*/
public Boundaries.Log createBoundariesLog() {
return new Boundaries.Log();
}
/**
* Create an instance of {@link Boundaries }
*
*/
public Boundaries createBoundaries() {
return new Boundaries();
}
/**
* Create an instance of {@link Boundaries.ForbiddenBoundaryIds }
*
*/
public Boundaries.ForbiddenBoundaryIds createBoundariesForbiddenBoundaryIds() {
return new Boundaries.ForbiddenBoundaryIds();
}
}

View file

@ -0,0 +1,197 @@
package gov.noaa.nws.mdl.viz.boundaryTool.boundaries.state.xml;
import gov.noaa.nws.mdl.viz.boundaryTool.boundaries.state.xml.Boundaries.ForbiddenBoundaryIds;
import gov.noaa.nws.mdl.viz.boundaryTool.common.boundary.BoundaryState;
import java.io.FileNotFoundException;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.xml.bind.JAXBException;
import javax.xml.datatype.DatatypeConfigurationException;
import com.raytheon.uf.common.localization.IPathManager;
import com.raytheon.uf.common.localization.LocalizationContext;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType;
import com.raytheon.uf.common.localization.LocalizationFile;
import com.raytheon.uf.common.localization.PathManagerFactory;
import com.raytheon.uf.common.localization.exception.LocalizationException;
import com.raytheon.uf.common.serialization.JAXBManager;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.common.time.SimulatedTime;
import com.raytheon.uf.common.time.util.TimeUtil;
import com.raytheon.uf.viz.core.exception.VizException;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
/**
* Methods to be called to read boundary xml file via LocalizationFile and
* populate BoundaryState objects for the display active boundaries by
* BounadaryDisplay class
*
* <pre>
* @author Mamoudou Ba
* @version 1.0
* </pre>
*
*/
public class ReadBoundariesXmlFile {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(ReadBoundariesXmlFile.class);
public void readBoundariesXmlFile(BoundaryState currentState)
throws VizException, DatatypeConfigurationException,
FileNotFoundException {
Date d = null;
long createTime = 0;
long currTime = 0;
float bndLifeSpan = 0;
long oneHour = TimeUtil.MILLIS_PER_HOUR;
String moving = "Moving";
// Use Localization context to read boundary data
IPathManager pm = PathManagerFactory.getPathManager();
LocalizationContext context = pm.getContext(
LocalizationType.CAVE_STATIC, LocalizationLevel.SITE);
LocalizationFile boundaryFile = pm.getLocalizationFile(context,
"awipsTools" + IPathManager.SEPARATOR + "boundaryTool.xml");
if (boundaryFile.exists()) {
try {
// Read boundary data via localization
Boundaries boundariesObj = boundaryFile.jaxbUnmarshal(
Boundaries.class, new JAXBManager(Boundaries.class));
d = new Date(boundariesObj.getTimeInfo().getFileCreationUtime());
currentState.creationFileTime = new DataTime(d);
for (int i = 0; i < boundariesObj.getBoundary().size(); i++) {
int boundaryId = boundariesObj.getBoundary().get(i)
.getBoundaryId();
// Populate boundary active list for those active
// boundaries.
d = new Date(boundariesObj.getBoundary().get(i)
.getBoundaryCreationUtime());
DataTime t = new DataTime(SimulatedTime.getSystemTime()
.getTime());
currTime = t.getMatchRef();
createTime = boundariesObj.getBoundary().get(i)
.getBoundaryCreationUtime();
bndLifeSpan = (currTime - createTime) / oneHour;
if (bndLifeSpan >= (float) boundariesObj.getBoundary()
.get(i).getBoundaryLifeSpan()) {
// Add expired boundaries to forbidden list
if (currentState.forbiddenBoundaryIdsMap
.get(boundaryId) != null) {
currentState.forbiddenBoundaryIdsMap
.remove(boundaryId);
currentState.forbiddenBoundaryIdsMap.put(
boundaryId, boundaryId);
}
continue;
}
currentState.createTimeMap.put(boundaryId, new DataTime(d));
currentState.boundaryDurationMap.put(boundaryId,
boundariesObj.getBoundary().get(i)
.getBoundaryLifeSpan());
d = new Date(boundariesObj.getBoundary().get(i)
.getBoundaryEditedUtime());
currentState.editedTimeMap.put(boundaryId, new DataTime(d));
d = new Date(boundariesObj.getBoundary().get(i)
.getBoundaryExpirationUtime());
currentState.expirationTimeMap.put(boundaryId,
new DataTime(d));
Coordinate[] coords = new Coordinate[boundariesObj
.getBoundary().get(i).getNumberOfVertices()];
float[] speed = new float[boundariesObj.getBoundary()
.get(i).getNumberOfVertices()];
float[] angle = new float[boundariesObj.getBoundary()
.get(i).getNumberOfVertices()];
for (int j = 0; j < boundariesObj.getBoundary().get(i)
.getVertex().size(); j++) {
coords[j] = new Coordinate(boundariesObj.getBoundary()
.get(i).getVertex().get(j).getLongitude(),
boundariesObj.getBoundary().get(i).getVertex()
.get(j).getLatitude());
speed[j] = boundariesObj.getBoundary().get(i)
.getVertex().get(j).getSpeed();
angle[j] = boundariesObj.getBoundary().get(i)
.getVertex().get(j).getAzimuth();
}
currentState.boundariesMap.put(boundaryId,
new GeometryFactory().createLineString(coords));
if (boundariesObj.getBoundary().get(i).getBoundaryMode()
.equals(moving)) {
currentState.isMovingMap.put(boundaryId, true);
currentState.vertexAngleMap.put(boundaryId, angle);
currentState.vertexSpeedMap.put(boundaryId, speed);
} else {
currentState.isMovingMap.put(boundaryId, false);
}
currentState.boundaryTypeMap.put(boundaryId, boundariesObj
.getBoundary().get(i).getBoundaryType());
currentState.boundaryId = boundaryId;
if (currentState.boundariesMap.size() != 0) {
if (currentState.existingBoundaryNotEmptyMap
.get(boundaryId) != null) {
currentState.existingBoundaryNotEmptyMap
.remove(boundaryId);
}
currentState.existingBoundaryNotEmptyMap.put(
boundaryId, true);
}
}
// Populate boundary forbidden id list
List<ForbiddenBoundaryIds> forbiden = boundariesObj
.getForbiddenBoundaryIds();
Iterator<ForbiddenBoundaryIds> iterator = forbiden.iterator();
int id = 0;
Iterable<String> s1 = null;
while (iterator.hasNext()) {
s1 = iterator.next().getForbiddenId();
for (String e : s1) {
try {
id = Integer.parseInt(e);
} catch (NumberFormatException ex) {
statusHandler.handle(Priority.PROBLEM,
"Problem in parsing the integer", ex);
}
currentState.forbiddenBoundaryIdsMap.put(id, id);
}
}
} catch (JAXBException e) {
statusHandler.handle(Priority.PROBLEM,
"problem in reading boundary data", e);
} catch (LocalizationException e1) {
statusHandler.handle(Priority.PROBLEM,
"Localization exception", e1);
}
}
}
}

View file

@ -0,0 +1,272 @@
package gov.noaa.nws.mdl.viz.boundaryTool.boundaries.state.xml;
import static java.lang.Math.PI;
import static java.lang.Math.cos;
import static java.lang.Math.sin;
import gov.noaa.nws.mdl.viz.boundaryTool.boundaries.state.xml.Boundaries.Boundary.Vertex;
import gov.noaa.nws.mdl.viz.boundaryTool.boundaries.state.xml.Boundaries.ForbiddenBoundaryIds;
import gov.noaa.nws.mdl.viz.boundaryTool.common.boundary.BoundaryState;
import gov.noaa.nws.mdl.viz.boundaryTool.common.boundary.BoundaryState.BoundaryPolyLine;
import java.io.IOException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import javax.xml.bind.JAXBException;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import com.raytheon.uf.common.localization.IPathManager;
import com.raytheon.uf.common.localization.LocalizationContext;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType;
import com.raytheon.uf.common.localization.LocalizationFile;
import com.raytheon.uf.common.localization.PathManagerFactory;
import com.raytheon.uf.common.localization.SaveableOutputStream;
import com.raytheon.uf.common.localization.exception.LocalizationException;
import com.raytheon.uf.common.serialization.JAXBManager;
import com.raytheon.uf.common.serialization.SerializationException;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.common.time.util.TimeUtil;
import com.raytheon.uf.viz.core.exception.VizException;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.LineString;
/**
* Methods to be called to save boundary xml file via LocalizationFile
*
* <pre>
* @author Mamoudou Ba
* @version 1.0
* </pre>
*/
public class WriteBoundariesXmlFile {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(WriteBoundariesXmlFile.class);
private static JAXBManager jaxbManager;
private static boolean initialized;
/**
* Populate the Boundaries Object and save it via LocalizationFile.
*/
public void writeBoundariesXmlFile(BoundaryState currentState,
DataTime[] dataTimes, int currentTimeIndex) throws VizException,
DatatypeConfigurationException {
BoundaryObjectFactory ofObj = new BoundaryObjectFactory();
Boundaries boundariesObj = ofObj.createBoundaries();
// Use Localization context to save boundary data
IPathManager pm = PathManagerFactory.getPathManager();
LocalizationContext context = pm.getContext(
LocalizationType.CAVE_STATIC, LocalizationLevel.SITE);
LocalizationFile boundaryFile = pm.getLocalizationFile(context,
"awipsTools" + IPathManager.SEPARATOR + "boundaryTool.xml");
/*
* Use ProfileDescription methods to populate the ProfileDescription
* object with values. Fist the simple type variables.
*/
// Populate the Boundaries Object
// Current user name
boundariesObj.setUserName(System.getProperty("user.name"));
// Time info (Time frame)
// currentTimeIndex = this.trackUtil.getCurrentFrame(info);
long currentUTime = 0;
long oneHour = TimeUtil.MILLIS_PER_HOUR;
long expirationUTime = 0;
long boundaryCreationUtime = 0;
long boundaryEditedUtime = 0;
Date d;
Date expiration_date;
// dataTimes = trackUtil.getDataTimes(info);
currentUTime = dataTimes[currentTimeIndex].getMatchRef();
d = new Date(currentUTime);
GregorianCalendar c = new GregorianCalendar();
c.setTime(d);
XMLGregorianCalendar d2 = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(c);
Boundaries.TimeInfo timeInfoObj = ofObj.createBoundariesTimeInfo();
timeInfoObj.setFileCreationTime(d2);
timeInfoObj.setFileCreationUtime(currentUTime);
boundariesObj.setTimeInfo(timeInfoObj);
// Populate active boundaries: loop over all existing boundaries
int moveIndex = currentTimeIndex;
BoundaryPolyLine[] currentTimePoints;
LineString line;
Iterator<Integer> iterator = currentState.boundariesMap.keySet()
.iterator();
while (iterator.hasNext()) {
String boundaryMode = null;
Boundaries.Boundary boundary = ofObj.createBoundariesBoundary();
int boundaryId = iterator.next();
boundary.setBoundaryId(boundaryId);
if (currentState.isMovingMap.get(boundaryId)) {
boundaryMode = "Moving";
currentTimePoints = currentState.timePointsMap.get(boundaryId);
line = currentTimePoints[moveIndex].polyline;
} else {
line = currentState.boundariesMap.get(boundaryId);
boundaryMode = "Stationary";
}
boundary.setBoundaryMode(boundaryMode);
boundary.setBoundaryType(currentState.boundaryTypeMap
.get(boundaryId));
boundary.setBoundaryLifeSpan(currentState.boundaryDurationMap
.get(boundaryId));
Coordinate[] coords = line.getCoordinates();
boundary.setNumberOfVertices(coords.length);
// Populate boundary's time attributes
// Set boundary creation time attributes
boundaryCreationUtime = currentState.createTimeMap.get(boundaryId)
.getMatchRef();
expirationUTime = boundaryCreationUtime
+ (currentState.boundaryDurationMap.get(boundaryId) * oneHour);
d = new Date(boundaryCreationUtime);
expiration_date = new Date(expirationUTime);
DataTime expirationDataTime = new DataTime(expiration_date);
// Set Boundary expiration Time
if (currentState.expirationTimeMap.get(boundaryId) != null)
currentState.expirationTimeMap.remove(boundaryId);
currentState.expirationTimeMap.put(boundaryId, expirationDataTime);
c = new GregorianCalendar();
c.setTime(d);
d2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
boundary.setBoundaryCreationTime(d2);
boundary.setBoundaryCreationUtime(boundaryCreationUtime);
// Set modification Time attributes
boundaryEditedUtime = currentState.editedTimeMap.get(boundaryId)
.getMatchRef();
d = new Date(boundaryEditedUtime);
c = new GregorianCalendar();
c.setTime(d);
d2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
boundary.setBoundaryEditedTime(d2);
boundary.setBoundaryEditedUtime(boundaryEditedUtime);
// Set boundary expiration time attributes
c = new GregorianCalendar();
c.setTime(expiration_date);
d2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
boundary.setBoundaryExpirationTime(d2);
boundary.setBoundaryExpirationUtime(expirationUTime);
// populate vertices
// boundaryObj.setNumberOfVertices(coords.length);
List<Boundaries.Boundary.Vertex> vertexList = new ArrayList<Boundaries.Boundary.Vertex>();
// add vertex to the list
for (int i = 0; i < coords.length; i++) {
// coordinates
Boundaries.Boundary.Vertex vertex = ofObj
.createBoundariesBoundaryVertex();
vertexList.add(vertex);
Vertex vx = vertexList.get(i);
vx.setLongitude((float) coords[i].x);
vx.setLatitude((float) coords[i].y);
// speed and angle
if (currentState.isMovingMap.get(boundaryId)) {
vx.setAzimuth(currentState.vertexAngleMap.get(boundaryId)[i]);
vx.setSpeed(currentState.vertexSpeedMap.get(boundaryId)[i]);
// Compute u,v components of speed
float u = (float) (currentState.vertexSpeedMap
.get(boundaryId)[i] * sin(currentState.vertexAngleMap
.get(boundaryId)[i] * PI / 180.));
float v = (float) (currentState.vertexSpeedMap
.get(boundaryId)[i] * cos(currentState.vertexAngleMap
.get(boundaryId)[i] * PI / 180.));
vx.setU(u);
vx.setV(v);
} else {
vx.setAzimuth((float) 0.0);
vx.setSpeed((float) 0.0);
vx.setU((float) 0.0);
vx.setV((float) 0.0);
}
boundary.getVertex().add(vx);
}
boundariesObj.getBoundary().add(boundary);
}
// Populate forbidden ids list
Iterator<Integer> logIndex = currentState.logMap.keySet().iterator();
while (logIndex.hasNext()) {
Boundaries.Log log = ofObj.createBoundariesLog();
int id = logIndex.next();
log.getComment().add(currentState.logMap.get(id));
boundariesObj.getLog().add(log);
}
Iterator<Integer> forbidenIds = currentState.forbiddenBoundaryIdsMap
.keySet().iterator();
while (forbidenIds.hasNext()) {
ForbiddenBoundaryIds forbiden = ofObj
.createBoundariesForbiddenBoundaryIds();
int id = forbidenIds.next();
String s = "" + id;
forbiden.getForbiddenId().add(s);
boundariesObj.getForbiddenBoundaryIds().add(forbiden);
}
try {
initialize();
} catch (JAXBException e1) {
statusHandler.handle(Priority.PROBLEM, "Initialization fails", e1);
}
try (SaveableOutputStream sos = boundaryFile.openOutputStream()) {
jaxbManager.marshalToStream(boundariesObj, sos);
sos.save();
} catch (IOException | LocalizationException | SerializationException e) {
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e);
}
}
/**
* initialize jaxb manager
*
* @throws JAXBException
*/
private static synchronized void initialize() throws JAXBException {
if (!initialized) {
jaxbManager = new JAXBManager(Boundaries.class);
initialized = true;
}
}
}

View file

@ -0,0 +1,271 @@
package gov.noaa.nws.mdl.viz.boundaryTool.common.boundary;
import gov.noaa.nws.mdl.viz.boundaryTool.common.boundary.BoundaryState.Mode;
import gov.noaa.nws.mdl.viz.boundaryTool.common.boundary.BoundaryState.UserAction;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import org.eclipse.jface.action.IMenuManager;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.common.time.SimulatedTime;
import com.raytheon.uf.common.time.util.TimeUtil;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.drawables.IDescriptor.FramesInfo;
import com.raytheon.uf.viz.core.drawables.PaintProperties;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.map.MapDescriptor;
import com.raytheon.uf.viz.core.rsc.AbstractResourceData;
import com.raytheon.uf.viz.core.rsc.AbstractVizResource;
import com.raytheon.uf.viz.core.rsc.IResourceDataChanged;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
import com.raytheon.uf.viz.core.rsc.ResourceProperties;
import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability;
import com.raytheon.uf.viz.core.rsc.capabilities.EditableCapability;
import com.raytheon.uf.viz.core.rsc.capabilities.MagnificationCapability;
import com.raytheon.uf.viz.core.rsc.capabilities.OutlineCapability;
import com.raytheon.uf.viz.core.rsc.tools.GenericToolsResourceData;
import com.raytheon.viz.ui.cmenu.IContextMenuContributor;
import com.raytheon.viz.ui.input.EditableManager;
/**
* Abstract class for drawing boundary object
*
* @author Mamoudou ba
* @version 1.0
*
* Modified from A2 "AbstractStormTrackResource" class by renaming the
* class name and methods
*/
public abstract class AbstractBoundaryResource extends
AbstractVizResource<AbstractResourceData, MapDescriptor> implements
IResourceDataChanged, IContextMenuContributor {
private BoundaryDisplay display;
protected BoundaryState displayState;
protected BoundaryUIManager manager;
private boolean timeMatchBasis = false;
private int maximumFrameCount = -1;
protected BoundaryUtil trackUtil;
private boolean keepTrackOfDuration = false;
private int lastFrameCount = -1;
public AbstractBoundaryResource(
GenericToolsResourceData<? extends AbstractBoundaryResource> resourceData,
LoadProperties loadProperties, MapDescriptor descriptor) {
super(resourceData, loadProperties);
setDescriptor(descriptor);
resourceData.addChangeListener(this);
dataTimes = new ArrayList<DataTime>();
displayState = new BoundaryState();
trackUtil = new BoundaryUtil();
initializeState(displayState);
if (displayState.duration == -1) {
keepTrackOfDuration = true;
}
}
@Override
public void setDescriptor(MapDescriptor descriptor) {
super.setDescriptor(descriptor);
if (display != null) {
display.setDescriptor(descriptor);
}
}
@Override
public DataTime[] getDataTimes() {
if (timeMatchBasis) {
/*
* We only want to calculate more data times if the user hasselected
* more frames than there have been in the past.
*/
if (this.descriptor.getNumberOfFrames() > this.maximumFrameCount) {
int variance = this.descriptor.getNumberOfFrames()
- this.maximumFrameCount;
this.maximumFrameCount = this.descriptor.getNumberOfFrames();
DataTime earliestTime = this.dataTimes.get(0);
this.fillDataTimeArray(earliestTime, variance);
}
} else {
FramesInfo info = descriptor.getFramesInfo();
dataTimes.clear();
this.maximumFrameCount = this.descriptor.getNumberOfFrames();
// First time called
if (info.getFrameTimes() != null) {
for (DataTime dt : info.getFrameTimes()) {
dataTimes.add(dt);
}
}
if (dataTimes.size() == 0) {
timeMatchBasis = true;
/*
* Case where this tool is time match basis or no data loaded
*/
DataTime currentTime = null;
if (dataTimes.size() > 0) {
currentTime = dataTimes.get(dataTimes.size() - 1);
} else {
currentTime = new DataTime(SimulatedTime.getSystemTime()
.getTime());
}
dataTimes.add(currentTime);
this.fillDataTimeArray(currentTime,
this.descriptor.getNumberOfFrames() - 1);
}
}
Collections.sort(dataTimes);
return dataTimes.toArray(new DataTime[dataTimes.size()]);
}
private void fillDataTimeArray(DataTime startDataTime, int numberOfDataTimes) {
long fifteenMin = 15 * TimeUtil.MILLIS_PER_MINUTE;
long time = startDataTime.getRefTime().getTime();
DataTime currentDataTime = null;
for (int i = 0; i < numberOfDataTimes; i++) {
time -= fifteenMin;
currentDataTime = new DataTime(new Date(time));
this.dataTimes.add(currentDataTime);
}
}
public boolean isEditable() {
return getCapability(EditableCapability.class).isEditable();
}
@Override
protected void disposeInternal() {
if (manager != null) {
manager.dispose();
}
}
@Override
protected void initInternal(IGraphicsTarget target) throws VizException {
EditableManager.makeEditable(this, true);
manager = new BoundaryUIManager(this);
manager.setTrackUtil(trackUtil);
// Create the display
display = new BoundaryDisplay(descriptor, manager);
descriptor.getTimeMatcher().redoTimeMatching(this);
descriptor.getTimeMatcher().redoTimeMatching(descriptor);
}
@Override
protected void paintInternal(IGraphicsTarget target,
PaintProperties paintProps) throws VizException {
FramesInfo info = paintProps.getFramesInfo();
manager.setHandleInput(displayState.isEditable());
if (keepTrackOfDuration && lastFrameCount != info.getFrameCount()) {
displayState.duration = -1;
lastFrameCount = info.getFrameCount();
}
displayState.color = getCapability(ColorableCapability.class)
.getColor();
displayState.lineWidth = getCapability(OutlineCapability.class)
.getOutlineWidth();
displayState.lineStyle = getCapability(OutlineCapability.class)
.getLineStyle();
// set the magnification for the display state
displayState.magnification = getCapability(
MagnificationCapability.class).getMagnification().floatValue();
PaintProperties newProps = new BoundaryProperties(paintProps,
displayState);
display.paint(target, newProps);
manager.setHandleInput(displayState.isEditable());
}
@Override
public void resourceChanged(ChangeType type, Object object) {
if (type == ChangeType.CAPABILITY) {
displayState.geomChanged = true;
if (object instanceof EditableCapability) {
displayState.editable = ((EditableCapability) object)
.isEditable();
}
issueRefresh();
}
}
public BoundaryState getBoundaryState() {
return displayState;
}
@Override
public String getName() {
DataTime[] frameTimes = descriptor.getFramesInfo().getFrameTimes();
if (frameTimes != null) {
descriptor.getTimeMatchingMap().put(this, frameTimes);
}
return getResourceName();
}
public void resetState() {
displayState = new BoundaryState();
initializeState(displayState);
}
public BoundaryUIManager getUIManager() {
return manager;
}
protected String getAddVertexText() {
return "Add Vertex";
}
protected String getDeleteVertexText() {
return "Remove Vertex";
}
protected abstract void initializeState(BoundaryState state);
protected abstract String getResourceName();
@Override
public void addContextMenuItems(IMenuManager menuManager, int x, int y) {
if (displayState.mode == Mode.DRAG_ME
|| displayState.userAction != UserAction.INSERT_BOUNDARY) {
return;
}
if (manager.closeToPoint()) {
menuManager.add(manager.getDeleteAction());
} else if (manager.closeToLine()) {
menuManager.add(manager.getAddAction());
}
}
@Override
public void propertiesChanged(ResourceProperties props) {
manager.setHandleInput(props.isVisible());
}
@Override
public void project(CoordinateReferenceSystem crs) throws VizException {
displayState.geomChanged = true;
issueRefresh();
}
}

View file

@ -0,0 +1,33 @@
package gov.noaa.nws.mdl.viz.boundaryTool.common.boundary;
import com.raytheon.uf.viz.core.drawables.PaintProperties;
/**
*
* @author Mamoudou Ba
* @version 1.0
*
* Entirely reused of A2 "StormTrackProperties" Class by renaming it
* and its methods
*/
public class BoundaryProperties extends PaintProperties {
private BoundaryState state;
public BoundaryProperties(PaintProperties props, BoundaryState state) {
super(props);
this.state = state;
state.distanceThreshold = (props.getView().getExtent().getWidth() / props
.getCanvasBounds().width) * 10;
}
public BoundaryState getState() {
return state;
}
public void setState(BoundaryState state) {
this.state = state;
}
}

View file

@ -0,0 +1,258 @@
package gov.noaa.nws.mdl.viz.boundaryTool.common.boundary;
import gov.noaa.nws.mdl.viz.boundaryTool.ui.dialog.BoundaryEditorDialog;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.swt.graphics.RGB;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.Point;
/**
*
* @author Mamoudou ba
* @version 1.0
*
* April 2011: Substantially modified from A2 "StormTrackState" class
*/
public class BoundaryState {
public enum Mode {
DRAG_ME, TRACK, NONE
};
public enum UserAction {
SAVE("save me"), INSERT_BOUNDARY("line"), EDIT_BOUNDARY(" edit me"), DELETE_BOUNDARY(
"delete me"), READ_ACTIVE_BOUNDARIES("read me"), CANCEL_MODIFICATION(
"cancel modif"), NONE("no action");
public String dragWhat;
private UserAction(String text) {
this.dragWhat = text;
}
}
public enum LabelMode {
TIME, SPEED;
}
public static class BoundaryPolyLine {
public LineString polyline;
public DataTime time;
public BoundaryPolyLine(LineString polyline, DataTime time) {
this.polyline = polyline;
this.time = time;
}
}
/** Drawing mode, TRACK or DRAG */
public Mode mode;
/**
* User's actions: Insert, Edit, Save, Delete a boundary, or Select a
* boundary type ------------- and Read from XML when the tool opens
*/
public UserAction userAction;
/**
* How to draw the labels (SPEED or TIME)
*/
public LabelMode labelMode;
public boolean editable = true;
// public boolean isMoving = false;
public Map<Integer, Boolean> isMovingMap = new HashMap<Integer, Boolean>();
public boolean isEditable() {
return editable;
}
/** the array of time/loc coordinates for the frames */
public BoundaryPolyLine[] timePoints;
public Map<Integer, BoundaryPolyLine[]> timePointsMap = new HashMap<Integer, BoundaryPolyLine[]>();
/**
* The future points, will include timePoints[timePoints.length-1] as
* element 0
*/
public BoundaryPolyLine[] futurePoints;
public Map<Integer, BoundaryPolyLine[]> futurePointsMap = new HashMap<Integer, BoundaryPolyLine[]>();
/** The Points for the drag me points */
public Point[] dragMePoint;
public Point newLineCenter;
/** Drag me line */
public LineString dragMeLine;
public LineString editedLineForMotionComputation;
public int displayedIndexAtStartMotionCompute;
public int frameAtCreationTime = 0;
public int motionIndex;
public boolean dragingLineNotAllowed = false;
public boolean lineIsMoving = false;
public boolean movingEdited = false;
public boolean loopingWasOn = false;
public boolean motionIsResetToStationary = false;
public LineString prevBoundary;
/** Map to store active boundaries */
public Map<Integer, LineString> boundariesMap = new HashMap<Integer, LineString>();
// public Map<String, String> boundaryIdsMap = new HashMap<String,
// String>();
/** Drag me Line for the points for the drag me points */
public Map<Integer, LineString> dragMePointMap = new HashMap<Integer, LineString>();
/** Map to store the list of forbidden ids (deleted boundaries */
public Map<Integer, Integer> forbiddenBoundaryIdsMap = new HashMap<Integer, Integer>();
/** Drag me line creation/modification time */
// public DataTime createTime;
public Map<Integer, DataTime> createTimeMap = new HashMap<Integer, DataTime>();
public Map<Integer, DataTime> editedTimeMap = new HashMap<Integer, DataTime>();
/** Drag me line expiration time */
// public DataTime createTime;
public Map<Integer, DataTime> expirationTimeMap = new HashMap<Integer, DataTime>();
public Map<Integer, String> logMap = new HashMap<Integer, String>();
/** Geometry object when mouse is down */
public Geometry mouseDownGeom;
/** current geometry object */
public Geometry dragMeGeom;
// parameters passed to method saving the data
public int timeIndex = 0;
public DataTime[] currentDataTimes = null;
public BoundaryEditorDialog dialogObject = null;
/** Number of drag points for line to start with. when line is created */
public int numDragMePoints;
/** index into timePoints where pivot point should be */
public int pivotIndex;
/** The pivot index to use when current frame index is on pivotIndex */
public int otherPivotIndex;
/** The next pivot index to use */
public int nextPivotIndex = -1;
/** The currently displayed pivot index (pivotIndex or otherPivotIndex) */
public int displayedPivotIndex;
/** The angle of the line */
public double angle = Double.NaN;
public float[] vertexAngle = null;
public Map<Integer, float[]> vertexAngleMap = new HashMap<Integer, float[]>();
/** The speed of the line */
public double speed = Double.NaN;
public float[] vertexSpeed = null;
public Map<Integer, float[]> vertexSpeedMap = new HashMap<Integer, float[]>();
/** "Storm" or "feature" or whatever you want people to drag the point to */
public String thingToDragTo;
public int editedBoundaryId;
public String boundaryType;
public Map<Integer, String> boundaryTypeMap = new HashMap<Integer, String>();
public int boundaryId;
public String fileName;
/**
* size of line of storms, not sure about units. Used when poly line is
* first constructed
*/
public double lineOfStormsLength = 30000;
/**
* Some value calculated in BoundaryProperties based on some things, used
* with lineOfStormsLength
*/
public double distanceThreshold;
/** Set true if the geometry has changed and needs to be redrawn */
public boolean geomChanged = true;
/** set true if the number of vertex in the line increases/decreases */
public boolean numberPointChanged = false;
// Resource capabilities
/** The width of the line to draw, resource should set before passed on */
public float lineWidth;
/** The style of the line to draw */
public IGraphicsTarget.LineStyle lineStyle;
/** The color of the lines to draw, resource should set */
public RGB color = new RGB(255, 255, 255);
/** Duration of the future time in minutes */
public int duration = -1;
/** Set if you want to change the duration */
public int newDuration = -1;
public boolean trackVisible = true;
public boolean lineMoved = false;
/** set magnification to default value */
public float magnification = 1.0f;
public Map<Integer, Boolean> existingBoundaryNotEmptyMap = new HashMap<Integer, Boolean>();
public DataTime creationFileTime = null;
public Map<Integer, Boolean> lineMovedMap = new HashMap<Integer, Boolean>();
public int boundaryDuration = 8;
public Map<Integer, Integer> boundaryDurationMap = new HashMap<Integer, Integer>();
/** Set if you the duration needs to be calculated from the end time */
public Calendar endTime = null;
}

View file

@ -0,0 +1,682 @@
package gov.noaa.nws.mdl.viz.boundaryTool.common.boundary;
import gov.noaa.nws.mdl.viz.boundaryTool.common.boundary.BoundaryState.Mode;
import gov.noaa.nws.mdl.viz.boundaryTool.common.boundary.BoundaryState.UserAction;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.action.IAction;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchPart;
import com.raytheon.uf.viz.core.IDisplayPane;
import com.raytheon.uf.viz.core.IDisplayPaneContainer;
import com.raytheon.uf.viz.core.VizApp;
import com.raytheon.uf.viz.core.drawables.IDescriptor.FramesInfo;
import com.raytheon.viz.ui.VizWorkbenchManager;
import com.raytheon.viz.ui.cmenu.AbstractRightClickAction;
import com.raytheon.viz.ui.input.InputAdapter;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineSegment;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.Point;
/**
*
* @author Mamoudou ba
* @version 1.0
*
* Substantially modified of A2 "StormTrackUIManager" class
*/
public class BoundaryUIManager extends InputAdapter {
private enum MoveType {
SINGLE_POINT, ALL_POINTS;
}
private AbstractBoundaryResource controller;
private Cursor movePolygon;
private Cursor movePoint;
private MoveType moveType = null;
private int movePointIndex = -1;
private int lastX, lastY;
private boolean pointCreated = false;
private boolean handle = true;
private BoundaryUtil trackUtil;
public static final double point_coord = 3.0;
public BoundaryUIManager(AbstractBoundaryResource controller) {
this.controller = controller;
IDisplayPaneContainer container = controller.getResourceContainer();
if (container != null) {
container.registerMouseHandler(this);
}
VizApp.runAsync(new Runnable() {
@Override
public void run() {
Display display = getShell().getDisplay();
movePolygon = display.getSystemCursor(SWT.CURSOR_SIZEALL);
movePoint = display.getSystemCursor(SWT.CURSOR_HAND);
display.getSystemCursor(SWT.CURSOR_ARROW);
}
});
}
public void dispose() {
IDisplayPaneContainer container = controller.getResourceContainer();
if (container != null) {
container.unregisterMouseHandler(this);
}
}
/**
* @param draw
*/
public void setHandleInput(boolean handle) {
this.handle = handle;
if (!handle) {
getShell().setCursor(null);
}
}
public boolean isHandleInput() {
if (handle) {
if (controller.displayState.mode != Mode.NONE) {
return true;
}
}
return false;
}
@Override
public boolean handleMouseMove(int x, int y) {
IDisplayPaneContainer container = controller.getResourceContainer();
lastX = x;
lastY = y;
if (!isHandleInput()) {
return super.handleMouseMove(x, y);
}
moveType = null;
movePointIndex = -1;
pointCreated = false;
Coordinate mouse = new Coordinate(x, y);
BoundaryState state = controller.getBoundaryState();
if (state.isEditable() == false) {
return super.handleMouseMove(x, y);
}
Geometry dragme = state.dragMeGeom;
Cursor toUse = null;
if (dragme != null) {
Coordinate[] coords = dragme.getCoordinates();
int idx = getCoordinateIndex(controller, coords, mouse);
if (idx > -1) {
toUse = movePoint;
moveType = MoveType.SINGLE_POINT;
/*
* In AWIPS I, When Looping Is Enabled Before A Track Has Been
* Created, Looping Will Automatically Be Disabled When TheMouse
* Cursor Comes Into The Proximity Of The Tool.
*/
if (state.mode == BoundaryState.Mode.DRAG_ME) {
if (container.getLoopProperties().isLooping()) {
container.getLoopProperties().setLooping(false);
state.loopingWasOn = true;
}
}
movePointIndex = idx;
}
if (moveType == null) {
if (state.userAction == UserAction.INSERT_BOUNDARY
|| state.userAction == UserAction.EDIT_BOUNDARY) {
if (closeToLine(controller, coords, mouse)) {
toUse = movePolygon;
moveType = MoveType.ALL_POINTS;
}
}
}
}
getShell().setCursor(toUse);
return super.handleMouseMove(x, y);
}
@Override
public boolean handleMouseDown(int x, int y, int mouseButton) {
if (controller.getBoundaryState().dragingLineNotAllowed) {
return false;
}
if (!isHandleInput()) {
return super.handleMouseDown(x, y, mouseButton);
}
lastX = x;
lastY = y;
pointCreated = false;
BoundaryState state = controller.getBoundaryState();
if (state.isEditable() == false) {
return super.handleMouseDown(x, y, mouseButton);
}
if (mouseButton == 1 && moveType != null) {
Geometry moveGeom = (Geometry) state.dragMeGeom.clone();
state.mouseDownGeom = moveGeom;
return true;
} else if (mouseButton == 2 && moveType != null) {
return false;
}
moveType = null;
movePointIndex = -1;
return false;
}
@Override
public boolean handleMouseDownMove(int x, int y, int mouseButton) {
if (controller.getBoundaryState().dragingLineNotAllowed) {
return false;
}
if (controller.getBoundaryState().movingEdited) {
return false;
}
if (!isHandleInput()) {
return super.handleMouseDownMove(x, y, mouseButton);
}
boolean move = false;
BoundaryState state = controller.getBoundaryState();
if (state.isEditable() == false) {
return super.handleMouseDownMove(x, y, mouseButton);
}
if (mouseButton == 1 && moveType != null) {
move = true;
} else if (mouseButton == 2
&& moveType != null
&& controller.getBoundaryState().userAction == UserAction.INSERT_BOUNDARY
&& controller.getBoundaryState().lineIsMoving == false) {
if (!pointCreated) {
state = controller.getBoundaryState();
pointCreated = true;
movePointIndex = addVertex(lastX, lastY);
state.mouseDownGeom = (Geometry) state.dragMeGeom.clone();
moveType = MoveType.SINGLE_POINT;
}
move = true;
}
if (move) {
move(x, y);
return true;
}
return super.handleMouseDownMove(x, y, mouseButton);
}
@Override
public boolean handleMouseUp(int x, int y, int mouseButton) {
if (controller.getBoundaryState().dragingLineNotAllowed) {
controller.getBoundaryState().dragingLineNotAllowed = false;
return false;
}
if (!isHandleInput()) {
super.handleMouseUp(x, y, mouseButton);
}
BoundaryState state = controller.getBoundaryState();
boolean rval = false;
if (((mouseButton == 1) || (mouseButton == 2 && pointCreated && controller
.getBoundaryState().lineIsMoving == false)) && moveType != null) {
state.dragMeGeom = state.mouseDownGeom;
state.mouseDownGeom = null;
if (state.mode == Mode.DRAG_ME) {
state.mode = Mode.TRACK;
}
state.lineMovedMap.put(state.boundaryId, true);
FramesInfo info = controller.getDescriptor().getFramesInfo();
trackUtil.setPivotIndexes(info, state);
// This code is duplicated from StormTrackDisplay.paint().
if (state.displayedPivotIndex == trackUtil.getCurrentFrame(info)) {
if (state.displayedPivotIndex == state.pivotIndex
&& state.otherPivotIndex >= 0) {
state.displayedPivotIndex = state.otherPivotIndex;
} else if (state.pivotIndex >= 0) {
state.displayedPivotIndex = state.pivotIndex;
}
}
rval = true;
} else if (mouseButton == 2 && !pointCreated) {
rval = true;
Coordinate[] coords = state.dragMeGeom.getCoordinates();
Coordinate mouse = new Coordinate(x, y);
int idxToDelete = getCoordinateIndex(controller, coords, mouse);
if (idxToDelete >= 0) {
if (!controller.getBoundaryState().lineIsMoving)
deleteVertex(idxToDelete);
} else if (closeToLine(controller, coords, mouse)) {
if (!controller.getBoundaryState().lineIsMoving) {
addVertex(lastX, lastY);
}
} else {
rval = false;
}
}
if (rval) {
state.geomChanged = true;
state.dragMeLine = (LineString) state.dragMeGeom;
state.boundariesMap.put(state.boundaryId, state.dragMeLine);
updateNumberOfPointsForLine();
controller.issueRefresh();
}
pointCreated = false;
return rval;
}
public static int getCoordinateIndex(AbstractBoundaryResource resource,
Coordinate[] coords, Coordinate mouse) {
return getCoordinateIndex(resource.getResourceContainer(), coords,
mouse, 15.0);
}
public static int getCoordinateIndex(IDisplayPaneContainer container,
Coordinate[] coords, Coordinate mouse, double threshold) {
int rval = -1;
int i = 0;
for (Coordinate c : coords) {
double[] screen = container.translateInverseClick(c);
if (screen != null) {
c = new Coordinate(screen[0], screen[1]);
if (c.distance(mouse) <= threshold) {
rval = i;
break;
}
}
++i;
}
return rval;
}
public static boolean closeToLine(AbstractBoundaryResource controller,
Coordinate[] coords, Coordinate mouse) {
IDisplayPaneContainer container = controller.getResourceContainer();
if (coords.length < 2) {
return false;
}
GeometryFactory gf = new GeometryFactory();
List<Coordinate> inverted = new ArrayList<Coordinate>(coords.length);
for (int i = 0; i < coords.length; ++i) {
double[] vals = container.translateInverseClick(coords[i]);
// handle offscreen coords
// TODO: use nearest point on line that is on screen?
if (vals != null) {
inverted.add(new Coordinate(vals[0], vals[1]));
}
}
if (inverted.size() > 1) {
return (gf.createLineString(
inverted.toArray(new Coordinate[inverted.size()]))
.distance(gf.createPoint(mouse)) <= point_coord);
}
return false;
}
private void move(int x, int y) {
BoundaryState state = controller.getBoundaryState();
IDisplayPaneContainer container = controller.getResourceContainer();
int changeX = x - lastX;
int changeY = y - lastY;
switch (moveType) {
case ALL_POINTS: {
Coordinate[] coords = state.mouseDownGeom.getCoordinates();
for (Coordinate c : coords) {
double[] vals = container.translateInverseClick(c);
vals[0] += changeX;
vals[1] += changeY;
Coordinate tmp = container.translateClick(vals[0], vals[1]);
if (tmp != null) {
c.x = tmp.x;
c.y = tmp.y;
}
}
break;
}
case SINGLE_POINT: {
if (state.mouseDownGeom != null) {
Coordinate[] coords = state.mouseDownGeom.getCoordinates();
Coordinate c = coords[movePointIndex];
double[] vals = container.translateInverseClick(c);
vals[0] += changeX;
vals[1] += changeY;
Coordinate tmp = container.translateClick(vals[0], vals[1]);
if (tmp != null) {
c.x = tmp.x;
c.y = tmp.y;
}
}
break;
}
}
lastX = x;
lastY = y;
controller.issueRefresh();
}
public int addVertex(int x, int y) {
BoundaryState state = controller.getBoundaryState();
IDisplayPaneContainer container = controller.getResourceContainer();
double bestDistance = Double.MAX_VALUE;
int insertionPoint = 0;
Coordinate[] coords = state.dragMeGeom.getCoordinates();
Coordinate mouse = container.translateClick(x, y);
for (int i = 1; i < coords.length; i++) {
LineSegment segment = new LineSegment(coords[i - 1], coords[i]);
double distance = segment.distance(mouse);
if (distance < bestDistance) {
insertionPoint = i;
bestDistance = distance;
}
}
Coordinate[] newLine = new Coordinate[coords.length + 1];
for (int i = 0; i < newLine.length; i++) {
if (i < insertionPoint) {
newLine[i] = coords[i];
} else if (i > insertionPoint) {
newLine[i] = coords[i - 1];
} else {
newLine[i] = mouse;
}
}
state.dragMeGeom = new GeometryFactory().createLineString(newLine);
state.geomChanged = true;
state.numberPointChanged = true;
return insertionPoint;
}
public void deleteVertex(int index) {
BoundaryState state = controller.getBoundaryState();
Coordinate[] coords = state.dragMeGeom.getCoordinates();
if (coords.length > 2) {
Coordinate[] newCoords = new Coordinate[coords.length - 1];
int j = 0;
for (int i = 0; i < coords.length; ++i) {
if (i != index) {
newCoords[j++] = coords[i];
}
}
state.dragMeGeom = new GeometryFactory()
.createLineString(newCoords);
state.geomChanged = true;
state.numberPointChanged = true;
}
}
public void updateNumberOfPointsForLine() {
BoundaryState state = controller.getBoundaryState();
if (state.timePointsMap.get(state.boundaryId) != null)
state.dragMePointMap.remove(state.boundaryId);
state.dragMePointMap.put(state.boundaryId,
state.boundariesMap.get(state.boundaryId));
Coordinate[] coords = state.dragMePointMap.get(state.boundaryId)
.getCoordinates();
state.dragMePoint = new Point[coords.length];
GeometryFactory gf = new GeometryFactory();
for (int k = 0; k < coords.length; k++) {
state.dragMePoint[k] = gf.createPoint(coords[k]);
}
// Check if a vertex is added or deleted in the boundary;
// if so, update the polyline accordingly along the track
state.timePoints = state.timePointsMap.get(state.boundaryId);
if (state.timePoints != null) {
for (int i = 0; i < state.timePoints.length; i++) {
Point point = getPointFromLine(state.timePoints[i].polyline);
state.timePoints[i].polyline = figureLineFromPoint(
state.dragMePointMap.get(state.boundaryId), point);
state.numberPointChanged = false;
}
state.timePointsMap.put(state.boundaryId, state.timePoints);
}
}
public static Point getPointFromLine(LineString line) {
Coordinate[] coords = line.getCoordinates();
if (coords.length % 2 == 1) {
return new GeometryFactory()
.createPoint(coords[(coords.length - 1) / 2]);
} else {
Coordinate middleLeft = coords[coords.length / 2];
Coordinate middleRight = coords[(coords.length - 2) / 2];
return new GeometryFactory().createPoint(new Coordinate(
middleLeft.x + ((middleRight.x - middleLeft.x) / 2),
middleLeft.y + ((middleRight.y - middleLeft.y) / 2)));
}
}
public static Point getPointFromLine(LineString line, int indexVertex) {
Coordinate[] coords = line.getCoordinates();
return new GeometryFactory().createPoint(coords[indexVertex]);
}
public LineString figureLineFromPoint(LineString line, Point pointGeom) {
IDisplayPaneContainer container = controller.getResourceContainer();
Coordinate point = pointGeom.getCoordinate();
Coordinate linePoint = getPointFromLine(line).getCoordinate();
double[] dest = container.translateInverseClick(point);
double[] start = container.translateInverseClick(linePoint);
double changeX = dest[0] - start[0];
double changeY = dest[1] - start[1];
Coordinate[] coords = line.getCoordinates();
Coordinate[] newLineCoords = new Coordinate[coords.length];
for (int i = 0; i < coords.length; ++i) {
double[] vals = container.translateInverseClick(coords[i]);
newLineCoords[i] = container.translateClick(vals[0] + changeX,
vals[1] + changeY);
}
return new GeometryFactory().createLineString(newLineCoords);
}
/**
* Will return null if the line or point are offscreen.
*
* @param line
* @param pointGeom
* @return
*/
public LineString figureLineFromPoint(LineString line, Point[] pointGeom)
throws ImpossibleTrackException {
IDisplayPaneContainer container = controller.getResourceContainer();
IDisplayPane pane = container.getActiveDisplayPane();
Coordinate[] coords = line.getCoordinates();
Coordinate[] newLineCoords = new Coordinate[coords.length];
for (int i = 0; i < coords.length; ++i) {
Coordinate point = pointGeom[i].getCoordinate();
Coordinate linePoint = getPointFromLine(line, i).getCoordinate();
double[] dest = container.translateInverseClick(point);
double[] start = container.translateInverseClick(linePoint);
if (dest != null && start != null) {
double changeX = dest[0] - start[0];
double changeY = dest[1] - start[1];
double[] vals = container.translateInverseClick(coords[i]);
double[] translated = pane.getDescriptor().pixelToWorld(
pane.screenToGrid(vals[0] + changeX, vals[1] + changeY,
0));
newLineCoords[i] = new Coordinate(translated[0], translated[1]);
} else {
return null;
}
}
return new GeometryFactory().createLineString(newLineCoords);
}
/**
* @return
*/
public boolean closeToPoint() {
LineString line = null;
for (Integer boundaryId : controller.getBoundaryState().boundariesMap
.keySet()) {
if (boundaryId == controller.getBoundaryState().boundaryId) {
line = controller.getBoundaryState().boundariesMap
.get(boundaryId);
break;
}
}
return getCoordinateIndex(controller, line.getCoordinates(),
new Coordinate(lastX, lastY)) > -1;
}
/**
* @return
*/
public boolean closeToLine() {
LineString line = null;
for (Integer boundaryId : controller.getBoundaryState().boundariesMap
.keySet()) {
if (boundaryId == controller.getBoundaryState().boundaryId) {
line = controller.getBoundaryState().boundariesMap
.get(boundaryId);
break;
}
}
return closeToLine(controller, line.getCoordinates(), new Coordinate(
lastX, lastY));
}
/**
* @return
*/
public IAction getDeleteAction() {
return new DeleteVertexAction();
}
/**
* @return
*/
public IAction getAddAction() {
return new AddVertexAction();
}
private class DeleteVertexAction extends AbstractRightClickAction {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
BoundaryState state = controller.getBoundaryState();
if (!controller.getBoundaryState().lineIsMoving)
deleteVertex(getCoordinateIndex(controller, state.boundariesMap
.get(state.boundaryId).getCoordinates(),
new Coordinate(lastX, lastY)));
state.dragMeLine = (LineString) state.dragMeGeom;
state.geomChanged = true;
updateNumberOfPointsForLine();
controller.issueRefresh();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.Action#getText()
*/
@Override
public String getText() {
return controller.getDeleteVertexText();
}
}
private class AddVertexAction extends AbstractRightClickAction {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
BoundaryState state = controller.getBoundaryState();
if (!controller.getBoundaryState().lineIsMoving)
addVertex(lastX, lastY);
state.dragMeLine = (LineString) state.dragMeGeom;
state.geomChanged = true;
updateNumberOfPointsForLine();
controller.issueRefresh();
}
/*
* (non-Javadoc)B
*
* @see org.eclipse.jface.action.Action#getText()
*/
@Override
public String getText() {
return controller.getAddVertexText();
}
}
/**
* @param trackUtil
*/
public void setTrackUtil(BoundaryUtil trackUtil) {
this.trackUtil = trackUtil;
}
public BoundaryUtil getTrackUtil() {
return trackUtil;
}
private Shell getShell() {
IDisplayPaneContainer container = controller.getResourceContainer();
if (container instanceof IWorkbenchPart) {
return ((IWorkbenchPart) container).getSite().getShell();
} else {
return VizWorkbenchManager.getInstance().getCurrentWindow()
.getShell();
}
}
}

View file

@ -0,0 +1,122 @@
package gov.noaa.nws.mdl.viz.boundaryTool.common.boundary;
import java.util.ArrayList;
import java.util.List;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.viz.core.drawables.IDescriptor.FramesInfo;
/**
*
* @author bkowal
* @version 1.0
*
* Slightly modified of "StormTrackUti" class
*/
public class BoundaryUtil {
public BoundaryUtil() {
}
public int getFrameCount(FramesInfo info) {
int len = makeUniqueTimes(info.getFrameTimes()).length;
return len;
}
public int getCurrentFrame(FramesInfo info) {
int returnIndex = 0;
if (info.getFrameTimes() == null || info.getFrameCount() < 1) {
return -1;
}
DataTime[] uniqueTimes = makeUniqueTimes(info.getFrameTimes());
DataTime currTime = info.getFrameTimes()[info.getFrameIndex()];
if (uniqueTimes == null) {
return -1;
}
for (int i = 0; i < uniqueTimes.length; i++) {
if (currTime.equals(uniqueTimes[i], true)) {
returnIndex = i;
break;
}
}
return returnIndex;
}
public DataTime[] getDataTimes(FramesInfo info) {
return makeUniqueTimes(info.getFrameTimes());
}
public void setPivotIndexes(FramesInfo info, BoundaryState boundaryState) {
int lastFrame = getFrameCount(info) - 1;
if (getCurrentFrame(info) == lastFrame) {
// We Are Presently On The Last Frame.
boundaryState.otherPivotIndex = 0;
boundaryState.nextPivotIndex = lastFrame;
boundaryState.pivotIndex = lastFrame;
} else {
boundaryState.otherPivotIndex = 0;
boundaryState.nextPivotIndex = -1;
boundaryState.pivotIndex = lastFrame;
}
}
private DataTime[] makeUniqueTimes(DataTime[] times) {
List<DataTime> uniqueTimes = new ArrayList<DataTime>();
if (times != null && times.length > 0) {
DataTime lastTime = times[0];
uniqueTimes.add(times[0]);
for (int i = 1; i < times.length; ++i) {
if (!lastTime.equals(times[i], true)) {
uniqueTimes.add(times[i]);
lastTime = times[i];
}
}
}
return uniqueTimes.toArray(new DataTime[uniqueTimes.size()]);
}
/**
* Returns the time between times in seconds using valid time
*
* @param a
* @param b
* @return
*/
public int timeBetweenDataTimes(DataTime a, DataTime b) {
return (int) (Math.abs(a.getValidTime().getTimeInMillis()
- b.getValidTime().getTimeInMillis()) / 1000);
}
/**
* Adjusts the angle from -360/360 to be between -180/180
*
* @param angle
* @return
*/
protected double adjustAngle(double angle) {
double newVal = angle % 360;
if (newVal > 180) {
newVal -= 360;
} else if (newVal < -180) {
newVal += 360;
}
return newVal;
}
/**
* Adjusts the angle from -180/180 to be between 0/360
*
* @param angle
* @return
*/
protected double unadjustAngle(double angle) {
double newVal = angle;
if (newVal < 0) {
newVal = 360 - newVal;
}
return newVal;
}
}

View file

@ -0,0 +1,45 @@
package gov.noaa.nws.mdl.viz.boundaryTool.common.boundary;
import com.raytheon.uf.viz.core.exception.VizException;
/**
*
* @author Mamoudou Ba
* @version 1.0
*
* Entirely reused of A2 "ImpossibleTrackException" class
*/
public class ImpossibleTrackException extends VizException {
private static final long serialVersionUID = -7171916545937661879L;
/**
*
*/
public ImpossibleTrackException() {
super();
}
/**
* @param message
* @param cause
*/
public ImpossibleTrackException(String message, Throwable cause) {
super(message, cause);
}
/**
* @param message
*/
public ImpossibleTrackException(String message) {
super(message);
}
/**
* @param cause
*/
public ImpossibleTrackException(Throwable cause) {
super(cause);
}
}

View file

@ -0,0 +1,73 @@
package gov.noaa.nws.mdl.viz.boundaryTool.ui.action;
import gov.noaa.nws.mdl.viz.boundaryTool.ui.layer.BoundaryEditorLayer;
import java.util.List;
import com.raytheon.uf.viz.core.IDisplayPane;
import com.raytheon.uf.viz.core.VizApp;
import com.raytheon.uf.viz.core.drawables.IDescriptor;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
import com.raytheon.uf.viz.core.rsc.tools.GenericToolsResourceData;
import com.raytheon.uf.viz.core.rsc.tools.action.AbstractGenericToolAction;
/**
* @author Mamoudou Ba
* @version 1.0
*
* April 2011: Substantially modified from A2 "TimeOfArrivalAction"
* class
*/
public class BoundaryEditorAction extends
AbstractGenericToolAction<BoundaryEditorLayer> {
/*
* (non-Javadoc)
*
* @seecom.raytheon.viz.awipstools.ui.action.MapToolAction#getResourceData()
*/
@Override
protected GenericToolsResourceData<BoundaryEditorLayer> getResourceData() {
return new GenericToolsResourceData<BoundaryEditorLayer>(
BoundaryEditorLayer.NAME, BoundaryEditorLayer.class);
}
// November 25, 2013
@Override
protected BoundaryEditorLayer getResource(LoadProperties loadProperties,
IDescriptor descriptor) throws VizException {
BoundaryEditorLayer layer = getExistingResource();
if (layer == null)
return super.getResource(loadProperties, descriptor);
VizApp.runAsync(new Runnable() {
@Override
public void run() {
BoundaryEditorLayer layer = getExistingResource();
if (layer != null) {
layer.makeEditableAndReopenDialog();
}
}
});
return layer;
}
private BoundaryEditorLayer getExistingResource() {
IDisplayPane[] panes = getSelectedPanes();
if (panes != null && panes.length > 0) {
List<BoundaryEditorLayer> layers = null;
layers = panes[0].getDescriptor().getResourceList()
.getResourcesByTypeAsType(BoundaryEditorLayer.class);
if (!layers.isEmpty()) {
return layers.get(0);
}
}
return null;
}
}

View file

@ -0,0 +1,87 @@
package gov.noaa.nws.mdl.viz.boundaryTool.ui.dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
/**
*
* @author Mamoudou Ba
* @version 1.0
*
* Dialog class which allows users to input a string defining a
* boundary type
*
* December 2015: Initial creation
*
* January 2016: extends to use CaveSWTDialog dialog, and remove
* unnecessary getters and setters
*/
class UserInputBndType extends CaveSWTDialog {
protected static Boolean isOK = false;
protected String userInput;
public UserInputBndType(Shell parent) {
this(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
}
public UserInputBndType(Shell parent, int style) {
super(parent, style);
setText("Input Dialog");
}
@Override
protected void initializeComponents(final Shell shell) {
shell.setLayout(new GridLayout(2, true));
Label label = new Label(shell, SWT.NONE);
label.setText("Please enter a boundary type:");
GridData data = new GridData();
data.horizontalSpan = 2;
label.setLayoutData(data);
final Text text = new Text(shell, SWT.BORDER);
data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan = 2;
text.setLayoutData(data);
Button okButton = new Button(shell, SWT.PUSH);
okButton.setText("OK");
data = new GridData(GridData.FILL_HORIZONTAL);
okButton.setLayoutData(data);
okButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
userInput = text.getText();
isOK = true;
close();
}
});
Button cancelButton = new Button(shell, SWT.PUSH);
cancelButton.setText("Cancel");
data = new GridData(GridData.FILL_HORIZONTAL);
cancelButton.setLayoutData(data);
cancelButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
isOK = false;
close();
}
});
shell.setDefaultButton(okButton);
}
}

View file

@ -0,0 +1,319 @@
package gov.noaa.nws.mdl.viz.boundaryTool.ui.layer;
import gov.noaa.nws.mdl.viz.boundaryTool.boundaries.state.xml.ReadBoundariesXmlFile;
import gov.noaa.nws.mdl.viz.boundaryTool.common.boundary.AbstractBoundaryResource;
import gov.noaa.nws.mdl.viz.boundaryTool.common.boundary.BoundaryState;
import gov.noaa.nws.mdl.viz.boundaryTool.common.boundary.BoundaryState.LabelMode;
import gov.noaa.nws.mdl.viz.boundaryTool.common.boundary.BoundaryUIManager;
import gov.noaa.nws.mdl.viz.boundaryTool.ui.dialog.BoundaryEditorDialog;
import java.io.FileNotFoundException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import javax.xml.datatype.DatatypeConfigurationException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.opengis.coverage.grid.GridEnvelope;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.core.IDisplayPane;
import com.raytheon.uf.viz.core.IDisplayPaneContainer;
import com.raytheon.uf.viz.core.IExtent;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.PixelExtent;
import com.raytheon.uf.viz.core.VizApp;
import com.raytheon.uf.viz.core.drawables.IDescriptor.FramesInfo;
import com.raytheon.uf.viz.core.drawables.IWireframeShape;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.map.MapDescriptor;
import com.raytheon.uf.viz.core.rsc.LoadProperties;
import com.raytheon.uf.viz.core.rsc.ProgressiveDisclosureProperties;
import com.raytheon.uf.viz.core.rsc.capabilities.MagnificationCapability;
import com.raytheon.uf.viz.core.rsc.tools.GenericToolsResourceData;
import com.raytheon.viz.ui.VizWorkbenchManager;
import com.raytheon.viz.ui.input.EditableManager;
import com.raytheon.viz.ui.input.InputAdapter;
import com.vividsolutions.jts.geom.Coordinate;
/**
*
* @author Mamoudou ba
* @version 1.0
*
* April 2011: Based on A2 "TimeOfArrivalLayer" class
*/
public class BoundaryEditorLayer extends AbstractBoundaryResource {
public static class BoundaryEditorState {
public Coordinate loc;
public Coordinate mouseLoc;
// public String text = "Drag me to Point of Arrival";
public double distance;
public boolean changed;
}
private final DateFormat timeFormat = new SimpleDateFormat("HH:mm");
public static final String NAME = "Boundary Editor";
private static final int PD_MAX_WIDTH = 1999000;
private IWireframeShape jazzyExtras;
private BoundaryEditorDialog dialog;
private BoundaryEditorState boundaryEditState;
private ProgressiveDisclosureProperties pdProps;
private Shell shell;
private Cursor movePoint;
private boolean hovering = false;
private InputAdapter adapter = new InputAdapter() {
@Override
public boolean handleMouseMove(int x, int y) {
Coordinate mouse = new Coordinate(x, y);
hovering = false;
Coordinate loc = boundaryEditState.loc;
if (loc != null) {
if (BoundaryUIManager.getCoordinateIndex(
BoundaryEditorLayer.this, new Coordinate[] { loc },
mouse) > -1) {
shell.setCursor(movePoint);
hovering = true;
}
}
return super.handleMouseMove(x, y);
}
@Override
public boolean handleMouseDown(int x, int y, int mouseButton) {
if (mouseButton == 1 && hovering) {
boundaryEditState.mouseLoc = new Coordinate(
boundaryEditState.loc);
issueRefresh();
return true;
}
return false;
}
// November 25 2013 - updated from TimeOfArrivalLayer
@Override
public boolean handleMouseDownMove(int arg_x, int arg_y, int mouseButton) {
double x = arg_x;
double y = arg_y;
if (mouseButton == 1 && hovering) {
// check if point of arrival is off the drawn map, draw at
// closest border if it is
IDisplayPane pane = getResourceContainer()
.getActiveDisplayPane();
double[] world = pane.screenToGrid(x, y, 0);
GridEnvelope ge = pane.getDescriptor().getGridGeometry()
.getGridRange();
IExtent extent = new PixelExtent(ge);
if (world == null) {
return true;
} else if (extent.contains(world) == false) {
// snap x coord to closest edge if out of bounds
if (world[0] > extent.getMaxX()) {
world[0] = extent.getMaxX();
} else if (world[0] < extent.getMinX()) {
world[0] = extent.getMinX();
}
// snap y coord to closest edge if out of bounds
if (world[1] > extent.getMaxY()) {
world[1] = extent.getMaxY();
} else if (world[1] < extent.getMinY()) {
world[1] = extent.getMinY();
}
// translate back to screen coords
double[] screen = pane.gridToScreen(world);
x = screen[0];
y = screen[1];
}
// translate from screen to lat/lon
Coordinate c = getResourceContainer().translateClick(x, y);
if (c != null) {
boundaryEditState.mouseLoc = c;
issueRefresh();
}
return true;
}
return false;
}
@Override
public boolean handleMouseUp(int x, int y, int mouseButton) {
if (mouseButton == 1 && hovering) {
boundaryEditState.loc = boundaryEditState.mouseLoc;
boundaryEditState.mouseLoc = null;
boundaryEditState.changed = true;
displayState.geomChanged = true;
issueRefresh();
return true;
}
return false;
}
};
public BoundaryEditorLayer(
GenericToolsResourceData<BoundaryEditorLayer> resourceData,
LoadProperties loadProperties, MapDescriptor descriptor) {
super(resourceData, loadProperties, descriptor);
// add magnification capability
getCapabilities().addCapability(new MagnificationCapability());
this.pdProps = new ProgressiveDisclosureProperties();
this.pdProps.setMaxDisplayWidth(BoundaryEditorLayer.PD_MAX_WIDTH);
timeFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
// reopenDialog();
boundaryEditState = new BoundaryEditorState();
shell = VizWorkbenchManager.getInstance().getCurrentWindow().getShell();
Display display = Display.getCurrent();
movePoint = display.getSystemCursor(SWT.CURSOR_HAND);
}
@Override
protected void initInternal(IGraphicsTarget target) throws VizException {
super.initInternal(target);
IDisplayPaneContainer container = getResourceContainer();
if (container != null) {
container.registerMouseHandler(adapter);
}
reopenDialog();
}
@Override
protected void disposeInternal() {
super.disposeInternal();
dialog.close();
displayState.dialogObject = null;
if (jazzyExtras != null) {
jazzyExtras.dispose();
}
IDisplayPaneContainer container = getResourceContainer();
if (container != null) {
container.unregisterMouseHandler(adapter);
}
}
/*
* (non-Javadoc)
*
* @see
* gov.noaa.nws.mdl.viz.boundaryTool.common.boundary.AbstractBoundaryResource
* #getResourceName()
*/
@Override
protected String getResourceName() {
return NAME;
}
/*
* (non-Javadoc)
*
* @see
* gov.noaa.nws.mdl.viz.boundaryTool.common.boundary.AbstractBoundaryResource
* #initializeState
* (gov.noaa.nws.mdl.viz.boundaryTool.common.boundary.BoundaryState)
*/
@Override
protected void initializeState(BoundaryState state) {
IDisplayPaneContainer container = getResourceContainer();
if (container.getLoopProperties().isLooping()) {
container.getLoopProperties().setLooping(false);
state.loopingWasOn = true;
}
FramesInfo info = descriptor.getFramesInfo();
// Setup the initial state for the storm track
// Default angle for POINT
displayState.userAction = BoundaryState.UserAction.READ_ACTIVE_BOUNDARIES;
displayState.labelMode = LabelMode.TIME;
state.angle = 90;
state.boundaryId = 0;
state.dragMePoint = null;
state.dragMeLine = null;
// default for POLY, calculated usually
state.lineOfStormsLength = 1000;
state.mode = BoundaryState.Mode.DRAG_ME;
state.numDragMePoints = 1;
state.pivotIndex = trackUtil.getCurrentFrame(info);
state.otherPivotIndex = displayState.pivotIndex > 0 ? 0 : trackUtil
.getFrameCount(info) - 1;
state.thingToDragTo = "boundary location";
ReadBoundariesXmlFile readXMLFile = new ReadBoundariesXmlFile();
try {
readXMLFile.readBoundariesXmlFile(state);
readXMLFile = null;
} catch (FileNotFoundException e) {
statusHandler.handle(Priority.PROBLEM, "No such file exists", e);
} catch (VizException e) {
statusHandler.handle(Priority.PROBLEM, "VisException", e);
} catch (DatatypeConfigurationException e) {
statusHandler.handle(Priority.PROBLEM,
"Data type configuration problem", e);
}
}
/**
* Re-opens the dialog if closed
*/
public void reopenDialog() {
// Open the dialog
VizApp.runAsync(new Runnable() {
@Override
public void run() {
if (dialog == null || dialog.getShell() == null
|| dialog.getShell().isDisposed()) {
dialog = new BoundaryEditorDialog(VizWorkbenchManager
.getInstance().getCurrentWindow().getShell(),
BoundaryEditorLayer.this);
dialog.setBlockOnOpen(false);
dialog.open();
displayState.dialogObject = dialog;
}
}
});
}
// November 25, 2013
public void makeEditableAndReopenDialog() {
EditableManager.makeEditable(this, true);
reopenDialog();
}
}