/* * Copyright (c) 2012, 2013 Hemanta Sapkota. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Hemanta Sapkota (laex.pearl@gmail.com) */ package com.laex.cg2d.entityeditor.pages; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.draw2d.Ellipse; import org.eclipse.draw2d.FigureCanvas; import org.eclipse.draw2d.FreeformLayeredPane; import org.eclipse.draw2d.FreeformLayout; import org.eclipse.draw2d.ImageFigure; import org.eclipse.draw2d.RectangleFigure; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.jface.dialogs.IPageChangedListener; import org.eclipse.jface.dialogs.PageChangedEvent; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Spinner; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ImageHyperlink; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import com.badlogic.gdx.math.Vector2; import com.laex.cg2d.entityeditor.EntityFormEditor; import com.laex.cg2d.entityeditor.ui.CollisionShapeSelectionDialog; import com.laex.cg2d.model.CGCProject; import com.laex.cg2d.model.SharedImages; import com.laex.cg2d.model.adapter.RectAdapter; import com.laex.cg2d.model.model.Entity; import com.laex.cg2d.model.model.EntityAnimation; import com.laex.cg2d.model.model.EntityCollisionType; import com.laex.cg2d.model.model.EntitySpritesheetItem; import com.laex.cg2d.model.model.ResourceFile; import com.laex.cg2d.model.resources.ResourceManager; /** * The Class CollisionFormPage. */ public class CollisionFormPage extends FormPage { /** The frames composite. */ private Composite framesComposite; /** The managed form. */ private IManagedForm managedForm; /** The sctn frames. */ private Section sctnFrames; /** The table. */ private Table table; /** The table viewer. */ private TableViewer tableViewer; /** The animation list items. */ private java.util.List<AnimationListViewItem> animationListItems = new ArrayList<AnimationListViewItem>(); /** The dirty. */ private boolean dirty = false; /** The entity form editor. */ private EntityFormEditor entityFormEditor; /** The txt x. */ private Spinner txtX; /** The txt y. */ private Spinner txtY; /** The txt width. */ private Spinner txtWidth; /** The txt height. */ private Spinner txtHeight; /** The collision shape hyper link. */ private ImageHyperlink collisionShapeHyperLink; /** The sctn shapes. */ private Section sctnShapes; /** The sctn shape properties. */ private Section sctnShapeProperties; /** The sctn shapes composite. */ private Composite sctnShapesComposite; /** The collision shape. */ private EntityCollisionType collisionShape = EntityCollisionType.NONE; /** The mghprlnk add. */ private ImageHyperlink mghprlnkAdd; /** The mghprlnk rem. */ private ImageHyperlink mghprlnkRem; /** The phys ed fixture file. */ private IFile physEdFixtureFile; /** The figure canvas. */ private FigureCanvas figureCanvas; /** The freeform layered pane. */ private FreeformLayeredPane freeformLayeredPane; /** The rectangle figure. */ private RectangleFigure rectangleFigure; /** The ellipse figure. */ private Ellipse ellipseFigure; /** * * Create the form page. * * @param id * the id * @param title * the title */ public CollisionFormPage(String id, String title) { super(id, title); } /** * Create the form page. * * @param editor * the editor * @param id * the id * @param title * the title * @wbp.parser.constructor * @wbp.eval.method.parameter id "Some id" * @wbp.eval.method.parameter title "Some title" */ public CollisionFormPage(EntityFormEditor editor, String id, String title) { super(editor, id, title); this.entityFormEditor = editor; // Update with the new model when page changes editor.addPageChangedListener(new IPageChangedListener() { @Override public void pageChanged(PageChangedEvent event) { if (event.getSelectedPage().equals(CollisionFormPage.this)) { resetAll(); loadAnimationsFromModel(); // Edge case. Disable add/remove collision shape link if there are no // list view items if (animationListItems.size() == 0) { mghprlnkAdd.setEnabled(false); mghprlnkRem.setEnabled(false); setShapePropertiesState(false); } } } }); } /** * Reset all. */ private void resetAll() { animationListItems.clear(); tableViewer.refresh(); freeformLayeredPane.removeAll(); removeCollisionShape(); resetFramesComposite(); resetShapeProperties(); } /** * Reflect animations from model to screen. */ private void loadAnimationsFromModel() { Entity model = this.entityFormEditor.getModel(); for (EntityAnimation ea : model.getAnimationList()) { if (ea == null) continue; AnimationListViewItem alvi = new AnimationListViewItem(); alvi.setName(ea.getAnimationName()); alvi.setAnimation(ea); if (!ea.getSpritesheetFile().isEmpty()) { Image frameImage = ResourceManager.getImageOfRelativePath(ea.getSpritesheetFile().getResourceFile()); boolean containsSpriteshetItem = alvi.getAnimation().getSpritesheetItems().size() > 0; if (containsSpriteshetItem) { EntitySpritesheetItem esi = alvi.getAnimation().getSpritesheetItems().get(0); ImageData id = ResourceManager.extractImageFromBounds(frameImage.getImageData(), RectAdapter.swtRect(esi.getExtractBounds())); alvi.setCollisionPreviewFrame(ResourceManager.getImage(id)); } } addNewAnimation(alvi); } tableViewer.refresh(); table.select(0); handleAnimationListSeletionListener(); } /* * (non-Javadoc) * * @see org.eclipse.ui.forms.editor.FormPage#isDirty() */ @Override public boolean isDirty() { return dirty; } /** * Sets the dirty. * * @param dirty * the new dirty */ public void setDirty(boolean dirty) { this.dirty = dirty; } /** * Create contents of the form. * * @param managedForm * the managed form */ @Override protected void createFormContent(IManagedForm managedForm) { this.managedForm = managedForm; FormToolkit toolkit = managedForm.getToolkit(); ScrolledForm form = managedForm.getForm(); form.setText("Collision Shapes"); form.getToolBarManager().update(true); managedForm.getForm().getBody().setLayout(new FormLayout()); sctnFrames = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TITLE_BAR); FormData fd_sctnFrames = new FormData(); fd_sctnFrames.right = new FormAttachment(0, 605); fd_sctnFrames.bottom = new FormAttachment(100, -10); sctnFrames.setLayoutData(fd_sctnFrames); managedForm.getToolkit().paintBordersFor(sctnFrames); sctnFrames.setText("Set Collision Shape"); sctnFrames.setExpanded(true); sctnShapes = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TITLE_BAR); fd_sctnFrames.left = new FormAttachment(0, 297); FormData fd_sctnShapes = new FormData(); fd_sctnShapes.right = new FormAttachment(sctnFrames, -6); fd_sctnShapes.top = new FormAttachment(0, 12); sctnShapes.setLayoutData(fd_sctnShapes); managedForm.getToolkit().paintBordersFor(sctnShapes); sctnShapes.setText("Shapes"); sctnShapesComposite = managedForm.getToolkit().createComposite(sctnShapes, SWT.NONE); managedForm.getToolkit().paintBordersFor(sctnShapesComposite); sctnShapes.setClient(sctnShapesComposite); sctnShapesComposite.setLayout(new RowLayout(SWT.VERTICAL)); framesComposite = managedForm.getToolkit().createComposite(sctnFrames, SWT.NONE); managedForm.getToolkit().paintBordersFor(framesComposite); sctnFrames.setClient(framesComposite); framesComposite.setLayout(new FillLayout(SWT.HORIZONTAL)); figureCanvas = new FigureCanvas(framesComposite); freeformLayeredPane = new FreeformLayeredPane(); freeformLayeredPane.setLayoutManager(new FreeformLayout()); figureCanvas.setContents(freeformLayeredPane); managedForm.getToolkit().adapt(figureCanvas); managedForm.getToolkit().paintBordersFor(figureCanvas); sctnShapeProperties = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TITLE_BAR); fd_sctnFrames.top = new FormAttachment(sctnShapeProperties, 6); FormData fd_sctnShapeProperties = new FormData(); fd_sctnShapeProperties.right = new FormAttachment(0, 608); fd_sctnShapeProperties.top = new FormAttachment(0, 12); fd_sctnShapeProperties.left = new FormAttachment(0, 297); sctnShapeProperties.setLayoutData(fd_sctnShapeProperties); managedForm.getToolkit().paintBordersFor(sctnShapeProperties); sctnShapeProperties.setText("Properties"); sctnShapeProperties.setExpanded(true); Composite composite = managedForm.getToolkit().createComposite(sctnShapeProperties, SWT.NONE); managedForm.getToolkit().paintBordersFor(composite); sctnShapeProperties.setClient(composite); GridLayout gl_composite = new GridLayout(3, false); composite.setLayout(gl_composite); new Label(composite, SWT.NONE); Label lblX = managedForm.getToolkit().createLabel(composite, "X", SWT.NONE); txtX = new Spinner(composite, SWT.BORDER); txtX.setMinimum(-100); txtX.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { updateShapeDataToModel(); updateOutline(); } }); txtX.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); new Label(composite, SWT.NONE); Label lblY = managedForm.getToolkit().createLabel(composite, "Y", SWT.NONE); txtY = new Spinner(composite, SWT.BORDER); txtY.setMinimum(-100); txtY.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { updateShapeDataToModel(); updateOutline(); } }); GridData gd_txtY = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); gd_txtY.widthHint = 49; txtY.setLayoutData(gd_txtY); managedForm.getToolkit().adapt(txtY); managedForm.getToolkit().paintBordersFor(txtY); new Label(composite, SWT.NONE); Label lblWidth = managedForm.getToolkit().createLabel(composite, "Width", SWT.NONE); txtWidth = new Spinner(composite, SWT.BORDER); txtWidth.setMaximum(800); txtWidth.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); txtWidth.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { updateShapeDataToModel(); updateOutline(); } }); managedForm.getToolkit().adapt(txtWidth); managedForm.getToolkit().paintBordersFor(txtWidth); new Label(composite, SWT.NONE); Label lblHeight = new Label(composite, SWT.NONE); managedForm.getToolkit().adapt(lblHeight, true, true); lblHeight.setText("Height"); txtHeight = new Spinner(composite, SWT.BORDER); txtHeight.setMaximum(800); txtHeight.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); txtHeight.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent e) { updateShapeDataToModel(); updateOutline(); } }); managedForm.getToolkit().adapt(txtHeight); managedForm.getToolkit().paintBordersFor(txtHeight); Composite shapesTopClientComposite = managedForm.getToolkit().createComposite(sctnShapes, SWT.NONE); managedForm.getToolkit().paintBordersFor(shapesTopClientComposite); sctnShapes.setTextClient(shapesTopClientComposite); shapesTopClientComposite.setLayout(new RowLayout(SWT.HORIZONTAL)); shapesTopClientComposite.setBackground(null); mghprlnkAdd = managedForm.getToolkit().createImageHyperlink(shapesTopClientComposite, SWT.NONE); mghprlnkRem = managedForm.getToolkit().createImageHyperlink(shapesTopClientComposite, SWT.NONE); mghprlnkAdd.setBackground(null); mghprlnkAdd.addHyperlinkListener(new HyperlinkAdapter() { public void linkActivated(HyperlinkEvent e) { onClickAddCollisionShape(); } }); managedForm.getToolkit().paintBordersFor(mghprlnkAdd); mghprlnkAdd.setImage(SharedImages.ADD_ITEM_SMALL.createImage()); mghprlnkAdd.setText(""); mghprlnkRem.addHyperlinkListener(new HyperlinkAdapter() { public void linkActivated(HyperlinkEvent e) { removeCollisionShape(); dirty = true; entityFormEditor.editorDirtyStateChanged(); mghprlnkAdd.setEnabled(true); mghprlnkRem.setEnabled(false); } }); mghprlnkRem.setImage(SharedImages.REMOVE_ITEM_SMALL.createImage()); mghprlnkRem.setBackground(null); managedForm.getToolkit().paintBordersFor(mghprlnkRem); mghprlnkRem.setText(""); Section sctnAnimations = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TITLE_BAR); fd_sctnShapes.left = new FormAttachment(sctnAnimations, 6); fd_sctnShapes.bottom = new FormAttachment(sctnAnimations, 0, SWT.BOTTOM); FormData fd_sctnAnimations = new FormData(); fd_sctnAnimations.top = new FormAttachment(0, 12); fd_sctnAnimations.bottom = new FormAttachment(100, -10); fd_sctnAnimations.right = new FormAttachment(0, 170); fd_sctnAnimations.left = new FormAttachment(0, 10); sctnAnimations.setLayoutData(fd_sctnAnimations); managedForm.getToolkit().paintBordersFor(sctnAnimations); sctnAnimations.setText("Animations"); sctnAnimations.setExpanded(true); Composite composite_1 = managedForm.getToolkit().createComposite(sctnAnimations, SWT.NONE); managedForm.getToolkit().paintBordersFor(composite_1); sctnAnimations.setClient(composite_1); composite_1.setLayout(new FillLayout(SWT.HORIZONTAL)); tableViewer = new TableViewer(composite_1, SWT.BORDER | SWT.FULL_SELECTION); table = tableViewer.getTable(); managedForm.getToolkit().paintBordersFor(table); tableViewer.setLabelProvider(new AnimationTableLabelProvider()); tableViewer.setContentProvider(new AnimationTableContentProvider(animationListItems)); tableViewer.setInput(animationListItems); tableViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { handleAnimationListSeletionListener(); } }); toolkit.decorateFormHeading(form.getForm()); } /** * Sets the shape properties. * * @param ea * the new shape properties */ private void setShapeProperties(EntityAnimation ea) { /* Decode the vertex information and set to the screen */ List<Vector2> vertices = ea.getVertices(); if (vertices.isEmpty()) { resetShapeProperties(); return; } Vector2 v1 = vertices.get(0); Vector2 v2 = vertices.get(2).sub(v1); txtX.setSelection((int) v1.x); txtY.setSelection((int) v1.y); txtWidth.setSelection((int) v2.x); txtHeight.setSelection((int) v2.y); } /** * Calculate vertices of shape. * * @return the list */ private List<Vector2> calculateVerticesOfShape() { switch (collisionShape) { case BOX: case CIRCLE: Rectangle r = shapeTypeBoundingBox(); int widthVal = r.x + r.width; int heightVal = r.y + r.height; Vector2 v1 = new Vector2(r.x, r.y); Vector2 v2 = new Vector2(widthVal, r.y); Vector2 v3 = new Vector2(widthVal, heightVal); Vector2 v4 = new Vector2(r.x, heightVal); List<Vector2> vlist = new ArrayList<Vector2>(); vlist.add(v1); vlist.add(v2); vlist.add(v3); vlist.add(v4); return vlist; case CUSTOM: break; case NONE: break; default: break; } return null; } /** * Shape type bounding box. * * @return the rectangle */ private Rectangle shapeTypeBoundingBox() { int x = txtX.getSelection(); int y = txtY.getSelection(); int width = txtWidth.getSelection(); int height = txtHeight.getSelection(); return new Rectangle(x, y, width, height); } /** * Update shape data to model. */ protected void updateShapeDataToModel() { AnimationListViewItem alvi = selectedAnimationListItem(); alvi.getAnimation().setShapeType(collisionShape); alvi.getAnimation().setVertices(calculateVerticesOfShape()); // dirty = true; entityFormEditor.editorDirtyStateChanged(); } /** * Update outline. */ private void updateOutline() { AnimationListViewItem alvi = selectedAnimationListItem(); animationAndCollisionShapePreview(collisionShape, alvi.getCollisionPreviewFrame()); } /** * Reset frames composite. */ private void resetFramesComposite() { framesComposite.layout(true); } /** * Handle animation list seletion listener. */ private void handleAnimationListSeletionListener() { AnimationListViewItem alvi = selectedAnimationListItem(); if (alvi == null) { mghprlnkAdd.setEnabled(false); mghprlnkRem.setEnabled(false); return; } // preview animation at the end doPreview(alvi); // select appr. shape if (alvi.getAnimation().getShapeType() != null) { collisionShape = alvi.getAnimation().getShapeType(); if (collisionShape.isNone()) { removeCollisionShape(); resetShapeProperties(); mghprlnkAdd.setEnabled(true); mghprlnkRem.setEnabled(false); return; } showCollisionShape(collisionShape, alvi.getAnimation().getFixtureResourceFile()); setShapeProperties(alvi.getAnimation()); mghprlnkAdd.setEnabled(false); mghprlnkRem.setEnabled(true); if (!alvi.getAnimation().getSpritesheetFile().isEmpty()) { animationAndCollisionShapePreview(alvi.getAnimation().getShapeType(), alvi.getCollisionPreviewFrame()); } } else { removeCollisionShape(); resetShapeProperties(); mghprlnkAdd.setEnabled(true); mghprlnkRem.setEnabled(false); } } /** * Do preview. * * @param alvi the alvi */ private void doPreview(AnimationListViewItem alvi) { if (alvi.getAnimation() == null || alvi.getAnimation().getSpritesheetFile().isEmpty()) { return; } freeformLayeredPane.removeAll(); animationAndCollisionShapePreview(alvi.getAnimation().getShapeType(), alvi.getCollisionPreviewFrame()); } /** * Reset shape properties. */ private void resetShapeProperties() { txtX.setSelection(0); txtY.setSelection(0); txtWidth.setSelection(0); txtHeight.setSelection(0); } /** * Sets the shape properties state. * * @param state * the new shape properties state */ private void setShapePropertiesState(boolean state) { txtX.setEnabled(state); txtY.setEnabled(state); txtWidth.setEnabled(state); txtHeight.setEnabled(state); } /** * Selected animation list item. * * @return the animation list view item */ private AnimationListViewItem selectedAnimationListItem() { if (tableViewer.getSelection().isEmpty()) { return null; } AnimationListViewItem ai = (AnimationListViewItem) ((IStructuredSelection) tableViewer.getSelection()) .getFirstElement(); return ai; } /** * Adds the new animation. * * @param alvi * the alvi */ private void addNewAnimation(AnimationListViewItem alvi) { resetFramesComposite(); animationListItems.add(alvi); tableViewer.refresh(); } /** * Animation frame preview. * * @param colType the col type * @param frame the frame */ private void animationAndCollisionShapePreview(EntityCollisionType colType, Image frame) { freeformLayeredPane.removeAll(); ImageFigure iff = new ImageFigure(frame); iff.setBounds(new Rectangle(0, 0, frame.getBounds().width, frame.getBounds().height)); freeformLayeredPane.add(iff); switch (colType) { case BOX: rectangleFigure = new RectangleFigure(); rectangleFigure.setAlpha(120); rectangleFigure.setBounds(shapeTypeBoundingBox()); freeformLayeredPane.add(rectangleFigure); break; case CIRCLE: ellipseFigure = new Ellipse(); ellipseFigure.setAlpha(120); ellipseFigure.setBounds(shapeTypeBoundingBox()); freeformLayeredPane.add(ellipseFigure); break; case CUSTOM: break; case NONE: break; default: break; } } /** * Clear collision figure. */ private void clearCollisionFigure() { if (rectangleFigure != null) { if (freeformLayeredPane.getChildren().contains(rectangleFigure)) { freeformLayeredPane.remove(rectangleFigure); rectangleFigure = null; } } if (ellipseFigure != null) { if (freeformLayeredPane.getChildren().contains(ellipseFigure)) { freeformLayeredPane.remove(ellipseFigure); ellipseFigure = null; } } } /** * Removes the collision shape. */ protected void removeCollisionShape() { if (collisionShapeHyperLink != null) { collisionShapeHyperLink.dispose(); collisionShapeHyperLink = null; } collisionShape = EntityCollisionType.NONE; clearCollisionFigure(); sctnShapesComposite.layout(true); resetShapeProperties(); AnimationListViewItem alvi = selectedAnimationListItem(); if (alvi != null) { alvi.getAnimation().setShapeType(collisionShape); alvi.getAnimation().setVertices(new ArrayList<Vector2>()); alvi.getAnimation().setFixtureResourceFile(ResourceFile.create("", "")); } } /** * Adds the collision shape. * * @param _collisionShape * the _collision shape * @param physicsEditorFile * the physics editor file */ private void showCollisionShape(EntityCollisionType _collisionShape, ResourceFile physicsEditorFile) { if (collisionShapeHyperLink == null) { collisionShapeHyperLink = CollisionFormPage.this.managedForm.getToolkit().createImageHyperlink( sctnShapesComposite, SWT.NONE); } AnimationListViewItem alvi = selectedAnimationListItem(); EntityAnimation entityAnim = alvi.getAnimation(); entityAnim.setShapeType(_collisionShape); collisionShapeHyperLink.setText(collisionShape.name()); switch (_collisionShape) { case BOX: autoFillCollisionSize(alvi); collisionShapeHyperLink.setImage(SharedImages.BOX.createImage()); break; case CIRCLE: autoFillCollisionSize(alvi); collisionShapeHyperLink.setImage(SharedImages.CIRCLE.createImage()); break; case CUSTOM: collisionShapeHyperLink.setImage(SharedImages.PHYSICS_BODY_EDITOR_LOGO_SMALL.createImage()); IPath resFilePath = new Path(physicsEditorFile.getResourceFile()); boolean resourceFileExists = CGCProject.getInstance().exists(resFilePath, false); if (!resourceFileExists) { collisionShapeHyperLink.setText("File Missing"); } else { collisionShapeHyperLink.setText(resFilePath.lastSegment()); } break; case NONE: break; default: break; } doPreview(selectedAnimationListItem()); sctnShapesComposite.layout(true); } /** * Auto fill collision size. * * @param alvi the alvi */ private void autoFillCollisionSize(AnimationListViewItem alvi) { // If all of these are zero, then we auto fill if (alvi.getAnimation().getVertices().isEmpty()) { Image img = alvi.getCollisionPreviewFrame(); if (img == null) { return; } txtWidth.setSelection(img.getBounds().width); txtHeight.setSelection(img.getBounds().height); // updateShapeDataToModel(); } } /** * On click add collision shape. */ private void onClickAddCollisionShape() { CollisionShapeSelectionDialog cssd = new CollisionShapeSelectionDialog(getSite().getShell()); int resp = cssd.open(); if (resp == CollisionShapeSelectionDialog.CANCEL) { return; } collisionShape = cssd.getTypeSelected(); physEdFixtureFile = cssd.getPhsEdFixtureFile(); ResourceFile fixtureResFile = null; if (collisionShape.isCustom()) { fixtureResFile = ResourceFile.create(physEdFixtureFile.getFullPath().toOSString(), physEdFixtureFile .getLocation().toOSString()); selectedAnimationListItem().getAnimation().setFixtureResourceFile(fixtureResFile); } showCollisionShape(collisionShape, fixtureResFile); dirty = true; entityFormEditor.editorDirtyStateChanged(); mghprlnkAdd.setEnabled(false); mghprlnkRem.setEnabled(true); } }