org.eclipse.ecf.ui.screencapture.ScreenCaptureJob.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ecf.ui.screencapture.ScreenCaptureJob.java

Source

/****************************************************************************
 * Copyright (c) 2007 Composent, Inc. 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:
 *    Composent, Inc. - initial API and implementation
 *****************************************************************************/

package org.eclipse.ecf.ui.screencapture;

import org.eclipse.core.runtime.*;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.progress.UIJob;

public class ScreenCaptureJob extends UIJob {

    final Color blackColor;

    final Color whiteColor;

    boolean isDragging = false;

    int downX = -1;

    int downY = -1;

    final IImageSender imageSender;

    final ID targetID;

    final String nickName;

    Cursor crossCursor;

    GC gc;

    public ScreenCaptureJob(Display display, ID targetID, String nickName, IImageSender imageSender) {
        super(display, "Capturing screen..."); //$NON-NLS-1$
        blackColor = new Color(display, 0, 0, 0);
        whiteColor = new Color(display, 255, 255, 255);
        this.targetID = targetID;
        this.nickName = nickName;
        this.imageSender = imageSender;
    }

    public IStatus runInUIThread(IProgressMonitor monitor) {
        final Display display = getDisplay();
        final GC context = new GC(display);
        final Rectangle displayBounds = display.getBounds();
        final Image image = new Image(display, displayBounds);
        context.copyArea(image, displayBounds.x, displayBounds.y);
        context.dispose();

        final Shell shell = new Shell(display, SWT.NO_TRIM);
        shell.setLayout(new FillLayout());
        shell.setBounds(displayBounds);

        crossCursor = new Cursor(display, SWT.CURSOR_CROSS);
        shell.setCursor(crossCursor);

        gc = new GC(shell);

        shell.addPaintListener(new PaintListener() {
            public void paintControl(PaintEvent e) {
                e.gc.drawImage(image, 0, 0);
            }
        });
        shell.addKeyListener(new KeyListener() {
            public void keyPressed(KeyEvent e) {
                if (e.character == SWT.ESC)
                    shell.close();
            }

            public void keyReleased(KeyEvent e) {
                if (e.character == SWT.ESC)
                    shell.close();
            }
        });
        shell.addMouseListener(new MouseAdapter() {
            public void mouseDown(MouseEvent e) {
                isDragging = true;
                downX = e.x;
                downY = e.y;
            }

            public void mouseUp(MouseEvent e) {
                isDragging = false;
                final int width = Math.max(downX, e.x) - Math.min(downX, e.x);
                final int height = Math.max(downY, e.y) - Math.min(downY, e.y);
                if (width != 0 && height != 0) {
                    final Image copy = new Image(display, width, height);
                    gc.copyArea(copy, Math.min(downX, e.x), Math.min(downY, e.y));
                    blackColor.dispose();
                    whiteColor.dispose();
                    final Dialog dialog = new ScreenCaptureConfirmationDialog(shell, targetID, nickName, copy,
                            width, height, imageSender);
                    dialog.open();

                    shell.close();
                    copy.dispose();
                }
            }
        });

        shell.addMouseMoveListener(new MouseMoveListener() {
            public void mouseMove(MouseEvent e) {
                if (isDragging) {
                    gc.drawImage(image, 0, 0);
                    gc.setForeground(blackColor);
                    gc.drawRectangle(downX, downY, e.x - downX, e.y - downY);
                    gc.setForeground(whiteColor);
                    gc.drawRectangle(downX - 1, downY - 1, e.x - downX + 2, e.y - downY + 2);
                }
            }
        });

        shell.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                image.dispose();
                crossCursor.dispose();
                gc.dispose();
            }
        });

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        return Status.OK_STATUS;
    }

}