Community
Participate
Working Groups
GC.copyArea does not capture text in the Browser widget. Returns only images. The sample below demonstrates that. package swt1; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.ProgressEvent; import org.eclipse.swt.browser.ProgressListener; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Layout; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; public class BrowserCopyAreaDemo { public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); String url = "http://www.eclipse.org/"; shell.setText(url); shell.setBounds(0, 0, 200, 400); Layout layout = new FillLayout(SWT.HORIZONTAL); shell.setLayout(layout); Browser browser = new Browser(shell, SWT.NONE); browser.setBounds(0, 0, 200, 400); browser.addProgressListener(new MyProgressListener2(shell, display, browser)); shell.open(); browser.setUrl(url); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } } class MyProgressListener2 implements ProgressListener { private Shell parentShell; private Browser browser; private Display display; /** * */ public MyProgressListener2(Shell parentShell, Display display, Browser browser) { this.parentShell = parentShell; this.display = display; this.browser = browser; } /* (non-Javadoc) * @see org.eclipse.swt.browser.ProgressListener#changed (org.eclipse.swt.browser.ProgressEvent) */ public void changed(ProgressEvent arg0) { } /* (non-Javadoc) * @see org.eclipse.swt.browser.ProgressListener#completed (org.eclipse.swt.browser.ProgressEvent) */ public void completed(ProgressEvent arg0) { Point browserSize = browser.getSize(); GC gc = new GC(browser); try { final Image image = new Image(display, browserSize.x, browserSize.y); gc.copyArea(image, 0, 0); ImageData imageData = image.getImageData(); Shell popup = new Shell(parentShell); popup.setText("Image"); popup.setBounds(50, 50, 200, 200); popup.addListener(SWT.Close, new Listener() { public void handleEvent(Event event) { image.dispose(); } }); Canvas canvas = new Canvas(popup, SWT.NONE); canvas.setBounds(10, 10, 150, 150); canvas.addPaintListener(new PaintListener() { public void paintControl(PaintEvent e) { e.gc.drawImage(image, 0, 0); } }); popup.open(); } finally { gc.dispose(); } } }
I have IE 6, but I think it shouldn't matter.
The problem is ProgressListener.completed(ProgressEvent) is invoked when the widget is in process of painting.