com.android.ide.eclipse.gltrace.views.detail.DetailsPage.java Source code

Java tutorial

Introduction

Here is the source code for com.android.ide.eclipse.gltrace.views.detail.DetailsPage.java

Source

/*
 * 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.gltrace.views.detail;

import com.android.ide.eclipse.gltrace.editors.GLCallGroups.GLCallNode;
import com.android.ide.eclipse.gltrace.editors.GLFunctionTraceViewer;
import com.android.ide.eclipse.gltrace.model.GLCall;
import com.android.ide.eclipse.gltrace.model.GLTrace;
import com.android.ide.eclipse.gltrace.state.IGLProperty;
import com.android.ide.eclipse.gltrace.views.StateView;

import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.part.Page;

import java.util.Arrays;
import java.util.List;

public class DetailsPage extends Page implements ISelectionListener {
    private GLTrace mTrace;

    private IToolBarManager mToolBarManager;
    private Composite mTopComposite;
    private StackLayout mStackLayout;
    private Composite mBlankComposite;

    private List<IDetailProvider> mDetailProviders = Arrays.asList(new ShaderSourceDetailsProvider(),
            new ShaderUniformDetailsProvider(), new TextureImageDetailsProvider(), new VboDetailProvider(),
            new GlDrawCallDetailProvider(), new VertexAttribPointerDataDetailProvider());

    public DetailsPage(GLTrace trace) {
        mTrace = trace;
    }

    public void setInput(GLTrace trace) {
        mTrace = trace;
    }

    @Override
    public void createControl(Composite parent) {
        mTopComposite = new Composite(parent, SWT.NONE);
        mStackLayout = new StackLayout();
        mTopComposite.setLayout(mStackLayout);
        mTopComposite.setLayoutData(new GridData(GridData.FILL_BOTH));

        mBlankComposite = new Composite(mTopComposite, SWT.NONE);

        mToolBarManager = getSite().getActionBars().getToolBarManager();

        for (IDetailProvider provider : mDetailProviders) {
            provider.createControl(mTopComposite);

            for (IContributionItem item : provider.getToolBarItems()) {
                mToolBarManager.add(item);
            }
        }

        setDetailsProvider(null);
    }

    private void setDetailsProvider(IDetailProvider provider) {
        for (IContributionItem item : mToolBarManager.getItems()) {
            item.setVisible(false);
        }

        if (provider == null) {
            setTopControl(mBlankComposite);
        } else {
            setTopControl(provider.getControl());

            for (IContributionItem item : provider.getToolBarItems()) {
                item.setVisible(true);
            }
        }

        mToolBarManager.update(true);
    }

    private void setTopControl(Control c) {
        mStackLayout.topControl = c;
        mTopComposite.layout();
    }

    @Override
    public Control getControl() {
        return mTopComposite;
    }

    @Override
    public void init(IPageSite pageSite) {
        super.init(pageSite);
        pageSite.getPage().addSelectionListener(this);
    }

    @Override
    public void dispose() {
        getSite().getPage().removeSelectionListener(this);

        for (IDetailProvider provider : mDetailProviders) {
            provider.disposeControl();
        }

        super.dispose();
    }

    @Override
    public void setFocus() {
    }

    @Override
    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
        if (part instanceof GLFunctionTraceViewer) {
            GLCall selectedCall = getSelectedCall((GLFunctionTraceViewer) part, selection);
            if (selectedCall == null) {
                return;
            }

            callSelected(selectedCall);
            return;
        } else if (part instanceof StateView) {
            IGLProperty selectedProperty = getSelectedProperty((StateView) part, selection);
            if (selectedProperty == null) {
                return;
            }

            stateVariableSelected(selectedProperty);
            return;
        }

        return;
    }

    private void stateVariableSelected(IGLProperty property) {
        for (IDetailProvider p : mDetailProviders) {
            if (!(p instanceof IStateDetailProvider)) {
                continue;
            }

            IStateDetailProvider sp = (IStateDetailProvider) p;
            if (sp.isApplicable(property)) {
                sp.updateControl(property);
                setDetailsProvider(sp);
                return;
            }
        }

        setDetailsProvider(null);
        return;
    }

    private void callSelected(GLCall selectedCall) {
        for (IDetailProvider p : mDetailProviders) {
            if (!(p instanceof ICallDetailProvider)) {
                continue;
            }

            ICallDetailProvider cp = (ICallDetailProvider) p;
            if (cp.isApplicable(selectedCall)) {
                cp.updateControl(mTrace, selectedCall);
                setDetailsProvider(cp);
                return;
            }
        }

        setDetailsProvider(null);
        return;
    }

    private GLCall getSelectedCall(GLFunctionTraceViewer part, ISelection selection) {
        if (part.getTrace() != mTrace) {
            return null;
        }

        if (!(selection instanceof TreeSelection)) {
            return null;
        }

        Object data = ((TreeSelection) selection).getFirstElement();
        if (data instanceof GLCallNode) {
            return ((GLCallNode) data).getCall();
        } else {
            return null;
        }
    }

    private IGLProperty getSelectedProperty(StateView view, ISelection selection) {
        if (!(selection instanceof IStructuredSelection)) {
            return null;
        }

        IStructuredSelection ssel = (IStructuredSelection) selection;
        @SuppressWarnings("rawtypes")
        List objects = ssel.toList();
        if (objects.size() > 0) {
            Object data = objects.get(0);
            if (data instanceof IGLProperty) {
                return (IGLProperty) data;
            }
        }

        return null;
    }
}