Mercurial > projects > dwt-addons
view dwtx/novocode/ScaledImage.d @ 190:df4e66472aff
novocode line endings, indention
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sun, 26 Oct 2008 15:04:41 +0100 |
parents | e3780acbbf80 |
children |
line wrap: on
line source
/******************************************************************************* * Copyright (c) 2004 Stefan Zeiger and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.novocode.com/legal/epl-v10.html * * Contributors: * Stefan Zeiger (szeiger@novocode.com) - initial API and implementation * IBM Corporation - original SWT CLabel implementation on which this class is based *******************************************************************************/ module dwtx.novocode.ScaledImage; import dwt.DWT; import dwt.graphics.Color; import dwt.graphics.GC; import dwt.graphics.Image; import dwt.graphics.Point; import dwt.graphics.Rectangle; import dwt.widgets.Canvas; import dwt.widgets.Composite; import dwt.widgets.Event; import dwt.widgets.Listener; /** * An image / gradient component. Under development. * * @author Stefan Zeiger (szeiger@novocode.com) * @since Mar 21, 2005 * @version $Id: ScaledImage.java 346 2005-07-11 20:15:57 +0000 (Mon, 11 Jul 2005) szeiger $ */ class ScaledImage : Canvas { private const Rectangle DEFAULT_BOUNDS; public static const int IMAGE_PLACEMENT_STRETCH = 0; public static const int IMAGE_PLACEMENT_TILE = 1; private Image image; private Color[] gradientColors; private int[] gradientPercents; private bool gradientVertical; private int imagePlacement = IMAGE_PLACEMENT_STRETCH; this(Composite parent, int style) { super(parent, style | DWT.NO_BACKGROUND); this.DEFAULT_BOUNDS = new Rectangle(0, 0, 32, 32); addListener(DWT.Paint, dgListener(&onPaint)); } private void onPaint(Event event) { Rectangle rect = getClientArea(); GC gc = event.gc; if(image is null || image.getImageData().getTransparencyType() !is DWT.TRANSPARENCY_NONE) { if(gradientColors !is null) { // draw a gradient behind the text Color oldBackground = gc.getBackground(); if(gradientColors.length is 1) { if(gradientColors[0] !is null) gc.setBackground(gradientColors[0]); gc.fillRectangle(0, 0, rect.width, rect.height); } else { Color oldForeground = gc.getForeground(); Color lastColor = gradientColors[0]; if(lastColor is null) lastColor = oldBackground; int pos = 0; for(int i = 0; i < gradientPercents.length; ++i) { gc.setForeground(lastColor); lastColor = gradientColors[i + 1]; if(lastColor is null) lastColor = oldBackground; gc.setBackground(lastColor); if(gradientVertical) { int gradientHeight = (gradientPercents[i] * rect.height / 100) - pos; gc.fillGradientRectangle(0, pos, rect.width, gradientHeight, true); pos += gradientHeight; } else { int gradientWidth = (gradientPercents[i] * rect.width / 100) - pos; gc.fillGradientRectangle(pos, 0, gradientWidth, rect.height, false); pos += gradientWidth; } } if(gradientVertical && pos < rect.height) { gc.setBackground(getBackground()); gc.fillRectangle(0, pos, rect.width, rect.height - pos); } if(!gradientVertical && pos < rect.width) { gc.setBackground(getBackground()); gc.fillRectangle(pos, 0, rect.width - pos, rect.height); } gc.setForeground(oldForeground); } gc.setBackground(oldBackground); } else { if((getStyle() & DWT.NO_BACKGROUND) !is 0) { gc.setBackground(getBackground()); gc.fillRectangle(rect); } } } if(image !is null) { Rectangle ib = image.getBounds(); if(imagePlacement is IMAGE_PLACEMENT_TILE) { int maxStartX = rect.x + rect.width; int maxStartY = rect.y + rect.height; for(int x = rect.x; x < maxStartX; x += ib.width) for(int y = rect.y; y < maxStartY; y += ib.height) event.gc.drawImage(image, x, y); } else // IMAGE_PLACEMENT_STRETCH { event.gc.drawImage(image, ib.x, ib.y, ib.width, ib.height, rect.x, rect.y, rect.width, rect.height); } } } public void setImage(Image image) { this.image = image; redraw(); } public void setImagePlacement(int imagePlacement) { this.imagePlacement = imagePlacement; redraw(); } public Point computeSize(int wHint, int hHint, bool changed) { checkWidget(); Rectangle ib = image !is null ? image.getBounds() : DEFAULT_BOUNDS; if(wHint == DWT.DEFAULT) wHint = ib.width; if(hHint == DWT.DEFAULT) hHint = ib.height; return new Point(wHint, hHint); } public void setBackground(Color color) { super.setBackground(color); // Are these settings the same as before? if(color !is null && gradientColors is null && gradientPercents is null) { Color background = getBackground(); if(color is background) { return; } } gradientColors = null; gradientPercents = null; redraw(); } public void setBackground(Color[] colors, int[] percents) { setBackground(colors, percents, false); } public void setBackground(Color[] colors, int[] percents, bool vertical) { checkWidget(); if(colors !is null) { if(percents is null || percents.length !is colors.length - 1) { DWT.error(DWT.ERROR_INVALID_ARGUMENT); } if(getDisplay().getDepth() < 15) { // Don't use gradients on low color displays colors = [ colors[colors.length - 1] ]; percents = []; } for(int i = 0; i < percents.length; i++) { if(percents[i] < 0 || percents[i] > 100) { DWT.error(DWT.ERROR_INVALID_ARGUMENT); } if(i > 0 && percents[i] < percents[i - 1]) { DWT.error(DWT.ERROR_INVALID_ARGUMENT); } } } // Are these settings the same as before? Color background = getBackground(); if((gradientColors !is null) && (colors !is null) && (gradientColors.length is colors.length)) { bool same = false; for(int i = 0; i < gradientColors.length; i++) { same = (gradientColors[i] is colors[i]) || ((gradientColors[i] is null) && (colors[i] is background)) || ((gradientColors[i] is background) && (colors[i] is null)); if(!same) break; } if(same) { for(int i = 0; i < gradientPercents.length; i++) { same = gradientPercents[i] is percents[i]; if(!same) break; } } if(same && this.gradientVertical is vertical) return; } // Store the new settings if(colors is null) { gradientColors = null; gradientPercents = null; gradientVertical = false; } else { gradientColors = new Color[colors.length]; for(int i = 0; i < colors.length; ++i) gradientColors[i] = (colors[i] !is null) ? colors[i] : background; gradientPercents = new int[percents.length]; for(int i = 0; i < percents.length; ++i) gradientPercents[i] = percents[i]; gradientVertical = vertical; } // Refresh with the new settings redraw(); } }