All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eu.hansolo.steelseries.gauges.DisplaySingle Maven / Gradle / Ivy

Go to download

The SteelSeries is a javabeans component library that contains gauges. You will find linear and radial gauges. In addition you will also find digital displays.

There is a newer version: 3.9.6
Show newest version
package eu.hansolo.steelseries.gauges;


/**
 *
 * @author hansolo
 */
public final class DisplaySingle extends javax.swing.JComponent implements Lcd, java.awt.event.ComponentListener
{    
    private eu.hansolo.steelseries.tools.LcdColor lcdColor = eu.hansolo.steelseries.tools.LcdColor.WHITE_LCD;
    private final java.awt.Rectangle INNER_BOUNDS = new java.awt.Rectangle(0, 0, 128, 48);
    private double value;
    private static final String VALUE_PROPERTY = "value";
    private int lcdDecimals;
    private String lcdUnitString;
    private boolean lcdUnitStringVisible;
    private boolean lcdScientificFormat;
    private boolean digitalFont;
    private boolean useCustomLcdUnitFont;
    private java.awt.Font customLcdUnitFont;
    private java.awt.Font lcdValueFont;
    private java.awt.Font lcdUnitFont;
    private final java.awt.Font LCD_STANDARD_FONT;
    private final java.awt.Font LCD_DIGITAL_FONT;
    final java.awt.GraphicsConfiguration GFX_CONF;
    private java.awt.image.BufferedImage lcdImage;
    private java.awt.Shape disabledShape;
    private final java.awt.Color DISABLED_COLOR;
    private final org.pushingpixels.trident.Timeline TIMELINE;
    private final org.pushingpixels.trident.ease.TimelineEase EASING;
    
    
    public DisplaySingle()
    {
        super();
        value = 0.0;
        lcdDecimals = 1;
        lcdUnitString = "unit";
        lcdUnitStringVisible = true;
        lcdScientificFormat = false;
        digitalFont = false;
        useCustomLcdUnitFont = false;
        customLcdUnitFont = new java.awt.Font("Verdana", 1, 24);
        LCD_STANDARD_FONT = new java.awt.Font("Verdana", 1, 24);
        LCD_DIGITAL_FONT = eu.hansolo.steelseries.tools.Util.INSTANCE.getDigitalFont().deriveFont(24).deriveFont(java.awt.Font.PLAIN);
        GFX_CONF = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
        addComponentListener(this);
        DISABLED_COLOR = new java.awt.Color(102, 102, 102, 178);      
        TIMELINE = new org.pushingpixels.trident.Timeline(this);
        EASING = new org.pushingpixels.trident.ease.Linear();
        init(128, 48);
    }

    public final void init(final int WIDTH, final int HEIGHT)
    {
        if (lcdImage != null)
        {
            lcdImage.flush();
        }
        lcdImage = create_LCD_Image(WIDTH, HEIGHT);
        disabledShape = new java.awt.geom.RoundRectangle2D.Double(0, 0, WIDTH, HEIGHT, WIDTH * 0.09375, WIDTH * 0.09375);
        if (isDigitalFont())
        {
            lcdValueFont = LCD_DIGITAL_FONT.deriveFont(0.7f * getInnerBounds().height).deriveFont(java.awt.Font.PLAIN);
            if (useCustomLcdUnitFont)
            {
                lcdUnitFont = customLcdUnitFont.deriveFont(0.25f * getInnerBounds().height);
            }
            else
            {
                lcdUnitFont = LCD_STANDARD_FONT.deriveFont(0.25f * getInnerBounds().height);
            }
        }
        else
        {
            lcdValueFont = LCD_STANDARD_FONT.deriveFont(0.625f * getInnerBounds().height);
            if (useCustomLcdUnitFont)
            {
                lcdUnitFont = customLcdUnitFont.deriveFont(0.25f * getInnerBounds().height);
            }
            else
            {
                lcdUnitFont = LCD_STANDARD_FONT.deriveFont(0.25f * getInnerBounds().height);
            }
        }
    }

