/**************************************************************************** * 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; } }