package org.irmacard.personalisation;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import java.util.ResourceBundle;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import java.util.Properties;
import javax.swing.JSplitPane;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class IrmaWriter {
private static final ResourceBundle BUNDLE = ResourceBundle.getBundle("org.irmacard.personalisation.messages"); //$NON-NLS-1$
private JFrame frame;
private Vector<Card> cards;
private int selectedCard = 0;
private ImageIcon noCardImage;
private JLabel lblInfo;
private JLabel lblImage;
private JLabel lblCardNumber;
private DefaultListModel cardsListModel;
private JList cardsList;
private JLabel lblPersonalisedWarning;
private JProgressBar progressBar;
private JButton btnWriteButton;
private JButton btnSkip;
private JSeparator separator;
private JButton btnClear;
private Properties config;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
IrmaWriter window = null;
try {
passwordDialog pwDialog = new passwordDialog(null);
Properties config = pwDialog.showDialog();
if(config != null) {
window = new IrmaWriter(config);
if(window.frame != null) {
window.frame.setVisible(true);
}
}
else {
System.exit(0);
}
} catch (Exception e) {
if(window!=null && window.frame != null) {
window.error(e);
}
else {
JOptionPane.showMessageDialog(null, BUNDLE.getString("IrmaWriter.lblInfo.error"));
e.printStackTrace();
}
}
}
});
}
/**
* Create the application.
*/
public IrmaWriter(Properties config) {
this.config = config;
initialize();
try {
cards = DatabaseConnection.loadFromPrinterCards(config);
} catch (Exception e) {
error(e, BUNDLE.getString("IrmaWriter.lblInfo.cardLoadError"));
}
if(cards != null) {
fillCardList();
showCard();
if(cards.size() == 0) {
lblInfo.setText(BUNDLE.getString("IrmaWriter.lblInfo.nocards"));
}
}
}
private void fillCardList() {
for(Card card : cards) {
cardsListModel.addElement(card.getCardId());
}
}
/**
* Initialize the contents of the frame.
* @wbp.parser.entryPoint
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 619, 411);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
JScrollPane scrollPane = new JScrollPane();
JPanel rightPanel = new JPanel();
rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS));
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, scrollPane, rightPanel);
cardsListModel = new DefaultListModel();
cardsList = new JList(cardsListModel);
cardsList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent arg0) {
selectedCard = cardsList.getSelectedIndex();
showCard();
}
});
cardsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
scrollPane.setViewportView(cardsList);
JLabel lblCards = new JLabel(BUNDLE.getString("IrmaWriter.lblCards.text")); //$NON-NLS-1$
scrollPane.setColumnHeaderView(lblCards);
lblInfo = new JLabel();
lblInfo.setAlignmentX(Component.CENTER_ALIGNMENT);
rightPanel.add(lblInfo);
JLabel lblScanNext = new JLabel(BUNDLE.getString("IrmaWriter.lblScanNext.text"));
lblScanNext.setAlignmentX(Component.CENTER_ALIGNMENT);
rightPanel.add(lblScanNext);
noCardImage = new ImageIcon(getClass().getResource("/resources/nophoto.png"));
lblImage = new JLabel(noCardImage);
lblImage.setAlignmentX(Component.CENTER_ALIGNMENT);
lblImage.setSize(128, 256);
lblImage.setBorder(BorderFactory.createLineBorder(SystemColor.windowBorder));
rightPanel.add(lblImage);
lblCardNumber = new JLabel();
lblCardNumber.setAlignmentX(Component.CENTER_ALIGNMENT);
rightPanel.add(lblCardNumber);
btnWriteButton = new JButton(BUNDLE.getString("IrmaWriter.btnWriteButton.text"));
btnWriteButton.setAlignmentX(Component.CENTER_ALIGNMENT);
btnWriteButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
final CardWriter writer = new CardWriter(config);
writer.addObserver(new Observer(){
@Override
public void update(Observable arg0, Object arg1) {
progressBar.setValue(writer.getProgress());
}
});
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
try {
setAllEnabled(false);
writer.Write(cards.get(selectedCard));
nextCard();
lblInfo.setText(BUNDLE.getString("IrmaWriter.lblInfo.writeSuccess"));
} catch (Exception e) {
progressBar.setValue(0);
error(e, BUNDLE.getString("IrmaWriter.lblInfo.writeCardError"));
}
finally {
setAllEnabled(true);
}
}
});
thread.start();
} catch (Exception e) {
error(e, BUNDLE.getString("IrmaWriter.lblInfo.writeCardError"));
}
}
});
lblPersonalisedWarning = new JLabel(BUNDLE.getString("IrmaWriter.lblPersonalisedWarning.text"));
lblPersonalisedWarning.setVisible(false);
lblPersonalisedWarning.setAlignmentX(Component.CENTER_ALIGNMENT);
rightPanel.add(lblPersonalisedWarning);
rightPanel.add(btnWriteButton);
btnSkip = new JButton(BUNDLE.getString("IrmaWriter.btnSkip.text"));
btnSkip.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
nextCard();
}
});
btnSkip.setAlignmentX(Component.CENTER_ALIGNMENT);
rightPanel.add(btnSkip);
progressBar = new JProgressBar();
rightPanel.add(progressBar);
separator = new JSeparator();
rightPanel.add(separator);
btnClear = new JButton(BUNDLE.getString("IrmaWriter.btnClear.text")); //$NON-NLS-1$
btnClear.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
setAllEnabled(false);
CardWriter.clearCard();
lblInfo.setText(BUNDLE.getString("IrmaWriter.lblInfo.clearSuccess"));
} catch (Exception e) {
error(e, BUNDLE.getString("IrmaWriter.lblInfo.clearError"));
}
finally {
setAllEnabled(true);
}
}
});
rightPanel.add(btnClear);
frame.getContentPane().add(splitPane);
}
private void showCard() {
if(selectedCard >= 0 && selectedCard < cards.size()) {
lblInfo.setText("");
Card card = cards.get(selectedCard);
lblImage.setIcon(new ImageIcon(card.getPhoto()));
lblCardNumber.setText(card.getCardId());
lblPersonalisedWarning.setVisible(card.isPersonalised());
if(card.isPersonalised()) {
progressBar.setValue(100);
}
else {
progressBar.setValue(0);
}
cardsList.setSelectedIndex(selectedCard);
}
else {
lblImage.setIcon(noCardImage);
lblCardNumber.setText(BUNDLE.getString("IrmaWriter.lblCardNumber.noCardSelected"));
lblPersonalisedWarning.setVisible(false);
cardsList.clearSelection();
}
}
private void nextCard() {
selectedCard++;
if(selectedCard >= cards.size()) {
lblInfo.setText(BUNDLE.getString("IrmaWriter.lblInfo.allCardsDone"));
}
showCard();
}
private void setAllEnabled(boolean enabled) {
btnClear.setEnabled(enabled);
btnSkip.setEnabled(enabled);
btnWriteButton.setEnabled(enabled);
cardsList.setEnabled(enabled);
}
private void error(Exception e) {
error(e, BUNDLE.getString("IrmaWriter.lblInfo.error"));
}
private void error(Exception e, String message) {
lblInfo.setText(message);
e.printStackTrace();
Logger.log(message, e);
}
}