-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.views;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import org.eclipse.core.runtime.IAdaptable;\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.jface.action.IMenuManager;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.eclipse.jface.resource.ImageDescriptor;\r
-import org.eclipse.jface.viewers.ITreeContentProvider;\r
-import org.eclipse.jface.viewers.LabelProvider;\r
-import org.eclipse.jface.viewers.TreeViewer;\r
-import org.eclipse.jface.viewers.Viewer;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.graphics.Image;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.ui.IActionBars;\r
-import org.eclipse.ui.IPartListener;\r
-import org.eclipse.ui.IWorkbenchPart;\r
-import org.eclipse.ui.IWorkbenchWindow;\r
-import org.eclipse.ui.PlatformUI;\r
-import org.eclipse.ui.part.ViewPart;\r
-import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;\r
-import org.eclipse.ui.views.properties.IPropertyDescriptor;\r
-import org.eclipse.ui.views.properties.IPropertySource;\r
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;\r
-import org.simantics.proconf.g3d.Activator;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorPart;\r
-import org.simantics.proconf.g3d.scenegraph.IGeometryNode;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.scenegraph.ISelectableNode;\r
-import org.simantics.utils.ui.gfx.ImageCache;\r
-\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.Node;\r
-import com.jme.scene.SceneElement;\r
-import com.jme.scene.Spatial;\r
-import com.jme.scene.batch.GeomBatch;\r
-\r
-public class ScenegraphViewPart extends ViewPart{\r
- \r
- private static final ImageDescriptor GEOMETRY_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/geometry.png");\r
- private static final ImageDescriptor BATCH_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/batch.png");\r
- private static final ImageDescriptor NODE_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/node.png");\r
- \r
- \r
- TreeViewer viewer;\r
- \r
- IPartListener listener;\r
- \r
- Action showJMEAction;\r
- \r
- @Override\r
- public void createPartControl(Composite parent) {\r
-\r
- viewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL| SWT.V_SCROLL);\r
- viewer.setContentProvider(new GNScenegraphContentProvider());\r
- viewer.setLabelProvider(new GNScenegraphLabelProvider());\r
- getSite().setSelectionProvider(viewer);\r
- \r
- makeActions();\r
- \r
- IActionBars actionBar = getViewSite().getActionBars();\r
- contributeToActionBars(actionBar);\r
- \r
- listener = new IPartListener() {\r
- @Override\r
- public void partActivated(IWorkbenchPart part) {\r
- if (part instanceof ThreeDimensionalEditorPart) {\r
- ThreeDimensionalEditorPart p = (ThreeDimensionalEditorPart)part;\r
- Object newInput = p.getEditor();\r
- if (viewer.getInput() != newInput)\r
- viewer.setInput(newInput);\r
- } else {\r
- //viewer.setInput(null);\r
- }\r
- \r
- }\r
- \r
- @Override\r
- public void partBroughtToTop(IWorkbenchPart part) {\r
-\r
- }\r
- \r
- @Override\r
- public void partClosed(IWorkbenchPart part) {\r
-\r
- }\r
- \r
- @Override\r
- public void partDeactivated(IWorkbenchPart part) {\r
-\r
- }\r
- \r
- @Override\r
- public void partOpened(IWorkbenchPart part) {\r
-\r
- }\r
- };\r
- for (IWorkbenchWindow w : PlatformUI.getWorkbench().getWorkbenchWindows()) {\r
- w.getPartService().addPartListener(listener);\r
- \r
- }\r
- \r
- }\r
- \r
- protected void makeActions() {\r
- showJMEAction = new Action("jME",Action.AS_CHECK_BOX) {\r
- @Override\r
- public void run() {\r
- Object input = viewer.getInput();\r
- viewer.setInput(null);\r
- if (this.isChecked()) {\r
- viewer.setContentProvider(new JMEScenegraphContentProvider());\r
- viewer.setLabelProvider(new JMEScenegraphLabelProvider());\r
- } else {\r
- viewer.setContentProvider(new GNScenegraphContentProvider());\r
- viewer.setLabelProvider(new GNScenegraphLabelProvider());\r
- }\r
- viewer.setInput(input);\r
- }\r
- };\r
- }\r
- \r
- protected void contributeToActionBars(IActionBars bars) {\r
- fillLocalToolBar(bars.getToolBarManager());\r
- fillLocalPullDown(bars.getMenuManager());\r
- bars.updateActionBars();\r
- }\r
-\r
- protected void fillLocalToolBar(IToolBarManager manager) {\r
- manager.add(showJMEAction);\r
- }\r
-\r
- protected void fillLocalPullDown(IMenuManager manager) {\r
-\r
- }\r
- \r
- @Override\r
- public void setFocus() {\r
- viewer.getControl().setFocus();\r
- }\r
- \r
- public void dispose() {\r
- for (IWorkbenchWindow w : PlatformUI.getWorkbench().getWorkbenchWindows()) {\r
- w.getPartService().removePartListener(listener);\r
- \r
- }\r
- super.dispose();\r
- }\r
- \r
-\r
- private class JMEScenegraphContentProvider implements ITreeContentProvider {\r
- @Override\r
- public Object[] getChildren(Object parentElement) {\r
- if (parentElement instanceof JMEAdaptable)\r
- parentElement = ((JMEAdaptable)parentElement).getElement();\r
- \r
- if (parentElement instanceof Node) {\r
- Node n = (Node)parentElement;\r
- Object o[] = new Object[n.getChildren().size()];\r
- for (int i = 0; i < n.getChildren().size(); i++) {\r
- o[i] = new JMEAdaptable(n.getChild(i));\r
- }\r
- return o;\r
- }\r
- if (parentElement instanceof Geometry) {\r
- Geometry g = (Geometry)parentElement;\r
- Object o[] = new Object[g.getBatchCount()];\r
- for (int i = 0 ; i < g.getBatchCount(); i++)\r
- o[i] = new JMEAdaptable(g.getBatch(i));\r
- return o;\r
- }\r
- return null;\r
- }\r
- \r
- @Override\r
- public Object[] getElements(Object inputElement) {\r
- if (inputElement instanceof ThreeDimensionalEditorBase) {\r
- SceneElement root = ((ThreeDimensionalEditorBase)inputElement).getRenderingComponent().getRoot();\r
- if (root != null)\r
- return new Object[]{new JMEAdaptable(root)};\r
- }\r
- return new Object[0];\r
- }\r
- \r
- @Override\r
- public Object getParent(Object element) {\r
- SceneElement e;\r
- if (element instanceof JMEAdaptable)\r
- e = ((JMEAdaptable)element).getElement();\r
- else\r
- e = (SceneElement)element;\r
- if (e instanceof Spatial) {\r
- Spatial s = (Spatial)e;\r
- return s.getParent();\r
- } \r
- if (e instanceof GeomBatch) {\r
- GeomBatch g = (GeomBatch)e;\r
- return g.getParentGeom();\r
- }\r
- return null;\r
- }\r
- \r
- @Override\r
- public boolean hasChildren(Object element) {\r
- if (element instanceof JMEAdaptable)\r
- element = ((JMEAdaptable)element).getElement();\r
- if (element instanceof Node) {\r
- Node n = (Node)element;\r
- if (n.getChildren() == null)\r
- return false;\r
- return n.getChildren().size() > 0;\r
- }\r
- if (element instanceof Geometry) {\r
- Geometry g = (Geometry)element;\r
- return g.getBatchCount() > 0;\r
- }\r
- return false;\r
- }\r
- \r
- @Override\r
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
- \r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- \r
- }\r
- }\r
- \r
- private class JMEScenegraphLabelProvider extends LabelProvider {\r
- @Override\r
- public String getText(Object element) {\r
- if (element == null)\r
- return null;\r
- if (element instanceof JMEAdaptable)\r
- element = ((JMEAdaptable)element).getElement();\r
- SceneElement e = (SceneElement)element;\r
- return e.getName() + " : " + e.getClass();\r
- }\r
- \r
- @Override\r
- public Image getImage(Object element) {\r
- if (element == null)\r
- return null;\r
- if (element instanceof JMEAdaptable)\r
- element = ((JMEAdaptable)element).getElement();\r
- ImageDescriptor desc = null;\r
- if (element instanceof GeomBatch)\r
- desc = BATCH_IMAGE;\r
- else if (element instanceof Geometry)\r
- desc = GEOMETRY_IMAGE;\r
- else if (element instanceof Node)\r
- desc = NODE_IMAGE;\r
- else \r
- return null;\r
- return ImageCache.getInstance().getImage(desc);\r
- }\r
- }\r
- \r
- private class GNScenegraphContentProvider implements ITreeContentProvider {\r
- @Override\r
- public Object[] getChildren(Object parentElement) {\r
- if (parentElement instanceof GNAdaptable)\r
- parentElement = ((GNAdaptable)parentElement).getNode();\r
- IGraphicsNode node = (IGraphicsNode)parentElement;\r
- Object children[] = new Object[node.getChildren().size()];\r
- Iterator<IGraphicsNode> it = node.getChildren().iterator();\r
- for (int i = 0; i < node.getChildren().size(); i++) {\r
- children[i] = new GNAdaptable(it.next());\r
- }\r
- return children;\r
- }\r
- \r
- @Override\r
- public Object[] getElements(Object inputElement) {\r
- if (inputElement instanceof ThreeDimensionalEditorBase) {\r
- IGraphicsNode root = ((ThreeDimensionalEditorBase)inputElement).getScenegraphAdapter().getRootNode();\r
- if (root != null)\r
- return new Object[]{new GNAdaptable(root)};\r
- }\r
- return new Object[0];\r
- }\r
- \r
- @Override\r
- public Object getParent(Object element) {\r
- if (element instanceof GNAdaptable)\r
- element = ((GNAdaptable)element).getNode();\r
- IGraphicsNode node = (IGraphicsNode)element;\r
- return node.getParent();\r
- }\r
- \r
- @Override\r
- public boolean hasChildren(Object element) {\r
- if (element instanceof GNAdaptable)\r
- element = ((GNAdaptable)element).getNode();\r
- IGraphicsNode node = (IGraphicsNode)element;\r
- return node.getChildren().size() > 0;\r
- }\r
- \r
- @Override\r
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
- \r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- \r
- }\r
- }\r
- \r
- private class GNScenegraphLabelProvider extends LabelProvider {\r
- @Override\r
- public String getText(Object element) {\r
- if (element instanceof GNAdaptable)\r
- element = ((GNAdaptable)element).getNode();\r
- IGraphicsNode node = (IGraphicsNode)element;\r
- return node.getGroup().getName() + " : " + node.getClass();\r
- }\r
- \r
- @Override\r
- public Image getImage(Object element) {\r
- ImageDescriptor desc = NODE_IMAGE;\r
-// if (element instanceof GeomBatch)\r
-// desc = BATCH_IMAGE;\r
-// else if (element instanceof Geometry)\r
-// desc = GEOMETRY_IMAGE;\r
-// else if (element instanceof Node)\r
-// desc = NODE_IMAGE;\r
-// else \r
-// return null;\r
- return ImageCache.getInstance().getImage(desc);\r
- }\r
- }\r
- \r
- private class JMEAdaptable implements IAdaptable {\r
- SceneElement element;\r
- \r
- public JMEAdaptable(SceneElement element) {\r
- assert (element != null);\r
- this.element = element;\r
- }\r
- \r
- @SuppressWarnings("unchecked")\r
- @Override\r
- public Object getAdapter(Class adapter) {\r
- if (adapter == IPropertySource.class) {\r
- return new JMEProperties(element);\r
- }\r
- return null;\r
- }\r
- \r
- public SceneElement getElement() {\r
- return element;\r
- }\r
- }\r
- \r
- private class GNAdaptable implements IAdaptable {\r
- IGraphicsNode node;\r
- \r
- public GNAdaptable(IGraphicsNode node) {\r
- assert (node != null);\r
- this.node = node;\r
- }\r
- \r
- @SuppressWarnings("unchecked")\r
- @Override\r
- public Object getAdapter(Class adapter) {\r
- if (adapter == IPropertySource.class) {\r
- return new GNProperties(node);\r
- }\r
- return null;\r
- }\r
- \r
- public IGraphicsNode getNode() {\r
- return node;\r
- }\r
- }\r
- \r
- private static final String NAME = "name";\r
- private static final String CULL_MODE = "cullmode";\r
- private static final String CULL_MODES[] = {"Inherit","Dynamic","Always","Never"};\r
- private static final String LIGHT_MODE = "lightmode";\r
- private static final String LIGHT_MODES[] = {"Off","Combine First","Combine Closest","Combine Recent Enabled","Inherit","Replace"};\r
- private static final String LOCAL_CULL_MODE = "localcullmode";\r
- private static final String LOCAL_LIGHT_MODE = "locallightmode";\r
- private static final String LOCAL_NORMALS_MODE = "localnormalsmode";\r
- private static final String LOCAL_RENDER_QUEUE_MODE ="localrenderqueuemode";\r
- private static final String LOCAL_TEXTURE_COMBINE_MODE = "localtexturecombinemode";\r
- private static final String LOCKS = "locks";\r
- private static final String NORMALS_MODE = "normalsmode";\r
- private static final String NORMALS_MODES[] = {"Inherit","Use Provided","Normalize Provided","Normalize if scaled","Off"};\r
- private static final String RENDER_QUEUE_MODE = "renderqueuemode";\r
- private static final String RENDER_QUEUE_MODES[] = {"Inherit","Skip","Opaque","Transparent","Ortho"};\r
- private static final String TEXTURE_COMBINE_MODE = "texturecombinemode";\r
- private static final String TEXTURE_COMBINE_MODES[] = {"Off","First","Closest","Recent enabled","Inherit","Replace"};\r
- \r
- private static final String BOOLEAN_VALUES[] = {"False","True"};\r
- \r
- private class JMEProperties implements IPropertySource { \r
- \r
- SceneElement element;\r
- \r
- public JMEProperties(SceneElement element) {\r
- this.element = element;\r
- }\r
- \r
- @Override\r
- public Object getEditableValue() {\r
- return this;\r
- }\r
- \r
- @Override\r
- public IPropertyDescriptor[] getPropertyDescriptors() {\r
- List<IPropertyDescriptor> desc = new ArrayList<IPropertyDescriptor>();\r
- desc.add(new TextPropertyDescriptor(NAME,"Name"));\r
- desc.add(new ComboBoxPropertyDescriptor(CULL_MODE,"Cull Mode",CULL_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(LIGHT_MODE,"Light Combine Mode",LIGHT_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(LOCAL_CULL_MODE,"Local Cull Mode",CULL_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(LOCAL_LIGHT_MODE,"Local Light Combine Mode",LIGHT_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(LOCAL_NORMALS_MODE,"Local Normals Mode",NORMALS_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(LOCAL_RENDER_QUEUE_MODE,"Local Render Queue Mode",RENDER_QUEUE_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(LOCAL_TEXTURE_COMBINE_MODE,"Local Texture Combine Mode",TEXTURE_COMBINE_MODES));\r
- desc.add(new TextPropertyDescriptor(LOCKS,"Locks"));\r
- desc.add(new ComboBoxPropertyDescriptor(NORMALS_MODE,"Normals Mode",NORMALS_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(RENDER_QUEUE_MODE,"Render Queue Mode",RENDER_QUEUE_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(TEXTURE_COMBINE_MODE,"Texture Combine Mode",TEXTURE_COMBINE_MODES));\r
- return desc.toArray(new IPropertyDescriptor[desc.size()]);\r
-\r
- }\r
- \r
- @Override\r
- public Object getPropertyValue(Object id) {\r
- if (id == NAME) {\r
- return element.getName();\r
- } else if (id == CULL_MODE) {\r
- return element.getCullMode();\r
- } else if (id == LIGHT_MODE) {\r
- return element.getLightCombineMode();\r
- } else if (id == LOCAL_CULL_MODE) {\r
- return element.getLocalCullMode();\r
- } else if (id == LOCAL_LIGHT_MODE) {\r
- return element.getLocalLightCombineMode();\r
- } else if (id == LOCAL_NORMALS_MODE) {\r
- return element.getLocalNormalsMode();\r
- } else if (id == LOCAL_RENDER_QUEUE_MODE) {\r
- return element.getLocalRenderQueueMode();\r
- } else if (id == LOCAL_TEXTURE_COMBINE_MODE) {\r
- return element.getLocalTextureCombineMode();\r
- } else if (id == LOCKS) {\r
- return element.getLocks();\r
- } else if (id == NORMALS_MODE) {\r
- return element.getNormalsMode();\r
- } else if (id == RENDER_QUEUE_MODE) {\r
- return element.getRenderQueueMode();\r
- } else if (id == TEXTURE_COMBINE_MODE) {\r
- return element.getTextureCombineMode();\r
- }\r
- \r
-// element.getZOrder();\r
-// element.isCollidable();\r
-\r
- return null;\r
- }\r
- \r
- @Override\r
- public boolean isPropertySet(Object id) {\r
- return false;\r
- }\r
- \r
- @Override\r
- public void resetPropertyValue(Object id) {\r
- \r
- }\r
- \r
- @Override\r
- public void setPropertyValue(Object id, Object value) {\r
- if (id == NAME) {\r
- element.setName((String)value);\r
- } else if (id == CULL_MODE) {\r
- element.setCullMode((Integer)value);\r
- } else if (id == LIGHT_MODE) {\r
- element.setLightCombineMode((Integer)value);\r
- } else if (id == LOCAL_CULL_MODE) {\r
- \r
- } else if (id == LOCAL_LIGHT_MODE) {\r
- \r
- } else if (id == LOCAL_NORMALS_MODE) {\r
- \r
- } else if (id == LOCAL_RENDER_QUEUE_MODE) {\r
- \r
- } else if (id == LOCAL_TEXTURE_COMBINE_MODE) {\r
- \r
- } else if (id == LOCKS) {\r
- element.setLocks((Integer)value);\r
- } else if (id == NORMALS_MODE) {\r
- element.setNormalsMode((Integer)value);\r
- } else if (id == RENDER_QUEUE_MODE) {\r
- element.setRenderQueueMode((Integer)value);\r
- } else if (id == TEXTURE_COMBINE_MODE) {\r
- element.setTextureCombineMode((Integer)value);\r
- }\r
- \r
- }\r
-\r
- }\r
- \r
- private static final String SELECTED = "selected";\r
- private static final String HIGHLIGHTED = "highlighted";\r
- private static final String VISIBLE = "visible";\r
- \r
- private class GNProperties implements IPropertySource {\r
- IGraphicsNode node;\r
- \r
- public GNProperties(IGraphicsNode node) {\r
- this.node = node;\r
- }\r
- \r
- \r
- @Override\r
- public Object getEditableValue() {\r
- return this;\r
- }\r
- \r
- @Override\r
- public IPropertyDescriptor[] getPropertyDescriptors() {\r
- List<IPropertyDescriptor> desc = new ArrayList<IPropertyDescriptor>();\r
- if (node instanceof ISelectableNode) {\r
- //ISelectableNode n = (ISelectableNode)node;\r
- \r
- desc.add(new ComboBoxPropertyDescriptor(SELECTED,"Selected",BOOLEAN_VALUES));\r
- desc.add(new ComboBoxPropertyDescriptor(HIGHLIGHTED,"Highlighted",BOOLEAN_VALUES));\r
- desc.add(new ComboBoxPropertyDescriptor(VISIBLE,"Visible",BOOLEAN_VALUES));\r
- \r
- }\r
- return desc.toArray(new IPropertyDescriptor[desc.size()]);\r
- }\r
- \r
- @Override\r
- public Object getPropertyValue(Object id) {\r
- if (node instanceof ISelectableNode) {\r
- ISelectableNode n = (ISelectableNode)node;\r
- if (id == SELECTED) {\r
- if (n.isSelected())\r
- return 1;\r
- return 0;\r
- } else if (id == HIGHLIGHTED) {\r
- if (n.isHighlighted())\r
- return 1;\r
- return 0;\r
- } else if (id == VISIBLE) {\r
- if (n.isVisible())\r
- return 1;\r
- return 0;\r
- }\r
- }\r
- if (node instanceof IGeometryNode) {\r
- //IGeometryNode n = (IGeometryNode)node;\r
- }\r
-\r
- return null;\r
- }\r
- \r
- @Override\r
- public boolean isPropertySet(Object id) {\r
- return false;\r
- }\r
- \r
- @Override\r
- public void resetPropertyValue(Object id) {\r
-\r
- }\r
- \r
- @Override\r
- public void setPropertyValue(Object id, Object value) {\r
- if (node instanceof ISelectableNode) {\r
- ISelectableNode n = (ISelectableNode)node;\r
- boolean b = ((Integer)value) == 1;\r
- if (id == SELECTED) {\r
- n.setSelected(b);\r
- } else if (id == HIGHLIGHTED) {\r
- n.setHighlighted(b);\r
- } else if (id == VISIBLE) {\r
- n.setVisible(b);\r
- }\r
- }\r
- \r
- }\r
-\r
- \r
- }\r
- \r
-}\r
- \r
-\r