Added
Link Here
|
1 |
/* |
2 |
* The contents of this file are subject to the terms of the Common Development |
3 |
* and Distribution License (the License). You may not use this file except in |
4 |
* compliance with the License. |
5 |
* |
6 |
* You can obtain a copy of the License at http://www.netbeans.org/cddl.html |
7 |
* or http://www.netbeans.org/cddl.txt. |
8 |
* |
9 |
* When distributing Covered Code, include this CDDL Header Notice in each file |
10 |
* and include the License file at http://www.netbeans.org/cddl.txt. |
11 |
* If applicable, add the following below the CDDL Header, with the fields |
12 |
* enclosed by brackets [] replaced by your own identifying information: |
13 |
* "Portions Copyrighted [year] [name of copyright owner]" |
14 |
* |
15 |
* The Original Software is NetBeans. The Initial Developer of the Original |
16 |
* Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun |
17 |
* Microsystems, Inc. All Rights Reserved. |
18 |
*/ |
19 |
package org.netbeans.modules.visual.action; |
20 |
|
21 |
import org.netbeans.api.visual.action.WidgetAction; |
22 |
import org.netbeans.api.visual.widget.Scene; |
23 |
import org.netbeans.api.visual.widget.Widget; |
24 |
|
25 |
import javax.swing.*; |
26 |
import java.awt.*; |
27 |
|
28 |
/** |
29 |
* @author David Kaspar |
30 |
*/ |
31 |
public final class MouseCenteredZoomAction extends WidgetAction.Adapter { |
32 |
|
33 |
private double zoomMultiplier; |
34 |
|
35 |
public MouseCenteredZoomAction (double zoomMultiplier) { |
36 |
this.zoomMultiplier = zoomMultiplier; |
37 |
} |
38 |
|
39 |
public State mouseWheelMoved (Widget widget, WidgetMouseWheelEvent event) { |
40 |
Scene scene = widget.getScene (); |
41 |
int amount = event.getWheelRotation (); |
42 |
|
43 |
double scale = 1.0; |
44 |
while (amount > 0) { |
45 |
scale /= zoomMultiplier; |
46 |
amount --; |
47 |
} |
48 |
while (amount < 0) { |
49 |
scale *= zoomMultiplier; |
50 |
amount ++; |
51 |
} |
52 |
|
53 |
JComponent view = scene.getView (); |
54 |
if (view != null) { |
55 |
Rectangle viewBounds = view.getVisibleRect (); |
56 |
|
57 |
Point center = widget.convertLocalToScene (event.getPoint ()); |
58 |
Point mouseLocation = scene.convertSceneToView (center); |
59 |
|
60 |
scene.setZoomFactor (scale * scene.getZoomFactor ()); |
61 |
scene.validate (); // HINT - forcing to change preferred size of the JComponent view |
62 |
|
63 |
center = scene.convertSceneToView (center); |
64 |
|
65 |
view.scrollRectToVisible (new Rectangle ( |
66 |
center.x - (mouseLocation.x - viewBounds.x), |
67 |
center.y - (mouseLocation.y - viewBounds.y), |
68 |
viewBounds.width, |
69 |
viewBounds.height |
70 |
)); |
71 |
} else |
72 |
scene.setZoomFactor (scale * scene.getZoomFactor ()); |
73 |
|
74 |
return State.CONSUMED; |
75 |
} |
76 |
|
77 |
} |