com.android.ide.eclipse.gltrace.GLTraceCollectorDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.android.ide.eclipse.gltrace.GLTraceCollectorDialog.java

Source

/*
 * Copyright (C) 2011 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.gltrace;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Shell;

import java.io.IOException;
import java.text.DecimalFormat;

/** Dialog displayed while the trace is being streamed from device to host. */
public class GLTraceCollectorDialog extends TitleAreaDialog {
    private static final String TITLE = "OpenGL ES Trace";
    private static final String DEFAULT_MESSAGE = "Trace collection in progress.";
    private static final DecimalFormat SIZE_FORMATTER = new DecimalFormat("#.##"); //$NON-NLS-1$

    private TraceOptions mTraceOptions;
    private final TraceFileWriter mTraceFileWriter;
    private final TraceCommandWriter mTraceCommandWriter;

    private Label mFramesCollectedLabel;
    private Label mTraceFileSizeLabel;
    private StatusRefreshTask mRefreshTask;

    protected GLTraceCollectorDialog(Shell parentShell, TraceFileWriter traceFileWriter,
            TraceCommandWriter traceCommandWriter, TraceOptions traceOptions) {
        super(parentShell);
        mTraceFileWriter = traceFileWriter;
        mTraceCommandWriter = traceCommandWriter;
        mTraceOptions = traceOptions;
    }

    @Override
    protected Control createButtonBar(Composite parent) {
        Composite c = new Composite(parent, SWT.NONE);
        c.setLayout(new GridLayout(0, false));
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalAlignment = GridData.CENTER;
        c.setLayoutData(gd);

        createButton(c, IDialogConstants.OK_ID, "Stop Tracing", true);
        return c;
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        parent.setLayout(new GridLayout());

        setTitle(TITLE);
        setMessage(DEFAULT_MESSAGE);

        Group controlGroup = new Group(parent, SWT.BORDER);
        controlGroup.setLayout(new GridLayout(2, false));
        controlGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        controlGroup.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
        controlGroup.setText("Trace Options");

        createLabel(controlGroup, "Collect Framebuffer contents on eglSwapBuffers()");
        final Button eglSwapCheckBox = createButton(controlGroup, mTraceOptions.collectFbOnEglSwap);

        createLabel(controlGroup, "Collect Framebuffer contents on glDraw*()");
        final Button glDrawCheckBox = createButton(controlGroup, mTraceOptions.collectFbOnGlDraw);

        createLabel(controlGroup, "Collect texture data for glTexImage*()");
        final Button glTexImageCheckBox = createButton(controlGroup, mTraceOptions.collectTextureData);

        SelectionListener l = new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent event) {
                boolean eglSwap = eglSwapCheckBox.getSelection();
                boolean glDraw = glDrawCheckBox.getSelection();
                boolean glTexImage = glTexImageCheckBox.getSelection();

                try {
                    mTraceCommandWriter.setTraceOptions(eglSwap, glDraw, glTexImage);
                } catch (IOException e) {
                    eglSwapCheckBox.setEnabled(false);
                    glDrawCheckBox.setEnabled(false);
                    glTexImageCheckBox.setEnabled(false);

                    MessageDialog.openError(Display.getDefault().getActiveShell(), "OpenGL ES Trace",
                            "Error while setting trace options: " + e.getMessage());
                }

                // update the text on the button
                if (!(event.getSource() instanceof Button)) {
                    return;
                }
                Button sourceButton = (Button) event.getSource();
                sourceButton.setText(getToggleActionText(sourceButton.getSelection()));
                sourceButton.pack();
            }
        };

        eglSwapCheckBox.addSelectionListener(l);
        glDrawCheckBox.addSelectionListener(l);
        glTexImageCheckBox.addSelectionListener(l);

        Group statusGroup = new Group(parent, SWT.NONE);
        statusGroup.setLayout(new GridLayout(2, false));
        statusGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        statusGroup.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
        statusGroup.setText("Trace Status");

        createLabel(statusGroup, "Frames Collected:");
        mFramesCollectedLabel = createLabel(statusGroup, "");

        createLabel(statusGroup, "Trace File Size:");
        mTraceFileSizeLabel = createLabel(statusGroup, "");

        ProgressBar pb = new ProgressBar(statusGroup, SWT.INDETERMINATE);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 2;
        pb.setLayoutData(gd);

        mRefreshTask = new StatusRefreshTask();
        new Thread(mRefreshTask, "Trace Status Refresh Thread").start();

        return super.createDialogArea(parent);
    }

    private Button createButton(Composite controlComposite, boolean selection) {
        Button b = new Button(controlComposite, SWT.TOGGLE);
        b.setText(getToggleActionText(selection));
        b.setSelection(selection);
        return b;
    }

    /** Get text to show on toggle box given its current selection. */
    private String getToggleActionText(boolean en) {
        return en ? "Disable" : "Enable";
    }

    private Label createLabel(Composite parent, String text) {
        Label l = new Label(parent, SWT.NONE);
        l.setText(text);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalAlignment = SWT.LEFT;
        gd.verticalAlignment = SWT.CENTER;
        l.setLayoutData(gd);

        return l;
    }

    @Override
    protected void okPressed() {
        mRefreshTask.cancel();
        super.okPressed();
    }

    /** Periodically refresh the trace status. */
    private class StatusRefreshTask implements Runnable {
        private static final int REFRESH_INTERVAL = 1000;
        private volatile boolean mIsCancelled = false;

        @Override
        public void run() {
            if (mTraceFileWriter == null) {
                return;
            }

            while (!mIsCancelled) {
                final String frameCount = Integer.toString(mTraceFileWriter.getCurrentFrameCount());

                double fileSize = mTraceFileWriter.getCurrentFileSize();
                fileSize /= (1024 * 1024); // convert to size in MB
                final String frameSize = SIZE_FORMATTER.format(fileSize) + " MB";

                Display.getDefault().syncExec(new Runnable() {
                    @Override
                    public void run() {
                        if (mFramesCollectedLabel.isDisposed()) {
                            return;
                        }

                        mFramesCollectedLabel.setText(frameCount);
                        mTraceFileSizeLabel.setText(frameSize);

                        mFramesCollectedLabel.pack();
                        mTraceFileSizeLabel.pack();
                    }
                });

                try {
                    Thread.sleep(REFRESH_INTERVAL);
                } catch (InterruptedException e) {
                    return;
                }
            }
        }

        public void cancel() {
            mIsCancelled = true;
        }
    }
}