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; }
/** * 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(); }
/** * 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); }
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]++; } }
/** * 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; }