From bd639caa0bbf010c415d197b93d0f30a6cb8f1e4 Mon Sep 17 00:00:00 2001 From: Pacien TRAN-GIRARD Date: Thu, 27 Feb 2014 14:53:05 +0100 Subject: Code refactoring to match MVC --- .../nikiroo/utils/gui/JBackgroundPanel.java | 308 +++++++++++++++++++++ 1 file changed, 308 insertions(+) create mode 100644 src/net/homelinux/nikiroo/utils/gui/JBackgroundPanel.java (limited to 'src/net/homelinux/nikiroo/utils/gui') diff --git a/src/net/homelinux/nikiroo/utils/gui/JBackgroundPanel.java b/src/net/homelinux/nikiroo/utils/gui/JBackgroundPanel.java new file mode 100644 index 0000000..ba53b86 --- /dev/null +++ b/src/net/homelinux/nikiroo/utils/gui/JBackgroundPanel.java @@ -0,0 +1,308 @@ +package net.homelinux.nikiroo.utils.gui; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Insets; +import java.awt.LayoutManager; +import java.awt.Paint; +import java.awt.Rectangle; + +import javax.swing.ImageIcon; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JViewport; + +/** + * Support custom painting on a panel in the form of
  • images - that can be + * scaled, tiled or painted at original size
  • non solid painting - that + * can be done by using a Paint object
  • Also, any component added directly + * to this panel will be made non-opaque so that the custom painting can show + * through. + */ +public class JBackgroundPanel extends JPanel { + private static final long serialVersionUID = 1L; + + public static final int SCALED = 0; + public static final int TILED = 1; + public static final int ACTUAL = 2; + public static final int RATIO = 3; + + private Paint painter; + private Image image; + private int style = SCALED; + private float alignmentX = 0.5f; + private float alignmentY = 0.5f; + private boolean isTransparentAdd = true; + + /** + * Empty {@link JBackgroundPanel}. + */ + public JBackgroundPanel() { + } + + /** + * Empty {@link JBackgroundPanel} with the given {@link LayoutManager}. + */ + public JBackgroundPanel(LayoutManager layout) { + super(layout); + } + + /* + * Set image as the background with the SCALED style + */ + public JBackgroundPanel(ImageIcon image) { + this(image.getImage()); + } + + /* + * Set image as the background with the SCALED style + */ + public JBackgroundPanel(ImageIcon image, int style) { + this(image.getImage(), style); + } + + /* + * Set image as the backround with the specified style and alignment + */ + public JBackgroundPanel(ImageIcon image, int style, float alignmentX, float alignmentY) { + this(image.getImage(), style, alignmentX, alignmentY); + } + + /* + * Set image as the background with the SCALED style + */ + public JBackgroundPanel(Image image) { + this(image, SCALED); + } + + /* + * Set image as the background with the specified style + */ + public JBackgroundPanel(Image image, int style) { + setImage(image); + setStyle(style); + setLayout(new BorderLayout()); + } + + /* + * Set image as the backround with the specified style and alignment + */ + public JBackgroundPanel(Image image, int style, float alignmentX, float alignmentY) { + setImage(image); + setStyle(style); + setImageAlignmentX(alignmentX); + setImageAlignmentY(alignmentY); + setLayout(new BorderLayout()); + } + + /* + * Use the Paint interface to paint a background + */ + public JBackgroundPanel(Paint painter) { + setPaint(painter); + setLayout(new BorderLayout()); + } + + /* + * Set the image used as the background + */ + public void setImage(Image image) { + this.image = image; + repaint(); + } + + /* + * Set the style used to paint the background image + */ + public void setStyle(int style) { + this.style = style; + repaint(); + } + + /* + * Set the Paint object used to paint the background + */ + public void setPaint(Paint painter) { + this.painter = painter; + repaint(); + } + + /* + * Specify the horizontal alignment of the image when using ACTUAL style + */ + public void setImageAlignmentX(float alignmentX) { + this.alignmentX = alignmentX > 1.0f ? 1.0f : alignmentX < 0.0f ? 0.0f : alignmentX; + repaint(); + } + + /* + * Specify the horizontal alignment of the image when using ACTUAL style + */ + public void setImageAlignmentY(float alignmentY) { + this.alignmentY = alignmentY > 1.0f ? 1.0f : alignmentY < 0.0f ? 0.0f : alignmentY; + repaint(); + } + + /* + * Override method so we can make the component transparent + */ + public void add(JComponent component) { + add(component, null); + } + + /* + * Override to provide a preferred size equal to the image size + */ + @Override + public Dimension getPreferredSize() { + if (image == null) + return super.getPreferredSize(); + else + return new Dimension(image.getWidth(null), image.getHeight(null)); + } + + /* + * Override method so we can make the component transparent + */ + public void add(JComponent component, Object constraints) { + if (isTransparentAdd) { + makeComponentTransparent(component); + } + + super.add(component, constraints); + } + + /* + * Controls whether components added to this panel should automatically be + * made transparent. That is, setOpaque(false) will be invoked. The default + * is set to true. + */ + public void setTransparentAdd(boolean isTransparentAdd) { + this.isTransparentAdd = isTransparentAdd; + } + + /* + * Try to make the component transparent. For components that use renderers, + * like JTable, you will also need to change the renderer to be transparent. + * An easy way to do this it to set the background of the table to a Color + * using an alpha value of 0. + */ + private void makeComponentTransparent(JComponent component) { + component.setOpaque(false); + + if (component instanceof JScrollPane) { + JScrollPane scrollPane = (JScrollPane) component; + JViewport viewport = scrollPane.getViewport(); + viewport.setOpaque(false); + Component c = viewport.getView(); + + if (c instanceof JComponent) { + ((JComponent) c).setOpaque(false); + } + } + } + + /* + * Add custom painting + */ + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + + // Invoke the painter for the background + + if (painter != null) { + Dimension d = getSize(); + Graphics2D g2 = (Graphics2D) g; + g2.setPaint(painter); + g2.fill(new Rectangle(0, 0, d.width, d.height)); + } + + // Draw the image + + if (image == null) + return; + + switch (style) { + case RATIO: + drawRatio(g); + break; + + case SCALED: + drawScaled(g); + break; + + case TILED: + drawTiled(g); + break; + + case ACTUAL: + drawActual(g); + break; + + default: + drawScaled(g); + } + } + + /* + * Custom painting code for drawing a SCALED image as the background + */ + private void drawScaled(Graphics g) { + Dimension d = getSize(); + g.drawImage(image, 0, 0, d.width, d.height, null); + } + + /* + * Custom painting code for drawing TILED images as the background + */ + private void drawTiled(Graphics g) { + Dimension d = getSize(); + int width = image.getWidth(null); + int height = image.getHeight(null); + + for (int x = 0; x < d.width; x += width) { + for (int y = 0; y < d.height; y += height) { + g.drawImage(image, x, y, null, null); + } + } + } + + /* + * Custom painting code for drawing the ACTUAL image as the background. The + * image is positioned in the panel based on the horizontal and vertical + * alignments specified. + */ + private void drawActual(Graphics g) { + Dimension d = getSize(); + Insets insets = getInsets(); + int width = d.width - insets.left - insets.right; + int height = d.height - insets.top - insets.left; + float x = (width - image.getWidth(null)) * alignmentX; + float y = (height - image.getHeight(null)) * alignmentY; + g.drawImage(image, (int) x + insets.left, (int) y + insets.top, this); + } + + private void drawRatio(Graphics g) { + if (image != null && g != null) { + // si la dimension actuelle est > � la preferedSize (qui est + // elle-meme a la taille de l'avatar) + int h = (this.getHeight() - image.getHeight(null)) / 2; + int w = (this.getWidth() - image.getWidth(null)) / 2; + if (h < 0) { + h = 0; + } + if (w < 0) { + w = 0; + } + // TODO: alignment, solid paint + + g.drawImage(image, w, h, null, null); + } + } +} \ No newline at end of file -- cgit v1.2.3