/* * CampaignHistoryToken.java * Copyright 2013 (C) James Dempsey <jdempsey@users.sourceforge.net> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Created on 03/11/2013 * * $Id$ */ package plugin.exporttokens; import java.text.NumberFormat; import java.util.Collection; import java.util.StringTokenizer; import org.apache.commons.lang3.StringUtils; import pcgen.core.ChronicleEntry; import pcgen.core.PlayerCharacter; import pcgen.core.display.CharacterDisplay; import pcgen.io.ExportHandler; import pcgen.io.exporttoken.Token; import pcgen.util.Logging; /** * CampaignHistoryToken allows the character's campaign history entries to * be output. * * <pre> * CAMPAIGNHISTORY.v.x * CAMPAIGNHISTORY.v.x.CAMPAIGN * CAMPAIGNHISTORY.v.x.ADVENTURE * CAMPAIGNHISTORY.v.x.PARTY * CAMPAIGNHISTORY.v.x.DATE * CAMPAIGNHISTORY.v.x.XP * CAMPAIGNHISTORY.v.x.GM * CAMPAIGNHISTORY.v.x.TEXT * </pre> * * @author James Dempsey <jdempsey@users.sourceforge.net> */ public class CampaignHistoryToken extends Token { /** Token name */ public static final String TOKENNAME = "CAMPAIGNHISTORY"; private static enum Visibility {ALL, HIDDEN, VISIBLE}; @Override public String getTokenName() { return TOKENNAME; } @Override public String getToken(String tokenSource, PlayerCharacter pc, ExportHandler eh) { StringTokenizer aTok = new StringTokenizer(tokenSource, "."); aTok.nextToken(); Visibility visibility = Visibility.VISIBLE; String entryIndex = aTok.nextToken(); if (!StringUtils.isNumeric(entryIndex)) { if (entryIndex.equals("ALL")) { visibility = Visibility.ALL; } else if (entryIndex.equals("HIDDEN")) { visibility = Visibility.HIDDEN; } else if (!entryIndex.equals("VISIBLE")) { Logging.log(Logging.LST_ERROR, "Invalid visibility entry '" + entryIndex + "'. Should be one of ALL, VISIBLE or HIDDEN. Token was " + tokenSource); return ""; } entryIndex = aTok.nextToken(); } if (!StringUtils.isNumeric(entryIndex)) { Logging.log(Logging.LST_ERROR, "Invalid position entry '" + entryIndex + "', it should be a number. Token was " + tokenSource); return ""; } int index = Integer.parseInt(entryIndex); ChronicleEntry entry = getTargetChronicleEntry(index, visibility, pc.getDisplay()); if (entry == null) { return ""; } String token = (aTok.hasMoreTokens()) ? aTok.nextToken() : "TEXT"; String value = getChronicleValue(entry, token.toUpperCase()); if (value == null) { Logging.log(Logging.LST_ERROR, "Invalid property '" + token + "'. Token was " + tokenSource); return ""; } return value; } private ChronicleEntry getTargetChronicleEntry(int targetIndex, Visibility visibility, CharacterDisplay display) { Collection<ChronicleEntry> entries = display.getChronicleEntries(); int i = 0; for (ChronicleEntry chronicleEntry : entries) { if ((chronicleEntry.isOutputEntry() && visibility == Visibility.HIDDEN) || (!chronicleEntry.isOutputEntry() && visibility == Visibility.VISIBLE)) { continue; } if (i == targetIndex) { return chronicleEntry; } i++; } return null; } /** * @param entry * @param token * @return */ private String getChronicleValue(ChronicleEntry entry, String token) { if (token.equals("TEXT")) { return entry.getChronicle(); } if (token.equals("CAMPAIGN")) { return entry.getCampaign(); } if (token.equals("ADVENTURE")) { return entry.getAdventure(); } if (token.equals("PARTY")) { return entry.getParty(); } if (token.equals("DATE")) { return entry.getDate(); } if (token.equals("XP")) { NumberFormat fmt = NumberFormat.getNumberInstance(); return fmt.format(entry.getXpField()); } if (token.equals("GM")) { return entry.getGmField(); } // Anything else is an error return null; } }