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 crosshairMoved()117 public void crosshairMoved() { 118 // pass 119 } 120 treeChanged()121 public void treeChanged() { 122 // pass 123 } 124 imageChanged()125 public void imageChanged() { 126 // pass 127 } 128 imageLoaded()129 public void imageLoaded() { 130 Display.getDefault().syncExec(new Runnable() { 131 public void run() { 132 Image overlayImage = PixelPerfectModel.getModel().getOverlayImage(); 133 mShowInLoupeAction.setEnabled(overlayImage != null); 134 } 135 }); 136 } 137 overlayChanged()138 public void overlayChanged() { 139 Display.getDefault().syncExec(new Runnable() { 140 public void run() { 141 mShowInLoupeAction 142 .setEnabled(PixelPerfectModel.getModel().getOverlayImage() != null); 143 } 144 }); 145 } 146 overlayTransparencyChanged()147 public void overlayTransparencyChanged() { 148 // pass 149 } 150 selectionChanged()151 public void selectionChanged() { 152 // pass 153 } 154 zoomChanged()155 public void zoomChanged() { 156 // pass 157 } 158 159 } 160