Beispiel #1
0
  int XmNexposureCallback(int w, int client_data, int call_data) {
    if ((style & SWT.SEPARATOR) != 0) return 0;
    int xDisplay = OS.XtDisplay(handle);
    if (xDisplay == 0) return 0;
    int xWindow = OS.XtWindow(handle);
    if (xWindow == 0) return 0;
    int[] argList = {
      OS.XmNcolormap, 0,
      OS.XmNwidth, 0,
      OS.XmNheight, 0,
    };
    OS.XtGetValues(handle, argList, argList.length / 2);
    int width = argList[3], height = argList[5];

    Image currentImage = image;
    boolean enabled = getEnabled();

    if ((parent.style & SWT.FLAT) != 0) {
      boolean hasCursor = hasCursor();

      /* Set the shadow thickness */
      int thickness = 0;
      if (set || (hasCursor && enabled)) {
        thickness = Math.min(2, display.buttonShadowThickness);
      }
      argList = new int[] {OS.XmNshadowThickness, thickness};
      OS.XtSetValues(handle, argList, argList.length / 2);

      /* Determine if hot image should be used */
      if (enabled && hasCursor && hotImage != null) {
        currentImage = hotImage;
      }
    }

    GCData data = new GCData();
    data.device = display;
    data.display = xDisplay;
    data.drawable = xWindow;
    data.font = parent.font;
    data.colormap = argList[1];
    int xGC = OS.XCreateGC(xDisplay, xWindow, 0, null);
    if (xGC == 0) SWT.error(SWT.ERROR_NO_HANDLES);
    GC gc = GC.motif_new(xGC, data);

    XmAnyCallbackStruct cb = new XmAnyCallbackStruct();
    OS.memmove(cb, call_data, XmAnyCallbackStruct.sizeof);
    if (cb.event != 0) {
      XExposeEvent xEvent = new XExposeEvent();
      OS.memmove(xEvent, cb.event, XExposeEvent.sizeof);
      Rectangle rect = new Rectangle(xEvent.x, xEvent.y, xEvent.width, xEvent.height);
      gc.setClipping(rect);
    }

    if (!enabled) {
      currentImage = disabledImage;
      if (currentImage == null && image != null) {
        currentImage = new Image(display, image, SWT.IMAGE_DISABLE);
      }
      Color disabledColor = display.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW);
      gc.setForeground(disabledColor);
    } else {
      gc.setForeground(parent.getForeground());
    }
    gc.setBackground(parent.getBackground());

    int textX = 0, textY = 0, textWidth = 0, textHeight = 0;
    if (text.length() != 0) {
      int flags = SWT.DRAW_DELIMITER | SWT.DRAW_TAB | SWT.DRAW_MNEMONIC;
      Point textExtent = gc.textExtent(text, flags);
      textWidth = textExtent.x;
      textHeight = textExtent.y;
    }
    int imageX = 0, imageY = 0, imageWidth = 0, imageHeight = 0;
    if (currentImage != null) {
      Rectangle imageBounds = currentImage.getBounds();
      imageWidth = imageBounds.width;
      imageHeight = imageBounds.height;
    }

    int spacing = 0;
    if (textWidth != 0 && imageWidth != 0) spacing = 2;
    if ((parent.style & SWT.RIGHT) != 0) {
      imageX = (width - imageWidth - textWidth - spacing) / 2;
      imageY = (height - imageHeight) / 2;
      textX = spacing + imageX + imageWidth;
      textY = (height - textHeight) / 2;
    } else {
      imageX = (width - imageWidth) / 2;
      imageY = (height - imageHeight - textHeight - spacing) / 2;
      textX = (width - textWidth) / 2;
      textY = spacing + imageY + imageHeight;
    }

    if ((style & SWT.DROP_DOWN) != 0) {
      textX -= 6;
      imageX -= 6;
    }
    if (textWidth > 0) {
      int flags = SWT.DRAW_DELIMITER | SWT.DRAW_TAB | SWT.DRAW_MNEMONIC | SWT.DRAW_TRANSPARENT;
      gc.drawText(text, textX, textY, flags);
    }
    if (imageWidth > 0) gc.drawImage(currentImage, imageX, imageY);
    if ((style & SWT.DROP_DOWN) != 0) {
      int startX = width - 12, startY = (height - 2) / 2;
      int[] arrow = {startX, startY, startX + 3, startY + 3, startX + 6, startY};
      gc.setBackground(parent.getForeground());
      gc.fillPolygon(arrow);
      gc.drawPolygon(arrow);
    }
    gc.dispose();
    OS.XFreeGC(xDisplay, xGC);

    if (!enabled && disabledImage == null) {
      if (currentImage != null) currentImage.dispose();
    }
    return 0;
  }
Beispiel #2
0
 /**
  * Constructs a new instance of this class given a device and an <code>RGB</code> describing the
  * desired red, green and blue values. On limited color devices, the color instance created by
  * this call may not have the same RGB values as the ones specified by the argument. The RGB
  * values on the returned instance will be the color values of the operating system color.
  *
  * <p>You must dispose the color when it is no longer required.
  *
  * @param device the device on which to allocate the color
  * @param rgb the RGB values of the desired color
  * @exception IllegalArgumentException
  *     <ul>
  *       <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device
  *       <li>ERROR_NULL_ARGUMENT - if the rgb argument is null
  *       <li>ERROR_INVALID_ARGUMENT - if the red, green or blue components of the argument are not
  *           between 0 and 255
  *     </ul>
  *
  * @see #dispose
  */
 public Color(Device device, RGB rgb) {
   super(device);
   if (rgb == null) SWT.error(SWT.ERROR_NULL_ARGUMENT);
   init(rgb.red, rgb.green, rgb.blue);
   init();
 }
