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

cdc.ui.swing.cells.NumberUi Maven / Gradle / Ivy

package cdc.ui.swing.cells;

import java.awt.Font;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.UIResource;
import javax.swing.table.TableCellRenderer;

import cdc.util.lang.Checks;

/**
 * Rendering/Edition of Numbers.
 *
 * @author Damien Carbonne
 *
 */
public final class NumberUi {
    private NumberUi() {
    }

    public static final class Settings {
        private final Class numberClass;
        private String format = "";

        public Settings(Class numberClass) {
            Checks.isNotNull(numberClass, "numberClass");

            this.numberClass = numberClass;
            if (numberClass.equals(Long.class)
                    || numberClass.equals(Integer.class)
                    || numberClass.equals(Short.class)
                    || numberClass.equals(Byte.class)) {
                this.format = "%,d";
            } else if (numberClass.equals(Double.class)
                    || numberClass.equals(Float.class)) {
                this.format = "%,f";
            } else {
                this.format = "";
            }
        }

        public Class getNumberClass() {
            return numberClass;
        }

        public String getFormat() {
            return format;
        }

        public void setFormat(String format) {
            this.format = format;
        }
    }

    public static final class Widget extends JLabel {
        private static final long serialVersionUID = 1L;
        private transient Settings settings;

        public Widget(Settings settings) {
            Checks.isNotNull(settings, "settings");

            setFont(getFont().deriveFont(Font.PLAIN));
            setSettings(settings);
            setOpaque(true);
            setHorizontalAlignment(SwingConstants.RIGHT);
        }

        public Class getNumberClass() {
            return settings.getNumberClass();
        }

        public void setSettings(Settings settings) {
            Checks.isNotNull(settings, "settings");
            this.settings = settings;
        }

        public Settings getSettings() {
            return settings;
        }
    }

    public static class CellRenderer implements TableCellRenderer, UIResource {
        private static final Border NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1);

        protected Widget wComponent;

        public CellRenderer(Settings settings) {
            wComponent = new Widget<>(settings);
        }

        public Class getNumberClass() {
            return wComponent.getNumberClass();
        }

        @Override
        public Widget getTableCellRendererComponent(JTable table,
                                                       Object value,
                                                       boolean isSelected,
                                                       boolean hasFocus,
                                                       int row,
                                                       int column) {
            if (isSelected) {
                wComponent.setForeground(table.getSelectionForeground());
                wComponent.setBackground(table.getSelectionBackground());
            } else {
                wComponent.setForeground(table.getForeground());
                wComponent.setBackground(table.getBackground());
            }

            if (hasFocus) {
                wComponent.setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
            } else {
                wComponent.setBorder(NO_FOCUS_BORDER);
            }

            if (value == null) {
                wComponent.setText("null");
            } else {
                wComponent.setText(String.format(wComponent.getSettings().getFormat(), value));
            }

            return wComponent;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy