| /* |
| * Copyright (C) 2007 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.ddmuilib.explorer; |
| |
| import com.android.ddmlib.FileListingService; |
| import com.android.ddmlib.FileListingService.FileEntry; |
| import com.android.ddmlib.FileListingService.IListingReceiver; |
| |
| import org.eclipse.jface.viewers.ITreeContentProvider; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Tree; |
| |
| /** |
| * Content provider class for device Explorer. |
| */ |
| class DeviceContentProvider implements ITreeContentProvider { |
| |
| private TreeViewer mViewer; |
| private FileListingService mFileListingService; |
| private FileEntry mRootEntry; |
| |
| private IListingReceiver sListingReceiver = new IListingReceiver() { |
| public void setChildren(final FileEntry entry, FileEntry[] children) { |
| final Tree t = mViewer.getTree(); |
| if (t != null && t.isDisposed() == false) { |
| Display display = t.getDisplay(); |
| if (display.isDisposed() == false) { |
| display.asyncExec(new Runnable() { |
| public void run() { |
| if (t.isDisposed() == false) { |
| // refresh the entry. |
| mViewer.refresh(entry); |
| |
| // force it open, since on linux and windows |
| // when getChildren() returns null, the node is |
| // not considered expanded. |
| mViewer.setExpandedState(entry, true); |
| } |
| } |
| }); |
| } |
| } |
| } |
| |
| public void refreshEntry(final FileEntry entry) { |
| final Tree t = mViewer.getTree(); |
| if (t != null && t.isDisposed() == false) { |
| Display display = t.getDisplay(); |
| if (display.isDisposed() == false) { |
| display.asyncExec(new Runnable() { |
| public void run() { |
| if (t.isDisposed() == false) { |
| // refresh the entry. |
| mViewer.refresh(entry); |
| } |
| } |
| }); |
| } |
| } |
| } |
| }; |
| |
| /** |
| * |
| */ |
| public DeviceContentProvider() { |
| } |
| |
| public void setListingService(FileListingService fls) { |
| mFileListingService = fls; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) |
| */ |
| public Object[] getChildren(Object parentElement) { |
| if (parentElement instanceof FileEntry) { |
| FileEntry parentEntry = (FileEntry)parentElement; |
| |
| Object[] oldEntries = parentEntry.getCachedChildren(); |
| Object[] newEntries = mFileListingService.getChildren(parentEntry, |
| true, sListingReceiver); |
| |
| if (newEntries != null) { |
| return newEntries; |
| } else { |
| // if null was returned, this means the cache was not valid, |
| // and a thread was launched for ls. sListingReceiver will be |
| // notified with the new entries. |
| return oldEntries; |
| } |
| } |
| return new Object[0]; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) |
| */ |
| public Object getParent(Object element) { |
| if (element instanceof FileEntry) { |
| FileEntry entry = (FileEntry)element; |
| |
| return entry.getParent(); |
| } |
| return null; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) |
| */ |
| public boolean hasChildren(Object element) { |
| if (element instanceof FileEntry) { |
| FileEntry entry = (FileEntry)element; |
| |
| return entry.getType() == FileListingService.TYPE_DIRECTORY; |
| } |
| return false; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) |
| */ |
| public Object[] getElements(Object inputElement) { |
| if (inputElement instanceof FileEntry) { |
| FileEntry entry = (FileEntry)inputElement; |
| if (entry.isRoot()) { |
| return getChildren(mRootEntry); |
| } |
| } |
| |
| return null; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.viewers.IContentProvider#dispose() |
| */ |
| public void dispose() { |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) |
| */ |
| public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { |
| if (viewer instanceof TreeViewer) { |
| mViewer = (TreeViewer)viewer; |
| } |
| if (newInput instanceof FileEntry) { |
| mRootEntry = (FileEntry)newInput; |
| } |
| } |
| } |