001 package nl.cwi.sen1.gui.plugin.editor; 002 003 import java.awt.Graphics; 004 import java.awt.Rectangle; 005 006 import javax.swing.text.AbstractDocument; 007 import javax.swing.text.BoxView; 008 import javax.swing.text.ComponentView; 009 import javax.swing.text.Element; 010 import javax.swing.text.IconView; 011 import javax.swing.text.LabelView; 012 import javax.swing.text.ParagraphView; 013 import javax.swing.text.StyleConstants; 014 import javax.swing.text.View; 015 import javax.swing.text.ViewFactory; 016 017 class NumberedEditorKit extends EditorKit { 018 private static final ViewFactory defaultFactory = new NumberedViewFactory(); 019 020 public NumberedEditorKit() { 021 super(); 022 } 023 024 public ViewFactory getViewFactory() { 025 return defaultFactory; 026 } 027 028 static class NumberedViewFactory implements ViewFactory { 029 public View create(Element elem) { 030 String kind = elem.getName(); 031 if (kind != null) 032 if (kind.equals(AbstractDocument.ContentElementName)) { 033 return new LabelView(elem); 034 } else if (kind.equals(AbstractDocument.ParagraphElementName)) { 035 // return new ParagraphView(elem); 036 return new NumberedParagraphView(elem); 037 } else if (kind.equals(AbstractDocument.SectionElementName)) { 038 return new BoxView(elem, View.Y_AXIS); 039 } else if (kind.equals(StyleConstants.ComponentElementName)) { 040 return new ComponentView(elem); 041 } else if (kind.equals(StyleConstants.IconElementName)) { 042 return new IconView(elem); 043 } 044 // default to text display 045 return new LabelView(elem); 046 } 047 } 048 049 static class NumberedParagraphView extends ParagraphView { 050 public static short NUMBERS_WIDTH = 25; 051 052 public NumberedParagraphView(Element e) { 053 super(e); 054 short top = 0; 055 short left = 0; 056 short bottom = 0; 057 short right = 0; 058 this.setInsets(top, left, bottom, right); 059 } 060 061 protected void setInsets(short top, short left, short bottom, 062 short right) { 063 super.setInsets(top, (short) (left + NUMBERS_WIDTH), bottom, right); 064 } 065 066 public void paintChild(Graphics g, Rectangle r, int n) { 067 super.paintChild(g, r, n); 068 int previousLineCount = getPreviousLineCount(); 069 int numberX = r.x - getLeftInset(); 070 int numberY = r.y + r.height - 5; 071 g.drawString(Integer.toString(previousLineCount + n + 1), numberX, 072 numberY); 073 } 074 075 public int getPreviousLineCount() { 076 int lineCount = 0; 077 View parent = this.getParent(); 078 int count = parent.getViewCount(); 079 for (int i = 0; i < count; i++) { 080 if (parent.getView(i) == this) { 081 break; 082 } 083 lineCount += parent.getView(i).getViewCount(); 084 } 085 return lineCount; 086 } 087 } 088 }