/** * */ package com.xored.glance.ui.utils; import com.xored.glance.ui.sources.ColorManager; import com.xored.glance.ui.sources.Match; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.TextPresentation; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.graphics.Color; import java.util.Arrays; import java.util.Iterator; /** * @author Yuri Strot */ public class TextUtils { public static void applyStyles(final TextPresentation presentation, final Match[] matches, final Match selected) { final StyleRange[] ranges = createStyleRanges( presentation.getExtent(), matches, ColorManager.getInstance().getBackgroundColor()); presentation.mergeStyleRanges(ranges); if (selected != null) { final StyleRange[] selectedRanges = createStyleRanges( presentation.getExtent(), new Match[] {selected}, ColorManager.getInstance().getSelectedBackgroundColor()); presentation.mergeStyleRanges(selectedRanges); } } public static StyleRange copy(final StyleRange range) { final StyleRange result = new StyleRange(range); result.start = range.start; result.length = range.length; result.fontStyle = range.fontStyle; return result; } public static StyleRange[] copy(final StyleRange[] ranges) { final StyleRange[] result = new StyleRange[ranges.length]; for (int i = 0; i < result.length; i++) { result[i] = copy(ranges[i]); } return result; } public static StyleRange[] getStyles(final TextPresentation presentation) { final StyleRange[] ranges = new StyleRange[presentation.getDenumerableRanges()]; final Iterator<?> e = presentation.getAllStyleRangeIterator(); for (int i = 0; e.hasNext(); i++) { ranges[i] = (StyleRange) e.next(); } return ranges; } private static StyleRange[] createStyleRanges(final IRegion region, final Match[] matches, final Color color) { final Match[] regionMatches = getRangeMatches(region.getOffset(), region.getLength(), matches); final StyleRange[] ranges = new StyleRange[regionMatches.length]; for (int i = 0; i < regionMatches.length; i++) { final StyleRange range = new StyleRange( regionMatches[i].getOffset(), regionMatches[i].getLength(), null, color); ranges[i] = range; } return ranges; } private static int getPosition(final int offset, final Match[] matches) { final int index = Arrays.binarySearch(matches, new Match(null, offset, 0)); if (index >= 0) { return index; } return -index - 1; } private static Match[] getRangeMatches(final int start, final int length, final Match[] matches) { int from = getPosition(start, matches); if (from >= matches.length) { return Match.EMPTY; } if (from > 0) { final Match border = matches[from - 1]; if (border.getLength() + border.getOffset() > start) { from--; } } final int to = getPosition(start + length, matches) - 1; if (from <= to) { final Match[] result = new Match[to - from + 1]; System.arraycopy(matches, from, result, 0, result.length); return result; } return Match.EMPTY; } }