/**
  * 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();
 }
Exemple #2
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);
 }
 @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();
 }
Exemple #4
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();
   }
 }