Bug 87329 - GC.copyArea returns only images in the Browser widget.
Summary: GC.copyArea returns only images in the Browser widget.
Status: RESOLVED INVALID
Alias: None
Product: Platform
Classification: Eclipse Project
Component: SWT (show other bugs)
Version: 3.0.1   Edit
Hardware: PC Windows 2000
: P3 major (vote)
Target Milestone: ---   Edit
Assignee: Platform-SWT-Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords: ui
Depends on:
Blocks:
 
Reported: 2005-03-07 16:21 EST by Alexander Glazkov CLA
Modified: 2005-03-07 16:46 EST (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Alexander Glazkov CLA 2005-03-07 16:21:08 EST
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();
        }
    }
    
}
Comment 1 Alexander Glazkov CLA 2005-03-07 16:24:36 EST
I have IE 6, but I think it shouldn't matter.
Comment 2 Alexander Glazkov CLA 2005-03-07 16:46:43 EST
The problem is ProgressListener.completed(ProgressEvent) is invoked when the 
widget is in process of painting.