CodePane.java
Dosyayı İndir
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
public class CodePane extends JTextPane implements DocumentListener{
private SimpleAttributeSet theDefaultAttributeSet=new SimpleAttributeSet();
private SimpleAttributeSet theElementAttributeSet=new SimpleAttributeSet();
private SimpleAttributeSet theAttributeAttributeSet=new SimpleAttributeSet();
private DocumentEvent event;
public CodePane(){
getDocument().addDocumentListener(this);
StyleConstants.setForeground(theElementAttributeSet,Color.blue);
StyleConstants.setBold(theElementAttributeSet,true);
StyleConstants.setForeground(theAttributeAttributeSet,new Color(0xaa,0x5a,0xcc));
StyleConstants.setBold(theAttributeAttributeSet,true);
StyleConstants.setForeground(theDefaultAttributeSet,Color.black);
StyleConstants.setBold(theDefaultAttributeSet,false);
}
public void changedUpdate(DocumentEvent e){}
public void insertUpdate(DocumentEvent e){
event=e;
Runnable runnable=new Runnable(){
public void run(){
stylize(event);
}
};
SwingUtilities.invokeLater(runnable);
}
public void removeUpdate(DocumentEvent e){
event=e;
Runnable runnable=new Runnable(){
public void run(){
stylize(event);
}
};
SwingUtilities.invokeLater(runnable);
}
private void stylize(DocumentEvent e){
try{
int start=getStartIndex(e);
int finish=getFinishIndex(e);
stylize((StyledDocument)e.getDocument(),start,finish);
}catch(Exception ex){
ex.printStackTrace();
}
}
private void stylize(StyledDocument document,int start,int finish){
try{
boolean done=false;
document.setCharacterAttributes(start,finish-start+1,theDefaultAttributeSet,false);
String text=document.getText(start,finish-start+1);
int last=0;
while(!done){
int lt=text.indexOf('<',last);
if(lt!=-1){
int gt=text.indexOf('>',lt+1);
if(gt!=-1){
try{
document.setCharacterAttributes(start+lt,gt-lt+1,theElementAttributeSet,false);
styleAttibuteValues(document,text,lt,gt,start);
last=gt+1;
}catch(Throwable e){
e.printStackTrace();
}
}else{
done=true;
}
}else{
done=true;
}
}
}catch(Throwable e){
e.printStackTrace();
}
}
private void styleAttibuteValues(StyledDocument document,String text,int lt,int gt,int start){
try{
boolean done=false;
int last=lt;
while(!done){
int opener=text.indexOf('\"',last);
if(opener!=-1){
int closer=text.indexOf('\"',opener+1);
if(closer!=-1 && closer<gt){
document.setCharacterAttributes(start+opener,closer-opener+1,theAttributeAttributeSet,false);
last=closer+1;
}else{
done=true;
}
}else{
done=true;
}
}
}catch(Exception e){
e.printStackTrace();
}
}
private int getStartIndex(DocumentEvent e)
throws Exception
{
int offset=e.getOffset();
int length=e.getLength();
Document doc=e.getDocument();
String text=doc.getText(0,offset+1);
int index=text.lastIndexOf("<");
if(index!=-1){
return index;
}else{
return 0;
}
}
private int getFinishIndex(DocumentEvent e)
throws Exception
{
int offset=e.getOffset();
int length=e.getLength();
Document doc=e.getDocument();
int docLength=doc.getLength();
int start=offset+length;
int finish=docLength-start;
if(e.getType()==DocumentEvent.EventType.REMOVE){
start=offset;
finish=docLength-start;
}
String text=doc.getText(start,finish);
int index=text.indexOf(">");
if(index!=-1){
return start+index;
}else{
return docLength;
}
}
}
Dosyayı İndir