/** * Copyright Plugtree LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.plugtree.solrmeter.view.component; import java.awt.Dimension; import java.util.LinkedList; import java.util.List; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.apache.log4j.Logger; public class SpinnerPanel extends JPanel implements TwoColumns, Row { private static final Logger log = Logger.getLogger(SpinnerPanel.class); private static final long serialVersionUID = 8355604724298546390L; private static final int VERTICAL_MARGIN = 3; private static final int HORIZONTAL_MARGIN = 2; private JSpinner spinner; private JLabel jLabelTitle; private int initNumber = 1; private int minNumber = 1; private int maxNumber = Integer.MAX_VALUE; private int stepSize = 1; private String title; private List<ChangeListener> listeners; public SpinnerPanel(int initNumber, int minNumber, int maxNumber, int stepSize, String title) { super(); listeners = new LinkedList<ChangeListener>(); this.initNumber = initNumber; this.minNumber = minNumber; this.maxNumber = maxNumber; this.stepSize = stepSize; this.title = title; this.initGUI(); } public SpinnerPanel(int initNumber, String title) { super(); listeners = new LinkedList<ChangeListener>(); this.initNumber = initNumber; this.title = title; this.initGUI(); } private void initGUI() { this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); this.setBorder(BorderFactory.createEmptyBorder(VERTICAL_MARGIN, HORIZONTAL_MARGIN, VERTICAL_MARGIN, HORIZONTAL_MARGIN)); jLabelTitle = new JLabel(title + ":"); spinner = new JSpinner(new SpinnerNumberModel(initNumber, minNumber, maxNumber, stepSize)); spinner.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { notifyChangeListeners(e); } }); try { JSpinner.DefaultEditor editor = (JSpinner.DefaultEditor)spinner.getEditor(); editor.getTextField().setEditable(true); editor.getTextField().setColumns(5); } catch(ClassCastException ex) { log.warn("Unexpected JSpinner editor class: " + spinner.getEditor().getClass().getName()); } // limit the height of the spinner to the minimum spinner.setMaximumSize(new Dimension(spinner.getMaximumSize().width, spinner.getMinimumSize().height)); // let the spinner shrink spinner.setMinimumSize(new Dimension(10, spinner.getMinimumSize().height)); this.add(jLabelTitle); this.add(Box.createHorizontalStrut(TwoColumns.GAP)); this.add(Box.createHorizontalGlue()); this.add(spinner); } public void addChangeListener(ChangeListener listener) { listeners.add(listener); } private void notifyChangeListeners(ChangeEvent event) { for(ChangeListener listener:listeners) { listener.stateChanged(event); } } public Integer getValue() { return (Integer)spinner.getValue(); } public void setValue(Integer value) { spinner.setValue(value); } @Override public int getFirstColumnWidth() { return jLabelTitle.getMinimumSize().width; } @Override public void setFirstColumnWidth(int width) { Dimension d = (Dimension)jLabelTitle.getMinimumSize().clone(); d.width = width; jLabelTitle.setMinimumSize(d); jLabelTitle.setPreferredSize(d); jLabelTitle.setMaximumSize(d); } @Override public Dimension getMaximumSize() { Dimension d = new Dimension(); d.width = super.getMaximumSize().width; d.height = Math.max(jLabelTitle.getMinimumSize().height, spinner.getMinimumSize().height) + 2*VERTICAL_MARGIN; return d; } }