package org.clothocad.tool.primerdesigner; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.BadLocationException; import javax.swing.text.Highlighter; import javax.swing.text.Highlighter.Highlight; import org.openide.util.Exceptions; /** * * @author Jenhan Tao */ public class PrimerDesignerListener implements DocumentListener { PrimerDesignerListener(DesignFrame df) { _view = df; } @Override public void insertUpdate(DocumentEvent e) { Highlighter hl = _view.getSequenceTextField().getHighlighter(); Highlight[] highlights = hl.getHighlights(); for (int i = 0; i < highlights.length; i++) { javax.swing.text.Highlighter.Highlight u = highlights[i]; //modified only when the evt is add at the end of the old hightlight, thus end of evt is end of u if ((u.getStartOffset() < e.getOffset()) && (u.getEndOffset() == e.getOffset() + e.getLength()) ) { System.out.println("end"); try { hl.changeHighlight(u, u.getStartOffset(), u.getEndOffset() - e.getLength()); } catch (javax.swing.text.BadLocationException ble) { ble.printStackTrace(); } //add in front of highlight } else if ((u.getStartOffset() >=e.getOffset())) { try { hl.changeHighlight(u, u.getStartOffset()+e.getLength(), u.getEndOffset() + e.getLength()); } catch (javax.swing.text.BadLocationException ble) { ble.printStackTrace(); } }//if add in the middle of the ORF hightlight, delete the hightlight else if ((u.getStartOffset() < e.getOffset()) && (u.getEndOffset() > e.getOffset() + e.getLength()) ) { System.out.println("mmiddle"); hl.removeHighlight(u); } } _view.updateLabels(); _view.getController().updateSequence(_view.getText()); } @Override public void removeUpdate(DocumentEvent e) { Highlighter hl = _view.getSequenceTextField().getHighlighter(); Highlight[] highlights = hl.getHighlights(); for (int i = 0; i < highlights.length; i++) { javax.swing.text.Highlighter.Highlight u = highlights[i]; //deleting before a higlight if (e.getOffset() < u.getStartOffset()) { try { hl.changeHighlight(u, u.getStartOffset() - e.getLength() + 1, u.getEndOffset() - e.getLength() + 1); } catch (BadLocationException ex) { Exceptions.printStackTrace(ex); } //deleting from the middle } else if ((u.getStartOffset() <= e.getOffset()) && (u.getEndOffset() >= e.getOffset() + e.getLength())) { hl.removeHighlight(u); //deleting at the end of a highlight } else if ((u.getEndOffset() == e.getOffset())) { hl.removeHighlight(u); } } _view.updateLabels(); _view.getController().updateSequence(_view.getText()); } @Override public void changedUpdate(DocumentEvent e) { _view.updateLabels(); _view.getController().updateSequence(_view.getText()); } private DesignFrame _view; }