Jskad/source/org/thdl/savant/TextHighlightPlayer.java
2002-09-28 00:53:39 +00:00

104 lines
No EOL
2.7 KiB
Java

package org.thdl.savant;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.text.*;
import java.awt.event.MouseListener;
public class TextHighlightPlayer extends JPanel implements AnnotationPlayer
{
protected JTextComponent text;
protected Hashtable hashStart, hashEnd, highlights;
protected Highlighter highlighter;
protected Highlighter.HighlightPainter highlightPainter;
public TextHighlightPlayer(TranscriptView view, Color highlightcolor)
{
text = view.getTextComponent();
text.setEditable(false);
MouseListener[] mls = (MouseListener[])(text.getListeners(MouseListener.class));
for (int i=0; i<mls.length; i++)
text.removeMouseListener(mls[i]);
hashStart = new Hashtable();
hashEnd = new Hashtable();
highlights = new Hashtable();
StringTokenizer stIDS = new StringTokenizer(view.getIDs(), ",");
StringTokenizer stSTARTS = new StringTokenizer(view.getStartOffsets(), ",");
StringTokenizer stENDS = new StringTokenizer(view.getEndOffsets(), ",");
while ((stIDS.hasMoreTokens()) && (stSTARTS.hasMoreTokens()) && (stENDS.hasMoreTokens())) {
String sID = stIDS.nextToken();
String sStart = stSTARTS.nextToken();
String sEnd = stENDS.nextToken();
try {
Integer start = new Integer(sStart);
hashStart.put(sID, start);
} catch (NumberFormatException err) {
hashStart.put(sID, new Integer(0));
}
try {
Integer end = new Integer(sEnd);
hashEnd.put(sID, end);
} catch (NumberFormatException err) {
hashEnd.put(sID, new Integer(0));
}
}
highlighter = text.getHighlighter();
highlightPainter = new DefaultHighlighter.DefaultHighlightPainter(highlightcolor);
setLayout(new GridLayout(1,1));
add(new JScrollPane(text));
}
public boolean isPlayableAnnotation(String id)
{
return hashStart.containsKey(id);
}
public void startAnnotation(String id)
{
if (isPlayableAnnotation(id))
highlight(id);
}
public void stopAnnotation(String id)
{
if (isPlayableAnnotation(id))
unhighlight(id);
}
private void highlight(String id)
{
try
{
Integer startInt = (Integer)hashStart.get(id);
Integer endInt = (Integer)hashEnd.get(id);
int start = startInt.intValue();
int end = endInt.intValue();
Object tag = highlighter.addHighlight(start, end, highlightPainter);
highlights.put(id, tag);
try
{
Rectangle rect = text.modelToView(end);
text.scrollRectToVisible(rect);
text.repaint();
} catch (BadLocationException ble) {}
}
catch (BadLocationException ble)
{
ble.printStackTrace();
}
}
private void unhighlight(String id)
{
if (highlights.containsKey(id))
{
highlighter.removeHighlight(highlights.get(id));
highlights.remove(id);
}
}
}