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