    @Override
    protected void paintComponent(java.awt.Graphics g)
    {
        final java.awt.Graphics2D G2 = (java.awt.Graphics2D) g.create();

        G2.setRenderingHint(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_ON);
        G2.setRenderingHint(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING, java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

        G2.translate(getInnerBounds().x, getInnerBounds().y);

        // Draw background
        G2.drawImage(lcdImage, 0, 0, null);

        // Draw lcd text
        G2.setColor(lcdColor.TEXT_COLOR);
        G2.setFont(lcdUnitFont);
        final java.awt.font.FontRenderContext RENDER_CONTEXT = new java.awt.font.FontRenderContext(null, true, true);
        final double UNIT_STRING_WIDTH;
        
        // Draw unit string
        if (lcdUnitStringVisible && !lcdUnitString.isEmpty())
        {
            final java.awt.font.TextLayout UNIT_LAYOUT = new java.awt.font.TextLayout(lcdUnitString, G2.getFont(), RENDER_CONTEXT);
            final java.awt.geom.Rectangle2D UNIT_BOUNDARY = UNIT_LAYOUT.getBounds();
            G2.drawString(lcdUnitString, (int) ((lcdImage.getWidth() - UNIT_BOUNDARY.getWidth()) - lcdImage.getWidth() * 0.03f), (int) (lcdImage.getHeight() * 0.76f));
            UNIT_STRING_WIDTH = UNIT_BOUNDARY.getWidth();
        }
        else
        {
            UNIT_STRING_WIDTH = 0;
        }

        // Draw value
        G2.setFont(lcdValueFont);
        final java.awt.font.TextLayout VALUE_LAYOUT = new java.awt.font.TextLayout(formatLcdValue(value), G2.getFont(), RENDER_CONTEXT);
        final java.awt.geom.Rectangle2D VALUE_BOUNDARY = VALUE_LAYOUT.getBounds();
        G2.drawString(formatLcdValue(value), (int) ((lcdImage.getWidth() - UNIT_STRING_WIDTH - VALUE_BOUNDARY.getWidth()) - lcdImage.getWidth() * 0.09), (int) (lcdImage.getHeight() * 0.76f));

        if (!isEnabled())
        {
            G2.setColor(DISABLED_COLOR);
            G2.fill(disabledShape);
        }
        
        G2.translate(-getInnerBounds().x, -getInnerBounds().y);

        G2.dispose();
    }

    @Override
    public double getLcdValue()
    {
        return this.value;
    }

    @Override
    public void setLcdValue(final double VALUE)
    {
        final double OLD_VALUE = this.value;
        this.value = VALUE;
        firePropertyChange(VALUE_PROPERTY, OLD_VALUE, VALUE);
        repaint(getInnerBounds());
    }

    @Override
    public void setLcdValueAnimated(final double VALUE)
    {
        if (isEnabled())
        {
            if (TIMELINE.getState() != org.pushingpixels.trident.Timeline.TimelineState.IDLE)
            {
                TIMELINE.abort();
            }
            TIMELINE.addPropertyToInterpolate("value", this.value, VALUE);
            TIMELINE.setEase(EASING);
            TIMELINE.setDuration((long) (2000));
            TIMELINE.play();
        }
    }

    @Override
    public int getLcdDecimals()
    {
        return this.lcdDecimals;
    }

    @Override
    public void setLcdDecimals(final int DECIMALS)
    {
        this.lcdDecimals = DECIMALS;
        repaint(getInnerBounds());
    }

    @Override
    public String getLcdUnitString()
    {
        return this.lcdUnitString;
    }

    @Override
    public void setLcdUnitString(final String LCD_UNIT_STRING)
    {
        this.lcdUnitString = LCD_UNIT_STRING;
        repaint(getInnerBounds());
    }

    @Override
    public boolean isLcdUnitStringVisible()
    {
        return this.lcdUnitStringVisible;
    }

    @Override
    public void setLcdUnitStringVisible(final boolean LCD_UNIT_STRING_VISIBLE)
    {
        this.lcdUnitStringVisible = LCD_UNIT_STRING_VISIBLE;
        repaint(getInnerBounds());
    }

    @Override
    public boolean getUseCustomLcdUnitFont()
    {
        return this.useCustomLcdUnitFont;
    }

    @Override
    public void setUseCustomLcdUnitFont(final boolean USE_CUSTOM_LCD_UNIT_FONT)
    {
        this.useCustomLcdUnitFont = USE_CUSTOM_LCD_UNIT_FONT;
        init(getInnerBounds().width, getInnerBounds().height);
        repaint(getInnerBounds());
    }

    @Override
    public java.awt.Font getCustomLcdUnitFont()
    {
        return this.customLcdUnitFont;
    }

    @Override
    public void setCustomLcdUnitFont(final java.awt.Font CUSTOM_LCD_UNIT_FONT)
    {
        this.customLcdUnitFont = CUSTOM_LCD_UNIT_FONT;
        init(getInnerBounds().width, getInnerBounds().height);
        repaint(getInnerBounds());
    }

    @Override
    public void setLcdScientificFormat(final boolean LCD_SCIENTIFIC_FORMAT)
    {
        this.lcdScientificFormat = LCD_SCIENTIFIC_FORMAT;
    }

    @Override
    public boolean isLcdScientificFormat()
    {
        return lcdScientificFormat;
    }

    @Override
    public boolean isDigitalFont()
    {
        return this.digitalFont;
    }

    @Override
    public void setDigitalFont(final boolean DIGITAL_FONT)
    {
        this.digitalFont = DIGITAL_FONT;
        init(getInnerBounds().width, getInnerBounds().height);
        repaint(getInnerBounds());
    }

    @Override
    public eu.hansolo.steelseries.tools.LcdColor getLcdColor()
    {
        return this.lcdColor;
    }

    @Override
    public void setLcdColor(final eu.hansolo.steelseries.tools.LcdColor COLOR)
    {
        this.lcdColor = COLOR;
        init(getInnerBounds().width, getInnerBounds().height);
        repaint(getInnerBounds());
    }

    @Override
    public String formatLcdValue(final double VALUE)
    {
        final StringBuilder DEC_BUFFER = new StringBuilder();
        DEC_BUFFER.append("0");

        if (this.lcdDecimals > 0)
        {
            DEC_BUFFER.append(".");
        }

        for (int i = 0; i < this.lcdDecimals; i++)
        {
            DEC_BUFFER.append("0");
        }

        if(lcdScientificFormat)
        {
            DEC_BUFFER.append("E0");
        }

        final java.text.DecimalFormat DEC_FORMAT = new java.text.DecimalFormat(DEC_BUFFER.toString(), new java.text.DecimalFormatSymbols(java.util.Locale.US));

        return DEC_FORMAT.format(VALUE);
    }

        @Override
    public boolean isValueCoupled()
    {
        return false;
    }

    @Override
    public void setValueCoupled(boolean VALUE_COUPLED)
    {
        
    }

    @Override
    public java.awt.Font getLcdValueFont()
    {
        return this.lcdValueFont;
    }

    @Override
    public void setLcdValueFont(java.awt.Font LCD_VALUE_FONT)
    {
        this.lcdValueFont = LCD_VALUE_FONT;
        repaint(getInnerBounds());
    }

    @Override
    public java.awt.Font getLcdUnitFont()
    {
        return this.lcdUnitFont;
    }

    @Override
    public void setLcdUnitFont(java.awt.Font LCD_UNIT_FONT)
    {
        this.lcdUnitFont = LCD_UNIT_FONT;
        repaint(getInnerBounds());
    }
    
    private java.awt.image.BufferedImage create_LCD_Image(final int WIDTH, final int HEIGHT)
    {        
        if (WIDTH <= 0 || HEIGHT <= 0)
        {
            return null;
        }

        final java.awt.image.BufferedImage IMAGE = GFX_CONF.createCompatibleImage(WIDTH, HEIGHT, java.awt.Transparency.TRANSLUCENT);
        final java.awt.Graphics2D G2 = IMAGE.createGraphics();
        G2.setRenderingHint(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_ON);
        G2.setRenderingHint(java.awt.RenderingHints.KEY_STROKE_CONTROL, java.awt.RenderingHints.VALUE_STROKE_PURE);
        G2.setRenderingHint(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING, java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        final int IMAGE_WIDTH = IMAGE.getWidth();
        final int IMAGE_HEIGHT = IMAGE.getHeight();

        // Background rectangle
        final java.awt.geom.Point2D BACKGROUND_START = new java.awt.geom.Point2D.Double(0.0, 0.0);
        final java.awt.geom.Point2D BACKGROUND_STOP = new java.awt.geom.Point2D.Double(0.0, IMAGE_HEIGHT);

        final float[] BACKGROUND_FRACTIONS =
        {
            0.0f,
            0.08f,
            0.92f,
            1.0f
        };

        final java.awt.Color[] BACKGROUND_COLORS =
        {
            new java.awt.Color(0.4f, 0.4f, 0.4f, 1.0f),
            new java.awt.Color(0.5f, 0.5f, 0.5f, 1.0f),
            new java.awt.Color(0.5f, 0.5f, 0.5f, 1.0f),
            new java.awt.Color(0.9f, 0.9f, 0.9f, 1.0f)
        };

        final java.awt.LinearGradientPaint BACKGROUND_GRADIENT = new java.awt.LinearGradientPaint(BACKGROUND_START, BACKGROUND_STOP, BACKGROUND_FRACTIONS, BACKGROUND_COLORS);
        final double BACKGROUND_CORNER_RADIUS = WIDTH * 0.09375;
        final java.awt.geom.RoundRectangle2D BACKGROUND = new java.awt.geom.RoundRectangle2D.Double(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, BACKGROUND_CORNER_RADIUS, BACKGROUND_CORNER_RADIUS);
        G2.setPaint(BACKGROUND_GRADIENT);
        G2.fill(BACKGROUND);

        // Foreground rectangle
        final java.awt.geom.Point2D FOREGROUND_START = new java.awt.geom.Point2D.Double(0.0, 1.0);
        final java.awt.geom.Point2D FOREGROUND_STOP = new java.awt.geom.Point2D.Double(0.0, IMAGE_HEIGHT - 1);

        final float[] FOREGROUND_FRACTIONS =
        {
            0.0f,
            0.03f,
            0.49f,
            0.5f,
            1.0f
        };

        final java.awt.Color[] FOREGROUND_COLORS =
        {
            lcdColor.GRADIENT_START_COLOR,
            lcdColor.GRADIENT_FRACTION1_COLOR,
            lcdColor.GRADIENT_FRACTION2_COLOR,
            lcdColor.GRADIENT_FRACTION3_COLOR,
            lcdColor.GRADIENT_STOP_COLOR
        };
        
        final java.awt.LinearGradientPaint FOREGROUND_GRADIENT = new java.awt.LinearGradientPaint(FOREGROUND_START, FOREGROUND_STOP, FOREGROUND_FRACTIONS, FOREGROUND_COLORS);        
        final double FOREGROUND_CORNER_RADIUS = BACKGROUND.getArcWidth() - 1;
        final java.awt.geom.RoundRectangle2D FOREGROUND = new java.awt.geom.RoundRectangle2D.Double(1, 1, IMAGE_WIDTH - 2, IMAGE_HEIGHT - 2, FOREGROUND_CORNER_RADIUS, FOREGROUND_CORNER_RADIUS);

        G2.setPaint(FOREGROUND_GRADIENT);
        G2.fill(FOREGROUND);

        G2.dispose();

        return IMAGE;
    }

    /**
     * Calculates the area that is available for painting the display
     */
    private void calcInnerBounds()
    {
        final java.awt.Insets INSETS = getInsets();
        INNER_BOUNDS.setBounds(INSETS.left, INSETS.top, getWidth() - INSETS.left - INSETS.right, getHeight() - INSETS.top - INSETS.bottom);
    }

    /**
     * Returns a rectangle2d representing the available space for drawing the
     * component taking the insets into account (e.g. given through borders etc.)
     * @return rectangle2d that represents the area available for rendering the component
     */
    private java.awt.Rectangle getInnerBounds()
    {        
        return INNER_BOUNDS;
    }

    // ComponentListener methods
    @Override
    public void componentResized(java.awt.event.ComponentEvent event)
    {
        if (getWidth() < getMinimumSize().width && getHeight() < getMinimumSize().height)
        {
            if (getParent().getLayout() == null)
            {
                setSize(getMinimumSize());                
            }
            else
            {
                setPreferredSize(getMinimumSize());
            }            
        }
        
        if (getParent().getLayout() == null)
        {
            setSize(getWidth(), getHeight());
        }
        else
        {
            setPreferredSize(new java.awt.Dimension(getWidth(), getHeight()));
        }
        
        calcInnerBounds();
        init(getInnerBounds().width, getInnerBounds().height);    
        revalidate();   
        repaint();
    }
    
    @Override
    public void componentMoved(java.awt.event.ComponentEvent event)
    {

    }

    @Override
    public void componentShown(java.awt.event.ComponentEvent event)
    {

    }

    @Override
    public void componentHidden(java.awt.event.ComponentEvent event)
    {

    }

    @Override
    public String toString()
    {
        return "DisplaySingle";
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy