aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/StatusPanel.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/StatusPanel.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/StatusPanel.java357
1 files changed, 357 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/StatusPanel.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/StatusPanel.java
new file mode 100644
index 000000000..6ad258ee2
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/draw9patch/ui/StatusPanel.java
@@ -0,0 +1,357 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.ide.eclipse.adt.internal.editors.draw9patch.ui;
+
+import com.android.ide.eclipse.adt.AdtPlugin;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Scale;
+
+/**
+ * Status and control pane.
+ */
+public class StatusPanel extends Composite implements KeyListener {
+
+ public static final int SCALE_MIN = 2;
+ public static final int SCALE_MAX = 6;
+
+ public static final int ZOOM_MIN = 100;
+ public static final int ZOOM_MAX = 800;
+
+ public static final int PADDING_TOP = 12;
+ public static final int PADDING_RIGHT = 0;
+ public static final int PADDING_BOTTOM = 5;
+ public static final int PADDING_LEFT = 10;
+
+ public static final int MIN_WIDTH = 800;
+
+ private Button mShowLock = null;
+ private Button mShowPatches = null;
+ private Button mShowBadPatches = null;
+ private Button mShowContent = null;
+
+ private Label mHelpLabel = null;
+
+ private Label mXPosLabel = null;
+ private Label mYPosLabel = null;
+
+ private ZoomControl mZoomControl = null;
+ private ZoomControl mScaleControl = null;
+
+ private StatusChangedListener mListener = null;
+
+ public void setStatusChangedListener(StatusChangedListener l) {
+ mListener = l;
+ }
+
+ public void setHelpText(String text) {
+ Point size = getSize();
+ // check window width
+ if (MIN_WIDTH < size.x) {
+ mHelpLabel.setText(text);
+ mHelpLabel.setVisible(true);
+ } else {
+ mHelpLabel.setText("N/A");
+ mHelpLabel.setVisible(false);
+ }
+ }
+
+ /**
+ * Set mouse cursor position.
+ */
+ public void setPosition(int x, int y) {
+ mXPosLabel.setText(String.format("X: %4d px", x));
+ mYPosLabel.setText(String.format("Y: %4d px", y));
+ }
+
+ public StatusPanel(Composite parent, int style) {
+ super(parent, style);
+ setLayout(new FormLayout());
+
+ final Composite container = new Composite(this, SWT.NULL);
+ container.setLayout(new FormLayout());
+
+ FormData innerForm = new FormData();
+ innerForm.left = new FormAttachment(0, PADDING_LEFT);
+ innerForm.top = new FormAttachment(0, PADDING_TOP);
+ innerForm.right = new FormAttachment(100, PADDING_RIGHT);
+ innerForm.bottom = new FormAttachment(100, -PADDING_BOTTOM);
+ container.setLayoutData(innerForm);
+
+ buildPosition(container);
+
+ Composite zoomPanels = new Composite(container, SWT.NULL);
+ zoomPanels.setLayout(new GridLayout(3, false));
+
+ buildZoomControl(zoomPanels);
+ buildScaleControl(zoomPanels);
+
+ Composite checkPanel = new Composite(container, SWT.NULL);
+ checkPanel.setLayout(new GridLayout(2, false));
+ FormData checkPanelForm = new FormData();
+ checkPanelForm.left = new FormAttachment(zoomPanels, 0);
+ checkPanelForm.bottom = new FormAttachment(100, -PADDING_BOTTOM);
+ checkPanel.setLayoutData(checkPanelForm);
+
+ buildCheckboxes(checkPanel);
+
+ mHelpLabel = new Label(container, SWT.BORDER_SOLID | SWT.BOLD | SWT.WRAP);
+ mHelpLabel.setBackground(new Color(AdtPlugin.getDisplay(), 0xFF, 0xFF, 0xFF));
+ FormData hintForm = new FormData();
+ hintForm.left = new FormAttachment(checkPanel, 5);
+ hintForm.right = new FormAttachment(mXPosLabel, -10);
+ hintForm.top = new FormAttachment(PADDING_TOP);
+ hintForm.bottom = new FormAttachment(100, -PADDING_BOTTOM);
+ mHelpLabel.setLayoutData(hintForm);
+
+ /*
+ * If the window width is not much, the "help label" will break the window.
+ * Because that is wrapped automatically.
+ *
+ * This listener catch resized events and reset help text.
+ *
+ * setHelpText method checks window width.
+ * If window is too narrow, help text will be set invisible.
+ */
+ container.addControlListener(new ControlListener() {
+ @Override
+ public void controlResized(ControlEvent event) {
+ // reset text
+ setHelpText(ImageViewer.HELP_MESSAGE_KEY_TIPS);
+ }
+ @Override
+ public void controlMoved(ControlEvent event) {
+ }
+ });
+
+ }
+
+ private void buildPosition(Composite parent) {
+ mXPosLabel = new Label(parent, SWT.NULL);
+ mYPosLabel = new Label(parent, SWT.NULL);
+
+ mXPosLabel.setText(String.format("X: %4d px", 1000));
+ mYPosLabel.setText(String.format("Y: %4d px", 1000));
+
+ FormData bottomRight = new FormData();
+ bottomRight.bottom = new FormAttachment(100, 0);
+ bottomRight.right = new FormAttachment(100, 0);
+ mYPosLabel.setLayoutData(bottomRight);
+
+ FormData aboveYPosLabel = new FormData();
+ aboveYPosLabel.bottom = new FormAttachment(mYPosLabel);
+ aboveYPosLabel.right = new FormAttachment(100, 0);
+ mXPosLabel.setLayoutData(aboveYPosLabel);
+ }
+
+ private void buildScaleControl(Composite parent) {
+ mScaleControl = new ZoomControl(parent);
+ mScaleControl.maxLabel.setText("6x");
+ mScaleControl.minLabel.setText("2x");
+ mScaleControl.scale.setMinimum(SCALE_MIN);
+ mScaleControl.scale.setMaximum(SCALE_MAX);
+ mScaleControl.scale.setSelection(2);
+ mScaleControl.scale.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ super.widgetSelected(event);
+ if (mListener != null) {
+ Scale scale = (Scale) event.widget;
+ mListener.scaleChanged(scale.getSelection());
+ }
+ }
+ });
+ }
+
+ private void buildZoomControl(Composite parent) {
+ mZoomControl = new ZoomControl(parent);
+ mZoomControl.maxLabel.setText("800%");
+ mZoomControl.minLabel.setText("100%");
+ mZoomControl.scale.setMinimum(ZOOM_MIN);
+ mZoomControl.scale.setMaximum(ZOOM_MAX - ZOOM_MIN);
+ mZoomControl.scale.setSelection(400);
+ mZoomControl.scale.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ super.widgetSelected(event);
+ if (mListener != null) {
+ Scale scale = (Scale) event.widget;
+ mListener.zoomChanged(scale.getSelection() + ZOOM_MIN);
+ }
+ }
+ });
+
+ }
+
+ private void buildCheckboxes(Composite parent) {
+ // check lock
+ mShowLock = new Button(parent, SWT.CHECK);
+ mShowLock.setText("show Lock");
+ mShowLock.setSelection(true);
+ mShowLock.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ super.widgetSelected(event);
+ if (mListener != null) {
+ mListener.lockVisibilityChanged(mShowLock.getSelection());
+ }
+ }
+ });
+
+ // check patches
+ mShowPatches = new Button(parent, SWT.CHECK);
+ mShowPatches.setText("show Patches");
+ mShowPatches.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ super.widgetSelected(event);
+ if (mListener != null) {
+ mListener.patchesVisibilityChanged(mShowPatches.getSelection());
+ }
+ }
+ });
+
+ // check patches
+ mShowBadPatches = new Button(parent, SWT.CHECK);
+ mShowBadPatches.setText("show Bad patches");
+ mShowBadPatches.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ super.widgetSelected(event);
+ if (mListener != null) {
+ mListener.badPatchesVisibilityChanged(mShowBadPatches.getSelection());
+ }
+ }
+ });
+
+ // check contents(padding)
+ mShowContent = new Button(parent, SWT.CHECK);
+ mShowContent.setText("show Contents");
+ mShowContent.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ super.widgetSelected(event);
+ if (mListener != null) {
+ mListener.contentAreaVisibilityChanged(mShowContent.getSelection());
+ }
+ }
+ });
+ }
+
+ @Override
+ public void keyPressed(KeyEvent event) {
+ switch (event.character) {
+ case 'c':
+ mShowContent.setSelection(!mShowContent.getSelection());
+ if (mListener != null) {
+ mListener.contentAreaVisibilityChanged(mShowContent.getSelection());
+ }
+ break;
+ case 'l':
+ mShowLock.setSelection(!mShowLock.getSelection());
+ if (mListener != null) {
+ mListener.lockVisibilityChanged(mShowLock.getSelection());
+ }
+ break;
+ case 'p':
+ mShowPatches.setSelection(!mShowPatches.getSelection());
+ if (mListener != null) {
+ mListener.patchesVisibilityChanged(mShowPatches.getSelection());
+ }
+ break;
+ case 'b':
+ mShowBadPatches.setSelection(!mShowBadPatches.getSelection());
+ if (mListener != null) {
+ mListener.badPatchesVisibilityChanged(mShowBadPatches.getSelection());
+ }
+ break;
+ }
+ }
+
+ @Override
+ public void keyReleased(KeyEvent event) {
+ }
+
+ private static class ZoomControl {
+
+ private Label minLabel;
+ private Label maxLabel;
+ Scale scale;
+
+ public ZoomControl(Composite composite) {
+ minLabel = new Label(composite, SWT.RIGHT);
+ scale = new Scale(composite, SWT.HORIZONTAL);
+ maxLabel = new Label(composite, SWT.LEFT);
+ }
+ }
+
+ /**
+ * Status changed events listener.
+ */
+ public interface StatusChangedListener {
+ /**
+ * Zoom level has been changed.
+ * @param zoom
+ */
+ public void zoomChanged(int zoom);
+
+ /**
+ * Scale has been changed.
+ * @param scale
+ */
+ public void scaleChanged(int scale);
+
+ /**
+ * Lock visibility has been changed.
+ * @param visible
+ */
+ public void lockVisibilityChanged(boolean visible);
+
+ /**
+ * Patches visibility has been changed.
+ * @param visible
+ */
+ public void patchesVisibilityChanged(boolean visible);
+
+ /**
+ * BadPatches visibility has been changed.
+ * @param visible
+ */
+ public void badPatchesVisibilityChanged(boolean visible);
+
+ /**
+ * Content visibility has been changed.
+ * @param visible
+ */
+ public void contentAreaVisibilityChanged(boolean visible);
+ }
+}