package proe;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.text.*;
import javax.swing.event.*;
import javax.swing.undo.*;
import java.util.*;
/**
*<p>Title: 程序编辑器</p>
*<p>Description: 增强的文本编辑程序</p>
*<p>Copyright: Copyright (c) 2005</p>
*<p>Company: </p>
*@author 红色彼岸
*@version 0.1
*/
class ProEFrame extends JFrame{
private JFileChooser fileChooser = new JFileChooser();
private JMenuBar menuBar;
private JMenu file, edit, format, help;
private JMenuItem newItem, openItem, saveItem, saveAsItem, pageSetItem, printItem, exitItem;
private JMenuItem undoItem, redoItem, cutItem, copyItem, pasteItem, deleteItem, findItem, findNextItem, replaceItem, goToLineItem, selectAllItem, timeItem;
private JMenuItem autoNextLineItem, fontItem;
private JMenuItem helpItem, aboutItem;
private JTextArea textArea;
private JScrollPane scrollPane;
private final int TAB_SIZE = 4;
private File fileName;
private boolean isChange = false;
private final UndoManager undo = new UndoManager();
public ProEFrame(String title) {
//设置窗体的标题栏和默认关闭操作
super(title);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
//设置菜单栏和菜单的内容
menuBar = new JMenuBar();
file = new JMenu("文件(F)");
edit = new JMenu("编辑(E)");
format = new JMenu("格式(O)");
help = new JMenu("帮助(H)");
setQuickKey(file, 'F');
setQuickKey(edit, 'E');
setQuickKey(format, 'O');
setQuickKey(help, 'H');
newItem = new JMenuItem("新建(N)");
openItem = new JMenuItem("打开(O)...");
saveItem = new JMenuItem("保存(S)");
saveAsItem = new JMenuItem("另存为...");
pageSetItem = new JMenuItem("页面设置(U)...");
printItem = new JMenuItem("打印(P)...");
exitItem = new JMenuItem("退出");
setQuickKey(newItem, 'N');
setQuickKey(openItem, 'O');
setQuickKey(saveItem, 'S');
setQuickKey(pageSetItem, 'U');
setQuickKey(printItem, 'P');
file.add(newItem);
file.add(openItem);
file.add(saveItem);
file.add(saveAsItem);
file.addSeparator();
file.add(pageSetItem);
file.add(printItem);
file.addSeparator();
file.add(exitItem);
undoItem = new JMenuItem("撤销(Z)");
redoItem = new JMenuItem("恢复(R)");
cutItem = new JMenuItem("剪切(X)");
copyItem = new JMenuItem("复制(C)");
pasteItem = new JMenuItem("粘贴(V)");
deleteItem = new JMenuItem("删除");
findItem = new JMenuItem("查找(F)...");
findNextItem = new JMenuItem("查找下一个");
replaceItem = new JMenuItem("替换...");
goToLineItem = new JMenuItem("转到(G)...");
selectAllItem = new JMenuItem("全选(A)");
timeItem = new JMenuItem("时间/日期");
setQuickKey(undoItem, 'Z');
setQuickKey(redoItem, 'R');
setQuickKey(cutItem, 'X');
setQuickKey(copyItem, 'C');
setQuickKey(pasteItem, 'V');
setQuickKey(findItem, 'F');
setQuickKey(goToLineItem, 'G');
setQuickKey(selectAllItem, 'A');
edit.add(undoItem);
edit.add(redoItem);
edit.addSeparator();
edit.add(cutItem);
edit.add(copyItem);
edit.add(pasteItem);
edit.add(deleteItem);
edit.addSeparator();
edit.add(findItem);
edit.add(findNextItem);
edit.add(replaceItem);
edit.add(goToLineItem);
edit.addSeparator();
edit.add(selectAllItem);
edit.add(timeItem);
autoNextLineItem = new JMenuItem("自动换行(W)");
fontItem = new JMenuItem("字体...");
setQuickKey(autoNextLineItem, 'W');
format.add(autoNextLineItem);
format.add(fontItem);
helpItem = new JMenuItem("帮助主题(H)");
aboutItem = new JMenuItem("关于ProE");
setQuickKey(helpItem, 'H');
help.add(helpItem);
help.add(aboutItem);
menuBar.add(file);
menuBar.add(edit);
menuBar.add(format);
menuBar.add(help);
setJMenuBar(menuBar);
textArea = new JTextArea();
textArea.setTabSize(TAB_SIZE);
//支持撤销/恢复操作的监听方法
textArea.getDocument().addUndoableEditListener(new UndoableEditListener() {
public void undoableEditHappened(UndoableEditEvent evt) {
undo.addEdit(evt.getEdit());
}
});
//监听文档内容是否发生变化
textArea.getDocument().addDocumentListener(
new DocumentListener() {
public void changedUpdate(DocumentEvent de) {
isChange = true;
}
public void insertUpdate(DocumentEvent de) {
isChange = true;
}
public void removeUpdate(DocumentEvent de) {
isChange = true;
}
}
);
scrollPane = new JScrollPane(textArea);
this.getContentPane().add(scrollPane, BorderLayout.CENTER);
//测试用的方法
MenuItemEventHandler menuItemHandler = new MenuItemEventHandler();
newItem.addActionListener(menuItemHandler);
openItem.addActionListener(menuItemHandler);
saveItem.addActionListener(menuItemHandler);
saveAsItem.addActionListener(menuItemHandler);
pageSetItem.addActionListener(menuItemHandler);
printItem.addActionListener(menuItemHandler);
exitItem.addActionListener(menuItemHandler);
undoItem.addActionListener(menuItemHandler);
redoItem.addActionListener(menuItemHandler);
cutItem.addActionListener(menuItemHandler);
copyItem.addActionListener(menuItemHandler);
pasteItem.addActionListener(menuItemHandler);
deleteItem.addActionListener(menuItemHandler);
findItem.addActionListener(menuItemHandler);
findNextItem.addActionListener(menuItemHandler);
replaceItem.addActionListener(menuItemHandler);
goToLineItem.addActionListener(menuItemHandler);
selectAllItem.addActionListener(menuItemHandler);
timeItem.addActionListener(menuItemHandler);
autoNextLineItem.addActionListener(menuItemHandler);
fontItem.addActionListener(menuItemHandler);
helpItem.addActionListener(menuItemHandler);
aboutItem.addActionListener(menuItemHandler);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
exitPerformed();
}
});
}
//辅助方法:为菜单或者菜单项设定快捷键
private void setQuickKey(AbstractButton button, char quickKey) {
String type = button.getClass().getSimpleName();
if(type.equals("JMenu"))
button.setMnemonic(quickKey);
else if(type.equals("JMenuItem")) {
JMenuItem menuItem = (JMenuItem)button;
menuItem.setAccelerator(KeyStroke.getKeyStroke(quickKey, InputEvent.CTRL_MASK));
}
}
//辅助方法:测试JTextArea中文本是否有变化
private boolean hasChange() {
return isChange;
}
//内部方法:响应菜单事件
private void newPerformed() {
int value = -1;
if(hasChange())
if(fileName != null && fileName.exists()) {
String[] buttonTexts = {"保存", "不保存", "取消"};
value = JOptionPane.showOptionDialog(this, "源程序已经改变,请确认是否保存!", "保存更改?", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, buttonTexts, buttonTexts[0]);
if(value == JOptionPane.YES_OPTION)
savePerformed();
else if(value == JOptionPane.NO_OPTION) {
fileName = null;
textArea.setText("");
setTitle("程序编辑器");
return;
}
else if(value == JOptionPane.CANCEL_OPTION)
return;
}
else {
saveAsPerformed();
fileName = null;
textArea.setText("");
setTitle("程序编辑器");
return;
}
fileName = null;
textArea.setText("");
setTitle("程序编辑器");
isChange = false;
return;
}
private void openPerformed() {
BufferedReader input = null;
String text;
int ret = fileChooser.showOpenDialog(this);
if(ret != JFileChooser.APPROVE_OPTION)
return;
newPerformed();
fileName = fileChooser.getSelectedFile();
if(fileName.exists() && fileName.canRead()) {
setTitle("程序编辑器: " + fileName.getName());
try{
input = new BufferedReader(new FileReader(fileName));
while((text = input.readLine()) != null)
textArea.append(text + "\n");
input.close();
}
catch(IOException e) {
JOptionPane.showMessageDialog(this, "文件打开错误,没有打开");
}
finally {
input = null;
}
}
isChange = false;
}
private void savePerformed() {
if(!hasChange())
return;
PrintWriter output = null;
if(fileName != null && fileName.exists()) {
try{
output = new PrintWriter(fileName);
output.write(textArea.getText());
}
catch(IOException e)
{
JOptionPane.showMessageDialog(this, "文件写入错误,没有保存");
}
finally {
output.close();
output = null;
}
isChange = false;
}
else
saveAsPerformed();
}
private void saveAsPerformed() {
if(!hasChange())
return;
PrintWriter output = null;
int ret = fileChooser.showSaveDialog(this);
if(ret != JFileChooser.APPROVE_OPTION) {
isChange = true;
return;
}
fileName = fileChooser.getSelectedFile();
setTitle("程序编辑器: " + fileName.getName());
try{
output = new PrintWriter(fileName);
output.write(textArea.getText());
}
catch(IOException e){
JOptionPane.showMessageDialog(this, "文件写入错误,没有保存");
}
finally{
output.close();
output = null;
}
isChange = false;
}
private void pageSetPerformed() {
System.out.println("显示页面设置对话框");
}
private void printPerformed() {
System.out.println("显示打印对话框");
}
private void exitPerformed() {
String[] buttonTexts = {"保存退出", "不保存退出", "取消"};
int value = -1;
if(hasChange()) {
value = JOptionPane.showOptionDialog(this, "源程序已经改变,请是否选择保存或直接退出!", "退出程序", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, buttonTexts, buttonTexts[0]);
switch(value)
{
case JOptionPane.YES_OPTION:
savePerformed();
break;
case JOptionPane.NO_OPTION:
System.exit(0);
break;
case JOptionPane.CANCEL_OPTION:
isChange = true;
return;
}
}
else
System.exit(0);
}
private void undoPerformed() {
try{
if(undo.canUndo())
undo.undo();
}catch(CannotUndoException e) {
JOptionPane.showMessageDialog(this, "无法执行撤销操作", "撤销异常", JOptionPane.WARNING_MESSAGE);
}
}
private void redoPerformed() {
try{
if(undo.canRedo())
undo.redo();
}catch(CannotRedoException e) {
JOptionPane.showMessageDialog(this, "无法执行恢复操作", "恢复异常", JOptionPane.WARNING_MESSAGE);
}
}
private void cutPerformed() {
textArea.cut();
}
private void copyPerformed() {
textArea.copy();
}
private void pastePerformed() {
textArea.paste();
}
private void deletePerformed() {
textArea.replaceRange(null, textArea.getSelectionStart(), textArea.getSelectionEnd());
}
private void findPerformed() {
String findString = JOptionPane.showInputDialog(this, );
}
private void findNextPerformed() {
System.out.println("查找下一个");
}
private void replacePerformed() {
System.out.println("替换");
}
private void goToLinePerformed() {
System.out.println("转到");
}
private void selectAllPerformed() {
textArea.selectAll();
}
private void timePerformed() {
textArea.insert((new Date()).toString(), textArea.getSelectionEnd());
}
private void autoNextLinePerformed() {
System.out.println("自动换行");
}
private void fontPerformed() {
System.out.println("字体");
}
private void helpPerformed() {
System.out.println("帮助主题");
}
private void aboutPerformed() {
System.out.println("关于程序");
}
/**
*<p>Title: </p>
*<p>Description: 处理菜单出发的事件</p>
*<p>Copyright: Copyright (c) 2005</p>
*<p>Company: </p>
*@author 红色彼岸
*@version 0.1
*/
class MenuItemEventHandler implements ActionListener{
public void actionPerformed(ActionEvent e) {
JMenuItem item = (JMenuItem)e.getSource();
if(item == newItem)
newPerformed();
else if(item == openItem)
openPerformed();
else if(item == saveItem)
savePerformed();
else if(item == saveAsItem)
saveAsPerformed();
else if(item == pageSetItem)
pageSetPerformed();
else if(item == printItem)
printPerformed();
else if(item == exitItem)
exitPerformed();
else if(item == undoItem)
undoPerformed();
else if(item == redoItem)
redoPerformed();
else if(item == cutItem)
cutPerformed();
else if(item == copyItem)
copyPerformed();
else if(item == pasteItem)
pastePerformed();
else if(item == deleteItem)
deletePerformed();
else if(item == findItem)
findPerformed();
else if(item == findNextItem)
findNextPerformed();
else if(item == replaceItem)
replacePerformed();
else if(item == goToLineItem)
goToLinePerformed();
else if(item == selectAllItem)
selectAllPerformed();
else if(item == timeItem)
timePerformed();
else if(item == autoNextLineItem)
autoNextLinePerformed();
else if(item == fontItem)
fontPerformed();
else if(item == helpItem)
helpPerformed();
else if(item == aboutItem)
aboutPerformed();
}
}
}