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