package uk.co.mmscomputing.image.operators;
import java.util.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import javax.imageio.*;
import uk.co.mmscomputing.concurrent.Semaphore;
public class ImageTypeConvertOpPanel extends JPanel implements ActionListener,ChangeListener{
static private Properties params=new Properties();
private JDialog dialog;
private boolean cancelled;
private JRadioButton buttonByteBinary;
private JRadioButton buttonByteIndexed;
private JRadioButton buttonByteGrayScaled;
private JRadioButton buttonBPP1,buttonBPP2,buttonBPP4,buttonBPP8,buttonBPP16,buttonBPP24,buttonBPP32;
private JSlider sliderThreshold;
private Semaphore blocker=new Semaphore(0,true);
public ImageTypeConvertOpPanel(){
super(new BorderLayout());
cancelled=false;
add(getMainCentralPanel(),BorderLayout.CENTER);
JPanel bp=new JPanel();
bp.setLayout(new GridLayout(1,2));
JButton button = new JButton("ok");
button.setActionCommand("ok");
button.addActionListener(this);
bp.add(button);
button = new JButton("cancel");
button.setActionCommand("cancel");
button.addActionListener(this);
bp.add(button);
add(bp,BorderLayout.SOUTH);
}
private JPanel getMainCentralPanel(){
JPanel p = new JPanel(new GridLayout(0,1));
p.setBorder(new EtchedBorder());
p.add(getImageTypePanel());
p.add(getBPPPanel());
p.add(getQualityPanel());
return p;
}
private JPanel getImageTypePanel(){
buttonByteBinary = new JRadioButton("Byte Binary");
buttonByteBinary.setActionCommand("ByteBinary");
buttonByteBinary.addActionListener(this);
buttonByteBinary.setSelected(true);
params.setProperty("type",Integer.toString(BufferedImage.TYPE_BYTE_BINARY));
buttonByteIndexed = new JRadioButton("Byte Indexed");
buttonByteIndexed.setActionCommand("ByteIndexed");
buttonByteIndexed.addActionListener(this);
buttonByteGrayScaled = new JRadioButton("Byte Gray Scale");
buttonByteGrayScaled.setActionCommand("ByteGrayScale");
buttonByteGrayScaled.addActionListener(this);
ButtonGroup group = new ButtonGroup();
group.add(buttonByteBinary);
group.add(buttonByteIndexed);
group.add(buttonByteGrayScaled);
JPanel p = new JPanel(new GridLayout(1,0));
p.setBorder(new TitledBorder(new EtchedBorder(),"Image Type"));
p.add(buttonByteBinary);
p.add(buttonByteIndexed);
p.add(buttonByteGrayScaled);
return p;
}
private JPanel getBPPPanel(){
buttonBPP1 = new JRadioButton("1");
buttonBPP1.setActionCommand("bpp1");
buttonBPP1.addActionListener(this);
buttonBPP1.setSelected(true);
params.setProperty("bpp","1");
buttonBPP2 = new JRadioButton("2");
buttonBPP2.setActionCommand("bpp2");
buttonBPP2.addActionListener(this);
buttonBPP4 = new JRadioButton("4");
buttonBPP4.setActionCommand("bpp4");
buttonBPP4.addActionListener(this);
buttonBPP8 = new JRadioButton("8");
buttonBPP8.setActionCommand("bpp8");
buttonBPP8.addActionListener(this);
buttonBPP8.setEnabled(false);
ButtonGroup group = new ButtonGroup();
group.add(buttonBPP1);
group.add(buttonBPP2);
group.add(buttonBPP4);
group.add(buttonBPP8);
JPanel p = new JPanel(new GridLayout(1,0));
p.setBorder(new TitledBorder(new EtchedBorder(),"Bits Per Pixel"));
p.add(buttonBPP1);
p.add(buttonBPP2);
p.add(buttonBPP4);
p.add(buttonBPP8);
return p;
}
private boolean setType(String action){
if(action.equals("ByteBinary")){
params.setProperty("type",Integer.toString(BufferedImage.TYPE_BYTE_BINARY));
buttonByteBinary.setSelected(true);
buttonBPP1.setEnabled(true);
buttonBPP2.setEnabled(true);
buttonBPP4.setEnabled(true);
buttonBPP8.setEnabled(false);
if(buttonBPP8.isSelected()){setBPP("bpp4");}
}else if(action.equals("ByteIndexed")){
params.setProperty("type",Integer.toString(BufferedImage.TYPE_BYTE_INDEXED));
buttonByteIndexed.setSelected(true);
buttonBPP1.setEnabled(false);
buttonBPP2.setEnabled(false);
buttonBPP4.setEnabled(false);
buttonBPP8.setEnabled(true);
setBPP("bpp8");
}else if(action.equals("ByteGrayScale")){
params.setProperty("type",Integer.toString(BufferedImage.TYPE_BYTE_GRAY));
buttonByteGrayScaled.setSelected(true);
buttonBPP1.setEnabled(false);
buttonBPP2.setEnabled(false);
buttonBPP4.setEnabled(false);
buttonBPP8.setEnabled(true);
setBPP("bpp8");
}else{
return false;
}
return true;
}
private boolean setBPP(String action){
if(action.equals("bpp1")){
params.setProperty("bpp","1");
buttonBPP1.setSelected(true);
sliderThreshold.setEnabled(true);
}else if(action.equals("bpp2")){
params.setProperty("bpp","2");
buttonBPP2.setSelected(true);
sliderThreshold.setEnabled(false);
}else if(action.equals("bpp4")){
params.setProperty("bpp","4");
buttonBPP4.setSelected(true);
sliderThreshold.setEnabled(false);
}else if(action.equals("bpp8")){
params.setProperty("bpp","8");
buttonBPP8.setSelected(true);
sliderThreshold.setEnabled(false);
}else{
return false;
}
return true;
}
public void actionPerformed(ActionEvent ev) {
String action=ev.getActionCommand();
if(action.equals("ok")){
cancelled=false;
if(dialog!=null){dialog.dispose();}
blocker.release();
}else if(action.equals("cancel")){
cancelled=true;
if(dialog!=null){dialog.dispose();}
blocker.release();
}else if(setType(action)){
}else if(setBPP(action)){
}else{
}
}
private JPanel getQualityPanel(){
int threshold=50;
params.setProperty("threshold",Integer.toString(threshold));
sliderThreshold=new JSlider(JSlider.HORIZONTAL,0,100,threshold);
sliderThreshold.addChangeListener(this);
sliderThreshold.setEnabled(true);
sliderThreshold.setMinorTickSpacing(2);
sliderThreshold.setMajorTickSpacing(10);
sliderThreshold.setPaintTicks(true);
Dictionary dict=new Hashtable();
for(int i=0;i<=100;i+=10){
dict.put(new Integer(i), new JLabel(Integer.toString(i)));
}
sliderThreshold.setLabelTable(dict);
sliderThreshold.setPaintLabels(true);
JPanel p=new JPanel();
p.setLayout(new BorderLayout());
p.setBorder(new TitledBorder(new EtchedBorder(),"Threshold"));
p.add(sliderThreshold,BorderLayout.CENTER);
return p;
}
public void stateChanged(ChangeEvent e){
JSlider slider=(JSlider)e.getSource();
if(!slider.getValueIsAdjusting()){
if(slider==sliderThreshold){
int threshold=slider.getValue();
if(threshold<=0){threshold=1;slider.setValue(1);}
params.setProperty("threshold",Integer.toString(threshold));
}
}
}
public void display(){
try{
dialog=new JDialog((Frame)null,"Image Type Converter Settings",false);
dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
dialog.setContentPane(this);
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}catch(Exception e){
System.out.println("9\b"+getClass().getName()+".display:\n\t"+e);
e.printStackTrace();
}
}
public ImageTypeConvertOp activate(){
display();
try{
blocker.acquire();
}catch(InterruptedException ie){
return null;
}
if(cancelled){return null;}
return new ImageTypeConvertOp(params);
}
}