/*
* 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.character;
import com.trollworks.gcs.page.DropPanel;
import com.trollworks.gcs.page.PageHeader;
import com.trollworks.gcs.page.PageLabel;
import com.trollworks.toolkit.annotation.Localize;
import com.trollworks.toolkit.ui.layout.ColumnLayout;
import com.trollworks.toolkit.ui.widget.Wrapper;
import com.trollworks.toolkit.utility.Localization;
import com.trollworks.toolkit.utility.notification.NotifierTarget;
import com.trollworks.toolkit.utility.text.Numbers;
import java.awt.Color;
import java.awt.Container;
import java.text.MessageFormat;
import javax.swing.SwingConstants;
/** The character encumbrance panel. */
public class EncumbrancePanel extends DropPanel implements NotifierTarget {
@Localize("Encumbrance, Move & Dodge")
@Localize(locale = "de", value = "Belastung, Bewegung & Ausweichen")
@Localize(locale = "ru", value = "Нагрузка, движение и уклонение")
@Localize(locale = "es", value = "Carga, Movimiento y Esquiva")
private static String ENCUMBRANCE_MOVE_DODGE;
@Localize("Level")
@Localize(locale = "de", value = "Stufe")
@Localize(locale = "ru", value = "Уровень")
@Localize(locale = "es", value = "Nivel")
private static String ENCUMBRANCE_LEVEL;
@Localize("Max Load")
@Localize(locale = "de", value = "Max. Gew.")
@Localize(locale = "ru", value = "Мак.нагруз.")
@Localize(locale = "es", value = "Carga Máx.")
private static String MAX_CARRY;
@Localize("Move")
@Localize(locale = "de", value = "Bew.")
@Localize(locale = "ru", value = "Движ.")
@Localize(locale = "es", value = "Mov.")
private static String MOVE;
@Localize("Dodge")
@Localize(locale = "de", value = "Ausw.")
@Localize(locale = "ru", value = "Укл.")
@Localize(locale = "es", value = "Esqu.")
private static String DODGE;
@Localize("The encumbrance level")
@Localize(locale = "de", value = "Die Belastungsstufe")
@Localize(locale = "ru", value = "Уровень нагрузки")
@Localize(locale = "es", value = "Nivel de carga")
private static String ENCUMBRANCE_TOOLTIP;
@Localize("The maximum load a character can carry and still remain within a specific encumbrance level")
@Localize(locale = "de", value = "Das maximale Gewicht, das ein Charakter tragen und immer noch in einer bestimmten Belastungsstufe bleiben kann")
@Localize(locale = "ru", value = "Максимальная нагрузка, которую персонаж может нести, оставаясь в пределах указанного уровня нагрузки")
@Localize(locale = "es", value = "Carga máxima que un personaje puede soportar y mantenerse todavia en el nivel actual de carga")
private static String MAX_CARRY_TOOLTIP;
@Localize("The character's ground movement rate for a specific encumbrance level")
@Localize(locale = "de", value = "Die Bewegungswert eines Charakters am Boden für eine bestimmte Belastungsstufe")
@Localize(locale = "ru", value = "Единицы движения персонажа при указанном уровне нагрузки")
@Localize(locale = "es", value = "Ritmo de movimento de un personaje para un nivel especifico de carga")
private static String MOVE_TOOLTIP;
@Localize("The character's dodge for a specific encumbrance level")
@Localize(locale = "de", value = "Der Ausweichen-Wert eines Charakters für eine bestimmte Belastungsstufe")
@Localize(locale = "ru", value = "Уклонение персонажа для указанного уровня нагрузки")
@Localize(locale = "es", value = "Esquiva del personaje para un nivel especifico de carga")
private static String DODGE_TOOLTIP;
@Localize("{0} ({1})")
@Localize(locale = "de", value = "{0} ({1})")
static String ENCUMBRANCE_FORMAT;
@Localize("\u2022 {0} ({1})")
@Localize(locale = "de", value = "\u2022 {0} ({1})")
static String CURRENT_ENCUMBRANCE_FORMAT;
static {
Localization.initialize();
}
private static final Color CURRENT_ENCUMBRANCE_COLOR = new Color(252, 242, 196);
private static final Color CURRENT_ENCUMBRANCE_OVERLOADED_COLOR = new Color(255, 192, 192);
private CharacterSheet mSheet;
private PageLabel[] mMarkers;
/**
* Creates a new encumbrance panel.
*
* @param sheet The sheet to display the data for.
*/
public EncumbrancePanel(CharacterSheet sheet) {
super(new ColumnLayout(7, 2, 0), ENCUMBRANCE_MOVE_DODGE, true);
mSheet = sheet;
Encumbrance[] encumbranceValues = Encumbrance.values();
mMarkers = new PageLabel[encumbranceValues.length];
PageHeader header = createHeader(this, ENCUMBRANCE_LEVEL, ENCUMBRANCE_TOOLTIP);
addHorizontalBackground(header, Color.black);
addVerticalBackground(createDivider(), Color.black);
createHeader(this, MAX_CARRY, MAX_CARRY_TOOLTIP);
addVerticalBackground(createDivider(), Color.black);
createHeader(this, MOVE, MOVE_TOOLTIP);
addVerticalBackground(createDivider(), Color.black);
createHeader(this, DODGE, DODGE_TOOLTIP);
GURPSCharacter character = mSheet.getCharacter();
Encumbrance current = character.getEncumbranceLevel();
for (Encumbrance encumbrance : encumbranceValues) {
int index = encumbrance.ordinal();
mMarkers[index] = new PageLabel(getMarkerText(encumbrance, current), header);
add(mMarkers[index]);
if (current == encumbrance) {
addHorizontalBackground(mMarkers[index], character.isCarryingGreaterThanMaxLoad() ? CURRENT_ENCUMBRANCE_OVERLOADED_COLOR : CURRENT_ENCUMBRANCE_COLOR);
}
createDivider();
createDisabledField(this, mSheet, GURPSCharacter.MAXIMUM_CARRY_PREFIX + index, MAX_CARRY_TOOLTIP, SwingConstants.RIGHT);
createDivider();
createDisabledField(this, mSheet, GURPSCharacter.MOVE_PREFIX + index, MOVE_TOOLTIP, SwingConstants.RIGHT);
createDivider();
createDisabledField(this, mSheet, GURPSCharacter.DODGE_PREFIX + index, DODGE_TOOLTIP, SwingConstants.RIGHT);
}
character.addTarget(this, GURPSCharacter.ID_CARRIED_WEIGHT, GURPSCharacter.ID_BASIC_LIFT);
}
private static String getMarkerText(Encumbrance which, Encumbrance current) {
return MessageFormat.format(which == current ? CURRENT_ENCUMBRANCE_FORMAT : ENCUMBRANCE_FORMAT, which, Numbers.format(-which.getEncumbrancePenalty()));
}
private Container createDivider() {
Wrapper panel = new Wrapper();
panel.setOnlySize(1, 1);
add(panel);
return panel;
}
@Override
public void handleNotification(Object producer, String type, Object data) {
GURPSCharacter character = mSheet.getCharacter();
Encumbrance current = character.getEncumbranceLevel();
for (Encumbrance encumbrance : Encumbrance.values()) {
int index = encumbrance.ordinal();
if (encumbrance == current) {
addHorizontalBackground(mMarkers[index], character.isCarryingGreaterThanMaxLoad() ? CURRENT_ENCUMBRANCE_OVERLOADED_COLOR : CURRENT_ENCUMBRANCE_COLOR);
} else {
removeHorizontalBackground(mMarkers[index]);
}
mMarkers[index].setText(getMarkerText(encumbrance, current));
}
revalidate();
repaint();
}
@Override
public int getNotificationPriority() {
return 0;
}
}