Exemple #1
0
 LRESULT WM_MOUSEMOVE(int /*long*/ wParam, int /*long*/ lParam) {
   LRESULT result = super.WM_MOUSEMOVE(wParam, lParam);
   if (OS.COMCTL32_MAJOR < 6) {
     int x = OS.GET_X_LPARAM(lParam);
     int y = OS.GET_Y_LPARAM(lParam);
     if (OS.GetKeyState(OS.VK_LBUTTON) < 0) {
       int oldSelection = selection.y;
       selection.y = layout.getOffset(x, y, null);
       if (selection.y != oldSelection) {
         int newSelection = selection.y;
         if (oldSelection > newSelection) {
           int temp = oldSelection;
           oldSelection = newSelection;
           newSelection = temp;
         }
         Rectangle rect = layout.getBounds(oldSelection, newSelection);
         redraw(rect.x, rect.y, rect.width, rect.height, false);
       }
     } else {
       for (int j = 0; j < offsets.length; j++) {
         Rectangle[] rects = getRectangles(j);
         for (int i = 0; i < rects.length; i++) {
           Rectangle rect = rects[i];
           if (rect.contains(x, y)) {
             setCursor(display.getSystemCursor(SWT.CURSOR_HAND));
             return result;
           }
         }
       }
       setCursor(null);
     }
   }
   return result;
 }
Exemple #2
0
 /**
  * Shorten the given text <code>t</code> so that its length doesn't exceed the given width. The
  * default implementation replaces characters in the center of the original string with an
  * ellipsis ("..."). Override if you need a different strategy.
  *
  * @param gc the gc to use for text measurement
  * @param t the text to shorten
  * @param width the width to shorten the text to, in pixels
  * @return the shortened text
  */
 protected String shortenText(GC gc, String t, int width) {
   if (t == null) return null;
   int w = gc.textExtent(ELLIPSIS, DRAW_FLAGS).x;
   if (width <= w) return t;
   int l = t.length();
   int max = l / 2;
   int min = 0;
   int mid = (max + min) / 2 - 1;
   if (mid <= 0) return t;
   TextLayout layout = new TextLayout(getDisplay());
   layout.setText(t);
   mid = validateOffset(layout, mid);
   while (min < mid && mid < max) {
     String s1 = t.substring(0, mid);
     String s2 = t.substring(validateOffset(layout, l - mid), l);
     int l1 = gc.textExtent(s1, DRAW_FLAGS).x;
     int l2 = gc.textExtent(s2, DRAW_FLAGS).x;
     if (l1 + w + l2 > width) {
       max = mid;
       mid = validateOffset(layout, (max + min) / 2);
     } else if (l1 + w + l2 < width) {
       min = mid;
       mid = validateOffset(layout, (max + min) / 2);
     } else {
       min = max;
     }
   }
   String result =
       mid == 0
           ? t
           : t.substring(0, mid) + ELLIPSIS + t.substring(validateOffset(layout, l - mid), l);
   layout.dispose();
   return result;
 }
 /**
  * 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 #4
0
 LRESULT WM_SETFONT(int /*long*/ wParam, int /*long*/ lParam) {
   if (OS.COMCTL32_MAJOR < 6) {
     layout.setFont(Font.win32_new(display, wParam));
   }
   if (lParam != 0) OS.InvalidateRect(handle, null, true);
   return super.WM_SETFONT(font = wParam, lParam);
 }
Exemple #5
0
 void drawWidget(GC gc, RECT rect) {
   drawBackground(gc.handle, rect);
   int selStart = selection.x;
   int selEnd = selection.y;
   if (selStart > selEnd) {
     selStart = selection.y;
     selEnd = selection.x;
   }
   // temporary code to disable text selection
   selStart = selEnd = -1;
   if (!OS.IsWindowEnabled(handle)) gc.setForeground(disabledColor);
   layout.draw(gc, 0, 0, selStart, selEnd, null, null);
   if (hasFocus() && focusIndex != -1) {
     Rectangle[] rects = getRectangles(focusIndex);
     for (int i = 0; i < rects.length; i++) {
       Rectangle rectangle = rects[i];
       gc.drawFocus(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
     }
   }
   if (hooks(SWT.Paint) || filters(SWT.Paint)) {
     Event event = new Event();
     event.gc = gc;
     event.x = rect.left;
     event.y = rect.top;
     event.width = rect.right - rect.left;
     event.height = rect.bottom - rect.top;
     sendEvent(SWT.Paint, event);
     event.gc = null;
   }
 }
Exemple #6
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 createWidget(int index) {
   super.createWidget(index);
   layout.setFont(getFont());
   text = "";
   initAccessible();
 }
Exemple #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();
   }
 }
 @Override
 int setBounds(int x, int y, int width, int height, boolean move, boolean resize) {
   int result = super.setBounds(x, y, width, height, move, resize);
   if ((result & RESIZED) != 0) {
     layout.setWidth(width > 0 ? width : -1);
     redraw();
   }
   return result;
 }
