/* * Copyright (C) 2011. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 or * 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. */ package uk.me.parabola.imgfmt.app.mdr; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import uk.me.parabola.imgfmt.app.ImgFileWriter; /** * POIs ordered by type. Section 18 is the index into this. * * @author Steve Ratcliffe */ public class Mdr19 extends MdrSection implements HasHeaderFlags { private List<Mdr11Record> pois; private final List<Mdr18Record> poiTypes = new ArrayList<Mdr18Record>(); public Mdr19(MdrConfig config) { setConfig(config); } /** * Sort the pois by type. */ public void preWriteImpl() { Collections.sort(pois, new Comparator<Mdr11Record>() { public int compare(Mdr11Record o1, Mdr11Record o2) { // For mainly historical reasons, we keep the element type in a number of different // formats. Need to normalise it before sorting. int t1 = MdrUtils.fullTypeToNaturalType(o1.getType()); int t2 = MdrUtils.fullTypeToNaturalType(o2.getType()); if (t1 == t2) return 0; else if (t1 < t2) return -1; else return 1; } }); } /** * Write out the contents of this section. * * @param writer Where to write it. */ public void writeSectData(ImgFileWriter writer) { int n = getSizes().getPoiSizeFlagged(); int flag = getSizes().getPoiFlag(); String lastName = null; int lastType = -1; int record = 1; for (Mdr11Record p : pois) { int index = p.getRecordNumber(); String name = p.getName(); if (!name.equals(lastName)) { index |= flag; lastName = name; } putN(writer, n, index); int type = MdrUtils.fullTypeToNaturalType(p.getType()); if (type != lastType) { Mdr18Record mdr18 = new Mdr18Record(); mdr18.setType(type); mdr18.setRecord(record); poiTypes.add(mdr18); lastType = type; } record++; } Mdr18Record m18 = new Mdr18Record(); m18.setRecord(record); m18.setType(~0); poiTypes.add(m18); } /** * Release the copy of the pois. The other index is small and not worth * worrying about. */ protected void releaseMemory() { pois = null; } /** * Records in this section are record numbers into mdr 11 with a flag * so has to be large enough for a flagged index. * * @return The size of a record in this section. */ public int getItemSize() { return getSizes().getPoiSizeFlagged(); } /** * Method to be implemented by subclasses to return the number of items in the section. This will only be valid after * the section is completely finished etc. * * @return The number of items in the section. */ protected int numberOfItems() { return pois.size(); } /** * Not yet known. * * @return The correct value based on the contents of the section. Zero if nothing needs to be done. */ public int getExtraValue() { return getSizes().getSize(19) - 1; } public void setPois(List<Mdr11Record> pois) { this.pois = pois; } public List<Mdr18Record> getPoiTypes() { return poiTypes; } }