diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsPage.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsPage.java | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsPage.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsPage.java new file mode 100644 index 000000000..510898df9 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsPage.java @@ -0,0 +1,232 @@ +/* + * 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; + } +} |