diff dwtx/novocode/ScaledImage.d @ 188:e3780acbbf80

Added ported sources from Novocode, thanks to WasserDragoon
author Frank Benoit <benoit@tionex.de>
date Sun, 26 Oct 2008 14:54:39 +0100
parents
children df4e66472aff
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtx/novocode/ScaledImage.d	Sun Oct 26 14:54:39 2008 +0100
@@ -0,0 +1,271 @@
+/*******************************************************************************
+ * 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();
+  }
+}