Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 160572 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/mylyn/internal/tasks/ui/wizards/ScreenShotAttachmentPage.java (-39 / +170 lines)
Lines 14-29 Link Here
14
import org.eclipse.mylyn.internal.tasks.core.LocalAttachment;
14
import org.eclipse.mylyn.internal.tasks.core.LocalAttachment;
15
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.SWT;
16
import org.eclipse.swt.custom.ScrolledComposite;
16
import org.eclipse.swt.custom.ScrolledComposite;
17
import org.eclipse.swt.events.MouseEvent;
18
import org.eclipse.swt.events.MouseListener;
19
import org.eclipse.swt.events.MouseMoveListener;
17
import org.eclipse.swt.events.PaintEvent;
20
import org.eclipse.swt.events.PaintEvent;
18
import org.eclipse.swt.events.PaintListener;
21
import org.eclipse.swt.events.PaintListener;
19
import org.eclipse.swt.events.SelectionEvent;
22
import org.eclipse.swt.events.SelectionEvent;
20
import org.eclipse.swt.events.SelectionListener;
23
import org.eclipse.swt.events.SelectionListener;
24
import org.eclipse.swt.graphics.Cursor;
21
import org.eclipse.swt.graphics.GC;
25
import org.eclipse.swt.graphics.GC;
22
import org.eclipse.swt.graphics.Image;
26
import org.eclipse.swt.graphics.Image;
23
import org.eclipse.swt.graphics.Point;
27
import org.eclipse.swt.graphics.Point;
24
import org.eclipse.swt.graphics.Rectangle;
28
import org.eclipse.swt.graphics.Rectangle;
25
import org.eclipse.swt.layout.FillLayout;
26
import org.eclipse.swt.layout.GridData;
27
import org.eclipse.swt.layout.GridLayout;
29
import org.eclipse.swt.layout.GridLayout;
28
import org.eclipse.swt.widgets.Button;
30
import org.eclipse.swt.widgets.Button;
29
import org.eclipse.swt.widgets.Canvas;
31
import org.eclipse.swt.widgets.Canvas;
Lines 44-55 Link Here
44
46
45
	private Button makeShotButton;
47
	private Button makeShotButton;
46
48
47
	private Button showShotButton;
49
	private Button cropShotButton;
48
50
49
	private Image screenshotImage;
51
	private Image screenshotImage;
50
52
51
	private Canvas canvas;
53
	private Canvas canvas;
52
54
55
	private ScrolledComposite scrolledComposite;
56
53
	protected ScreenShotAttachmentPage(LocalAttachment attachment) {
57
	protected ScreenShotAttachmentPage(LocalAttachment attachment) {
54
		super("ScreenShotAttachment");
58
		super("ScreenShotAttachment");
55
		setTitle("Create a screenshot");
59
		setTitle("Create a screenshot");
Lines 58-80 Link Here
58
	}
62
	}
