--- /dev/null
+package net.sourceforge.phpeclipse.phpeditor;
+
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import org.eclipse.swt.SWT;
+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.Rectangle;
+
+import org.eclipse.jface.text.source.ISourceViewer;
+
+
+
+public class PrintMarginPainter implements IPainter, PaintListener {
+
+
+ private StyledText fTextWidget;
+
+ private int fMarginWidth= 80;
+ private Color fColor;
+ private int fLineStyle= SWT.LINE_SOLID;
+ private int fLineWidth= 1;
+
+ private int fCachedWidgetX= -1;
+ private boolean fIsActive= false;
+
+ public PrintMarginPainter(ISourceViewer sourceViewer) {
+ fTextWidget= sourceViewer.getTextWidget();
+ }
+
+ public void setMarginRulerColumn(int width) {
+ fMarginWidth= width;
+ intialize();
+ }
+
+ public void setMarginRulerStyle(int lineStyle) {
+ fLineStyle= lineStyle;
+ }
+
+ public void setMarginRulerWidth(int lineWidth) {
+ fLineWidth= lineWidth;
+ }
+
+ /**
+ * Must be called before <code>paint</code> is called the first time.
+ */
+ public void setMarginRulerColor(Color color) {
+ fColor= color;
+ }
+
+ /**
+ * Must be called explicitly when font of text widget changes.
+ */
+ public void intialize() {
+ computeWidgetX();
+ fTextWidget.redraw();
+ }
+
+ private void computeWidgetX() {
+ GC gc= new GC(fTextWidget);
+ int pixels= gc.getFontMetrics().getAverageCharWidth();
+ gc.dispose();
+
+ fCachedWidgetX= pixels * fMarginWidth;
+ }
+
+ /*
+ * @see IPainter#deactivate(boolean)
+ */
+ public void deactivate(boolean redraw) {
+ if (fIsActive) {
+ fIsActive= false;
+ fTextWidget.removePaintListener(this);
+ if (redraw)
+ fTextWidget.redraw();
+ }
+ }
+
+ /*
+ * @see IPainter#dispose()
+ */
+ public void dispose() {
+ fTextWidget= null;
+ }
+
+ /*
+ * @see IPainter#paint(int)
+ */
+ public void paint(int reason) {
+ if (!fIsActive) {
+ fIsActive= true;
+ fTextWidget.addPaintListener(this);
+ if (fCachedWidgetX == -1)
+ computeWidgetX();
+ fTextWidget.redraw();
+ }
+ }
+
+ /*
+ * @see IPainter#setPositionManager(IPositionManager)
+ */
+ public void setPositionManager(IPositionManager manager) {
+ }
+
+ /*
+ * @see PaintListener#paintControl(PaintEvent)
+ */
+ public void paintControl(PaintEvent e) {
+ if (fTextWidget != null) {
+ int x= fCachedWidgetX - fTextWidget.getHorizontalPixel();
+ if (x >= 0) {
+ Rectangle area= fTextWidget.getClientArea();
+ e.gc.setForeground(fColor);
+ e.gc.setLineStyle(fLineStyle);
+ e.gc.setLineWidth(fLineWidth);
+ e.gc.drawLine(x, 0, x, area.height);
+ }
+ }
+ }
+}