package edu.byu.cs.roots.opg.chart.selectvertical; import java.awt.Font; import edu.byu.cs.roots.opg.fonts.OpgFont; import edu.byu.cs.roots.opg.model.Gender; import edu.byu.cs.roots.opg.model.Individual; import edu.byu.cs.roots.opg.util.NameAbbreviator; import edu.byu.cs.roots.opg.util.PlaceAbbreviator; public class LineItem { enum LineItemType { ABBREVIATED_NAME, FIRST_NAME, MIDDLE_NAMES, MIDDLE_INITIAL, GIVEN_NAMES, SURNAME, NAME_SUFFIX, FIXED_STRING, COLLAPSABLE_SPACE, DUPLICATE_LABEL, FIRST_INITIAL, SURNAME_INITIAL, SURNAME_DISENVOWELLED, ABBREVIATED_BIRTH_DATE, BIRTH_DATE_TEXT, BIRTH_DATE_DAY, BIRTH_DATE_MONTH, BIRTH_DATE_YEAR, ABBREVIATED_DEATH_DATE, DEATH_DATE_TEXT, DEATH_DATE_DAY, DEATH_DATE_MONTH, DEATH_DATE_YEAR, ABBREVIATED_BIRTH_OR_DEATH_YEAR, ABBREVIATED_MARRIAGE_DATE, MARRIAGE_DATE_TEXT, MARRIAGE_DATE_DAY, MARRIAGE_DATE_MONTH, MARRIAGE_DATE_YEAR, ABBREVIATED_BIRTH_PLACE, BIRTH_PLACE_LOW, BIRTH_PLACE_HIGH, ABBREVIATED_DEATH_PLACE, DEATH_PLACE_LOW, DEATH_PLACE_HIGH, ABBREVIATED_MARRIAGE_PLACE, DEATH_MARRIAGE_LOW, DEATH_MARRIAGE_HIGH, PHOTO, CONTAINER }; int fontStyle; double relFontSize; private String str = ""; LineItemType type; boolean override; public double getWidth(double fontSize,OpgFont opgFont,Individual indi, String dupLabel, double boxWidth){ Font font = opgFont.getFont(Font.PLAIN, (float)fontSize); if(shouldBeBold()) font = opgFont.getBoldFont((float)fontSize); String str = getText(font, boxWidth, indi, dupLabel); if(type == LineItemType.ABBREVIATED_NAME) font = opgFont.getBoldFont((float)NameAbbreviator.getSize()); return font.getStringBounds(str, NameAbbreviator.frc).getWidth(); } public boolean shouldBeBold(){ switch (type){ case ABBREVIATED_NAME: case FIRST_INITIAL: case FIRST_NAME: case SURNAME: case SURNAME_INITIAL: case MIDDLE_NAMES: case MIDDLE_INITIAL: case NAME_SUFFIX: return true; //disabled because bold fonts are not currently calculating their widths correctly. //return false; default: return false; } } public LineItem(LineItemType t){ type = t; } public LineItem(LineItemType t, String s){ this(t); str = s; } public LineItem(LineItemType t, boolean ovr){ this(t); override = ovr; } double getHeight() { return 0; } String getText(Font font, double width, Individual indi, String duplicate) { String result = ""; switch(type) { case ABBREVIATED_NAME: double dupWid = font.getStringBounds(duplicate+" ", NameAbbreviator.frc).getWidth(); if(duplicate.compareTo("")==0) dupWid=0; NameAbbreviator.nameFit(indi.namePrefix.trim(), indi.givenName.trim(), indi.surname, indi.nameSuffix, (float)width - (float)dupWid, font); result = NameAbbreviator.getName(); break; case FIRST_NAME: { int idx = indi.givenName.trim().indexOf(' '); if (idx < 0) result = indi.givenName; else result = indi.givenName.substring(0, idx); break; } case FIRST_INITIAL: { if(indi.givenName.compareTo("")==0) return ""; result = indi.givenName.substring(0,1); result += ". "; break; } case MIDDLE_NAMES: { int idx = indi.givenName.trim().indexOf(' '); if (idx < 0) result = ""; else result = indi.givenName.substring(idx); break; } case MIDDLE_INITIAL: { int idx = indi.givenName.trim().indexOf(' '); if (idx < 0) result = ""; else result = indi.givenName.substring(idx,idx+1); break; } case SURNAME: result = indi.surname; break; case SURNAME_INITIAL: if(indi.surname.compareTo("")==0) return ""; result = indi.surname.substring(0,1); result += ". "; break; case SURNAME_DISENVOWELLED: String surname = indi.surname; if(surname==null || surname.compareTo("")==0){ result = ""; break; } String novowels=surname.charAt(0)+""; String vowels="aeiouAEIOU"; for(int i=1; i<surname.length() ; i++){ char c = surname.charAt(i); if(vowels.indexOf(c)==-1) novowels+=c; } result = novowels; break; case NAME_SUFFIX: result = indi.nameSuffix; break; case FIXED_STRING: return str; case COLLAPSABLE_SPACE: result = " "; break; case ABBREVIATED_BIRTH_DATE: if (indi.birth != null && indi.birth.date != null) result = indi.birth.date; else result = ""; break; case ABBREVIATED_DEATH_DATE: if (indi.death != null && indi.death.date != null) result = indi.death.date; else result = ""; break; case BIRTH_DATE_YEAR: if (indi.birth != null && indi.birth.date != null) result = indi.birth.yearString; else result = ""; break; case DEATH_DATE_YEAR: if (indi.death != null && indi.death.date != null) result = indi.death.yearString; else result = ""; break; case BIRTH_DATE_TEXT: if (indi.birth != null && indi.birth.date != null) result = indi.birth.date; else result = ""; break; case DEATH_DATE_TEXT: if (indi.death != null && indi.death.date != null) result = indi.death.date; else result = ""; break; case MARRIAGE_DATE_YEAR: if(indi.gender != Gender.MALE || indi.fams.size() == 0 || indi.fams.get(0).marriage == null){ result = ""; break; } result = indi.fams.get(0).marriage.yearString; break; case MARRIAGE_DATE_TEXT: if(indi.gender != Gender.MALE || indi.fams.size() == 0 || indi.fams.get(0).marriage == null){ result = ""; break; } result = indi.fams.get(0).marriage.date; break; case ABBREVIATED_MARRIAGE_PLACE: if(indi.gender != Gender.MALE || indi.fams.size() == 0 || indi.fams.get(0).marriage == null){ result = ""; break; } String mplace = indi.fams.get(0).marriage.place; result = PlaceAbbreviator.placeFit(mplace, (float)width, font); break; case ABBREVIATED_BIRTH_PLACE: //lets assume the width we are given is the rest of the line available. if(indi.birth == null || indi.birth.place == null || indi.birth.place.compareTo("")==0){ result = ""; break; } String place = indi.birth.place; result = PlaceAbbreviator.placeFit(place, (float)width, font); break; case ABBREVIATED_DEATH_PLACE: if(indi.death == null || indi.death.place == null || indi.death.place.compareTo("")==0){ result = ""; break; } String dplace = indi.death.place; result = PlaceAbbreviator.placeFit(dplace, (float)width, font); break; case DUPLICATE_LABEL: result = duplicate; break; default: result = "NOT IMPLEMENTED "+ type; System.out.println(result); } return result==null? "" : result.trim(); } }