diff options
8 files changed, 283 insertions, 77 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml index 798175b..9d0accb 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml @@ -31,6 +31,14 @@ name="GL State"
restorable="true">
</view>
+ <view
+ category="com.android.ide.eclipse.gltrace"
+ class="com.android.ide.eclipse.gltrace.views.TextureView"
+ icon="icons/opengl.png"
+ id="com.android.ide.eclipse.gltrace.views.Texture"
+ name="Texture"
+ restorable="true">
+ </view>
</extension>
<extension
point="org.eclipse.ui.editors">
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java index 6f4ee7e..6ff0419 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java @@ -18,25 +18,39 @@ package com.android.ide.eclipse.gltrace; import com.android.ide.eclipse.gltrace.views.GLFramebufferView; import com.android.ide.eclipse.gltrace.views.StateView; +import com.android.ide.eclipse.gltrace.views.TextureView; import org.eclipse.ui.IFolderLayout; import org.eclipse.ui.IPageLayout; import org.eclipse.ui.IPerspectiveFactory; public class GLTracePerspective implements IPerspectiveFactory { - private static final String STATE_FOLDER_ID = "right"; //$NON-NLS-1$ - private static final String FB_FOLDER_ID = "rightBottom"; //$NON-NLS-1$ + private static final String STATE_FOLDER_ID = "stateFolder"; //$NON-NLS-1$ + private static final String FB_FOLDER_ID = "fbFolder"; //$NON-NLS-1$ + private static final String TEXTURE_VIEW_FOLDER_ID = "textureViewFolder"; //$NON-NLS-1$ @Override public void createInitialLayout(IPageLayout layout) { + // Create a 3 column layout + // The first column contains the function trace in an editor. + // The second column contains the GL State View. + // The third column contains the texture view and the top and the framebuffer at the bottom. + // Add the OpenGL state view to the right of the editor - IFolderLayout right = layout.createFolder(STATE_FOLDER_ID, IPageLayout.RIGHT, 0.7f, + IFolderLayout column2 = layout.createFolder(STATE_FOLDER_ID, IPageLayout.RIGHT, 0.65f, layout.getEditorArea()); - right.addView(StateView.ID); + column2.addView(StateView.ID); - // Add the OpenGL Framebuffer view below the state view - IFolderLayout rightBottom = layout.createFolder(FB_FOLDER_ID, IPageLayout.BOTTOM, 0.6f, + // Add the Texture View in the 3rd column + IFolderLayout column3 = layout.createFolder(FB_FOLDER_ID, IPageLayout.RIGHT, 0.6f, STATE_FOLDER_ID); - rightBottom.addView(GLFramebufferView.ID); + column3.addView(TextureView.ID); + + // Add the OpenGL Framebuffer view below the texture view (bottom of 3rd column) + IFolderLayout column3bottom = layout.createFolder(TEXTURE_VIEW_FOLDER_ID, + IPageLayout.BOTTOM, + 0.5f, + FB_FOLDER_ID); + column3bottom.addView(GLFramebufferView.ID); } } diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java index 40e0a2a..5635825 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java @@ -28,6 +28,8 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; @@ -52,7 +54,7 @@ import java.util.Set; * A tree view of the OpenGL state. It listens to the current GLCall that is selected * in the Function Trace view, and updates its view to reflect the state as of the selected call. */ -public class StateViewPage extends Page implements ISelectionListener { +public class StateViewPage extends Page implements ISelectionListener, ISelectionProvider { public static final String ID = "com.android.ide.eclipse.gltrace.views.GLState"; //$NON-NLS-1$ private final GLTrace mTrace; @@ -261,4 +263,24 @@ public class StateViewPage extends Page implements ISelectionListener { return changedProperties; } + + @Override + public void addSelectionChangedListener(ISelectionChangedListener listener) { + mTreeViewer.addSelectionChangedListener(listener); + } + + @Override + public ISelection getSelection() { + return mTreeViewer.getSelection(); + } + + @Override + public void removeSelectionChangedListener(ISelectionChangedListener listener) { + mTreeViewer.removeSelectionChangedListener(listener); + } + + @Override + public void setSelection(ISelection selection) { + mTreeViewer.setSelection(selection); + } } diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java index af435af..14a93e3 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java @@ -57,6 +57,6 @@ public class GLStringProperty extends GLAbstractAtomicProperty { @Override public String toString() { - return mCurrentValue; + return getType() + "=" + getStringValue(); //$NON-NLS-1$ }; } diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLFramebufferView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLFramebufferView.java index d7718109..634a733 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLFramebufferView.java +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLFramebufferView.java @@ -16,90 +16,26 @@ package com.android.ide.eclipse.gltrace.views; -import com.android.ide.eclipse.gldebugger.Activator; 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.widgets.ImageCanvas; -import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.ISelectionListener; -import org.eclipse.ui.ISelectionService; import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.part.ViewPart; import java.util.List; -public class GLFramebufferView extends ViewPart implements ISelectionListener { - public static final String ID = "com.android.ide.eclipse.gltrace.views.GLFrameBuffer"; //$NON-NLS-1$ - private static final boolean FIT_TO_CANVAS_DEFAULT = true; - private ImageCanvas mImageCanvas; - +public class GLFramebufferView extends ImageViewPart { public GLFramebufferView() { + super(true); } - @Override - public void createPartControl(Composite parent) { - createImageCanvas(parent); - createToolbar(); - - ISelectionService selectionService = getSite().getWorkbenchWindow().getSelectionService(); - selectionService.addPostSelectionListener(this); - } - - @Override - public void dispose() { - if (mImageCanvas != null) { - mImageCanvas.dispose(); - mImageCanvas = null; - } - - ISelectionService selectionService = getSite().getWorkbenchWindow().getSelectionService(); - selectionService.removePostSelectionListener(this); - super.dispose(); - } - - @Override - public void setFocus() { - if (mImageCanvas != null) { - mImageCanvas.setFocus(); - } - } - - private class FitToCanvasAction extends Action { - public FitToCanvasAction() { - super("Fit to Canvas", Activator.getImageDescriptor("/icons/zoomfit.png")); //$NON-NLS-2$ - setToolTipText("Fit Image to Canvas"); - setChecked(FIT_TO_CANVAS_DEFAULT); - } - - @Override - public void run() { - mImageCanvas.setFitToCanvas(isChecked()); - } - } - - private void createImageCanvas(Composite parent) { - mImageCanvas = new ImageCanvas(parent); - mImageCanvas.setFitToCanvas(FIT_TO_CANVAS_DEFAULT); - } - - private void createToolbar() { - getViewSite().getActionBars().getToolBarManager().add(new FitToCanvasAction()); - } + public static final String ID = "com.android.ide.eclipse.gltrace.views.GLFrameBuffer"; //$NON-NLS-1$ public void displayFB(final Image image) { - Display.getDefault().asyncExec(new Runnable() { - @Override - public void run() { - mImageCanvas.setImage(image); - } - }); + setImage(image); } @Override diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/ImageViewPart.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/ImageViewPart.java new file mode 100644 index 0000000..67b879a --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/ImageViewPart.java @@ -0,0 +1,108 @@ +/* + * 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; + +import com.android.ide.eclipse.gldebugger.Activator; +import com.android.ide.eclipse.gltrace.widgets.ImageCanvas; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.ISelectionListener; +import org.eclipse.ui.ISelectionService; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.part.ViewPart; + +/** + * The {@link ImageViewPart} is an abstract implementation of an Eclipse View + * that holds an image canvas. This class registers itself to listen to the workbench + * selection service. Subclasses must implement the + * {@link #selectionChanged(IWorkbenchPart, ISelection)} method, and call {@link #setImage(Image)} + * to update the image to be displayed. + */ +public abstract class ImageViewPart extends ViewPart implements ISelectionListener { + private boolean mFitToCanvasDefault = true; + private ImageCanvas mImageCanvas; + + public ImageViewPart(boolean fitToCanvasByDefault) { + mFitToCanvasDefault = fitToCanvasByDefault; + } + + @Override + public void createPartControl(Composite parent) { + createImageCanvas(parent); + createToolbar(); + + ISelectionService selectionService = getSite().getWorkbenchWindow().getSelectionService(); + selectionService.addPostSelectionListener(this); + } + + @Override + public void dispose() { + if (mImageCanvas != null) { + mImageCanvas.dispose(); + mImageCanvas = null; + } + + ISelectionService selectionService = getSite().getWorkbenchWindow().getSelectionService(); + selectionService.removePostSelectionListener(this); + super.dispose(); + } + + @Override + public void setFocus() { + if (mImageCanvas != null) { + mImageCanvas.setFocus(); + } + } + + private class FitToCanvasAction extends Action { + public FitToCanvasAction() { + super("Fit to Canvas", Activator.getImageDescriptor("/icons/zoomfit.png")); //$NON-NLS-2$ + setToolTipText("Fit Image to Canvas"); + setChecked(mFitToCanvasDefault); + } + + @Override + public void run() { + mImageCanvas.setFitToCanvas(isChecked()); + } + } + + private void createImageCanvas(Composite parent) { + mImageCanvas = new ImageCanvas(parent); + mImageCanvas.setFitToCanvas(mFitToCanvasDefault); + } + + private void createToolbar() { + getViewSite().getActionBars().getToolBarManager().add(new FitToCanvasAction()); + } + + protected void setImage(final Image image) { + Display.getDefault().asyncExec(new Runnable() { + @Override + public void run() { + mImageCanvas.setImage(image); + } + }); + }; + + @Override + public abstract void selectionChanged(IWorkbenchPart part, ISelection selection); +} diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java index cd7669d..c3782ca 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java @@ -19,9 +19,11 @@ package com.android.ide.eclipse.gltrace.views; import com.android.ide.eclipse.gltrace.editors.GLFunctionTraceViewer; import com.android.ide.eclipse.gltrace.editors.StateViewPage; +import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.part.IPage; +import org.eclipse.ui.part.IPageSite; import org.eclipse.ui.part.MessagePage; import org.eclipse.ui.part.PageBook; import org.eclipse.ui.part.PageBookView; @@ -84,4 +86,16 @@ public class StateView extends PageBookView { public void partBroughtToTop(IWorkbenchPart part) { partActivated(part); } + + @Override + protected void showPageRec(PageRec pageRec) { + IPageSite pageSite = getPageSite(pageRec.page); + if (pageRec.page instanceof ISelectionProvider) { + pageSite.setSelectionProvider((ISelectionProvider) pageRec.page); + } else { + pageSite.setSelectionProvider(null); // clear selection provider + } + + super.showPageRec(pageRec); + } } diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/TextureView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/TextureView.java new file mode 100644 index 0000000..a355bae --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/TextureView.java @@ -0,0 +1,104 @@ +/* + * 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; + +import com.android.ide.eclipse.gltrace.state.GLCompositeProperty; +import com.android.ide.eclipse.gltrace.state.GLStateType; +import com.android.ide.eclipse.gltrace.state.GLStringProperty; +import com.android.ide.eclipse.gltrace.state.IGLProperty; + +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IWorkbenchPart; + +import java.util.List; + +public class TextureView extends ImageViewPart { + public TextureView() { + super(false); + } + + public static final String ID = "com.android.ide.eclipse.gltrace.views.Texture"; //$NON-NLS-1$ + + @Override + public void selectionChanged(IWorkbenchPart part, ISelection selection) { + if (!(part instanceof StateView)) { + return; + } + + if (!(selection instanceof IStructuredSelection)) { + return; + } + + IStructuredSelection ssel = (IStructuredSelection) selection; + @SuppressWarnings("rawtypes") + List objects = ssel.toList(); + if (objects.size() > 0) { + Object data = objects.get(0); + if (!(data instanceof IGLProperty)) { + return; + } + + String textureImagePath = getTextureImage((IGLProperty) data); + if (textureImagePath == null) { + setImage(null); + return; + } + + setImage(getImage(textureImagePath)); + } + } + + private Image getImage(String imagePath) { + return new Image(Display.getDefault(), imagePath); + } + + /** + * Extract the TEXTURE_IMAGE property from the gl state hierarchy. + * The TEXTURE_IMAGE property fits in the hierarchy like so: + * ... + * |---PER_TEXTURE_STATE + * |-- + * |-- TEXTURE_IMAGE + * + * So we can extract the TEXTURE_IMAGE if the given property is either PER_TEXTURE_STATE, + * or a child of PER_TEXTURE_STATE. + */ + private String getTextureImage(IGLProperty property) { + // if the selected property is the texture image, then we just return its value + if (property.getType() == GLStateType.TEXTURE_IMAGE) { + return ((GLStringProperty) property).getStringValue(); + } + + if (property.getType() != GLStateType.PER_TEXTURE_STATE) { + // See if the property is a child of PER_TEXTURE_STATE + IGLProperty parent = property.getParent(); + if (parent == null || parent.getType() != GLStateType.PER_TEXTURE_STATE) { + return null; + } else { + property = parent; + } + } + + // property is now the parent property of TEXTURE_IMAGE + GLCompositeProperty perTextureState = (GLCompositeProperty) property; + IGLProperty imageProperty = perTextureState.getProperty(GLStateType.TEXTURE_IMAGE); + return ((GLStringProperty) imageProperty).getStringValue(); + } +} |