Exemple #10
0
 LRESULT WM_SIZE(int /*long*/ wParam, int /*long*/ lParam) {
   LRESULT result = super.WM_SIZE(wParam, lParam);
   if (OS.COMCTL32_MAJOR < 6) {
     RECT rect = new RECT();
     OS.GetClientRect(handle, rect);
     layout.setWidth(rect.right > 0 ? rect.right : -1);
     redraw();
   }
   return result;
 }
Exemple #11
0
 void createWidget() {
   super.createWidget();
   text = "";
   if (OS.COMCTL32_MAJOR < 6) {
     if ((style & SWT.MIRRORED) != 0) {
       layout.setOrientation(SWT.RIGHT_TO_LEFT);
     }
     initAccessible();
   }
 }
Exemple #12
0
 void releaseWidget() {
   super.releaseWidget();
   if (layout != null) layout.dispose();
   layout = null;
   if (linkColor != null) linkColor.dispose();
   linkColor = null;
   disabledColor = null;
   offsets = null;
   ids = null;
   mnemonics = null;
   text = null;
 }
 @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();
 }
 @Override
 public Point computeSize(int wHint, int hHint, boolean changed) {
   checkWidget();
   if (wHint != SWT.DEFAULT && wHint < 0) wHint = 0;
   if (hHint != SWT.DEFAULT && hHint < 0) hHint = 0;
   int width, height;
   int layoutWidth = layout.getWidth();
   // TEMPORARY CODE
   if (wHint == 0) {
     layout.setWidth(1);
     Rectangle rect = layout.getBounds();
     width = 0;
     height = rect.height;
   } else {
     layout.setWidth(wHint);
     Rectangle rect = layout.getBounds();
     width = rect.width;
     height = rect.height;
   }
   layout.setWidth(layoutWidth);
   if (wHint != SWT.DEFAULT) width = wHint;
   if (hHint != SWT.DEFAULT) height = hHint;
   int border = getBorderWidth();
   width += border * 2;
   height += border * 2;
   return new Point(width, height);
 }
Exemple #15
0
 Rectangle[] getRectangles(int linkIndex) {
   int lineCount = layout.getLineCount();
   Rectangle[] rects = new Rectangle[lineCount];
   int[] lineOffsets = layout.getLineOffsets();
   Point point = offsets[linkIndex];
   int lineStart = 1;
   while (point.x > lineOffsets[lineStart]) lineStart++;
   int lineEnd = 1;
   while (point.y > lineOffsets[lineEnd]) lineEnd++;
   int index = 0;
   if (lineStart == lineEnd) {
     rects[index++] = layout.getBounds(point.x, point.y);
   } else {
     rects[index++] = layout.getBounds(point.x, lineOffsets[lineStart] - 1);
     rects[index++] = layout.getBounds(lineOffsets[lineEnd - 1], point.y);
     if (lineEnd - lineStart > 1) {
       for (int i = lineStart; i < lineEnd - 1; i++) {
         rects[index++] = layout.getLineBounds(i);
       }
     }
   }
   if (rects.length != index) {
     Rectangle[] tmp = new Rectangle[index];
     System.arraycopy(rects, 0, tmp, 0, index);
     rects = tmp;
   }
   return rects;
 }
 @Override
 long /*int*/ gtk_button_press_event(long /*int*/ widget, long /*int*/ event) {
   long /*int*/ result = super.gtk_button_press_event(widget, event);
   if (result != 0) return result;
   GdkEventButton gdkEvent = new GdkEventButton();
   OS.memmove(gdkEvent, event, GdkEventButton.sizeof);
   if (gdkEvent.button == 1 && gdkEvent.type == OS.GDK_BUTTON_PRESS) {
     if (focusIndex != -1) setFocus();
     int x = (int) gdkEvent.x;
     int y = (int) gdkEvent.y;
     if ((style & SWT.MIRRORED) != 0) x = getClientWidth() - x;
     int offset = layout.getOffset(x, y, null);
     int oldSelectionX = selection.x;
     int oldSelectionY = selection.y;
     selection.x = offset;
     selection.y = -1;
     if (oldSelectionX != -1 && oldSelectionY != -1) {
       if (oldSelectionX > oldSelectionY) {
         int temp = oldSelectionX;
         oldSelectionX = oldSelectionY;
         oldSelectionY = temp;
       }
       Rectangle rect = layout.getBounds(oldSelectionX, oldSelectionY);
       redraw(rect.x, rect.y, rect.width, rect.height, false);
     }
     for (int j = 0; j < offsets.length; j++) {
       Rectangle[] rects = getRectangles(j);
       for (int i = 0; i < rects.length; i++) {
         Rectangle rect = rects[i];
         if (rect.contains(x, y)) {
           focusIndex = j;
           redraw();
           return result;
         }
       }
     }
   }
   return result;
 }
 @Override
 boolean mnemonicMatch(char key) {
   char uckey = Character.toUpperCase(key);
   String parsedText = layout.getText();
   for (int i = 0; i < mnemonics.length - 1; i++) {
     if (mnemonics[i] != -1) {
       char mnemonic = parsedText.charAt(mnemonics[i]);
       if (uckey == Character.toUpperCase(mnemonic)) {
         return true;
       }
     }
   }
   return false;
 }
