/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.tools.gui; import org.jdesktop.fuse.InjectedResource; import org.jdesktop.fuse.ResourceInjector; import org.jdesktop.swingx.graphics.GraphicsUtilities; import org.jdesktop.swingx.graphics.ShadowRenderer; import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Composite; import java.awt.Dimension; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Stroke; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JPanel; /** * Panel zur "ultracoolen" Darstellung von Klassinformationen in Renderern. Das Panel zeichnet ein abgerundetes Viereck * mit metallischer Oberflaeche auf dem die Objektbeschreibung dargestellt wird. Zusaetzlich erzeugt das Panel einen * Milchglas-Effekt, indem es eine Karte in den Hintergrund zeichnet und weichzeinet. Damit die Karte dennoch gut * sichtbar ist, kann durch hinzufuegen eines weiteren Panels (mit Contraint BorderLayout.CENTER) ein "Loch" in den * Milchglas-Effekt gezeichnet werden, worin die Karte klar sichtbar ist. * * @author srichter * @author nhaffke * @version $Revision$, $Date$ */ public class PureCoolPanel extends PainterCoolPanel { //~ Static fields/initializers --------------------------------------------- // Lumbermill Logger initialisieren private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(PureCoolPanel.class); private static final int IMAGE_TYPE = BufferedImage.TYPE_4BYTE_ABGR; private static final Stroke STROKE = new BasicStroke(1.0f); //~ Instance fields -------------------------------------------------------- @InjectedResource public int offset; @InjectedResource public int offsetRight; @InjectedResource public int offsetTop; @InjectedResource public int offsetBetween; @InjectedResource public int arcSize; @InjectedResource public int shadowLength; @InjectedResource public int blurFactor; @InjectedResource public float borderWidth; @InjectedResource public float shadowIntensity; @InjectedResource public float titlePanelOpacity; @InjectedResource public float titleLinesOpacity; @InjectedResource public float interPanelOpacity; @InjectedResource public float interLinesOpacity; @InjectedResource public float blurredMapOpacity; @InjectedResource public float cutOutMapOpacity; @InjectedResource public float glossyOpacity; @InjectedResource public Color shadowColor; @InjectedResource public Color colorBorder; @InjectedResource public Color colorMapBorder; @InjectedResource public Color colorTitle; @InjectedResource public Color colorInter; @InjectedResource public Color colorDarkLine; @InjectedResource public Color colorBrightLine; @InjectedResource public Color colorGlossy; @InjectedResource public Color gradientColorTop; @InjectedResource public Color gradientColorBottom; @InjectedResource public boolean usePainterCoolPanel; private JPanel spinner; private JComponent panMap; private JComponent panContent; // private boolean usePainterCoolPanel = false; private ImageIcon icons; private BufferedImage cacheImage; private BufferedImage gradientImage; private JComponent panTitle; private JComponent panInter; private final Composite composite; private final ShadowRenderer shadowRenderer; private Dimension lastPaintSize; //~ Constructors ----------------------------------------------------------- /** * Kontruktor des CoolPanels. Erzeugt ein CoolPanel, damit es in einem Renderer verwendet werden kann. */ public PureCoolPanel() { // FUSE initialisieren FuseLoader.load(); // Ressourcen hierarchisch rekursiv nach oben einfuegen ResourceInjector.get("purecoolpanel.style").inject(true, new Object[] { this }); // NOI18N // gradientColorTop = javax.swing.UIManager.getDefaults().getColor("Button.shadow"); // NOI18N gradientColorBottom = javax.swing.UIManager.getDefaults().getColor("Button.background"); // NOI18N composite = AlphaComposite.SrcAtop.derive(titleLinesOpacity); shadowRenderer = new ShadowRenderer(shadowLength, shadowIntensity, shadowColor); cacheImage = null; gradientImage = null; lastPaintSize = getSize(); } //~ Methods ---------------------------------------------------------------- @Override protected void paintComponent(final Graphics g) { if (usePainterCoolPanel) { super.paintComponent(g); } else { // alter PureCoolPanel paint code.... final Graphics2D g2d = (Graphics2D)g; if ((cacheImage == null) || !getSize().equals(lastPaintSize)) { lastPaintSize = getSize(); // Image zum Zeichnen erstellen von dem wird spaeter der Schlagschatten erstellt wird final BufferedImage box = new BufferedImage(getWidth() - offset, getHeight() - offset, IMAGE_TYPE); // Graphics-Objekt der Box erzeugen final Graphics2D boxGraphics = box.createGraphics(); // Standard-Zeichenmodus speichern final Composite originalComposite = boxGraphics.getComposite(); if ((gradientImage == null) || (gradientImage.getHeight() != box.getHeight())) { gradientImage = GraphicsUtilities.createCompatibleImage(1, box.getHeight()); final Graphics2D gradientGraphics2d = gradientImage.createGraphics(); gradientGraphics2d.setPaint(new GradientPaint( 0, 0, gradientColorTop, 0, box.getHeight(), gradientColorBottom)); gradientGraphics2d.fillRect(0, 0, 1, box.getHeight()); } // RoundedRectangle zeichnen und mit Gradient fuellen boxGraphics.setColor(Color.BLACK); boxGraphics.fillRoundRect(offset, 0, box.getWidth() - offset, box.getHeight(), arcSize, arcSize); boxGraphics.setComposite(AlphaComposite.SrcAtop); boxGraphics.drawImage(gradientImage, 0, 0, box.getWidth(), box.getHeight(), null); boxGraphics.setComposite(originalComposite); boxGraphics.setStroke(STROKE); // Falls TitlePanel existiert, speziell zeichnen if (getPanTitle() != null) { final Rectangle bounds = getPanTitle().getBounds(); boxGraphics.setComposite(AlphaComposite.SrcAtop.derive(titlePanelOpacity)); boxGraphics.setColor(colorTitle); boxGraphics.fillRect(0, bounds.y, bounds.width + offset, bounds.height); boxGraphics.setComposite(composite); boxGraphics.setColor(colorDarkLine); boxGraphics.drawLine(offset, bounds.height - 1, bounds.width + (3 * offset), bounds.height - 1); boxGraphics.setColor(colorBrightLine); boxGraphics.drawLine(offset, bounds.height, bounds.width + (3 * offset), bounds.height); } // Falls InteractionPanel existiert, speziell zeichnen if (getPanInter() != null) { final Rectangle bounds = getPanInter().getBounds(); boxGraphics.setComposite(AlphaComposite.SrcAtop.derive(interPanelOpacity)); boxGraphics.setPaint(new GradientPaint( 0, bounds.y, new Color(0, 0, 0, 160), 0, bounds.y + bounds.height, Color.BLACK)); boxGraphics.fillRect(0, bounds.y, bounds.width + offset, bounds.height); boxGraphics.setComposite(AlphaComposite.SrcAtop.derive(interLinesOpacity)); boxGraphics.setColor(colorDarkLine); boxGraphics.drawLine(offset, bounds.y - 1, bounds.width + (3 * offset), bounds.y - 1); boxGraphics.setColor(colorBrightLine); boxGraphics.drawLine(offset, bounds.y, bounds.width + (3 * offset), bounds.y); } // Rahmen des RoundRectangel in der Box nachzeichnen boxGraphics.setComposite(AlphaComposite.SrcOver.derive(0.7f)); boxGraphics.setColor(colorBorder); boxGraphics.drawRoundRect( offset, 0, box.getWidth() - (offset + 1), box.getHeight() - 1, arcSize, arcSize); // Weissen oberen Rand zeichnen final BufferedImage glossy = new BufferedImage(box.getWidth(), box.getHeight(), IMAGE_TYPE); final Graphics2D glossyGraphics2D = glossy.createGraphics(); // glossyGraphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); glossyGraphics2D.setStroke(STROKE); // Glossy-Effekt oben glossyGraphics2D.setColor(colorGlossy); // if (noTitlePanel) { glossyGraphics2D.drawRoundRect(offset + 1, 1, box.getWidth() - (offset + 3), 2 * arcSize, arcSize, arcSize); glossyGraphics2D.setComposite(AlphaComposite.DstIn); glossyGraphics2D.setPaint(new GradientPaint( 0, 0, new Color(255, 255, 255, 255), 0, arcSize / 2, new Color(255, 255, 255, 0))); glossyGraphics2D.fillRect(0, 0, box.getWidth(), arcSize); glossyGraphics2D.setPaint(new Color(255, 255, 255, 0)); glossyGraphics2D.fillRect(0, arcSize / 2, box.getWidth(), 2 * arcSize); // } else { // gg.fillRoundRect(offset+2,2, box.getWidth()-(offset+4), getPanTitle().getHeight(),arcSize-2,arcSize-2); // gg.setComposite(AlphaComposite.DstIn); // gg.setPaint(new GradientPaint(0,0,new Color(255,255,255,255), 0, getPanTitle().getHeight()/2, new Color(255,255,255,0))); // gg.fillRect(0,0,box.getWidth(), getPanTitle().getHeight()); // gg.setPaint(new Color(255,255,255,0)); // gg.fillRect(0,getPanTitle().getHeight()/2,box.getWidth(), getPanTitle().getHeight()); // } // Drop Shadow rendern final BufferedImage shadow = shadowRenderer.createShadow(box); // Fertige Box und ihren Schatten zeichnen. cacheImage = new BufferedImage(shadow.getWidth(), shadow.getHeight(), IMAGE_TYPE); final Graphics2D resultGraphics2D = cacheImage.createGraphics(); resultGraphics2D.drawImage(shadow, 0, 0, null); resultGraphics2D.drawImage(box, 0, 0, null); resultGraphics2D.setComposite(AlphaComposite.SrcOver.derive(glossyOpacity)); resultGraphics2D.drawImage(glossy, 0, 0, null); resultGraphics2D.setComposite(originalComposite); if (this.icons != null) { // resultGraphics2D.drawImage(this.icons.getImage(), box.getWidth() - this.icons.getIconWidth() - offsetRight, offsetTop, null); resultGraphics2D.drawImage(this.icons.getImage(), box.getWidth() - this.icons.getIconWidth() - offsetRight, (panTitle.getHeight() / 2) + 3 - (this.icons.getIconHeight() / 2), null); } boxGraphics.dispose(); glossyGraphics2D.dispose(); resultGraphics2D.dispose(); box.flush(); glossy.flush(); shadow.flush(); } // Entgueltiges Bild in Panel zeichnen g2d.drawImage(cacheImage, 0, 0, null); } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public JComponent getPanMap() { return panMap; } /** * DOCUMENT ME! * * @param panMap DOCUMENT ME! */ public void setPanMap(final JComponent panMap) { this.panMap = panMap; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public JComponent getPanContent() { return panContent; } /** * DOCUMENT ME! * * @param panContent DOCUMENT ME! */ public void setPanContent(final JComponent panContent) { this.panContent = panContent; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public JPanel getSpinner() { return spinner; } /** * DOCUMENT ME! * * @param spinner DOCUMENT ME! */ public void setSpinner(final JPanel spinner) { this.spinner = spinner; } /** * This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The * content of this method is always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { setPreferredSize(new java.awt.Dimension(200, 200)); final javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 400, Short.MAX_VALUE)); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 300, Short.MAX_VALUE)); } // </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables // End of variables declaration//GEN-END:variables }