• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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