Beispiel #3
0
 /**
  * Returns an <code>RGB</code> representing the receiver.
  *
  * @return the RGB for the color
  * @exception SWTException
  *     <ul>
  *       <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed
  *     </ul>
  */
 public RGB getRGB() {
   if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
   return new RGB((handle.red >> 8) & 0xFF, (handle.green >> 8) & 0xFF, (handle.blue >> 8) & 0xFF);
 }
Beispiel #4
0
 void init(int red, int green, int blue) {
   if ((red > 255) || (red < 0) || (green > 255) || (green < 0) || (blue > 255) || (blue < 0)) {
     SWT.error(SWT.ERROR_INVALID_ARGUMENT);
   }
   XColor xColor = new XColor();
   xColor.red = (short) ((red & 0xFF) | ((red & 0xFF) << 8));
   xColor.green = (short) ((green & 0xFF) | ((green & 0xFF) << 8));
   xColor.blue = (short) ((blue & 0xFF) | ((blue & 0xFF) << 8));
   handle = xColor;
   int xDisplay = device.xDisplay;
   int screen = OS.XDefaultScreen(xDisplay);
   int colormap = OS.XDefaultColormap(xDisplay, screen);
   /* 1. Try to allocate the color */
   if (OS.XAllocColor(xDisplay, colormap, xColor) != 0) {
     if (device.colorRefCount != null) {
       /* Make a copy of the color to put in the colors array */
       XColor colorCopy = new XColor();
       colorCopy.red = xColor.red;
       colorCopy.green = xColor.green;
       colorCopy.blue = xColor.blue;
       colorCopy.pixel = xColor.pixel;
       device.xcolors[colorCopy.pixel] = colorCopy;
       device.colorRefCount[xColor.pixel]++;
     }
     return;
   }
   /*
    * 2. Allocation failed. Query the entire colormap and
    * find the closest match which can be allocated.
    * This should never occur on a truecolor display.
    */
   Visual visual = new Visual();
   OS.memmove(visual, OS.XDefaultVisual(xDisplay, screen), Visual.sizeof);
   int mapEntries = visual.map_entries;
   XColor[] queried = new XColor[mapEntries];
   int[] distances = new int[mapEntries];
   /*
    * Query all colors in the colormap and calculate the distance
    * from each to the desired color.
    */
   for (int i = 0; i < mapEntries; i++) {
     XColor color = new XColor();
     color.pixel = i;
     queried[i] = color;
     OS.XQueryColor(xDisplay, colormap, color);
     int r = red - ((color.red >> 8) & 0xFF);
     int g = green - ((color.green >> 8) & 0xFF);
     int b = blue - ((color.blue >> 8) & 0xFF);
     distances[i] = r * r + g * g + b * b;
   }
   /*
    * Try to allocate closest matching queried color.
    * The allocation can fail if the closest matching
    * color is allocated privately, so go through them
    * in order of increasing distance.
    */
   for (int i = 0; i < mapEntries; i++) {
     int minDist = 0x30000;
     int minIndex = 0;
     for (int j = 0; j < mapEntries; j++) {
       if (distances[j] < minDist) {
         minDist = distances[j];
         minIndex = j;
       }
     }
     XColor queriedColor = queried[minIndex];
     XColor osColor = new XColor();
     osColor.red = queriedColor.red;
     osColor.green = queriedColor.green;
     osColor.blue = queriedColor.blue;
     if (OS.XAllocColor(xDisplay, colormap, osColor) != 0) {
       /* Allocation succeeded. Copy the fields into the handle */
       xColor.red = osColor.red;
       xColor.green = osColor.green;
       xColor.blue = osColor.blue;
       xColor.pixel = osColor.pixel;
       if (device.colorRefCount != null) {
         /* Put osColor in the colors array */
         device.xcolors[osColor.pixel] = osColor;
         device.colorRefCount[osColor.pixel]++;
       }
       return;
     }
     /* The allocation failed; matching color is allocated privately */
     distances[minIndex] = 0x30000;
   }
   /*
    * 3. Couldn't allocate any of the colors in the colormap.
    * This means all colormap entries were allocated privately
    * by other applications. Give up and allocate black.
    */
   XColor osColor = new XColor();
   OS.XAllocColor(xDisplay, colormap, osColor);
   /* Copy the fields into the handle */
   xColor.red = osColor.red;
   xColor.green = osColor.green;
   xColor.blue = osColor.blue;
   xColor.pixel = osColor.pixel;
   if (device.colorRefCount != null) {
     /* Put osColor in the colors array */
     device.xcolors[osColor.pixel] = osColor;
     device.colorRefCount[osColor.pixel]++;
   }
 }
Beispiel #5
0
 /**
  * Returns the amount of red in the color, from 0 to 255.
  *
  * @return the red component of the color
  * @exception SWTException
  *     <ul>
  *       <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed
  *     </ul>
  */
 public int getRed() {
   if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
   return (handle.red >> 8) & 0xFF;
 }