aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/detail/DetailsPage.java
diff options
context:
space:
mode:
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.java232
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;
+ }
+}