package uk.co.mmscomputing.imageio.tiff;
import java.util.*;
import java.awt.*;
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 TIFFIIOParamController extends JPanel implements ActionListener,ChangeListener,IIOParamController,TIFFConstants{
private JDialog dialog;
private Semaphore blocker=new Semaphore(0,true);
private boolean cancelled=false;
private JRadioButton buttonBW;
private JRadioButton buttonGray;
private JRadioButton buttonRGB;
private JRadioButton buttonCMYK;
private JRadioButton buttonYCbCr;
private JRadioButton buttonNONE;
private JRadioButton buttonMH;
private JRadioButton buttonT4MH;
private JRadioButton buttonT4MR;
private JRadioButton buttonT6MMR;
private JRadioButton buttonJPEG;
private JRadioButton buttonSS111;
private JRadioButton buttonSS211;
private JSlider sliderQuality;
private static String pi="WHITEISZERO"; // Photometric Interpretation
private static String compression="t6mmr"; // Compression method
private static int quality=50;
private static int subsampling=0x22;
public TIFFIIOParamController(Locale locale){
super(new BorderLayout());
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);
init(pi,compression,subsampling);
}
private void init(String pi,String comp,int ss){
setCompression(comp);
setPhotometricInterpretation(pi);
switch(ss){
case 0x11:setSubSampling("1:1:1");break;
default: setSubSampling("2:1:1");break;
}
}
private JPanel getMainCentralPanel(){
JPanel p = new JPanel(new GridLayout(0,1));
p.setBorder(new EtchedBorder());
p.add(getPhotometricInterpretationPanel());
p.add(getCompressionPanel());
p.add(getQualityPanel());
p.add(getSubSamplingPanel());
return p;
}
private JPanel getPhotometricInterpretationPanel(){
buttonBW = new JRadioButton("Black/White");
buttonBW.setActionCommand("WHITEISZERO");
buttonBW.addActionListener(this);
buttonGray = new JRadioButton("BlackIsZero (Gray)");
buttonGray.setActionCommand("BLACKISZERO");
buttonGray.addActionListener(this);
buttonRGB = new JRadioButton("RGB");
buttonRGB.setActionCommand("RGB");
buttonRGB.addActionListener(this);
buttonCMYK = new JRadioButton("CMYK");
buttonCMYK.setActionCommand("CMYK");
buttonCMYK.addActionListener(this);
buttonYCbCr = new JRadioButton("YCbCr");
buttonYCbCr.setActionCommand("YCbCr");
buttonYCbCr.addActionListener(this);
ButtonGroup group = new ButtonGroup();
group.add(buttonBW);
group.add(buttonGray);
group.add(buttonRGB);
group.add(buttonCMYK);
group.add(buttonYCbCr);
JPanel p = new JPanel(new GridLayout(1,0));
p.setBorder(new TitledBorder(new EtchedBorder(),"Photometric Interpretation"));
p.add(buttonBW);
p.add(buttonGray);
p.add(buttonRGB);
p.add(buttonCMYK);
p.add(buttonYCbCr);
return p;
}
private JPanel getCompressionPanel(){
buttonNONE = new JRadioButton("None");
buttonNONE.setActionCommand("none");
buttonNONE.addActionListener(this);
buttonMH = new JRadioButton("BL MH");
buttonMH.setActionCommand("mh");
buttonMH.addActionListener(this);
buttonT4MH = new JRadioButton("T4 MH");
buttonT4MH.setActionCommand("t4mh");
buttonT4MH.addActionListener(this);
buttonT4MR = new JRadioButton("T4 MR");
buttonT4MR.setActionCommand("t4mr");
buttonT4MR.addActionListener(this);
buttonT6MMR = new JRadioButton("T6 MMR");
buttonT6MMR.setActionCommand("t6mmr");
buttonT6MMR.addActionListener(this);
buttonJPEG = new JRadioButton("JPEG");
buttonJPEG.setActionCommand("jpeg");
buttonJPEG.addActionListener(this);
ButtonGroup group = new ButtonGroup();
group.add(buttonNONE);
group.add(buttonMH);
group.add(buttonT4MH);
group.add(buttonT4MR);
group.add(buttonT6MMR);
group.add(buttonJPEG);
JPanel p = new JPanel(new GridLayout(1,0));
p.setBorder(new TitledBorder(new EtchedBorder(),"Compression"));
p.add(buttonNONE);
p.add(buttonMH);
p.add(buttonT4MH);
p.add(buttonT4MR);
p.add(buttonT6MMR);
p.add(buttonJPEG);
return p;
}
private JPanel getSubSamplingPanel(){
buttonSS111 = new JRadioButton("1:1:1");
buttonSS111.setActionCommand("1:1:1");
buttonSS111.addActionListener(this);
buttonSS211 = new JRadioButton("2:1:1");
buttonSS211.setActionCommand("2:1:1");
buttonSS211.addActionListener(this);
buttonSS111.setEnabled(false);
buttonSS211.setEnabled(false);
ButtonGroup group = new ButtonGroup();
group.add(buttonSS111);
group.add(buttonSS211);
JPanel p = new JPanel(new GridLayout(1,0));
p.setBorder(new TitledBorder(new EtchedBorder(),"Y-Cb-Cr Sub Sampling"));
p.add(buttonSS111);
p.add(buttonSS211);
return p;
}
private boolean setPhotometricInterpretation(String action){
if(action.equals("WHITEISZERO")){
pi="WHITEISZERO";
buttonBW.setSelected(true);
buttonNONE.setEnabled(false);
buttonMH.setEnabled(true);
buttonT4MH.setEnabled(true);
buttonT4MR.setEnabled(true);
buttonT6MMR.setEnabled(true);
buttonJPEG.setEnabled(false);
if(buttonNONE.isSelected()||buttonJPEG.isSelected()){
setCompression("t6mmr");
}
buttonSS111.setEnabled(false);
buttonSS211.setEnabled(false);
}else if(action.equals("BLACKISZERO")){
pi="BLACKISZERO";
buttonGray.setSelected(true);
buttonNONE.setEnabled(true);
buttonMH.setEnabled(false);
buttonT4MH.setEnabled(false);
buttonT4MR.setEnabled(false);
buttonT6MMR.setEnabled(false);
buttonJPEG.setEnabled(true);
if(buttonNONE.isSelected()||buttonJPEG.isSelected()){
}else{setCompression("none");}
buttonSS111.setEnabled(false);
buttonSS211.setEnabled(false);
}else if(action.equals("RGB")){
pi="RGB";
buttonRGB.setSelected(true);
buttonNONE.setEnabled(true);
buttonMH.setEnabled(false);
buttonT4MH.setEnabled(false);
buttonT4MR.setEnabled(false);
buttonT6MMR.setEnabled(false);
buttonJPEG.setEnabled(true);
if(buttonNONE.isSelected()||buttonJPEG.isSelected()){
}else{setCompression("none");}
buttonSS111.setEnabled(false);
buttonSS211.setEnabled(false);
}else if(action.equals("CMYK")){
pi="CMYK";
buttonCMYK.setSelected(true);
buttonNONE.setEnabled(true);
buttonMH.setEnabled(false);
buttonT4MH.setEnabled(false);
buttonT4MR.setEnabled(false);
buttonT6MMR.setEnabled(false);
buttonJPEG.setEnabled(false);
if(buttonNONE.isSelected()){
}else{setCompression("none");}
buttonSS111.setEnabled(false);
buttonSS211.setEnabled(false);
}else if(action.equals("YCbCr")){
pi="YCbCr";
buttonYCbCr.setSelected(true);
buttonNONE.setEnabled(true);
buttonMH.setEnabled(false);
buttonT4MH.setEnabled(false);
buttonT4MR.setEnabled(false);
buttonT6MMR.setEnabled(false);
buttonJPEG.setEnabled(true);
if(buttonNONE.isSelected()||buttonJPEG.isSelected()){
}else{setCompression("none");}
buttonSS111.setEnabled(true);
buttonSS211.setEnabled(true);
}else{
return false;
}
return true;
}
private boolean setCompression(String action){
if(action.startsWith("none")){
compression=action;
int q=quality;sliderQuality.setValue(100);quality=q;
sliderQuality.setEnabled(false);
buttonNONE.setSelected(true);
}else if(action.startsWith("mh")){
compression=action;
int q=quality;sliderQuality.setValue(100);quality=q;
sliderQuality.setEnabled(false);
buttonMH.setSelected(true);
}else if(action.startsWith("t4mh")){
compression=action;
int q=quality;sliderQuality.setValue(100);quality=q;
sliderQuality.setEnabled(false);
buttonT4MH.setSelected(true);
}else if(action.startsWith("t4mr")){
compression=action;
int q=quality;sliderQuality.setValue(100);quality=q;
sliderQuality.setEnabled(false);
buttonT4MR.setSelected(true);
}else if(action.startsWith("t6mmr")){
compression=action;
int q=quality;sliderQuality.setValue(100);quality=q;
sliderQuality.setEnabled(false);
buttonT6MMR.setSelected(true);
}else if(action.startsWith("jpeg")){
compression=action;
sliderQuality.setValue(quality);
sliderQuality.setEnabled(true);
buttonJPEG.setSelected(true);
}else{
return false;
}
return true;
}
private boolean setSubSampling(String action){
if(action.equals("1:1:1")){
buttonSS111.setSelected(true);
subsampling=0x11;
}else if(action.equals("2:1:1")){
buttonSS211.setSelected(true);
subsampling=0x22;
}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(setPhotometricInterpretation(action)){
}else if(setCompression(action)){
}else if(setSubSampling(action)){
}else{
}
}
private JPanel getQualityPanel(){
sliderQuality=new JSlider(JSlider.HORIZONTAL,0,100,quality);
sliderQuality.addChangeListener(this);
sliderQuality.setEnabled(false);
sliderQuality.setMinorTickSpacing(2);
sliderQuality.setMajorTickSpacing(10);
sliderQuality.setPaintTicks(true);
Dictionary dict=new Hashtable();
for(int i=0;i<=100;i+=10){
dict.put(new Integer(i), new JLabel(Integer.toString(i)));
}
sliderQuality.setLabelTable(dict);
sliderQuality.setPaintLabels(true);
JPanel p=new JPanel();
p.setLayout(new BorderLayout());
p.setBorder(new TitledBorder(new EtchedBorder(),"JPEG Quality"));
p.add(sliderQuality,BorderLayout.CENTER);
return p;
}
public void stateChanged(ChangeEvent e){
JSlider slider=(JSlider)e.getSource();
if(!slider.getValueIsAdjusting()){
if(slider==sliderQuality){
quality=slider.getValue();
if(quality<=0){quality=1;slider.setValue(1);}
// System.err.println(quality);
}
}
}
public void display(){
try{
dialog=new JDialog((Frame)null,"TIFF Write Parameter 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 boolean activate(IIOParam param){
display();
try{
blocker.acquire();
}catch(InterruptedException ie){
return false;
}
if(cancelled){return false;}
TIFFImageWriteParam p=(TIFFImageWriteParam)param;
p.setCompressionType(compression);
p.setPhotometricInterpretation(pi);
p.setCompressionQuality(((float)quality)/100);
p.setSubSampling(subsampling);
return true;
}
}