/**
* Copyright (C) 2006 Steve Ratcliffe
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* Author: steve
* Date: 26-Dec-2006
*/
package uk.me.parabola.mkgmap.general;
import java.util.Arrays;
import uk.me.parabola.imgfmt.app.Coord;
import uk.me.parabola.imgfmt.app.trergn.ExtTypeAttributes;
import uk.me.parabola.imgfmt.app.trergn.MapObject;
/**
* A map element is a point, line or shape that appears on the map. This
* class holds all the common routines that are shared across all elements.
*
* @author Steve Ratcliffe.
*/
public abstract class MapElement
{
protected String[] labels
;
private int type
;
private int minResolution =
24;
private int maxResolution =
24;
private ExtTypeAttributes extTypeAttributes
;
// other attributes
private String zip,country,region,city,street,phone,houseNumber,isIn
;
protected MapElement
() {
labels =
new String[4];
}
protected MapElement
(MapElement orig
) {
labels =
Arrays.
copyOf(orig.
labels,
4);
type = orig.
type;
minResolution = orig.
minResolution;
maxResolution = orig.
maxResolution;
extTypeAttributes = orig.
extTypeAttributes;
zip = orig.
zip;
country = orig.
country;
region = orig.
region;
city = orig.
city;
street = orig.
street;
phone = orig.
phone;
houseNumber = orig.
houseNumber;
isIn = orig.
isIn;
}
/**
* Provide a copy of this MapElement without geometry. This is used
* when filtering and clipping to create modified versions.
*
* @return the copy;
*/
public abstract MapElement copy
();
public String getName
() {
return labels
[0];
}
public String[] getLabels
() {
return this.
labels;
}
public void setName
(String name
) {
this.
labels[0] = name
;
}
public void add2Name
(String name
) {
for (int i =
1; i
< 4; i++
) {
if (this.
labels[i
] ==
null) {
this.
labels[i
] = name
;
break;
}
}
}
public void setLabels
(String[] labels
) {
this.
labels =
Arrays.
copyOf(labels,
4);
}
public int numLabels
(){
int count =
0;
for (int i =
0; i
< 4; i++
) {
if (this.
labels[i
] !=
null)
count++
;
else
break;
}
return count
;
}
public ExtTypeAttributes getExtTypeAttributes
() {
return extTypeAttributes
;
}
public void setExtTypeAttributes
(ExtTypeAttributes eta
) {
extTypeAttributes = eta
;
}
public String getCity
() {
return city
;
}
public void setCity
(String city
) {
this.
city = city
;
}
public String getZip
() {
return zip
;
}
public void setZip
(String zip
) {
this.
zip = zip
;
}
public String getCountry
() {
return country
;
}
public void setCountry
(String country
) {
this.
country = country
;
}
public String getRegion
() {
return region
;
}
public void setRegion
(String region
) {
this.
region= region
;
}
public String getStreet
() {
return street
;
}
public void setStreet
(String street
) {
this.
street = street
;
}
public String getPhone
() {
return phone
;
}
public void setPhone
(String phone
) {
if(phone.
startsWith("00")) {
phone = phone.
replaceFirst("00",
"+");
}
this.
phone = phone
;
}
public String getHouseNumber
() {
return houseNumber
;
}
public void setHouseNumber
(String houseNumber
) {
this.
houseNumber = houseNumber
;
}
public String getIsIn
() {
return isIn
;
}
public void setIsIn
(String isIn
) {
if(isIn
!=
null)
this.
isIn = isIn.
toUpperCase();
}
/**
* This is the type code that goes in the .img file so that the GPS device
* knows what to display.
*
* @return the type.
*/
public int getType
() {
return type
;
}
public void setType
(int type
) {
this.
type = type
;
}
public boolean isSimilar
(MapElement other
) {
if (this.
minResolution != other.
minResolution)
return false;
if (this.
maxResolution != other.
maxResolution)
return false;
if (this.
type != other.
type)
return false;
String thisName = getName
();
String otherName = other.
getName();
if (thisName ==
null && otherName ==
null)
return true;
if (thisName
!=
null && otherName
!=
null && thisName.
equals(otherName
))
return true;
return false;
}
public boolean hasExtendedType
() {
return MapObject.
hasExtendedType(type
);
}
/**
* Get the 'location' of the element. This is the mid point of the bounding
* box for the element. For a point, this will be the coordinates of the
* point itself of course.
*
* @return Co-ordinate of the mid-point of the bounding box of the element.
*/
public abstract Coord getLocation
();
/**
* Get the resolutions that an element should be displayed at.
* It will return the minimum resolution at which this element should be
* displayed at.
*
* @return The lowest resolution at which the element will be visible.
*/
public int getMinResolution
() {
return minResolution
;
}
public void setMinResolution
(int minResolution
) {
this.
minResolution = minResolution
;
}
/**
* The maximum resolution at which the element will be visible. This is normally
* 24, in other words the element is visible at all resolutions above the minimum.
* You can however set this lower, so that it will disappear as you zoom in, presumably to be
* replaced by another element.
*
* @return The max resolution (<= 24), default is 24.
*/
public int getMaxResolution
() {
return maxResolution
;
}
public void setMaxResolution
(int maxResolution
) {
this.
maxResolution = maxResolution
;
}
}