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.ddmuilib.ImageLoader; 20 import com.android.hierarchyviewerlib.device.ViewNode; 21 import com.android.hierarchyviewerlib.models.PixelPerfectModel; 22 import com.android.hierarchyviewerlib.models.PixelPerfectModel.IImageChangeListener; 23 24 import org.eclipse.jface.viewers.ILabelProvider; 25 import org.eclipse.jface.viewers.ILabelProviderListener; 26 import org.eclipse.jface.viewers.ITreeContentProvider; 27 import org.eclipse.jface.viewers.TreeSelection; 28 import org.eclipse.jface.viewers.TreeViewer; 29 import org.eclipse.jface.viewers.Viewer; 30 import org.eclipse.swt.SWT; 31 import org.eclipse.swt.events.DisposeEvent; 32 import org.eclipse.swt.events.DisposeListener; 33 import org.eclipse.swt.events.SelectionEvent; 34 import org.eclipse.swt.events.SelectionListener; 35 import org.eclipse.swt.graphics.Image; 36 import org.eclipse.swt.layout.FillLayout; 37 import org.eclipse.swt.widgets.Composite; 38 import org.eclipse.swt.widgets.Display; 39 import org.eclipse.swt.widgets.Tree; 40 41 import java.util.List; 42 43 public class PixelPerfectTree extends Composite implements IImageChangeListener, SelectionListener { 44 45 private TreeViewer mTreeViewer; 46 47 private Tree mTree; 48 49 private PixelPerfectModel mModel; 50 51 private Image mFolderImage; 52 53 private Image mFileImage; 54 55 private class ContentProvider implements ITreeContentProvider, ILabelProvider { 56 @Override 57 public Object[] getChildren(Object element) { 58 if (element instanceof ViewNode) { 59 List<ViewNode> children = ((ViewNode) element).children; 60 return children.toArray(new ViewNode[children.size()]); 61 } 62 return null; 63 } 64 65 @Override 66 public Object getParent(Object element) { 67 if (element instanceof ViewNode) { 68 return ((ViewNode) element).parent; 69 } 70 return null; 71 } 72 73 @Override 74 public boolean hasChildren(Object element) { 75 if (element instanceof ViewNode) { 76 return ((ViewNode) element).children.size() != 0; 77 } 78 return false; 79 } 80 81 @Override 82 public Object[] getElements(Object element) { 83 if (element instanceof PixelPerfectModel) { 84 ViewNode viewNode = ((PixelPerfectModel) element).getViewNode(); 85 if (viewNode == null) { 86 return new Object[0]; 87 } 88 return new Object[] { 89 viewNode 90 }; 91 } 92 return new Object[0]; 93 } 94 95 @Override 96 public void dispose() { 97 // pass 98 } 99 100 @Override 101 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 102 // pass 103 } 104 105 @Override 106 public Image getImage(Object element) { 107 if (element instanceof ViewNode) { 108 if (hasChildren(element)) { 109 return mFolderImage; 110 } 111 return mFileImage; 112 } 113 return null; 114 } 115 116 @Override 117 public String getText(Object element) { 118 if (element instanceof ViewNode) { 119 return ((ViewNode) element).name; 120 } 121 return null; 122 } 123 124 @Override 125 public void addListener(ILabelProviderListener listener) { 126 // pass 127 } 128 129 @Override 130 public boolean isLabelProperty(Object element, String property) { 131 // pass 132 return false; 133 } 134 135 @Override 136 public void removeListener(ILabelProviderListener listener) { 137 // pass 138 } 139 } 140 141 public PixelPerfectTree(Composite parent) { 142 super(parent, SWT.NONE); 143 setLayout(new FillLayout()); 144 mTreeViewer = new TreeViewer(this, SWT.SINGLE); 145 mTreeViewer.setAutoExpandLevel(TreeViewer.ALL_LEVELS); 146 147 mTree = mTreeViewer.getTree(); 148 mTree.addSelectionListener(this); 149 150 loadResources(); 151 152 addDisposeListener(mDisposeListener); 153 154 mModel = PixelPerfectModel.getModel(); 155 ContentProvider contentProvider = new ContentProvider(); 156 mTreeViewer.setContentProvider(contentProvider); 157 mTreeViewer.setLabelProvider(contentProvider); 158 mTreeViewer.setInput(mModel); 159 mModel.addImageChangeListener(this); 160 161 } 162 163 private void loadResources() { 164 ImageLoader loader = ImageLoader.getDdmUiLibLoader(); 165 mFileImage = loader.loadImage("file.png", Display.getDefault()); 166 mFolderImage = loader.loadImage("folder.png", Display.getDefault()); 167 } 168 169 private DisposeListener mDisposeListener = new DisposeListener() { 170 @Override 171 public void widgetDisposed(DisposeEvent e) { 172 mModel.removeImageChangeListener(PixelPerfectTree.this); 173 } 174 }; 175 176 @Override 177 public boolean setFocus() { 178 return mTree.setFocus(); 179 } 180 181 @Override 182 public void imageLoaded() { 183 Display.getDefault().syncExec(new Runnable() { 184 @Override 185 public void run() { 186 mTreeViewer.refresh(); 187 mTreeViewer.expandAll(); 188 } 189 }); 190 } 191 192 @Override 193 public void imageChanged() { 194 // pass 195 } 196 197 @Override 198 public void crosshairMoved() { 199 // pass 200 } 201 202 @Override 203 public void selectionChanged() { 204 // pass 205 } 206 207 @Override 208 public void treeChanged() { 209 imageLoaded(); 210 } 211 212 @Override 213 public void widgetDefaultSelected(SelectionEvent e) { 214 // pass 215 } 216 217 @Override 218 public void widgetSelected(SelectionEvent e) { 219 // To combat phantom selection... 220 if (((TreeSelection) mTreeViewer.getSelection()).isEmpty()) { 221 mModel.setSelected(null); 222 } else { 223 mModel.setSelected((ViewNode) e.item.getData()); 224 } 225 } 226 227 @Override 228 public void zoomChanged() { 229 // pass 230 } 231 232 @Override 233 public void overlayChanged() { 234 // pass 235 } 236 237 @Override 238 public void overlayTransparencyChanged() { 239 // pass 240 } 241 } 242