1 /* 2 * Copyright (C) 2007 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.ddmuilib.explorer; 18 19 import com.android.ddmlib.FileListingService; 20 import com.android.ddmlib.FileListingService.FileEntry; 21 import com.android.ddmlib.FileListingService.IListingReceiver; 22 23 import org.eclipse.jface.viewers.ITreeContentProvider; 24 import org.eclipse.jface.viewers.TreeViewer; 25 import org.eclipse.jface.viewers.Viewer; 26 import org.eclipse.swt.widgets.Display; 27 import org.eclipse.swt.widgets.Tree; 28 29 /** 30 * Content provider class for device Explorer. 31 */ 32 class DeviceContentProvider implements ITreeContentProvider { 33 34 private TreeViewer mViewer; 35 private FileListingService mFileListingService; 36 private FileEntry mRootEntry; 37 38 private IListingReceiver sListingReceiver = new IListingReceiver() { 39 @Override 40 public void setChildren(final FileEntry entry, FileEntry[] children) { 41 final Tree t = mViewer.getTree(); 42 if (t != null && t.isDisposed() == false) { 43 Display display = t.getDisplay(); 44 if (display.isDisposed() == false) { 45 display.asyncExec(new Runnable() { 46 @Override 47 public void run() { 48 if (t.isDisposed() == false) { 49 // refresh the entry. 50 mViewer.refresh(entry); 51 52 // force it open, since on linux and windows 53 // when getChildren() returns null, the node is 54 // not considered expanded. 55 mViewer.setExpandedState(entry, true); 56 } 57 } 58 }); 59 } 60 } 61 } 62 63 @Override 64 public void refreshEntry(final FileEntry entry) { 65 final Tree t = mViewer.getTree(); 66 if (t != null && t.isDisposed() == false) { 67 Display display = t.getDisplay(); 68 if (display.isDisposed() == false) { 69 display.asyncExec(new Runnable() { 70 @Override 71 public void run() { 72 if (t.isDisposed() == false) { 73 // refresh the entry. 74 mViewer.refresh(entry); 75 } 76 } 77 }); 78 } 79 } 80 } 81 }; 82 83 /** 84 * 85 */ DeviceContentProvider()86 public DeviceContentProvider() { 87 } 88 setListingService(FileListingService fls)89 public void setListingService(FileListingService fls) { 90 mFileListingService = fls; 91 } 92 93 /* (non-Javadoc) 94 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) 95 */ 96 @Override getChildren(Object parentElement)97 public Object[] getChildren(Object parentElement) { 98 if (parentElement instanceof FileEntry) { 99 FileEntry parentEntry = (FileEntry)parentElement; 100 101 Object[] oldEntries = parentEntry.getCachedChildren(); 102 Object[] newEntries = mFileListingService.getChildren(parentEntry, 103 true, sListingReceiver); 104 105 if (newEntries != null) { 106 return newEntries; 107 } else { 108 // if null was returned, this means the cache was not valid, 109 // and a thread was launched for ls. sListingReceiver will be 110 // notified with the new entries. 111 return oldEntries; 112 } 113 } 114 return new Object[0]; 115 } 116 117 /* (non-Javadoc) 118 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) 119 */ 120 @Override getParent(Object element)121 public Object getParent(Object element) { 122 if (element instanceof FileEntry) { 123 FileEntry entry = (FileEntry)element; 124 125 return entry.getParent(); 126 } 127 return null; 128 } 129 130 /* (non-Javadoc) 131 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) 132 */ 133 @Override hasChildren(Object element)134 public boolean hasChildren(Object element) { 135 if (element instanceof FileEntry) { 136 FileEntry entry = (FileEntry)element; 137 138 return entry.getType() == FileListingService.TYPE_DIRECTORY; 139 } 140 return false; 141 } 142 143 /* (non-Javadoc) 144 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) 145 */ 146 @Override getElements(Object inputElement)147 public Object[] getElements(Object inputElement) { 148 if (inputElement instanceof FileEntry) { 149 FileEntry entry = (FileEntry)inputElement; 150 if (entry.isRoot()) { 151 return getChildren(mRootEntry); 152 } 153 } 154 155 return null; 156 } 157 158 /* (non-Javadoc) 159 * @see org.eclipse.jface.viewers.IContentProvider#dispose() 160 */ 161 @Override dispose()162 public void dispose() { 163 } 164 165 /* (non-Javadoc) 166 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) 167 */ 168 @Override inputChanged(Viewer viewer, Object oldInput, Object newInput)169 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 170 if (viewer instanceof TreeViewer) { 171 mViewer = (TreeViewer)viewer; 172 } 173 if (newInput instanceof FileEntry) { 174 mRootEntry = (FileEntry)newInput; 175 } 176 } 177 } 178