X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/BracketPainter.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/BracketPainter.java new file mode 100644 index 0000000..55eea03 --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/BracketPainter.java @@ -0,0 +1,171 @@ +package net.sourceforge.phpeclipse.phpeditor; + +/* + * (c) Copyright IBM Corp. 2000, 2001. + * All Rights Reserved. + */ + +import net.sourceforge.phpdt.internal.ui.text.PHPPairMatcher; + +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.ITextViewerExtension3; +import org.eclipse.jface.text.Position; +import org.eclipse.jface.text.Region; +import org.eclipse.jface.text.source.ISourceViewer; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Point; + + +public final class BracketPainter implements IPainter, PaintListener { + + private PHPPairMatcher fMatcher= new PHPPairMatcher(new char[] { '{', '}', '(', ')', '[', ']' }); + private Position fBracketPosition= new Position(0, 0); + private int fAnchor; + + private boolean fIsActive= false; + private ISourceViewer fSourceViewer; + private StyledText fTextWidget; + private Color fColor; + + private IPositionManager fPositionManager; + + + public BracketPainter(ISourceViewer sourceViewer) { + fSourceViewer= sourceViewer; + fTextWidget= sourceViewer.getTextWidget(); + } + + public void setHighlightColor(Color color) { + fColor= color; + } + + public void dispose() { + if (fMatcher != null) { + fMatcher.dispose(); + fMatcher= null; + } + + fColor= null; + fTextWidget= null; + } + + public void deactivate(boolean redraw) { + if (fIsActive) { + fIsActive= false; + fTextWidget.removePaintListener(this); + if (fPositionManager != null) + fPositionManager.removeManagedPosition(fBracketPosition); + if (redraw) + handleDrawRequest(null); + } + } + + public void paintControl(PaintEvent event) { + if (fTextWidget != null) + handleDrawRequest(event.gc); + } + + private void handleDrawRequest(GC gc) { + + if (fBracketPosition.isDeleted) + return; + + int offset= fBracketPosition.getOffset(); + int length= fBracketPosition.getLength(); + if (length < 1) + return; + + if (fSourceViewer instanceof ITextViewerExtension3) { + ITextViewerExtension3 extension= (ITextViewerExtension3) fSourceViewer; + IRegion widgetRange= extension.modelRange2WidgetRange(new Region(offset, length)); + if (widgetRange == null) + return; + + offset= widgetRange.getOffset(); + length= widgetRange.getLength(); + + } else { + IRegion region= fSourceViewer.getVisibleRegion(); + if (region.getOffset() > offset || region.getOffset() + region.getLength() < offset + length) + return; + offset -= region.getOffset(); + } + + if (PHPPairMatcher.RIGHT == fAnchor) + draw(gc, offset, 1); + else + draw(gc, offset + length -1, 1); + } + + private void draw(GC gc, int offset, int length) { + if (gc != null) { + Point left= fTextWidget.getLocationAtOffset(offset); + Point right= fTextWidget.getLocationAtOffset(offset + length); + + gc.setForeground(fColor); + gc.drawRectangle(left.x, left.y, right.x - left.x - 1, gc.getFontMetrics().getHeight() - 1); + + } else { + fTextWidget.redrawRange(offset, length, true); + } + } + + /* + * @see IPainter#paint(int) + */ + public void paint(int reason) { + Point selection= fSourceViewer.getSelectedRange(); + if (selection.y > 0) { + deactivate(true); + return; + } + + IRegion pair= fMatcher.match(fSourceViewer.getDocument(), selection.x); + if (pair == null) { + deactivate(true); + return; + } + + if (fIsActive) { + // only if different + if (pair.getOffset() != fBracketPosition.getOffset() || + pair.getLength() != fBracketPosition.getLength() || + fMatcher.getAnchor() != fAnchor) { + + // remove old highlighting + handleDrawRequest(null); + // update position + fBracketPosition.isDeleted= false; + fBracketPosition.offset= pair.getOffset(); + fBracketPosition.length= pair.getLength(); + fAnchor= fMatcher.getAnchor(); + // apply new highlighting + handleDrawRequest(null); + + } + } else { + + fIsActive= true; + + fBracketPosition.isDeleted= false; + fBracketPosition.offset= pair.getOffset(); + fBracketPosition.length= pair.getLength(); + fAnchor= fMatcher.getAnchor(); + + fTextWidget.addPaintListener(this); + fPositionManager.addManagedPosition(fBracketPosition); + handleDrawRequest(null); + } + } + + /* + * @see IPainter#setPositionManager(IPositionManager) + */ + public void setPositionManager(IPositionManager manager) { + fPositionManager= manager; + } +}