107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy/* 207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy * Copyright (C) 2012 The Android Open Source Project 307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy * 407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy * Licensed under the Apache License, Version 2.0 (the "License"); 507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy * you may not use this file except in compliance with the License. 607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy * You may obtain a copy of the License at 707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy * 807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy * http://www.apache.org/licenses/LICENSE-2.0 907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy * 1007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy * Unless required by applicable law or agreed to in writing, software 1107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy * distributed under the License is distributed on an "AS IS" BASIS, 1207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy * See the License for the specific language governing permissions and 1407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy * limitations under the License. 1507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy */ 1607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 1707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamypackage com.android.ide.eclipse.ddms.editors; 1807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 1907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport com.android.ide.eclipse.base.InstallDetails; 2007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport com.android.uiautomator.UiAutomatorHelper.UiAutomatorResult; 2107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport com.android.uiautomator.UiAutomatorModel; 2207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport com.android.uiautomator.UiAutomatorView; 2307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 2407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.core.filesystem.EFS; 2507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.core.filesystem.IFileStore; 2607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.core.runtime.IProgressMonitor; 2707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.core.runtime.Path; 2807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.jface.dialogs.MessageDialog; 2907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.swt.SWT; 3007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.swt.graphics.Image; 3107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.swt.layout.GridData; 3207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.swt.layout.GridLayout; 3307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.swt.widgets.Composite; 3407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.ui.IEditorInput; 3507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.ui.IEditorPart; 3607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.ui.IEditorSite; 3707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.ui.IURIEditorInput; 3807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.ui.IWorkbench; 3907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.ui.IWorkbenchPage; 4007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.ui.IWorkbenchWindow; 4107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.ui.PartInitException; 4207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.ui.PlatformUI; 4307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.ui.WorkbenchException; 4407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.ui.ide.IDE; 4507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport org.eclipse.ui.part.EditorPart; 4607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 4707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport java.io.File; 4807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamyimport java.util.concurrent.atomic.AtomicBoolean; 4907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 5007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamypublic class UiAutomatorViewer extends EditorPart { 5107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy private String mFilePath; 5207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy private UiAutomatorView mView; 5307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 5407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy @Override 5507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy public void doSave(IProgressMonitor arg0) { 5607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 5707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 5807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy @Override 5907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy public void doSaveAs() { 6007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 6107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 6207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy @Override 6307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy public boolean isSaveAsAllowed() { 6407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy return false; 6507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 6607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 6707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy @Override 6807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy public boolean isDirty() { 6907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy return false; 7007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 7107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 7207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy @Override 7307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy public void init(IEditorSite site, IEditorInput input) throws PartInitException { 7407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy // we use a IURIEditorInput to allow opening files not within the workspace 7507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy if (!(input instanceof IURIEditorInput)) { 7607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy throw new PartInitException("UI Automator Hierarchy View: unsupported input type."); 7707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 7807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 7907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy setSite(site); 8007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy setInput(input); 8107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy mFilePath = ((IURIEditorInput) input).getURI().getPath(); 8207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 8307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy // set the editor part name to be the name of the file. 8407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy File f = new File(mFilePath); 8507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy setPartName(f.getName()); 8607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 8707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 8807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy @Override 8907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy public void createPartControl(Composite parent) { 9007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy Composite c = new Composite(parent, SWT.NONE); 9107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy c.setLayout(new GridLayout(1, false)); 9207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy GridData gd = new GridData(GridData.FILL_BOTH); 9307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy c.setLayoutData(gd); 9407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 9507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy mView = new UiAutomatorView(c, SWT.BORDER); 9607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy mView.setLayoutData(new GridData(GridData.FILL_BOTH)); 9707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 9807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy if (mFilePath == null) { 9907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy return; 10007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 10107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 10207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy UiAutomatorModel model = null; 10307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy File modelFile = new File(mFilePath); 10407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy try { 10507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy model = new UiAutomatorModel(modelFile); 10607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } catch (Exception e) { 10707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy MessageDialog.openError(parent.getShell(), "Error opening " + mFilePath, 10807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy "Unexpected error while parsing input: " + e.getMessage()); 10907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy return; 11007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 11107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 11207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy mView.setModel(model, modelFile, null); 11307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 11407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 11507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy @Override 11607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy public void setFocus() { 11707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 11807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 11907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy public static boolean openEditor(final UiAutomatorResult r) { 12007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy final IFileStore fileStore = EFS.getLocalFileSystem().getStore( 12107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy new Path(r.uiHierarchy.getAbsolutePath())); 12207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy if (!fileStore.fetchInfo().exists()) { 12307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy return false; 12407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 12507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 12607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy final AtomicBoolean status = new AtomicBoolean(false); 12707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 12807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy final IWorkbench workbench = PlatformUI.getWorkbench(); 12907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy workbench.getDisplay().syncExec(new Runnable() { 13007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy @Override 13107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy public void run() { 13207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); 13307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy if (window == null) { 13407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy return; 13507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 13607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 13707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy IWorkbenchPage page = window.getActivePage(); 13807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy if (page == null) { 13907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy return; 14007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 14107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 14207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy // try to switch perspectives if possible 14307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy if (page.isEditorAreaVisible() == false && InstallDetails.isAdtInstalled()) { 14407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy try { 14507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy workbench.showPerspective("org.eclipse.jdt.ui.JavaPerspective", window); //$NON-NLS-1$ 14607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } catch (WorkbenchException e) { 14707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 14807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 14907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 15007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy IEditorPart editor = null; 15107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy try { 15207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy editor = IDE.openEditorOnFileStore(page, fileStore); 15307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } catch (PartInitException e) { 15407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy return; 15507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 15607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 15707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy if (!(editor instanceof UiAutomatorViewer)) { 15807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy return; 15907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 16007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 16107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy ((UiAutomatorViewer) editor).setModel(r.model, r.uiHierarchy, r.screenshot); 16207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy status.set(true); 16307750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 16407750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy }); 16507750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 16607750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy return status.get(); 16707750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 16807750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy 16907750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy protected void setModel(UiAutomatorModel model, File modelFile, Image screenshot) { 17007750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy mView.setModel(model, modelFile, screenshot); 17107750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy } 17207750e98d91da6a1a906c73e2a2b92e46aedf4cfSiva Velusamy} 173