1
package org.helioviewer.jhv.gui.controller;
4
import java.awt.Cursor;
5
import java.awt.Rectangle;
6
import java.awt.event.MouseEvent;
8
import org.helioviewer.base.math.Vector2dDouble;
9
import org.helioviewer.base.math.Vector2dInt;
10
import org.helioviewer.jhv.gui.ImageViewerGui;
11
import org.helioviewer.jhv.gui.components.TopToolBar.SelectionMode;
12
import org.helioviewer.viewmodel.changeevent.ChangeEvent;
13
import org.helioviewer.viewmodel.metadata.MetaData;
14
import org.helioviewer.viewmodel.region.Region;
15
import org.helioviewer.viewmodel.region.StaticRegion;
16
import org.helioviewer.viewmodel.renderer.screen.ScreenRenderGraphics;
17
import org.helioviewer.viewmodel.renderer.screen.ScreenRenderer;
18
import org.helioviewer.viewmodel.view.ComponentView;
19
import org.helioviewer.viewmodel.view.View;
20
import org.helioviewer.viewmodel.view.ViewHelper;
21
import org.helioviewer.viewmodel.viewport.Viewport;
22
import org.helioviewer.viewmodel.viewportimagesize.ViewportImageSize;
25
* Implementation of ImagePanelInputController for the main image panel using
26
* zoom box selection mode.
29
* By using this controller, the user can zoom in the region of interest of the
30
* main image panel by selecting the desired area with a rubber band. Zooming is
31
* also possible by using the mouse wheel or double-clicking into the image.
32
* After selecting an area, the selection mode switches back to pan selection
36
* Also, see {@link org.helioviewer.jhv.gui.components.MainImagePanel} and
37
* {@link MainImagePanelMousePanController}.
40
public class MainImagePanelMouseZoomBoxController extends MainImagePanelMouseController {
42
private volatile Vector2dInt lastMouseCoordinates;
43
private volatile Vector2dInt draggedToCoordinates;
44
private volatile Rectangle rectangle = new Rectangle();
46
private volatile Rubberband rubberband = new Rubberband();
51
public void setView(View newView) {
52
super.setView(newView);
55
newView.getAdapter(ComponentView.class).addPostRenderer(rubberband);
61
public void mouseEntered(MouseEvent e) {
62
if (imagePanel != null) {
63
imagePanel.setCursor(Cursor.getDefaultCursor());
70
public void mouseExited(MouseEvent e) {
71
if (imagePanel != null) {
72
imagePanel.setCursor(Cursor.getDefaultCursor());
80
public void mousePressed(MouseEvent e) {
81
if (e.getButton() == MouseEvent.BUTTON1) {
82
lastMouseCoordinates = new Vector2dInt(e.getX(), e.getY());
83
rectangle.x = e.getX();
84
rectangle.y = e.getY();
93
public void mouseReleased(MouseEvent e) {
94
if (e.getButton() == MouseEvent.BUTTON1) {
95
draggedToCoordinates = new Vector2dInt(e.getX(), e.getY());
97
Region r = regionView.getRegion();
98
Viewport v = viewportView.getViewport();
99
MetaData m = metaDataView.getMetaData();
100
if (r == null || v == null || m == null) {
104
recalculateRectangle();
106
if (rectangle.height <= 2 && rectangle.width <= 2)
109
ViewportImageSize vis = ViewHelper.calculateViewportImageSize(v, r);
111
Vector2dDouble imageOffset = ViewHelper.convertScreenToImageDisplacement(new Vector2dInt(rectangle.x, rectangle.y + rectangle.height).subtract(new Vector2dInt(0, v.getHeight())), r, vis);
112
Vector2dDouble newCorner = Vector2dDouble.add(r.getLowerLeftCorner(), imageOffset);
114
Vector2dDouble size = ViewHelper.convertScreenToImageDisplacement(new Vector2dInt(rectangle.width, rectangle.height * -1), r, vis);
116
Region region = StaticRegion.createAdaptedRegion(newCorner, size);
117
Region regionShifted = ViewHelper.cropRegionToImage(region, m);
118
regionView.setRegion(regionShifted, new ChangeEvent());
120
lastMouseCoordinates = null;
122
ImageViewerGui.getSingletonInstance().getTopToolBar().setActiveSelectionMode(SelectionMode.PAN);
123
ImageViewerGui.getSingletonInstance().getMainImagePanel().getInputController().mouseEntered(e);
130
public void mouseDragged(MouseEvent e) {
131
if (lastMouseCoordinates != null) {
132
draggedToCoordinates = new Vector2dInt(e.getX(), e.getY());
134
recalculateRectangle();
135
imagePanel.repaint();
140
* Get method that calculates and returns the rectangle of the rubber band.
143
private void recalculateRectangle() {
145
if (lastMouseCoordinates.getX() < draggedToCoordinates.getX()) {
146
rectangle.x = lastMouseCoordinates.getX();
147
rectangle.width = draggedToCoordinates.getX() - lastMouseCoordinates.getX();
149
rectangle.x = draggedToCoordinates.getX();
150
rectangle.width = lastMouseCoordinates.getX() - draggedToCoordinates.getX();
153
if (lastMouseCoordinates.getY() < draggedToCoordinates.getY()) {
154
rectangle.y = lastMouseCoordinates.getY();
155
rectangle.height = draggedToCoordinates.getY() - lastMouseCoordinates.getY();
157
rectangle.y = draggedToCoordinates.getY();
158
rectangle.height = lastMouseCoordinates.getY() - draggedToCoordinates.getY();
163
* Private class implementing ScreenRenderer to draw the rubber band onto
167
* For further informations about drawing into the image, see
168
* {@link org.helioviewer.viewmodel.renderer.screen.ScreenRenderer}.
170
private class Rubberband implements ScreenRenderer {
175
public void render(ScreenRenderGraphics g) {
176
if (lastMouseCoordinates != null) {
177
g.setColor(Color.YELLOW);
178
g.drawRectangle(rectangle.x, rectangle.y, rectangle.width, rectangle.height);