diff options
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.java | 357 |
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); + } +} |