59
63
60
	public void createControl(Composite parent) {
64
	public void createControl(Composite parent) {
65
61
		Composite composite = new Composite(parent, SWT.NONE);
66
		Composite composite = new Composite(parent, SWT.NONE);
62
		GridLayout gridLayout = new GridLayout();
67
		composite.setLayout(new GridLayout());
63
		gridLayout.numColumns = 2;
64
		composite.setLayout(gridLayout);
65
		setControl(composite);
68
		setControl(composite);
66
69
67
		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
70
		Composite buttonsComposite = new Composite(composite, SWT.NONE);
68
		composite.setLayout(new GridLayout(3, false));
71
		buttonsComposite.setLayout(new GridLayout(2, false));
69
72
		makeShotButton = new Button(buttonsComposite, SWT.PUSH);
70
		makeShotButton = new Button(composite, SWT.PUSH);
73
		makeShotButton.setText("Capture full screen");
71
		makeShotButton.setText("Take a screenshot");
72
		makeShotButton.addSelectionListener(new SelectionListener() {
74
		makeShotButton.addSelectionListener(new SelectionListener() {
73
75
74
			public void widgetSelected(SelectionEvent e) {
76
			public void widgetSelected(SelectionEvent e) {
75
				storeScreenshotContent();
77
				storeScreenshotContent();
76
				page.setErrorMessage(null);
78
				page.setErrorMessage(null);
77
				showShotButton.setEnabled(true);
79
				cropShotButton.setEnabled(true);
78
			}
80
			}
79
81
80
			public void widgetDefaultSelected(SelectionEvent e) {
82
			public void widgetDefaultSelected(SelectionEvent e) {
Lines 82-117 Link Here
82
84
83
		});
85
		});
84
86
85
		showShotButton = new Button(composite, SWT.PUSH);
87
		cropShotButton = new Button(buttonsComposite, SWT.PUSH);
86
		showShotButton.setText("Show the screenshot");
88
		cropShotButton.setText("Crop a region");
87
		showShotButton.addSelectionListener(new SelectionListener() {
89
		cropShotButton.addSelectionListener(new SelectionListener() {
88
90
89
			public void widgetSelected(SelectionEvent e) {
91
			public void widgetSelected(SelectionEvent e) {
90
				showScreenshotContent();
92
				cropScreenshotContent();
91
			}
93
			}
92
94
93
			public void widgetDefaultSelected(SelectionEvent e) {
95
			public void widgetDefaultSelected(SelectionEvent e) {
94
			}
96
			}
95
97
96
		});
98
		});
99
		cropShotButton.setEnabled(false);
97
100
98
		canvas = new Canvas(composite, SWT.BORDER);
101
		scrolledComposite = new ScrolledComposite(composite, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
99
		canvas.setLayoutData(GridDataFactory.fillDefaults()
102
		scrolledComposite.setLayoutData(GridDataFactory.fillDefaults()
100
				.align(SWT.FILL, SWT.FILL)
103
				.align(SWT.FILL, SWT.FILL)
101
				.grab(true, true)
104
				.grab(true, true)
102
				.span(2, 1)
103
				.create());
105
				.create());
104
106
107
		canvas = new Canvas(scrolledComposite, SWT.DOUBLE_BUFFERED | SWT.NONE);
108
		scrolledComposite.setContent(canvas);
105
		canvas.addPaintListener(new PaintListener() {
109
		canvas.addPaintListener(new PaintListener() {
106
			public void paintControl(PaintEvent e) {
110
			public void paintControl(PaintEvent e) {
107
				if (screenshotImage != null) {
111
				if (screenshotImage != null) {
108
					Rectangle screenBounds = screenshotImage.getBounds();
112
					e.gc.drawImage(screenshotImage, 0, 0);
109
					Rectangle canvasBounds = canvas.getBounds();
110
					e.gc.drawImage(screenshotImage, 0, 0, screenBounds.width, screenBounds.height, 0, 0,
111
							canvasBounds.width, canvasBounds.height);
112
				} else {
113
				} else {
113
					page.setErrorMessage("Screenshot required");
114
					page.setErrorMessage("Screenshot required");
114
					showShotButton.setEnabled(false);
115
					cropShotButton.setEnabled(false);
115
				}
116
				}
116
			}
117
			}
117
		});
118
		});
Lines 148-156 Link Here
148
		display.asyncExec(new Runnable() {
149
		display.asyncExec(new Runnable() {
149
			public void run() {
150
			public void run() {
150
				GC gc = new GC(display);
151
				GC gc = new GC(display);
151
				screenshotImage = new Image(display, display.getBounds());
152
				Rectangle displayBounds = display.getBounds();
153
				screenshotImage = new Image(display, displayBounds);
152
				gc.copyArea(screenshotImage, 0, 0);
154
				gc.copyArea(screenshotImage, 0, 0);
155
				gc.drawRectangle(0, 0, displayBounds.width - 1, displayBounds.height - 1);
153
				gc.dispose();
156
				gc.dispose();
157
				canvas.setBounds(screenshotImage.getBounds());
158
				scrolledComposite.redraw();
154
				canvas.redraw();
159
				canvas.redraw();
155
				wizardShell.setVisible(true);
160
				wizardShell.setVisible(true);
156
				if (screenshotImage != null)
161
				if (screenshotImage != null)
Lines 159-192 Link Here
159
		});
164
		});
160
	}
165
	}
161
166
162
	private void showScreenshotContent() {
167
	private void cropScreenshotContent() {
163
		Display display = Display.getDefault();
168
169
		final Point downPoint = new Point(-1, -1);
170
		final Rectangle newImageBounds = new Rectangle(-1, -1, -1, -1);
164
171
165
		Shell popup = new Shell(display.getActiveShell(), SWT.SHELL_TRIM);
172
		final Display display = Display.getDefault();
166
		popup.setLayout(new FillLayout());
173
		final Rectangle displayBounds = display.getBounds();
167
		popup.setText("Screenshot Image");
174
175
		final Shell popup = new Shell(display.getActiveShell(), SWT.SHELL_TRIM);
176
		popup.setLayout(new GridLayout());
177
		popup.setText("Crop a region of the screenshot");
168
178
169
		Rectangle displayBounds = Display.getDefault().getBounds();
170
		Point dialogSize = new Point(0, 0);
179
		Point dialogSize = new Point(0, 0);
171
		dialogSize.x = displayBounds.width / 2;
180
		dialogSize.x = displayBounds.width - 100;
172
		dialogSize.y = displayBounds.height / 2;
181
		dialogSize.y = displayBounds.height - 100;
173
		Point dialoglocation = new Point(0, 0);
182
		Point dialoglocation = new Point(0, 0);
174
		dialoglocation.x = displayBounds.x + displayBounds.width / 2 - dialogSize.x / 2;
183
		dialoglocation.x = displayBounds.x + displayBounds.width / 2 - dialogSize.x / 2;
175
		dialoglocation.y = displayBounds.y + displayBounds.height / 2 - dialogSize.y / 2;
184
		dialoglocation.y = displayBounds.y + displayBounds.height / 2 - dialogSize.y / 2;
176
		popup.setSize(dialogSize);
185
		popup.setSize(dialogSize);
177
		popup.setLocation(dialoglocation);
186
		popup.setLocation(dialoglocation);
178
187
179
		ScrolledComposite sc = new ScrolledComposite(popup, SWT.V_SCROLL | SWT.H_SCROLL);
188
		final Rectangle originalBounds = screenshotImage.getBounds();
180
		Canvas canvas = new Canvas(sc, SWT.NONE);
189
		final Image bufferedImage = new Image(display, originalBounds);
181
		sc.setContent(canvas);
190
		GC gc = new GC(bufferedImage);
182
		canvas.setBounds(display.getBounds());
191
		gc.setBackground(popup.getBackground());
183
		canvas.addPaintListener(new PaintListener() {
192
		gc.fillRectangle(originalBounds);
193
		gc.drawImage(screenshotImage, 0, 0);
194
		gc.dispose();
195
196
		Composite bc = new Composite(popup, SWT.NONE);
197
		bc.setLayout(new GridLayout(2, false));
198
199
		final Button saveButton = new Button(bc, SWT.PUSH);
200
		saveButton.setText("Save");
201
		saveButton.addSelectionListener(new SelectionListener() {
202
			public void widgetSelected(SelectionEvent e) {
203
				if (newImageBounds.x != -1 && newImageBounds.y != -1) {
204
					screenshotImage = new Image(display, newImageBounds);
205
					GC drawGc = new GC(screenshotImage);
206
					drawGc.drawImage(bufferedImage, newImageBounds.x, newImageBounds.y, newImageBounds.width,
207
							newImageBounds.height, 0, 0, newImageBounds.width, newImageBounds.height);
208
					drawGc.drawRectangle(0, 0, newImageBounds.width - 1, newImageBounds.height - 1);
209
					drawGc.dispose();
210
					canvas.setBounds(screenshotImage.getBounds());
211
					scrolledComposite.redraw();
212
					canvas.redraw();
213
					popup.close();
214
				}
215
			}
216
217
			public void widgetDefaultSelected(SelectionEvent e) {
218
				// ignore		
219
			}
220
		});
221
		saveButton.setEnabled(false);
222
223
		final Button cancelButton = new Button(bc, SWT.PUSH);
224
		cancelButton.setText("Cancel");
225
		cancelButton.addSelectionListener(new SelectionListener() {
226
			public void widgetSelected(SelectionEvent e) {
227
				popup.close();
228
			}
229
230
			public void widgetDefaultSelected(SelectionEvent e) {
231
				// ignore		
232
			}
233
		});
234
235
		final ScrolledComposite sc = new ScrolledComposite(popup, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
236
		sc.setLayoutData(GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).create());
237
		final Canvas scCanvas = new Canvas(sc, SWT.DOUBLE_BUFFERED | SWT.NONE);
238
		scCanvas.setBounds(originalBounds);
239
		scCanvas.addPaintListener(new PaintListener() {
184
			public void paintControl(PaintEvent e) {
240
			public void paintControl(PaintEvent e) {
185
				if (screenshotImage != null)
241
				if (screenshotImage != null)
186
					e.gc.drawImage(screenshotImage, 0, 0);
242
					e.gc.drawImage(bufferedImage, 0, 0);
187
			}
243
			}
188
		});
244
		});
245
		sc.setContent(scCanvas);
246
247
		final GC selectionGc = new GC(scCanvas);
248
249
		final MouseMoveListener mouseMoveListener = new MouseMoveListener() {
250
			public void mouseMove(MouseEvent e) {
251
				if (downPoint.x != -1 && downPoint.y != -1) {
252
					int width = e.x - downPoint.x;
253
					int height = e.y - downPoint.y;
254
					scCanvas.redraw();
255
					selectionGc.drawRectangle(downPoint.x, downPoint.y, width, height);
256
				}
257
			}
258
		};
259
260
		final MouseListener mouseListener = new MouseListener() {
261
			public void mouseUp(MouseEvent e) {
262
				if (downPoint.x != -1 && downPoint.y != -1) {
263
264
					int width;
265
					if (e.x > originalBounds.width) {
266
						width = originalBounds.width - downPoint.x;
267
					} else if (e.x < 0) {
268
						width = downPoint.x;
269
						downPoint.x = 0;
270
					} else {
271
						width = e.x - downPoint.x;
272
					}
273
274
					int height;
275
					if (e.y > originalBounds.height) {
276
						height = originalBounds.height - downPoint.y;
277
					} else if (e.y < 0) {
278
						height = downPoint.y;
279
						downPoint.y = 0;
280
					} else {
281
						height = e.y - downPoint.y;
282
					}
283
284
					display.getActiveShell().setCursor(new Cursor(null, SWT.CURSOR_ARROW));
285
286
					selectionGc.drawRectangle(downPoint.x, downPoint.y, width, height);
287
288
					newImageBounds.x = downPoint.x;
289
					newImageBounds.y = downPoint.y;
290
					newImageBounds.width = width;
291
					newImageBounds.height = height;
292
293
					sc.removeMouseMoveListener(mouseMoveListener);
294
					sc.removeMouseListener(this);
295
					downPoint.x = -1;
296
					downPoint.y = -1;
297
298
					saveButton.setEnabled(true);
299
				}
300
			}
301
302
			public void mouseDown(MouseEvent e) {
303
				if (downPoint.x == -1 && downPoint.y == -1) {
304
					display.getActiveShell().setCursor(new Cursor(null, SWT.CURSOR_CROSS));
305
					downPoint.x = e.x;
306
					downPoint.y = e.y;
307
					selectionGc.setLineStyle(SWT.LINE_DASH);
308
					scCanvas.addMouseMoveListener(mouseMoveListener);
309
				}
310
			}
311
312
			public void mouseDoubleClick(MouseEvent e) {
313
				// ignore
314
			}
315
		};
316
317
		scCanvas.addMouseListener(mouseListener);
318
189
		popup.open();
319
		popup.open();
320
190
	}
321
	}
191
322
192
	public Image getScreenshotImage() {
323
	public Image getScreenshotImage() {

Return to bug 160572