Example #1
0
 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);
 }
Example #2
0
 /**
  * Sets the receiver's text.
  *
  * <p>The string can contain both regular text and hyperlinks. A hyperlink is delimited by an
  * anchor tag, &lt;A&gt; and &lt;/A&gt;. 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 '&amp;' 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 '&amp;' can be escaped by doubling it in the string, causing a single '&amp;' 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);
      }
    }
  }
Example #4
0
 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);
 }
Example #5
0
  /**
   * 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);
  }
Example #6
0
  private void setDefaults() {
    setBackgroundColor(Color.BLUE);
    setBorderBehavior(BorderBehavior.NONE);

    TextStyle titleStyle = TextStyle.sansSerif();
    titleStyle.setFontSize(40);
    setTitleStyle(titleStyle);
    setCounterStyle(TextStyle.sansSerif());
    setSubtitleStyle(TextStyle.sansSerif());
  }
Example #7
0
 @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();
 }
Example #8
0
 /**
  * Sets the receiver's text.
  *
  * <p>The string can contain both regular text and hyperlinks. A hyperlink is delimited by an
  * anchor tag, &lt;A&gt; and &lt;/A&gt;. 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 '&amp;' 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 '&amp;' can be escaped by doubling it in the string, causing a single '&amp;' 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();
   }
 }
Example #9
0
 void renderSubtitle(Graphics2D g) {
   subtitleDuration--;
   subtitleStyle.renderString(
       subtitle,
       new Point(WIDTH / 2.0, 30),
       TextStyle.ReferencePointLocation.BOTTOM_CENTER,
       g,
       null);
 }
Example #10
0
 void renderTitle(Graphics2D g) {
   titleDuration--;
   titleStyle.renderString(
       title,
       new Point(WIDTH / 2.0, HEIGHT / 2.0),
       TextStyle.ReferencePointLocation.CENTER,
       g,
       null);
 }
Example #11
0
 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();
 }
Example #12
0
 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;
 }
Example #13
0
 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;
 }
Example #14
0
  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);
    }
  }
Example #15
0
  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);
  }
Example #16
0
  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();
  }
Example #17
0
    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();
 }