[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.platform.swt] How to copy image from TabFolder

Hi,

I have a TabFolder with few TabItems, I want to save image of each tab item.

Please see my code below. It is not working as desired. Could someone please tell me what is going wrong ? I am getting the image of first tab item correctly.

import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DirectColorModel;
import java.awt.image.IndexColorModel;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;

import org.eclipse.swt.*;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;

public class Snippet76 {

public static void main(String[] args) {
       Display display = new Display();
	final Shell shell = new Shell(display);
	final TabFolder tabFolder = new TabFolder(shell, SWT.BORDER);
	List<Composite> controls = new ArrayList<Composite>();
	for (int i = 0; i < 2; i++) {
	        TabItem item = new TabItem(tabFolder, SWT.NONE);
		if (i == 0)
		item.setText("One " + i);
		else
		item.setText("Two " + i);
		Composite composite = new Composite(tabFolder, SWT.NORMAL);
		composite.setLayout(new GridLayout());
		Button button = new Button(composite, SWT.PUSH);
		button.setText("Page " + i);
		controls.add(composite);
		item.setControl(composite);
		composite.pack();
	}
	tabFolder.pack();
	shell.pack();
	shell.open();
	saveGallery("C:\\Users\\zeetech\\Desktop\\tst.png", controls);
	while (!shell.isDisposed()) {
		if (!display.readAndDispatch())
			display.sleep();
	}
	display.dispose();
}

public static void saveGallery(String fileName,
	java.util.List<Composite> pages) {
	int count = 0;
	String extension = getFileExtension(fileName);
	String file = fileName.substring(0, fileName.lastIndexOf("."));
	for (Composite page : pages) {
		Point tableSize = page.getSize();
		GC gc = new GC(page);
		final Image image = new Image(page.getDisplay(), tableSize.x,
				tableSize.y);
		gc.copyArea(image, 0, 0);
	BufferedImage bufferedImage =  convertToAWT(image.getImageData());
		try {
		ImageIO.write(bufferedImage, extension, new File(file + count++
					+ "." + extension));

		} catch (IOException e) {
			e.printStackTrace();
		}
		gc.dispose();
	}
}

public static String getFileExtension(String fileName) {
	int index = fileName.lastIndexOf('.');
	if (index == -1)
		return null;
	if (index == (fileName.length() - 1))
		return "";
	return fileName.substring(index + 1);
}

static BufferedImage convertToAWT(ImageData data) {
		ColorModel colorModel = null;
		PaletteData palette = data.palette;
		if (palette.isDirect) {
		colorModel = new DirectColorModel(data.depth, palette.redMask,
					palette.greenMask, palette.blueMask);
	BufferedImage bufferedImage = new BufferedImage(colorModel,
			colorModel.createCompatibleWritableRaster(data.width,
						data.height), false, null);
		WritableRaster raster = bufferedImage.getRaster();
		int[] pixelArray = new int[3];
		for (int y = 0; y < data.height; y++) {
			for (int x = 0; x < data.width; x++) {
				int pixel = data.getPixel(x, y);
				RGB rgb = palette.getRGB(pixel);
				pixelArray[0] = rgb.red;
				pixelArray[1] = rgb.green;
				pixelArray[2] = rgb.blue;
				raster.setPixels(x, y, 1, 1, pixelArray);
			}
		}
		return bufferedImage;
		} else {
			RGB[] rgbs = palette.getRGBs();
			byte[] red = new byte[rgbs.length];
			byte[] green = new byte[rgbs.length];
			byte[] blue = new byte[rgbs.length];
			for (int i = 0; i < rgbs.length; i++) {
				RGB rgb = rgbs[i];
				red[i] = (byte) rgb.red;
				green[i] = (byte) rgb.green;
				blue[i] = (byte) rgb.blue;
			}
		if (data.transparentPixel != -1) {
		colorModel = new IndexColorModel(data.depth, rgbs.length, red,
					green, blue, data.transparentPixel);
		} else {
		colorModel = new IndexColorModel(data.depth, rgbs.length, red,
						green, blue);
		}
BufferedImage bufferedImage = new BufferedImage(colorModel,
			colorModel.createCompatibleWritableRaster(data.width,
						data.height), false, null);
			WritableRaster raster = bufferedImage.getRaster();
			int[] pixelArray = new int[1];
			for (int y = 0; y < data.height; y++) {
				for (int x = 0; x < data.width; x++) {
					int pixel = data.getPixel(x, y);
					pixelArray[0] = pixel;
					raster.setPixel(x, y, pixelArray);
				}
			}
			return bufferedImage;
		}
	}
}