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.ide.eclipse.hierarchyviewer.views; 18 19 import com.android.ddmuilib.ImageLoader; 20 import com.android.hierarchyviewerlib.HierarchyViewerDirector; 21 import com.android.hierarchyviewerlib.actions.PixelPerfectAutoRefreshAction; 22 import com.android.hierarchyviewerlib.models.PixelPerfectModel; 23 import com.android.hierarchyviewerlib.models.PixelPerfectModel.IImageChangeListener; 24 import com.android.hierarchyviewerlib.ui.PixelPerfectControls; 25 import com.android.hierarchyviewerlib.ui.PixelPerfectLoupe; 26 import com.android.hierarchyviewerlib.ui.PixelPerfectPixelPanel; 27 28 import org.eclipse.jface.action.Action; 29 import org.eclipse.jface.action.IMenuManager; 30 import org.eclipse.jface.action.IToolBarManager; 31 import org.eclipse.jface.resource.ImageDescriptor; 32 import org.eclipse.swt.SWT; 33 import org.eclipse.swt.graphics.Image; 34 import org.eclipse.swt.layout.GridData; 35 import org.eclipse.swt.layout.GridLayout; 36 import org.eclipse.swt.widgets.Composite; 37 import org.eclipse.swt.widgets.Display; 38 import org.eclipse.ui.IActionBars; 39 import org.eclipse.ui.part.ViewPart; 40 41 public class PixelPerfectLoupeView extends ViewPart implements IImageChangeListener { 42 43 public static final String ID = 44 "com.android.ide.eclipse.hierarchyviewer.views.PixelPerfectLoupeView"; //$NON-NLS-1$ 45 46 private PixelPerfectLoupe mPixelPerfectLoupe; 47 48 private Action mShowInLoupeAction = new Action("&Show Overlay", Action.AS_CHECK_BOX) { 49 @Override 50 public void run() { 51 mPixelPerfectLoupe.setShowOverlay(isChecked()); 52 } 53 }; 54 @Override createPartControl(Composite parent)55 public void createPartControl(Composite parent) { 56 mShowInLoupeAction.setAccelerator(SWT.MOD1 + 'S'); 57 ImageLoader imageLoader = ImageLoader.getLoader(HierarchyViewerDirector.class); 58 Image image = imageLoader.loadImage("show-overlay.png", Display.getDefault()); //$NON-NLS-1$ 59 mShowInLoupeAction.setImageDescriptor(ImageDescriptor.createFromImage(image)); 60 mShowInLoupeAction.setToolTipText("Show the overlay in the loupe view"); 61 mShowInLoupeAction.setEnabled(PixelPerfectModel.getModel().getOverlayImage() != null); 62 PixelPerfectModel.getModel().addImageChangeListener(this); 63 64 GridLayout loupeLayout = new GridLayout(); 65 loupeLayout.marginWidth = loupeLayout.marginHeight = 0; 66 loupeLayout.horizontalSpacing = loupeLayout.verticalSpacing = 0; 67 parent.setLayout(loupeLayout); 68 69 Composite pixelPerfectLoupeBorder = new Composite(parent, SWT.BORDER); 70 pixelPerfectLoupeBorder.setLayoutData(new GridData(GridData.FILL_BOTH)); 71 GridLayout pixelPerfectLoupeBorderGridLayout = new GridLayout(); 72 pixelPerfectLoupeBorderGridLayout.marginWidth = 73 pixelPerfectLoupeBorderGridLayout.marginHeight = 0; 74 pixelPerfectLoupeBorderGridLayout.horizontalSpacing = 75 pixelPerfectLoupeBorderGridLayout.verticalSpacing = 0; 76 pixelPerfectLoupeBorder.setLayout(pixelPerfectLoupeBorderGridLayout); 77 78 mPixelPerfectLoupe = new PixelPerfectLoupe(pixelPerfectLoupeBorder); 79 mPixelPerfectLoupe.setLayoutData(new GridData(GridData.FILL_BOTH)); 80 81 PixelPerfectPixelPanel pixelPerfectPixelPanel = 82 new PixelPerfectPixelPanel(pixelPerfectLoupeBorder); 83 pixelPerfectPixelPanel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); 84 85 PixelPerfectControls pixelPerfectControls = 86 new PixelPerfectControls(parent); 87 pixelPerfectControls.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); 88 89 placeActions(); 90 } 91 placeActions()92 private void placeActions() { 93 IActionBars actionBars = getViewSite().getActionBars(); 94 95 IMenuManager mm = actionBars.getMenuManager(); 96 mm.removeAll(); 97 mm.add(PixelPerfectAutoRefreshAction.getAction()); 98 mm.add(mShowInLoupeAction); 99 100 IToolBarManager tm = actionBars.getToolBarManager(); 101 tm.removeAll(); 102 tm.add(PixelPerfectAutoRefreshAction.getAction()); 103 tm.add(mShowInLoupeAction); 104 } 105 106 @Override dispose()107 public void dispose() { 108 super.dispose(); 109 PixelPerfectModel.getModel().removeImageChangeListener(this); 110 } 111 112 @Override setFocus()113 public void setFocus() { 114 mPixelPerfectLoupe.setFocus(); 115 } 116 117 @Override crosshairMoved()118 public void crosshairMoved() { 119 // pass 120 } 121 122 @Override treeChanged()123 public void treeChanged() { 124 // pass 125 } 126 127 @Override imageChanged()128 public void imageChanged() { 129 // pass 130 } 131 132 @Override imageLoaded()133 public void imageLoaded() { 134 Display.getDefault().syncExec(new Runnable() { 135 @Override 136 public void run() { 137 Image overlayImage = PixelPerfectModel.getModel().getOverlayImage(); 138 mShowInLoupeAction.setEnabled(overlayImage != null); 139 } 140 }); 141 } 142 143 @Override overlayChanged()144 public void overlayChanged() { 145 Display.getDefault().syncExec(new Runnable() { 146 @Override 147 public void run() { 148 mShowInLoupeAction 149 .setEnabled(PixelPerfectModel.getModel().getOverlayImage() != null); 150 } 151 }); 152 } 153 154 @Override overlayTransparencyChanged()155 public void overlayTransparencyChanged() { 156 // pass 157 } 158 159 @Override selectionChanged()160 public void selectionChanged() { 161 // pass 162 } 163 164 @Override zoomChanged()165 public void zoomChanged() { 166 // pass 167 } 168 169 } 170