package org.fanhongtao.tools.recordviewer;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
/**
* 话单读取器,实现快速查看话单字段的值及对应的含义
*
* @author Dharma
* @created 2009-5-6
*/
public class RecordViewer
{
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception
{
ViewerFrame frame = new ViewerFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class ViewerFrame extends JFrame
{
private static final long serialVersionUID = 1L;
private static final String TITLE = "Record Viewer";
private JTextArea textArea;
private JTextArea resultArea;
private JPanel buttonPanel;
private RecordInfo info;
public ViewerFrame()
{
setTitle(TITLE);
setSize(600, 400);
buttonPanel = new JPanel();
add(buttonPanel, BorderLayout.SOUTH);
JButton btnParse = new JButton("Parse");
buttonPanel.add(btnParse);
btnParse.setMnemonic(java.awt.event.KeyEvent.VK_P);
btnParse.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
parseRecord();
}
});
JButton btnChoose = new JButton("Choose");
buttonPanel.add(btnChoose);
btnChoose.setMnemonic(java.awt.event.KeyEvent.VK_C);
btnChoose.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
chooseXML();
}
});
textArea = new JTextArea(8, 40);
JScrollPane scrollPane = new JScrollPane(textArea);
resultArea = new JTextArea(8, 40);
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollPane, resultArea);
add(splitPane, BorderLayout.CENTER);
}
private void chooseXML()
{
String fileName = "record.xml";
FileNameExtensionFilter filter = new FileNameExtensionFilter("XML file (.xml)", "xml");
JFileChooser chooser = new JFileChooser();
chooser.addChoosableFileFilter(filter);
chooser.setCurrentDirectory(new File("."));
int result = chooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION)
{
fileName = chooser.getSelectedFile().getAbsolutePath();
info = readFromXml(fileName);
}
}
/**
* 从XML文件中读取话单格式
* @param xmlFileName XML文件名
* @return
*/
private RecordInfo readFromXml(String xmlFileName)
{
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser saxParser;
try
{
saxParser = factory.newSAXParser();
File file = new File(xmlFileName);
RecordHandler handler = new RecordHandler();
saxParser.parse(file, handler);
RecordInfo info = handler.getInfo();
setTitle(TITLE + " - " + info.getDescription());
return info;
}
catch (Exception e)
{
JOptionPane.showMessageDialog(this, "Failed to read xml " + xmlFileName + "\n" + e.getMessage());
return null;
}
}
/**
* 解析在文本框中输入的话单
*/
private void parseRecord()
{
if (info == null)
{
info = readFromXml("record.xml");
if (info == null)
{
return;
}
}
String record = textArea.getText().trim();
if (record.length() == 0)
{
return;
}
StringBuffer resultBuf = new StringBuffer();
String[] fields = record.split(info.getFieldSep());
for (int i = 0; i < fields.length; i++)
{
resultBuf.append(info.getFieldTitle(i));
resultBuf.append('\t');
resultBuf.append(info.getFieldValue(i, fields[i]));
resultBuf.append('\n');
}
resultArea.setText(resultBuf.toString());
}
}