blob: fae6ef8fc4f0b00ce7e29b518a3915f1bc3aa4ff [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 Exyte
* 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:
* Yuri Strot - initial API and Implementation
******************************************************************************/
package org.eclipse.ui.glance.controls.text.styled;
import org.eclipse.jface.text.Region;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.glance.sources.Match;
/**
* For all rich text components we remove native selection (make it empty) to
* draw our own colorful current match. However if focus was moved back to text
* component, selection should be drawn as usually.
*
* TextSelector manages this behavior.
*
* @author Yuri Strot
*/
public abstract class TextSelector implements FocusListener {
public void setMatch(Match match) {
this.match = match;
if (match != null) {
reveal(match.getOffset(), match.getLength());
}
}
public void dispose() {
getControl().removeFocusListener(this);
showSelection();
}
public void focusLost(FocusEvent e) {
hideSelection();
}
public void focusGained(FocusEvent e) {
showSelection();
}
protected void init() {
getControl().addFocusListener(this);
hideSelection();
}
private void hideSelection() {
Region region = getSelection();
setSelection(region.getOffset() + region.getLength(), 0);
}
private void showSelection() {
if (match != null) {
setSelection(match.getOffset(), match.getLength());
}
}
protected abstract Control getControl();
protected abstract Region getSelection();
protected abstract void setSelection(int offset, int length);
protected abstract void reveal(int offset, int length);
private Match match;
}