/* This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV This program is free software; you can redistribute it and/or modify it under the terms of the GNU Affero 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program; if not, see http://www.gnu.org/licenses or write to the Free Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 */ package com.servoy.j2db.smart; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Dictionary; import java.util.Hashtable; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JLabel; import javax.swing.JSlider; import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.plaf.ComponentUI; import com.servoy.j2db.IApplication; import com.servoy.j2db.ISupportNavigator; import com.servoy.j2db.smart.dataui.StyledEnablePanel; import com.servoy.j2db.util.ISkinnable; import com.servoy.j2db.util.ISupplyFocusChildren; import com.servoy.j2db.util.gui.NumberField; public class Slider extends StyledEnablePanel implements ChangeListener, ActionListener, ISupplyFocusChildren<Component> { /** * The real slider */ private final JSlider slider; /** * The number field */ private final NumberField field; /** * Constructor I */ public Slider(IApplication app) { super(app); setName("slider_panel"); //$NON-NLS-1$ setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); slider = new SkinSlider(SwingConstants.VERTICAL);//, 0, 0, 0); slider.setName("slider_slider"); //$NON-NLS-1$ slider.setOpaque(false); Dimension d = new Dimension(ISupportNavigator.DEFAULT_NAVIGATOR_WIDTH, 80); slider.setPreferredSize(d); slider.setMaximumSize(d); slider.setMinimumSize(d); slider.setSize(d); // slider.setPaintTicks(true); slider.setPaintLabels(true); slider.setInverted(true); slider.setMinimum(1); // slider.setBackground(Color.green); // slider.setModel(new FixedDefaultBoundedRangeModel()); slider.addChangeListener(this); add(slider); add(Box.createRigidArea(new Dimension(0, 3))); field = new NumberField(new Integer(0)); field.setName("slider_numeric"); //$NON-NLS-1$ field.setAllowNegativeValues(false); Dimension d1 = new Dimension(ISupportNavigator.DEFAULT_NAVIGATOR_WIDTH, 20); field.setPreferredSize(d1); field.setMinimumSize(d1); field.setMaximumSize(d1); field.setSize(d1); field.addActionListener(this); add(field); add(Box.createVerticalGlue()); setBorder(BorderFactory.createEmptyBorder(10, 3, 0, 3)); // setMaximumSize(new Dimension(DEFAULT_WIDTH,100)); setOpaque(false); } protected class SkinSlider extends JSlider implements ISkinnable { public SkinSlider(int orientation) { super(orientation); } @Override public void setUI(ComponentUI ui) { super.setUI(ui); } } public boolean getValueIsAdjusting() { return slider.getValueIsAdjusting(); } public void setMax(int index, boolean more) { //Create the label tableDictionary Dictionary<Integer, Component> labelTable = new Hashtable<Integer, Component>(); Dimension d = new Dimension(40, 15); if (index == 0) { // do set the minimum to 0, java 6 can't have it when minimum > max label slider.setMinimum(0); Integer i = new Integer(0); JLabel start = new JLabel("0"); //$NON-NLS-1$ start.setPreferredSize(d); start.setHorizontalAlignment(SwingConstants.RIGHT); labelTable.put(i, start); // field.setValue(i); } else { slider.setMinimum(1); JLabel start = new JLabel("1"); //$NON-NLS-1$ start.setPreferredSize(d); start.setHorizontalAlignment(SwingConstants.RIGHT); labelTable.put(new Integer(1), start); // labelTable.put( new Integer( 3 ), new JLabel("Slow") ); String pre = ""; //$NON-NLS-1$ if (more) { pre = "+"; //$NON-NLS-1$ } JLabel end = new JLabel(index + pre); end.setPreferredSize(d); end.setHorizontalAlignment(SwingConstants.RIGHT); labelTable.put(new Integer(index), end); } slider.setMaximum(index); slider.setLabelTable(labelTable); slider.doLayout(); } public int getMaximum() { return slider.getMaximum(); } public void setValue(int index) { field.setValue(new Integer(index)); slider.setValue(index); } public int getValue() { return slider.getValue(); } public void addChangeListener(ChangeListener cl) { slider.addChangeListener(cl); } public void removeChangeListener(ChangeListener cl) { slider.removeChangeListener(cl); } public void stateChanged(ChangeEvent e) { Object source = e.getSource(); if (source instanceof JSlider && !slider.getValueIsAdjusting()) { field.setValue(new Integer(((JSlider)source).getValue())); } } public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source instanceof NumberField) { slider.setValue(((Integer)((NumberField)source).getValue()).intValue()); } } public Component[] getFocusChildren() { return new Component[] { slider, field }; } }