📄 jhightlightlinetextpane.java
字号:
/**
*
*/
package flow.graph.gui.syntax;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.util.HashMap;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextPane;
import javax.swing.KeyStroke;
import javax.swing.LookAndFeel;
import javax.swing.SwingUtilities;
import javax.swing.TransferHandler;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.metal.DefaultMetalTheme;
import javax.swing.plaf.metal.MetalLookAndFeel;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultEditorKit;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import javax.swing.text.StyledEditorKit;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoManager;
import org.jgraph.graph.DefaultEdge;
import org.jgraph.graph.DefaultGraphCell;
import flow.graph.gui.graph.GraphManager;
import flow.graph.gui.graph.lua.gui.CaseForm;
import flow.graph.gui.tools.JNormalButton;
import flow.graph.gui.tools.SimpleButton;
import flow.graph.gui.tree.HilighterCodeStatusBar;
/**
* A class illustrating running line number count on JTextPane. Nothing
is painted on the pane itself,
* but a separate JPanel handles painting the line numbers.<br>
*
* @author Daniel Sj?blom<br>
* Created on Mar 3, 2004<br>
* Copyright (c) 2004<br>
* @version 1.0<br>
*/
public class JHightLightLineTextPane extends JPanel{
// for this simple experiment, we keep the pane + scrollpane as members.
public final static int BIT_SIZE = 8;
public final static int BIT_SIZE_SPACE = 6;
NonWrappingTextPane pane;
public JScrollPane scrollPane;
public HilighterCodeStatusBar staturBar;
private int numberLength = 1;
class NonWrappingTextPane extends JTextPane implements ClipboardOwner{
Clipboard strBoard = this.getToolkit().getSystemClipboard();
UndoManager undo = new UndoManager();
Document doc = getDocument();
private AbstractAction undoAction;
private AbstractAction redoAction;
private AbstractAction copyAction;
private AbstractAction cutAction;
private AbstractAction pasteAction;
public NonWrappingTextPane(){
doc.addUndoableEditListener(new UndoableEditListener(){
public void undoableEditHappened(UndoableEditEvent e) {
System.out.println("undolistener........");
doc_addedit(e);
}
});
addActionMap();
}
public AbstractAction getUndoAction(){
return undoAction;
}
public AbstractAction getRedoAction(){
return redoAction;
}
public AbstractAction getCopyAction(){
return copyAction;
}
public AbstractAction getCutAction(){
return cutAction;
}
public AbstractAction getPasteAction(){
return pasteAction;
}
public void addActionMap(){
undoAction = new AbstractAction("Undo") {
public void actionPerformed(ActionEvent evt) {
try {
if (undo.canUndo()) {
undo.undo();
}
} catch (CannotUndoException e) {
}
}
};
getActionMap().put("Undo", undoAction);
getInputMap().put(KeyStroke.getKeyStroke("control Z"), "Undo");
redoAction = new AbstractAction("Redo") {
public void actionPerformed(ActionEvent evt) {
try {
if (undo.canRedo()) {
undo.redo();
}
} catch (CannotRedoException e) {
}
}
};
getActionMap().put("Redo", redoAction);
getInputMap().put(KeyStroke.getKeyStroke("control R"), "Redo");
copyAction = new AbstractAction("Copy") {
public void actionPerformed(ActionEvent evt) {
copy();
}
};
getActionMap().put("Copy", copyAction);
getInputMap().put(KeyStroke.getKeyStroke("control C"), "Copy");
cutAction = new AbstractAction("Cut") {
public void actionPerformed(ActionEvent evt) {
cut();
}
};
getActionMap().put("Cut", cutAction);
getInputMap().put(KeyStroke.getKeyStroke("control X"), "Cut");
pasteAction = new AbstractAction("Paste") {
public void actionPerformed(ActionEvent evt) {
paste();
}
};
getActionMap().put("Paste", pasteAction);
getInputMap().put(KeyStroke.getKeyStroke("control V"), "Paste");
}
public void copy() {
String sCopy = getSelectedText();
if (sCopy != null) {
StringSelection sSelection = new StringSelection(sCopy);
strBoard.setContents(sSelection,this);
}
}
public void cut() {
String sCopy = getSelectedText();
if (sCopy != null) {
StringSelection sSelection = new StringSelection(sCopy);
strBoard.setContents(sSelection,this);
this.replaceSelection("");
}
}
public void paste() {
Transferable sTransf = strBoard.getContents(this);
if (sTransf!=null) {
try {
String sPaste = (String)sTransf.getTransferData(DataFlavor.stringFlavor);
//this.replaceRange(sPaste,getSelectionStart(),getSelectionEnd());
this.replaceSelection(sPaste);
}
catch(UnsupportedFlavorException e)
{
}
catch(IOException ioe)
{
}
}
}
public void lostOwnership(Clipboard clipboard,Transferable contents) {
}
void doc_addedit(UndoableEditEvent e) {
//System.out.println("addedit.......");
undo.addEdit(e.getEdit());
}
// The method below is coutesy of Core Swing Advanced Programming by Kim Topley
//
// Override getScrollableTracksViewportWidth
// to preserve the full width of the text
public boolean getScrollableTracksViewportWidth() {
Component parent = getParent();
ComponentUI ui = getUI();
return parent != null ? (ui.getPreferredSize(this).width <= parent.getSize().width) : true;
}
}
public JHightLightLineTextPane(){
super();
setMaximumSize(new Dimension(BIT_SIZE_SPACE+BIT_SIZE, BIT_SIZE_SPACE+BIT_SIZE));
setPreferredSize(new Dimension(BIT_SIZE_SPACE+BIT_SIZE, BIT_SIZE_SPACE+BIT_SIZE));//每个数字占8个单位
setMinimumSize(new Dimension(BIT_SIZE_SPACE+BIT_SIZE, BIT_SIZE_SPACE+BIT_SIZE));
//we need to override paint so that the linenumbers stay in sync
pane = new NonWrappingTextPane(){
public void paint(Graphics g){
super.paint(g);
JHightLightLineTextPane.this.repaint();
}
};
//pane.setEditorKit(new highlightKit());
pane.setEditorKit(new MyEditorKit());
scrollPane = new JScrollPane(pane);
staturBar = new HilighterCodeStatusBar();
//setBackground(new Color(250, 250, 250));
//setBackground(new Color)
this.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1));
pane.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -