/*
* 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.app.GCSFonts;
import com.trollworks.gcs.page.DropPanel;
import com.trollworks.gcs.preferences.SheetPreferences;
import com.trollworks.toolkit.annotation.Localize;
import com.trollworks.toolkit.ui.GraphicsUtilities;
import com.trollworks.toolkit.ui.RetinaIcon;
import com.trollworks.toolkit.ui.border.TitledBorder;
import com.trollworks.toolkit.ui.image.StdImage;
import com.trollworks.toolkit.ui.scale.Scale;
import com.trollworks.toolkit.ui.widget.WindowUtils;
import com.trollworks.toolkit.utility.Localization;
import com.trollworks.toolkit.utility.PathUtils;
import com.trollworks.toolkit.utility.notification.NotifierTarget;
import com.trollworks.toolkit.utility.text.Text;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.text.MessageFormat;
import javax.swing.UIManager;
/** The character portrait. */
public class PortraitPanel extends DropPanel implements NotifierTarget {
@Localize("Select A Portrait")
@Localize(locale = "de", value = "Wähle ein Charakterild")
@Localize(locale = "ru", value = "Выберите изображение")
@Localize(locale = "es", value = "Selecciona un retrato")
private static String SELECT_PORTRAIT;
@Localize("Portrait")
@Localize(locale = "de", value = "Charakterbild")
@Localize(locale = "ru", value = "Изображение")
@Localize(locale = "es", value = "Retrato")
private static String PORTRAIT;
@Localize("<html><body><b>Double-click</b> to set a character portrait.<br><br>The dimensions of the chosen picture should be in a ratio of<br><b>3 pixels wide for every 4 pixels tall</b> to scale without distortion.<br><br>Dimensions of <b>{0}x{1}</b> are ideal.</body></html>")
@Localize(locale = "de", value = "<html><body><b>Doppelklicken</b>, um ein Charakterbild anzugeben.<br><br>Das gewählte Bild sollte ein <b>Seitenverhältnis von 3:4</b><br> aufweisen, um unverzerrt dargestellt zu werden.<br><br>Eine Größe von <b>{0}x{1} Pixel</b> ist ideal.</body></html>")
@Localize(locale = "ru", value = "<html><body><b>Дважды щёлкните</b> чтобы изменить изображение персонажа.<br><br>Для масштабирования без искажений, размер картинки должен быть<br>в пропорции <b>3 пикселя в ширину на 4 пикселя в высоту</b>.<br><br>Размер <b>{0}x{1}</b> будет идеальным.</body></html>")
@Localize(locale = "es", value = "<html><body><b>Dobleclic</b> para establecer el retarto del personaje.<br><br>Las dimensiones de la imagen seleccionada deben mantener un ratio de<br><b>3 pixels de ancho por cada 4 pixels de alto</b> para mostrarse sin distorsión.<br><br> <b>{0}x{1}</b> es la dimensión ideal.</body></html>")
private static String PORTRAIT_TOOLTIP;
@Localize("Unable to load\n{0}.")
@Localize(locale = "de", value = "Kann Datei {0} nicht laden.")
@Localize(locale = "ru", value = "Невозможно загрузить\n{0}.")
@Localize(locale = "es", value = "No puede cargarse\n{0}.")
private static String BAD_IMAGE;
static {
Localization.initialize();
}
private CharacterSheet mSheet;
/**
* Creates a new character portrait.
*
* @param sheet The owning sheet.
*/
public PortraitPanel(CharacterSheet sheet) {
super(null, true);
setBorder(new TitledBorder(UIManager.getFont(GCSFonts.KEY_LABEL), PORTRAIT));
mSheet = sheet;
setToolTipText(Text.wrapPlainTextForToolTip(MessageFormat.format(PORTRAIT_TOOLTIP, new Integer(Profile.PORTRAIT_WIDTH * 2), new Integer(Profile.PORTRAIT_HEIGHT * 2))));
sheet.getCharacter().addTarget(this, Profile.ID_PORTRAIT);
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent event) {
if (event.getClickCount() == 2) {
choosePortrait();
}
}
});
}
/** Allows the user to choose a portrait for their character. */
public void choosePortrait() {
File file = SheetPreferences.choosePortrait();
if (file != null) {
try {
mSheet.getCharacter().getDescription().setPortrait(StdImage.loadImage(file));
} catch (Exception exception) {
WindowUtils.showError(this, MessageFormat.format(BAD_IMAGE, PathUtils.getFullPath(file)));
}
}
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D gc = GraphicsUtilities.prepare(g);
super.paintComponent(gc);
RetinaIcon portrait = mSheet.getCharacter().getDescription().getPortrait();
if (portrait != null) {
Insets insets = getInsets();
portrait.paintIcon(this, gc, insets.left, insets.top);
}
}
@Override
public void handleNotification(Object producer, String type, Object data) {
repaint();
}
@Override
public int getNotificationPriority() {
return 0;
}
@Override
public Dimension getMinimumSize() {
return getPreferredSize();
}
@Override
public Dimension getPreferredSize() {
Scale scale = Scale.get(this);
Insets insets = getInsets();
return new Dimension(insets.left + scale.scale(Profile.PORTRAIT_WIDTH) + insets.right, insets.top + scale.scale(Profile.PORTRAIT_HEIGHT) + insets.bottom);
}
@Override
public Dimension getMaximumSize() {
return getPreferredSize();
}
}