nars.failchamber.util.NSlider.java Source code

Java tutorial

Introduction

Here is the source code for nars.failchamber.util.NSlider.java

Source

/*
 * Copyright (C) 2014 me
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package nars.failchamber.util;

import com.google.common.util.concurrent.AtomicDouble;

import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.text.NumberFormat;

/**
 * @author me
 */
public class NSlider extends JLabel implements MouseListener, MouseMotionListener {
    public final AtomicDouble value;
    protected final Color barColor = null;
    protected final Color backgroundColor = Color.BLACK;
    protected final NumberFormat nf = NumberFormat.getInstance();
    protected float min;
    protected float max;
    protected boolean dragging;
    protected String prefix = "";

    public NSlider() {
        this(0, 0, 0);
    }

    public NSlider(float initialValue, float min, float max) {
        this(new AtomicDouble(initialValue), min, max);
    }

    public NSlider(AtomicDouble value, String prefix, float min, float max) {
        this(value, min, max);
        this.prefix = prefix;
    }

    public NSlider(AtomicDouble value, float min, float max) {
        super();

        nf.setMaximumFractionDigits(3);

        this.value = value;
        this.min = min;
        this.max = max;
        setBorder(new LineBorder(Color.WHITE));

        addMouseListener(this);
        addMouseMotionListener(this);

        setFont(Video.monofont.deriveFont(13f));

    }

    public float value() {
        return value.floatValue();
    }

    @Override
    public void paint(Graphics g) {
        int w = getWidth();
        int h = getHeight();
        g.setPaintMode();
        g.setColor(backgroundColor);
        g.fillRect(0, 0, w, h);

        float p = (value.floatValue() - min) / (max - min);
        if (barColor == null) {
            //Green->Yellow->Red
            //    g.setColor(Color.getHSBColor( (1f - (float)p) / 3.0f , 0.2f, 0.9f));
            //g.setColor(Color.getHSBColor( (1f - (float)p) / 3.0f , 0.2f, 0.8f + 0.15f));
            //g.setColor(Color.GRAY);
            g.setColor(Color.getHSBColor(0, 0, Math.max(0.7f, p) / 3.0f));

        } else {
            g.setColor(barColor);
        }

        int wp = (int) (((float) w) * p);
        //g.setColor(barColor);
        g.fillRect(0, 0, wp, h);

        //g.setXORMode(Color.BLACK);     

        super.paint(g);
    }

    public void onValueUpdated() {
        setText(getText());
    }

    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    @Override
    public String getText() {
        if (value != null)
            return prefix + ' ' + nf.format(value.floatValue());
        return "";
    }

    protected void updatePosition(int x) {
        float p = ((float) x) / ((float) getWidth());
        float v = p * (max - min) + min;
        v = Math.max(v, min);
        v = Math.min(v, max);
        setValue(v);
        repaint();
    }

    public void setValue(float v) {
        if (v != value.floatValue()) {
            value.set(v);
            onChange(v);
        }
    }

    public float getMin() {
        return min;
    }

    public void setMin(float min) {
        this.min = min;
    }

    public float getMax() {
        return max;
    }

    public void setMax(float max) {
        this.max = max;
    }

    public void onChange(float v) {

    }

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
        dragging = true;

        updatePosition(e.getX());
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        updatePosition(e.getX());
        dragging = false;
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        updatePosition(e.getX());
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        if (dragging) {
            updatePosition(e.getX());
        }
    }

}