/*******************************************************************************
* Copyright (c) 2008 xored software, Inc.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* xored software, Inc. - initial API and Implementation (Yuri Strot)
*******************************************************************************/
package com.xored.glance.ui.controls.text.styled;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Color;
import com.xored.glance.ui.sources.ColorManager;
import com.xored.glance.ui.sources.Match;
/**
* @author Yuri Strot
*
*/
public class StyledTextSource extends AbstractStyledTextSource {
public StyledTextSource(final StyledText text) {
super(text);
}
@Override
protected void doDispose() {
super.doDispose();
clearAll();
}
protected void clearAll() {
clearHighlight();
clearSelected();
}
protected void clearHighlight() {
if (previous != null && previous.length > 0) {
for (int i = 0; i < previous.length; i++) {
clearRangeGroup(previous[i]);
}
}
previous = null;
}
protected void clearSelected() {
if (selectedRange != null) {
clearRangeGroup(selectedRange);
selectedRange = null;
}
}
private void clearRangeGroup(final RangeGroup group){
getText().replaceStyleRanges(group.getStart(),
group.getEnd() - group.getStart(), new StyleRange[0]);
final StyleRange[] ranges = group.getRanges();
for (final StyleRange range : ranges) {
getText().replaceStyleRanges(range.start, range.length,
new StyleRange[] { range });
}
}
@Override
public void select(final Match match) {
super.select(match);
clearSelected();
if (match != null) {
final List<StyleRange> ranges = createRanges(match, ColorManager.getInstance()
.getSelectedBackgroundColor());
selectedRange = new RangeGroup(match.getOffset(), match.getOffset() + match.getLength(),
ranges.toArray(new StyleRange[ranges.size()]));
}
}
public void show(final Match[] matches) {
clearAll();
previous = new RangeGroup[matches.length];
for (int i = 0; i < matches.length; i++) {
final Match match = matches[i];
final List<StyleRange> ranges = createRanges(match, ColorManager.getInstance()
.getBackgroundColor());
previous[i] = new RangeGroup(match.getOffset(), match.getOffset() + match.getLength(),
ranges
.toArray(new StyleRange[ranges.size()]));
}
if (selected != null) {
select(selected);
}
}
private List<StyleRange> createRanges(final Match match, final Color bg) {
int index = match.getOffset();
final int lastIndex = index + match.getLength();
final StyleRange[] matchRanges = getText().getStyleRanges(index, match.getLength());
final List<StyleRange> ranges = new ArrayList<StyleRange>();
for (final StyleRange styleRange : matchRanges) {
ranges.add(styleRange);
if (styleRange.length < 0) {
continue;
}
final StyleRange newStyleRange = new StyleRange(styleRange.start, styleRange.length, null, bg,
styleRange.fontStyle);
if (styleRange.start - index > 0)
getText().replaceStyleRanges(index, styleRange.start - index,
new StyleRange[] { newStyleRange });
getText().replaceStyleRanges(styleRange.start, styleRange.length,
new StyleRange[] { newStyleRange });
index = styleRange.start + styleRange.length;
}
if (lastIndex - index > 0) {
final StyleRange newStyleRange = new StyleRange(index, lastIndex - index, null, bg);
getText().replaceStyleRanges(index, lastIndex - index, new StyleRange[] { newStyleRange });
}
return ranges;
}
private RangeGroup[] previous;
private RangeGroup selectedRange;
}