package uk.co.mmscomputing.application.imageviewer;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import uk.co.mmscomputing.device.scanner.*;
import uk.co.mmscomputing.device.twain.*;
import uk.co.mmscomputing.device.sane.*;
public class ScannerTab extends ImageTab implements ScannerListener{
static private int no=1;
private Scanner scanner;
public ScannerTab(java.util.Properties properties){
super(properties);
}
protected void setButtonPanel(JPanel gui){
super.setButtonPanel(gui);
try{
scanner=Scanner.getDevice(); // get a device and set GUI panel up
if(scanner!=null){
gui.add(scanner.getScanGUI());
scanner.addListener(this);
if(scanner instanceof TwainScanner){
TwainIdentity[] list=((TwainScanner)scanner).getIdentities();
for(int i=0;i<list.length;i++){
System.out.println(list[i].toString());
}
}
}
}catch(Exception e){
System.out.println("9\b"+getClass().getName()+".setButtonPanel:\n\t"+e);
}
}
public void update(ScannerIOMetadata.Type type, final ScannerIOMetadata metadata){
if(type.equals(ScannerIOMetadata.ACQUIRED)){ // acquired BufferedImage
final BufferedImage image=metadata.getImage();// make reference copy here to avoid race condition
new Thread(){
public void run(){
try{
addImage("scan_"+(no++),image);
}catch(Exception e){
System.out.println("9\b"+getClass().getName()+".update:\n\t"+e);
System.err.println(getClass().getName()+".update:\n\t"+e);
e.printStackTrace();
}
}
}.start();
}else if(type.equals(ScannerIOMetadata.FILE)){ // acquired image as file (twain only for the time being)
final File file=metadata.getFile(); // make reference copy here to avoid race condition
new Thread(){
public void run(){
try{
open(file.getPath());
}catch(Exception e){
System.out.println("9\b"+getClass().getName()+".update:\n\t"+e);
System.err.println(getClass().getName()+".update:\n\t"+e);
e.printStackTrace();
}finally{
if(!file.delete()){
System.out.println("9\b"+getClass().getName()+".update:\n\tCould not delete: "+file.getPath());
System.err.println(getClass().getName()+".update:\n\tCould not delete: "+file.getPath());
}
}
}
}.start();
}else if(type.equals(ScannerIOMetadata.NEGOTIATE)){
negotiate(metadata);
}else if(type.equals(ScannerIOMetadata.STATECHANGE)){
System.out.println("Scanner State "+metadata.getStateStr());
System.err.println("Scanner State "+metadata.getStateStr());
if(metadata instanceof TwainIOMetadata){ // TWAIN only !
if(metadata.isState(TwainConstants.STATE_TRANSFERREADY)){ // state = 6
TwainSource source = ((TwainIOMetadata)metadata).getSource();
try{
TwainImageInfo imageInfo=new TwainImageInfo(source);
imageInfo.get();
System.out.println(imageInfo.toString());
}catch(Exception e){
System.out.println("3\b"+getClass().getName()+".update:\n\tCannot retrieve image information.\n\t"+e);
}
try{
TwainImageLayout imageLayout=new TwainImageLayout(source);
imageLayout.get();
System.out.println(imageLayout.toString());
}catch(Exception e){
System.out.println("3\b"+getClass().getName()+".update:\n\tCannot retrieve image layout.\n\t"+e);
}
}else if(metadata.isState(TwainConstants.STATE_TRANSFERRING)){ // state = 7
// In state 4: supportTwainExtImageInfo=source.getCapability(TwainConstants.ICAP_EXTIMAGEINFO).booleanValue();
TwainSource source = ((TwainIOMetadata)metadata).getSource();
try{
int[] tweis=new int[0x1240-0x1200];
for(int i=0;i<tweis.length;i++){tweis[i]=0x1200+i;}
TwainExtImageInfo imageInfo=new TwainExtImageInfo(source,tweis);
imageInfo.get();
System.out.println(imageInfo.toString());
}catch(Exception e){
System.out.println("3\b"+getClass().getName()+".update:\n\tCannot retrieve extra image information.\n\t"+e);
}
}
}
}else if(type.equals(ScannerIOMetadata.INFO)){
System.out.println(metadata.getInfo());
}else if(type.equals(ScannerIOMetadata.EXCEPTION)){
System.out.println("9\b"+metadata.getException().getMessage());
metadata.getException().printStackTrace();
}
}
private void negotiate(ScannerIOMetadata metadata){
/*
ScannerDevice sd=metadata.getDevice(); // SANE & TWAIN
try{
// sd.setShowUserInterface(false);
// sd.setShowProgressBar(false); // Twain: works only if user interface is inactive
sd.setResolution(100.0); // set resolution in dots per inch
// sd.setRegionOfInterest(20,40,600,400); // set region of interest to x,y,width,height in pixels
// sd.setRegionOfInterest(20.5,45.0,66.66,40.0); // set region of interest to x,y,width,height in millimeters
}catch(Exception e){
System.out.println("9\b"+e.getMessage());
// metadata.setCancel(true); // cancel scan if we can't set it up our way
}
*/
if(metadata instanceof TwainIOMetadata){ // TWAIN only!
TwainSource source=((TwainIOMetadata)metadata).getSource();
// Remember: We are in state 4 and in windows thread. Catch all exceptions!
/*
String[] names=TwainIdentity.getProductNames(); // let's see what data sources we have
for(int i=0;i<names.length;i++){
System.out.println(names[i]);
}
*/
/*
try{
TwainIdentity[] list=TwainIdentity.getIdentities();
for(int i=0;i<list.length;i++){
System.out.println(list[i].toString());
}
}catch(Exception e){
System.out.println("9\b"+e.getMessage());
}
*/
///*
try{
TwainCapability[] caps=source.getCapabilities(); // print out all the capabilities
for(int i=0;i<caps.length;i++){
System.out.println(caps[i].toString());
}
}catch(Exception e){
System.out.println("9\b"+e.getMessage());
}
//*/
/*
// use automatic document feeder, scan 5 pages
try{
int transferCount=5;
source.setCapability(TwainConstants.CAP_FEEDERENABLED,true);
source.setCapability(TwainConstants.CAP_AUTOFEED,true);
// source.setCapability(TwainConstants.CAP_AUTOSCAN,true);
// System.err.println(source.getCapability(TwainConstants.CAP_AUTOSCAN).toString());
source.setCapability(TwainConstants.CAP_XFERCOUNT,transferCount);
transferCount=source.getCapability(TwainConstants.CAP_XFERCOUNT).intValue();
System.err.println("set transferCount: "+transferCount);
}catch(Exception e){
System.out.println("9\bCAP_FEEDERENABLED/CAP_AUTOFEED/CAP_XFERCOUNT: "+e.getMessage());
// metadata.setCancel(true); // negotiation failed let's try to abort scan
}
*/
/*
try{
// source.setXferMech(TwainConstants.TWSX_NATIVE); // send image as BufferedImage (default)
// source.setXferMech(TwainConstants.TWSX_MEMORY); // send image as byte[] blocks (not implemented here yet)
source.setXferMech(TwainConstants.TWSX_FILE); // send image as file
// source.setImageFileFormat(TwainConstants.TWFF_BMP); // set file format to bmp (must be supported by all sources)
source.setImageFileFormat(TwainConstants.TWFF_JFIF); // set file format to jpeg
// source.setImageFileFormat(TwainConstants.TWFF_TIFF); // set file format to tiff if supported otherwise use last settings
// i.e. source's default. The default does not have to be bmp!
System.out.println();
System.out.println(source.getCapability(TwainConstants.ICAP_XFERMECH).toString());
System.out.println(source.getCapability(TwainConstants.ICAP_IMAGEFILEFORMAT).toString());
System.out.println();
}catch(Exception e){
System.out.println("9\bTransfer Mechanism : "+e.getMessage());
}
*/
/*
try{
System.err.println("Test BitDepth");
source.setCapability(TwainConstants.ICAP_PIXELTYPE,TwainConstants.TWPT_GRAY);
System.err.println(source.getCapability(TwainConstants.ICAP_PIXELTYPE).toString());
System.err.println(source.getCapability(TwainConstants.ICAP_BITDEPTH).toString());
source.setCapability(TwainConstants.ICAP_BITDEPTH,4);
System.err.println(source.getCapability(TwainConstants.ICAP_BITDEPTH).toString());
}catch(Exception e){
System.out.println("9\bPixel Type: "+e.getMessage());
}
*/
/*
try{ // set Black/White aka Lineart
source.setCapability(TwainConstants.ICAP_PIXELTYPE,TwainConstants.TWPT_BW);
System.out.println(source.getCapability(TwainConstants.ICAP_PIXELTYPE).toString());
}catch(Exception e){
System.out.println("9\bPixel Type: "+e.getMessage());
}
*/
/*
try{
int TWSS_NONE = 0;
int TWSS_A4LETTER = 1;
int TWSS_USLETTER = 3;
int TWSS_USLEGAL = 4;
TwainCapability tc=source.getCapability(TwainConstants.ICAP_SUPPORTEDSIZES);
if(tc.querySupport(TwainConstants.TWQC_SET)){ // is set operation allowed
System.out.println(tc.toString());
tc.setCurrentValue(TWSS_A4LETTER);
System.out.println(source.getCapability(TwainConstants.ICAP_SUPPORTEDSIZES).toString());
}
}catch(Exception e){
System.out.println("9\bPaper Sizes: "+e.getMessage());
}
*/
}
/*
if(metadata instanceof TwainIOMetadata){ // TWAIN only!
TwainSource source=((TwainIOMetadata)metadata).getSource();
try{ // set Black/White aka Lineart
source.setCapability(TwainConstants.ICAP_PIXELTYPE,TwainConstants.TWPT_BW);
System.out.println(source.getCapability(TwainConstants.ICAP_PIXELTYPE).toString());
source.setCapability(TwainConstants.ICAP_THRESHOLD,40.0);
System.out.println(source.getCapability(TwainConstants.ICAP_THRESHOLD).toString());
}catch(Exception e){
System.out.println("9\bPixel Type: "+e.getMessage());
}
}
*/
/*
if(metadata instanceof TwainIOMetadata){ // TWAIN only!
TwainSource source=((TwainIOMetadata)metadata).getSource();
try{
source.setCapability(TwainConstants.ICAP_PIXELTYPE,TwainConstants.TWPT_GRAY);
System.out.println(source.getCapability(TwainConstants.ICAP_PIXELTYPE).toString());
source.setCapability(TwainConstants.ICAP_AUTOBRIGHT,false);
System.out.println(source.getCapability(TwainConstants.ICAP_AUTOBRIGHT).toString());
source.setCapability(TwainConstants.ICAP_BRIGHTNESS,-800.0);
System.out.println(source.getCapability(TwainConstants.ICAP_BRIGHTNESS).toString());
// source.setCapability(TwainConstants.ICAP_CONTRAST,500);
// System.out.println(source.getCapability(TwainConstants.ICAP_CONTRAST).toString());
}catch(Exception e){
System.out.println("9\bPixel Type: "+e.getMessage());
}
}
*/
}
public void stop(){ // execute before System.exit
if(scanner!=null){ // make sure user waits for scanner to finish!
scanner.waitToExit();
}
}
}