/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation 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.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.snippets;

import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;

/**
 * Region snippet: Create non-rectangular shell from an image with transparency
 *
 * For a list of all SWT example snippets see
 * http://www.eclipse.org/swt/snippets/
 * 
 * @since 3.2
 */
public class Snippet219 {
	public static void main(String[] args) {
        final Display display = new Display ();
        final Image image = display.getSystemImage(SWT.ICON_INFORMATION);
        final Shell shell = new Shell (display, SWT.NO_TRIM);
        Region region = new Region();
        final ImageData imageData = image.getImageData();
        if (imageData.alphaData != null) {
        	Rectangle pixel = new Rectangle(0, 0, 1, 1);
        	for (int y = 0; y < imageData.height; y++) {
	            for (int x = 0; x < imageData.width; x++) {
	                if (imageData.getAlpha(x, y) == 255) {
	                	pixel.x = imageData.x + x;
    					pixel.y = imageData.y + y;
	                    region.add(pixel);
	                } 
	            }
	        }
        } else {
        	ImageData mask = imageData.getTransparencyMask();
        	Rectangle pixel = new Rectangle(0, 0, 1, 1);
    		for (int y = 0; y < mask.height; y++) {
    			for (int x = 0; x < mask.width; x++) {
    				if (mask.getPixel(x, y) != 0) {
    					pixel.x = imageData.x + x;
    					pixel.y = imageData.y + y;
    					region.add(pixel);
    				}
    			}
    		}
        }
        shell.setRegion(region);

        Listener l = new Listener() {
        	int startX, startY;
            public void handleEvent(Event e)  {
            	if (e.type == SWT.KeyDown && e.character == SWT.ESC) {
            		shell.dispose();
            	}
				if (e.type == SWT.MouseDown && e.button == 1) {
					startX = e.x;
					startY = e.y; 
				}
				if (e.type == SWT.MouseMove && (e.stateMask & SWT.BUTTON1) != 0) {
					Point p = shell.toDisplay(e.x, e.y);
					p.x -= startX;
					p.y -= startY;
					shell.setLocation(p);
				}
				if (e.type == SWT.Paint) {
					e.gc.drawImage(image, imageData.x, imageData.y);
				}
            }
        };
        shell.addListener(SWT.KeyDown, l);
        shell.addListener(SWT.MouseDown, l);
        shell.addListener(SWT.MouseMove, l);
        shell.addListener(SWT.Paint, l);

        shell.setSize(imageData.x + imageData.width, imageData.y + imageData.height);
        shell.open ();
        while (!shell.isDisposed ()) {
            if (!display.readAndDispatch ())
                display.sleep ();
        }
        region.dispose();
        image.dispose ();
        display.dispose ();
    }
}
