| /* |
| * 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); |
| } |
| } |