Exemple #18
0
 LRESULT WM_LBUTTONDOWN(int /*long*/ wParam, int /*long*/ lParam) {
   LRESULT result = super.WM_LBUTTONDOWN(wParam, lParam);
   if (result == LRESULT.ZERO) return result;
   if (OS.COMCTL32_MAJOR < 6) {
     if (focusIndex != -1) setFocus();
     int x = OS.GET_X_LPARAM(lParam);
     int y = OS.GET_Y_LPARAM(lParam);
     int offset = layout.getOffset(x, y, null);
     int oldSelectionX = selection.x;
     int oldSelectionY = selection.y;
     selection.x = offset;
     selection.y = -1;
     if (oldSelectionX != -1 && oldSelectionY != -1) {
       if (oldSelectionX > oldSelectionY) {
         int temp = oldSelectionX;
         oldSelectionX = oldSelectionY;
         oldSelectionY = temp;
       }
       Rectangle rect = layout.getBounds(oldSelectionX, oldSelectionY);
       redraw(rect.x, rect.y, rect.width, rect.height, false);
     }
     for (int j = 0; j < offsets.length; j++) {
       Rectangle[] rects = getRectangles(j);
       for (int i = 0; i < rects.length; i++) {
         Rectangle rect = rects[i];
         if (rect.contains(x, y)) {
           if (j != focusIndex) {
             redraw();
           }
           focusIndex = mouseDownIndex = j;
           return result;
         }
       }
     }
   }
   return result;
 }
 @Override
 long /*int*/ gtk_motion_notify_event(long /*int*/ widget, long /*int*/ event) {
   long /*int*/ result = super.gtk_motion_notify_event(widget, event);
   if (result != 0) return result;
   GdkEventMotion gdkEvent = new GdkEventMotion();
   OS.memmove(gdkEvent, event, GdkEventMotion.sizeof);
   int x = (int) gdkEvent.x;
   int y = (int) gdkEvent.y;
   if ((style & SWT.MIRRORED) != 0) x = getClientWidth() - x;
   if ((gdkEvent.state & OS.GDK_BUTTON1_MASK) != 0) {
     int oldSelection = selection.y;
     selection.y = layout.getOffset(x, y, null);
     if (selection.y != oldSelection) {
       int newSelection = selection.y;
       if (oldSelection > newSelection) {
         int temp = oldSelection;
         oldSelection = newSelection;
         newSelection = temp;
       }
       Rectangle rect = layout.getBounds(oldSelection, newSelection);
       redraw(rect.x, rect.y, rect.width, rect.height, false);
     }
   } else {
     for (int j = 0; j < offsets.length; j++) {
       Rectangle[] rects = getRectangles(j);
       for (int i = 0; i < rects.length; i++) {
         Rectangle rect = rects[i];
         if (rect.contains(x, y)) {
           setCursor(display.getSystemCursor(SWT.CURSOR_HAND));
           return result;
         }
       }
     }
     setCursor(null);
   }
   return result;
 }
 @Override
 boolean mnemonicHit(char key) {
   char uckey = Character.toUpperCase(key);
   String parsedText = layout.getText();
   for (int i = 0; i < mnemonics.length - 1; i++) {
     if (mnemonics[i] != -1) {
       char mnemonic = parsedText.charAt(mnemonics[i]);
       if (uckey == Character.toUpperCase(mnemonic)) {
         if (!setFocus()) return false;
         focusIndex = i;
         redraw();
         return true;
       }
     }
   }
   return false;
 }
