/*
* 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.common.EditorPanel;
import com.trollworks.toolkit.annotation.Localize;
import com.trollworks.toolkit.ui.UIUtilities;
import com.trollworks.toolkit.ui.image.StdImage;
import com.trollworks.toolkit.ui.layout.Alignment;
import com.trollworks.toolkit.ui.layout.FlexGrid;
import com.trollworks.toolkit.ui.layout.FlexRow;
import com.trollworks.toolkit.ui.layout.FlexSpacer;
import com.trollworks.toolkit.ui.widget.Commitable;
import com.trollworks.toolkit.ui.widget.EditorField;
import com.trollworks.toolkit.ui.widget.IconButton;
import com.trollworks.toolkit.utility.Localization;
import com.trollworks.toolkit.utility.text.IntegerFormatter;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.SwingConstants;
import javax.swing.text.DefaultFormatter;
import javax.swing.text.DefaultFormatterFactory;
/** A skill default editor panel. */
public class SkillDefaultEditor extends EditorPanel {
@Localize("Add a default")
@Localize(locale = "de", value = "Grundwert hinzufügen")
@Localize(locale = "ru", value = "Добавить новую строку")
@Localize(locale = "es", value = "Añadir valor por defecto")
private static String ADD_DEFAULT;
@Localize("Remove this default")
@Localize(locale = "de", value = "Diesen Grundwert entfernen")
@Localize(locale = "ru", value = "Удалить это строку")
@Localize(locale = "es", value = "Quitar valor por defecto")
private static String REMOVE_DEFAULT;
@Localize("Optional Specialization")
@Localize(locale = "de", value = "Optionale Spezialisierung")
@Localize(locale = "ru", value = "Необязательная специализация")
@Localize(locale = "es", value = "Especialización opcional")
private static String SPECIALIZATION_TOOLTIP;
static {
Localization.initialize();
}
private static SkillDefaultType LAST_ITEM_TYPE = SkillDefaultType.DX;
private SkillDefault mDefault;
private JComboBox<?> mTypeCombo;
private EditorField mSkillNameField;
private EditorField mSpecializationField;
private EditorField mModifierField;
/** @param type The last item type created or switched to. */
public static void setLastItemType(SkillDefaultType type) {
LAST_ITEM_TYPE = type;
}
/** Creates a new placeholder {@link SkillDefaultEditor}. */
public SkillDefaultEditor() {
this(null);
}
/**
* Creates a new skill default editor panel.
*
* @param skillDefault The skill default to edit.
*/
public SkillDefaultEditor(SkillDefault skillDefault) {
super();
mDefault = skillDefault;
rebuild();
}
/** Rebuilds the contents of this panel with the current feature settings. */
protected void rebuild() {
removeAll();
if (mDefault != null) {
FlexGrid grid = new FlexGrid();
OrLabel or = new OrLabel(this);
add(or);
grid.add(or, 0, 0);
FlexRow row = new FlexRow();
SkillDefaultType current = mDefault.getType();
mTypeCombo = new JComboBox<Object>(SkillDefaultType.values());
mTypeCombo.setOpaque(false);
mTypeCombo.setSelectedItem(current);
mTypeCombo.setActionCommand(SkillDefault.TAG_TYPE);
mTypeCombo.addActionListener(this);
UIUtilities.setOnlySize(mTypeCombo, mTypeCombo.getPreferredSize());
add(mTypeCombo);
row.add(mTypeCombo);
grid.add(row, 0, 1);
mModifierField = new EditorField(new DefaultFormatterFactory(new IntegerFormatter(-99, 99, true)), this, SwingConstants.LEFT, new Integer(mDefault.getModifier()), new Integer(99), null);
UIUtilities.setOnlySize(mModifierField, mModifierField.getPreferredSize());
add(mModifierField);
if (current.isSkillBased()) {
row.add(new FlexSpacer(0, 0, true, false));
row = new FlexRow();
row.setInsets(new Insets(0, 20, 0, 0));
DefaultFormatter formatter = new DefaultFormatter();
formatter.setOverwriteMode(false);
mSkillNameField = new EditorField(new DefaultFormatterFactory(formatter), this, SwingConstants.LEFT, mDefault.getName(), null);
add(mSkillNameField);
row.add(mSkillNameField);
mSpecializationField = new EditorField(new DefaultFormatterFactory(formatter), this, SwingConstants.LEFT, mDefault.getSpecialization(), SPECIALIZATION_TOOLTIP);
mSpecializationField.setHint(SPECIALIZATION_TOOLTIP);
add(mSpecializationField);
row.add(mSpecializationField);
row.add(mModifierField);
grid.add(row, 1, 1);
} else {
row.add(mModifierField);
row.add(new FlexSpacer(0, 0, true, false));
}
row = new FlexRow();
row.setHorizontalAlignment(Alignment.RIGHT_BOTTOM);
IconButton button = new IconButton(StdImage.REMOVE, REMOVE_DEFAULT, () -> removeDefault());
add(button);
row.add(button);
button = new IconButton(StdImage.ADD, ADD_DEFAULT, () -> addDefault());
add(button);
row.add(button);
grid.add(row, 0, 2);
grid.apply(this);
} else {
FlexRow row = new FlexRow();
row.setHorizontalAlignment(Alignment.RIGHT_BOTTOM);
row.add(new FlexSpacer(0, 0, true, false));
IconButton button = new IconButton(StdImage.ADD, ADD_DEFAULT, () -> addDefault());
add(button);
row.add(button);
row.apply(this);
}
revalidate();
repaint();
}
/** @return The underlying skill default. */
public SkillDefault getSkillDefault() {
return mDefault;
}
private void addDefault() {
SkillDefault skillDefault = new SkillDefault(LAST_ITEM_TYPE, LAST_ITEM_TYPE.isSkillBased() ? "" : null, null, 0); //$NON-NLS-1$
JComponent parent = (JComponent) getParent();
parent.add(new SkillDefaultEditor(skillDefault));
if (mDefault == null) {
parent.remove(this);
}
parent.revalidate();
parent.repaint();
notifyActionListeners();
}
private void removeDefault() {
JComponent parent = (JComponent) getParent();
parent.remove(this);
if (parent.getComponentCount() == 0) {
parent.add(new SkillDefaultEditor());
}
parent.revalidate();
parent.repaint();
notifyActionListeners();
}
@Override
public void propertyChange(PropertyChangeEvent event) {
Object src = event.getSource();
if (src == mSkillNameField) {
mDefault.setName((String) mSkillNameField.getValue());
notifyActionListeners();
} else if (src == mSpecializationField) {
mDefault.setSpecialization((String) mSpecializationField.getValue());
notifyActionListeners();
} else if (src == mModifierField) {
mDefault.setModifier(((Integer) mModifierField.getValue()).intValue());
notifyActionListeners();
} else {
super.propertyChange(event);
}
}
@Override
public void actionPerformed(ActionEvent event) {
Object src = event.getSource();
String command = event.getActionCommand();
if (SkillDefault.TAG_TYPE.equals(command)) {
SkillDefaultType current = mDefault.getType();
SkillDefaultType value = (SkillDefaultType) ((JComboBox<?>) src).getSelectedItem();
if (!current.equals(value)) {
Commitable.sendCommitToFocusOwner();
mDefault.setType(value);
rebuild();
notifyActionListeners();
}
setLastItemType(value);
} else {
super.actionPerformed(event);
}
}
}