/*
* Copyright (C) 2007 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 Ratcliffe
* Create date: Jan 1, 2008
*/
package uk.me.parabola.imgfmt.app.lbl;
import uk.me.parabola.imgfmt.app.ImgFileWriter;
import uk.me.parabola.imgfmt.app.Label;
import uk.me.parabola.imgfmt.app.trergn.Subdivision;
/**
* A city is in a region. It also has (or can have anyway) a reference to
* an indexed point within the map itself.
*
* @author Steve Ratcliffe
*/
public class City {
private static final int POINT_REF = 0x8000;
private static final int REGION_IS_COUNTRY = 0x4000;
private int index = -1;
private final Region region;
private final Country country;
// This determines if a label is being used or a subdivision and point
// combo.
private boolean pointRef;
// The location of the city. These could both be zero if we are using a
// label instead.
private Subdivision subdivision;
private byte pointIndex;
// You can have either a label or a subdivision and point. This will be
// null if the location is being specified.
private Label label;
public City(Region region) {
this.region = region;
this.country = null;
}
public City(Country country) {
this.country = country;
this.region = null;
}
void write(ImgFileWriter writer) {
//writer.put3()
if (pointRef) {
// System.err.println("City point = " + (int)pointIndex + " div = " + subdivision.getNumber());
writer.put(pointIndex);
writer.putChar((char)subdivision.getNumber());
} else {
writer.put3(label.getOffset());
}
char info;
if(region != null)
info = (char) (region.getIndex() & 0x3fff);
else
info = (char) (REGION_IS_COUNTRY | (country.getIndex() & 0x3fff));
if (pointRef)
info |= POINT_REF;
writer.putChar(info);
}
public int getIndex() {
if (index == -1)
throw new IllegalStateException("Offset not known yet.");
return index;
}
public void setIndex(int index) {
this.index = index;
}
public void setLabel(Label label) {
pointRef = false;
this.label = label;
}
public void setPointIndex(byte pointIndex) {
pointRef = true;
this.pointIndex = pointIndex;
}
public void setSubdivision(Subdivision subdivision) {
pointRef = true;
this.subdivision = subdivision;
}
public String getName() {
if (label == null)
return "";
return label.getText();
}
public int getLblOffset() {
if (label == null)
return 0;
return label.getOffset();
}
public String toString() {
String result = "";
if(label != null)
result += label.getText();
if (subdivision != null)
result += " " + subdivision.getNumber() + "/" + pointIndex;
if(country != null)
result += " in country " + (0 + country.getIndex());
if(region != null)
result += " in region " + (0 + region.getIndex());
return result;
}
public int getSubdivNumber() {
return subdivision.getNumber();
}
public int getPointIndex() {
return pointIndex;
}
/**
* Get the region or country number.
* @return The region number if there is one, else the country number
* with a flag bit set to indicate that it is one.
*/
public int getRegionCountryNumber() {
if (region == null) {
if (country != null)
return country.getIndex() | 0x4000;
} else {
return region.getIndex();
}
return 0;
}
public int getRegionNumber() {
return region == null? 0: region.getIndex();
}
public int getCountryNumber() {
return country != null ? country.getIndex() : 0;
}
public Label getLabel() {
return label;
}
}