package mynotepad;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.*;
import java.awt.print.PrinterException;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
import javax.swing.event.*;
import javax.swing.undo.*;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
//import setfont.SetFont;
class DaveNotepad extends JFrame implements ActionListener, DocumentListener,
MouseListener, Transferable {
/**本程序实现一个记事本编辑器,所有的功能都和XP系统自带的记事本基本一样,多出了工具栏等一些东西
*
*/
private static final long serialVersionUID = 3056169543548771920L;
/*##########################以下为变量的定义###############################*/
File file = null;//当前文件
boolean isNewfile = true;//指示是否为新文件
String oldValue; //存放编辑区原来的内容,用于比较文本是否有改动
JFileChooser filechooser = new JFileChooser(); //文件选择框
JMenuBar mb = new JMenuBar(); //菜单条
JMenu mf, me, mo, mh;//菜单文件、编辑、格式、帮助
JMenuItem mi1, mi2, mi3, mi4, mi5, mi6, mi7; //文件菜单项
JMenuItem me1, me12, me2, me3, me4, me5, me6, me7, me8, me9, me10, me11;//编辑菜单项
JMenuItem mo1, mo2; //格式菜单项
JMenuItem mh1, mh2;//帮助菜单项
JToolBar tbar = new JToolBar();//工具条
JButton bt_save, bt_new, bt_open, bt_cut, bt_copy, bt_paste, bt_undo,
bt_redo, bt_bold, bt_underline, bt_italic; //工具条上的按钮
JLabel fontlabel;//工具条上的字体标签
JLabel sizelabel;//工具条上的字号标签
JLabel statusLabel;//状态栏标签
JPopupMenu popupMenu;//右键菜单
JMenuItem popupMenu_Undo, popupMenu_Redo, popupMenu_Cut, popupMenu_Copy,
popupMenu_Paste, popupMenu_Delete, popupMenu_SelectAll;
UndoManager undo = new UndoManager(); // 撤消管理器
Font defaultFont = new Font("宋体", Font.PLAIN, 15);//默认字体
String fontname; //用于工具栏中文字的字体设置选项,获取用户选择的字体型
int fontsize; //用于工具栏中文字的字号设置选项,获取用户选择的字号大小
JTextArea tex = new JTextArea(); //文本域
//创建系统剪贴板
Toolkit toolKit = Toolkit.getDefaultToolkit();
Clipboard clipBoard = toolKit.getSystemClipboard();
public JButton fontOkButton; //字体设置里的"确定"按钮
/*################构造方法##############################*/
public DaveNotepad() {
super("Dave's Notepad");
tex.setFont(defaultFont);//设置编辑区默认的字体
//$$$$$$$$$$$$$$以下为菜单的建立$$$$$$$$$$$$$$$$$
mb.setOpaque(false); //设置透明
mb.setBorderPainted(true);//设置边框的可见性
mf = new JMenu("文件(F)", true); //文件菜单
mf.setMnemonic(KeyEvent.VK_F); //设置快捷键按下ALT+F打开本菜单
mi1 = new JMenuItem("新建(N)"); //“新建”菜单项
mi1.setMnemonic('N'); //设置激活键为N
mi1.addActionListener(this); //添加监听器
mi1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
InputEvent.CTRL_MASK));//设置快捷键CTRL+N激活本项
mf.add(mi1); //添加到菜单
//以下为上面同样的重复
mi2 = new JMenuItem("打开(O)...");
mi2.addActionListener(this);
mi2.setMnemonic('O');
mi2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
InputEvent.CTRL_MASK));
mf.add(mi2);
mi3 = new JMenuItem("保存(S)");
mi3.addActionListener(this);
mi3.setMnemonic('S');
mi3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
InputEvent.CTRL_MASK));
mf.add(mi3);
mi4 = new JMenuItem("另存为(A)...");
mi4.addActionListener(this);
mi4.setMnemonic('A');
mf.add(mi4);
mf.addSeparator(); //添加分隔线
mi5 = new JMenuItem("页面设置(U)...");
mi5.addActionListener(this);
mi5.setMnemonic('U');
mi5.setEnabled(false);//本功能暂无
mf.add(mi5);
mi6 = new JMenuItem("打印(P)...");
mi6.addActionListener(this);
mi6.setMnemonic('P');
mi6.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,
InputEvent.CTRL_MASK));
mf.add(mi6);
mf.addSeparator(); //添加分割线
mi7 = new JMenuItem("退出(X)");
mi7.setMnemonic('X');
mi7.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
InputEvent.CTRL_MASK));
mi7.addActionListener(this);
mf.add(mi7);
mb.add(mf);
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$文件菜单建立完毕$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$以下为编辑菜单$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
me = new JMenu("编辑(E)"); //编辑菜单
me.setMnemonic(KeyEvent.VK_E);
me1 = new JMenuItem("撤消(Z)");
me1.addActionListener(this);
me1.setMnemonic('Z');
me1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,
InputEvent.CTRL_MASK));
me.add(me1);
me12 = new JMenuItem("恢复撤销(B)");
me12.addActionListener(this);
me12.setMnemonic('B');
me12.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B,
InputEvent.CTRL_MASK));
me.add(me12);
me.addSeparator();
me2 = new JMenuItem("剪切(T)");
me2.addActionListener(this);
me2.setMnemonic('T');
me2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
InputEvent.CTRL_MASK));
me.add(me2);
me3 = new JMenuItem("复制(C)");
me3.addActionListener(this);
me3.setMnemonic('C');
me3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
InputEvent.CTRL_MASK));
me.add(me3);
me4 = new JMenuItem("粘贴(P)");
me4.addActionListener(this);
me4.setMnemonic('P');
me4.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
InputEvent.CTRL_MASK));
me.add(me4);
me5 = new JMenuItem("删除(L)");
me5.addActionListener(this);
me5.setMnemonic('L');
me5.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,
InputEvent.CTRL_MASK));
me.add(me5);
me.addSeparator();
me6 = new JMenuItem("查找(F)...");
me6.addActionListener(this);
me6.setMnemonic('F');
me6.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F,
InputEvent.CTRL_MASK));
me.add(me6);
me7 = new JMenuItem("查找下一个(N)");
me7.addActionListener(this);
me7.setMnemonic('N');
me7.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3,
InputEvent.CTRL_MASK));
me.add(me7);
me8 = new JMenuItem("替换(R)...");
me8.addActionListener(this);
me8.setMnemonic('R');
me8.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,
InputEvent.CTRL_MASK));
me.add(me8);
me9 = new JMenuItem("转到(G)...");
me9.addActionListener(this);
me9.setMnemonic('G');
me9.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G,
InputEvent.CTRL_MASK));
me.add(me9);
me.addSeparator();
me10 = new JMenuItem("全选(A)");
me10.addActionListener(this);
me10.setMnemonic('A');
me10.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,
InputEvent.CTRL_MASK));
me.add(me10);
me11 = new JMenuItem("时间/日期(D)");
me11.addActionListener(this);
me11.setMnemonic('D');
me11.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,
InputEvent.CTRL_MASK));
me.add(me11);
mb.add(me);
//$$$$$$$$$$$$$$$$$$$编辑菜单完毕$$$$$$$$$$$$$$$$$$$$$
//$$$$$$$$$$$$$$$$$$$一下为格式菜单$$$$$$$$$$$$$$$$$$$
mo = new JMenu("格式(O)"); //格式菜单
mo.setMnemonic(KeyEvent.VK_O);
mo1 = new JMenuItem("自动换行(W)");
mo1.addActionListener(this);
mo1.setMnemonic('W');
mo.add(mo1);
mo2 = new JMenuItem("字体(F)");
mo2.addActionListener(this);
mo2.setMnemonic('F');
// mo2.setEnabled(false);
mo.add(mo2);
mb.add(mo);
//$$$$$$$$$$$$$$$格式菜单完毕$$$$$$$$$$$$$$$$$$$$$$
//$$$$$$$$$$$$$$以下为帮助菜单$$$$$$$$$$$$$$$$$$$$$
mh = new JMenu("帮助(H)"); //帮助菜单
mh.setMnemonic(KeyEvent.VK_H);
mh1 = new JMenuItem("帮助主题(H)");
mh1.addActionListener(this);
mh1.setMnemonic('H');
mh1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,
InputEvent.CTRL_MASK));
mh.add(mh1);
mh2 = new JMenuItem("关于本记事本(A)");
mh2.addActionLi