1 /*
2  * Copyright (C) 2012 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.ide.eclipse.ddms.editors;
18 
19 import com.android.ide.eclipse.base.InstallDetails;
20 import com.android.uiautomator.UiAutomatorHelper.UiAutomatorResult;
21 import com.android.uiautomator.UiAutomatorModel;
22 import com.android.uiautomator.UiAutomatorView;
23 
24 import org.eclipse.core.filesystem.EFS;
25 import org.eclipse.core.filesystem.IFileStore;
26 import org.eclipse.core.runtime.IProgressMonitor;
27 import org.eclipse.core.runtime.Path;
28 import org.eclipse.jface.dialogs.MessageDialog;
29 import org.eclipse.swt.SWT;
30 import org.eclipse.swt.graphics.Image;
31 import org.eclipse.swt.layout.GridData;
32 import org.eclipse.swt.layout.GridLayout;
33 import org.eclipse.swt.widgets.Composite;
34 import org.eclipse.ui.IEditorInput;
35 import org.eclipse.ui.IEditorPart;
36 import org.eclipse.ui.IEditorSite;
37 import org.eclipse.ui.IURIEditorInput;
38 import org.eclipse.ui.IWorkbench;
39 import org.eclipse.ui.IWorkbenchPage;
40 import org.eclipse.ui.IWorkbenchWindow;
41 import org.eclipse.ui.PartInitException;
42 import org.eclipse.ui.PlatformUI;
43 import org.eclipse.ui.WorkbenchException;
44 import org.eclipse.ui.ide.IDE;
45 import org.eclipse.ui.part.EditorPart;
46 
47 import java.io.File;
48 import java.util.concurrent.atomic.AtomicBoolean;
49 
50 public class UiAutomatorViewer extends EditorPart {
51     private String mFilePath;
52     private UiAutomatorView mView;
53 
54     @Override
doSave(IProgressMonitor arg0)55     public void doSave(IProgressMonitor arg0) {
56     }
57 
58     @Override
doSaveAs()59     public void doSaveAs() {
60     }
61 
62     @Override
isSaveAsAllowed()63     public boolean isSaveAsAllowed() {
64         return false;
65     }
66 
67     @Override
isDirty()68     public boolean isDirty() {
69         return false;
70     }
71 
72     @Override
init(IEditorSite site, IEditorInput input)73     public void init(IEditorSite site, IEditorInput input) throws PartInitException {
74         // we use a IURIEditorInput to allow opening files not within the workspace
75         if (!(input instanceof IURIEditorInput)) {
76             throw new PartInitException("UI Automator Hierarchy View: unsupported input type.");
77         }
78 
79         setSite(site);
80         setInput(input);
81         mFilePath = ((IURIEditorInput) input).getURI().getPath();
82 
83         // set the editor part name to be the name of the file.
84         File f = new File(mFilePath);
85         setPartName(f.getName());
86     }
87 
88     @Override
createPartControl(Composite parent)89     public void createPartControl(Composite parent) {
90         Composite c = new Composite(parent, SWT.NONE);
91         c.setLayout(new GridLayout(1, false));
92         GridData gd = new GridData(GridData.FILL_BOTH);
93         c.setLayoutData(gd);
94 
95         mView = new UiAutomatorView(c, SWT.BORDER);
96         mView.setLayoutData(new GridData(GridData.FILL_BOTH));
97 
98         if (mFilePath == null) {
99             return;
100         }
101 
102         UiAutomatorModel model = null;
103         File modelFile = new File(mFilePath);
104         try {
105             model = new UiAutomatorModel(modelFile);
106         } catch (Exception e) {
107             MessageDialog.openError(parent.getShell(), "Error opening " + mFilePath,
108                     "Unexpected error while parsing input: " + e.getMessage());
109             return;
110         }
111 
112         mView.setModel(model, modelFile, null);
113     }
114 
115     @Override
setFocus()116     public void setFocus() {
117     }
118 
openEditor(final UiAutomatorResult r)119     public static boolean openEditor(final UiAutomatorResult r) {
120         final IFileStore fileStore =  EFS.getLocalFileSystem().getStore(
121                 new Path(r.uiHierarchy.getAbsolutePath()));
122         if (!fileStore.fetchInfo().exists()) {
123             return false;
124         }
125 
126         final AtomicBoolean status = new AtomicBoolean(false);
127 
128         final IWorkbench workbench = PlatformUI.getWorkbench();
129         workbench.getDisplay().syncExec(new Runnable() {
130             @Override
131             public void run() {
132                 IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
133                 if (window == null) {
134                     return;
135                 }
136 
137                 IWorkbenchPage page = window.getActivePage();
138                 if (page == null) {
139                     return;
140                 }
141 
142                 // try to switch perspectives if possible
143                 if (page.isEditorAreaVisible() == false && InstallDetails.isAdtInstalled()) {
144                     try {
145                         workbench.showPerspective("org.eclipse.jdt.ui.JavaPerspective", window); //$NON-NLS-1$
146                     } catch (WorkbenchException e) {
147                     }
148                 }
149 
150                 IEditorPart editor = null;
151                 try {
152                     editor = IDE.openEditorOnFileStore(page, fileStore);
153                 } catch (PartInitException e) {
154                     return;
155                 }
156 
157                 if (!(editor instanceof UiAutomatorViewer)) {
158                     return;
159                 }
160 
161                 ((UiAutomatorViewer) editor).setModel(r.model, r.uiHierarchy, r.screenshot);
162                 status.set(true);
163             }
164         });
165 
166         return status.get();
167     }
168 
setModel(UiAutomatorModel model, File modelFile, Image screenshot)169     protected void setModel(UiAutomatorModel model, File modelFile, Image screenshot) {
170         mView.setModel(model, modelFile, screenshot);
171     }
172 }
173