Exemple #21
0
 public Point computeSize(int wHint, int hHint, boolean changed) {
   checkWidget();
   if (wHint != SWT.DEFAULT && wHint < 0) wHint = 0;
   if (hHint != SWT.DEFAULT && hHint < 0) hHint = 0;
   int width, height;
   if (OS.COMCTL32_MAJOR >= 6) {
     int /*long*/ hDC = OS.GetDC(handle);
     int /*long*/ newFont = OS.SendMessage(handle, OS.WM_GETFONT, 0, 0);
     int /*long*/ oldFont = OS.SelectObject(hDC, newFont);
     if (text.length() > 0) {
       TCHAR buffer = new TCHAR(getCodePage(), parse(text), false);
       RECT rect = new RECT();
       int flags = OS.DT_CALCRECT | OS.DT_NOPREFIX;
       if (wHint != SWT.DEFAULT) {
         flags |= OS.DT_WORDBREAK;
         rect.right = wHint;
       }
       OS.DrawText(hDC, buffer, buffer.length(), rect, flags);
       width = rect.right - rect.left;
       height = rect.bottom;
     } else {
       TEXTMETRIC lptm = OS.IsUnicode ? (TEXTMETRIC) new TEXTMETRICW() : new TEXTMETRICA();
       OS.GetTextMetrics(hDC, lptm);
       width = 0;
       height = lptm.tmHeight;
     }
     if (newFont != 0) OS.SelectObject(hDC, oldFont);
     OS.ReleaseDC(handle, hDC);
   } else {
     int layoutWidth = layout.getWidth();
     // TEMPORARY CODE
     if (wHint == 0) {
       layout.setWidth(1);
       Rectangle rect = layout.getBounds();
       width = 0;
       height = rect.height;
     } else {
       layout.setWidth(wHint);
       Rectangle rect = layout.getBounds();
       width = rect.width;
       height = rect.height;
     }
     layout.setWidth(layoutWidth);
   }
   if (wHint != SWT.DEFAULT) width = wHint;
   if (hHint != SWT.DEFAULT) height = hHint;
   int border = getBorderWidth();
   width += border * 2;
   height += border * 2;
   return new Point(width, height);
 }
 @Override
 void drawWidget(GC gc) {
   int selStart = selection.x;
   int selEnd = selection.y;
   if (selStart > selEnd) {
     selStart = selection.y;
     selEnd = selection.x;
   }
   // temporary code to disable text selection
   selStart = selEnd = -1;
   if ((state & DISABLED) != 0) gc.setForeground(disabledColor);
   layout.draw(gc, 0, 0, selStart, selEnd, null, null);
   if (hasFocus() && focusIndex != -1) {
     Rectangle[] rects = getRectangles(focusIndex);
     for (int i = 0; i < rects.length; i++) {
       Rectangle rect = rects[i];
       gc.drawFocus(rect.x, rect.y, rect.width, rect.height);
     }
   }
 }
 @Override
 void setOrientation(boolean create) {
   super.setOrientation(create);
   layout.setOrientation(style & (SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT));
   if (!create) redraw(true);
 }
 @Override
 void setFontDescription(long /*int*/ font) {
   super.setFontDescription(font);
   layout.setFont(Font.gtk_new(display, font));
 }
Exemple #25
0
 int validateOffset(TextLayout layout, int offset) {
   int nextOffset = layout.getNextOffset(offset, SWT.MOVEMENT_CLUSTER);
   if (nextOffset != offset) return layout.getPreviousOffset(nextOffset, SWT.MOVEMENT_CLUSTER);
   return offset;
 }