/**
* Copyright (c) 2010-2011 KUBO Atsuhiro <kubo@iteman.jp>,
* All rights reserved.
*
* This file is part of MakeGood.
*
* 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
*/
package com.piece_framework.makegood.ui.widgets;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
public abstract class ActiveText extends StyledText implements MouseListener, MouseMoveListener {
protected Cursor handCursor;
protected Cursor arrowCursor;
private List<StyleRange> styles;
private List<ActiveTextListener> listeners = new ArrayList<ActiveTextListener>();
public ActiveText(Composite parent, int style) {
super(parent, style);
addMouseListener(this);
addMouseMoveListener(this);
handCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_HAND);
arrowCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_ARROW);
initializeStyles();
}
@Override
public void setText(String text) {
initializeStyles();
super.setText(text.trim());
for (ActiveTextListener listener: listeners) {
listener.generateActiveText();
}
}
/**
* @since 1.6.0
*/
public void replaceText(String text) {
super.setText(text);
}
public void addListener(ActiveTextListener listener) {
listener.setActiveText(this);
listeners.add(listener);
}
public void addStyle(StyleRange style) {
styles.add(style);
setStyleRange(style);
}
/**
* @since 1.6.0
*/
public void clearText() {
setText(""); //$NON-NLS-1$
}
protected StyleRange findStyle(Point point) {
int offset;
try {
offset = getOffsetAtLocation(point);
} catch (IllegalArgumentException e) {
return null;
}
for (int i = 0; i < styles.size(); ++i) {
StyleRange style = styles.get(i);
int startOffset = style.start;
int endOffset = startOffset + style.length;
if (offset >= startOffset && offset <= endOffset) {
return style;
}
}
return null;
}
private void initializeStyles() {
styles = new ArrayList<StyleRange>();
}
}