/** * Sets the receiver's text. * * <p>The string can contain both regular text and hyperlinks. A hyperlink is delimited by an * anchor tag, <A> and </A>. Within an anchor, a single HREF attribute is supported. * When a hyperlink is selected, the text field of the selection event contains either the text of * the hyperlink or the value of its HREF, if one was specified. In the rare case of identical * hyperlinks within the same string, the HREF attribute can be used to distinguish between them. * The string may include the mnemonic character and line delimiters. The only delimiter the HREF * attribute supports is the quotation mark ("). * * <p>Mnemonics are indicated by an '&' that causes the next character to be the mnemonic. The * receiver can have a mnemonic in the text preceding each link. When the user presses a key * sequence that matches the mnemonic, focus is assigned to the link that follows the text. * Mnemonics in links and in the trailing text are ignored. On most platforms, the mnemonic * appears underlined but may be emphasised in a platform specific manner. The mnemonic indicator * character '&' can be escaped by doubling it in the string, causing a single '&' to be * displayed. * * @param string the new text * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the text is null * </ul> * * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public void setText(String string) { checkWidget(); if (string == null) error(SWT.ERROR_NULL_ARGUMENT); if (string.equals(text)) return; text = string; layout.setText(parse(string)); focusIndex = offsets.length > 0 ? 0 : -1; selection.x = selection.y = -1; boolean enabled = (state & DISABLED) == 0; TextStyle linkStyle = new TextStyle(null, enabled ? linkColor : disabledColor, null); linkStyle.underline = true; int[] bidiSegments = new int[offsets.length * 2]; for (int i = 0; i < offsets.length; i++) { Point point = offsets[i]; layout.setStyle(linkStyle, point.x, point.y); bidiSegments[i * 2] = point.x; bidiSegments[i * 2 + 1] = point.y + 1; } layout.setSegments(bidiSegments); TextStyle mnemonicStyle = new TextStyle(null, null, null); mnemonicStyle.underline = true; for (int i = 0; i < mnemonics.length; i++) { int mnemonic = mnemonics[i]; if (mnemonic != -1) { layout.setStyle(mnemonicStyle, mnemonic, mnemonic); } } redraw(); }
private void updateLabels() { Object value = source.getPropertyValue(descriptor.getId()); if (nameLayout != null && !nameLayout.isDisposed()) { nameLayout.setText(descriptor.getDisplayName()); nameLayout.setStyle( new TextStyle(canvas.getFont(), canvas.getForeground(), null), 0, nameLayout.getText().length()); } ILabelDescriptor labelDescriptor = descriptor.getLabelDescriptor(); ImageDescriptor image = labelDescriptor == null ? null : labelDescriptor.getImage(value); if (valueImage != null) { valueImage.dispose(); } valueImage = image == null ? null : image.createImage(false, Display.getCurrent()); ColorDescriptor color = labelDescriptor == null ? null : labelDescriptor.getForeground(value); if (valueColor != null) { valueColor.dispose(); } valueColor = color == null ? null : color.createColor(Display.getCurrent()); FontDescriptor font = labelDescriptor == null ? null : labelDescriptor.getFont(value); if (valueFont != null) { valueFont.dispose(); } valueFont = font == null ? null : font.createFont(Display.getCurrent()); if (valueLayout != null && !valueLayout.isDisposed()) { String valueText = labelDescriptor == null ? (value == null ? "" //$NON-NLS-1$ : value.toString()) : labelDescriptor.getText(value); if (valueText == null) valueText = ""; // $NON-NLS-1$ valueLayout.setText(valueText); valueLayout.setStyle( new TextStyle( valueFont == null ? canvas.getFont() : valueFont, valueColor == null ? canvas.getForeground() : valueColor, null), 0, valueText.length()); } canvas.layout(true); canvas.redraw(); }
void enableWidget(boolean enabled) { if (OS.COMCTL32_MAJOR >= 6) { LITEM item = new LITEM(); item.mask = OS.LIF_ITEMINDEX | OS.LIF_STATE; item.stateMask = OS.LIS_ENABLED; item.state = enabled ? OS.LIS_ENABLED : 0; while (OS.SendMessage(handle, OS.LM_SETITEM, 0, item) != 0) { item.iLink++; } } else { TextStyle linkStyle = new TextStyle(null, enabled ? linkColor : disabledColor, null); linkStyle.underline = true; for (int i = 0; i < offsets.length; i++) { Point point = offsets[i]; layout.setStyle(linkStyle, point.x, point.y); } redraw(); } /* * Feature in Windows. For some reason, setting * LIS_ENABLED state using LM_SETITEM causes the * SysLink to become enabled. To be specific, * calling IsWindowEnabled() returns true. The * fix is disable the SysLink after LM_SETITEM. */ super.enableWidget(enabled); }
/** * Sets the receiver's text. * * <p>The string can contain both regular text and hyperlinks. A hyperlink is delimited by an * anchor tag, <A> and </A>. Within an anchor, a single HREF attribute is supported. * When a hyperlink is selected, the text field of the selection event contains either the text of * the hyperlink or the value of its HREF, if one was specified. In the rare case of identical * hyperlinks within the same string, the HREF attribute can be used to distinguish between them. * The string may include the mnemonic character and line delimiters. The only delimiter the HREF * attribute supports is the quotation mark ("). * * <p>Mnemonics are indicated by an '&' that causes the next character to be the mnemonic. The * receiver can have a mnemonic in the text preceding each link. When the user presses a key * sequence that matches the mnemonic, focus is assigned to the link that follows the text. * Mnemonics in links and in the trailing text are ignored. On most platforms, the mnemonic * appears underlined but may be emphasised in a platform specific manner. The mnemonic indicator * character '&' can be escaped by doubling it in the string, causing a single '&' to be * displayed. * * @param string the new text * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the text is null * </ul> * * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public void setText(String string) { checkWidget(); if (string == null) error(SWT.ERROR_NULL_ARGUMENT); if (string.equals(text)) return; text = string; if (OS.COMCTL32_MAJOR >= 6) { boolean enabled = OS.IsWindowEnabled(handle); /* * Bug in Windows. For some reason, when SetWindowText() * is used to set the text of a link control to the empty * string, the old text remains. The fix is to set the * text to a space instead. */ if (string.length() == 0) string = " "; // $NON-NLS-1$ TCHAR buffer = new TCHAR(getCodePage(), string, true); OS.SetWindowText(handle, buffer); parse(text); enableWidget(enabled); } else { layout.setText(parse(text)); focusIndex = offsets.length > 0 ? 0 : -1; selection.x = selection.y = -1; int bits = OS.GetWindowLong(handle, OS.GWL_STYLE); if (offsets.length > 0) { bits |= OS.WS_TABSTOP; } else { bits &= ~OS.WS_TABSTOP; } OS.SetWindowLong(handle, OS.GWL_STYLE, bits); boolean enabled = OS.IsWindowEnabled(handle); TextStyle linkStyle = new TextStyle(null, enabled ? linkColor : disabledColor, null); linkStyle.underline = true; for (int i = 0; i < offsets.length; i++) { Point point = offsets[i]; layout.setStyle(linkStyle, point.x, point.y); } TextStyle mnemonicStyle = new TextStyle(null, null, null); mnemonicStyle.underline = true; for (int i = 0; i < mnemonics.length; i++) { int mnemonic = mnemonics[i]; if (mnemonic != -1) { layout.setStyle(mnemonicStyle, mnemonic, mnemonic); } } redraw(); } }
@Override void enableWidget(boolean enabled) { super.enableWidget(enabled); if (isDisposed()) return; TextStyle linkStyle = new TextStyle(null, enabled ? linkColor : disabledColor, null); linkStyle.underline = true; for (int i = 0; i < offsets.length; i++) { Point point = offsets[i]; layout.setStyle(linkStyle, point.x, point.y); } redraw(); }
public static void main(String[] args) { Display display = new Display(); final Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.DOUBLE_BUFFERED); shell.setText("Underline, Strike Out"); Font font = shell.getFont(); String text = "Here is some text that is underlined or struck out or both."; final TextLayout layout = new TextLayout(display); layout.setText(text); TextStyle style1 = new TextStyle(font, null, null); style1.underline = true; layout.setStyle(style1, 26, 35); TextStyle style2 = new TextStyle(font, null, null); style2.strikeout = true; layout.setStyle(style2, 40, 49); TextStyle style3 = new TextStyle(font, null, null); style3.underline = true; style3.strikeout = true; layout.setStyle(style3, 54, 57); shell.addListener( SWT.Paint, new Listener() { @Override public void handleEvent(Event event) { Point point = new Point(10, 10); int width = shell.getClientArea().width - 2 * point.x; layout.setWidth(width); layout.draw(event.gc, point.x, point.y); } }); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } layout.dispose(); display.dispose(); }
@Test public void test_setStyle() { TextLayout layout; TextStyle s1, s2, s3, s4; s1 = new TextStyle(null, null, null); s2 = new TextStyle(null, null, null); s3 = new TextStyle(null, null, null); s4 = new TextStyle(null, null, null); layout = new TextLayout(display); layout.setText("aabbcc"); layout.setStyle(s1, 2, 3); assertEquals(null, layout.getStyle(0)); assertEquals(null, layout.getStyle(1)); assertEquals(s1, layout.getStyle(2)); assertEquals(s1, layout.getStyle(3)); assertEquals(null, layout.getStyle(4)); assertEquals(null, layout.getStyle(5)); layout.dispose(); layout = new TextLayout(display); layout.setText("aabbcc"); layout.setStyle(s1, 0, 1); layout.setStyle(s2, 2, 3); layout.setStyle(s3, 4, 5); assertEquals(s1, layout.getStyle(0)); assertEquals(s1, layout.getStyle(1)); assertEquals(s2, layout.getStyle(2)); assertEquals(s2, layout.getStyle(3)); assertEquals(s3, layout.getStyle(4)); assertEquals(s3, layout.getStyle(5)); layout.dispose(); layout = new TextLayout(display); layout.setText("aabbcc"); layout.setStyle(s1, 0, 1); layout.setStyle(s2, 2, 3); layout.setStyle(s3, 4, 5); layout.setStyle(s4, 1, 2); assertEquals(s1, layout.getStyle(0)); assertEquals(s4, layout.getStyle(1)); assertEquals(s4, layout.getStyle(2)); assertEquals(s2, layout.getStyle(3)); assertEquals(s3, layout.getStyle(4)); assertEquals(s3, layout.getStyle(5)); layout.dispose(); layout = new TextLayout(display); layout.setText("aabbcc"); layout.setStyle(s1, 0, 1); layout.setStyle(s2, 2, 3); layout.setStyle(s3, 4, 5); layout.setStyle(s4, 3, 4); assertEquals(s1, layout.getStyle(0)); assertEquals(s1, layout.getStyle(1)); assertEquals(s2, layout.getStyle(2)); assertEquals(s4, layout.getStyle(3)); assertEquals(s4, layout.getStyle(4)); assertEquals(s3, layout.getStyle(5)); layout.dispose(); layout = new TextLayout(display); layout.setText("aabbcc"); layout.setStyle(s1, 0, 1); layout.setStyle(s2, 2, 3); layout.setStyle(s3, 4, 5); layout.setStyle(s4, 1, 4); assertEquals(s1, layout.getStyle(0)); assertEquals(s4, layout.getStyle(1)); assertEquals(s4, layout.getStyle(2)); assertEquals(s4, layout.getStyle(3)); assertEquals(s4, layout.getStyle(4)); assertEquals(s3, layout.getStyle(5)); layout.dispose(); layout = new TextLayout(display); layout.setText("aabbcc"); layout.setStyle(s1, 0, 0); layout.setStyle(s2, 1, 4); layout.setStyle(s3, 5, 5); layout.setStyle(s4, 2, 3); assertEquals(s1, layout.getStyle(0)); assertEquals(s2, layout.getStyle(1)); assertEquals(s4, layout.getStyle(2)); assertEquals(s4, layout.getStyle(3)); assertEquals(s2, layout.getStyle(4)); assertEquals(s3, layout.getStyle(5)); layout.dispose(); layout = new TextLayout(display); layout.setText("aabbcc"); layout.setStyle(s1, 0, 1); layout.setStyle(s2, 2, 3); layout.setStyle(s3, 4, 5); layout.setStyle(s4, 0, 3); assertEquals(s4, layout.getStyle(0)); assertEquals(s4, layout.getStyle(1)); assertEquals(s4, layout.getStyle(2)); assertEquals(s4, layout.getStyle(3)); assertEquals(s3, layout.getStyle(4)); assertEquals(s3, layout.getStyle(5)); layout.dispose(); layout = new TextLayout(display); layout.setText("aabbcc"); layout.setStyle(s1, 0, 0); layout.setStyle(s2, 1, 4); layout.setStyle(s3, 5, 5); layout.setStyle(s4, 2, 4); assertEquals(s1, layout.getStyle(0)); assertEquals(s2, layout.getStyle(1)); assertEquals(s4, layout.getStyle(2)); assertEquals(s4, layout.getStyle(3)); assertEquals(s4, layout.getStyle(4)); assertEquals(s3, layout.getStyle(5)); layout.dispose(); layout = new TextLayout(display); layout.setText("aabbcc"); layout.setStyle(s1, 0, 0); layout.setStyle(s2, 1, 4); layout.setStyle(s3, 5, 5); layout.setStyle(s4, 1, 3); assertEquals(s1, layout.getStyle(0)); assertEquals(s4, layout.getStyle(1)); assertEquals(s4, layout.getStyle(2)); assertEquals(s4, layout.getStyle(3)); assertEquals(s2, layout.getStyle(4)); assertEquals(s3, layout.getStyle(5)); layout.dispose(); layout = new TextLayout(display); layout.setText("aabbcc"); layout.setStyle(s1, 0, 1); layout.setStyle(s2, 2, 3); layout.setStyle(s3, 4, 5); layout.setStyle(null, 0, 5); assertEquals(null, layout.getStyle(0)); assertEquals(null, layout.getStyle(1)); assertEquals(null, layout.getStyle(2)); assertEquals(null, layout.getStyle(3)); assertEquals(null, layout.getStyle(4)); assertEquals(null, layout.getStyle(5)); layout.dispose(); layout = new TextLayout(display); layout.setText("aabbcc"); layout.setStyle(s1, 0, 1); layout.setStyle(s2, 2, 3); layout.setStyle(s3, 4, 5); layout.setStyle(s4, 0, 5); assertEquals(s4, layout.getStyle(0)); assertEquals(s4, layout.getStyle(1)); assertEquals(s4, layout.getStyle(2)); assertEquals(s4, layout.getStyle(3)); assertEquals(s4, layout.getStyle(4)); assertEquals(s4, layout.getStyle(5)); layout.dispose(); layout = new TextLayout(display); layout.setText("aabbcc"); layout.setStyle(s1, 2, 2); layout.setStyle(s2, 2, 3); layout.setStyle(null, 3, 3); assertEquals(null, layout.getStyle(0)); assertEquals(null, layout.getStyle(1)); assertEquals(s2, layout.getStyle(2)); assertEquals(null, layout.getStyle(3)); assertEquals(null, layout.getStyle(4)); assertEquals(null, layout.getStyle(5)); layout.dispose(); }