| /* |
| * 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); |
| } |
| } |