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; 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(); }
public void drawTextRun( Canvas canvas, float x, float y, int lineOffset, int runWidth, char[] text, int index, int count, boolean cursor, int textStyle) { int foreColor = TextStyle.decodeForeColor(textStyle); int backColor = TextStyle.decodeBackColor(textStyle); int effect = TextStyle.decodeEffect(textStyle); boolean inverse = mReverseVideo ^ (effect & (TextStyle.fxInverse | TextStyle.fxItalic)) != 0; if (inverse) { int temp = foreColor; foreColor = backColor; backColor = temp; } if (cursor) { backColor = TextStyle.ciCursor; } boolean blink = (effect & TextStyle.fxBlink) != 0; if (blink && backColor < 8) { backColor += 8; } mTextPaint.setColor(mPalette[backColor]); float left = x + lineOffset * mCharWidth; canvas.drawRect( left, y + mCharAscent - mCharDescent, left + runWidth * mCharWidth, y, mTextPaint); boolean invisible = (effect & TextStyle.fxInvisible) != 0; if (!invisible) { boolean bold = (effect & TextStyle.fxBold) != 0; boolean underline = (effect & TextStyle.fxUnderline) != 0; if (bold) { mTextPaint.setFakeBoldText(true); } if (underline) { mTextPaint.setUnderlineText(true); } if (foreColor < 8 && bold) { // In 16-color mode, bold also implies bright foreground colors mTextPaint.setColor(mPalette[foreColor + 8]); } else { mTextPaint.setColor(mPalette[foreColor]); } canvas.drawText(text, index, count, left, y - mCharDescent, mTextPaint); if (bold) { mTextPaint.setFakeBoldText(false); } if (underline) { mTextPaint.setUnderlineText(false); } } }
protected Font getFontToDisplay(char c, TextStyle style) { boolean bold = style.hasOption(TextStyle.Option.BOLD); boolean italic = style.hasOption(TextStyle.Option.ITALIC); // workaround to fix Swing bad rendering of bold special chars on Linux if (bold && mySettingsProvider.DECCompatibilityMode() && CharacterSets.isDecBoxChar(c)) { return myNormalFont; } return bold ? (italic ? myBoldItalicFont : myBoldFont) : (italic ? myItalicFont : myNormalFont); }
/** * Draw every char in separate terminal cell to guaranty equal width for different lines. * Nevertheless to improve kerning we draw word characters as one block for monospaced fonts. */ private void drawChars(int x, int y, CharBuffer buf, TextStyle style, Graphics2D gfx) { final int blockLen = 1; int offset = 0; int drawCharsOffset = 0; // workaround to fix Swing bad rendering of bold special chars on Linux // TODO required for italic? CharBuffer renderingBuffer; if (mySettingsProvider.DECCompatibilityMode() && style.hasOption(TextStyle.Option.BOLD)) { renderingBuffer = CharUtils.heavyDecCompatibleBuffer(buf); } else { renderingBuffer = buf; } while (offset + blockLen <= buf.length()) { if (renderingBuffer.getBuf()[buf.getStart() + offset] == CharUtils.DWC) { offset += blockLen; drawCharsOffset += blockLen; continue; // dont' draw second part(fake one) of double width character } Font font = getFontToDisplay(buf.charAt(offset + blockLen - 1), style); // while (myMonospaced && (offset + blockLen < buf.getLength()) && // isWordCharacter(buf.charAt(offset + blockLen - 1)) // && (font == getFontToDisplay(buf.charAt(offset + blockLen - 1), style))) { // blockLen++; // } gfx.setFont(font); int descent = gfx.getFontMetrics(font).getDescent(); int baseLine = (y + 1) * myCharSize.height - descent; int xCoord = (x + drawCharsOffset) * myCharSize.width; int textLength = CharUtils.getTextLengthDoubleWidthAware( buf.getBuf(), buf.getStart() + offset, blockLen, mySettingsProvider.ambiguousCharsAreDoubleWidth()); int yCoord = y * myCharSize.height; gfx.setClip( xCoord, yCoord, Math.min(textLength * myCharSize.width, getWidth() - xCoord), Math.min(myCharSize.height, getHeight() - yCoord)); gfx.setColor(getPalette().getColor(myStyleState.getForeground(style.getForegroundForRun()))); gfx.drawChars(renderingBuffer.getBuf(), buf.getStart() + offset, blockLen, xCoord, baseLine); drawCharsOffset += blockLen; offset += blockLen; } gfx.setClip(null); }
private void setDefaults() { setBackgroundColor(Color.BLUE); setBorderBehavior(BorderBehavior.NONE); TextStyle titleStyle = TextStyle.sansSerif(); titleStyle.setFontSize(40); setTitleStyle(titleStyle); setCounterStyle(TextStyle.sansSerif()); setSubtitleStyle(TextStyle.sansSerif()); }
@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(); }
/** * 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(); } }
void renderSubtitle(Graphics2D g) { subtitleDuration--; subtitleStyle.renderString( subtitle, new Point(WIDTH / 2.0, 30), TextStyle.ReferencePointLocation.BOTTOM_CENTER, g, null); }
void renderTitle(Graphics2D g) { titleDuration--; titleStyle.renderString( title, new Point(WIDTH / 2.0, HEIGHT / 2.0), TextStyle.ReferencePointLocation.CENTER, g, null); }
private String css(String name, TextStyle style) { StringBuffer result = new StringBuffer(); result.append("."); result.append(name); result.append(" {\n"); result.append(style.toCSS()); result.append("\n}\n"); return result.toString(); }
private TextStyle getInversedStyle(TextStyle style) { TextStyle selectionStyle; selectionStyle = style.clone(); selectionStyle.setOption(Option.INVERSE, !selectionStyle.hasOption(Option.INVERSE)); if (selectionStyle.getForeground() == null) { selectionStyle.setForeground(myStyleState.getForeground()); } if (selectionStyle.getBackground() == null) { selectionStyle.setBackground(myStyleState.getBackground()); } return selectionStyle; }
private TextStyle getSelectionStyle(TextStyle style) { TextStyle selectionStyle = style.clone(); if (mySettingsProvider.useInverseSelectionColor()) { selectionStyle = getInversedStyle(style); } else { TextStyle mySelectionStyle = mySettingsProvider.getSelectionColor(); selectionStyle.setBackground(mySelectionStyle.getBackground()); selectionStyle.setForeground(mySelectionStyle.getForeground()); } return selectionStyle; }
private void drawCharacters(int x, int y, TextStyle style, CharBuffer buf, Graphics2D gfx) { int xCoord = x * myCharSize.width; int yCoord = y * myCharSize.height; if (xCoord < 0 || xCoord > getWidth() || yCoord < 0 || yCoord > getHeight()) { return; } gfx.setColor(getPalette().getColor(myStyleState.getBackground(style.getBackgroundForRun()))); int textLength = CharUtils.getTextLengthDoubleWidthAware( buf.getBuf(), buf.getStart(), buf.length(), mySettingsProvider.ambiguousCharsAreDoubleWidth()); gfx.fillRect( xCoord, yCoord, Math.min(textLength * myCharSize.width, getWidth() - xCoord), Math.min(myCharSize.height, getHeight() - yCoord)); if (buf.isNul()) { return; // nothing more to do } drawChars(x, y, buf, style, gfx); gfx.setColor(getPalette().getColor(myStyleState.getForeground(style.getForegroundForRun()))); int baseLine = (y + 1) * myCharSize.height - myDescent; if (style.hasOption(TextStyle.Option.UNDERLINED)) { gfx.drawLine(xCoord, baseLine + 1, (x + textLength) * myCharSize.width, baseLine + 1); } }
private void completeStyles() { if (protectedNormalStyle == null) protectedNormalStyle = new TextStyle("black", "white"); if (protectedIntensifiedStyle == null) protectedIntensifiedStyle = new TextStyle(protectedNormalStyle); else protectedIntensifiedStyle.completeFrom(protectedNormalStyle); if (protectedHiddenStyle == null) { protectedHiddenStyle = new TextStyle(protectedNormalStyle); protectedHiddenStyle.foregroundColor = protectedHiddenStyle.backgroundColor; } else { protectedHiddenStyle.completeFrom(protectedNormalStyle); } if (unprotectedNormalStyle == null) unprotectedNormalStyle = new TextStyle("black", "lightgrey"); if (unprotectedIntensifiedStyle == null) unprotectedIntensifiedStyle = new TextStyle(unprotectedNormalStyle); else unprotectedIntensifiedStyle.completeFrom(unprotectedNormalStyle); if (unprotectedHiddenStyle == null) unprotectedHiddenStyle = new TextStyle(unprotectedNormalStyle); }
private String extendedHighlightCSS() { StringBuffer result = new StringBuffer(); result.append(".h3270-highlight-blink {\n"); result.append(" text-decoration:blink;\n"); result.append("}\n"); result.append(".h3270-highlight-underscore {\n"); result.append(" text-decoration:underline;\n"); result.append("}\n"); result.append(".h3270-highlight-rev-video {\n"); // the following is not quite correct, because "reverse video" // should reverse the style that would otherwise be effective // in a given field, not just the "normal" style, but we'll // leave it at this for now result.append(protectedNormalStyle.reverse().toCSS()); result.append("}\n"); return result.toString(); }
public void drawCursor(char c, Graphics2D gfx, TextStyle style) { TerminalCursorState state = computeCursorState(); // hidden: do nothing if (state == TerminalCursorState.HIDDEN) { return; } else { final int x = getCoordX(); final int y = getCoordY(); if (y >= 0 && y < myTermSize.height) { if (state == TerminalCursorState.SHOWING) { TextStyle styleToDraw = getInversedStyle(style); drawCharacters(x, y, styleToDraw, new CharBuffer(c, 1), gfx); } else if (state == TerminalCursorState.NO_FOCUS) { int xCoord = x * myCharSize.width; int yCoord = y * myCharSize.height; gfx.setColor( getPalette().getColor(myStyleState.getForeground(style.getForegroundForRun()))); gfx.drawRect(xCoord, yCoord, myCharSize.width - 1, myCharSize.height - 1); } } } }
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(); }