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