package notepad;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.awt.datatransfer.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.undo.*;
import java.text.*;
public class NotePad extends JFrame implements ActionListener{
// 工作区
JTextArea note;
// 菜单工具条
JMenuBar menuBar = new JMenuBar();
// 文本框滑块
JScrollPane jScrollPane;
// 初始化 文件 菜单
JMenu file = new JMenu("文件(F)");
JMenuItem build = new JMenuItem("新建(N)");
JMenuItem open = new JMenuItem("打开(O)");
JMenuItem save = new JMenuItem("保存(S)");
JMenuItem reSave = new JMenuItem("另存为(A)");
JMenuItem quit = new JMenuItem("退出(X)");
JMenuItem setPage = new JMenuItem("页面设置(U)");
JMenuItem print = new JMenuItem("打印(P)");
// 初始化 编辑 菜单
JMenu edit = new JMenu("编辑(E)");
JMenuItem retract = new JMenuItem("撤销(U)");
JMenuItem copy = new JMenuItem("复制(C)");
JMenuItem cut = new JMenuItem("剪切(T)");
JMenuItem paste = new JMenuItem("粘贴(P)");
JMenuItem delete = new JMenuItem("删除(L)");
JMenuItem find = new JMenuItem("查找(F)");
JMenuItem findNext = new JMenuItem("查找下一个(N)");
JMenuItem replace = new JMenuItem("替换(R)");
JMenuItem goTo = new JMenuItem("转到(G)");
JMenuItem selectAll = new JMenuItem("全选(A)");
JMenuItem dateAndTime = new JMenuItem("时间/日期(D)");
// 初始化 格式 菜单
JMenu format = new JMenu("格式(O)");
JCheckBoxMenuItem wrap = new JCheckBoxMenuItem("自动换行(W)", false);
JMenuItem font = new JMenuItem("字体(F)");
// 初始化 查看 菜单
JMenu view = new JMenu("查看(V)");
JCheckBoxMenuItem status = new JCheckBoxMenuItem("状态栏(S)", false);
// 初始化 帮助 菜单
JMenu help = new JMenu("帮助(H)");
JMenuItem title = new JMenuItem("帮助主题(H)");
JMenuItem about = new JMenuItem("关于记事本(A)");
// 右键菜单和菜单项
JPopupMenu popupMenu = new JPopupMenu();
JMenuItem popRetract = new JMenuItem("撤销(U)");
JMenuItem popCut = new JMenuItem("剪切(T)");
JMenuItem popCopy = new JMenuItem("复制(C)");
JMenuItem popPaste = new JMenuItem("粘贴(P)");
JMenuItem popSelectAll = new JMenuItem("全选(A)");
JMenuItem popDelete = new JMenuItem("删除(D)");
// 获取java中提供的类似剪切板的工具
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
// 是否已经为文本文件命名
boolean isTitled;
// 文件名
String fileName = "无标题";
// 文件路径
String filePath = null;
// 文件打开 保存对话框
JFileChooser fileChooser = new JFileChooser();
// 文件信息的散列值,用来判断文件是否被修改过
int hashCode = -1;
// //// 外部窗口窗口及其附带属性/////////////////
FindDlg findDlg;
ReplaceDlg replaceDlg;
GoToDlg goToDlg;
FontDlg fontDlg;
String findKey = ""; // 查找的字符串
boolean ignoreCase = true;// 是否忽略大小写,默认忽略
boolean isUp; // 查找方向,默认向下
int mileStone; // 查找到的位置记录
boolean isFirstCall;
// //////////////////////////////////////
//模拟状态栏
JPanel statusBar;
JTextField tfStatus;
//为撤销功能做缓存功能的字符串数组
String str1 = "";
String str2 = "";
//String retractStr[] = new String[10];
int retractNum = 0;//撤销次数
// 热键
KeyStroke ks;
/**
* 构造函数
*/
public NotePad() {
setSize(600, 500);
//设置窗口标题
setTitle(fileName + "-记事本");
//初始化窗口
initComponents();
//窗口关闭事件
this.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
onWindowClosing();
}
}
);
// 显示窗口
setSize(900, 700);
setVisible(true);
}
public void onWindowClosing(){
String strTemp = note.getText();
// 新建的文件
if (!isTitled) {
// 文件不为空,没有保存,退出时询问是否保存
if (strTemp.length() != 0) {
int isExit = JOptionPane.showConfirmDialog(null, "文件 "
+ fileName + " 的文字已经改变,想保存文件吗 ?", "记事本",
JOptionPane.YES_NO_CANCEL_OPTION);
if (isExit == JOptionPane.YES_OPTION) {
int result = fileChooser.showSaveDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
writeFile(file);
System.exit(0);
}
} else if (isExit == JOptionPane.NO_OPTION) {
System.exit(0);
} else
return;
}
// 新建的文件,但是文件内容为空,直接退出
else if (strTemp.length() == 0) {
System.exit(0);
}
}
// 打开的文件
else if (isTitled) {
int newHashCode = 0;
String fileContent = note.getText();
newHashCode = fileContent.hashCode();
// 从散列值判断文件被修改过,退出时询问是否保存
if (hashCode != newHashCode) {
int isExit = JOptionPane.showConfirmDialog(null, "文件 "
+ filePath + " 的文字已经改变,想保存文件吗 ?", "记事本",
JOptionPane.YES_NO_CANCEL_OPTION);
if (isExit == JOptionPane.YES_OPTION) {
int result = fileChooser.showSaveDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
File fileToSave = fileChooser.getSelectedFile();
writeFile(fileToSave);
System.exit(0);
}
} else if (isExit == JOptionPane.NO_OPTION) {
System.exit(0);
} else
return;
}
// 散列值相同,文件没有被修改过,直接退出
else {
System.exit(0);
}
}
}
/**
* 初始化窗口
*/
public void initComponents() {
// 添加 文件 菜单
file.setMnemonic('F');
build.setMnemonic('E');
open.setMnemonic('O');
save.setMnemonic('S');
reSave.setMnemonic('A');
setPage.setMnemonic('U');
print.setMnemonic('P');
quit.setMnemonic('X');
ks = KeyStroke.getKeyStroke(KeyEvent.VK_N, Event.CTRL_MASK);
build.setAccelerator(ks);
file.add(build);
ks = KeyStroke.getKeyStroke(KeyEvent.VK_O, Event.CTRL_MASK);
open.setAccelerator(ks);
file.add(open);
ks = KeyStroke.getKeyStroke(KeyEvent.VK_S, Event.CTRL_MASK);
save.setAccelerator(ks);
file.add(save);
file.add(reSave);
file.addSeparator();
file.add(setPage);
ks = KeyStroke.getKeyStroke(KeyEvent.VK_P, Event.CTRL_MASK);
print.setAccelerator(ks);
file.add(print);
file.addSeparator();
file.add(quit);
// 添加 编辑菜单
edit.setMnemonic('E');
ks = KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.CTRL_MASK);
retract.setAccelerator(ks);
retract.setMnemonic('U');
ks = KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.CTRL_MASK);
cut.setAccelerator(ks);
cut.setMnemonic('T');
ks = KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK);
copy.setAccelerator(ks);
copy.setMnemonic('C');
ks = KeyStroke.getKeyStroke(KeyEvent.VK_V, Event.CTRL_MASK);
paste.setAccelerator(ks);
paste.setMnemonic('P');
ks = KeyStroke.getKeyStroke("DELETE");
delete.setAccelerator(ks);
delete.setMnemonic('L');
ks = KeyStroke.getKeyStroke(KeyEvent.VK_F, Event.CTRL_MASK);
find.setAccelerator(ks);
find.setMnemonic('F');
ks = KeyStroke.getKeyStroke("F3");
findNext.setAccelerator(ks);
findNext.setMnemonic('N');
ks = KeyStroke.getKeyStroke(KeyEvent.VK_H, Event.CTRL_MASK);
replace.setAccelerator(ks);
replace.setMnemonic('R');
ks = KeyStroke.getKeyStroke(KeyEvent.VK_G, Event.CTRL_MASK);
goTo.setAccelerator(ks);
goTo.setMnemonic('G');
ks = KeyStroke.getKeyStroke(KeyEvent.VK_A, Event.CTRL_MASK);
selectAll.setAccelerator(ks);
selectAll.setMnemonic('A');
ks = KeyStroke.getKeyStroke("F5");
dateAndTime.setAccelerator(ks);
dateAndTime.setMnemonic('D');
edit.add(retract);
edit.addSeparator();
edit.add(cut);
edit.add(copy);
edit.add(paste);
edit.add(delete);
edit.addSeparator();
edit.add(find);
edit.add(findNext);
edit.add(replace);
edit.add(goTo);
edit.addSeparator();
edit.add(selectAll);
edit.add(dateAndTime);
// 添加 格式 菜单
format.setMnemonic('O');
ks = KeyStroke.getKeyStroke(KeyEvent.VK_W, Event.CTRL_MASK);
wrap.setAccelerator(ks);
wrap.setMnemonic('W');
font.setMnemonic('F');