/************************************************************************** OmegaT - Computer Assisted Translation (CAT) tool with fuzzy matching, translation memory, keyword search, glossaries, and translation leveraging into updated projects. Copyright (C) 2013 - Zoltan Bartko - bartkozoltan@bartkozoltan.com 2013 Alex Buloichik Home page: http://www.omegat.org/ Support center: http://groups.yahoo.com/group/OmegaT/ This file is part of OmegaT. OmegaT is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OmegaT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. **************************************************************************/ package org.omegat.gui.editor; import java.awt.Shape; import javax.swing.event.DocumentEvent; import javax.swing.text.Element; import javax.swing.text.ParagraphView; import javax.swing.text.View; import javax.swing.text.ViewFactory; /** * Custom breakspots processing required only for word wrapping issue fix: on * the editing line with wordwrap, add a new line at the beginning of the line * and write something, the word wrapping behaves in a strange way. If you paste * a long line (wrapped one), the word wrap disappears and the line gets looong. * * JDK bug 6539700(http://bugs.sun.com/view_bug.do?bug_id=6539700) : JTextPane * line wrap radically different from previous versions in jre 1.5.0_10+. Fixed * in Java 7b70. * * @author bartkoz * @author Alex Buloichik (alex73mail@gmail.com) */ public class ViewParagraph extends ParagraphView { public ViewParagraph(Element elem) { super(elem); } @Override public void removeUpdate(DocumentEvent e, Shape a, ViewFactory f) { if (isOutside(e)) { // workaround for performance issue in 1.7.0_45 return; } super.removeUpdate(e, a, f); resetBreakSpots(); } @Override public void insertUpdate(DocumentEvent e, Shape a, ViewFactory f) { if (isOutside(e)) { // workaround for performance issue in 1.7.0_45 return; } super.insertUpdate(e, a, f); resetBreakSpots(); } @Override public void changedUpdate(DocumentEvent e, Shape a, ViewFactory f) { if (isOutside(e)) { // workaround for performance issue in 1.7.0_45 return; } super.changedUpdate(e, a, f); resetBreakSpots(); } private boolean isOutside(DocumentEvent e) { return e.getOffset() + e.getLength() < getStartOffset() || getEndOffset() < e.getOffset(); } private void resetBreakSpots() { for (int i = 0; i < layoutPool.getViewCount(); i++) { View v = layoutPool.getView(i); if (v instanceof ViewLabel) { ((ViewLabel) v).resetBreakSpots(); } } } }