1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.hierarchyviewerlib.ui; 18 19 import com.android.hierarchyviewerlib.HierarchyViewerDirector; 20 import com.android.hierarchyviewerlib.models.PixelPerfectModel; 21 import com.android.hierarchyviewerlib.models.PixelPerfectModel.IImageChangeListener; 22 23 import org.eclipse.swt.SWT; 24 import org.eclipse.swt.events.DisposeEvent; 25 import org.eclipse.swt.events.DisposeListener; 26 import org.eclipse.swt.events.SelectionEvent; 27 import org.eclipse.swt.events.SelectionListener; 28 import org.eclipse.swt.graphics.Image; 29 import org.eclipse.swt.layout.FormAttachment; 30 import org.eclipse.swt.layout.FormData; 31 import org.eclipse.swt.layout.FormLayout; 32 import org.eclipse.swt.widgets.Composite; 33 import org.eclipse.swt.widgets.Display; 34 import org.eclipse.swt.widgets.Label; 35 import org.eclipse.swt.widgets.Slider; 36 37 public class PixelPerfectControls extends Composite implements IImageChangeListener { 38 39 private Slider mOverlaySlider; 40 41 private Slider mZoomSlider; 42 43 private Slider mAutoRefreshSlider; 44 45 public PixelPerfectControls(Composite parent) { 46 super(parent, SWT.NONE); 47 setLayout(new FormLayout()); 48 49 Label overlayTransparencyRight = new Label(this, SWT.NONE); 50 overlayTransparencyRight.setText("100%"); 51 FormData overlayTransparencyRightData = new FormData(); 52 overlayTransparencyRightData.right = new FormAttachment(100, -2); 53 overlayTransparencyRightData.top = new FormAttachment(0, 2); 54 overlayTransparencyRight.setLayoutData(overlayTransparencyRightData); 55 56 Label refreshRight = new Label(this, SWT.NONE); 57 refreshRight.setText("40s"); 58 FormData refreshRightData = new FormData(); 59 refreshRightData.right = new FormAttachment(100, -2); 60 refreshRightData.top = new FormAttachment(overlayTransparencyRight, 2); 61 refreshRightData.left = new FormAttachment(overlayTransparencyRight, 0, SWT.LEFT); 62 refreshRight.setLayoutData(refreshRightData); 63 64 Label zoomRight = new Label(this, SWT.NONE); 65 zoomRight.setText("24x"); 66 FormData zoomRightData = new FormData(); 67 zoomRightData.right = new FormAttachment(100, -2); 68 zoomRightData.top = new FormAttachment(refreshRight, 2); 69 zoomRightData.left = new FormAttachment(overlayTransparencyRight, 0, SWT.LEFT); 70 zoomRight.setLayoutData(zoomRightData); 71 72 Label overlayTransparency = new Label(this, SWT.NONE); 73 Label refresh = new Label(this, SWT.NONE); 74 75 overlayTransparency.setText("Overlay:"); 76 FormData overlayTransparencyData = new FormData(); 77 overlayTransparencyData.left = new FormAttachment(0, 2); 78 overlayTransparencyData.top = new FormAttachment(0, 2); 79 overlayTransparencyData.right = new FormAttachment(refresh, 0, SWT.RIGHT); 80 overlayTransparency.setLayoutData(overlayTransparencyData); 81 82 refresh.setText("Refresh Rate:"); 83 FormData refreshData = new FormData(); 84 refreshData.top = new FormAttachment(overlayTransparency, 2); 85 refreshData.left = new FormAttachment(0, 2); 86 refresh.setLayoutData(refreshData); 87 88 Label zoom = new Label(this, SWT.NONE); 89 zoom.setText("Zoom:"); 90 FormData zoomData = new FormData(); 91 zoomData.right = new FormAttachment(refresh, 0, SWT.RIGHT); 92 zoomData.top = new FormAttachment(refresh, 2); 93 zoomData.left = new FormAttachment(0, 2); 94 zoom.setLayoutData(zoomData); 95 96 Label overlayTransparencyLeft = new Label(this, SWT.RIGHT); 97 overlayTransparencyLeft.setText("0%"); 98 FormData overlayTransparencyLeftData = new FormData(); 99 overlayTransparencyLeftData.top = new FormAttachment(0, 2); 100 overlayTransparencyLeftData.left = new FormAttachment(overlayTransparency, 2); 101 overlayTransparencyLeft.setLayoutData(overlayTransparencyLeftData); 102 103 Label refreshLeft = new Label(this, SWT.RIGHT); 104 refreshLeft.setText("1s"); 105 FormData refreshLeftData = new FormData(); 106 refreshLeftData.top = new FormAttachment(overlayTransparencyLeft, 2); 107 refreshLeftData.left = new FormAttachment(refresh, 2); 108 refreshLeft.setLayoutData(refreshLeftData); 109 110 Label zoomLeft = new Label(this, SWT.RIGHT); 111 zoomLeft.setText("2x"); 112 FormData zoomLeftData = new FormData(); 113 zoomLeftData.top = new FormAttachment(refreshLeft, 2); 114 zoomLeftData.left = new FormAttachment(zoom, 2); 115 zoomLeft.setLayoutData(zoomLeftData); 116 117 mOverlaySlider = new Slider(this, SWT.HORIZONTAL); 118 mOverlaySlider.setMinimum(0); 119 mOverlaySlider.setMaximum(101); 120 mOverlaySlider.setThumb(1); 121 mOverlaySlider.setSelection((int) Math.round(PixelPerfectModel.getModel() 122 .getOverlayTransparency() * 100)); 123 124 Image overlayImage = PixelPerfectModel.getModel().getOverlayImage(); 125 mOverlaySlider.setEnabled(overlayImage != null); 126 FormData overlaySliderData = new FormData(); 127 overlaySliderData.right = new FormAttachment(overlayTransparencyRight, -4); 128 overlaySliderData.top = new FormAttachment(0, 2); 129 overlaySliderData.left = new FormAttachment(overlayTransparencyLeft, 4); 130 mOverlaySlider.setLayoutData(overlaySliderData); 131 132 mOverlaySlider.addSelectionListener(overlaySliderSelectionListener); 133 134 mAutoRefreshSlider = new Slider(this, SWT.HORIZONTAL); 135 mAutoRefreshSlider.setMinimum(1); 136 mAutoRefreshSlider.setMaximum(41); 137 mAutoRefreshSlider.setThumb(1); 138 mAutoRefreshSlider.setSelection(HierarchyViewerDirector.getDirector() 139 .getPixelPerfectAutoRefreshInverval()); 140 FormData refreshSliderData = new FormData(); 141 refreshSliderData.right = new FormAttachment(overlayTransparencyRight, -4); 142 refreshSliderData.top = new FormAttachment(overlayTransparencyRight, 2); 143 refreshSliderData.left = new FormAttachment(mOverlaySlider, 0, SWT.LEFT); 144 mAutoRefreshSlider.setLayoutData(refreshSliderData); 145 146 mAutoRefreshSlider.addSelectionListener(mRefreshSliderSelectionListener); 147 148 mZoomSlider = new Slider(this, SWT.HORIZONTAL); 149 mZoomSlider.setMinimum(2); 150 mZoomSlider.setMaximum(25); 151 mZoomSlider.setThumb(1); 152 mZoomSlider.setSelection(PixelPerfectModel.getModel().getZoom()); 153 FormData zoomSliderData = new FormData(); 154 zoomSliderData.right = new FormAttachment(overlayTransparencyRight, -4); 155 zoomSliderData.top = new FormAttachment(refreshRight, 2); 156 zoomSliderData.left = new FormAttachment(mOverlaySlider, 0, SWT.LEFT); 157 mZoomSlider.setLayoutData(zoomSliderData); 158 159 mZoomSlider.addSelectionListener(mZoomSliderSelectionListener); 160 161 addDisposeListener(mDisposeListener); 162 163 PixelPerfectModel.getModel().addImageChangeListener(this); 164 } 165 166 private DisposeListener mDisposeListener = new DisposeListener() { 167 @Override 168 public void widgetDisposed(DisposeEvent e) { 169 PixelPerfectModel.getModel().removeImageChangeListener(PixelPerfectControls.this); 170 } 171 }; 172 173 private SelectionListener overlaySliderSelectionListener = new SelectionListener() { 174 private int oldValue; 175 176 @Override 177 public void widgetDefaultSelected(SelectionEvent e) { 178 // pass 179 } 180 181 @Override 182 public void widgetSelected(SelectionEvent e) { 183 int newValue = mOverlaySlider.getSelection(); 184 if (oldValue != newValue) { 185 PixelPerfectModel.getModel().removeImageChangeListener(PixelPerfectControls.this); 186 PixelPerfectModel.getModel().setOverlayTransparency(newValue / 100.0); 187 PixelPerfectModel.getModel().addImageChangeListener(PixelPerfectControls.this); 188 oldValue = newValue; 189 } 190 } 191 }; 192 193 private SelectionListener mRefreshSliderSelectionListener = new SelectionListener() { 194 private int oldValue; 195 196 @Override 197 public void widgetDefaultSelected(final SelectionEvent e) { 198 // pass 199 } 200 201 @Override 202 public void widgetSelected(SelectionEvent e) { 203 int newValue = mAutoRefreshSlider.getSelection(); 204 if (oldValue != newValue) { 205 HierarchyViewerDirector.getDirector().setPixelPerfectAutoRefreshInterval(newValue); 206 } 207 } 208 }; 209 210 private SelectionListener mZoomSliderSelectionListener = new SelectionListener() { 211 private int oldValue; 212 213 @Override 214 public void widgetDefaultSelected(SelectionEvent e) { 215 // pass 216 } 217 218 @Override 219 public void widgetSelected(SelectionEvent e) { 220 int newValue = mZoomSlider.getSelection(); 221 if (oldValue != newValue) { 222 PixelPerfectModel.getModel().removeImageChangeListener(PixelPerfectControls.this); 223 PixelPerfectModel.getModel().setZoom(newValue); 224 PixelPerfectModel.getModel().addImageChangeListener(PixelPerfectControls.this); 225 oldValue = newValue; 226 } 227 } 228 }; 229 230 @Override 231 public void crosshairMoved() { 232 // pass 233 } 234 235 @Override 236 public void treeChanged() { 237 // pass 238 } 239 240 @Override 241 public void imageChanged() { 242 // pass 243 } 244 245 @Override 246 public void imageLoaded() { 247 Display.getDefault().syncExec(new Runnable() { 248 @Override 249 public void run() { 250 Image overlayImage = PixelPerfectModel.getModel().getOverlayImage(); 251 mOverlaySlider.setEnabled(overlayImage != null); 252 if (PixelPerfectModel.getModel().getImage() == null) { 253 } else { 254 mZoomSlider.setSelection(PixelPerfectModel.getModel().getZoom()); 255 } 256 } 257 }); 258 } 259 260 @Override 261 public void overlayChanged() { 262 Display.getDefault().syncExec(new Runnable() { 263 @Override 264 public void run() { 265 Image overlayImage = PixelPerfectModel.getModel().getOverlayImage(); 266 mOverlaySlider.setEnabled(overlayImage != null); 267 } 268 }); 269 } 270 271 @Override 272 public void overlayTransparencyChanged() { 273 Display.getDefault().syncExec(new Runnable() { 274 @Override 275 public void run() { 276 mOverlaySlider.setSelection((int) (PixelPerfectModel.getModel() 277 .getOverlayTransparency() * 100)); 278 } 279 }); 280 } 281 282 @Override 283 public void selectionChanged() { 284 // pass 285 } 286 287 @Override 288 public void zoomChanged() { 289 Display.getDefault().syncExec(new Runnable() { 290 @Override 291 public void run() { 292 mZoomSlider.setSelection(PixelPerfectModel.getModel().getZoom()); 293 } 294 }); 295 } 296 } 297