gutter.java

来自「用java 编写的源码开放的文本编辑器。有很多有用的特性」· Java 代码 · 共 934 行 · 第 1/2 页

JAVA
934
字号
	 * When bracket highlighting is enabled, the bracket matching the	 * one before the caret (if any) is highlighted.	 * @since jEdit 4.0pre1	 */	public final boolean isBracketHighlightEnabled()	{		return bracketHighlight;	} //}}}	//{{{ setBracketHighlightEnabled() method	/**	 * Enables or disables bracket highlighting.	 * When bracket highlighting is enabled, the bracket matching the	 * one before the caret (if any) is highlighted.	 * @param bracketHighlight True if bracket highlighting should be	 * enabled, false otherwise	 * @since jEdit 4.0pre1	 */	public final void setBracketHighlightEnabled(boolean bracketHighlight)	{		this.bracketHighlight = bracketHighlight;		repaint();	} //}}}	//{{{ getMarkerHighlightColor() method	public Color getMarkerHighlightColor()	{		return markerHighlightColor;	} //}}}	//{{{ setMarkerHighlightColor() method	public void setMarkerHighlightColor(Color markerHighlightColor)	{		this.markerHighlightColor = markerHighlightColor;	} //}}}	//{{{ isMarkerHighlightEnabled() method	public boolean isMarkerHighlightEnabled()	{		return markerHighlight;	} //}}}	//{{{ isMarkerHighlightEnabled()	public void setMarkerHighlightEnabled(boolean markerHighlight)	{		this.markerHighlight = markerHighlight;	} //}}}	//}}}	//{{{ Private members	//{{{ Instance variables	private static final int FOLD_MARKER_SIZE = 12;	private View view;	private JEditTextArea textArea;	private ExtensionManager extensionMgr;	private int baseline;	private Dimension gutterSize = new Dimension(0,0);	private Dimension collapsedSize = new Dimension(0,0);	private Color intervalHighlight;	private Color currentLineHighlight;	private Color foldColor;	private FontMetrics fm;	private int alignment;	private int interval;	private boolean currentLineHighlightEnabled;	private boolean expanded;	private boolean bracketHighlight;	private Color bracketHighlightColor;	private boolean markerHighlight;	private Color markerHighlightColor;	private int borderWidth;	private Border focusBorder, noFocusBorder;	//}}}	//{{{ paintLine() method	private void paintLine(Graphics2D gfx, int line, int y)	{		Buffer buffer = textArea.getBuffer();		int lineHeight = textArea.getPainter().getFontMetrics()			.getHeight();		ChunkCache.LineInfo info = textArea.chunkCache.getLineInfo(line);		if(!info.chunksValid)			System.err.println("gutter paint: not valid");		int physicalLine = info.physicalLine;		//{{{ Paint text area extensions		if(physicalLine != -1)		{			int start = textArea.getScreenLineStartOffset(line);			int end = textArea.getScreenLineEndOffset(line);			extensionMgr.paintValidLine(gfx,line,physicalLine,start,end,y);		}		else			extensionMgr.paintInvalidLine(gfx,line,y);		//}}}		// Skip lines beyond EOF		if(physicalLine == -1)			return;		//{{{ Paint fold triangles		if(info.firstSubregion			&& physicalLine != buffer.getLineCount() - 1			&& buffer.isFoldStart(physicalLine))		{			int _y = y + lineHeight / 2;			gfx.setColor(foldColor);			if(textArea.getFoldVisibilityManager()				.isLineVisible(physicalLine + 1))			{				gfx.drawLine(1,_y - 3,10,_y - 3);				gfx.drawLine(2,_y - 2,9,_y - 2);				gfx.drawLine(3,_y - 1,8,_y - 1);				gfx.drawLine(4,_y,7,_y);				gfx.drawLine(5,_y + 1,6,_y + 1);			}			else			{				gfx.drawLine(4,_y - 5,4,_y + 4);				gfx.drawLine(5,_y - 4,5,_y + 3);				gfx.drawLine(6,_y - 3,6,_y + 2);				gfx.drawLine(7,_y - 2,7,_y + 1);				gfx.drawLine(8,_y - 1,8,_y);			}		} //}}}		//{{{ Paint bracket scope		else if(bracketHighlight)		{			int bracketLine = textArea.getBracketLine();			int caretLine = textArea.getCaretLine();			if(textArea.isBracketHighlightVisible()				&& physicalLine >= Math.min(caretLine,bracketLine)				&& physicalLine <= Math.max(caretLine,bracketLine))			{				int caretScreenLine;				if(caretLine > textArea.getLastPhysicalLine())					caretScreenLine = Integer.MAX_VALUE;				else				{					caretScreenLine = textArea						.getScreenLineOfOffset(						textArea.getCaretPosition());				}				int bracketScreenLine;				if(bracketLine > textArea.getLastPhysicalLine())					bracketScreenLine = Integer.MAX_VALUE;				else				{					bracketScreenLine = textArea.chunkCache						.getScreenLineOfOffset(						bracketLine,						textArea.getBracketPosition());				}				if(caretScreenLine > bracketScreenLine)				{					int tmp = caretScreenLine;					caretScreenLine = bracketScreenLine;					bracketScreenLine = tmp;				}				gfx.setColor(bracketHighlightColor);				if(bracketScreenLine == caretScreenLine)				{					// do nothing				}				else if(line == caretScreenLine)				{					gfx.fillRect(5,						y						+ lineHeight / 2,						5,						2);					gfx.fillRect(5,						y						+ lineHeight / 2,						2,						lineHeight - lineHeight / 2);				}				else if(line == bracketScreenLine)				{					gfx.fillRect(5,						y,						2,						lineHeight / 2);					gfx.fillRect(5,						y + lineHeight / 2,						5,						2);				}				else if(line > caretScreenLine					&& line < bracketScreenLine)				{					gfx.fillRect(5,						y,						2,						lineHeight);				}			}		} //}}}		//{{{ Paint line numbers		if(info.firstSubregion && expanded)		{			String number = Integer.toString(physicalLine + 1);			int offset;			switch (alignment)			{			case RIGHT:				offset = gutterSize.width - collapsedSize.width					- (fm.stringWidth(number) + 1);				break;			case CENTER:				offset = ((gutterSize.width - collapsedSize.width)					- fm.stringWidth(number)) / 2;				break;			case LEFT: default:				offset = 0;				break;			}			boolean highlightCurrentLine = currentLineHighlightEnabled				&& textArea.selection.size() == 0;			if (physicalLine == textArea.getCaretLine() && highlightCurrentLine)			{				gfx.setColor(currentLineHighlight);			}			else if (interval > 1 && (line				+ textArea.getFirstLine() + 1)				% interval == 0)				gfx.setColor(intervalHighlight);			else				gfx.setColor(getForeground());			gfx.drawString(number, FOLD_MARKER_SIZE + offset,				baseline + y);		} //}}}	} //}}}	//}}}	//{{{ MouseHandler class	class MouseHandler extends MouseInputAdapter	{		boolean drag;		int toolTipInitialDelay, toolTipReshowDelay;		//{{{ mouseEntered() method		public void mouseEntered(MouseEvent e)		{			ToolTipManager ttm = ToolTipManager.sharedInstance();			toolTipInitialDelay = ttm.getInitialDelay();			toolTipReshowDelay = ttm.getReshowDelay();			ttm.setInitialDelay(0);			ttm.setReshowDelay(0);		} //}}}		//{{{ mouseExited() method		public void mouseExited(MouseEvent evt)		{			ToolTipManager ttm = ToolTipManager.sharedInstance();			ttm.setInitialDelay(toolTipInitialDelay);			ttm.setReshowDelay(toolTipReshowDelay);		} //}}}		//{{{ mousePressed() method		public void mousePressed(MouseEvent e)		{			if(GUIUtilities.isPopupTrigger(e)				|| e.getX() >= getWidth() - borderWidth * 2)			{				e.translatePoint(-getWidth(),0);				textArea.mouseHandler.mousePressed(e);				drag = true;			}			else			{				Buffer buffer = textArea.getBuffer();				int screenLine = e.getY() / textArea.getPainter()					.getFontMetrics().getHeight();				textArea.chunkCache.updateChunksUpTo(screenLine);				int line = textArea.chunkCache.getLineInfo(screenLine)					.physicalLine;				if(line == -1)					return;				FoldVisibilityManager foldVisibilityManager					= textArea.getFoldVisibilityManager();				//{{{ Clicking on fold triangle does various things				if(buffer.isFoldStart(line))				{					StringBuffer property = new StringBuffer(						"view.gutter.gutter");					if(e.isShiftDown())						property.append("Shift");					if(e.isControlDown())						property.append("Control");					if(e.isAltDown())						property.append("Alt");					property.append("Click");					String action = jEdit.getProperty(property						.toString());					if(action == null)					{						action = jEdit.getProperty(							"view.gutter.gutterClick");					}					if(action == null)						action = "toggleFold";					if(action.equals("selectFold"))					{						foldVisibilityManager							.expandFold(line,true);						textArea.selectFold(line);					}					else if(foldVisibilityManager						.isLineVisible(line + 1))					{						foldVisibilityManager							.collapseFold(line);					}					else					{						if(action.equals(							"toggleFoldFully"))						{							foldVisibilityManager								.expandFold(line,								true);						}						else						{							foldVisibilityManager								.expandFold(line,								false);						}					}				} //}}}				//{{{ Clicking in bracket scope locates matching bracket				else if(bracketHighlight)				{					if(textArea.isBracketHighlightVisible())					{						int bracketLine = textArea.getBracketLine();						int caretLine = textArea.getCaretLine();						if(caretLine != bracketLine)						{							if(caretLine > bracketLine)							{								int tmp = caretLine;								caretLine = bracketLine;								bracketLine = tmp;							}							if(line >= caretLine								&& line <= bracketLine)							{								if(e.isControlDown())									textArea.selectToMatchingBracket();								else									textArea.goToMatchingBracket();							}						}					}				} //}}}			}		} //}}}		//{{{ mouseDragged() method		public void mouseDragged(MouseEvent e)		{			if(drag /* && e.getX() >= getWidth() - borderWidth * 2 */)			{				e.translatePoint(-getWidth(),0);				textArea.mouseHandler.mouseDragged(e);			}		} //}}}		//{{{ mouseReleased() method		public void mouseReleased(MouseEvent e)		{			if(drag && e.getX() >= getWidth() - borderWidth * 2)			{				e.translatePoint(-getWidth(),0);				textArea.mouseHandler.mouseReleased(e);			}			drag = false;		} //}}}	} //}}}	//{{{ MarkerHighlight class	class MarkerHighlight extends TextAreaExtension	{		//{{{ paintValidLine() method		public void paintValidLine(Graphics2D gfx, int screenLine,			int physicalLine, int start, int end, int y)		{			if(isMarkerHighlightEnabled())			{				Buffer buffer = textArea.getBuffer();				if(buffer.getMarkerInRange(start,end) != null)				{					gfx.setColor(getMarkerHighlightColor());					FontMetrics fm = textArea.getPainter().getFontMetrics();					gfx.fillRect(0,y,textArea.getGutter()						.getWidth(),fm.getHeight());				}			}		} //}}}		//{{{ getToolTipText() method		public String getToolTipText(int x, int y)		{			if(isMarkerHighlightEnabled())			{				int line = y / textArea.getPainter().getFontMetrics().getHeight();				int start = textArea.getScreenLineStartOffset(line);				int end = textArea.getScreenLineEndOffset(line);				if(start == -1 || end == -1)					return null;				Marker marker = textArea.getBuffer().getMarkerInRange(start,end);				if(marker != null)				{					char shortcut = marker.getShortcut();					if(shortcut == '\0')						return jEdit.getProperty("view.gutter.marker.no-name");					else					{						String[] args = { String.valueOf(shortcut) };						return jEdit.getProperty("view.gutter.marker",args);					}				}			}			return null;		} //}}}	} //}}}}

⌨️ 快捷键说明

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