/* * WPCleaner: A tool to help on Wikipedia maintenance tasks. * Copyright (C) 2013 Nicolas Vervelle * * See README.txt file for licensing information. */ package org.wikipediacleaner.gui.swing.component; import javax.swing.text.Element; import javax.swing.text.MutableAttributeSet; import javax.swing.text.StyledDocument; /** * Manage selection operations on MWPane. */ public class MWPaneSelectionManager { /** * MWPane. */ private final MWPane textPane; /** * @param textPane MWPane. */ MWPaneSelectionManager(MWPane textPane) { this.textPane = textPane; } /** * Select first occurrence of text. */ public void selectFirstOccurrence() { StyledDocument doc = textPane.getStyledDocument(); int length = doc.getLength(); int lastEnd = Integer.MAX_VALUE; for (int pos = 0; pos < length; pos = lastEnd) { Element run = doc.getCharacterElement(pos); lastEnd = run.getEndOffset(); if (pos == lastEnd) { // offset + length beyond length of document, bail. break; } MutableAttributeSet attr = (MutableAttributeSet) run.getAttributes(); if ((attr != null) && (attr.getAttribute(MWPaneFormatter.ATTRIBUTE_TYPE) != null) && (attr.getAttribute(MWPaneFormatter.ATTRIBUTE_OCCURRENCE) != Boolean.FALSE)) { select(run); return; } } for (int pos = 0; pos < length; pos = lastEnd) { Element run = doc.getCharacterElement(pos); lastEnd = run.getEndOffset(); if (pos == lastEnd) { // offset + length beyond length of document, bail. break; } MutableAttributeSet attr = (MutableAttributeSet) run.getAttributes(); if ((attr != null) && (attr.getAttribute(MWPaneFormatter.ATTRIBUTE_TYPE) != null) && (attr.getAttribute(MWPaneFormatter.ATTRIBUTE_OCCURRENCE) != null)) { select(run); return; } } } /** * Select previous occurrence of text. */ public void selectPreviousOccurrence() { StyledDocument doc = textPane.getStyledDocument(); int lastStart = Integer.MIN_VALUE; for (int pos = textPane.getSelectionStart(); pos > 0; pos = lastStart) { Element run = doc.getCharacterElement(pos - 1); lastStart = run.getStartOffset(); MutableAttributeSet attr = (MutableAttributeSet) run.getAttributes(); if ((attr != null) && (attr.getAttribute(MWPaneFormatter.ATTRIBUTE_TYPE) != null) && (attr.getAttribute(MWPaneFormatter.ATTRIBUTE_OCCURRENCE) != Boolean.FALSE)) { select(run); return; } } selectLastOccurrence(); } /** * Select next occurrence of text. */ public void selectNextOccurrence() { StyledDocument doc = textPane.getStyledDocument(); int length = doc.getLength(); int lastEnd = Integer.MAX_VALUE; for (int pos = textPane.getSelectionEnd() + 1; pos < length; pos = lastEnd) { Element run = doc.getCharacterElement(pos); lastEnd = run.getEndOffset(); if (pos == lastEnd) { // offset + length beyond length of document, bail. break; } MutableAttributeSet attr = (MutableAttributeSet) run.getAttributes(); if ((attr != null) && (attr.getAttribute(MWPaneFormatter.ATTRIBUTE_TYPE) != null) && (attr.getAttribute(MWPaneFormatter.ATTRIBUTE_OCCURRENCE) != Boolean.FALSE)) { select(run); return; } } selectFirstOccurrence(); } /** * Select last occurrence of text. */ public void selectLastOccurrence() { StyledDocument doc = textPane.getStyledDocument(); int lastStart = Integer.MIN_VALUE; for (int pos = doc.getLength(); pos > 0; pos = lastStart) { Element run = doc.getCharacterElement(pos - 1); lastStart = run.getStartOffset(); MutableAttributeSet attr = (MutableAttributeSet) run.getAttributes(); if ((attr != null) && (attr.getAttribute(MWPaneFormatter.ATTRIBUTE_TYPE) != null) && (attr.getAttribute(MWPaneFormatter.ATTRIBUTE_OCCURRENCE) != Boolean.FALSE)) { select(run); return; } } } /** * @param run Element to be selected. */ private void select(Element run) { int startOffset = MWPaneFormatter.getUUIDStartOffset(textPane, run); int endOffset = MWPaneFormatter.getUUIDEndOffet(textPane, run); textPane.moveCaretPosition(startOffset); textPane.select( startOffset, endOffset); } }