/* * 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.toolkit.annotation.Localize; import com.trollworks.toolkit.ui.border.EmptyBorder; import com.trollworks.toolkit.ui.layout.ColumnLayout; import com.trollworks.toolkit.utility.Localization; import com.trollworks.toolkit.utility.text.Numbers; import com.trollworks.toolkit.utility.text.Text; import com.trollworks.toolkit.utility.undo.MultipleUndo; import com.trollworks.toolkit.utility.units.LengthValue; import com.trollworks.toolkit.utility.units.WeightValue; import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JPanel; import javax.swing.JTextField; /** A character description randomizer. */ public class DescriptionRandomizer extends JPanel implements ActionListener { @Localize("Randomize") @Localize(locale = "de", value = "Zufallswerte erzeugen") @Localize(locale = "ru", value = "Сгенерировать") @Localize(locale = "es", value = "Al azar") private static String RANDOMIZE; @Localize("Description Randomization") @Localize(locale = "de", value = "Zufällige Beschreibungen") @Localize(locale = "ru", value = "Создать описание") @Localize(locale = "es", value = "Descripción al azar") private static String UNDO_RANDOMIZE; static { Localization.initialize(); } private static final int GENDER_INDEX = 0; private static final int AGE_INDEX = 1; private static final int BIRTHDAY_INDEX = 2; private static final int HEIGHT_INDEX = 3; private static final int WEIGHT_INDEX = 4; private static final int HAIR_INDEX = 5; private static final int EYES_INDEX = 6; private static final int SKIN_INDEX = 7; private static final int HAND_INDEX = 8; private static final int COUNT = 9; private GURPSCharacter mCharacter; private JCheckBox[] mCheckBoxes; private JTextField[] mFields; private JButton mRandomize; /** * Creates a new {@link DescriptionRandomizer}. * * @param character The {@link GURPSCharacter} to randomize the description of. */ public DescriptionRandomizer(GURPSCharacter character) { super(new BorderLayout()); mCharacter = character; mCheckBoxes = new JCheckBox[COUNT]; mFields = new JTextField[COUNT]; JPanel wrapper = new JPanel(new ColumnLayout(2)); wrapper.setBorder(new EmptyBorder(10)); Profile description = mCharacter.getDescription(); addField(wrapper, DescriptionPanel.GENDER, null, GENDER_INDEX, description.getGender()); addField(wrapper, DescriptionPanel.AGE, null, AGE_INDEX, Numbers.format(description.getAge())); addField(wrapper, DescriptionPanel.BIRTHDAY, null, BIRTHDAY_INDEX, description.getBirthday()); addField(wrapper, DescriptionPanel.HEIGHT_FIELD, null, HEIGHT_INDEX, description.getHeight().toString()); addField(wrapper, DescriptionPanel.WEIGHT, null, WEIGHT_INDEX, description.getWeight().toString()); addField(wrapper, DescriptionPanel.HAIR, DescriptionPanel.HAIR_TOOLTIP, HAIR_INDEX, description.getHair()); addField(wrapper, DescriptionPanel.EYE_COLOR, DescriptionPanel.EYE_COLOR_TOOLTIP, EYES_INDEX, description.getEyeColor()); addField(wrapper, DescriptionPanel.SKIN_COLOR, DescriptionPanel.SKIN_COLOR_TOOLTIP, SKIN_INDEX, description.getSkinColor()); addField(wrapper, DescriptionPanel.HANDEDNESS, DescriptionPanel.HANDEDNESS_TOOLTIP, HAND_INDEX, description.getHandedness()); add(wrapper, BorderLayout.CENTER); mRandomize = new JButton(RANDOMIZE); mRandomize.addActionListener(this); add(mRandomize, BorderLayout.SOUTH); } private void addField(Container wrapper, String title, String tooltip, int which, String value) { mCheckBoxes[which] = new JCheckBox(title, true); String wrappedTooltip = Text.wrapPlainTextForToolTip(tooltip); mCheckBoxes[which].setToolTipText(wrappedTooltip); wrapper.add(mCheckBoxes[which]); mFields[which] = new JTextField(value, 20); mFields[which].setToolTipText(wrappedTooltip); mFields[which].setEnabled(false); wrapper.add(mFields[which]); } @Override public void actionPerformed(ActionEvent event) { Profile description = mCharacter.getDescription(); if (mCheckBoxes[GENDER_INDEX].isSelected()) { mFields[GENDER_INDEX].setText(Profile.getRandomGender()); } if (mCheckBoxes[AGE_INDEX].isSelected()) { mFields[AGE_INDEX].setText(Numbers.format(description.getRandomAge())); } if (mCheckBoxes[BIRTHDAY_INDEX].isSelected()) { mFields[BIRTHDAY_INDEX].setText(Profile.getRandomMonthAndDay()); } if (mCheckBoxes[HEIGHT_INDEX].isSelected()) { mFields[HEIGHT_INDEX].setText(Profile.getRandomHeight(mCharacter.getStrength(), description.getSizeModifier()).toString()); } if (mCheckBoxes[WEIGHT_INDEX].isSelected()) { mFields[WEIGHT_INDEX].setText(Profile.getRandomWeight(mCharacter.getStrength(), description.getSizeModifier(), description.getWeightMultiplier()).toString()); } if (mCheckBoxes[HAIR_INDEX].isSelected()) { mFields[HAIR_INDEX].setText(Profile.getRandomHair()); } if (mCheckBoxes[EYES_INDEX].isSelected()) { mFields[EYES_INDEX].setText(Profile.getRandomEyeColor()); } if (mCheckBoxes[SKIN_INDEX].isSelected()) { mFields[SKIN_INDEX].setText(Profile.getRandomSkinColor()); } if (mCheckBoxes[HAND_INDEX].isSelected()) { mFields[HAND_INDEX].setText(Profile.getRandomHandedness()); } } /** Apply the changes. */ public void applyChanges() { MultipleUndo edit = new MultipleUndo(UNDO_RANDOMIZE); Profile description = mCharacter.getDescription(); mCharacter.addEdit(edit); mCharacter.startNotify(); description.setGender(mFields[GENDER_INDEX].getText()); description.setAge(Numbers.extractInteger(mFields[AGE_INDEX].getText(), 18, true)); description.setBirthday(mFields[BIRTHDAY_INDEX].getText()); description.setHeight(LengthValue.extract(mFields[HEIGHT_INDEX].getText(), true)); description.setWeight(WeightValue.extract(mFields[WEIGHT_INDEX].getText(), true)); description.setHair(mFields[HAIR_INDEX].getText()); description.setEyeColor(mFields[EYES_INDEX].getText()); description.setSkinColor(mFields[SKIN_INDEX].getText()); description.setHandedness(mFields[HAND_INDEX].getText()); mCharacter.endNotify(); edit.end(); } }