/* * Copyright (C) 2021-2024 JPEXS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.jpexs.decompiler.flash.gui.action; import com.jpexs.decompiler.flash.ReadOnlyTagList; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.gui.AppDialog; import com.jpexs.decompiler.flash.gui.FasterScrollPane; import com.jpexs.decompiler.flash.gui.Main; import com.jpexs.decompiler.flash.gui.MainPanel; import com.jpexs.decompiler.flash.gui.PreviewPanel; import com.jpexs.decompiler.flash.gui.TimelinedMaker; import com.jpexs.decompiler.flash.gui.View; import com.jpexs.decompiler.flash.tags.DefineButton2Tag; import com.jpexs.decompiler.flash.tags.DefineSpriteTag; import com.jpexs.decompiler.flash.tags.DoActionTag; import com.jpexs.decompiler.flash.tags.DoInitActionTag; import com.jpexs.decompiler.flash.tags.ExportAssetsTag; import com.jpexs.decompiler.flash.tags.ShowFrameTag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.tags.base.PlaceObjectTypeTag; import com.jpexs.decompiler.flash.timeline.Timelined; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.List; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.DefaultListCellRenderer; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.ListSelectionModel; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.TreeSelectionEvent; import javax.swing.plaf.basic.BasicLabelUI; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; /** * @author JPEXS */ public class AddScriptDialog extends AppDialog { private final JButton okButton = new JButton(translate("button.ok")); private final JButton cancelButton = new JButton(translate("button.cancel")); private JTextField frameTextField; private JTextField spriteFrameTextField; private PreviewPanel framePreviewPanel; private PreviewPanel spriteFramePreviewPanel; private PreviewPanel spriteInitPreviewPanel; private PreviewPanel buttonPreviewPanel; private PreviewPanel instancePreviewPanel; private JList spriteInitList; private JTextField classNameTextField; private JTree instanceTree; private JTree spriteFrameTree; private JList buttonList; private JList frameList; private int frame = -1; private int result = ERROR_OPTION; private final JPanel centerPanel; public static final int TYPE_FRAME = 0; public static final int TYPE_SPRITE_FRAME = 1; public static final int TYPE_SPRITE_INIT = 2; public static final int TYPE_BUTTON_EVENT = 3; public static final int TYPE_INSTANCE_EVENT = 4; public static final int TYPE_CLASS = 5; private final SWF swf; private final JComboBox typeComboBox; private List existingClasses = new ArrayList<>(); private List spriteIdsWithDoInitAction; private boolean createClassSet = false; private final JPanel classPanel; private final JPanel topPanel; public AddScriptDialog(Window owner, SWF swf) { super(owner); setDefaultCloseOperation(HIDE_ON_CLOSE); setTitle(translate("dialog.title")); this.swf = swf; ReadOnlyTagList tags = swf.getTags(); final String PACKAGES = "__Packages."; for (Tag t : tags) { if (t instanceof ExportAssetsTag) { ExportAssetsTag ea = (ExportAssetsTag) t; for (String n : ea.names) { if (n.startsWith(PACKAGES)) { existingClasses.add(n.substring(PACKAGES.length())); } } } } Container cnt = getContentPane(); cnt.setLayout(new BorderLayout()); JPanel panButtons = new JPanel(new FlowLayout()); okButton.addActionListener(this::okButtonActionPerformed); cancelButton.addActionListener(this::cancelButtonActionPerformed); panButtons.add(okButton); panButtons.add(cancelButton); topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); JLabel typeLabel = new JLabel(translate("type")); typeComboBox = new JComboBox<>(new String[]{ translate("type.frame"), translate("type.sprite.frame"), translate("type.sprite.init"), translate("type.button.event"), translate("type.instance.event"), translate("type.class") }); typeComboBox.addActionListener(this::typeChangedActionPerformed); typeLabel.setLabelFor(typeComboBox); topPanel.add(typeLabel); topPanel.add(typeComboBox); cnt.add(topPanel, BorderLayout.NORTH); DocumentListener checkEnabledDocumentListener = new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { updateFrames(); checkEnabled(); } @Override public void removeUpdate(DocumentEvent e) { updateFrames(); checkEnabled(); } @Override public void changedUpdate(DocumentEvent e) { updateFrames(); checkEnabled(); } }; centerPanel = new JPanel(new CardLayout()); centerPanel.add(createFramePanel(checkEnabledDocumentListener), "" + TYPE_FRAME); centerPanel.add(createSpriteFramePanel(checkEnabledDocumentListener), "" + TYPE_SPRITE_FRAME); centerPanel.add(createSpriteInitPanel(), "" + TYPE_SPRITE_INIT); centerPanel.add(createButtonPanel(), "" + TYPE_BUTTON_EVENT); centerPanel.add(createInstancePanel(), "" + TYPE_INSTANCE_EVENT); centerPanel.add(classPanel = createClassPanel(), "" + TYPE_CLASS); cnt.add(centerPanel, BorderLayout.CENTER); cnt.add(panButtons, BorderLayout.SOUTH); setSize(900, 600); setModal(true); setResizable(true); View.setWindowIcon(this, "scriptadd"); View.centerScreen(this); checkEnabled(); addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent e) { if (createClassSet) { classNameTextField.requestFocusInWindow(); } } }); } public void setCreateClassOnly(String prefillClassName) { setTitle(translate("dialog.title.combined").replace("%title%", translate("dialog.title")).replace("%type%", translate("type.class"))); typeComboBox.setSelectedIndex(5); centerPanel.removeAll(); centerPanel.add(classPanel, "" + TYPE_CLASS); ((CardLayout) centerPanel.getLayout()).show(centerPanel, "" + TYPE_CLASS); topPanel.setVisible(false); pack(); classNameTextField.setText(prefillClassName); classNameTextField.setSelectionStart(prefillClassName.length()); createClassSet = true; checkEnabled(); View.centerScreen(this); } private JPanel createFramePanel(DocumentListener checkEnabledDocumentListener) { JPanel frameNumPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); JLabel frameLabel = new JLabel(translate("framenum")); frameTextField = new JTextField(4); frameTextField.addActionListener(this::okButtonActionPerformed); frameTextField.getDocument().addDocumentListener(checkEnabledDocumentListener); frameLabel.setLabelFor(frameTextField); frameNumPanel.add(frameLabel); frameNumPanel.add(frameTextField); List frames = new ArrayList<>(); int f = 1; boolean hasScript = false; for (Tag t : swf.getTags()) { if (t instanceof DoActionTag) { //It is no longer a problem to have more than single DoAction //hasScript = true; } if (t instanceof ShowFrameTag) { MyFrame myf = new MyFrame(f); myf.setInvalid(hasScript); frames.add(myf); f++; hasScript = false; } } MyFrame[] framesArr = frames.toArray(new MyFrame[frames.size()]); frameList = new JList<>(framesArr); final ImageIcon frameIcon = View.getIcon("frame16"); final ImageIcon frameInvalidIcon = View.getIcon("frameinvalid16"); if (View.isOceanic()) { frameList.setBackground(Color.white); } frameList.setCellRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component renderer = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (renderer instanceof JLabel) { if (((MyFrame) value).isInvalid()) { ((JLabel) renderer).setIcon(frameInvalidIcon); } else { ((JLabel) renderer).setIcon(frameIcon); } } return renderer; } }); frameList.addListSelectionListener(this::frameValueChanged); frameList.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); framePreviewPanel = new PreviewPanel(Main.getMainFrame().getPanel()); framePreviewPanel.setReadOnly(true); framePreviewPanel.setPreferredSize(new Dimension(300, 1)); framePreviewPanel.showEmpty(); JPanel framePanel = new JPanel(new BorderLayout()); JScrollPane frameListScrollPane = new FasterScrollPane(frameList); frameListScrollPane.setMinimumSize(new Dimension(400, 1)); JSplitPane frameSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, frameListScrollPane, framePreviewPanel); frameSplitPane.setDividerLocation(400); framePanel.add(frameSplitPane, BorderLayout.CENTER); framePanel.add(frameNumPanel, BorderLayout.NORTH); return framePanel; } private void populateSpriteNodes(MyTreeNode root, Timelined tim) { for (Tag t : tim.getTags()) { if (t instanceof DefineSpriteTag) { MyTreeNode sprite = new MyTreeNode(); sprite.setParent(root); sprite.setData(t); DefineSpriteTag s = (DefineSpriteTag) t; int f = 1; boolean hasScript = false; for (Tag t2 : s.getTags()) { if (t2 instanceof DoActionTag) { //It is no longer a problem to have more than single DoAction //hasScript = true; } if (t2 instanceof ShowFrameTag) { MyTreeNode frameNode = new MyTreeNode(); MyFrame myf = new MyFrame(f); myf.setInvalid(hasScript); frameNode.setData(myf); frameNode.setParent(sprite); sprite.addChild(frameNode); f++; hasScript = false; } } if (sprite.getChildCount() > 0) { root.addChild(sprite); } } } } private JPanel createSpriteInitPanel() { spriteInitPreviewPanel = new PreviewPanel(Main.getMainFrame().getPanel()); spriteInitPreviewPanel.setReadOnly(true); spriteInitPreviewPanel.setPreferredSize(new Dimension(300, 1)); spriteInitPreviewPanel.showEmpty(); spriteInitPreviewPanel.setParametersPanelVisible(false); List sprites = new ArrayList<>(); ReadOnlyTagList tags = swf.getTags(); spriteIdsWithDoInitAction = new ArrayList<>(); for (Tag t : tags) { if (t instanceof DoInitActionTag) { spriteIdsWithDoInitAction.add(((DoInitActionTag) t).spriteId); } if (t instanceof DefineSpriteTag) { sprites.add((DefineSpriteTag) t); } } spriteInitList = new JList<>(sprites.toArray(new DefineSpriteTag[sprites.size()])); final ImageIcon spriteIcon = View.getIcon("sprite16"); final ImageIcon spriteInvalidIcon = View.getIcon("spriteinvalid16"); if (View.isOceanic()) { spriteInitList.setBackground(Color.white); } spriteInitList.setCellRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component renderer = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (renderer instanceof JLabel) { if (spriteIdsWithDoInitAction.contains(((DefineSpriteTag) value).spriteId)) { ((JLabel) renderer).setIcon(spriteInvalidIcon); } else { ((JLabel) renderer).setIcon(spriteIcon); } } return renderer; } }); spriteInitList.addListSelectionListener(this::spriteInitValueChanged); JScrollPane spriteInitListScrollPane = new FasterScrollPane(spriteInitList); //spriteTreeScrollPane.setMinimumSize(new Dimension(400, 1)); JSplitPane spriteInitSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, spriteInitListScrollPane, spriteInitPreviewPanel); spriteInitSplitPane.setDividerLocation(400); JPanel spriteInitPanel = new JPanel(new BorderLayout()); spriteInitPanel.add(spriteInitSplitPane, BorderLayout.CENTER); return spriteInitPanel; } private JPanel createSpriteFramePanel(DocumentListener documentListener) { JPanel spriteFramePanel = new JPanel(new BorderLayout()); JLabel spriteFrameLabel = new JLabel(translate("framenum")); spriteFrameTextField = new JTextField(4); spriteFrameTextField.addActionListener(this::okButtonActionPerformed); spriteFrameTextField.addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent e) { checkEnabled(); } }); spriteFrameTextField.getDocument().addDocumentListener(documentListener); MyTreeNode root = new MyTreeNode(); root.setData("root"); populateSpriteNodes(root, swf); spriteFrameTree = new JTree(root); final ImageIcon spriteIcon = View.getIcon("sprite16"); final ImageIcon frameIcon = View.getIcon("frame16"); final ImageIcon frameInvalidIcon = View.getIcon("frameinvalid16"); spriteFrameTree.setCellRenderer(new DefaultTreeCellRenderer() { { if (View.isOceanic()) { setUI(new BasicLabelUI()); setOpaque(false); setBackgroundNonSelectionColor(Color.white); } } @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { Component renderer = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); if (renderer instanceof JLabel) { JLabel lab = (JLabel) renderer; Object subValue = value; if (value instanceof MyTreeNode) { subValue = ((MyTreeNode) value).getData(); } if (subValue instanceof DefineSpriteTag) { lab.setIcon(spriteIcon); } else if (subValue instanceof MyFrame) { if (((MyFrame) subValue).isInvalid()) { lab.setIcon(frameInvalidIcon); } else { lab.setIcon(frameIcon); } } } return renderer; } }); if (View.isOceanic()) { spriteFrameTree.setBackground(Color.white); } spriteFrameTree.setRootVisible(false); spriteFrameTree.setShowsRootHandles(true); spriteFrameTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); spriteFrameTree.addTreeSelectionListener(this::spriteValueChanged); //spriteTree.setPreferredSize(new Dimension(500, 1)); spriteFrameLabel.setLabelFor(spriteFrameTextField); JPanel spriteFrameTopPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); spriteFrameTopPanel.add(spriteFrameLabel); spriteFrameTopPanel.add(spriteFrameTextField); spriteFramePanel.add(spriteFrameTopPanel, BorderLayout.NORTH); spriteFramePreviewPanel = new PreviewPanel(Main.getMainFrame().getPanel()); spriteFramePreviewPanel.setReadOnly(true); spriteFramePreviewPanel.setPreferredSize(new Dimension(300, 1)); spriteFramePreviewPanel.showEmpty(); spriteFramePreviewPanel.setParametersPanelVisible(false); JScrollPane spriteFrameTreeScrollPane = new FasterScrollPane(spriteFrameTree); //spriteTreeScrollPane.setMinimumSize(new Dimension(400, 1)); JSplitPane spriteFrameSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, spriteFrameTreeScrollPane, spriteFramePreviewPanel); spriteFrameSplitPane.setDividerLocation(400); spriteFramePanel.add(spriteFrameSplitPane, BorderLayout.CENTER); return spriteFramePanel; } private JPanel createButtonPanel() { List buttons = new ArrayList<>(); for (Tag t : swf.getTags()) { if (t instanceof DefineButton2Tag) { buttons.add((DefineButton2Tag) t); } } buttonList = new JList<>(buttons.toArray(new DefineButton2Tag[buttons.size()])); final ImageIcon buttonIcon = View.getIcon("button16"); if (View.isOceanic()) { buttonList.setBackground(Color.white); } buttonList.setCellRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component renderer = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (renderer instanceof JLabel) { ((JLabel) renderer).setIcon(buttonIcon); } return renderer; } }); buttonList.addListSelectionListener(this::buttonValueChanged); buttonList.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); buttonPreviewPanel = new PreviewPanel(Main.getMainFrame().getPanel()); buttonPreviewPanel.setReadOnly(true); buttonPreviewPanel.setPreferredSize(new Dimension(300, 1)); buttonPreviewPanel.showEmpty(); JPanel buttonPanel = new JPanel(new BorderLayout()); JScrollPane buttonListScrollPane = new FasterScrollPane(buttonList); buttonListScrollPane.setMinimumSize(new Dimension(400, 1)); JSplitPane buttonSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, buttonListScrollPane, buttonPreviewPanel); buttonSplitPane.setDividerLocation(400); buttonPanel.add(buttonSplitPane, BorderLayout.CENTER); return buttonPanel; } private static class MyTreeNode implements TreeNode { private final List children = new ArrayList<>(); private TreeNode parent; private Object data; @Override public String toString() { return data.toString(); } public void setData(Object data) { this.data = data; } public Object getData() { return data; } public void addChild(TreeNode node) { children.add(node); } public void setParent(TreeNode parent) { this.parent = parent; } @Override public TreeNode getChildAt(int childIndex) { return children.get(childIndex); } @Override public int getChildCount() { return children.size(); } @Override public TreeNode getParent() { return parent; } @Override public int getIndex(TreeNode node) { return children.indexOf(node); } @Override public boolean getAllowsChildren() { return true; } @Override public boolean isLeaf() { return children.isEmpty(); } @Override public Enumeration children() { return Collections.enumeration(children); } } private static class MyFrame { private final int frame; private boolean invalid; public MyFrame(int frame) { this.frame = frame; } public int getFrame() { return frame; } public void setInvalid(boolean invalid) { this.invalid = invalid; } public boolean isInvalid() { return invalid; } @Override public String toString() { return "frame " + frame; } } private void populateInstanceNodes(MyTreeNode root, Timelined tim) { int f = 1; List currentFramePlaces = new ArrayList<>(); for (Tag t : tim.getTags()) { if (t instanceof DefineSpriteTag) { MyTreeNode sprite = new MyTreeNode(); sprite.setParent(root); sprite.setData(t); populateInstanceNodes(sprite, (DefineSpriteTag) t); if (sprite.getChildCount() > 0) { root.addChild(sprite); } } } for (Tag t : tim.getTags()) { if (t instanceof ShowFrameTag) { if (!currentFramePlaces.isEmpty()) { MyTreeNode frameNode = new MyTreeNode(); frameNode.setData(new MyFrame(f)); frameNode.setParent(root); for (MyTreeNode p : currentFramePlaces) { p.setParent(frameNode); frameNode.addChild(p); } root.addChild(frameNode); currentFramePlaces.clear(); } f++; } if (t instanceof PlaceObjectTypeTag) { MyTreeNode place = new MyTreeNode(); place.setData(t); currentFramePlaces.add(place); } } } private JPanel createInstancePanel() { MyTreeNode root = new MyTreeNode(); root.setData("root"); populateInstanceNodes(root, swf); instanceTree = new JTree(root); instanceTree.setRootVisible(false); instanceTree.setShowsRootHandles(true); instanceTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); final ImageIcon placeIcon = View.getIcon("placeobject16"); final ImageIcon spriteIcon = View.getIcon("sprite16"); final ImageIcon frameIcon = View.getIcon("frame16"); instanceTree.setCellRenderer(new DefaultTreeCellRenderer() { { if (View.isOceanic()) { setUI(new BasicLabelUI()); setOpaque(false); setBackgroundNonSelectionColor(Color.white); } } @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { Component renderer = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); if (renderer instanceof JLabel) { JLabel lab = (JLabel) renderer; Object subValue = value; if (value instanceof MyTreeNode) { subValue = ((MyTreeNode) value).getData(); } if (subValue instanceof PlaceObjectTypeTag) { lab.setIcon(placeIcon); } else if (subValue instanceof DefineSpriteTag) { lab.setIcon(spriteIcon); } else if (subValue instanceof MyFrame) { lab.setIcon(frameIcon); } } return renderer; } }); instanceTree.addTreeSelectionListener(this::instanceValueChanged); if (View.isOceanic()) { instanceTree.setBackground(Color.white); } instancePreviewPanel = new PreviewPanel(Main.getMainFrame().getPanel()); instancePreviewPanel.setReadOnly(true); instancePreviewPanel.setPreferredSize(new Dimension(300, 1)); instancePreviewPanel.showEmpty(); instancePreviewPanel.setParametersPanelVisible(false); JPanel instancePanel = new JPanel(new BorderLayout()); JScrollPane instanceTreeScrollPane = new FasterScrollPane(instanceTree); instanceTreeScrollPane.setMinimumSize(new Dimension(400, 1)); JSplitPane instanceSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, instanceTreeScrollPane, instancePreviewPanel); instanceSplitPane.setDividerLocation(400); instancePanel.add(instanceSplitPane, BorderLayout.CENTER); return instancePanel; } private JPanel createClassPanel() { JPanel classPanel = new JPanel(); classPanel.setLayout(new BoxLayout(classPanel, BoxLayout.Y_AXIS)); JPanel classCenterPanel = new JPanel(new FlowLayout()); JLabel classNameLabel = new JLabel(translate("classname")); classNameTextField = new JTextField(40); classNameTextField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { checkEnabled(); } @Override public void removeUpdate(DocumentEvent e) { checkEnabled(); } @Override public void changedUpdate(DocumentEvent e) { checkEnabled(); } }); classNameTextField.addActionListener(this::okButtonActionPerformed); classNameLabel.setLabelFor(classNameTextField); classCenterPanel.add(classNameLabel); classCenterPanel.add(classNameTextField); classPanel.add(Box.createVerticalGlue()); classPanel.add(classCenterPanel); classPanel.add(Box.createVerticalGlue()); return classPanel; } private void instanceValueChanged(TreeSelectionEvent e) { TreePath selection = instanceTree.getSelectionPath(); if (selection == null) { instancePreviewPanel.showEmpty(); checkEnabled(); return; } MyTreeNode tnode = (MyTreeNode) selection.getLastPathComponent(); if (tnode.getData() instanceof PlaceObjectTypeTag) { PlaceObjectTypeTag place = (PlaceObjectTypeTag) tnode.getData(); instancePreviewPanel.selectImageDepth(place.getDepth()); int f = ((MyFrame) ((MyTreeNode) tnode.getParent()).getData()).frame; Object parent = ((MyTreeNode) tnode.getParent().getParent()).getData(); if (parent instanceof DefineSpriteTag) { instancePreviewPanel.showImagePanel((DefineSpriteTag) parent, swf, f - 1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), true, false, true, false, false); } else { instancePreviewPanel.showImagePanel(swf, swf, f - 1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), true, false, true, false, false); } } else if (tnode.getData() instanceof DefineSpriteTag) { instancePreviewPanel.selectImageDepth(-1); instancePreviewPanel.showImagePanel((DefineSpriteTag) tnode.getData(), swf, -1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), true, false, true, false, false); } else if (tnode.getData() instanceof MyFrame) { instancePreviewPanel.selectImageDepth(-1); int f = ((MyFrame) tnode.getData()).frame; Object parent = ((MyTreeNode) tnode.getParent()).getData(); if (parent instanceof DefineSpriteTag) { instancePreviewPanel.showImagePanel((DefineSpriteTag) parent, swf, f - 1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), true, false, true, false, false); } else { instancePreviewPanel.showImagePanel(swf, swf, f - 1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), true, false, true, false, false); } } checkEnabled(); } private void spriteInitValueChanged(ListSelectionEvent e) { spriteInitPreviewPanel.showEmpty(); int selectedIndex = spriteInitList.getSelectedIndex(); if (selectedIndex == -1) { spriteInitPreviewPanel.showEmpty(); checkEnabled(); return; } spriteInitPreviewPanel.showImagePanel(spriteInitList.getSelectedValue(), swf, -1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), true, false, true, false, false); checkEnabled(); } private void frameValueChanged(ListSelectionEvent e) { framePreviewPanel.showEmpty(); int selectedIndex = frameList.getSelectedIndex(); if (selectedIndex == -1) { framePreviewPanel.showEmpty(); checkEnabled(); return; } framePreviewPanel.showImagePanel(swf, swf, selectedIndex, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), true, false, true, false, false); int f = selectedIndex + 1; if (!frameTextField.getText().equals("" + f)) { frameTextField.setText("" + f); } checkEnabled(); } private void buttonValueChanged(ListSelectionEvent e) { buttonPreviewPanel.showEmpty(); if (buttonList.getSelectedIndex() >= 0) { buttonPreviewPanel.showImagePanel(TimelinedMaker.makeTimelined(buttonList.getSelectedValue()), swf, -1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), true, false, true, false, false); } checkEnabled(); } private void spriteValueChanged(TreeSelectionEvent e) { TreePath selection = spriteFrameTree.getSelectionPath(); if (selection == null) { spriteFramePreviewPanel.showEmpty(); checkEnabled(); return; } MyTreeNode tnode = (MyTreeNode) selection.getLastPathComponent(); if (tnode.getData() instanceof DefineSpriteTag) { spriteFramePreviewPanel.showImagePanel((DefineSpriteTag) tnode.getData(), swf, -1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), true, false, true, false, false); } else if (tnode.getData() instanceof MyFrame) { int f = ((MyFrame) tnode.getData()).frame; Object parent = ((MyTreeNode) tnode.getParent()).getData(); if (parent instanceof DefineSpriteTag) { spriteFramePreviewPanel.showImagePanel((DefineSpriteTag) parent, swf, f - 1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), true, false, true, false, false); } else { spriteFramePreviewPanel.showImagePanel(swf, swf, f - 1, true, Configuration.autoPlayPreviews.get(), !Configuration.animateSubsprites.get(), false, !Configuration.playFrameSounds.get(), true, false, true, false, false); } if (!spriteFrameTextField.getText().equals("" + f)) { spriteFrameTextField.setText("" + f); } } checkEnabled(); } private void typeChangedActionPerformed(ActionEvent evt) { int selectedType = ((JComboBox) evt.getSource()).getSelectedIndex(); ((CardLayout) centerPanel.getLayout()).show(centerPanel, "" + selectedType); checkEnabled(); } private void updateFrames() { int type = typeComboBox.getSelectedIndex(); if (type == TYPE_FRAME) { int f = -1; boolean invalid = false; try { f = Integer.parseInt(frameTextField.getText()); if (f <= 0) { invalid = true; } } catch (NumberFormatException nfe) { invalid = true; } if (!invalid) { if (f > frameList.getModel().getSize()) { frameList.setSelectedIndices(new int[]{}); } else { frameList.setSelectedIndex(f - 1); frameList.ensureIndexIsVisible(f - 1); } } } if (type == TYPE_SPRITE_FRAME) { TreePath selection = spriteFrameTree.getSelectionPath(); if (selection != null) { int f = -1; boolean invalid = false; try { f = Integer.parseInt(spriteFrameTextField.getText()); if (f <= 0) { invalid = true; } } catch (NumberFormatException nfe) { invalid = true; } if (invalid) { return; } MyTreeNode node = (MyTreeNode) selection.getLastPathComponent(); if (node.getData() instanceof MyFrame) { node = (MyTreeNode) node.getParent(); TreePath spritePath = selection.getParentPath(); if (spriteFrameTree.isExpanded(spritePath)) { boolean found = false; for (int i = 0; i < node.getChildCount(); i++) { if (((MyFrame) ((MyTreeNode) node.getChildAt(i)).data).frame == f) { TreePath framePath = spritePath.pathByAddingChild(node.getChildAt(i)); spriteFrameTree.setSelectionPath(framePath); found = true; break; } } if (!found) { spriteFrameTree.setSelectionPath(spritePath); } } } } } } private void checkEnabled() { okButton.setEnabled(true); int type = typeComboBox.getSelectedIndex(); if (type == TYPE_SPRITE_FRAME) { boolean invalid = false; try { frame = Integer.parseInt(spriteFrameTextField.getText()); if (frame <= 0) { invalid = true; } } catch (NumberFormatException nfe) { invalid = true; } if (invalid) { okButton.setEnabled(false); } if (spriteFrameTree.getSelectionPath() == null) { okButton.setEnabled(false); } else { MyTreeNode node = (MyTreeNode) spriteFrameTree.getSelectionPath().getLastPathComponent(); if (node.getData() instanceof MyFrame) { if (((MyFrame) node.getData()).isInvalid()) { okButton.setEnabled(false); } } } } if (type == TYPE_SPRITE_INIT) { DefineSpriteTag sprite = spriteInitList.getSelectedValue(); if (sprite == null) { okButton.setEnabled(false); } else { if (spriteIdsWithDoInitAction.contains(sprite.spriteId)) { okButton.setEnabled(false); } } } if (type == TYPE_FRAME) { boolean invalid = false; try { frame = Integer.parseInt(frameTextField.getText()); if (frame <= 0) { invalid = true; } } catch (NumberFormatException nfe) { invalid = true; } if (invalid) { okButton.setEnabled(false); } else { MyFrame myf = frameList.getSelectedValue(); if (myf != null) { if (myf.isInvalid()) { okButton.setEnabled(false); } } } } if (type == TYPE_BUTTON_EVENT) { if (buttonList.getSelectedIndex() < 0) { okButton.setEnabled(false); } } if (type == TYPE_INSTANCE_EVENT) { TreePath selection = instanceTree.getSelectionPath(); if (selection == null) { okButton.setEnabled(false); return; } MyTreeNode tnode = (MyTreeNode) selection.getLastPathComponent(); okButton.setEnabled(false); if (tnode.getData() instanceof PlaceObjectTypeTag) { okButton.setEnabled(true); } } if (type == TYPE_CLASS) { if (classNameTextField.getText().trim().endsWith(".")) { okButton.setEnabled(false); } if (classNameTextField.getText().trim().isEmpty()) { okButton.setEnabled(false); } if (existingClasses.contains(classNameTextField.getText().trim())) { okButton.setEnabled(false); } } } private void okButtonActionPerformed(ActionEvent evt) { int type = getScriptType(); frame = -1; if (type == TYPE_FRAME) { frame = Integer.parseInt(frameTextField.getText()); } else if (type == TYPE_SPRITE_FRAME) { frame = Integer.parseInt(spriteFrameTextField.getText()); } else if (type == TYPE_INSTANCE_EVENT) { MyTreeNode placeNode = (MyTreeNode) instanceTree.getSelectionPath().getLastPathComponent(); frame = ((MyFrame) ((MyTreeNode) placeNode.getParent()).getData()).frame; } result = OK_OPTION; setVisible(false); } public int getFrame() { return frame; } public String getClassName() { if (getScriptType() == TYPE_CLASS) { return classNameTextField.getText().trim(); } return null; } public int getScriptType() { return typeComboBox.getSelectedIndex(); } public DefineSpriteTag getSprite() { if (getScriptType() == TYPE_SPRITE_FRAME) { MyTreeNode tnode = (MyTreeNode) spriteFrameTree.getSelectionPath().getLastPathComponent(); if (tnode.getData() instanceof DefineSpriteTag) { return (DefineSpriteTag) tnode.getData(); } return (DefineSpriteTag) ((MyTreeNode) tnode.parent).getData(); } if (getScriptType() == TYPE_INSTANCE_EVENT) { MyTreeNode tnode = (MyTreeNode) instanceTree.getSelectionPath().getLastPathComponent(); Object parent = ((MyTreeNode) tnode.getParent().getParent()).getData(); if (parent instanceof DefineSpriteTag) { return (DefineSpriteTag) parent; } else { return null; } } if (getScriptType() == TYPE_SPRITE_INIT) { return spriteInitList.getSelectedValue(); } return null; } public PlaceObjectTypeTag getPlaceObject() { if (getScriptType() == TYPE_INSTANCE_EVENT) { return (PlaceObjectTypeTag) ((MyTreeNode) instanceTree.getSelectionPath().getLastPathComponent()).getData(); } return null; } public DefineButton2Tag getButton() { if (getScriptType() == TYPE_BUTTON_EVENT) { return buttonList.getSelectedValue(); } return null; } private void cancelButtonActionPerformed(ActionEvent evt) { result = CANCEL_OPTION; setVisible(false); } public int showDialog() { setVisible(true); return result; } }