diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java index 4d0a8f1cf..c2424f13e 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java @@ -27,6 +27,7 @@ import com.jpexs.helpers.ReReadableInputStream; import java.awt.BorderLayout; import java.awt.Container; import java.awt.FlowLayout; +import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; @@ -147,6 +148,11 @@ public class LoadFromCacheFrame extends AppFrame implements ActionListener { progressBar.setVisible(false); openButton.setEnabled(false); saveButton.setEnabled(false); + + java.util.List images = new ArrayList<>(); + images.add(View.loadImage("loadcache16")); + images.add(View.loadImage("loadcache32")); + setIconImages(images); refresh(); } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java index c35b141bc..1db9cc0b5 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java @@ -31,6 +31,7 @@ import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.FlowLayout; +import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; @@ -388,6 +389,10 @@ public class LoadFromMemoryFrame extends AppFrame implements ActionListener { cnt.add(new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, rightPanel), BorderLayout.CENTER); View.setWindowIcon(this); View.centerScreen(this); + java.util.List images = new ArrayList<>(); + images.add(View.loadImage("loadmemory16")); + images.add(View.loadImage("loadmemory32")); + setIconImages(images); } @Override diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/Main.java b/trunk/src/com/jpexs/decompiler/flash/gui/Main.java index 1a0d6e216..e4b1eb046 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/Main.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/Main.java @@ -720,7 +720,7 @@ public class Main { autoCheckForUpdates(); offerAssociation(); } - + public static void showModeFrame() { View.execInEventDispatch(new Runnable() { @Override diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java index 0977d6151..809ac993c 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java @@ -86,7 +86,8 @@ public class MainFrameRibbonMenu implements MainFrameMenu, ActionListener { static final String ACTION_GOTO_DOCUMENT_CLASS = "GOTODOCUMENTCLASS"; static final String ACTION_PARALLEL_SPEED_UP = "PARALLELSPEEDUP"; static final String ACTION_INTERNAL_VIEWER_SWITCH = "INTERNALVIEWERSWITCH"; - static final String ACTION_SEARCH_AS = "SEARCHAS"; + static final String ACTION_SEARCH = "SEARCH"; + static final String ACTION_TIMELINE = "TIMELINE"; static final String ACTION_AUTO_DEOBFUSCATE = "AUTODEOBFUSCATE"; static final String ACTION_EXIT = "EXIT"; @@ -138,6 +139,7 @@ public class MainFrameRibbonMenu implements MainFrameMenu, ActionListener { private JCommandButton globalrenameCommandButton; private JCommandButton deobfuscationCommandButton; private JCommandButton searchCommandButton; + private JCommandButton timeLineCommandButton; private JCommandButton gotoDocumentClassCommandButton; private JCommandButton clearRecentFilesCommandButton; @@ -320,7 +322,11 @@ public class MainFrameRibbonMenu implements MainFrameMenu, ActionListener { toolsBand.setResizePolicies(getResizePolicies(toolsBand)); searchCommandButton = new JCommandButton(fixCommandTitle(translate("menu.tools.search")), View.getResizableIcon("search32")); - assignListener(searchCommandButton, ACTION_SEARCH_AS); + assignListener(searchCommandButton, ACTION_SEARCH); + + timeLineCommandButton = new JCommandButton(fixCommandTitle(translate("menu.tools.timeline")), View.getResizableIcon("timeline32")); + assignListener(timeLineCommandButton, ACTION_TIMELINE); + gotoDocumentClassCommandButton = new JCommandButton(fixCommandTitle(translate("menu.tools.gotodocumentclass")), View.getResizableIcon("gotomainclass32")); assignListener(gotoDocumentClassCommandButton, ACTION_GOTO_DOCUMENT_CLASS); @@ -334,6 +340,7 @@ public class MainFrameRibbonMenu implements MainFrameMenu, ActionListener { assignListener(loadCacheCommandButton, ACTION_LOAD_CACHE); toolsBand.addCommandButton(searchCommandButton, RibbonElementPriority.TOP); + toolsBand.addCommandButton(timeLineCommandButton, RibbonElementPriority.TOP); toolsBand.addCommandButton(gotoDocumentClassCommandButton, RibbonElementPriority.TOP); toolsBand.addCommandButton(proxyCommandButton, RibbonElementPriority.MEDIUM); toolsBand.addCommandButton(loadMemoryCommandButton, RibbonElementPriority.MEDIUM); @@ -507,6 +514,7 @@ public class MainFrameRibbonMenu implements MainFrameMenu, ActionListener { globalrenameCommandButton.setEnabled(swfLoaded); deobfuscationCommandButton.setEnabled(swfLoaded); searchCommandButton.setEnabled(swfLoaded); + timeLineCommandButton.setEnabled(swfLoaded); gotoDocumentClassCommandButton.setEnabled(hasAbc); deobfuscationCommandButton.setEnabled(hasAbc); @@ -598,9 +606,12 @@ public class MainFrameRibbonMenu implements MainFrameMenu, ActionListener { Configuration.internalFlashViewer.set(miInternalViewer.isSelected()); mainFrame.panel.reload(true); break; - case ACTION_SEARCH_AS: + case ACTION_SEARCH: mainFrame.panel.searchAs(); break; + case ACTION_TIMELINE: + mainFrame.panel.timeline(); + break; case ACTION_AUTO_DEOBFUSCATE: if (View.showConfirmDialog(mainFrame.panel, translate("message.confirm.autodeobfuscate") + "\r\n" + (miAutoDeobfuscation.isSelected() ? translate("message.confirm.on") : translate("message.confirm.off")), translate("message.confirm"), JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION) { Configuration.autoDeobfuscate.set(miAutoDeobfuscation.isSelected()); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 08ed3e697..ae24faff3 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -16,6 +16,7 @@ */ package com.jpexs.decompiler.flash.gui; +import com.jpexs.decompiler.flash.gui.timeline.TimelineFrame; import com.jpexs.decompiler.flash.AbortRetryIgnoreHandler; import com.jpexs.decompiler.flash.AppStrings; import com.jpexs.decompiler.flash.ApplicationInfo; @@ -2956,4 +2957,12 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec public void setErrorState(ErrorState errorState) { statusPanel.setErrorState(errorState); } + + public void timeline() { + final SWF swf = getCurrentSwf(); + if (swf != null) { + TimelineFrame tf = new TimelineFrame(swf); + tf.setVisible(true); + } + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/SearchDialog.java b/trunk/src/com/jpexs/decompiler/flash/gui/SearchDialog.java index 653044274..1b407f16d 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/SearchDialog.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/SearchDialog.java @@ -19,8 +19,10 @@ package com.jpexs.decompiler.flash.gui; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; +import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.ArrayList; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import javax.swing.BoxLayout; @@ -94,6 +96,10 @@ public class SearchDialog extends AppDialog implements ActionListener { setTitle(translate("dialog.title")); setModalityType(ModalityType.APPLICATION_MODAL); pack(); + java.util.List images = new ArrayList<>(); + images.add(View.loadImage("search16")); + images.add(View.loadImage("search32")); + setIconImages(images); } @Override diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/TimeLinePanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/TimeLinePanel.java deleted file mode 100644 index b4a54f96a..000000000 --- a/trunk/src/com/jpexs/decompiler/flash/gui/TimeLinePanel.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (C) 2014 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; - -import com.jpexs.decompiler.flash.SWF; -import com.jpexs.decompiler.flash.timeline.DepthState; -import com.jpexs.decompiler.flash.timeline.TimeLine; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import javax.swing.JPanel; - -/** - * - * @author JPEXS - */ -public class TimeLinePanel extends JPanel implements MouseListener { - - private final SWF swf; - private final TimeLine timeLine; - public static final int FRAME_WIDTH = 10; - public static final int FRAME_HEIGHT = 20; - public static final Color frameColor = Color.lightGray; - public static final Color emptyFrameColor = Color.white; - public static final Color borderColor = Color.black; - public static final Color emptyBorderColor = Color.lightGray; - public static final Color keyColor = Color.black; - public static final Color selectedColor = new Color(113, 174, 235); - public static final Color timeColor = Color.red; - - public Point cursor = null; - - public TimeLinePanel(SWF swf) { - this.swf = swf; - this.timeLine = new TimeLine(swf); - Dimension dim = new Dimension(FRAME_WIDTH * timeLine.getFrameCount() + 1, FRAME_HEIGHT * timeLine.getMaxDepth()); - setSize(dim); - setPreferredSize(dim); - addMouseListener(this); - } - - @Override - protected void paintComponent(Graphics g) { - //super.paintComponent(g); - Rectangle clip = g.getClipBounds(); - int start_f = clip.x / FRAME_WIDTH; - int start_d = clip.y / FRAME_HEIGHT; - int end_f = (clip.x + clip.width) / FRAME_WIDTH; - int end_d = (clip.y + clip.height) / FRAME_HEIGHT; - - int max_d = timeLine.getMaxDepth(); - if (max_d < end_d) { - end_d = max_d; - } - int max_f = timeLine.getFrameCount() - 1; - if (max_f < end_f) { - end_f = max_f; - } - - boolean keyfound[] = new boolean[end_d - start_d + 1]; - - for (int f = start_f; f <= end_f; f++) { - for (int d = start_d; d <= end_d; d++) { - DepthState fl = timeLine.frames.get(f).layers.get(d); - if (fl == null) { - g.setColor(emptyFrameColor); - g.fillRect(f * FRAME_WIDTH, d * FRAME_HEIGHT, FRAME_WIDTH, FRAME_HEIGHT); - g.setColor(emptyBorderColor); - g.drawRect(f * FRAME_WIDTH, d * FRAME_HEIGHT, FRAME_WIDTH, FRAME_HEIGHT); - } - } - } - for (int f = start_f; f <= end_f; f++) { - for (int d = start_d; d <= end_d; d++) { - DepthState fl = timeLine.frames.get(f).layers.get(d); - boolean selected = false; - if (cursor != null) { - if (f == cursor.x && d == cursor.y) { - selected = true; - } - } - if (selected) { - g.setColor(selectedColor); - g.fillRect(f * FRAME_WIDTH + 1, d * FRAME_HEIGHT + 1, FRAME_WIDTH - 1, FRAME_HEIGHT - 1); - } - - if (fl == null) { - continue; - } else { - - int draw_f = 0; - if (fl.key) { - draw_f = f; - keyfound[d - start_d] = true; - } else if (!keyfound[d - start_d]) { - for (int k = f - 1; k >= 0; k--) { - fl = timeLine.frames.get(k).layers.get(d); - if (fl == null) { - break; - } - if (fl.key) { - keyfound[d - start_d] = true; - draw_f = k; - break; - } - } - } else { - continue; - } - int num_frames = 1; - for (int n = draw_f + 1; n < timeLine.getFrameCount(); n++) { - fl = timeLine.frames.get(n).layers.get(d); - if (fl == null) { - break; - } - if (fl.key) { - break; - } - num_frames++; - } - g.setColor(frameColor); - g.fillRect(draw_f * FRAME_WIDTH, d * FRAME_HEIGHT, num_frames * FRAME_WIDTH, FRAME_HEIGHT); - - if (selected) { - g.setColor(selectedColor); - g.fillRect(draw_f * FRAME_WIDTH, d * FRAME_HEIGHT, FRAME_WIDTH, FRAME_HEIGHT); - } - - g.setColor(borderColor); - g.drawRect(draw_f * FRAME_WIDTH, d * FRAME_HEIGHT, num_frames * FRAME_WIDTH, FRAME_HEIGHT); - g.setColor(keyColor); - g.fillOval(draw_f * FRAME_WIDTH + FRAME_WIDTH / 4, d * FRAME_HEIGHT + FRAME_HEIGHT / 2 - FRAME_WIDTH / 2, FRAME_WIDTH / 2, FRAME_WIDTH / 2); - - } - } - } - - if (cursor != null && cursor.x >= start_f && cursor.x <= end_f) { - g.setColor(timeColor); - g.drawLine(cursor.x * FRAME_WIDTH + FRAME_WIDTH / 2, 0, cursor.x * FRAME_WIDTH + FRAME_WIDTH / 2, getHeight()); - } - } - - @Override - public void mouseClicked(MouseEvent e) { - - } - - @Override - public void mousePressed(MouseEvent e) { - Point p = e.getPoint(); - p.x = p.x / FRAME_WIDTH; - p.y = p.y / FRAME_HEIGHT; - if (p.x >= timeLine.getFrameCount()) { - p.x = timeLine.getFrameCount() - 1; - } - if (p.y > timeLine.getMaxDepth()) { - p.y = timeLine.getMaxDepth(); - } - cursor = p; - repaint(); - } - - @Override - public void mouseReleased(MouseEvent e) { - - } - - @Override - public void mouseEntered(MouseEvent e) { - - } - - @Override - public void mouseExited(MouseEvent e) { - - } - -} diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/View.java b/trunk/src/com/jpexs/decompiler/flash/gui/View.java index 1eedb87ce..9b72b43f3 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/View.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/View.java @@ -36,6 +36,7 @@ import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Icon; import javax.swing.ImageIcon; +import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; @@ -50,11 +51,14 @@ import javax.swing.UnsupportedLookAndFeelException; import javax.swing.plaf.FontUIResource; import javax.swing.plaf.basic.BasicColorChooserUI; import org.pushingpixels.flamingo.api.common.icon.ImageWrapperResizableIcon; +import org.pushingpixels.substance.api.ComponentState; +import org.pushingpixels.substance.api.SubstanceColorScheme; import org.pushingpixels.substance.api.SubstanceConstants; import org.pushingpixels.substance.api.SubstanceLookAndFeel; import org.pushingpixels.substance.api.fonts.FontPolicy; import org.pushingpixels.substance.api.fonts.FontSet; import org.pushingpixels.substance.api.skin.SubstanceOfficeBlue2007LookAndFeel; +import org.pushingpixels.substance.internal.utils.SubstanceColorSchemeUtilities; /** * Contains methods for GUI @@ -342,4 +346,8 @@ public class View { }); return ret[0]; } -} + + public static SubstanceColorScheme getColorScheme() { + return SubstanceColorSchemeUtilities.getActiveColorScheme(new JButton(), ComponentState.ENABLED); + } +} \ No newline at end of file diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/graphics/loadcache32.png b/trunk/src/com/jpexs/decompiler/flash/gui/graphics/loadcache32.png new file mode 100644 index 000000000..c10b2fb3f Binary files /dev/null and b/trunk/src/com/jpexs/decompiler/flash/gui/graphics/loadcache32.png differ diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/graphics/loadmemory32.png b/trunk/src/com/jpexs/decompiler/flash/gui/graphics/loadmemory32.png index b541e6b4e..7485e3408 100644 Binary files a/trunk/src/com/jpexs/decompiler/flash/gui/graphics/loadmemory32.png and b/trunk/src/com/jpexs/decompiler/flash/gui/graphics/loadmemory32.png differ diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/graphics/search16.png b/trunk/src/com/jpexs/decompiler/flash/gui/graphics/search16.png index cf3d97f75..1d6f4f13f 100644 Binary files a/trunk/src/com/jpexs/decompiler/flash/gui/graphics/search16.png and b/trunk/src/com/jpexs/decompiler/flash/gui/graphics/search16.png differ diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/graphics/search32.png b/trunk/src/com/jpexs/decompiler/flash/gui/graphics/search32.png index 1d6852224..790c54a26 100644 Binary files a/trunk/src/com/jpexs/decompiler/flash/gui/graphics/search32.png and b/trunk/src/com/jpexs/decompiler/flash/gui/graphics/search32.png differ diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/graphics/timeline16.png b/trunk/src/com/jpexs/decompiler/flash/gui/graphics/timeline16.png new file mode 100644 index 000000000..7efacde14 Binary files /dev/null and b/trunk/src/com/jpexs/decompiler/flash/gui/graphics/timeline16.png differ diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/graphics/timeline32.png b/trunk/src/com/jpexs/decompiler/flash/gui/graphics/timeline32.png new file mode 100644 index 000000000..eb27b9d5e Binary files /dev/null and b/trunk/src/com/jpexs/decompiler/flash/gui/graphics/timeline32.png differ diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties index d33ed0c8b..c431d1994 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties +++ b/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties @@ -437,3 +437,6 @@ node.others = others #after version 1.8.1 menu.tools.search = Text Search + +#after version 1.8.1u1 +menu.tools.timeline = Timeline \ No newline at end of file diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties b/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties index 6685b98e4..5f4bd9d5e 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties +++ b/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties @@ -437,4 +437,7 @@ open.error.cannotOpen = Soubor nelze otev\u0159\u00edt node.others = ostatn\u00ed #after version 1.8.1 -menu.tools.search = Hled\u00e1n\u00ed Textu \ No newline at end of file +menu.tools.search = Hled\u00e1n\u00ed Textu + +#after version 1.8.1u1 +menu.tools.timeline = \u010casov\u00e1 osa \ No newline at end of file diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/locales/TimeLineFrame.properties b/trunk/src/com/jpexs/decompiler/flash/gui/locales/timeline/TimelineFrame.properties similarity index 100% rename from trunk/src/com/jpexs/decompiler/flash/gui/locales/TimeLineFrame.properties rename to trunk/src/com/jpexs/decompiler/flash/gui/locales/timeline/TimelineFrame.properties diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/timeline/FrameSelectionListener.java b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/FrameSelectionListener.java new file mode 100644 index 000000000..06d2c3130 --- /dev/null +++ b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/FrameSelectionListener.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2010-2014 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.timeline; + +/** + * + * @author JPEXS + */ +public interface FrameSelectionListener { + + public void frameSelected(int frame, int depth); +} diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineBodyPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineBodyPanel.java new file mode 100644 index 000000000..39f29092c --- /dev/null +++ b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineBodyPanel.java @@ -0,0 +1,270 @@ +/* + * Copyright (C) 2010-2014 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.timeline; + +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.gui.View; +import com.jpexs.decompiler.flash.timeline.DepthState; +import com.jpexs.decompiler.flash.timeline.Timeline; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.ArrayList; +import java.util.List; +import javax.swing.JPanel; + +/** + * + * @author JPEXS + */ +public class TimelineBodyPanel extends JPanel implements MouseListener { + + private final Timeline timeLine; + + public static Color frameColor = Color.lightGray; + public static Color emptyFrameColor = Color.white; + public static Color emptyFrameSecondColor = new Color(0xed, 0xed, 0xed); + public static Color borderColor = Color.black; + public static Color emptyBorderColor = Color.lightGray; + public static Color keyColor = Color.black; + public static Color aColor = Color.black; + public static Color stopColor = Color.white; + public static Color stopBorderColor = Color.black; + public static Color borderLinesColor = new Color(0xde, 0xde, 0xde); + + public static Color selectedColor = new Color(113, 174, 235); + public static final int borderLinesLength = 2; + public static final float fontSize = 10.0f; + + private List listeners = new ArrayList<>(); + + public Point cursor = null; + + public void addFrameSelectionListener(FrameSelectionListener l) { + listeners.add(l); + } + + public void removeFrameSelectionListener(FrameSelectionListener l) { + listeners.remove(l); + } + + public TimelineBodyPanel(Timeline timeLine) { + + this.timeLine = timeLine; + Dimension dim = new Dimension(TimelinePanel.FRAME_WIDTH * timeLine.getFrameCount() + 1, TimelinePanel.FRAME_HEIGHT * timeLine.getMaxDepth()); + setSize(dim); + setPreferredSize(dim); + addMouseListener(this); + } + + @Override + protected void paintComponent(Graphics g1) { + Graphics2D g = (Graphics2D) g1; + g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + g.setColor(TimelinePanel.backgroundColor); + g.fillRect(0, 0, getWidth(), getHeight()); + Rectangle clip = g.getClipBounds(); + int start_f = clip.x / TimelinePanel.FRAME_WIDTH; + int start_d = clip.y / TimelinePanel.FRAME_HEIGHT; + int end_f = (clip.x + clip.width) / TimelinePanel.FRAME_WIDTH; + int end_d = (clip.y + clip.height) / TimelinePanel.FRAME_HEIGHT; + + int max_d = timeLine.getMaxDepth(); + if (max_d < end_d) { + end_d = max_d; + } + int max_f = timeLine.getFrameCount() - 1; + if (max_f < end_f) { + end_f = max_f; + } + + boolean keyfound[] = new boolean[end_d - start_d + 1]; + + for (int f = start_f; f <= end_f; f++) { + for (int d = start_d; d <= end_d; d++) { + DepthState fl = timeLine.frames.get(f).layers.get(d); + if (fl == null) { + if ((f + 1) % 5 == 0) { + g.setColor(emptyFrameSecondColor); + } else { + g.setColor(emptyFrameColor); + } + g.fillRect(f * TimelinePanel.FRAME_WIDTH, d * TimelinePanel.FRAME_HEIGHT, TimelinePanel.FRAME_WIDTH, TimelinePanel.FRAME_HEIGHT); + g.setColor(emptyBorderColor); + g.drawRect(f * TimelinePanel.FRAME_WIDTH, d * TimelinePanel.FRAME_HEIGHT, TimelinePanel.FRAME_WIDTH, TimelinePanel.FRAME_HEIGHT); + } + } + } + for (int f = start_f; f <= end_f; f++) { + for (int d = start_d; d <= end_d; d++) { + DepthState fl = timeLine.frames.get(f).layers.get(d); + DepthState flNext = null; + if (f < max_f) { + flNext = timeLine.frames.get(f + 1).layers.get(d); + } + boolean selected = false; + if (cursor != null) { + if (f == cursor.x && d == cursor.y) { + selected = true; + } + } + if (selected) { + if (!(fl != null && (flNext == null || flNext.key))) { + g.setColor(selectedColor); + g.fillRect(f * TimelinePanel.FRAME_WIDTH + 1, d * TimelinePanel.FRAME_HEIGHT + 1, TimelinePanel.FRAME_WIDTH - 1, TimelinePanel.FRAME_HEIGHT - 1); + } + } + + if (fl == null) { + + if (d == 0) { + if (timeLine.frames.get(f).action != null) { + g.setColor(aColor); + g.setFont(getFont().deriveFont(fontSize)); + int awidth = g.getFontMetrics().stringWidth("a"); + g.drawString("a", f * TimelinePanel.FRAME_WIDTH + TimelinePanel.FRAME_WIDTH / 2 - awidth / 2, d * TimelinePanel.FRAME_HEIGHT + TimelinePanel.FRAME_HEIGHT / 2 + fontSize / 2); + } + } + continue; + } else { + + int draw_f = 0; + if (fl.key) { + draw_f = f; + keyfound[d - start_d] = true; + } else if (!keyfound[d - start_d]) { + for (int k = f - 1; k >= 0; k--) { + fl = timeLine.frames.get(k).layers.get(d); + if (fl == null) { + break; + } + if (fl.key) { + keyfound[d - start_d] = true; + draw_f = k; + break; + } + } + } else { + continue; + } + int num_frames = 1; + for (int n = draw_f + 1; n < timeLine.getFrameCount(); n++) { + fl = timeLine.frames.get(n).layers.get(d); + if (fl == null) { + break; + } + if (fl.key) { + break; + } + num_frames++; + } + g.setColor(frameColor); + g.fillRect(draw_f * TimelinePanel.FRAME_WIDTH, d * TimelinePanel.FRAME_HEIGHT, num_frames * TimelinePanel.FRAME_WIDTH, TimelinePanel.FRAME_HEIGHT); + + if (selected) { + g.setColor(selectedColor); + g.fillRect(draw_f * TimelinePanel.FRAME_WIDTH, d * TimelinePanel.FRAME_HEIGHT, TimelinePanel.FRAME_WIDTH, TimelinePanel.FRAME_HEIGHT); + } + + g.setColor(borderColor); + g.drawRect(draw_f * TimelinePanel.FRAME_WIDTH, d * TimelinePanel.FRAME_HEIGHT, num_frames * TimelinePanel.FRAME_WIDTH, TimelinePanel.FRAME_HEIGHT); + g.setColor(keyColor); + g.fillOval(draw_f * TimelinePanel.FRAME_WIDTH + TimelinePanel.FRAME_WIDTH / 4, d * TimelinePanel.FRAME_HEIGHT + TimelinePanel.FRAME_HEIGHT * 3 / 4 - TimelinePanel.FRAME_WIDTH / 2 / 2, TimelinePanel.FRAME_WIDTH / 2, TimelinePanel.FRAME_WIDTH / 2); + if (num_frames > 1) { + if (cursor != null && cursor.y == d && cursor.x == f + num_frames - 1) { + g.setColor(selectedColor); + g.fillRect((f + num_frames - 1) * TimelinePanel.FRAME_WIDTH + 1, d * TimelinePanel.FRAME_HEIGHT + 1, TimelinePanel.FRAME_WIDTH - 1, TimelinePanel.FRAME_HEIGHT - 1); + } + g.setColor(stopColor); + g.fillRect((draw_f + num_frames - 1) * TimelinePanel.FRAME_WIDTH + TimelinePanel.FRAME_WIDTH / 4, d * TimelinePanel.FRAME_HEIGHT + TimelinePanel.FRAME_HEIGHT / 2 - 2, TimelinePanel.FRAME_WIDTH / 2, TimelinePanel.FRAME_HEIGHT / 2); + g.setColor(stopBorderColor); + g.drawRect((draw_f + num_frames - 1) * TimelinePanel.FRAME_WIDTH + TimelinePanel.FRAME_WIDTH / 4, d * TimelinePanel.FRAME_HEIGHT + TimelinePanel.FRAME_HEIGHT / 2 - 2, TimelinePanel.FRAME_WIDTH / 2, TimelinePanel.FRAME_HEIGHT / 2); + + g.setColor(borderLinesColor); + for (int n = draw_f + 1; n < draw_f + num_frames; n++) { + g.drawLine(n * TimelinePanel.FRAME_WIDTH, d * TimelinePanel.FRAME_HEIGHT + 1, n * TimelinePanel.FRAME_WIDTH, d * TimelinePanel.FRAME_HEIGHT + borderLinesLength); + g.drawLine(n * TimelinePanel.FRAME_WIDTH, d * TimelinePanel.FRAME_HEIGHT + TimelinePanel.FRAME_HEIGHT - 1, n * TimelinePanel.FRAME_WIDTH, d * TimelinePanel.FRAME_HEIGHT + TimelinePanel.FRAME_HEIGHT - borderLinesLength); + } + } + } + } + } + + if (cursor != null && cursor.x >= start_f && cursor.x <= end_f) { + g.setColor(TimelinePanel.selectedBorderColor); + g.drawLine(cursor.x * TimelinePanel.FRAME_WIDTH + TimelinePanel.FRAME_WIDTH / 2, 0, cursor.x * TimelinePanel.FRAME_WIDTH + TimelinePanel.FRAME_WIDTH / 2, getHeight()); + } + } + + @Override + public void mouseClicked(MouseEvent e) { + + } + + public void frameSelect(int frame, int depth) { + if (cursor != null && cursor.x == frame && (cursor.y == depth || depth == -1)) { + return; + } + if (depth == -1 && cursor != null) { + depth = cursor.y; + } + cursor = new Point(frame, depth); + for (FrameSelectionListener l : listeners) { + l.frameSelected(frame, -1); + } + repaint(); + } + + @Override + public void mousePressed(MouseEvent e) { + Point p = e.getPoint(); + p.x = p.x / TimelinePanel.FRAME_WIDTH; + p.y = p.y / TimelinePanel.FRAME_HEIGHT; + if (p.x >= timeLine.getFrameCount()) { + p.x = timeLine.getFrameCount() - 1; + } + if (p.y > timeLine.getMaxDepth()) { + p.y = timeLine.getMaxDepth(); + } + frameSelect(p.x, p.y); + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + + @Override + public void mouseEntered(MouseEvent e) { + + } + + @Override + public void mouseExited(MouseEvent e) { + + } + +} diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineDepthPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineDepthPanel.java new file mode 100644 index 000000000..68a158b5f --- /dev/null +++ b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineDepthPanel.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2010-2014 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.timeline; + +import com.jpexs.decompiler.flash.timeline.Timeline; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Rectangle; +import javax.swing.JPanel; + +/** + * + * @author JPEXS + */ +public class TimelineDepthPanel extends JPanel { + + private int maxDepth; + public static final int padding = 5; + public static final float fontSize = 10.0f; + private int scrollOffset = 0; + public static final Color borderColor = Color.lightGray; + public static final Color fontColor = Color.black; + + public TimelineDepthPanel(Timeline timeline) { + maxDepth = timeline.getMaxDepth(); + String maxDepthStr = "" + maxDepth; + setFont(getFont().deriveFont(fontSize)); + int maxDepthW = getFontMetrics(getFont()).stringWidth(maxDepthStr); + Dimension dim = new Dimension(maxDepthW + 2 * padding, Integer.MAX_VALUE); + setSize(dim); + setPreferredSize(dim); + } + + public void scroll(int offset) { + this.scrollOffset = offset; + repaint(); + } + + @Override + protected void paintComponent(Graphics g) { + Rectangle clip = g.getClipBounds(); + int yofs = TimelinePanel.FRAME_HEIGHT - (scrollOffset % TimelinePanel.FRAME_HEIGHT); + int start_d = (scrollOffset + clip.y) / TimelinePanel.FRAME_HEIGHT; + int end_d = (scrollOffset + clip.y + clip.height) / TimelinePanel.FRAME_HEIGHT; + int d_count = end_d - start_d; + g.setColor(TimelinePanel.backgroundColor); + g.fillRect(0, 0, getWidth(), getHeight()); + for (int d = 0; d < d_count; d++) { + g.setColor(borderColor); + g.drawLine(0, yofs + d * TimelinePanel.FRAME_HEIGHT + 1, getWidth(), yofs + d * TimelinePanel.FRAME_HEIGHT + 1); + int curr_d = start_d + d; + g.setColor(fontColor); + g.drawString("" + (start_d + d == 0 ? "a" : curr_d), padding, yofs + d * TimelinePanel.FRAME_HEIGHT - padding); + } + } + +} diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineFrame.java new file mode 100644 index 000000000..81b0b8d77 --- /dev/null +++ b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineFrame.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2010-2014 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.timeline; + +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.gui.AppFrame; +import com.jpexs.decompiler.flash.gui.View; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Image; +import java.util.ArrayList; + +/** + * + * @author JPEXS + */ +public class TimelineFrame extends AppFrame { + + public TimelinePanel timeline; + + public TimelineFrame(SWF swf) { + setSize(800, 600); + View.setWindowIcon(this); + View.centerScreen(this); + setTitle(translate("dialog.title")); + Container cnt = getContentPane(); + cnt.setLayout(new BorderLayout()); + cnt.add(timeline = new TimelinePanel(swf), BorderLayout.CENTER); + + java.util.List images = new ArrayList<>(); + images.add(View.loadImage("timeline16")); + images.add(View.loadImage("timeline32")); + setIconImages(images); + } +} diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelinePanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelinePanel.java new file mode 100644 index 000000000..71a725c4c --- /dev/null +++ b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelinePanel.java @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2010-2014 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.timeline; + +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.gui.View; +import com.jpexs.decompiler.flash.timeline.Timeline; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.AdjustmentEvent; +import java.awt.event.AdjustmentListener; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JPanel; +import javax.swing.JScrollPane; + +/** + * + * @author JPEXS + */ +public class TimelinePanel extends JPanel { + + public TimelineBodyPanel timelineBodyPanel; + public TimelineTimePanel timePanel; + public TimelineDepthPanel depthPanel; + public Timeline timeline; + + public static final int FRAME_WIDTH = 8; + public static final int FRAME_HEIGHT = 18; + + public static Color selectedColor = new Color(0xff, 0x99, 0x99); + public static Color selectedBorderColor = new Color(0xcc, 0, 0); + public static Color backgroundColor = new Color(0xee, 0xee, 0xee); + + public TimelinePanel(SWF swf) { + timeline = new Timeline(swf); + timelineBodyPanel = new TimelineBodyPanel(timeline); + setLayout(new BorderLayout()); + + JScrollPane sp = new JScrollPane(timelineBodyPanel); + + depthPanel = new TimelineDepthPanel(timeline); + + timePanel = new TimelineTimePanel(); + + JPanel row1Panel = new JPanel(); + row1Panel.setLayout(new BorderLayout()); + JPanel sepPanel = new JPanel(); + sepPanel.setBackground(TimelinePanel.backgroundColor); + sepPanel.setPreferredSize(new Dimension(depthPanel.getWidth(), timePanel.getHeight())); + row1Panel.add(sepPanel, BorderLayout.WEST); + row1Panel.add(timePanel, BorderLayout.CENTER); + + JPanel row2Panel = new JPanel(); + row2Panel.setLayout(new BorderLayout()); + row2Panel.add(depthPanel, BorderLayout.WEST); + row2Panel.add(sp, BorderLayout.CENTER); + + add(row1Panel, BorderLayout.NORTH); + add(row2Panel, BorderLayout.CENTER); + + sp.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() { + @Override + public void adjustmentValueChanged(AdjustmentEvent e) { + timePanel.scroll(e.getValue()); + } + }); + sp.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { + + @Override + public void adjustmentValueChanged(AdjustmentEvent e) { + depthPanel.scroll(e.getValue()); + } + }); + + final TimelineTimePanel ftime = timePanel; + timelineBodyPanel.addFrameSelectionListener(new FrameSelectionListener() { + + @Override + public void frameSelected(int frame, int depth) { + ftime.frameSelect(frame); + } + }); + final TimelineBodyPanel ftimeline = timelineBodyPanel; + timePanel.addFrameSelectionListener(new FrameSelectionListener() { + + @Override + public void frameSelected(int frame, int depth) { + ftimeline.frameSelect(frame, depth); + } + }); + + } +} diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineTimePanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineTimePanel.java new file mode 100644 index 000000000..22110568f --- /dev/null +++ b/trunk/src/com/jpexs/decompiler/flash/gui/timeline/TimelineTimePanel.java @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2010-2014 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.timeline; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Rectangle; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.ArrayList; +import java.util.List; +import javax.swing.JPanel; + +/** + * + * @author JPEXS + */ +public class TimelineTimePanel extends JPanel implements MouseListener { + + public static final Color borderColor = Color.black; + public static final int lineLength = 3; + public static final int lineTextSpace = 3; + public static final Color fontColor = Color.black; + public float fontSize = 10.0f; + private int scrollOffset = 0; + private int selectedFrame = -1; + private List listeners = new ArrayList<>(); + + public TimelineTimePanel() { + Dimension dim = new Dimension(Integer.MAX_VALUE, TimelinePanel.FRAME_HEIGHT); + setSize(dim); + setPreferredSize(dim); + addMouseListener(this); + } + + public void addFrameSelectionListener(FrameSelectionListener l) { + listeners.add(l); + } + + public void removeFrameSelectionListener(FrameSelectionListener l) { + listeners.remove(l); + } + + public void frameSelect(int frame) { + if (selectedFrame == frame) { + return; + } + for (FrameSelectionListener l : listeners) { + l.frameSelected(frame, -1); + } + selectedFrame = frame; + repaint(); + } + + public void scroll(int offset) { + this.scrollOffset = offset; + repaint(); + } + + @Override + protected void paintComponent(Graphics g) { + Rectangle clip = g.getClipBounds(); + int start_f = (scrollOffset + clip.x) / TimelinePanel.FRAME_WIDTH; + int end_f = (scrollOffset + clip.x + clip.width) / TimelinePanel.FRAME_WIDTH; + g.setColor(TimelinePanel.backgroundColor); + g.fillRect(0, 0, getWidth(), getHeight()); + g.setColor(borderColor); + int xofs = TimelinePanel.FRAME_WIDTH - scrollOffset % TimelinePanel.FRAME_WIDTH - 1; + for (int f = 0; f <= end_f; f++) { + g.drawLine(xofs + f * TimelinePanel.FRAME_WIDTH + 1, TimelinePanel.FRAME_HEIGHT - 1, xofs + f * TimelinePanel.FRAME_WIDTH + 1, TimelinePanel.FRAME_HEIGHT - lineLength); + } + g.setFont(g.getFont().deriveFont(fontSize)); + for (int f = 0; f <= end_f; f++) { + int cur_f = start_f + f; + if (selectedFrame == cur_f) { + g.setColor(TimelinePanel.selectedColor); + g.fillRect(xofs + (f - 1) * TimelinePanel.FRAME_WIDTH + 1, 0, TimelinePanel.FRAME_WIDTH, TimelinePanel.FRAME_HEIGHT - 1); + g.setColor(TimelinePanel.selectedBorderColor); + g.drawRect(xofs + (f - 1) * TimelinePanel.FRAME_WIDTH + 1, 0, TimelinePanel.FRAME_WIDTH, TimelinePanel.FRAME_HEIGHT - 1); + } + g.setColor(fontColor); + if ((cur_f + 1) % 5 == 0 || cur_f == 0) { + String timeStr = "" + (cur_f + 1); + int w = g.getFontMetrics().stringWidth(timeStr); + g.drawString(timeStr, xofs + (f - 1) * TimelinePanel.FRAME_WIDTH + TimelinePanel.FRAME_WIDTH / 2 - w / 2, TimelinePanel.FRAME_HEIGHT - lineLength - lineTextSpace); + } + } + } + + @Override + public void mouseClicked(MouseEvent e) { + } + + @Override + public void mousePressed(MouseEvent e) { + frameSelect((scrollOffset + e.getX()) / TimelinePanel.FRAME_WIDTH); + } + + @Override + public void mouseReleased(MouseEvent e) { + } + + @Override + public void mouseEntered(MouseEvent e) { + } + + @Override + public void mouseExited(MouseEvent e) { + } + +} diff --git a/trunk/src/com/jpexs/decompiler/flash/timeline/DepthState.java b/trunk/src/com/jpexs/decompiler/flash/timeline/DepthState.java index 765adcbd6..4c3d39d19 100644 --- a/trunk/src/com/jpexs/decompiler/flash/timeline/DepthState.java +++ b/trunk/src/com/jpexs/decompiler/flash/timeline/DepthState.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 JPEXS + * Copyright (C) 2010-2014 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 diff --git a/trunk/src/com/jpexs/decompiler/flash/timeline/Frame.java b/trunk/src/com/jpexs/decompiler/flash/timeline/Frame.java index 20f64d900..23dcf5ed7 100644 --- a/trunk/src/com/jpexs/decompiler/flash/timeline/Frame.java +++ b/trunk/src/com/jpexs/decompiler/flash/timeline/Frame.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 JPEXS + * Copyright (C) 2010-2014 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 @@ -16,6 +16,7 @@ */ package com.jpexs.decompiler.flash.timeline; +import com.jpexs.decompiler.flash.tags.DoActionTag; import java.util.HashMap; import java.util.Map; @@ -26,6 +27,7 @@ import java.util.Map; public class Frame { public Map layers = new HashMap<>(); + public DoActionTag action; public Frame() { diff --git a/trunk/src/com/jpexs/decompiler/flash/timeline/TimeLine.java b/trunk/src/com/jpexs/decompiler/flash/timeline/TimeLine.java index f4163177c..dff866bef 100644 --- a/trunk/src/com/jpexs/decompiler/flash/timeline/TimeLine.java +++ b/trunk/src/com/jpexs/decompiler/flash/timeline/TimeLine.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 JPEXS + * Copyright (C) 2010-2014 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 @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.timeline; import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.tags.DoActionTag; import com.jpexs.decompiler.flash.tags.ShowFrameTag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.tags.base.PlaceObjectTypeTag; @@ -33,11 +34,11 @@ import java.util.List; * * @author JPEXS */ -public class TimeLine { +public class Timeline { public List frames = new ArrayList<>(); - public TimeLine() { + public Timeline() { } public int getMaxDepth() { @@ -56,7 +57,7 @@ public class TimeLine { return frames.size(); } - public TimeLine(SWF swf) { + public Timeline(SWF swf) { Frame frame = new Frame(); for (Tag t : swf.tags) { if (t instanceof PlaceObjectTypeTag) { @@ -126,6 +127,9 @@ public class TimeLine { int depth = r.getDepth(); frame.layers.remove(depth); } + if (t instanceof DoActionTag) { + frame.action = (DoActionTag) t; + } if (t instanceof ShowFrameTag) { frames.add(frame); frame = new Frame(frame);