📄 editor.java
字号:
package org.loon.framework.ide.test;
/**
* <p>Title: LoonFramework</p>
* <p>Description:</p>
* <p>Copyright: Copyright (c) 2007</p>
* <p>Company: LoonFramework</p>
* @author chenpeng
* @email:ceponline@yahoo.com.cn
* @version 0.1
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.UndoableEditEvent;
import javax.swing.text.Document;
import javax.swing.undo.UndoManager;
import org.loon.framework.ide.test.data.ConfigData;
import org.loon.framework.ide.test.data.LineData;
class Editor extends UndoManager
implements CaretListener, ActionListener, KeyListener
{
JPanel panel;
JPanel panelCenter;
JScrollPane scroll;
JPanel panelNorth;
JLabel label;
JLabel labelName;
JPanel panelNorthWest;
JTextField textLine;
Font font;
int lineCount;
JavaText textEdit;
File currentFile;
Color color[];
ConfigData config;
Document udDocument;
boolean boolChange;
/**
*
*/
private static final long serialVersionUID = 1L;
public Editor(ConfigData configdata)
{
panel = new JPanel();
panelCenter = new JPanel();
scroll = new JScrollPane(panelCenter);
panelNorth = new JPanel();
label = new JLabel("", 4);
labelName = new JLabel("", 0);
panelNorthWest = new JPanel();
textLine = new JTextField();
lineCount = 1;
textEdit = new JavaText();
boolChange = false;
config = configdata;
font = configdata.getLastFont();
color = configdata.getAllColor();
textEdit.setFont(font);
textEdit.setForeground(color[1]);
textEdit.setBackground(color[0]);
panel.setLayout(new BorderLayout());
panel.add("Center", scroll);
panel.add("North", panelNorth);
panelCenter.setLayout(new GridLayout(1, 1));
panelCenter.add("Center", textEdit);
panelNorth.setLayout(new BorderLayout());
panelNorth.add("West", panelNorthWest);
panelNorth.add("East", label);
panelNorth.add("Center", labelName);
panelNorthWest.setLayout(new GridLayout(1, 2));
panelNorthWest.add(textLine);
panelNorthWest.add(new JLabel("目标行"));
panelNorth.setBackground(new Color(240, 240, 240));
panelNorthWest.setBackground(new Color(240, 240, 240));
labelName.setForeground(Color.blue);
labelName.setFont(new Font("宋体", 0, 13));
textLine.addActionListener(this);
textEdit.addCaretListener(this);
textEdit.addKeyListener(this);
udDocument = textEdit.getDocument();
udDocument.addUndoableEditListener(this);
}
public void caretUpdate(CaretEvent caretevent)
{
int i = textEdit.getCaretPosition();
LineData linedata = getLineCount(i);
label.setText("光标:" + linedata.getLine() + "行 " + linedata.getCharacter() + "列");
}
public void actionPerformed(ActionEvent actionevent)
{
try
{
int i = Integer.parseInt(textLine.getText());
if(i <= 0)
throw new Exception();
String s = textEdit.getText();
LineData linedata = getLineCount(s.length());
if(linedata.getLine() < i)
i = linedata.getLine();
jump(i);
}
catch(Exception exception)
{
label.setText("所在行号错误!");
}
textEdit.requestFocus();
}
public JPanel getPanel()
{
return panel;
}
public void editorUndo()
{
if(canUndo())
undo();
}
public void editorRedo()
{
if(canRedo())
redo();
}
public boolean changeDocument()
{
return boolChange;
}
public void openFile(File file)
throws Exception
{
FileReader filereader = new FileReader(file);
textEdit.read(filereader, file);
filereader.close();
currentFile = file;
setMark(textEdit, color);
setCursor();
udDocument = textEdit.getDocument();
udDocument.addUndoableEditListener(this);
boolChange = false;
labelName.setText(getCurrentAbusolutePath());
}
public void saveFile()
throws Exception
{
udDocument.removeUndoableEditListener(this);
int i = textEdit.getCaretPosition();
textEdit.deleteCode("\r");
textEdit.insertCode("\r");
FileWriter filewriter = new FileWriter(currentFile);
textEdit.write(filewriter);
filewriter.close();
setMark(textEdit, color);
textEdit.setCaretPosition(i);
setCursor();
udDocument = textEdit.getDocument();
udDocument.addUndoableEditListener(this);
boolChange = false;
labelName.setText(getCurrentAbusolutePath());
}
public void saveHTML(String s)
throws Exception
{
String s1 = textEdit.getText();
StringBuffer stringbuffer = new StringBuffer("");
stringbuffer.append("<HTML><HEAD><TITLE>" + getCurrentName() + "</TITLE></HEAD>\r\n<BODY>\r\n");
for(int i = 0; i < s1.length(); i++)
{
String s2 = s1.substring(i, i + 1);
if(s2.equals(" "))
stringbuffer.append(" ");
else
if(s2.equals("\n"))
stringbuffer.append("<BR>\r\n");
else
if(!s2.equals("\r"))
stringbuffer.append(s2);
}
stringbuffer.append("</BODY></HTML>");
BufferedWriter bufferedwriter = new BufferedWriter(new FileWriter(s));
bufferedwriter.write(stringbuffer.toString());
bufferedwriter.close();
}
public void saveFileForEnd(String s)
throws Exception
{
StringBuffer stringbuffer = new StringBuffer(s);
for(int i = stringbuffer.length() - 1; i >= 0; i--)
if(stringbuffer.substring(i, i + 1).equals("\r"))
stringbuffer.delete(i, i + 1);
for(int j = stringbuffer.length() - 1; j >= 0; j--)
if(stringbuffer.substring(j, j + 1).equals("\n"))
stringbuffer.insert(j, "\r");
BufferedWriter bufferedwriter = new BufferedWriter(new FileWriter(currentFile));
bufferedwriter.write(stringbuffer.toString());
bufferedwriter.close();
}
public void deleteCode()
{
int i = textEdit.getCaretPosition();
textEdit.deleteCode("\r");
setMark(textEdit, color);
textEdit.setCaretPosition(i);
}
public boolean setCurrentFile(File file)
{
currentFile = file;
if(file != null)
return file.exists();
else
return false;
}
public void setMark(JavaText javatext, Color acolor[])
{
javatext.setMark(acolor);
}
public File getCurrentFile()
{
return currentFile;
}
public String getCurrentName()
{
if(currentFile == null)
return null;
else
return currentFile.getName();
}
public String getOnlyName()
{
String s = currentFile.getName();
int i = 0;
for(i = s.length() - 1; i > 0 && !s.substring(i, i + 1).equals("."); i--);
if(i > 0)
return s.substring(0, i);
else
return null;
}
public String getPathOnlyName()
{
String s = currentFile.getAbsolutePath();
int i = 0;
for(i = s.length() - 1; i > 0 && !s.substring(i, i + 1).equals("."); i--);
if(i > 0)
return s.substring(0, i);
else
return null;
}
public String getCurrentAbusolutePath()
{
if(currentFile == null)
return null;
else
return getCurrentFile().getAbsolutePath();
}
public String getCurrentParent()
{
if(currentFile == null)
return null;
else
return getCurrentFile().getParent();
}
public void setText(String s)
{
textEdit.setText(s);
}
public String getText()
{
return textEdit.getText();
}
public JavaText getJavaText()
{
return textEdit;
}
public LineData getLineCount(int i)
{
int j = 1;
int k = 1;
String s = textEdit.getText();
for(int l = 0; l < i; l++)
{
if(s.substring(l, l + 1).equals("\n"))
{
j++;
k = 0;
}
k++;
}
return new LineData(j, k);
}
public void jump(int i)
{
int j = 1;
String s = textEdit.getText();
for(int k = 0; k < s.length(); k++)
if(s.substring(k, k + 1).equals("\n") && ++j == i)
{
textEdit.setCaretPosition(k + 1);
return;
}
textEdit.setCaretPosition(0);
}
public void selectAll()
{
textEdit.selectAll();
}
public void setFontInfo(Font font1)
{
textEdit.setFont(font1);
}
public void setCursor()
{
textEdit.requestFocus();
}
public void indentLine(char c)
{
int i = 4;
try
{
i = Integer.parseInt(config.getTabSpace());
}
catch(Exception exception)
{
i = 4;
}
if(c == '}')
{
int j = textEdit.getCaretPosition() - 1;
String s = textEdit.getText();
String s2 = null;
if(j >= 0)
s2 = s.substring(j, j + 1);
else
return;
boolean flag = false;
int i1 = 0;
while(j >= 0 && !s2.equals("\n"))
{
if(s2.equals(" "))
i1++;
else
flag = true;
if(--j >= 0)
s2 = s.substring(j, j + 1);
}
if(!flag && i1 >= i)
{
int k = textEdit.getCaretPosition();
textEdit.select(k - i, k);
textEdit.replaceSelection("");
}
} else
if(c == '\n')
{
int l = textEdit.getCaretPosition() - 1;
if(l <= 0)
return;
String s1 = textEdit.getText();
String s3 = null;
s3 = s1.substring(l, l + 1);
if(!s3.equals("\n"))
return;
boolean flag1 = false;
boolean flag2 = false;
String s5 = "";
l--;
for(String s4 = s1.substring(l, l + 1); l >= 0 && !s4.equals("\n");)
{
if(!flag1 && s4.equals("}"))
flag2 = true;
if(s4.equals("{"))
flag1 = true;
s5 = s4 + s5;
if(--l >= 0)
s4 = s1.substring(l, l + 1);
}
int j1 = 0;
for(j1 = 0; j1 < s5.length() && s5.substring(j1, j1 + 1).equals(" "); j1++);
if(flag1 && !flag2)
j1 += i;
String s6 = "";
for(int k1 = 0; k1 < j1; k1++)
s6 = s6 + " ";
textEdit.replaceSelection(s6);
}
}
public void tabToSpace()
{
int i = textEdit.getCaretPosition();
if(i <= 0)
return;
int j = 4;
try
{
j = Integer.parseInt(config.getTabSpace());
}
catch(Exception exception)
{
j = 4;
}
i--;
String s = textEdit.getText();
if(s.substring(i, i + 1).equals("\t"))
{
int k = 0;
for(int l = i - 1; l >= 0 && !s.substring(l, l + 1).equals("\n");)
{
l--;
k++;
}
k = j - k % j;
String s1 = "";
for(int i1 = 0; i1 < k; i1++)
s1 = s1 + " ";
textEdit.select(i, i + 1);
textEdit.replaceSelection(s1);
}
}
public void undoableEditHappened(UndoableEditEvent undoableeditevent)
{
boolChange = true;
addEdit(undoableeditevent.getEdit());
tabToSpace();
}
public void keyPressed(KeyEvent keyevent)
{
}
public void keyReleased(KeyEvent keyevent)
{
}
public void keyTyped(KeyEvent keyevent)
{
indentLine(keyevent.getKeyChar());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -