/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.utils.common.widgets; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.Bullet; import org.eclipse.swt.custom.LineStyleEvent; import org.eclipse.swt.custom.LineStyleListener; import org.eclipse.swt.custom.ST; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.GlyphMetrics; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import de.rcenvironment.core.utils.common.StringUtils; /** * * SWT {@link StyledText} with line numbers. * * @author Hendrik Abbenhaus */ public class LineNumberStyledText extends StyledText implements LineStyleListener { private int lineCount = 0; private StyleRange styleRange = new StyleRange(); public LineNumberStyledText(Composite parent, int style) { super(parent, style); styleRange.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_GRAY); addLineStyleListener(this); addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { if (lineCount != getLineCount()) { updateLineNumbers(); } } }); updateLineNumbers(); } @Override public void lineGetStyle(LineStyleEvent arg0) { int bulletLength = (Integer.toString(lineCount).length()); int bulletWidth = (bulletLength + 1) * getLineHeight() / 2; styleRange.metrics = new GlyphMetrics(0, 0, bulletWidth); if (arg0.bullet == null) { arg0.bullet = new Bullet(ST.BULLET_TEXT, styleRange); } else { arg0.bullet.style = styleRange; } int bulletLine = getLineAtOffset(arg0.lineOffset) + 1; arg0.bullet.text = StringUtils.format("%" + bulletLength + "s", bulletLine); arg0.tabStops = new int[] { bulletWidth, 3 * bulletWidth }; } /** * Update line-numbers by setting the text again. * */ private void updateLineNumbers() { int sel = getCaretOffset(); int scrollbarSel = getTopIndex(); lineCount = getLineCount(); super.setText(getText()); setCaretOffset(sel); setTopIndex(scrollbarSel); } @Override public void setEnabled(boolean enabled) { setSelection(0); setBackgroundEnabled(enabled); super.setEnabled(enabled); } @Override public void setText(String text) { super.setText(text); updateLineNumbers(); } /** * <code>true</code> sets the background-color to white;<br> * <code>false</code> sets the background-color to gray. * * @param enabled parameter */ public void setBackgroundEnabled(boolean enabled) { if (enabled) { setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); } else { setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); } } }