diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/editors/UiAutomatorViewer.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/editors/UiAutomatorViewer.java | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/editors/UiAutomatorViewer.java b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/editors/UiAutomatorViewer.java new file mode 100644 index 000000000..0843018aa --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/editors/UiAutomatorViewer.java @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2012 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.ide.eclipse.ddms.editors; + +import com.android.ide.eclipse.base.InstallDetails; +import com.android.uiautomator.UiAutomatorHelper.UiAutomatorResult; +import com.android.uiautomator.UiAutomatorModel; +import com.android.uiautomator.UiAutomatorView; + +import org.eclipse.core.filesystem.EFS; +import org.eclipse.core.filesystem.IFileStore; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Path; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IEditorSite; +import org.eclipse.ui.IURIEditorInput; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.WorkbenchException; +import org.eclipse.ui.ide.IDE; +import org.eclipse.ui.part.EditorPart; + +import java.io.File; +import java.util.concurrent.atomic.AtomicBoolean; + +public class UiAutomatorViewer extends EditorPart { + private String mFilePath; + private UiAutomatorView mView; + + @Override + public void doSave(IProgressMonitor arg0) { + } + + @Override + public void doSaveAs() { + } + + @Override + public boolean isSaveAsAllowed() { + return false; + } + + @Override + public boolean isDirty() { + return false; + } + + @Override + public void init(IEditorSite site, IEditorInput input) throws PartInitException { + // we use a IURIEditorInput to allow opening files not within the workspace + if (!(input instanceof IURIEditorInput)) { + throw new PartInitException("UI Automator Hierarchy View: unsupported input type."); + } + + setSite(site); + setInput(input); + mFilePath = ((IURIEditorInput) input).getURI().getPath(); + + // set the editor part name to be the name of the file. + File f = new File(mFilePath); + setPartName(f.getName()); + } + + @Override + public void createPartControl(Composite parent) { + Composite c = new Composite(parent, SWT.NONE); + c.setLayout(new GridLayout(1, false)); + GridData gd = new GridData(GridData.FILL_BOTH); + c.setLayoutData(gd); + + mView = new UiAutomatorView(c, SWT.BORDER); + mView.setLayoutData(new GridData(GridData.FILL_BOTH)); + + if (mFilePath == null) { + return; + } + + UiAutomatorModel model = null; + File modelFile = new File(mFilePath); + try { + model = new UiAutomatorModel(modelFile); + } catch (Exception e) { + MessageDialog.openError(parent.getShell(), "Error opening " + mFilePath, + "Unexpected error while parsing input: " + e.getMessage()); + return; + } + + mView.setModel(model, modelFile, null); + } + + @Override + public void setFocus() { + } + + public static boolean openEditor(final UiAutomatorResult r) { + final IFileStore fileStore = EFS.getLocalFileSystem().getStore( + new Path(r.uiHierarchy.getAbsolutePath())); + if (!fileStore.fetchInfo().exists()) { + return false; + } + + final AtomicBoolean status = new AtomicBoolean(false); + + final IWorkbench workbench = PlatformUI.getWorkbench(); + workbench.getDisplay().syncExec(new Runnable() { + @Override + public void run() { + IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); + if (window == null) { + return; + } + + IWorkbenchPage page = window.getActivePage(); + if (page == null) { + return; + } + + // try to switch perspectives if possible + if (page.isEditorAreaVisible() == false && InstallDetails.isAdtInstalled()) { + try { + workbench.showPerspective("org.eclipse.jdt.ui.JavaPerspective", window); //$NON-NLS-1$ + } catch (WorkbenchException e) { + } + } + + IEditorPart editor = null; + try { + editor = IDE.openEditorOnFileStore(page, fileStore); + } catch (PartInitException e) { + return; + } + + if (!(editor instanceof UiAutomatorViewer)) { + return; + } + + ((UiAutomatorViewer) editor).setModel(r.model, r.uiHierarchy, r.screenshot); + status.set(true); + } + }); + + return status.get(); + } + + protected void setModel(UiAutomatorModel model, File modelFile, Image screenshot) { + mView.setModel(model, modelFile, screenshot); + } +} |