blob: 510898df9520e4f1c319f30fe4042fac90b23e12 [file] [log] [blame]
/*
* 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;
}
}