aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2011-01-14 09:49:12 -0800
committerTor Norbye <tnorbye@google.com>2011-01-14 11:54:41 -0800
commit106c1ead81b9d429f2f403b5bafe1b5569a228cb (patch)
tree776b0552f5e2aabf72b3e705912dc1d66f4f6990
parent787c87badd6f5e06ebd9aa58796e8a3f8285e500 (diff)
downloadsdk-106c1ead81b9d429f2f403b5bafe1b5569a228cb.zip
sdk-106c1ead81b9d429f2f403b5bafe1b5569a228cb.tar.gz
sdk-106c1ead81b9d429f2f403b5bafe1b5569a228cb.tar.bz2
Zoom Improvements
First, add a new "Zoom to Fit" toolbar action. This will look at the size of the rendered image, as well as the size of the canvas area, and compute the largest possible scale factor that will zoom the rendered image while showing everything. This is particularly useful when working with larger devices, such as WXGA, where typically the rendering comes up showing only the top left portion of the image, and the Zoom Out function often zooms out too much since it does not have fine granularity. Second, add icons to the various zooming functions. The zoom in/out icons are from Eclipse WTP; the other three are minor derivations from these icons (using = for emulate real size, 1 for 100% and an outline for zoom to fit). Third hook up zoom in, zoom out, zoom to 100% and zoom to fit to keyboard shortcuts (applicable to the canvas only). Finally, tweak some labels. (Also updated the ddms screencapture icon, since there was a screen capture icon in the same Eclipse WTP icon folder) Change-Id: Idc118a58f418daeefb5835f40dc1fd518b0f99d1
-rw-r--r--ddms/libs/ddmuilib/src/resources/images/capture.pngbin696 -> 691 bytes
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/icons/zoom100.pngbin0 -> 584 bytes
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomfit.pngbin0 -> 542 bytes
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomminus.pngbin0 -> 559 bytes
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomplus.pngbin0 -> 559 bytes
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomreal.pngbin0 -> 578 bytes
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationComposite.java4
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java74
-rwxr-xr-xeclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java33
9 files changed, 90 insertions, 21 deletions
diff --git a/ddms/libs/ddmuilib/src/resources/images/capture.png b/ddms/libs/ddmuilib/src/resources/images/capture.png
index d75e7a9..da5c10b 100644
--- a/ddms/libs/ddmuilib/src/resources/images/capture.png
+++ b/ddms/libs/ddmuilib/src/resources/images/capture.png
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoom100.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoom100.png
new file mode 100644
index 0000000..8f49f6d
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoom100.png
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomfit.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomfit.png
new file mode 100644
index 0000000..9c53ac8
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomfit.png
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomminus.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomminus.png
new file mode 100644
index 0000000..dd2c92f
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomminus.png
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomplus.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomplus.png
new file mode 100644
index 0000000..466d756
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomplus.png
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomreal.png b/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomreal.png
new file mode 100644
index 0000000..c787ed6
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/icons/zoomreal.png
Binary files differ
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationComposite.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationComposite.java
index 0e824f1..73c8d2a 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationComposite.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationComposite.java
@@ -455,6 +455,10 @@ public class ConfigurationComposite extends Composite {
});
}
+ public boolean isEnabled() {
+ return mButton != null && mButton.isEnabled();
+ }
+
public void setEnabled(boolean enabledState) {
if (mButton != null) {
mButton.setEnabled(enabledState);
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
index 4f3403e..e432a5a 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
@@ -237,7 +237,7 @@ public class GraphicalEditorPart extends EditorPart
private CustomButton mZoomOutButton;
private CustomButton mZoomResetButton;
private CustomButton mZoomInButton;
-
+ private CustomButton mZoomFitButton;
private CustomButton mClippingButton;
public GraphicalEditorPart(LayoutEditor layoutEditor) {
@@ -286,12 +286,13 @@ public class GraphicalEditorPart extends EditorPart
gl.marginHeight = gl.marginWidth = 0;
// create the top part for the configuration control
+ IconFactory iconFactory = IconFactory.getInstance();
CustomButton[][] customButtons = new CustomButton[][] {
new CustomButton[] {
mZoomRealSizeButton = new CustomButton(
- "*",
- null, //image
- "Emulate real size",
+ null, // label
+ iconFactory.getIcon("zoomreal"), //$NON-NLS-1$
+ "Emulate Real Size",
true /*isToggle*/,
false /*defaultValue*/
) {
@@ -301,35 +302,49 @@ public class GraphicalEditorPart extends EditorPart
mZoomOutButton.setEnabled(!newState);
mZoomResetButton.setEnabled(!newState);
mZoomInButton.setEnabled(!newState);
+ mZoomFitButton.setEnabled(!newState);
} else {
mZoomRealSizeButton.setSelection(!newState);
}
}
},
- mZoomOutButton = new CustomButton(
- "-",
- null, //image
- "Canvas zoom out."
+ mZoomFitButton = new CustomButton(
+ null, // label
+ iconFactory.getIcon("zoomfit"), //$NON-NLS-1$
+ "Zoom to Fit (0)"
) {
@Override
public void onSelected(boolean newState) {
- rescale(-1);
+ rescaleToFit();
}
},
mZoomResetButton = new CustomButton(
- "100%",
- null, //image
- "Reset Canvas to 100%"
+ null, // label
+ iconFactory.getIcon("zoom100"), //$NON-NLS-1$
+ "Reset Zoom to 100% (1)"
) {
@Override
public void onSelected(boolean newState) {
resetScale();
}
+ }
+ },
+ // Group zoom in/out separately
+ new CustomButton[] {
+ mZoomOutButton = new CustomButton(
+ null, // label
+ iconFactory.getIcon("zoomminus"), //$NON-NLS-1$
+ "Zoom Out (-)"
+ ) {
+ @Override
+ public void onSelected(boolean newState) {
+ rescale(-1);
+ }
},
mZoomInButton = new CustomButton(
- "+",
- null, //image
- "Canvas zoom in."
+ null, // label
+ iconFactory.getIcon("zoomplus"), //$NON-NLS-1$
+ "Zoom In (+)"
) {
@Override
public void onSelected(boolean newState) {
@@ -340,8 +355,8 @@ public class GraphicalEditorPart extends EditorPart
new CustomButton[] {
new CustomButton(
null, //text
- IconFactory.getInstance().getIcon("explode"), //$NON-NLS-1$
- "Displays extra margins in the layout.",
+ iconFactory.getIcon("explode"), //$NON-NLS-1$
+ "Displays extra margins in the layout",
true /*toggle*/,
false /*defaultValue*/
) {
@@ -353,8 +368,8 @@ public class GraphicalEditorPart extends EditorPart
},
new CustomButton(
null, //text
- IconFactory.getInstance().getIcon("outline"), //$NON-NLS-1$
- "Shows the outline of all views in the layout.",
+ iconFactory.getIcon("outline"), //$NON-NLS-1$
+ "Shows the outline of all views in the layout",
true /*toggle*/,
false /*defaultValue*/
) {
@@ -365,7 +380,7 @@ public class GraphicalEditorPart extends EditorPart
},
mClippingButton = new CustomButton(
null, //text
- IconFactory.getInstance().getIcon("clipping"), //$NON-NLS-1$
+ iconFactory.getIcon("clipping"), //$NON-NLS-1$
"Toggles screen clipping on/off",
true /*toggle*/,
true /*defaultValue*/
@@ -437,6 +452,16 @@ public class GraphicalEditorPart extends EditorPart
}
/**
+ * Returns true if zooming in/out/to-fit/etc is allowed (which is not the case while
+ * emulating real size)
+ *
+ * @return true if zooming is allowed
+ */
+ boolean isZoomingAllowed() {
+ return mZoomInButton.isEnabled();
+ }
+
+ /**
* Listens to workbench selections that does NOT come from {@link LayoutEditor}
* (those are generated by ourselves).
* <p/>
@@ -466,7 +491,7 @@ public class GraphicalEditorPart extends EditorPart
* Rescales canvas.
* @param direction +1 for zoom in, -1 for zoom out
*/
- private void rescale(int direction) {
+ void rescale(int direction) {
double s = mCanvasViewer.getCanvas().getScale();
if (direction > 0) {
@@ -497,6 +522,13 @@ public class GraphicalEditorPart extends EditorPart
mCanvasViewer.getCanvas().setScale(1, true /*redraw*/);
}
+ /**
+ * Reset the canvas scale to best fit (so content is as large as possible without scrollbars)
+ */
+ private void rescaleToFit() {
+ mCanvasViewer.getCanvas().setFitScale();
+ }
+
private boolean rescaleToReal(boolean real) {
if (real) {
return computeAndSetRealScale(true /*redraw*/);
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java
index a97aedd..dc42b1b 100755
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java
@@ -70,6 +70,7 @@ import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
@@ -266,6 +267,19 @@ public class LayoutCanvas extends Canvas {
// handle backspace for other platforms as well.
if (e.keyCode == SWT.BS) {
mDeleteAction.run();
+ } else {
+ // Zooming actions
+ char c = e.character;
+ GraphicalEditorPart editor = mLayoutEditor.getGraphicalEditor();
+ if (c == '1' && editor.isZoomingAllowed()) {
+ setScale(1, true);
+ } else if (c == '0' && editor.isZoomingAllowed()) {
+ setFitScale();
+ } else if (c == '+' && editor.isZoomingAllowed()) {
+ editor.rescale(1);
+ } else if (c == '-' && editor.isZoomingAllowed()) {
+ editor.rescale(-1);
+ }
}
}
@@ -536,6 +550,25 @@ public class LayoutCanvas extends Canvas {
}
}
+ /** Scales the canvas to best fit */
+ void setFitScale() {
+ Rectangle canvasSize = getClientArea();
+ int canvasWidth = canvasSize.width - 2 * ICanvasTransform.IMAGE_MARGIN;
+ int canvasHeight = canvasSize.height - 2 * ICanvasTransform.IMAGE_MARGIN;
+
+ Image image = getImageOverlay().getImage();
+ if (image != null) {
+ ImageData imageData = image.getImageData();
+ int sceneWidth = imageData.width;
+ int sceneHeight = imageData.height;
+ double hScale = canvasWidth / (double) sceneWidth;
+ double vScale = canvasHeight / (double) sceneHeight;
+
+ double scale = Math.min(hScale, vScale);
+ setScale(scale, true);
+ }
+ }
+
/**
* Transforms a point, expressed in layout coordinates, into "client" coordinates
* relative to the control (and not relative to the display).