blob: e0ba947c506a71dbf01af3c9df554985e3a1f744 [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.GLEnum;
import com.android.ide.eclipse.gltrace.GLUtils;
import com.android.ide.eclipse.gltrace.state.GLCompositeProperty;
import com.android.ide.eclipse.gltrace.state.GLStateType;
import com.android.ide.eclipse.gltrace.state.IGLProperty;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class VboDetailProvider implements IStateDetailProvider {
private static enum DisplayFormat {
GL_FLOAT,
GL_BYTE,
GL_UNSIGNED_BYTE,
GL_SHORT,
GL_UNSIGNED_SHORT,
GL_FIXED,
}
private Composite mComposite;
private Label mSizeLabel;
private Label mUsageLabel;
private Label mTypeLabel;
private Combo mDisplayFormatCombo;
private Text mTextControl;
private byte[] mBufferData;
@Override
public boolean isApplicable(IGLProperty state) {
return getVboProperty(state) != null;
}
@Override
public void createControl(Composite parent) {
mComposite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
layout.marginWidth = layout.marginHeight = 0;
mComposite.setLayout(layout);
GridDataFactory.fillDefaults().grab(true, true).applyTo(mComposite);
Label l = new Label(mComposite, SWT.NONE);
l.setText("Size: ");
GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(l);
mSizeLabel = new Label(mComposite, SWT.NONE);
GridDataFactory.fillDefaults().grab(true, false).applyTo(mSizeLabel);
l = new Label(mComposite, SWT.NONE);
l.setText("Usage: ");
GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(l);
mUsageLabel = new Label(mComposite, SWT.NONE);
GridDataFactory.fillDefaults().grab(true, false).applyTo(mUsageLabel);
l = new Label(mComposite, SWT.NONE);
l.setText("Type: ");
GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(l);
mTypeLabel = new Label(mComposite, SWT.NONE);
GridDataFactory.fillDefaults().grab(true, false).applyTo(mTypeLabel);
l = new Label(mComposite, SWT.NONE);
l.setText("Format Data As: ");
GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(l);
DisplayFormat[] values = DisplayFormat.values();
List<String> formats = new ArrayList<String>(values.length);
for (DisplayFormat format: values) {
formats.add(format.name());
}
mDisplayFormatCombo = new Combo(mComposite, SWT.DROP_DOWN | SWT.READ_ONLY);
mDisplayFormatCombo.setItems(formats.toArray(new String[formats.size()]));
mDisplayFormatCombo.select(0);
mDisplayFormatCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateContents();
}
});
GridDataFactory.fillDefaults().grab(true, false).applyTo(mDisplayFormatCombo);
mTextControl = new Text(mComposite, SWT.BORDER | SWT.READ_ONLY | SWT.MULTI
| SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);
GridDataFactory.fillDefaults().span(2, 1).grab(true, true).applyTo(mTextControl);
mTextControl.setEditable(false);
}
@Override
public void disposeControl() {
}
@Override
public Control getControl() {
return mComposite;
}
@Override
public void updateControl(IGLProperty state) {
IGLProperty vbo = getVboProperty(state);
if (vbo instanceof GLCompositeProperty) {
GLCompositeProperty vboProperty = (GLCompositeProperty) vbo;
IGLProperty sizeProperty = vboProperty.getProperty(GLStateType.BUFFER_SIZE);
mSizeLabel.setText(sizeProperty.getStringValue() + " bytes"); //$NON-NLS-1$
IGLProperty usageProperty = vboProperty.getProperty(GLStateType.BUFFER_USAGE);
mUsageLabel.setText(usageProperty.getStringValue());
IGLProperty typeProperty = vboProperty.getProperty(GLStateType.BUFFER_TYPE);
mTypeLabel.setText(typeProperty.getStringValue());
IGLProperty dataProperty = vboProperty.getProperty(GLStateType.BUFFER_DATA);
mBufferData = (byte[]) dataProperty.getValue();
} else {
mBufferData = null;
}
updateContents();
}
private void updateContents() {
if (mBufferData != null) {
mTextControl.setText(GLUtils.formatData(mBufferData,
GLEnum.valueOf(mDisplayFormatCombo.getText())));
mTextControl.setEnabled(true);
mDisplayFormatCombo.setEnabled(true);
} else {
mTextControl.setText("");
mTextControl.setEnabled(false);
mDisplayFormatCombo.setEnabled(false);
}
}
@Override
public List<IContributionItem> getToolBarItems() {
return Collections.emptyList();
}
/**
* Get the {@link GLStateType#VBO_COMPOSITE} property given a node in
* the state hierarchy.
*/
private IGLProperty getVboProperty(IGLProperty state) {
if (state.getType() == GLStateType.VBO_COMPOSITE) {
return state;
}
state = state.getParent();
if (state != null && state.getType() == GLStateType.VBO_COMPOSITE) {
return state;
}
return null;
}
}