/*
* 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 java.util.Queue;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
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.custom.ScrolledComposite;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
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.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IFileEditorInput;
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 org.eclipse.ui.part.FileEditorInput;
import com.laex.cg2d.entityeditor.EntityFormEditor;
import com.laex.cg2d.entityeditor.ui.AnimationPropertyChangeDialog;
import com.laex.cg2d.entityeditor.ui.ImportSpriteCompositeDelegate;
import com.laex.cg2d.entityeditor.ui.ImportSpritesComposite;
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.EntitySpritesheetItem;
import com.laex.cg2d.model.model.ResourceFile;
import com.laex.cg2d.model.resources.ResourceManager;
/**
* The Class AnimationFormPage.
*/
public class AnimationFormPage extends FormPage implements ImportSpriteCompositeDelegate, ControlListener {
/** The txt animation name. */
private Text txtAnimationName;
/** The managed form. */
private IManagedForm managedForm;
/** The sctn frames. */
private Section sctnFrames;
/** The table. */
private Table table;
/** The table viewer. */
private TableViewer tableViewer;
/** The btn list. */
private List<Button> btnList = new ArrayList<Button>();
/** The dirty. */
private boolean dirty = false;
/** The entity form editor. */
private EntityFormEditor entityFormEditor;
/** The btn default animation. */
private Button btnDefaultAnimation;
/** The mghprlnk add frames. */
private ImageHyperlink mghprlnkAddFrames;
/** The mghprlnk remove. */
private ImageHyperlink mghprlnkRemove;
/** The mghprlnk change animation name. */
private ImageHyperlink mghprlnkChangeAnimationName;
/** The lbl duration. */
private Label lblDuration;
/** The preview external. */
private ImageHyperlink mghprlnkPreviewExternal;
/** The export frames. */
private ImageHyperlink mghprlnkExportFrames;
/** The txt animation duration. */
private Text txtAnimationDuration;
/** The anim controller. */
private AnimationFormPageController animController = new AnimationFormPageController();
/** The scrolled composite. */
private ScrolledComposite scrolledComposite;
/** The frames composite. */
private Composite framesComposite;
/**
* The Enum UIState.
*/
enum UIState {
/** The None. */
None,
/** The Loading from model. */
LoadingFromModel,
/** The New animation. */
NewAnimation,
/** The Add frames. */
AddFrames,
/** The Selection changed. */
SelectionChanged
}
/** The mghprlnk remove frames. */
private ImageHyperlink mghprlnkRemoveFrames;
/** The row layout. */
private RowLayout rowLayout;
/**
* The Class ImportSpritesDialog.
*/
class ImportSpritesDialog extends TitleAreaDialog {
/** The sprites composite. */
private ImportSpritesComposite spritesComposite = null;
/**
* Instantiates a new import sprites dialog.
*
* @param parentShell the parent shell
*/
public ImportSpritesDialog(Shell parentShell) {
super(parentShell);
setShellStyle(SWT.BORDER | SWT.MAX | SWT.RESIZE);
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea(Composite parent) {
setTitle("Import Sprites from Spritesheet");
Composite area = (Composite) super.createDialogArea(parent);
Composite container = new Composite(area, SWT.NONE);
container.setLayout(new FillLayout(SWT.HORIZONTAL));
container.setLayoutData(new GridData(GridData.FILL_BOTH));
IFileEditorInput fe = (IFileEditorInput) getEditorInput();
spritesComposite = new ImportSpritesComposite(fe.getFile(), container, SWT.None);
spritesComposite.setDelegate(AnimationFormPage.this);
return spritesComposite;
}
/**
* Gets the sprites composite.
*
* @return the sprites composite
*/
public ImportSpritesComposite getSpritesComposite() {
return spritesComposite;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
// createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.TitleAreaDialog#getInitialSize()
*/
@Override
protected Point getInitialSize() {
return new Point(641, 447);
}
}
/**
* Create the form page.
*
* @param id
* the id
* @param title
* the title
*/
public AnimationFormPage(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 AnimationFormPage(EntityFormEditor editor, String id, String title) {
super(editor, id, title);
this.entityFormEditor = editor;
}
/**
* Update animations.
*/
private void loadAnimationsFromModel() {
Entity model = this.entityFormEditor.getModel();
for (EntityAnimation ea : model.getAnimationList()) {
if (ea == null)
continue;
animController.addAnimation(ea);
}
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("Animation");
Action ac = new Action("Add Animation") {
@Override
public void run() {
super.run();
onClickAddAnimation();
}
};
ac.setImageDescriptor(SharedImages.ADD_ITEM_2_SMALL);
form.getToolBarManager().add(ac);
form.getToolBarManager().update(true);
toolkit.decorateFormHeading(form.getForm());
managedForm.getForm().getBody().setLayout(new FormLayout());
Section sctnProperties = managedForm.getToolkit().createSection(managedForm.getForm().getBody(),
Section.TWISTIE | Section.TITLE_BAR);
FormData fd_sctnProperties = new FormData();
fd_sctnProperties.top = new FormAttachment(0, 11);
sctnProperties.setLayoutData(fd_sctnProperties);
managedForm.getToolkit().paintBordersFor(sctnProperties);
sctnProperties.setText("Properties");
sctnProperties.setExpanded(true);
Composite composite = managedForm.getToolkit().createComposite(sctnProperties, SWT.BORDER);
managedForm.getToolkit().paintBordersFor(composite);
sctnProperties.setClient(composite);
composite.setLayout(new GridLayout(2, false));
Label lblName = managedForm.getToolkit().createLabel(composite, "Name", SWT.NONE);
txtAnimationName = managedForm.getToolkit().createText(composite, "New Text", SWT.NONE);
txtAnimationName.setEditable(false);
txtAnimationName.setText("");
txtAnimationName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
lblDuration = new Label(composite, SWT.NONE);
lblDuration.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
managedForm.getToolkit().adapt(lblDuration, true, true);
lblDuration.setText("Duration");
txtAnimationDuration = new Text(composite, SWT.BORDER);
txtAnimationDuration.setEditable(false);
txtAnimationDuration.setText("0.05");
txtAnimationDuration.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
managedForm.getToolkit().adapt(txtAnimationDuration, true, true);
Label lblDefault = managedForm.getToolkit().createLabel(composite, "Default", SWT.NONE);
btnDefaultAnimation = new Button(composite, SWT.CHECK);
btnDefaultAnimation.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
AnimationListViewItem alvi = selectedAnimationListItem();
if (alvi != null) {
animController.defaultAnimationChanged(alvi, btnDefaultAnimation.getSelection());
editorDirtyChanged();
}
}
});
btnDefaultAnimation.setText("Is this the default animation for this entity ?");
managedForm.getToolkit().adapt(btnDefaultAnimation, true, true);
mghprlnkChangeAnimationName = managedForm.getToolkit().createImageHyperlink(sctnProperties, SWT.NONE);
mghprlnkChangeAnimationName.setToolTipText("Edit Properties");
mghprlnkChangeAnimationName.setBackground(null);
mghprlnkChangeAnimationName.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
onEditAnimationProperties();
}
});
mghprlnkChangeAnimationName.setImage(SharedImages.CHANGE_ITEM_SMALL.createImage());
managedForm.getToolkit().paintBordersFor(mghprlnkChangeAnimationName);
sctnProperties.setTextClient(mghprlnkChangeAnimationName);
mghprlnkChangeAnimationName.setText("");
mghprlnkChangeAnimationName.setEnabled(false);
Section sctnAnimations = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TITLE_BAR);
fd_sctnProperties.right = new FormAttachment(sctnAnimations, 559, SWT.RIGHT);
fd_sctnProperties.left = new FormAttachment(sctnAnimations, 6);
FormData fd_sctnAnimations = new FormData();
fd_sctnAnimations.top = new FormAttachment(0, 10);
fd_sctnAnimations.bottom = new FormAttachment(100, -10);
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);
mghprlnkRemove = managedForm.getToolkit().createImageHyperlink(sctnAnimations, SWT.NONE);
mghprlnkRemove.setToolTipText("Remove Animation");
mghprlnkRemove.setBackground(null);
mghprlnkRemove.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
MessageBox mb = new MessageBox(getSite().getShell(), SWT.YES | SWT.NO);
mb.setMessage("Are you sure you want to remove the selected animation? This will affect all the places this animation is used.");
int resp = mb.open();
if (resp == SWT.NO) {
return;
}
onClickRemoveSelectedAnimation();
}
});
mghprlnkRemove.setImage(SharedImages.REMOVE_ITEM_SMALL.createImage());
managedForm.getToolkit().paintBordersFor(mghprlnkRemove);
sctnAnimations.setTextClient(mghprlnkRemove);
tableViewer.setLabelProvider(new AnimationTableLabelProvider());
tableViewer.setContentProvider(new AnimationTableContentProvider(animController.getAnimations()));
tableViewer.setInput(animController.getAnimations());
tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
handleAnimationListSeletionListener();
}
});
sctnFrames = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TITLE_BAR);
FormData fd_sctnFrames = new FormData();
fd_sctnFrames.bottom = new FormAttachment(sctnProperties, 400, SWT.BOTTOM);
fd_sctnFrames.top = new FormAttachment(sctnProperties, 6);
fd_sctnFrames.right = new FormAttachment(sctnProperties, 553);
fd_sctnFrames.left = new FormAttachment(sctnProperties, 0, SWT.LEFT);
sctnFrames.setLayoutData(fd_sctnFrames);
managedForm.getToolkit().paintBordersFor(sctnFrames);
sctnFrames.setText("Frames");
Composite comp = managedForm.getToolkit().createComposite(sctnFrames);
comp.setBackground(null);
sctnFrames.setTextClient(comp);
comp.setLayout(new RowLayout(SWT.HORIZONTAL));
mghprlnkAddFrames = managedForm.getToolkit().createImageHyperlink(comp, SWT.NONE);
mghprlnkAddFrames.setToolTipText("Add Frames");
mghprlnkAddFrames.setBackground(null);
mghprlnkAddFrames.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
onClickAddFrames();
}
});
mghprlnkAddFrames.setImage(SharedImages.ADD_ITEM_SMALL.createImage());
managedForm.getToolkit().paintBordersFor(mghprlnkAddFrames);
mghprlnkRemoveFrames = managedForm.getToolkit().createImageHyperlink(comp, SWT.NONE);
mghprlnkRemoveFrames.setToolTipText("Remove unmarked Frames");
mghprlnkRemoveFrames.setBackground(null);
mghprlnkRemoveFrames.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
onClickRemoveUnmarkedFrames();
}
});
mghprlnkRemoveFrames.setImage(SharedImages.REMOVE_ITEM_SMALL.createImage());
managedForm.getToolkit().paintBordersFor(mghprlnkRemoveFrames);
mghprlnkPreviewExternal = managedForm.getToolkit().createImageHyperlink(comp, SWT.NONE);
mghprlnkPreviewExternal.setEnabled(false);
mghprlnkPreviewExternal.setToolTipText("Preview Animation");
managedForm.getToolkit().paintBordersFor(mghprlnkPreviewExternal);
mghprlnkPreviewExternal.setBackground(null);
mghprlnkPreviewExternal.setImage(SharedImages.RENDER.createImage());
mghprlnkPreviewExternal.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
onClickPreviewExternal();
}
});
mghprlnkExportFrames = managedForm.getToolkit().createImageHyperlink(comp, SWT.NONE);
mghprlnkExportFrames.setEnabled(false);
mghprlnkExportFrames.setToolTipText("Export Frames");
managedForm.getToolkit().paintBordersFor(mghprlnkPreviewExternal);
mghprlnkExportFrames.setBackground(null);
mghprlnkExportFrames.setImage(SharedImages.PNG_EXPORT.createImage());
mghprlnkExportFrames.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
onClickExportFrames();
}
});
Composite composite_2 = managedForm.getToolkit().createComposite(sctnFrames, SWT.NONE);
managedForm.getToolkit().paintBordersFor(composite_2);
sctnFrames.setClient(composite_2);
composite_2.setLayout(new FillLayout(SWT.HORIZONTAL));
scrolledComposite = new ScrolledComposite(composite_2, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
managedForm.getToolkit().adapt(scrolledComposite);
managedForm.getToolkit().paintBordersFor(scrolledComposite);
scrolledComposite.setExpandHorizontal(true);
scrolledComposite.setExpandVertical(true);
framesComposite = managedForm.getToolkit().createComposite(scrolledComposite, SWT.None);
managedForm.getToolkit().paintBordersFor(framesComposite);
rowLayout = new RowLayout(SWT.HORIZONTAL);
framesComposite.setLayout(rowLayout);
scrolledComposite.setContent(framesComposite);
scrolledComposite.setMinSize(framesComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
// load animations from mode
loadAnimationsFromModel();
if (animController.animationsCount() == 0) {
disableUIState();
}
}
/**
* On click remove unmarked frames.
*/
private void onClickRemoveUnmarkedFrames() {
int i = 0, size = btnList.size();
/*
* While removing buttons, the size of the btnList will change. So instead
* of using For loop, we use this while loop to ensure we remove all the
* unmarked frames.
*/
while (i < size) {
Button b = btnList.get(i);
if (b.getData() == null) {
removeSpriteButton(b);
i = 0;
size = btnList.size();
continue;
}
size = btnList.size();
i++;
}
if (btnList.size() <= 0) {
animController.spritesheetImageFileChanged(selectedAnimationListItem(), ResourceFile.EMPTY);
}
toggleFramesCompositeState();
}
/**
* Removes the selected animation.
*/
private void onClickRemoveSelectedAnimation() {
AnimationListViewItem alvi = selectedAnimationListItem();
animController.removeAnimation(alvi);
// sync with the model
entityFormEditor.getModel().getAnimationList().remove(alvi.getAnimation());
editorDirtyChanged();
tableViewer.refresh();
// select
table.select(animController.getAnimations().size() - 1);
handleAnimationListSeletionListener();
if (animController.animationsCount() == 0) {
clearSpriteButtons();
resetFramesComposite();
disableUIState();
}
}
/**
* Reset ui.
*/
private void disableUIState() {
txtAnimationName.setText("");
txtAnimationDuration.setEnabled(false);
mghprlnkAddFrames.setEnabled(false);
mghprlnkChangeAnimationName.setEnabled(false);
btnDefaultAnimation.setSelection(false);
btnDefaultAnimation.setEnabled(false);
mghprlnkRemove.setEnabled(false);
toggleFramesCompositeState();
resetFramesComposite();
}
/**
* Reset frames composite.
*/
private void resetFramesComposite() {
framesComposite.layout(true);
setupFramesCompositeScrolling(SWT.DEFAULT);
}
/**
* Clear sprite buttons.
*/
private void clearSpriteButtons() {
for (int i = 0; i < btnList.size(); i++) {
btnList.get(i).dispose();
}
btnList.clear();
}
/**
* Handle animation list seletion listener.
*/
private void handleAnimationListSeletionListener() {
AnimationListViewItem alvi = selectedAnimationListItem();
if (alvi == null) {
return;
}
mghprlnkAddFrames.setEnabled(true);
mghprlnkChangeAnimationName.setEnabled(true);
clearSpriteButtons();
resetFramesComposite();
txtAnimationName.setText(alvi.getName());
txtAnimationDuration.setText(String.valueOf(alvi.getAnimation().getAnimationDuration()));
btnDefaultAnimation.setSelection(alvi.getAnimation().isDefaultAnimation());
EntityAnimation ea = alvi.getAnimation();
if (ea.getSpritesheetFile().isEmpty()) {
return;
}
/* Load images based on frame indices */
Image frameImage = ResourceManager.getImageOfRelativePath(ea.getSpritesheetFile().getResourceFile());
for (EntitySpritesheetItem esi : ea.getSpritesheetItems()) {
ImageData e = ResourceManager.extractImageFromBounds(frameImage.getImageData(),
RectAdapter.swtRect(esi.getExtractBounds()));
addSpriteFrame(ResourceManager.getImage(e), esi.getFrameIndex(), esi);
}
toggleFramesCompositeState();
setRowLayout();
}
/**
* Toggle frames composite state.
*/
private void toggleFramesCompositeState() {
boolean state = btnList.isEmpty() ? false : true;
mghprlnkRemoveFrames.setEnabled(state);
mghprlnkExportFrames.setEnabled(state);
mghprlnkPreviewExternal.setEnabled(state);
setRowLayout();
}
/**
* 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
* @param index
* the index
*/
private void updateUIOnNewAnimationAdd(AnimationListViewItem alvi, int index) {
clearSpriteButtons();
resetFramesComposite();
tableViewer.refresh();
// select the recently created object
table.select(index);
handleAnimationListSeletionListener();
mghprlnkAddFrames.setEnabled(true);
mghprlnkChangeAnimationName.setEnabled(true);
txtAnimationDuration.setEnabled(true);
mghprlnkRemove.setEnabled(true);
btnDefaultAnimation.setEnabled(true);
}
/**
* Sets the up frames composite scrolling.
*
* @param heightHint the new up frames composite scrolling
*/
private void setupFramesCompositeScrolling(int heightHint) {
/* heightHint is unused for now */
int height = 0;
for (Button b : btnList) {
Point p = b.computeSize(SWT.DEFAULT, SWT.DEFAULT);
height += p.y;
}
scrolledComposite.setMinHeight(height);
framesComposite.layout(true);
}
/**
* Adds the group frame to frames composite.
*
* @param extractImage the extract image
* @param frameIndex the frame index
* @param customData the custom data
*/
private void addSpriteFrame(Image extractImage, int frameIndex, Object customData) {
final Button btn = managedForm.getToolkit().createButton(framesComposite, "", SWT.None);
btn.setToolTipText(String.valueOf(frameIndex));
btn.setImage(extractImage);
/*
* Set custom data that may be used later while computing frame indices of
* entity spritesheet items
*/
if (customData != null)
btn.setData(String.valueOf(frameIndex), customData);
btn.addPaintListener(new PaintListener() {
@Override
public void paintControl(PaintEvent e) {
if (btn.getData() != null) {
e.gc.setBackground(ColorConstants.button);
e.gc.drawText(btn.getToolTipText(), 5, 1);
}
}
});
btn.addMouseListener(new MouseAdapter() {
@Override
public void mouseDoubleClick(MouseEvent e) {
removeSpriteButton(btn);
}
@Override
public void mouseUp(MouseEvent e) {
Object customData = btn.getData();
if (customData == null) {
btn.setData(btn.getToolTipText());
} else {
btn.setData(null);
}
framesComposite.layout(true);
}
});
btnList.add(btn);
}
/**
* Adds the new frames to animation.
*/
private void onClickAddFrames() {
ImportSpritesDialog isd = new ImportSpritesDialog(getSite().getShell());
int retval = isd.open();
if (retval == TitleAreaDialog.CANCEL) {
return;
}
}
/**
* Editor dirty changed.
*/
private void editorDirtyChanged() {
dirty = true;
entityFormEditor.editorDirtyStateChanged();
}
/**
* On edit animation properties.
*/
private void onEditAnimationProperties() {
AnimationPropertyChangeDialog stcd = new AnimationPropertyChangeDialog(getSite().getShell(),
txtAnimationName.getText(), txtAnimationDuration.getText());
int resp = stcd.open();
if (resp == AnimationPropertyChangeDialog.CANCEL) {
return;
}
txtAnimationName.setText(stcd.getName());
txtAnimationDuration.setText(stcd.getAnimationDuration());
animController.animationNameChange(selectedAnimationListItem(), stcd.getName(), stcd.getAnimationDuration());
editorDirtyChanged();
tableViewer.refresh();
}
/**
* On click add animation.
*/
private void onClickAddAnimation() {
AnimationListViewItem alvi = animController.createEmptyAnimation();
updateUIOnNewAnimationAdd(alvi, animController.indexOf(alvi));
entityFormEditor.getModel().addEntityAnimation(alvi.getAnimation());
editorDirtyChanged();
}
/**
* Removes the sprite button.
*
* @param btn the btn
*/
private void removeSpriteButton(final Button btn) {
Object spritesheetItemData = btn.getData(btn.getToolTipText());
btn.dispose();
btnList.remove(btn);
framesComposite.layout(true);
AnimationListViewItem alvi = selectedAnimationListItem();
/* Is this an entitty spritesheet item ? */
if (spritesheetItemData != null) {
animController.removeSpritesheetItem(alvi, (EntitySpritesheetItem) spritesheetItemData);
}
editorDirtyChanged();
}
/**
* On click preview external.
*/
private void onClickPreviewExternal() {
FileEditorInput fe = (FileEditorInput) getEditorInput();
animController.previewAnimationExternal(selectedAnimationListItem().getAnimation(), fe.getFile().getLocation()
.makeAbsolute().toOSString());
}
/**
* On click export frames.
*/
private void onClickExportFrames() {
DirectoryDialog dd = new DirectoryDialog(getSite().getShell());
final String dirc = dd.open();
if (dirc == null) {
return;
}
final List<Image> imgList = new ArrayList<Image>();
for (Button b : btnList) {
imgList.add(b.getImage());
}
final String animName = selectedAnimationListItem().getName();
Job job = new Job("Export frames") {
@Override
protected IStatus run(IProgressMonitor monitor) {
animController.exportFrames(animName, imgList, new Path(dirc), monitor);
return Status.OK_STATUS;
}
};
job.setSystem(false);
job.schedule();
}
/* (non-Javadoc)
* @see com.laex.cg2d.entityeditor.ui.ImportSpriteCompositeDelegate#spriteExtractionComplete(com.laex.cg2d.model.model.ResourceFile, com.laex.cg2d.model.model.ResourceFile, java.util.List, java.util.Queue)
*/
@Override
public void spriteExtractionComplete(ResourceFile spritesheetFile, ResourceFile spritesheetJsonFile,
List<EntitySpritesheetItem> spritesheetItems, Queue<Image> extractedImages) {
clearSpriteButtons();
AnimationListViewItem alvi = selectedAnimationListItem();
animController.spritesheetImageFileChanged(alvi, spritesheetFile);
for (int i = 0; i < spritesheetItems.size(); i++) {
Image img = extractedImages.poll();
EntitySpritesheetItem esi = spritesheetItems.get(i);
/* esi is our custom data for this */
addSpriteFrame(img, i, esi);
}
animController.spritesheetItemsChanged(alvi, spritesheetJsonFile, spritesheetItems);
// Reset ui
toggleFramesCompositeState();
setRowLayout();
editorDirtyChanged();
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ControlListener#controlMoved(org.eclipse.swt.events.ControlEvent)
*/
@Override
public void controlMoved(ControlEvent e) {
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ControlListener#controlResized(org.eclipse.swt.events.ControlEvent)
*/
@Override
public void controlResized(ControlEvent e) {
Rectangle r = scrolledComposite.getClientArea();
scrolledComposite.setMinSize(framesComposite.computeSize(r.width, SWT.DEFAULT));
}
/**
* Sets the row layout.
*/
private void setRowLayout() {
/*
* Row Layout on EntComposite should be set once all the components have
* been created
*/
RowLayout rl = new RowLayout(SWT.HORIZONTAL);
rl.wrap = true;
// framesComposite.setLayout(rl);
// framesComposite.layout(true);
scrolledComposite.setContent(framesComposite);
Rectangle r = scrolledComposite.getClientArea();
scrolledComposite.setMinSize(framesComposite.computeSize(r.width, SWT.DEFAULT));
scrolledComposite.removeControlListener(this);
scrolledComposite.addControlListener(this);
}
}