/*
* Copyright 2003-2010 Tufts University Licensed under the
* Educational Community 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.osedu.org/licenses/ECL-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 edu.tufts.vue.preferences.implementations;
import java.util.Hashtable;
import java.util.prefs.Preferences;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import tufts.vue.VueResources;
import edu.tufts.vue.preferences.PreferenceConstants;
import edu.tufts.vue.preferences.generics.GenericSliderPreference;
/**
* @author Mike Korcynski
* This class supports the MapDisplay -> Image Size preference, the way this works is a bit odd.
* The major issue being that the scale I was given isn't linear, so I had to sort of rig the
* Slider together, this could be improved by picking a linear scale by which to size the images.
*/
public class ImageSizePreference extends GenericSliderPreference {
private final int TICK_SPACING=85;
private final int HASHMARK_0=0;
private final int HASHMARK_1=TICK_SPACING;
private final int HASHMARK_2=TICK_SPACING*2;
private final int HASHMARK_3=TICK_SPACING*3;
private final int HASHMARK_4=TICK_SPACING*4;
private final int HASHMARK_5=TICK_SPACING*5;
private final int HASHMARK_6=TICK_SPACING*6;
private static ImageSizePreference _instance;
private ImageSizePreference()
{
super();
JSlider slider = getSlider();
slider.setOrientation(JSlider.VERTICAL);
slider.setMajorTickSpacing(TICK_SPACING);
slider.setPaintTicks(true);
slider.setSnapToTicks(true);
slider.setMinimum(0);
slider.setMaximum(510);
configureSlider();
}
// For lazy initialization
public static synchronized ImageSizePreference getInstance() {
if (_instance==null) {
_instance = new ImageSizePreference();
}
return _instance;
}
public Object getDefaultValue()
{
return new Integer(75);
}
public void configureSlider()
{
JSlider slider = getSlider();
setDefaultValueMappedToSlider();
//Create the label table
Hashtable<Integer, JLabel> labelTable = new Hashtable<Integer, JLabel>();
labelTable.put( new Integer( HASHMARK_0 ), new JLabel(VueResources.getString("jlabel.off")) );
labelTable.put( new Integer( HASHMARK_1 ), new JLabel("16x16") );
labelTable.put( new Integer( HASHMARK_2 ), new JLabel("32x32") );
labelTable.put( new Integer( HASHMARK_3 ), new JLabel("64x64") );
labelTable.put( new Integer( HASHMARK_4 ), new JLabel("128x128") );
labelTable.put( new Integer( HASHMARK_5 ), new JLabel("256x256") );
labelTable.put( new Integer( HASHMARK_6 ), new JLabel("512x512") );
slider.setLabelTable( labelTable );
slider.setPaintLabels(true);
getSlider().addChangeListener(this);
return;
}
/*
* Lots of mapping back and forth between the linear scale of the Slider and the
* possible values we want.
*/
public void setDefaultValueMappedToSlider()
{
JSlider slider = getSlider();
Preferences p = Preferences.userNodeForPackage(getPrefRoot());
int i = p.getInt(getPrefName(), ((Integer)getDefaultValue()).intValue());
// System.out.println("DEFAULT VALUE : " + i);
switch (i)
{
case 0:
slider.setValue(HASHMARK_0);
break;
case 16:
slider.setValue(HASHMARK_1);
break;
case 32:
slider.setValue(HASHMARK_2);
break;
case 64:
slider.setValue(HASHMARK_3);
break;
case 128:
slider.setValue(HASHMARK_4);
break;
case 256:
slider.setValue(HASHMARK_5);
break;
case 512:
slider.setValue(HASHMARK_6);
break;
}
return;
}
public int getSliderValueMappedToPref()
{
int val = getSlider().getValue();
//System.out.println("MAP VALUE : " +val);
switch (val)
{
case HASHMARK_0:
return 0;
case HASHMARK_1:
return 16;
case HASHMARK_2:
return 32;
case HASHMARK_3:
return 64;
case HASHMARK_4:
return 128;
case HASHMARK_5:
return 256;
case HASHMARK_6:
return 512;
}
return ((Integer)getDefaultValue()).intValue();
}
public String getTitle()
{
return VueResources.getString("preferencedailog.images");
}
public String getDescription()
{
return new String(VueResources.getString("preference.imagesize.description"));
}
public String getPrefName()
{
return "mapDisplay.imageSize";
}
public String getCategoryKey() {
return PreferenceConstants.MAPDISPLAY_CATEGORY;
}
public void stateChanged(ChangeEvent e)
{
JSlider source = (JSlider)e.getSource();
if (!source.getValueIsAdjusting()) {
setValue(Integer.valueOf(getSliderValueMappedToPref()));
}
}
}