void (int startIndex, int startOffset, int endOffset, TextAttributes attributes) { if (startOffset < 0) startOffset = 0; if (endOffset > myText.length()) endOffset = myText.length(); if (startOffset >= endOffset) return; if (myHighlightedRegions.isEmpty()){ myHighlightedRegions.add(new HighlightedRegion(startOffset, endOffset, attributes)); } else{ for(int i = startIndex; i < myHighlightedRegions.size(); i++){ HighlightedRegion hRegion = myHighlightedRegions.get(i); // must be before if (startOffset < hRegion.startOffset && endOffset <= hRegion.startOffset){ myHighlightedRegions.add(i, new HighlightedRegion(startOffset, endOffset, attributes)); break; } // must be after if (startOffset >= hRegion.endOffset){ if (i == myHighlightedRegions.size() - 1){ myHighlightedRegions.add(new HighlightedRegion(startOffset, endOffset, attributes)); break; } } // must be before and overlap if (startOffset < hRegion.startOffset) { if (endOffset < hRegion.endOffset){ myHighlightedRegions.add(i, new HighlightedRegion(startOffset, hRegion.startOffset, attributes)); myHighlightedRegions.add(i + 1, new HighlightedRegion(hRegion.startOffset, endOffset, TextAttributes.merge(hRegion.textAttributes, attributes))); hRegion.startOffset = endOffset; } else if (endOffset == hRegion.endOffset){ myHighlightedRegions.remove(hRegion); myHighlightedRegions.add(i, new HighlightedRegion(startOffset, hRegion.startOffset, attributes)); myHighlightedRegions.add(i + 1, new HighlightedRegion(hRegion.startOffset, endOffset, TextAttributes.merge(hRegion.textAttributes, attributes))); } else { // endOffset > hRegion.endOffset myHighlightedRegions.remove(hRegion); myHighlightedRegions.add(i, new HighlightedRegion(startOffset, hRegion.startOffset, attributes)); myHighlightedRegions.add(i + 1, new HighlightedRegion(hRegion.startOffset, hRegion.endOffset, TextAttributes.merge(hRegion.textAttributes, attributes))); if (i < myHighlightedRegions.size() - 1){ addHighlighter(i + 1, hRegion.endOffset, endOffset, attributes); } else{ myHighlightedRegions.add(i + 2, new HighlightedRegion(hRegion.endOffset, endOffset, attributes)); } } break; } // must be after and overlap or full overlap if (startOffset < hRegion.endOffset){ int oldEndOffset = hRegion.endOffset; hRegion.endOffset = startOffset; if (endOffset < oldEndOffset){ myHighlightedRegions.add(i + 1, new HighlightedRegion(startOffset, endOffset, TextAttributes.merge(hRegion.textAttributes, attributes))); myHighlightedRegions.add(i + 2, new HighlightedRegion(endOffset, oldEndOffset, hRegion.textAttributes)); if (startOffset == hRegion.startOffset){ myHighlightedRegions.remove(hRegion); } break; } if (endOffset == oldEndOffset){ myHighlightedRegions.add(i + 1, new HighlightedRegion(startOffset, oldEndOffset, TextAttributes.merge(hRegion.textAttributes, attributes))); if (startOffset == hRegion.startOffset){ myHighlightedRegions.remove(hRegion); } break; } myHighlightedRegions.add(i + 1, new HighlightedRegion(startOffset, oldEndOffset, TextAttributes.merge(hRegion.textAttributes, attributes))); if (i < myHighlightedRegions.size() - 1){ addHighlighter(i + 1, oldEndOffset, endOffset, attributes); } else{ myHighlightedRegions.add(i + 2, new HighlightedRegion(hRegion.endOffset, endOffset, attributes)); } if (startOffset == hRegion.startOffset){ myHighlightedRegions.remove(hRegion); } break; } } } }