package uk.co.mmscomputing.device.sane.gui;
import java.util.HashMap;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.beans.EventHandler;
import uk.co.mmscomputing.util.JarImageIcon;
import uk.co.mmscomputing.concurrent.Semaphore;
import uk.co.mmscomputing.device.sane.*;
import uk.co.mmscomputing.device.sane.option.*;
public class SaneAcquirePanel extends JPanel implements WindowListener{
static private String previewtabstr = jsane.getResource("gui.SaneAcquirePanel.previewtabstr");
static private String previewbutstr = jsane.getResource("gui.SaneAcquirePanel.previewbutstr");
static private String scanstr = jsane.getResource("gui.SaneAcquirePanel.scanstr");
static private String cancelstr = jsane.getResource("gui.SaneAcquirePanel.cancelstr");
static private String progressbartitlestr = jsane.getResource("gui.SaneAcquirePanel.progressbartitlestr");
static private String acquireframetitlestr = jsane.getResource("gui.SaneAcquirePanel.acquireframetitlestr");
private JFrame dialog;
private SaneDevice scanner;
private SanePreviewPanel preview;
private SaneSpecialPanel special;
private JTabbedPane tp;
private HashMap options;
private Semaphore semaphore;
public SaneAcquirePanel(SaneDevice device,Semaphore s)throws SaneIOException{
this.dialog=null;
this.scanner=device;
this.semaphore=s;
options=new HashMap();
setLayout(new BorderLayout());
tp=new JTabbedPane();
buildTab();
add(tp,BorderLayout.CENTER);
JPanel p=new JPanel();
p.setLayout(new BorderLayout());
JProgressBar pbar=new JProgressBar();
pbar.setBorder(new TitledBorder(progressbartitlestr));
pbar.setStringPainted(true);
pbar.setMinimum(0);
pbar.setString(device.getName());
p.add(pbar,BorderLayout.CENTER);
device.setProgressBar(pbar);
JPanel bp=new JPanel();
bp.setLayout(new GridLayout(1,3));
JButton button;
button=new JButton(previewbutstr,new JarImageIcon(getClass(),"16x16/scanner.png"));
button.addActionListener((ActionListener)EventHandler.create(ActionListener.class, this, "preview"));
bp.add(button);
button=new JButton(scanstr);
button.addActionListener((ActionListener)EventHandler.create(ActionListener.class, this, "scan"));
bp.add(button);
button=new JButton(cancelstr);
button.addActionListener((ActionListener)EventHandler.create(ActionListener.class, this, "cancelScan"));
bp.add(button);
p.add(bp,BorderLayout.SOUTH);
add(p,BorderLayout.SOUTH);
}
private void close(){ semaphore.release();}
public void scan(){ dialog.dispose();}
public void cancelScan(){ scanner.setCancel(true); dialog.dispose();}
public void preview(){ new Thread(preview).start();} // start reading image data into preview panel
private int build(JTabbedPane parent, OptionDescriptor[] list, int no, boolean group){
while(no<list.length){
Descriptor od=(Descriptor)list[no];
if(od!=null){
if(od.getType()==SaneConstants.SANE_TYPE_GROUP){
if(group){
return no-1;
}else{
JTabbedPane tp=new JTabbedPane();
no=build(tp,list,no+1,true);
if(tp.getTabCount()>0){
parent.addTab(od.getTitle(),tp);
}
}
}else{
try{
JComponent gui=od.getGUI();
options.put(od.getName(),od);
parent.addTab(od.getTitle(),gui);
}catch(Exception e){ // silently ignore broken options
// System.err.println("Cannot create option : "+od.getName()+"\n"+e.getMessage());
e.printStackTrace();
}
}
}
no++;
}
return no;
}
public void buildTab(){
tp.removeAll();
try{
build(tp,scanner.getOptionDescriptors(),1,false);
}catch(Exception e){
// System.out.println("9\b"+getClass().getName()+".build:\n\t"+e);
e.printStackTrace();
}
special=new SaneSpecialPanel(scanner,options);
tp.insertTab("jsane-Special",null,special,null,0);
preview=new SanePreviewPanel(scanner,options);
tp.insertTab(previewtabstr,null,preview,null,0);
tp.setSelectedIndex(0);
}
// start window listener methods
public void windowOpened(WindowEvent e){}
public void windowClosing(WindowEvent e){scanner.setCancel(true);}
public void windowClosed(WindowEvent e){close();}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
// end window listener methods
public void display(){
dialog=new JFrame(acquireframetitlestr);
dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
dialog.getContentPane().add(this);
dialog.addWindowListener(this);
dialog.setSize(400,500);
// dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
}