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

📄 jedittextarea.java

📁 jedit中独立出来的语法高亮组件
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
		// If the new position is the same as the old, we don't		// do all this crap, however we still do the stuff at		// the end (clearing magic position, scrolling)		if(newStart != selectionStart || newEnd != selectionEnd			|| newBias != biasLeft)		{			int newStartLine = getLineOfOffset(newStart);			int newEndLine = getLineOfOffset(newEnd);			if(painter.isBracketHighlightEnabled())			{				if(bracketLine != -1)					painter.invalidateLine(bracketLine);				updateBracketHighlight(end);				if(bracketLine != -1)					painter.invalidateLine(bracketLine);			}			painter.invalidateLineRange(selectionStartLine,selectionEndLine);			painter.invalidateLineRange(newStartLine,newEndLine);			document.addUndoableEdit(new CaretUndo(				selectionStart,selectionEnd));			selectionStart = newStart;			selectionEnd = newEnd;			selectionStartLine = newStartLine;			selectionEndLine = newEndLine;			biasLeft = newBias;			fireCaretEvent();		}		// When the user is typing, etc, we don't want the caret		// to blink		blink = true;		caretTimer.restart();		// Disable rectangle select if selection start = selection end		if(selectionStart == selectionEnd)			rectSelect = false;		// Clear the `magic' caret position used by up/down		magicCaret = -1;		scrollToCaret();	}	/**	 * Returns the selected text, or null if no selection is active.	 */	public final String getSelectedText()	{		if(selectionStart == selectionEnd)			return null;		if(rectSelect)		{			// Return each row of the selection on a new line			Element map = document.getDefaultRootElement();			int start = selectionStart - map.getElement(selectionStartLine)				.getStartOffset();			int end = selectionEnd - map.getElement(selectionEndLine)				.getStartOffset();			// Certain rectangles satisfy this condition...			if(end < start)			{				int tmp = end;				end = start;				start = tmp;			}			StringBuffer buf = new StringBuffer();			Segment seg = new Segment();			for(int i = selectionStartLine; i <= selectionEndLine; i++)			{				Element lineElement = map.getElement(i);				int lineStart = lineElement.getStartOffset();				int lineEnd = lineElement.getEndOffset() - 1;				int lineLen = lineEnd - lineStart;				lineStart = Math.min(lineStart + start,lineEnd);				lineLen = Math.min(end - start,lineEnd - lineStart);				getText(lineStart,lineLen,seg);				buf.append(seg.array,seg.offset,seg.count);				if(i != selectionEndLine)					buf.append('\n');			}			return buf.toString();		}		else		{			return getText(selectionStart,				selectionEnd - selectionStart);		}	}	/**	 * Replaces the selection with the specified text.	 * @param selectedText The replacement text for the selection	 */	public void setSelectedText(String selectedText)	{		if(!editable)		{			throw new InternalError("Text component"				+ " read only");		}		document.beginCompoundEdit();		try		{			if(rectSelect)			{				Element map = document.getDefaultRootElement();				int start = selectionStart - map.getElement(selectionStartLine)					.getStartOffset();				int end = selectionEnd - map.getElement(selectionEndLine)					.getStartOffset();				// Certain rectangles satisfy this condition...				if(end < start)				{					int tmp = end;					end = start;					start = tmp;				}				int lastNewline = 0;				int currNewline = 0;				for(int i = selectionStartLine; i <= selectionEndLine; i++)				{					Element lineElement = map.getElement(i);					int lineStart = lineElement.getStartOffset();					int lineEnd = lineElement.getEndOffset() - 1;					int rectStart = Math.min(lineEnd,lineStart + start);					document.remove(rectStart,Math.min(lineEnd - rectStart,						end - start));					if(selectedText == null)						continue;					currNewline = selectedText.indexOf('\n',lastNewline);					if(currNewline == -1)						currNewline = selectedText.length();					document.insertString(rectStart,selectedText						.substring(lastNewline,currNewline),null);					lastNewline = Math.min(selectedText.length(),						currNewline + 1);				}				if(selectedText != null &&					currNewline != selectedText.length())				{					int offset = map.getElement(selectionEndLine)						.getEndOffset() - 1;					document.insertString(offset,"\n",null);					document.insertString(offset + 1,selectedText						.substring(currNewline + 1),null);				}			}			else			{				document.remove(selectionStart,					selectionEnd - selectionStart);				if(selectedText != null)				{					document.insertString(selectionStart,						selectedText,null);				}			}		}		catch(BadLocationException bl)		{			bl.printStackTrace();			throw new InternalError("Cannot replace"				+ " selection");		}		// No matter what happends... stops us from leaving document		// in a bad state		finally		{			document.endCompoundEdit();		}		setCaretPosition(selectionEnd);	}	/**	 * Returns true if this text area is editable, false otherwise.	 */	public final boolean isEditable()	{		return editable;	}	/**	 * Sets if this component is editable.	 * @param editable True if this text area should be editable,	 * false otherwise	 */	public final void setEditable(boolean editable)	{		this.editable = editable;	}	/**	 * Returns the right click popup menu.	 */	public final JPopupMenu getRightClickPopup()	{		return popup;	}	/**	 * Sets the right click popup menu.	 * @param popup The popup	 */	public final void setRightClickPopup(JPopupMenu popup)	{		this.popup = popup;	}	/**	 * Returns the `magic' caret position. This can be used to preserve	 * the column position when moving up and down lines.	 */	public final int getMagicCaretPosition()	{		return magicCaret;	}	/**	 * Sets the `magic' caret position. This can be used to preserve	 * the column position when moving up and down lines.	 * @param magicCaret The magic caret position	 */	public final void setMagicCaretPosition(int magicCaret)	{		this.magicCaret = magicCaret;	}	/**	 * Similar to <code>setSelectedText()</code>, but overstrikes the	 * appropriate number of characters if overwrite mode is enabled.	 * @param str The string	 * @see #setSelectedText(String)	 * @see #isOverwriteEnabled()	 */	public void overwriteSetSelectedText(String str)	{		// Don't overstrike if there is a selection		if(!overwrite || selectionStart != selectionEnd)		{			setSelectedText(str);			return;		}		// Don't overstrike if we're on the end of		// the line		int caret = getCaretPosition();		int caretLineEnd = getLineEndOffset(getCaretLine());		if(caretLineEnd - caret <= str.length())		{			setSelectedText(str);			return;		}		document.beginCompoundEdit();		try		{			document.remove(caret,str.length());			document.insertString(caret,str,null);		}		catch(BadLocationException bl)		{			bl.printStackTrace();		}		finally		{			document.endCompoundEdit();		}	}	/**	 * Returns true if overwrite mode is enabled, false otherwise.	 */	public final boolean isOverwriteEnabled()	{		return overwrite;	}	/**	 * Sets if overwrite mode should be enabled.	 * @param overwrite True if overwrite mode should be enabled,	 * false otherwise.	 */	public final void setOverwriteEnabled(boolean overwrite)	{		this.overwrite = overwrite;		painter.invalidateSelectedLines();	}	/**	 * Returns true if the selection is rectangular, false otherwise.	 */	public final boolean isSelectionRectangular()	{		return rectSelect;	}	/**	 * Sets if the selection should be rectangular.	 * @param overwrite True if the selection should be rectangular,	 * false otherwise.	 */	public final void setSelectionRectangular(boolean rectSelect)	{		this.rectSelect = rectSelect;		painter.invalidateSelectedLines();	}	/**	 * Returns the position of the highlighted bracket (the bracket	 * matching the one before the caret)	 */	public final int getBracketPosition()	{		return bracketPosition;	}	/**	 * Returns the line of the highlighted bracket (the bracket	 * matching the one before the caret)	 */	public final int getBracketLine()	{		return bracketLine;	}	/**	 * Adds a caret change listener to this text area.	 * @param listener The listener	 */	public final void addCaretListener(CaretListener listener)	{		listenerList.add(CaretListener.class,listener);	}	/**	 * Removes a caret change listener from this text area.	 * @param listener The listener	 */	public final void removeCaretListener(CaretListener listener)	{		listenerList.remove(CaretListener.class,listener);	}	/**	 * Deletes the selected text from the text area and places it	 * into the clipboard.	 */	public void cut()	{		if(editable)		{			copy();			setSelectedText("");		}	}	/**	 * Places the selected text into the clipboard.	 */	public void copy()	{		if(selectionStart != selectionEnd)		{			Clipboard clipboard = getToolkit().getSystemClipboard();			String selection = getSelectedText();			int repeatCount = inputHandler.getRepeatCount();			StringBuffer buf = new StringBuffer();			for(int i = 0; i < repeatCount; i++)				buf.append(selection);			clipboard.setContents(new StringSelection(buf.toString()),null);		}	}	/**	 * Inserts the clipboard contents into the text.	 */	public void paste()	{		if(editable)		{			Clipboard clipboard = getToolkit().getSystemClipboard();			try			{				// The MacOS MRJ doesn't convert \r to \n,				// so do it here				String selection = ((String)clipboard					.getContents(this).getTransferData(					DataFlavor.stringFlavor))					.replace('\r','\n');				int repeatCount = inputHandler.getRepeatCount();				StringBuffer buf = new StringBuffer();				for(int i = 0; i < repeatCount; i++)					buf.append(selection);				selection = buf.toString();				setSelectedText(selection);			}			catch(Exception e)			{				getToolkit().beep();				System.err.println("Clipboard does not"					+ " contain a string");			}		}	}	/**	 * Called by the AWT when this component is removed from it's parent.	 * This stops clears the currently focused component.	 */	public void removeNotify()	{		super.removeNotify();		if(focusedComponent == this)			focusedComponent = null;	}	/**	 * Forwards key events directly to the input handler.	 * This is slightly faster than using a KeyListener	 * because some Swing overhead is avoided.	 */	public void processKeyEvent(KeyEvent evt)	{		if(inputHandler == null)			return;		switch(evt.getID())		{		case KeyEvent.KEY_TYPED:			inputHandler.keyTyped(evt);			break;		case KeyEvent.KEY_PRESSED:			inputHandler.keyPressed(evt);			break;		case KeyEvent.KEY_RELEASED:			inputHandler.keyReleased(evt);			break;		}	}	// protected members	protected static String CENTER = "center";	protected static String RIGHT = "right";	protected static String BOTTOM = "bottom";	protected static JEditTextArea focusedComponent;	protected static Timer caretTimer;		protected TextAreaPainter painter;	protected JPopupMenu popup;	protected EventListenerList listenerList;	protected MutableCaretEvent caretEvent;	protected boolean caretBlinks;	protected boolean caretVisible;	protected boolean blink;	protected boolean editable;	protected int firstLine;	protected int visibleLines;	protected int electricScroll;	protected int horizontalOffset;		protected JScrollBar vertical;	protected JScrollBar horizontal;	protected boolean scrollBarsInitialized;	protected InputHandler inputHandler;	protected SyntaxDocument document;	protected DocumentHandler documentHandler;	protected Segment lineSegment;	protected int selectionStart;	protected int selectionStartLine;	protected int selectionEnd;	protected int selectionEndLine;	protected boolean biasLeft;	protected int bracketPosition;	protected int bracketLine;	protected int magicCaret;	protected boolean overwrite;	protected boolean rectSelect;	protected void fireCaretEvent()	{		Object[] listeners = listenerList.getListenerList();		for(int i = listeners.length - 2; i >= 0; i--)		{			if(listeners[i] == CaretListener.class)			{				((CaretListener)listeners[i+1]).caretUpdate(caretEvent);			}		}	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -