/*******************************************************************************
* Copyright (c) 2012 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 com.xored.glance.ui.sources.Match;
import org.eclipse.jface.text.Region;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.widgets.Control;
/**
* 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 {
private Match match;
public void dispose() {
getControl().removeFocusListener(this);
showSelection();
}
@Override
public void focusGained(FocusEvent e) {
// showSelection();
}
@Override
public void focusLost(FocusEvent e) {
// hideSelection();
}
public void setMatch(Match match) {
this.match = match;
if (match != null) {
reveal(match.getOffset(), match.getLength());
}
}
protected abstract Control getControl();
protected abstract Region getSelection();
protected void init() {
getControl().addFocusListener(this);
hideSelection();
}
protected abstract void reveal(int offset, int length);
protected abstract void setSelection(int offset, int length);
private void hideSelection() {
Region region = getSelection();
setSelection(region.getOffset() + region.getLength(), 0);
}
private void showSelection() {
if (match != null) {
setSelection(match.getOffset(), match.getLength());
}
}
}