本人用JFace,调用SourceViewer,然后建立了rule,添加事件,双击就在rule上绘图,但是当在SourceViewer里面输入任意符号和问题(包括空格和回车键),那么我前面的绘图操作就被系统自动覆盖了……其实只是想做到eclipse断点的模式,在rule上添加一个小图标而已……代码如下:
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.source.AnnotationRulerColumn;
import org.eclipse.jface.text.source.CompositeRuler;
import org.eclipse.jface.text.source.LineNumberRulerColumn;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
//import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;public class Jfacetest extends ApplicationWindow { private StyledText styledText;
private AnnotationRulerColumn annotationRulerColumn;
@SuppressWarnings("unchecked")
private Map lineImage = new HashMap();
private Image image = null;
private int y = 0;
@SuppressWarnings("unchecked")
private List list = null;
/**
 * Create the application window
 */
public Jfacetest() {
super(null);
createActions();
addToolBar(SWT.FLAT | SWT.WRAP);
addMenuBar();
addStatusLine();
} /**
 * Create contents of the application window
 * @param parent
 */
@Override
protected Control createContents(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(new FillLayout());
// container.setBounds(0, 0, 483, 144);
Document doc = new Document("");

final CompositeRuler ruler= new CompositeRuler();//创建一个标尺ruler
annotationRulerColumn = new AnnotationRulerColumn(12);

ruler.addDecorator(0, annotationRulerColumn);
ruler.addDecorator(1, new LineNumberRulerColumn());//为这个标尺添加行号显示

final SourceViewer sourceViewer = new SourceViewer(container, ruler, SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.H_SCROLL);
sourceViewer.setDocument(doc);
sourceViewer.setEditable(true);

styledText = sourceViewer.getTextWidget();
styledText.setBounds(0, 0, 483, 144); final Control rulerControl = ruler.getControl();
rulerControl.addMouseListener(new MouseAdapter() {
@SuppressWarnings("unchecked")
public void mouseDoubleClick(final MouseEvent e) {
final GC gc= new GC(annotationRulerColumn.getControl());
image =new Image(annotationRulerColumn.getControl().getDisplay(), "icons/breakpoint.gif");
Image image1 =new Image(annotationRulerColumn.getControl().getDisplay(), "icons/annotationRuler.gif");

int line = ruler.getLineOfLastMouseButtonActivity();

if(lineImage.get(line)!=null){
int dely = styledText.getLineHeight()*line+1;
gc.drawImage(image1, 1, dely);
lineImage.remove(line);
}else{
lineImage.put(line, line);
}

Set set = lineImage.keySet();
list = new LinkedList(set);

for(int i=0;i<lineImage.size();i++){
Integer linei = (Integer) list.get(i);
y = styledText.getLineHeight()*linei+1;//根据当前鼠标点击行和输入框行高计算出绘画的y坐标
gc.drawImage(image, 1, y);

System.out.println("行号:"+line+";y:"+y);
}
image1.dispose();
}
}); annotationRulerColumn.getControl().addPaintListener(new PaintListener(){
public void paintControl(PaintEvent painte){
image =new Image(annotationRulerColumn.getControl().getDisplay(), "icons/breakpoint.gif");

for(int i=0;i<lineImage.size();i++){
Integer linei = (Integer) list.get(i);
y = styledText.getLineHeight()*linei+1;//根据当前鼠标点击行和输入框行高计算出绘画的y坐标
painte.gc.drawImage(image, 1, y);
}
painte.gc.dispose();
}
});

// sourceViewer.addPostSelectionChangedListener(new SelectionChanged(){
// public void selectionChanged(SelectionChangedEvent event){
// }
// });// final Button button = new Button(container, SWT.NONE);
// button.addMouseListener(new MouseAdapter() {
// public void mouseDown(final MouseEvent e) {
// System.out.println(styledText.getText());
// }
// });
// button.setText("button");

//
return container;
}

/**
 * Create the actions
 */
private void createActions() {
// Create the actions
} /**
 * Create the menu manager
 * @return the menu manager
 */
@Override
protected MenuManager createMenuManager() {
MenuManager menuManager = new MenuManager("menu");
return menuManager;
} /**
 * Create the toolbar manager
 * @return the toolbar manager
 */
@Override
protected ToolBarManager createToolBarManager(int style) {
ToolBarManager toolBarManager = new ToolBarManager(style);
return toolBarManager;
} /**
 * Create the status line manager
 * @return the status line manager
 */
@Override
protected StatusLineManager createStatusLineManager() {
StatusLineManager statusLineManager = new StatusLineManager();
statusLineManager.setMessage(null, "");
return statusLineManager;
} /**
 * Launch the application
 * @param args
 */
public static void main(String args[]) {
try {
Jfacetest window = new Jfacetest();
window.setBlockOnOpen(true);
window.open();
Display.getCurrent().dispose();
} catch (Exception e) {
e.printStackTrace();
}
} /**
 * Configure the shell
 * @param newShell
 */
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText("SourceText测试和Rule测试");
} /**
 * Return the initial size of the window
 */
@Override
protected Point getInitialSize() {
return new Point(500, 371);
}}