/* * Copyright (C) 2010 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.hierarchyviewerlib.ui; import com.android.ddmuilib.ImageLoader; import com.android.hierarchyviewerlib.device.ViewNode; import com.android.hierarchyviewerlib.models.PixelPerfectModel; import com.android.hierarchyviewerlib.models.PixelPerfectModel.IImageChangeListener; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Tree; import java.util.List; public class PixelPerfectTree extends Composite implements IImageChangeListener, SelectionListener { private TreeViewer mTreeViewer; private Tree mTree; private PixelPerfectModel mModel; private Image mFolderImage; private Image mFileImage; private class ContentProvider implements ITreeContentProvider, ILabelProvider { public Object[] getChildren(Object element) { if (element instanceof ViewNode) { List<ViewNode> children = ((ViewNode) element).children; return children.toArray(new ViewNode[children.size()]); } return null; } public Object getParent(Object element) { if (element instanceof ViewNode) { return ((ViewNode) element).parent; } return null; } public boolean hasChildren(Object element) { if (element instanceof ViewNode) { return ((ViewNode) element).children.size() != 0; } return false; } public Object[] getElements(Object element) { if (element instanceof PixelPerfectModel) { ViewNode viewNode = ((PixelPerfectModel) element).getViewNode(); if (viewNode == null) { return new Object[0]; } return new Object[] { viewNode }; } return new Object[0]; } public void dispose() { // pass } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // pass } public Image getImage(Object element) { if (element instanceof ViewNode) { if (hasChildren(element)) { return mFolderImage; } return mFileImage; } return null; } public String getText(Object element) { if (element instanceof ViewNode) { return ((ViewNode) element).name; } return null; } public void addListener(ILabelProviderListener listener) { // pass } public boolean isLabelProperty(Object element, String property) { // pass return false; } public void removeListener(ILabelProviderListener listener) { // pass } } public PixelPerfectTree(Composite parent) { super(parent, SWT.NONE); setLayout(new FillLayout()); mTreeViewer = new TreeViewer(this, SWT.SINGLE); mTreeViewer.setAutoExpandLevel(TreeViewer.ALL_LEVELS); mTree = mTreeViewer.getTree(); mTree.addSelectionListener(this); loadResources(); addDisposeListener(mDisposeListener); mModel = PixelPerfectModel.getModel(); ContentProvider contentProvider = new ContentProvider(); mTreeViewer.setContentProvider(contentProvider); mTreeViewer.setLabelProvider(contentProvider); mTreeViewer.setInput(mModel); mModel.addImageChangeListener(this); } private void loadResources() { ImageLoader loader = ImageLoader.getDdmUiLibLoader(); mFileImage = loader.loadImage("file.png", Display.getDefault()); mFolderImage = loader.loadImage("folder.png", Display.getDefault()); } private DisposeListener mDisposeListener = new DisposeListener() { public void widgetDisposed(DisposeEvent e) { mModel.removeImageChangeListener(PixelPerfectTree.this); } }; @Override public boolean setFocus() { return mTree.setFocus(); } public void imageLoaded() { Display.getDefault().syncExec(new Runnable() { public void run() { mTreeViewer.refresh(); mTreeViewer.expandAll(); } }); } public void imageChanged() { // pass } public void crosshairMoved() { // pass } public void selectionChanged() { // pass } public void treeChanged() { imageLoaded(); } public void widgetDefaultSelected(SelectionEvent e) { // pass } public void widgetSelected(SelectionEvent e) { // To combat phantom selection... if (((TreeSelection) mTreeViewer.getSelection()).isEmpty()) { mModel.setSelected(null); } else { mModel.setSelected((ViewNode) e.item.getData()); } } public void zoomChanged() { // pass } public void overlayChanged() { // pass } public void overlayTransparencyChanged() { // pass } }