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 + -
显示快捷键?