読者です 読者をやめる 読者になる 読者になる

XMLContext.java改良版

コメントの着色に対応してみた。
せっかくなので公開しておいてみる。
XMLContext.java

import java.awt.*;
import javax.swing.text.*;


public class XMLContext extends StyleContext implements ViewFactory {

	public View create(Element elem) {
		return new XmlView(elem);
	}

	class XmlView extends PlainView {

		XmlView(Element elem) {
		    super(elem);
		}

	        public void paint(Graphics g, Shape a) {
		    super.paint(g, a);
		}
	        
		/**
		 * モデル内の指定された範囲を、選択解除した通常のテキストで描画します。
		 * フォアグラウンドカラーまたは使用不可の色を使ってテキストを描画します。
		 *
		 * @param g グラフィックスコンテキスト
		 * @param x 開始 X 座標 >= 0
		 * @param y 開始 Y 座標 >= 0
		 * @param p0 モデル内の開始位置 >= 0
		 * @param p1 モデル内の終了位置 >= 0
		 * @returns 範囲の終了の X 位置 >= 0
		 * @exception 範囲が無効な場合
		 */
	        protected int drawUnselectedText(Graphics g, int x, int y,int p0, int p1) throws BadLocationException {
	        	//if(p0 == 0){
	        		mLastColor = mNormalColor;
	        	//}
	        	Document doc = getDocument();
		    	Segment text = new Segment();
		    	Segment token = new Segment();

		    	doc.getText(p0, p1 - p0, text);
		    	text.setIndex(text.getBeginIndex());

		    	for(;text.getIndex() < text.getEndIndex();text.next()){
		    		
		    		mLastColor = isTagStart(text,mLastColor);

		    		g.setColor(mLastColor);
		    		doc.getText(p0 + text.getIndex() - text.getBeginIndex(), 1, token);
		    		x = Utilities.drawTabbedText(token, x, y, g, this, 0);
		    		
		    		mLastColor = isTagEnd(text,mLastColor);
		    	}
		    	
		    	
		    	return x;
	        }
	        Color mLastColor = Color.BLACK;
	        Color mNormalColor = Color.BLACK;
	    	Color mTagColor = Color.BLUE;
	    	Color mCommentColor = Color.LIGHT_GRAY;
	        
	    	/**
			 * タグまたはコメントの開始を引数のテキストから検出し適切な色を返します。
			 *
			 * @param text テキスト
			 * @param color 現在の色
			 * @returns 色
			 */
	    	final Color isTagStart(Segment text,Color color){
	        	if(text.current() == '<'){
	    			if(text.next() == '!'){
	    				if(text.next() == '-'){
	    					if(text.next() == '-'){
	    						color = mCommentColor;
		    				}
	    					text.previous();
	    				}
	    				text.previous();
	    			} else {
	    				if(color != mCommentColor){
	    					color = mTagColor;
	    				}
	    			}
	    			text.previous();
	    		}
	        	return color;
	        }
	        
	        /**
			 * タグまたはコメントの終了を引数のテキストから検出し適切な色を返します。
			 *
			 * @param text テキスト
			 * @param color 現在の色
			 * @returns 色
			 */
	        final Color isTagEnd(Segment text,Color color){
	        	if(text.current() == '>'){
	        		
	    			if(text.previous() == '-'){
	    				if(text.previous() == '-'){
	    					color = mNormalColor;
		    			}
		    			text.next();
	    				text.next();
	    			} else {
	    				text.next();
	    			}
	    			
	    			if(color != mCommentColor){
	    				color = mNormalColor;
	    			}
	    		}
	        	return color;
	        }
	}
}

簡単なテストしかしてないからバグがあるかも。
折り返し問題はXMLContextのインナークラスであるXmlViewクラスの継承元をWrappedPlainViewからPlainViewクラスに
変更することで一応解決できるようです。
わざわざクラスごと分けてるとは思わなかったのでまったく気づかなかったよ。