package com.rfsee.view;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import com.rfsee.models.RFCCatalog;
import java.util.Set;
import com.rfsee.services.RFCService;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.border.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
public class RFSee extends JFrame implements ActionListener,
TreeSelectionListener {
/**
* @author ff
*/
private static final long serialVersionUID = 1L;
RFCService rfcService;
JTree jtCatalog;
JFileChooser jfc;
JToolBar jtbNavigator;
JLabel jlPageNav;
JTextArea jtaContent;
JLabel jlLineNumber;
DefaultMutableTreeNode catalogRoot;
public RFSee() {
super();
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JMenu jmFile = new JMenu("File");
JMenuItem jmiOpen = new JMenuItem("Open");
jmiOpen.setActionCommand("Open");
jmiOpen.addActionListener(this);
JMenuItem jmiClose = new JMenuItem("Close");
jmiClose.setActionCommand("Close");
jmiClose.addActionListener(this);
JMenuItem jmiExit = new JMenuItem("Exit");
jmiExit.setActionCommand("Exit");
jmiExit.addActionListener(this);
jmFile.add(jmiOpen);
jmFile.add(jmiClose);
jmFile.add(jmiExit);
JMenuBar jmb = new JMenuBar();
jmb.add(jmFile);
this.setJMenuBar(jmb);
this.setLayout(new BorderLayout());
jtbNavigator = new JToolBar();
this.add(jtbNavigator, BorderLayout.NORTH);
catalogRoot = new DefaultMutableTreeNode();
jtCatalog = new JTree(catalogRoot);
jtCatalog.addTreeSelectionListener(this);
JScrollPane jspCatalog = new JScrollPane(jtCatalog);
jspCatalog.setPreferredSize(new Dimension(200, 500));
this.add(jspCatalog, BorderLayout.WEST);
Font font=new Font(Font.MONOSPACED, Font.PLAIN, 12);
jtaContent = new JTextArea();
jtaContent.setFont(font);
jtaContent.setBorder(new LineBorder(Color.BLACK));
jtaContent.setText("welcome to use rfsee");
jlLineNumber=new JLabel();
jlLineNumber.setVerticalAlignment(JLabel.TOP);
jlLineNumber.setFont(font);
JPanel jpContent=new JPanel(new BorderLayout());
jpContent.setBorder(jtaContent.getBorder());
jtaContent.setBorder(null);
jpContent.add(jlLineNumber,BorderLayout.WEST);
jpContent.add(jtaContent,BorderLayout.CENTER);
JScrollPane jspContent = new JScrollPane(jpContent);
jspContent.setPreferredSize(new Dimension(300, 500));
this.add(jspContent, BorderLayout.CENTER);
JToolBar jtbStatus = new JToolBar();
JLabel jlStatus = new JLabel("Status");
JButton jbNext=new JButton("Next");
jbNext.addActionListener(this);
jbNext.setActionCommand("NextPage");
jlPageNav=new JLabel("0/0");
JButton jbPrev=new JButton("Prev");
jbPrev.addActionListener(this);
jbPrev.setActionCommand("PrevPage");
jtbStatus.add(jlStatus);
jtbStatus.add(jbPrev);
jtbStatus.add(jlPageNav);
jtbStatus.add(jbNext);
jfc = new JFileChooser();
jfc.setSelectedFile(new File("R:/book/rfc/."));
this.add(jtbStatus, BorderLayout.SOUTH);
this.pack();
this.setVisible(true);
init();
}
void init() {
rfcService = new RFCService();
}
public void actionPerformed(ActionEvent ae) {
try {
if (ae.getActionCommand().equals("Open")) {
int state = jfc.showOpenDialog(this);
if (state == JFileChooser.APPROVE_OPTION)
go(rfcService.loadRFC(jfc.getSelectedFile(), this));
updateTabs();
}else if (ae.getActionCommand().equals("switch")) {
go((JButton)ae.getSource());
}else if(ae.getActionCommand().equals("NextPage")){
jump(rfcService.getCurrentPageNumber()+1);
}else if(ae.getActionCommand().equals("PrevPage")){
jump(rfcService.getCurrentPageNumber()-1);
}else if(ae.getActionCommand().equals("Close")){
jtbNavigator.remove(rfcService.close());
updateCatalog(rfcService.getCatalog());
jump(rfcService.getCurrentPageNumber());
}else if(ae.getActionCommand().equals("Exit")){
this.dispose();
}
} catch (IOException e) {
JOptionPane.showMessageDialog(this, "file error");
}
}
private void go(JButton tab) {
rfcService.go(tab);
updateCatalog(rfcService.getCatalog());
jump(rfcService.getCurrentPageNumber());
}
private void updateCatalog(RFCCatalog rfcCatalog) {
catalogRoot.removeAllChildren();
DefaultMutableTreeNode tempRoot = generateCatalog(rfcCatalog);
while (tempRoot.getChildCount() != 0) {
DefaultMutableTreeNode child = (DefaultMutableTreeNode) tempRoot
.getFirstChild();
catalogRoot.add(child);
}
catalogRoot.setUserObject(tempRoot.getUserObject());
jtCatalog.treeDidChange();
jtCatalog.updateUI();
}
private void jump(int i){
try{
updateContent(rfcService.getPage(i));
jlPageNav.setText(rfcService.getCurrentPageNumber()+"/"+rfcService.getTotalPageNumber());
} catch (IOException e){
JOptionPane.showMessageDialog(this, "file error");
}
}
private void updateContent(String content) {
jtaContent.setText(content);
int lineCount=rfcService.getLineCount();
StringBuffer sb=new StringBuffer("<html>");
for(int i=1;i<=lineCount;i++)
sb.append(i+"<br/>");
sb.append("</html>");
jlLineNumber.setText(sb.toString());
}
private DefaultMutableTreeNode generateCatalog(RFCCatalog catalog) {
RFCCatalog[] child = catalog.getChildCatalog();
DefaultMutableTreeNode parent = new DefaultMutableTreeNode(catalog,
child != null);
if (child != null)
for (int i = 0; i < child.length; i++) {
parent.add(generateCatalog(child[i]));
}
return parent;
}
private void updateTabs() {
jtbNavigator.removeAll();
Set<JButton> tabs = rfcService.getTabs();
for (JButton tab : tabs) {
jtbNavigator.add(tab);
}
}
public void valueChanged(TreeSelectionEvent tse) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) jtCatalog
.getLastSelectedPathComponent();
RFCCatalog rfcc = (RFCCatalog) node.getUserObject();
if (rfcc == null)return;
jump(rfcc.getPageNumber());
}
public static void main(String[] args) {
new RFSee();
}
}