/* * Copyright (c) 1998-2017 by Richard A. Wilkes. All rights reserved. * * This Source Code Form is subject to the terms of the Mozilla Public * License, version 2.0. If a copy of the MPL was not distributed with * this file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This Source Code Form is "Incompatible With Secondary Licenses", as * defined by the Mozilla Public License, version 2.0. */ package com.trollworks.gcs.skill; import com.trollworks.gcs.character.GURPSCharacter; import com.trollworks.gcs.common.DataFile; import com.trollworks.gcs.common.ListFile; import com.trollworks.gcs.library.LibraryFile; import com.trollworks.gcs.template.Template; import com.trollworks.gcs.widgets.outline.ListHeaderCell; import com.trollworks.gcs.widgets.outline.ListTextCell; import com.trollworks.gcs.widgets.outline.MultiCell; import com.trollworks.toolkit.annotation.Localize; import com.trollworks.toolkit.ui.widget.outline.Cell; import com.trollworks.toolkit.ui.widget.outline.Column; import com.trollworks.toolkit.ui.widget.outline.Outline; import com.trollworks.toolkit.ui.widget.outline.OutlineModel; import com.trollworks.toolkit.utility.Localization; import com.trollworks.toolkit.utility.text.Numbers; import javax.swing.SwingConstants; /** Definitions for skill columns. */ public enum SkillColumn { /** The skill name/description. */ DESCRIPTION { @Override public String toString() { return DESCRIPTION_TITLE; } @Override public String getToolTip() { return DESCRIPTION_TOOLTIP; } @Override public Cell getCell() { return new MultiCell(); } @Override public boolean shouldDisplay(DataFile dataFile) { return true; } @Override public Object getData(Skill skill) { return getDataAsText(skill); } @Override public String getDataAsText(Skill skill) { StringBuilder builder = new StringBuilder(); String notes = skill.getNotes(); builder.append(skill.toString()); if (notes.length() > 0) { builder.append(" - "); //$NON-NLS-1$ builder.append(notes); } return builder.toString(); } }, /** The skill difficulty. */ DIFFICULTY { @Override public String toString() { return DIFFICULTY_TITLE; } @Override public String getToolTip() { return DIFFICULTY_TOOLTIP; } @Override public Cell getCell() { return new ListTextCell(SwingConstants.RIGHT, false); } @Override public boolean shouldDisplay(DataFile dataFile) { return dataFile instanceof ListFile || dataFile instanceof LibraryFile; } @Override public Object getData(Skill skill) { return new Integer(skill.canHaveChildren() ? -1 : skill.getDifficulty().ordinal() + (skill.getAttribute().ordinal() << 8)); } @Override public String getDataAsText(Skill skill) { return skill.getDifficultyAsText(); } }, /** The skill level. */ LEVEL { @Override public String toString() { return LEVEL_TITLE; } @Override public String getToolTip() { return LEVEL_TOOLTIP; } @Override public Cell getCell() { return new ListTextCell(SwingConstants.RIGHT, false); } @Override public boolean shouldDisplay(DataFile dataFile) { return dataFile instanceof GURPSCharacter; } @Override public Object getData(Skill skill) { return new Integer(skill.canHaveChildren() ? -1 : skill.getLevel()); } @Override public String getDataAsText(Skill skill) { int level; if (skill.canHaveChildren()) { return ""; //$NON-NLS-1$ } level = skill.getLevel(); if (level < 0) { return "-"; //$NON-NLS-1$ } return Numbers.format(level); } }, /** The relative skill level. */ RELATIVE_LEVEL { @Override public String toString() { return RELATIVE_LEVEL_TITLE; } @Override public String getToolTip() { return RELATIVE_LEVEL_TOOLTIP; } @Override public Cell getCell() { return new ListTextCell(SwingConstants.RIGHT, false); } @Override public boolean shouldDisplay(DataFile dataFile) { return dataFile instanceof Template || dataFile instanceof GURPSCharacter; } @Override public Object getData(Skill skill) { return new Integer(getRelativeLevel(skill)); } private int getRelativeLevel(Skill skill) { if (!skill.canHaveChildren()) { if (skill.getCharacter() != null) { if (skill.getLevel() < 0) { return Integer.MIN_VALUE; } int level = skill.getRelativeLevel(); if (skill instanceof Technique) { level += ((Technique) skill).getDefault().getModifier(); } return level; } else if (skill.getTemplate() != null) { int points = skill.getPoints(); if (points > 0) { SkillDifficulty difficulty = skill.getDifficulty(); int level; if (skill instanceof Technique) { if (difficulty != SkillDifficulty.A) { points--; } return points + ((Technique) skill).getDefault().getModifier(); } level = difficulty.getBaseRelativeLevel(); if (difficulty == SkillDifficulty.W) { points /= 3; } if (points > 1) { if (points < 4) { level++; } else { level += 1 + points / 4; } } return level; } } } return Integer.MIN_VALUE; } @Override public String getDataAsText(Skill skill) { if (!skill.canHaveChildren()) { int level = getRelativeLevel(skill); StringBuilder builder; if (level == Integer.MIN_VALUE) { return "-"; //$NON-NLS-1$ } builder = new StringBuilder(); if (!(skill instanceof Technique)) { builder.append(skill.getAttribute()); } builder.append(Numbers.formatWithForcedSign(level)); return builder.toString(); } return ""; //$NON-NLS-1$ } }, /** The points spent in the skill. */ POINTS { @Override public String toString() { return POINTS_TITLE; } @Override public String getToolTip() { return POINTS_TOOLTIP; } @Override public Cell getCell() { return new SkillPointsTextCell(); } @Override public boolean shouldDisplay(DataFile dataFile) { return dataFile instanceof Template || dataFile instanceof GURPSCharacter; } @Override public Object getData(Skill skill) { return Integer.valueOf(skill.getPoints()); } @Override public String getDataAsText(Skill skill) { return Numbers.format(skill.getPoints()); } }, /** The category. */ CATEGORY { @Override public String toString() { return CATEGORY_TITLE; } @Override public String getToolTip() { return CATEGORY_TOOLTIP; } @Override public Cell getCell() { return new ListTextCell(SwingConstants.LEFT, true); } @Override public boolean shouldDisplay(DataFile dataFile) { return dataFile instanceof ListFile || dataFile instanceof LibraryFile; } @Override public Object getData(Skill skill) { return getDataAsText(skill); } @Override public String getDataAsText(Skill skill) { return skill.getCategoriesAsString(); } }, /** The page reference. */ REFERENCE { @Override public String toString() { return REFERENCE_TITLE; } @Override public String getToolTip() { return REFERENCE_TOOLTIP; } @Override public Cell getCell() { return new ListTextCell(SwingConstants.RIGHT, false); } @Override public boolean shouldDisplay(DataFile dataFile) { return true; } @Override public Object getData(Skill skill) { return getDataAsText(skill); } @Override public String getDataAsText(Skill skill) { return skill.getReference(); } }; @Localize("Skills") @Localize(locale = "de", value = "Fertigkeiten") @Localize(locale = "ru", value = "Умения") @Localize(locale = "es", value = "Habilidades") static String DESCRIPTION_TITLE; @Localize("The name, specialty, tech level and notes describing a skill") @Localize(locale = "de", value = "Der Name, Spezialisierung, Techlevel und Anmerkungen, die die Fertigkeit beschreiben") @Localize(locale = "ru", value = "Название, специализация, ТУ и заметки умения") @Localize(locale = "es", value = "Nombre, especialización, nivel tecnológico y notas que describen una habilidad") static String DESCRIPTION_TOOLTIP; @Localize("SL") @Localize(locale = "de", value = "FW") @Localize(locale = "ru", value = "УУ") @Localize(locale = "es", value = "NH") static String LEVEL_TITLE; @Localize("The skill level") @Localize(locale = "de", value = "Der Fertigkeitswert") @Localize(locale = "ru", value = "Уровень умения") @Localize(locale = "es", value = "Nivel de habilidad") static String LEVEL_TOOLTIP; @Localize("RSL") @Localize(locale = "de", value = "RFW") @Localize(locale = "ru", value = "ОУУ") @Localize(locale = "es", value = "NHR") static String RELATIVE_LEVEL_TITLE; @Localize("The relative skill level") @Localize(locale = "de", value = "Der relative Fertigkeitswert") @Localize(locale = "ru", value = "Относительный уровень умения") @Localize(locale = "es", value = "Nivel de habilidad relativo") static String RELATIVE_LEVEL_TOOLTIP; @Localize("Pts") @Localize(locale = "de", value = "Pkt") @Localize(locale = "ru", value = "Очк") @Localize(locale = "es", value = "Ptos") static String POINTS_TITLE; @Localize("The points spent in the skill") @Localize(locale = "de", value = "Die für die Fertigkeit aufgewendeten Punkte") @Localize(locale = "ru", value = "Потраченые очки на умение") @Localize(locale = "es", value = "Puntos gastados en la habilidad") static String POINTS_TOOLTIP; @Localize("Diff") @Localize(locale = "de", value = "Schwierigkeit") @Localize(locale = "ru", value = "Сложн.") @Localize(locale = "es", value = "Dificultad") static String DIFFICULTY_TITLE; @Localize("The skill difficulty") @Localize(locale = "de", value = "Die Schwierigkeitsstufe der Fertigkeit") @Localize(locale = "ru", value = "Сложность умения") @Localize(locale = "es", value = "Dificultad de la habilidad") static String DIFFICULTY_TOOLTIP; @Localize("Category") @Localize(locale = "de", value = "Kategorie") @Localize(locale = "ru", value = "Категория") @Localize(locale = "es", value = "Categoría") static String CATEGORY_TITLE; @Localize("The category or categories the skill belongs to") @Localize(locale = "de", value = "Die Kategorie oder Kategorien, denen diese Fertigkeit angehört") @Localize(locale = "ru", value = "Категория или категории, к которым относится умение") @Localize(locale = "es", value = "Categoría o categorías a las que pertenece la habilidad") static String CATEGORY_TOOLTIP; @Localize("Ref") @Localize(locale = "de", value = "Ref") @Localize(locale = "ru", value = "Ссыл") static String REFERENCE_TITLE; @Localize("A reference to the book and page this skill appears on (e.g. B22 would refer to \"Basic Set\", page 22)") @Localize(locale = "de", value = "Eine Referenz auf das Buch und die Seite, auf der dieser Zauber beschrieben wird (z.B. B22 würde auf \"Basic Set\" Seite 22 verweisen)") @Localize(locale = "ru", value = "Ссылка на страницу и книгу, описывающая умение (например B22 - книга \"Базовые правила\", страница 22)") @Localize(locale = "es", value = "Referencia al libro y página en donde se menciona la habilidad (p.e. B22 se refiere al \"Manual Básico\", página 22)") static String REFERENCE_TOOLTIP; static { Localization.initialize(); } /** * @param skill The {@link Skill} to get the data from. * @return An object representing the data for this column. */ public abstract Object getData(Skill skill); /** * @param skill The {@link Skill} to get the data from. * @return Text representing the data for this column. */ public abstract String getDataAsText(Skill skill); /** @return The tooltip for the column. */ public abstract String getToolTip(); /** @return The {@link Cell} used to display the data. */ public abstract Cell getCell(); /** * @param dataFile The {@link DataFile} to use. * @return Whether this column should be displayed for the specified data file. */ public abstract boolean shouldDisplay(DataFile dataFile); /** * Adds all relevant {@link Column}s to a {@link Outline}. * * @param outline The {@link Outline} to use. * @param dataFile The {@link DataFile} that data is being displayed for. */ public static void addColumns(Outline outline, DataFile dataFile) { boolean sheetOrTemplate = dataFile instanceof GURPSCharacter || dataFile instanceof Template; OutlineModel model = outline.getModel(); for (SkillColumn one : values()) { if (one.shouldDisplay(dataFile)) { Column column = new Column(one.ordinal(), one.toString(), one.getToolTip(), one.getCell()); column.setHeaderCell(new ListHeaderCell(sheetOrTemplate)); model.addColumn(column); } } } }