/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package feuille.karaoke.lib;
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
/**
* <p>This class is an ASS style preview panel.<br />
* Cette classe est un panel de prévisualisation de style ASS.</p>
* @author The Wingate 2940
*/
public class AssStylePreview extends javax.swing.JPanel {
private String strToRender = "Java !?";
private AssStyle as = new AssStyle();
private Shape foreShape = null;
private Shape backShape = null;
// private Font font = new Font(Font.SERIF, Font.PLAIN, 20);
// private Color TextColor = Color.yellow;
private float TextAlpha = 0f;
// private Color OutlineColor = Color.black;
private float OutlineAlpha = 0f;
// private Color ShadowColor = Color.black;
private float ShadowAlpha = 0f;
/** <p>Create a new panel with a default text.<br />
* Crée un nouveau panel avec un texte par défaut.</p> */
public AssStylePreview(){
setOpaque(true);
updateText();
}
/** <p>Create a new panel with a defined text.<br />
* Crée un nouveau panel avec un texte défini.</p> */
public AssStylePreview(String strToRender){
setOpaque(true);
this.strToRender = strToRender;
updateText();
}
/** <p>Set the text to render.<br />
* Définit le texte pour le rendu.</p> */
public void setString(String strToRender){
this.strToRender = strToRender;
updateText();
repaint();
}
/** <p>Set the ASS style and refresh the panel.<br />
* Définit le style ASS et rafraichit le panel.</p> */
public void setAssStyle(AssStyle as){
this.as = as;
updateText();
repaint();
}
/** <p>Paint on the panel.<br />Peint le panel.</p> */
@Override
public void paint(Graphics g){
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.white);
g2.fillRect(0, 0, getWidth(), getHeight());
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
Composite originalComposite = g2.getComposite();//Get default tranparency
//Back (Shadow)
// g2.setComposite(makeComposite(ShadowAlpha));//Change the transparency
g2.setColor(as.getBackCColor());
g2.fill(backShape);
//Border (Outline)
// g2.setComposite(makeComposite(OutlineAlpha));//Change the transparency
Stroke stroke = g2.getStroke();
g2.setStroke(new BasicStroke(4.0f));
g2.setColor(as.getOutlineCColor());
g2.draw(foreShape);
g2.setStroke(stroke);
//Text
// g2.setComposite(makeComposite(TextAlpha));//Change the transparency
g2.setColor(as.getTextCColor());
g2.fill(foreShape);
g2.setComposite(originalComposite);//Reset default
}
/** <p>Update the text with the good font.<br />
* Met à jour le texte avec la bonne police.</p> */
private void updateText(){
TextLayout tl = new TextLayout(
strToRender,
as.getFont().deriveFont(50f),
new FontRenderContext(null, false, false));
AffineTransform at = new AffineTransform();
at.translate(0+20, (float)tl.getBounds().getHeight()+20);
foreShape = tl.getOutline(at);
at = new AffineTransform();
at.translate(0+25, (float)tl.getBounds().getHeight()+25);
backShape = tl.getOutline(at);
}
/** <p>Set the font.<br />Définit la police.</p> */
public void setFont(String fontname, double fontsize){
as.setFontname(fontname);
as.setFontsize(fontsize);
refresh();
}
/** <p>Set the color of the text.<br />Définit la couleur du texte.</p> */
public void setTextColor(Color text, int alpha){
as.setTextColor(text, Integer.toString(alpha, 16));
TextAlpha = (float)alpha;
refresh();
}
/** <p>Set the color of the border.<br />Définit la couleur de la bordure.</p> */
public void setOutlineColor(Color outline, int alpha){
as.setOutlineColor(outline, Integer.toString(alpha, 16));
OutlineAlpha = (float)alpha;
refresh();
}
/** <p>Set the color of the shadow.<br />Définit la couleur de l'ombre.</p> */
public void setShadowColor(Color text, int alpha){
as.setBackColor(text, Integer.toString(alpha, 16));
ShadowAlpha = (float)alpha;
refresh();
}
/** <p>SRefresh the panel.<br />Rafraichit le panel.</p> */
public void refresh(){
updateText();
repaint();
}
/** <p>Management of the transparency.<br />Gestion de la transparence.</p> */
private AlphaComposite makeComposite(float alpha) {
int type = AlphaComposite.SRC_OVER;
return(AlphaComposite.getInstance(type, alpha));
}
}