⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jhightlightlinetextpane.java

📁 JGraph扩展应用。自定义Renderer,自定义视图View实现自定义工作流控件
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/**
 * 
 */
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 + -