/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.text.xml.ui; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.widgets.Composite; /** * @author Jeremy * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class FreeCaretStyledText extends StyledText implements PaintListener { public FreeCaretStyledText(Composite parent, int style) { super(parent, style); super.addPaintListener(this); } public void dispose () { super.removePaintListener(this); } int fX = -1; int fY = -1; boolean fEnabled = false; public void enableFreeCaret(boolean set) { this.fEnabled = set; if (!set) redraw(); } public void myRedraw(int x, int y) { this.fX = x; this.fY = y; if (this.fEnabled) { redraw(); } } /* (non-Javadoc) * @see org.eclipse.swt.events.PaintListener#paintControl(org.eclipse.swt.events.PaintEvent) */ public void paintControl(PaintEvent e) { if (!this.fEnabled) return; if (fX == -1 || fY == -1) return; GC gc = e.gc; gc.setForeground(gc.getBackground()); int lh = getLineHeight(); if (lh <= 0) lh = 3; gc.setXORMode(true); gc.setLineStyle(SWT.LINE_DOT); for (int i = 0; i < lh; i += 2) gc.drawLine(fX, fY + i, fX, fY + i); } public void redrawRange(int start, int length, boolean clearBackground) { //FIX for JBIDE-1479 added by Max Areshkau if (start > getCharCount()) start = getCharCount(); if (start + length > getCharCount()) length = getCharCount() - start; //FIX for JBIDE-2192 if (length > 0) { super.redrawRange(start, length, clearBackground); } } public int getLineAtOffset(int offset) { if (offset > getCharCount()) offset = getCharCount(); if (offset < 0) offset = 0; return super.getLineAtOffset(offset); } }