From 36eb046291154b5ef27b819c148d159cdade0f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Fri, 25 Nov 2016 15:11:43 +0100 Subject: [PATCH] Opening iggy files as bundles (read only) - still WIP --- .../jpexs/decompiler/flash/SWFSourceInfo.java | 207 +-- .../flash/iggy/conversion/IggySwfBundle.java | 104 ++ .../flash/gui/AdvancedSettingsDialog.java | 1252 ++++++------- src/com/jpexs/decompiler/flash/gui/Main.java | 15 +- .../decompiler/flash/gui/TreeNodeType.java | 107 +- .../flash/gui/graphics/bundleiggy16.png | Bin 0 -> 879 bytes .../flash/gui/locales/MainFrame.properties | 1554 +++++++++-------- .../flash/gui/locales/MainFrame_cs.properties | 1510 ++++++++-------- .../decompiler/flash/gui/tagtree/TagTree.java | 1375 +++++++-------- 9 files changed, 3126 insertions(+), 2998 deletions(-) create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/conversion/IggySwfBundle.java create mode 100644 src/com/jpexs/decompiler/flash/gui/graphics/bundleiggy16.png diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFSourceInfo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFSourceInfo.java index 9af054810..7b46e778f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFSourceInfo.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFSourceInfo.java @@ -1,102 +1,105 @@ -/* - * Copyright (C) 2010-2016 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash; - -import com.jpexs.helpers.Path; -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; - -/** - * - * @author JPEXS - */ -public class SWFSourceInfo { - - private final InputStream inputStream; - - private String file; - - private final String fileTitle; - - public SWFSourceInfo(InputStream inputStream, String file, String fileTitle) { - this.inputStream = inputStream; - this.file = file; - this.fileTitle = fileTitle; - } - - public InputStream getInputStream() { - return inputStream; - } - - public String getFile() { - return file; - } - - public void setFile(String file) { - this.file = file; - } - - public String getFileTitle() { - return fileTitle; - } - - /** - * Get title of the file - * - * @return file title - */ - public String getFileTitleOrName() { - if (fileTitle != null) { - return fileTitle; - } - return file; - } - - public boolean isBundle() { - if (inputStream == null) { - File fileObj = new File(file); - String fileName = fileObj.getName(); - if (fileName.startsWith("asdec_") && fileName.endsWith(".tmp")) { - return false; - } - String extension = Path.getExtension(fileObj); - return extension == null || !(extension.equals(".swf") || extension.equals(".gfx")); - } - return false; - } - - public SWFBundle getBundle(boolean noCheck, SearchMode searchMode) throws IOException { - if (!isBundle()) { - return null; - } - - String extension = Path.getExtension(new File(file)); - if (extension != null) { - switch (extension) { - case ".swc": - return new SWC(new File(file)); - case ".zip": - return new ZippedSWFBundle(new File(file)); - } - } - - return new BinarySWFBundle(new BufferedInputStream(new FileInputStream(file)), noCheck, searchMode); - } -} +/* + * Copyright (C) 2010-2016 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash; + +import com.jpexs.decompiler.flash.iggy.conversion.IggySwfBundle; +import com.jpexs.helpers.Path; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * + * @author JPEXS + */ +public class SWFSourceInfo { + + private final InputStream inputStream; + + private String file; + + private final String fileTitle; + + public SWFSourceInfo(InputStream inputStream, String file, String fileTitle) { + this.inputStream = inputStream; + this.file = file; + this.fileTitle = fileTitle; + } + + public InputStream getInputStream() { + return inputStream; + } + + public String getFile() { + return file; + } + + public void setFile(String file) { + this.file = file; + } + + public String getFileTitle() { + return fileTitle; + } + + /** + * Get title of the file + * + * @return file title + */ + public String getFileTitleOrName() { + if (fileTitle != null) { + return fileTitle; + } + return file; + } + + public boolean isBundle() { + if (inputStream == null) { + File fileObj = new File(file); + String fileName = fileObj.getName(); + if (fileName.startsWith("asdec_") && fileName.endsWith(".tmp")) { + return false; + } + String extension = Path.getExtension(fileObj); + return extension == null || !(extension.equals(".swf") || extension.equals(".gfx")); + } + return false; + } + + public SWFBundle getBundle(boolean noCheck, SearchMode searchMode) throws IOException { + if (!isBundle()) { + return null; + } + + String extension = Path.getExtension(new File(file)); + if (extension != null) { + switch (extension) { + case ".swc": + return new SWC(new File(file)); + case ".zip": + return new ZippedSWFBundle(new File(file)); + case ".iggy": + return new IggySwfBundle(new File(file)); + } + } + + return new BinarySWFBundle(new BufferedInputStream(new FileInputStream(file)), noCheck, searchMode); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/conversion/IggySwfBundle.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/conversion/IggySwfBundle.java new file mode 100644 index 000000000..d3f7199d1 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/conversion/IggySwfBundle.java @@ -0,0 +1,104 @@ +package com.jpexs.decompiler.flash.iggy.conversion; + +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.SWFBundle; +import com.jpexs.decompiler.flash.iggy.IggyFile; +import com.jpexs.helpers.Helper; +import com.jpexs.helpers.MemoryInputStream; +import com.jpexs.helpers.ReReadableInputStream; +import com.jpexs.helpers.streams.SeekableInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +/** + * + * @author JPEXS + */ +public class IggySwfBundle implements SWFBundle { + + private IggyFile iggyFile; + + public IggySwfBundle(InputStream is) throws IOException { + this(is, null); + } + + public IggySwfBundle(File filename) throws IOException { + this(null, filename); + } + + protected IggySwfBundle(InputStream is, File filename) throws IOException { + initBundle(is, filename); + } + + protected void initBundle(InputStream is, File filename) throws IOException { + if (filename == null) { + filename = File.createTempFile("bundle", ".iggy"); + Helper.saveStream(is, filename); + } + iggyFile = new IggyFile(filename); + } + + @Override + public int length() { + return iggyFile.getSwfCount(); + } + + @Override + public Set getKeys() { + Set ret = new TreeSet<>(); + for (int i = 0; i < length(); i++) { + ret.add(iggyFile.getSwfName(i)); + } + return ret; + } + + private int keyToSwfIndex(String key) { + for (int i = 0; i < length(); i++) { + if (key.equals(iggyFile.getSwfName(i))) { + return i; + } + } + throw new IllegalArgumentException("Key " + key + " does not exist!"); + } + + @Override + public SeekableInputStream getSWF(String key) throws IOException { + SWF swf = IggyToSwfConvertor.getSwf(iggyFile, keyToSwfIndex(key)); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + swf.saveTo(baos); + MemoryInputStream mis = new MemoryInputStream(baos.toByteArray()); + return mis; + } + + @Override + public Map getAll() throws IOException { + Map ret = new HashMap<>(); + for (String key : getKeys()) { + ret.put(key, getSWF(key)); + } + return ret; + } + + @Override + public String getExtension() { + return "iggy"; + } + + @Override + public boolean isReadOnly() { + return true; //TODO: make writable + } + + @Override + public boolean putSWF(String key, InputStream is) throws IOException { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/src/com/jpexs/decompiler/flash/gui/AdvancedSettingsDialog.java b/src/com/jpexs/decompiler/flash/gui/AdvancedSettingsDialog.java index 380f23688..f880818a6 100644 --- a/src/com/jpexs/decompiler/flash/gui/AdvancedSettingsDialog.java +++ b/src/com/jpexs/decompiler/flash/gui/AdvancedSettingsDialog.java @@ -1,626 +1,626 @@ -/* - * Copyright (C) 2010-2016 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.configuration.Configuration; -import com.jpexs.decompiler.flash.configuration.ConfigurationCategory; -import com.jpexs.decompiler.flash.configuration.ConfigurationDirectory; -import com.jpexs.decompiler.flash.configuration.ConfigurationFile; -import com.jpexs.decompiler.flash.configuration.ConfigurationInternal; -import com.jpexs.decompiler.flash.configuration.ConfigurationItem; -import com.jpexs.decompiler.flash.gui.helpers.SpringUtilities; -import com.jpexs.helpers.Helper; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Insets; -import java.awt.RenderingHints; -import java.awt.event.ActionEvent; -import java.io.File; -import java.lang.reflect.Field; -import java.lang.reflect.ParameterizedType; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collections; -import java.util.Comparator; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.ResourceBundle; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.swing.Icon; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTabbedPane; -import javax.swing.JTextField; -import javax.swing.SpringLayout; -import javax.swing.WindowConstants; -import javax.swing.filechooser.FileFilter; -import javax.swing.table.DefaultTableModel; -import org.pushingpixels.substance.api.ColorSchemeAssociationKind; -import org.pushingpixels.substance.api.ComponentState; -import org.pushingpixels.substance.api.DecorationAreaType; -import org.pushingpixels.substance.api.SubstanceLookAndFeel; -import org.pushingpixels.substance.api.SubstanceSkin; -import org.pushingpixels.substance.api.renderers.SubstanceDefaultListCellRenderer; -import org.pushingpixels.substance.api.skin.SkinInfo; - -/** - * - * @author JPEXS - */ -public class AdvancedSettingsDialog extends AppDialog { - - private final Map componentsMap = new HashMap<>(); - - private JButton cancelButton; - - private JButton okButton; - - private JButton resetButton; - - /** - * Creates new form AdvancedSettingsDialog - * - * @param selectedCategory - */ - public AdvancedSettingsDialog(String selectedCategory) { - initComponents(selectedCategory); - View.centerScreen(this); - View.setWindowIcon(this); - - //configurationTable.setCellEditor(configurationTable.getDefaultEditor(null)); - pack(); - } - - private DefaultTableModel getModel() { - return new DefaultTableModel( - new Object[][]{}, - new String[]{ - translate("advancedSettings.columns.name"), - translate("advancedSettings.columns.value"), - translate("advancedSettings.columns.description") - } - ) { - Class[] types = new Class[]{ - String.class, Object.class, String.class - }; - - boolean[] canEdit = new boolean[]{ - false, true, false - }; - - @Override - public Class getColumnClass(int columnIndex) { - return types[columnIndex]; - } - - @Override - public boolean isCellEditable(int rowIndex, int columnIndex) { - return canEdit[columnIndex]; - } - }; - } - - private static class SkinSelect { - - private final String name; - - private final String className; - - public SkinSelect(String name, String className) { - this.name = name; - this.className = className; - } - - public String getClassName() { - return className; - } - - @Override - public String toString() { - return name; - } - } - - private void initComponents(String selectedCategory) { - okButton = new JButton(); - cancelButton = new JButton(); - resetButton = new JButton(); - - setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - setTitle(translate("advancedSettings.dialog.title")); - setModal(true); - setPreferredSize(new Dimension(800, 500)); - - okButton.setText(AppStrings.translate("button.ok")); - okButton.addActionListener(this::okButtonActionPerformed); - - cancelButton.setText(AppStrings.translate("button.cancel")); - cancelButton.addActionListener(this::cancelButtonActionPerformed); - - resetButton.setText(AppStrings.translate("button.reset")); - resetButton.addActionListener(this::resetButtonActionPerformed); - - Container cnt = getContentPane(); - cnt.setLayout(new BorderLayout()); - //cnt.add(new JScrollPane(configurationTable),BorderLayout.CENTER); - - JPanel buttonsPanel = new JPanel(new BorderLayout()); - - JPanel buttonsLeftPanel = new JPanel(new FlowLayout()); - buttonsLeftPanel.add(resetButton, BorderLayout.WEST); - - buttonsPanel.add(buttonsLeftPanel, BorderLayout.WEST); - - JPanel buttonsRightPanel = new JPanel(new FlowLayout()); - buttonsRightPanel.add(cancelButton); - buttonsRightPanel.add(okButton); - buttonsPanel.add(buttonsRightPanel, BorderLayout.EAST); - - cnt.add(buttonsPanel, BorderLayout.SOUTH); - - JTabbedPane tabPane = new JTabbedPane(); - - JComboBox skinComboBox = new JComboBox<>(); - skinComboBox.setRenderer(new SubstanceDefaultListCellRenderer() { - - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - SubstanceDefaultListCellRenderer cmp = (SubstanceDefaultListCellRenderer) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); //To change body of generated methods, choose Tools | Templates. - final SkinSelect ss = (SkinSelect) value; - cmp.setIcon(new Icon() { - - @Override - public void paintIcon(Component c, Graphics g, int x, int y) { - Graphics2D g2 = (Graphics2D) g; - g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); - g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - try { - Class act = Class.forName(ss.getClassName()); - SubstanceSkin skin = (SubstanceSkin) act.newInstance(); - Color fill = skin.getColorScheme(DecorationAreaType.GENERAL, ColorSchemeAssociationKind.FILL, ComponentState.ENABLED).getBackgroundFillColor(); - Color hilight = skin.getColorScheme(DecorationAreaType.GENERAL, ColorSchemeAssociationKind.FILL, ComponentState.ROLLOVER_SELECTED).getBackgroundFillColor(); - Color border = skin.getColorScheme(DecorationAreaType.GENERAL, ColorSchemeAssociationKind.BORDER, ComponentState.ENABLED).getDarkColor(); - g2.setColor(fill); - g2.fillOval(0, 0, 16, 16); - g2.setColor(hilight); - g2.fillArc(0, 0, 16, 16, -45, 90); - g2.setColor(border); - g2.drawOval(0, 0, 16, 16); - - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) { - //no icon - } - - } - - @Override - public int getIconWidth() { - return 16; - } - - @Override - public int getIconHeight() { - return 16; - } - }); - return cmp; - } - - }); - skinComboBox.addItem(new SkinSelect(OceanicSkin.NAME, OceanicSkin.class.getName())); - Map skins = SubstanceLookAndFeel.getAllSkins(); - for (String skinKey : skins.keySet()) { - SkinInfo skin = skins.get(skinKey); - skinComboBox.addItem(new SkinSelect(skin.getDisplayName(), skin.getClassName())); - if (skin.getClassName().equals(Configuration.guiSkin.get())) { - skinComboBox.setSelectedIndex(skinComboBox.getItemCount() - 1); - } - } - - Map tabs = new HashMap<>(); - getCategories(componentsMap, tabs, skinComboBox, getResourceBundle()); - - String[] catOrder = new String[]{"ui", "display", "decompilation", "script", "format", "export", "import", "paths", "limit", "update", "debug", "other"}; - - for (String cat : catOrder) { - if (!tabs.containsKey(cat)) { - continue; - } - - tabPane.add(translate("config.group.name." + cat), tabs.get(cat)); - tabPane.setToolTipTextAt(tabPane.getTabCount() - 1, translate("config.group.description." + cat)); - } - if (selectedCategory != null && tabs.containsKey(selectedCategory)) { - tabPane.setSelectedComponent(tabs.get(selectedCategory)); - } - - cnt.add(tabPane, BorderLayout.CENTER); - pack(); - } - - public static String selectConfigFile(ConfigurationItem config, String current, String pattern) { - JFileChooser fc = new JFileChooser(); - fc.setSelectedFile(new File(current)); - fc.setMultiSelectionEnabled(false); - fc.setCurrentDirectory(new File((String) config.get())); - FileFilter allSupportedFilter = new FileFilter() { - private final String[] supportedExtensions = new String[]{".swf", ".gfx", ".swc", ".zip"}; - - @Override - public boolean accept(File f) { - if (f.isDirectory()) { - return true; - } - return f.getName().matches(pattern); - } - - @Override - public String getDescription() { - return ""; - } - }; - fc.setFileFilter(allSupportedFilter); - - fc.setAcceptAllFileFilterUsed(false); - JFrame f = new JFrame(); - View.setWindowIcon(f); - int returnVal = fc.showOpenDialog(f); - if (returnVal == JFileChooser.APPROVE_OPTION) { - return Helper.fixDialogFile(fc.getSelectedFile()).getAbsolutePath(); - } else { - return (String) config.get(); - } - } - - public static void getCategories(Map componentsMap, Map tabs, JComboBox skinComboBox, ResourceBundle resourceBundle) { - Map> categorized = new HashMap<>(); - - Map fields = Configuration.getConfigurationFields(); - String[] keys = new String[fields.size()]; - keys = fields.keySet().toArray(keys); - Arrays.sort(keys); - - for (String name : keys) { - Field field = fields.get(name); - ConfigurationCategory cat = field.getAnnotation(ConfigurationCategory.class); - String scat = (cat == null || cat.value().isEmpty()) ? "other" : cat.value(); - if (!categorized.containsKey(scat)) { - categorized.put(scat, new HashMap<>()); - } - - categorized.get(scat).put(name, field); - } - - for (String cat : categorized.keySet()) { - JPanel configPanel = new JPanel(new SpringLayout()); - int itemCount = 0; - List names = new ArrayList<>(categorized.get(cat).keySet()); - - final Map locNames = new HashMap<>(); - for (String name : names) { - String locName; - - if (resourceBundle.containsKey("config.name." + name)) { - locName = resourceBundle.getString("config.name." + name); - } else { //if it is undocumented, then it must have ConfigurationInternal annotation - Field f = fields.get(name); - ConfigurationInternal cint = f.getAnnotation(ConfigurationInternal.class); - if (cint == null) { - throw new RuntimeException("Missing configuration name: " + name); - } - - locName = "(Internal) " + name; - } - - locNames.put(name, locName); - } - - Collections.sort(names, new Comparator() { - @Override - public int compare(String name1, String name2) { - return locNames.get(name1).compareTo(locNames.get(name2)); - } - }); - for (String name : names) { - Field field = categorized.get(cat).get(name); - - String locName = locNames.get(name); - - try { - ConfigurationItem item = (ConfigurationItem) field.get(null); - - ParameterizedType listType = (ParameterizedType) field.getGenericType(); - java.lang.reflect.Type itemType2 = listType.getActualTypeArguments()[0]; - if (!(itemType2 instanceof Class)) { - continue; - } - - Class itemType = (Class) itemType2; - - String description = ""; - if (resourceBundle.containsKey("config.description." + name)) { - description = resourceBundle.getString("config.description." + name); - } - - Object defaultValue = Configuration.getDefaultValue(field); - if (name.equals("gui.skin")) { - Class c; - try { - c = Class.forName((String) defaultValue); - defaultValue = c.getField("NAME").get(c); - } catch (ClassNotFoundException | NoSuchFieldException | SecurityException ex) { - Logger.getLogger(AdvancedSettingsDialog.class.getName()).log(Level.SEVERE, null, ex); - } - } - - if (defaultValue != null) { - description += " (" + resourceBundle.getString("default") + ": " + defaultValue + ")"; - } - - JLabel l = new JLabel(locName, JLabel.TRAILING); - l.setToolTipText(description); - configPanel.add(l); - Component c = null; - Component addComponent = null; - if (name.equals("gui.skin")) { - skinComboBox.setToolTipText(description); - skinComboBox.setMaximumSize(new Dimension(Integer.MAX_VALUE, skinComboBox.getPreferredSize().height)); - c = skinComboBox; - } else if ((itemType == String.class) || (itemType == Integer.class) || (itemType == Long.class) || (itemType == Double.class) || (itemType == Float.class) || (itemType == Calendar.class)) { - ConfigurationFile confFile = field.getAnnotation(ConfigurationFile.class); - ConfigurationDirectory confDirectory = field.getAnnotation(ConfigurationDirectory.class); - - JTextField tf = new JTextField(); - Object val = item.get(); - if (val == null) { - val = ""; - } - if (itemType == Calendar.class) { - tf.setText(new SimpleDateFormat().format(((Calendar) val).getTime())); - } else { - tf.setText(val.toString()); - } - tf.setToolTipText(description); - tf.setMaximumSize(new Dimension(Integer.MAX_VALUE, tf.getPreferredSize().height)); - - c = tf; - if (confFile != null) { //|| confDirectory != null) { - JPanel p = new JPanel(new BorderLayout()); - p.setMaximumSize(new Dimension(Integer.MAX_VALUE, tf.getPreferredSize().height)); - p.add(tf, BorderLayout.CENTER); - JButton butSelect = new JButton(View.getIcon("folderopen16")); - butSelect.setToolTipText(ResourceBundle.getBundle(AppStrings.getResourcePath(MainFrame.class)).getString("FileChooser.openButtonText")); - butSelect.setMargin(new Insets(2, 2, 2, 2)); - butSelect.addActionListener((ActionEvent e) -> { - tf.setText(selectConfigFile(item, tf.getText(), confFile.value())); - }); - p.add(butSelect, BorderLayout.EAST); - addComponent = p; - } - } else if (itemType == Boolean.class) { - JCheckBox cb = new JCheckBox(); - cb.setSelected((Boolean) item.get()); - cb.setToolTipText(description); - c = cb; - } else if (itemType.isEnum()) { - JComboBox cb = new JComboBox<>(); - @SuppressWarnings("unchecked") - EnumSet enumValues = EnumSet.allOf(itemType); - String stringValue = null; - for (Object enumValue : enumValues) { - String enumValueStr = enumValue.toString(); - if (stringValue == null) { - stringValue = enumValueStr; - } - cb.addItem(enumValueStr); - } - if (item.get() != null) { - stringValue = item.get().toString(); - } - cb.setToolTipText(description); - cb.setSelectedItem(stringValue); - cb.setMaximumSize(new Dimension(Integer.MAX_VALUE, cb.getPreferredSize().height)); - c = cb; - } else { - throw new UnsupportedOperationException("Configuration ttem type '" + itemType.getName() + "' is not supported"); - } - - componentsMap.put(name, c); - if (addComponent == null) { - addComponent = c; - } - l.setLabelFor(c); - configPanel.add(addComponent); - } catch (IllegalArgumentException | IllegalAccessException ex) { - // Reflection exceptions. This should never happen - throw new Error(ex.getMessage()); - } - - itemCount++; - } - - SpringUtilities.makeCompactGrid(configPanel, - itemCount, 2, //rows, cols - 6, 6, //initX, initY - 6, 6); //xPad, yPad - if (resourceBundle.containsKey("config.group.tip." + cat)) { - String tip = resourceBundle.getString("config.group.tip." + cat); - String urls[] = new String[0]; - if (resourceBundle.containsKey("config.group.link." + cat)) { - urls = resourceBundle.getString("config.group.link." + cat).split(" "); - } - for (int i = 0; i < urls.length; i++) { - tip = tip.replace("%link" + (i + 1) + "%", urls[i]); - } - JPanel p = new JPanel(new BorderLayout()); - p.add(configPanel, BorderLayout.CENTER); - JPanel tipPanel = new JPanel(new FlowLayout()); - tipPanel.add(new HtmlLabel("" + resourceBundle.getString("tip") + "" + tip)); - p.add(tipPanel, BorderLayout.SOUTH); - configPanel = p; - } - tabs.put(cat, new JScrollPane(configPanel)); - } - } - - private void showRestartConfirmDialod() { - if (View.showConfirmDialog(this, translate("advancedSettings.restartConfirmation"), AppStrings.translate("message.warning"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { - View.execInEventDispatchLater(() -> { - try { - Thread.sleep(1000); - } catch (InterruptedException ex) { - Logger.getLogger(AdvancedSettingsDialog.class.getName()).log(Level.SEVERE, null, ex); - } - SelectLanguageDialog.reloadUi(); - }); - - } - } - - @SuppressWarnings("unchecked") - private void okButtonActionPerformed(ActionEvent evt) { - boolean modified = false; - Map fields = Configuration.getConfigurationFields(); - Map values = new HashMap<>(); - for (String name : fields.keySet()) { - Component c = componentsMap.get(name); - Object value = null; - - ParameterizedType listType = (ParameterizedType) fields.get(name).getGenericType(); - java.lang.reflect.Type itemType2 = listType.getActualTypeArguments()[0]; - if (!(itemType2 instanceof Class)) { - continue; - } - - Class itemType = (Class) itemType2; - if (name.equals("gui.skin")) { - value = ((SkinSelect) ((JComboBox) c).getSelectedItem()).className; - } else if (itemType == String.class) { - value = ((JTextField) c).getText(); - } - if (itemType == Boolean.class) { - value = ((JCheckBox) c).isSelected(); - } - - if (itemType == Calendar.class) { - Calendar cal = Calendar.getInstance(); - try { - cal.setTime(new SimpleDateFormat().parse(((JTextField) c).getText())); - } catch (ParseException ex) { - c.requestFocusInWindow(); - return; - } - value = cal; - } - - if (itemType.isEnum()) { - String stringValue = (String) ((JComboBox) c).getSelectedItem(); - value = Enum.valueOf(itemType, stringValue); - } - - try { - if (itemType == Integer.class) { - value = Integer.parseInt(((JTextField) c).getText()); - } - if (itemType == Long.class) { - value = Long.parseLong(((JTextField) c).getText()); - } - if (itemType == Double.class) { - value = Double.parseDouble(((JTextField) c).getText()); - } - if (itemType == Float.class) { - value = Float.parseFloat(((JTextField) c).getText()); - } - } catch (NumberFormatException nfe) { - if (!((JTextField) c).getText().isEmpty()) { - c.requestFocusInWindow(); - return; - } // else null - } - values.put(name, value); - } - - for (String name : fields.keySet()) { - Component c = componentsMap.get(name); - Object value = values.get(name); - - Field field = fields.get(name); - ConfigurationItem item = null; - try { - item = (ConfigurationItem) field.get(null); - } catch (IllegalArgumentException | IllegalAccessException ex) { - // Reflection exceptions. This should never happen - throw new Error(ex.getMessage()); - } - if (item.get() == null || !item.get().equals(value)) { - if (item.hasValue() || value != null) { - item.set(value); - modified = true; - } - } - } - Configuration.saveConfig(); - setVisible(false); - if (modified) { - showRestartConfirmDialod(); - } - } - - private void cancelButtonActionPerformed(ActionEvent evt) { - setVisible(false); - } - - private void resetButtonActionPerformed(ActionEvent evt) { - Map rfields = Configuration.getConfigurationFields(); - for (Entry entry : rfields.entrySet()) { - String name = entry.getKey(); - Field field = entry.getValue(); - try { - ConfigurationItem item = (ConfigurationItem) field.get(null); - item.unset(); - } catch (IllegalArgumentException | IllegalAccessException ex) { - // Reflection exceptions. This should never happen - throw new Error(ex.getMessage()); - } - } - Configuration.saveConfig(); - setVisible(false); - showRestartConfirmDialod(); - } -} +/* + * Copyright (C) 2010-2016 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.configuration.Configuration; +import com.jpexs.decompiler.flash.configuration.ConfigurationCategory; +import com.jpexs.decompiler.flash.configuration.ConfigurationDirectory; +import com.jpexs.decompiler.flash.configuration.ConfigurationFile; +import com.jpexs.decompiler.flash.configuration.ConfigurationInternal; +import com.jpexs.decompiler.flash.configuration.ConfigurationItem; +import com.jpexs.decompiler.flash.gui.helpers.SpringUtilities; +import com.jpexs.helpers.Helper; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.awt.RenderingHints; +import java.awt.event.ActionEvent; +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.ResourceBundle; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.Icon; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextField; +import javax.swing.SpringLayout; +import javax.swing.WindowConstants; +import javax.swing.filechooser.FileFilter; +import javax.swing.table.DefaultTableModel; +import org.pushingpixels.substance.api.ColorSchemeAssociationKind; +import org.pushingpixels.substance.api.ComponentState; +import org.pushingpixels.substance.api.DecorationAreaType; +import org.pushingpixels.substance.api.SubstanceLookAndFeel; +import org.pushingpixels.substance.api.SubstanceSkin; +import org.pushingpixels.substance.api.renderers.SubstanceDefaultListCellRenderer; +import org.pushingpixels.substance.api.skin.SkinInfo; + +/** + * + * @author JPEXS + */ +public class AdvancedSettingsDialog extends AppDialog { + + private final Map componentsMap = new HashMap<>(); + + private JButton cancelButton; + + private JButton okButton; + + private JButton resetButton; + + /** + * Creates new form AdvancedSettingsDialog + * + * @param selectedCategory + */ + public AdvancedSettingsDialog(String selectedCategory) { + initComponents(selectedCategory); + View.centerScreen(this); + View.setWindowIcon(this); + + //configurationTable.setCellEditor(configurationTable.getDefaultEditor(null)); + pack(); + } + + private DefaultTableModel getModel() { + return new DefaultTableModel( + new Object[][]{}, + new String[]{ + translate("advancedSettings.columns.name"), + translate("advancedSettings.columns.value"), + translate("advancedSettings.columns.description") + } + ) { + Class[] types = new Class[]{ + String.class, Object.class, String.class + }; + + boolean[] canEdit = new boolean[]{ + false, true, false + }; + + @Override + public Class getColumnClass(int columnIndex) { + return types[columnIndex]; + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return canEdit[columnIndex]; + } + }; + } + + private static class SkinSelect { + + private final String name; + + private final String className; + + public SkinSelect(String name, String className) { + this.name = name; + this.className = className; + } + + public String getClassName() { + return className; + } + + @Override + public String toString() { + return name; + } + } + + private void initComponents(String selectedCategory) { + okButton = new JButton(); + cancelButton = new JButton(); + resetButton = new JButton(); + + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + setTitle(translate("advancedSettings.dialog.title")); + setModal(true); + setPreferredSize(new Dimension(800, 500)); + + okButton.setText(AppStrings.translate("button.ok")); + okButton.addActionListener(this::okButtonActionPerformed); + + cancelButton.setText(AppStrings.translate("button.cancel")); + cancelButton.addActionListener(this::cancelButtonActionPerformed); + + resetButton.setText(AppStrings.translate("button.reset")); + resetButton.addActionListener(this::resetButtonActionPerformed); + + Container cnt = getContentPane(); + cnt.setLayout(new BorderLayout()); + //cnt.add(new JScrollPane(configurationTable),BorderLayout.CENTER); + + JPanel buttonsPanel = new JPanel(new BorderLayout()); + + JPanel buttonsLeftPanel = new JPanel(new FlowLayout()); + buttonsLeftPanel.add(resetButton, BorderLayout.WEST); + + buttonsPanel.add(buttonsLeftPanel, BorderLayout.WEST); + + JPanel buttonsRightPanel = new JPanel(new FlowLayout()); + buttonsRightPanel.add(cancelButton); + buttonsRightPanel.add(okButton); + buttonsPanel.add(buttonsRightPanel, BorderLayout.EAST); + + cnt.add(buttonsPanel, BorderLayout.SOUTH); + + JTabbedPane tabPane = new JTabbedPane(); + + JComboBox skinComboBox = new JComboBox<>(); + skinComboBox.setRenderer(new SubstanceDefaultListCellRenderer() { + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + SubstanceDefaultListCellRenderer cmp = (SubstanceDefaultListCellRenderer) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); //To change body of generated methods, choose Tools | Templates. + final SkinSelect ss = (SkinSelect) value; + cmp.setIcon(new Icon() { + + @Override + public void paintIcon(Component c, Graphics g, int x, int y) { + Graphics2D g2 = (Graphics2D) g; + g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + try { + Class act = Class.forName(ss.getClassName()); + SubstanceSkin skin = (SubstanceSkin) act.newInstance(); + Color fill = skin.getColorScheme(DecorationAreaType.GENERAL, ColorSchemeAssociationKind.FILL, ComponentState.ENABLED).getBackgroundFillColor(); + Color hilight = skin.getColorScheme(DecorationAreaType.GENERAL, ColorSchemeAssociationKind.FILL, ComponentState.ROLLOVER_SELECTED).getBackgroundFillColor(); + Color border = skin.getColorScheme(DecorationAreaType.GENERAL, ColorSchemeAssociationKind.BORDER, ComponentState.ENABLED).getDarkColor(); + g2.setColor(fill); + g2.fillOval(0, 0, 16, 16); + g2.setColor(hilight); + g2.fillArc(0, 0, 16, 16, -45, 90); + g2.setColor(border); + g2.drawOval(0, 0, 16, 16); + + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) { + //no icon + } + + } + + @Override + public int getIconWidth() { + return 16; + } + + @Override + public int getIconHeight() { + return 16; + } + }); + return cmp; + } + + }); + skinComboBox.addItem(new SkinSelect(OceanicSkin.NAME, OceanicSkin.class.getName())); + Map skins = SubstanceLookAndFeel.getAllSkins(); + for (String skinKey : skins.keySet()) { + SkinInfo skin = skins.get(skinKey); + skinComboBox.addItem(new SkinSelect(skin.getDisplayName(), skin.getClassName())); + if (skin.getClassName().equals(Configuration.guiSkin.get())) { + skinComboBox.setSelectedIndex(skinComboBox.getItemCount() - 1); + } + } + + Map tabs = new HashMap<>(); + getCategories(componentsMap, tabs, skinComboBox, getResourceBundle()); + + String[] catOrder = new String[]{"ui", "display", "decompilation", "script", "format", "export", "import", "paths", "limit", "update", "debug", "other"}; + + for (String cat : catOrder) { + if (!tabs.containsKey(cat)) { + continue; + } + + tabPane.add(translate("config.group.name." + cat), tabs.get(cat)); + tabPane.setToolTipTextAt(tabPane.getTabCount() - 1, translate("config.group.description." + cat)); + } + if (selectedCategory != null && tabs.containsKey(selectedCategory)) { + tabPane.setSelectedComponent(tabs.get(selectedCategory)); + } + + cnt.add(tabPane, BorderLayout.CENTER); + pack(); + } + + public static String selectConfigFile(ConfigurationItem config, String current, String pattern) { + JFileChooser fc = new JFileChooser(); + fc.setSelectedFile(new File(current)); + fc.setMultiSelectionEnabled(false); + fc.setCurrentDirectory(new File((String) config.get())); + FileFilter allSupportedFilter = new FileFilter() { + private final String[] supportedExtensions = new String[]{".swf", ".gfx", ".swc", ".zip", ".iggy"}; + + @Override + public boolean accept(File f) { + if (f.isDirectory()) { + return true; + } + return f.getName().matches(pattern); + } + + @Override + public String getDescription() { + return ""; + } + }; + fc.setFileFilter(allSupportedFilter); + + fc.setAcceptAllFileFilterUsed(false); + JFrame f = new JFrame(); + View.setWindowIcon(f); + int returnVal = fc.showOpenDialog(f); + if (returnVal == JFileChooser.APPROVE_OPTION) { + return Helper.fixDialogFile(fc.getSelectedFile()).getAbsolutePath(); + } else { + return (String) config.get(); + } + } + + public static void getCategories(Map componentsMap, Map tabs, JComboBox skinComboBox, ResourceBundle resourceBundle) { + Map> categorized = new HashMap<>(); + + Map fields = Configuration.getConfigurationFields(); + String[] keys = new String[fields.size()]; + keys = fields.keySet().toArray(keys); + Arrays.sort(keys); + + for (String name : keys) { + Field field = fields.get(name); + ConfigurationCategory cat = field.getAnnotation(ConfigurationCategory.class); + String scat = (cat == null || cat.value().isEmpty()) ? "other" : cat.value(); + if (!categorized.containsKey(scat)) { + categorized.put(scat, new HashMap<>()); + } + + categorized.get(scat).put(name, field); + } + + for (String cat : categorized.keySet()) { + JPanel configPanel = new JPanel(new SpringLayout()); + int itemCount = 0; + List names = new ArrayList<>(categorized.get(cat).keySet()); + + final Map locNames = new HashMap<>(); + for (String name : names) { + String locName; + + if (resourceBundle.containsKey("config.name." + name)) { + locName = resourceBundle.getString("config.name." + name); + } else { //if it is undocumented, then it must have ConfigurationInternal annotation + Field f = fields.get(name); + ConfigurationInternal cint = f.getAnnotation(ConfigurationInternal.class); + if (cint == null) { + throw new RuntimeException("Missing configuration name: " + name); + } + + locName = "(Internal) " + name; + } + + locNames.put(name, locName); + } + + Collections.sort(names, new Comparator() { + @Override + public int compare(String name1, String name2) { + return locNames.get(name1).compareTo(locNames.get(name2)); + } + }); + for (String name : names) { + Field field = categorized.get(cat).get(name); + + String locName = locNames.get(name); + + try { + ConfigurationItem item = (ConfigurationItem) field.get(null); + + ParameterizedType listType = (ParameterizedType) field.getGenericType(); + java.lang.reflect.Type itemType2 = listType.getActualTypeArguments()[0]; + if (!(itemType2 instanceof Class)) { + continue; + } + + Class itemType = (Class) itemType2; + + String description = ""; + if (resourceBundle.containsKey("config.description." + name)) { + description = resourceBundle.getString("config.description." + name); + } + + Object defaultValue = Configuration.getDefaultValue(field); + if (name.equals("gui.skin")) { + Class c; + try { + c = Class.forName((String) defaultValue); + defaultValue = c.getField("NAME").get(c); + } catch (ClassNotFoundException | NoSuchFieldException | SecurityException ex) { + Logger.getLogger(AdvancedSettingsDialog.class.getName()).log(Level.SEVERE, null, ex); + } + } + + if (defaultValue != null) { + description += " (" + resourceBundle.getString("default") + ": " + defaultValue + ")"; + } + + JLabel l = new JLabel(locName, JLabel.TRAILING); + l.setToolTipText(description); + configPanel.add(l); + Component c = null; + Component addComponent = null; + if (name.equals("gui.skin")) { + skinComboBox.setToolTipText(description); + skinComboBox.setMaximumSize(new Dimension(Integer.MAX_VALUE, skinComboBox.getPreferredSize().height)); + c = skinComboBox; + } else if ((itemType == String.class) || (itemType == Integer.class) || (itemType == Long.class) || (itemType == Double.class) || (itemType == Float.class) || (itemType == Calendar.class)) { + ConfigurationFile confFile = field.getAnnotation(ConfigurationFile.class); + ConfigurationDirectory confDirectory = field.getAnnotation(ConfigurationDirectory.class); + + JTextField tf = new JTextField(); + Object val = item.get(); + if (val == null) { + val = ""; + } + if (itemType == Calendar.class) { + tf.setText(new SimpleDateFormat().format(((Calendar) val).getTime())); + } else { + tf.setText(val.toString()); + } + tf.setToolTipText(description); + tf.setMaximumSize(new Dimension(Integer.MAX_VALUE, tf.getPreferredSize().height)); + + c = tf; + if (confFile != null) { //|| confDirectory != null) { + JPanel p = new JPanel(new BorderLayout()); + p.setMaximumSize(new Dimension(Integer.MAX_VALUE, tf.getPreferredSize().height)); + p.add(tf, BorderLayout.CENTER); + JButton butSelect = new JButton(View.getIcon("folderopen16")); + butSelect.setToolTipText(ResourceBundle.getBundle(AppStrings.getResourcePath(MainFrame.class)).getString("FileChooser.openButtonText")); + butSelect.setMargin(new Insets(2, 2, 2, 2)); + butSelect.addActionListener((ActionEvent e) -> { + tf.setText(selectConfigFile(item, tf.getText(), confFile.value())); + }); + p.add(butSelect, BorderLayout.EAST); + addComponent = p; + } + } else if (itemType == Boolean.class) { + JCheckBox cb = new JCheckBox(); + cb.setSelected((Boolean) item.get()); + cb.setToolTipText(description); + c = cb; + } else if (itemType.isEnum()) { + JComboBox cb = new JComboBox<>(); + @SuppressWarnings("unchecked") + EnumSet enumValues = EnumSet.allOf(itemType); + String stringValue = null; + for (Object enumValue : enumValues) { + String enumValueStr = enumValue.toString(); + if (stringValue == null) { + stringValue = enumValueStr; + } + cb.addItem(enumValueStr); + } + if (item.get() != null) { + stringValue = item.get().toString(); + } + cb.setToolTipText(description); + cb.setSelectedItem(stringValue); + cb.setMaximumSize(new Dimension(Integer.MAX_VALUE, cb.getPreferredSize().height)); + c = cb; + } else { + throw new UnsupportedOperationException("Configuration ttem type '" + itemType.getName() + "' is not supported"); + } + + componentsMap.put(name, c); + if (addComponent == null) { + addComponent = c; + } + l.setLabelFor(c); + configPanel.add(addComponent); + } catch (IllegalArgumentException | IllegalAccessException ex) { + // Reflection exceptions. This should never happen + throw new Error(ex.getMessage()); + } + + itemCount++; + } + + SpringUtilities.makeCompactGrid(configPanel, + itemCount, 2, //rows, cols + 6, 6, //initX, initY + 6, 6); //xPad, yPad + if (resourceBundle.containsKey("config.group.tip." + cat)) { + String tip = resourceBundle.getString("config.group.tip." + cat); + String urls[] = new String[0]; + if (resourceBundle.containsKey("config.group.link." + cat)) { + urls = resourceBundle.getString("config.group.link." + cat).split(" "); + } + for (int i = 0; i < urls.length; i++) { + tip = tip.replace("%link" + (i + 1) + "%", urls[i]); + } + JPanel p = new JPanel(new BorderLayout()); + p.add(configPanel, BorderLayout.CENTER); + JPanel tipPanel = new JPanel(new FlowLayout()); + tipPanel.add(new HtmlLabel("" + resourceBundle.getString("tip") + "" + tip)); + p.add(tipPanel, BorderLayout.SOUTH); + configPanel = p; + } + tabs.put(cat, new JScrollPane(configPanel)); + } + } + + private void showRestartConfirmDialod() { + if (View.showConfirmDialog(this, translate("advancedSettings.restartConfirmation"), AppStrings.translate("message.warning"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { + View.execInEventDispatchLater(() -> { + try { + Thread.sleep(1000); + } catch (InterruptedException ex) { + Logger.getLogger(AdvancedSettingsDialog.class.getName()).log(Level.SEVERE, null, ex); + } + SelectLanguageDialog.reloadUi(); + }); + + } + } + + @SuppressWarnings("unchecked") + private void okButtonActionPerformed(ActionEvent evt) { + boolean modified = false; + Map fields = Configuration.getConfigurationFields(); + Map values = new HashMap<>(); + for (String name : fields.keySet()) { + Component c = componentsMap.get(name); + Object value = null; + + ParameterizedType listType = (ParameterizedType) fields.get(name).getGenericType(); + java.lang.reflect.Type itemType2 = listType.getActualTypeArguments()[0]; + if (!(itemType2 instanceof Class)) { + continue; + } + + Class itemType = (Class) itemType2; + if (name.equals("gui.skin")) { + value = ((SkinSelect) ((JComboBox) c).getSelectedItem()).className; + } else if (itemType == String.class) { + value = ((JTextField) c).getText(); + } + if (itemType == Boolean.class) { + value = ((JCheckBox) c).isSelected(); + } + + if (itemType == Calendar.class) { + Calendar cal = Calendar.getInstance(); + try { + cal.setTime(new SimpleDateFormat().parse(((JTextField) c).getText())); + } catch (ParseException ex) { + c.requestFocusInWindow(); + return; + } + value = cal; + } + + if (itemType.isEnum()) { + String stringValue = (String) ((JComboBox) c).getSelectedItem(); + value = Enum.valueOf(itemType, stringValue); + } + + try { + if (itemType == Integer.class) { + value = Integer.parseInt(((JTextField) c).getText()); + } + if (itemType == Long.class) { + value = Long.parseLong(((JTextField) c).getText()); + } + if (itemType == Double.class) { + value = Double.parseDouble(((JTextField) c).getText()); + } + if (itemType == Float.class) { + value = Float.parseFloat(((JTextField) c).getText()); + } + } catch (NumberFormatException nfe) { + if (!((JTextField) c).getText().isEmpty()) { + c.requestFocusInWindow(); + return; + } // else null + } + values.put(name, value); + } + + for (String name : fields.keySet()) { + Component c = componentsMap.get(name); + Object value = values.get(name); + + Field field = fields.get(name); + ConfigurationItem item = null; + try { + item = (ConfigurationItem) field.get(null); + } catch (IllegalArgumentException | IllegalAccessException ex) { + // Reflection exceptions. This should never happen + throw new Error(ex.getMessage()); + } + if (item.get() == null || !item.get().equals(value)) { + if (item.hasValue() || value != null) { + item.set(value); + modified = true; + } + } + } + Configuration.saveConfig(); + setVisible(false); + if (modified) { + showRestartConfirmDialod(); + } + } + + private void cancelButtonActionPerformed(ActionEvent evt) { + setVisible(false); + } + + private void resetButtonActionPerformed(ActionEvent evt) { + Map rfields = Configuration.getConfigurationFields(); + for (Entry entry : rfields.entrySet()) { + String name = entry.getKey(); + Field field = entry.getValue(); + try { + ConfigurationItem item = (ConfigurationItem) field.get(null); + item.unset(); + } catch (IllegalArgumentException | IllegalAccessException ex) { + // Reflection exceptions. This should never happen + throw new Error(ex.getMessage()); + } + } + Configuration.saveConfig(); + setVisible(false); + showRestartConfirmDialod(); + } +} diff --git a/src/com/jpexs/decompiler/flash/gui/Main.java b/src/com/jpexs/decompiler/flash/gui/Main.java index d4355780f..019e95631 100644 --- a/src/com/jpexs/decompiler/flash/gui/Main.java +++ b/src/com/jpexs/decompiler/flash/gui/Main.java @@ -1434,7 +1434,7 @@ public class Main { } fc.setCurrentDirectory(new File(Configuration.lastOpenDir.get())); FileFilter allSupportedFilter = new FileFilter() { - private final String[] supportedExtensions = new String[]{".swf", ".gfx", ".swc", ".zip"}; + private final String[] supportedExtensions = new String[]{".swf", ".gfx", ".swc", ".zip", ".iggy"}; @Override public boolean accept(File f) { @@ -1493,6 +1493,19 @@ public class Main { }; fc.addChoosableFileFilter(gfxFilter); + FileFilter iggyFilter = new FileFilter() { + @Override + public boolean accept(File f) { + return (f.getName().toLowerCase().endsWith(".iggy")) || (f.isDirectory()); + } + + @Override + public String getDescription() { + return AppStrings.translate("filter.iggy"); + } + }; + fc.addChoosableFileFilter(iggyFilter); + FileFilter zipFilter = new FileFilter() { @Override public boolean accept(File f) { diff --git a/src/com/jpexs/decompiler/flash/gui/TreeNodeType.java b/src/com/jpexs/decompiler/flash/gui/TreeNodeType.java index 8540a260a..d7d926a4a 100644 --- a/src/com/jpexs/decompiler/flash/gui/TreeNodeType.java +++ b/src/com/jpexs/decompiler/flash/gui/TreeNodeType.java @@ -1,53 +1,54 @@ -/* - * Copyright (C) 2010-2016 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; - -/** - * - * @author JPEXS - */ -public enum TreeNodeType { - - UNKNOWN, - FLASH, - FONT, - TEXT, - IMAGE, - SHAPE, - MORPH_SHAPE, - SPRITE, - BUTTON, - AS, - PACKAGE, - FRAME, - SHOW_FRAME, - MOVIE, - SOUND, - BINARY_DATA, - OTHER_TAG, - FOLDER, - FOLDER_OPEN, - BUNDLE_ZIP, - BUNDLE_SWC, - BUNDLE_BINARY, - HEADER, - SET_BACKGROUNDCOLOR, - FILE_ATTRIBUTES, - METADATA, - PLACE_OBJECT, - REMOVE_OBJECT -} +/* + * Copyright (C) 2010-2016 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; + +/** + * + * @author JPEXS + */ +public enum TreeNodeType { + + UNKNOWN, + FLASH, + FONT, + TEXT, + IMAGE, + SHAPE, + MORPH_SHAPE, + SPRITE, + BUTTON, + AS, + PACKAGE, + FRAME, + SHOW_FRAME, + MOVIE, + SOUND, + BINARY_DATA, + OTHER_TAG, + FOLDER, + FOLDER_OPEN, + BUNDLE_ZIP, + BUNDLE_SWC, + BUNDLE_BINARY, + BUNDLE_IGGY, + HEADER, + SET_BACKGROUNDCOLOR, + FILE_ATTRIBUTES, + METADATA, + PLACE_OBJECT, + REMOVE_OBJECT +} diff --git a/src/com/jpexs/decompiler/flash/gui/graphics/bundleiggy16.png b/src/com/jpexs/decompiler/flash/gui/graphics/bundleiggy16.png new file mode 100644 index 0000000000000000000000000000000000000000..fb2dc26f88fe14bb56f6c11389f68ba66b4ebfd3 GIT binary patch literal 879 zcmV-#1CacQP)3nr#e zX86EVRXt@dUImWeq8LHtiT&t%-vo=rgqSSCH!*;yrvtanmZ4&U4L^T;1<#uRMI@E2 zOmCEd=b`sY6obgkEJpkNHyG-lCcg;(ft;+);pHGjOK*DAF==VJj%b=B-W?Sv2g}z5#MfMqp+f%$$x%U#Nj2O2?gxd*9@j ztj#Q3Qw~*%(%cm+PO-utl;TZHHggCCX3>7@5`wc+FlX4oCEGiWUu)TCXu5vTclhdq zwr$RoV~Q;C#-s#lQUV%UTG95-jo$AQ7#{crM}ZBQg(Vnw^&;8kl#X0!+CkV+eR3e9 zud3!nx%+d+*nG$zZ<0ML6^#uIxLa3;Y^w#57)ChY!=m*3FXwJPE+>rp_a^ExR-P66T|)EhuTQ3|M2NwbClHg=jAT}1^}Kke7g-(ewhFO002ovPDHLk FV1j0rkbeLG literal 0 HcmV?d00001 diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties index 7e0c09b88..5d45328f7 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties @@ -1,776 +1,778 @@ -# Copyright (C) 2010-2016 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 . - -menu.file = File -menu.file.open = Open... -menu.file.save = Save -menu.file.saveas = Save as... -menu.file.export.fla = Export to FLA -menu.file.export.all = Export all parts -menu.file.export.selection = Export selection -menu.file.exit = Exit - -menu.tools = Tools -menu.tools.searchas = Search All ActionScript... -menu.tools.proxy = Proxy -menu.tools.deobfuscation = Deobfuscation -menu.tools.deobfuscation.pcode = P-code deobfuscation... -menu.tools.deobfuscation.globalrename = Globally rename identifier -menu.tools.deobfuscation.renameinvalid = Rename invalid identifiers -menu.tools.gotoDocumentClass = Go to document class - -menu.settings = Settings -menu.settings.autodeobfuscation = Automatic deobfuscation -menu.settings.internalflashviewer = Use own Flash viewer -menu.settings.parallelspeedup = Parallel SpeedUp -menu.settings.disabledecompilation = Disable decompilation (Disassemble only) -menu.settings.addtocontextmenu = Add FFDec to SWF files context menu -menu.settings.language = Change language -menu.settings.cacheOnDisk = Use caching on disk -menu.settings.gotoMainClassOnStartup = Highlight document class on startup - -menu.help = Help -menu.help.checkupdates = Check for updates... -menu.help.helpus = Help us! -menu.help.homepage = Visit homepage -menu.help.about = About... - -contextmenu.remove = Remove - -button.save = Save -button.edit = Edit -button.cancel = Cancel -button.replace = Replace... - -notavailonthisplatform = Preview of this object is not available on this platform (Windows only). - -swfpreview = SWF preview -swfpreview.internal = SWF preview (Internal viewer) - -parameters = Parameters - -rename.enternew = Enter new name: - -rename.finished.identifier = Identifier renamed. -rename.finished.multiname = %count% multiname(s) renamed. - -node.texts = texts -node.images = images -node.movies = movies -node.sounds = sounds -node.binaryData = binaryData -node.fonts = fonts -node.sprites = sprites -node.shapes = shapes -node.morphshapes = morphshapes -node.buttons = buttons -node.frames = frames -node.scripts = scripts - -message.warning = Warning -message.confirm.experimental = Following procedure can damage SWF file which can be then unplayable.\r\nUSE IT ON YOUR OWN RISK. Do you want to continue? -message.confirm.parallel = Parallelism can speed up loading and decompilation but uses more memory. -message.confirm.on = Do you want to turn this ON? -message.confirm.off = Do you want to turn this OFF? -message.confirm = Confirm - -message.confirm.autodeobfuscate = Automatic deobfuscation is a way to decompile obfuscated code.\r\nDeobfuscation leads to slower decompilation and some of the dead code may be eliminated.\r\nIf the code is not obfuscated, it's better to turn autodeobfuscation off. - -message.parallel = Parallelism -message.trait.saved = Trait successfully saved - -message.constant.new.string = String "%value%" is not present in constants table. Do you want to add it? -message.constant.new.string.title = Add String -message.constant.new.integer = Integer value "%value%" is not present in constants table. Do you want to add it? -message.constant.new.integer.title = Add Integer -message.constant.new.unsignedinteger = Unsigned integer value "%value%" is not present in constants table. Do you want to add it? -message.constant.new.unsignedinteger.title = Add Unsigned integer -message.constant.new.double = Double value "%value%" is not present in constants table. Do you want to add it? -message.constant.new.double.title = Add Double - -work.buffering = Buffering -work.waitingfordissasembly = Waiting for disassembly -work.gettinghilights = Getting highlights -work.disassembling = Disassembling -work.exporting = Exporting -work.searching = Searching -work.renaming = Renaming -work.exporting.fla = Exporting FLA -work.renaming.identifiers = Renaming identifiers -work.deobfuscating = Deobfuscating -work.decompiling = Decompiling -work.gettingvariables = Getting variables -work.reading.swf = Reading SWF -work.creatingwindow = Creating window -work.buildingscripttree = Building script tree - -work.deobfuscating.complete = Deobfuscation complete - -message.search.notfound = String "%searchtext%" not found. -message.search.notfound.title = Not found - -message.rename.notfound.multiname = No multiname found under cursor -message.rename.notfound.identifier = No identifier found under cursor -message.rename.notfound.title = Not found -message.rename.renamed = Identifiers renamed: %count% - -filter.images = Images (%extensions%) -filter.fla = %version% Document (*.fla) -filter.xfl = %version% Uncompressed Document (*.xfl) -filter.swf = SWF files (*.swf) - -error = Error -error.image.invalid = Invalid image. - -error.text.invalid = Invalid text: %text% on line %line% -error.file.save = Cannot save file -error.file.write = Cannot write to the file -error.export = Error during export - -export.select.directory = Select directory to export -export.finishedin = Exported in %time% - -update.check.title = Update check -update.check.nonewversion = No new version available. - -message.helpus = Please visit\r\n%url%\r\nfor details. -message.homepage = Visit homepage at: \r\n%url% - -proxy = Proxy -proxy.start = Start proxy -proxy.stop = Stop proxy -proxy.show = Show proxy -exit = Exit - -panel.disassembled = P-code source -panel.decompiled = ActionScript source - -search.info = Search for "%text%": -search.script = Script - -constants = Constants -traits = Traits - -pleasewait = Please wait - -#DEPRECATED - see abc.detail.trait.* -abc.detail.methodtrait = Method/Getter/Setter Trait -abc.detail.unsupported = - -#DEPRECATED - see abc.detail.trait.* -abc.detail.slotconsttrait = Slot/Const Trait -abc.detail.traitname = Name: - -abc.detail.body.params.maxstack = Max stack: -abc.detail.body.params.localregcount = Local registers count: -abc.detail.body.params.minscope = Minimum scope depth: -abc.detail.body.params.maxscope = Maximum scope depth: -abc.detail.body.params.autofill = Auto fill on code save (GLOBAL SETTING) -abc.detail.body.params.autofill.experimental = ...EXPERIMENTAL - -abc.detail.methodinfo.methodindex = Method Index: -abc.detail.methodinfo.parameters = Parameters: -abc.detail.methodinfo.returnvalue = Return value type: - -error.methodinfo.params = MethodInfo Params Error -error.methodinfo.returnvalue = MethodInfo Return value type Error - -abc.detail.methodinfo = MethodInfo -abc.detail.body.code = MethodBody Code -abc.detail.body.params = MethodBody params - -abc.detail.slotconst.typevalue = Type and Value: - -error.slotconst.typevalue = SlotConst type value Error - -message.autofill.failed = Cannot get code stats for automatic body params.\r\nUncheck autofill to avoid this message. -info.selecttrait = Select class and click a trait in Actionscript source to edit it. - -button.viewgraph = View Graph -button.viewhex = View Hex - -abc.traitslist.instanceinitializer = instance initializer -abc.traitslist.classinitializer = class initializer - -action.edit.experimental = (Experimental) - -message.action.saved = Code successfully saved - -error.action.save = %error% on line %line% - -message.confirm.remove = Are you sure you want to remove %item%\n and all objects which depend on it? - -#after version 1.6.5u1: - -button.ok = OK -button.cancel = Cancel - -font.name = Font name: -font.isbold = Is bold: -font.isitalic = Is italic: -font.ascent = Ascent: -font.descent = Descent: -font.leading = Leading: -font.characters = Characters: -font.characters.add = Add characters: -value.unknown = ? - -yes = yes -no = no - -errors.present = There are ERRORS in the log. Click to view. -errors.none = There are no errors in the log. - -#after version 1.6.6: - -dialog.message.title = Message -dialog.select.title = Select an Option - -button.yes = Yes -button.no = No - -FileChooser.openButtonText = Open -FileChooser.openButtonToolTipText = Open -FileChooser.lookInLabelText = Look in: -FileChooser.acceptAllFileFilterText = All Files -FileChooser.filesOfTypeLabelText = Files of type: -FileChooser.fileNameLabelText = File name: -FileChooser.listViewButtonToolTipText = List -FileChooser.listViewButtonAccessibleName = List -FileChooser.detailsViewButtonToolTipText = Details -FileChooser.detailsViewButtonAccessibleName = Details -FileChooser.upFolderToolTipText = Up One Level -FileChooser.upFolderAccessibleName = Up One Level -FileChooser.homeFolderToolTipText = Home -FileChooser.homeFolderAccessibleName = Home -FileChooser.fileNameHeaderText = Name -FileChooser.fileSizeHeaderText = Size -FileChooser.fileTypeHeaderText = Type -FileChooser.fileDateHeaderText = Date -FileChooser.fileAttrHeaderText = Attributes -FileChooser.openDialogTitleText = Open -FileChooser.directoryDescriptionText = Directory -FileChooser.directoryOpenButtonText = Open -FileChooser.directoryOpenButtonToolTipText = Open selected directory -FileChooser.fileDescriptionText = Generic File -FileChooser.helpButtonText = Help -FileChooser.helpButtonToolTipText = FileChooser help -FileChooser.newFolderAccessibleName = New Folder -FileChooser.newFolderErrorText = Error creating new folder -FileChooser.newFolderToolTipText = Create New Folder -FileChooser.other.newFolder = NewFolder -FileChooser.other.newFolder.subsequent = NewFolder.{0} -FileChooser.win32.newFolder = New Folder -FileChooser.win32.newFolder.subsequent = New Folder ({0}) -FileChooser.saveButtonText = Save -FileChooser.saveButtonToolTipText = Save selected file -FileChooser.saveDialogTitleText = Save -FileChooser.saveInLabelText = Save in: -FileChooser.updateButtonText = Update -FileChooser.updateButtonToolTipText = Update directory listing - -#after version 1.6.6u2: - -FileChooser.detailsViewActionLabel.textAndMnemonic = Details -FileChooser.detailsViewButtonToolTip.textAndMnemonic = Details -FileChooser.fileAttrHeader.textAndMnemonic = Attributes -FileChooser.fileDateHeader.textAndMnemonic = Modified -FileChooser.fileNameHeader.textAndMnemonic = Name -FileChooser.fileNameLabel.textAndMnemonic = File name: -FileChooser.fileSizeHeader.textAndMnemonic = Size -FileChooser.fileTypeHeader.textAndMnemonic = Type -FileChooser.filesOfTypeLabel.textAndMnemonic = Files of type: -FileChooser.folderNameLabel.textAndMnemonic = Folder name: -FileChooser.homeFolderToolTip.textAndMnemonic = Home -FileChooser.listViewActionLabel.textAndMnemonic = List -FileChooser.listViewButtonToolTip.textAndMnemonic = List -FileChooser.lookInLabel.textAndMnemonic = Look in: -FileChooser.newFolderActionLabel.textAndMnemonic = New Folder -FileChooser.newFolderToolTip.textAndMnemonic = Create New Folder -FileChooser.refreshActionLabel.textAndMnemonic = Refresh -FileChooser.saveInLabel.textAndMnemonic = Save in: -FileChooser.upFolderToolTip.textAndMnemonic = Up One Level -FileChooser.viewMenuButtonAccessibleName = View Menu -FileChooser.viewMenuButtonToolTipText = View Menu -FileChooser.viewMenuLabel.textAndMnemonic = View -FileChooser.newFolderActionLabelText = New Folder -FileChooser.listViewActionLabelText = List -FileChooser.detailsViewActionLabelText = Details -FileChooser.refreshActionLabelText = Refresh -FileChooser.sortMenuLabelText = Arrange Icons By -FileChooser.viewMenuLabelText = View -FileChooser.fileSizeKiloBytes = {0} KB -FileChooser.fileSizeMegaBytes = {0} MB -FileChooser.fileSizeGigaBytes = {0} GB -FileChooser.folderNameLabelText = Folder name: - -error.occured = Error occurred: %error% -button.abort = Abort -button.retry = Retry -button.ignore = Ignore - -font.source = Source Font: - -#after version 1.6.7: - -menu.export = Export -menu.general = General -menu.language = Language - -startup.welcometo = Welcome to -startup.selectopen = Click Open icon on the top panel or drag SWF file to this window to start. - -error.font.nocharacter = Selected source font does not contain character "%char%". - -warning.initializers = Static fields and consts are often initialized in initializers.\nEditing value here is usually not enough! - -#after version 1.7.0u1: - -menu.tools.searchMemory = Search SWFs in memory -menu.file.reload = Reload -message.confirm.reload = This action cancels all unsaved changes and reloads the SWF file again.\nDo you want to continue? - -dialog.selectbkcolor.title = Select background color for SWF display -button.selectbkcolor.hint = Select background color - -ColorChooser.okText = OK -ColorChooser.cancelText = Cancel -ColorChooser.resetText = Reset -ColorChooser.previewText = Preview -ColorChooser.swatchesNameText = Swatches -ColorChooser.swatchesRecentText = Recent: -ColorChooser.sampleText = Sample Text Sample Text - -#after version 1.7.1: - -preview.play = Play -preview.pause = Pause -preview.stop = Stop - -message.confirm.removemultiple = Are you sure you want to remove %count% items\n and all objects which depend on it? - -menu.tools.searchCache = Search browsers cache - -#after version 1.7.2u2 - -error.trait.exists = Trait with name "%name%" already exists. -button.addtrait = Add trait -button.font.embed = Embed... -button.yes.all = Yes to all -button.no.all = No to all -message.font.add.exists = Character %char% already exists in the font tag.\nDo you want to replace it? - -filter.gfx = ScaleForm GFx files (*.gfx) -filter.supported = All supported filetypes -work.canceled = Canceled -work.restoringControlFlow = Restoring control flow -menu.advancedsettings.advancedsettings = Advanced Settings -menu.recentFiles = Recent files - -#after version 1.7.4 -work.restoringControlFlow.complete = Control flow restored -message.confirm.recentFileNotFound = File not found. Do you want to remove it from the recent file list? -contextmenu.closeSwf = Close SWF -menu.settings.autoRenameIdentifiers = Auto rename identifiers -menu.file.saveasexe = Save as Exe... -filter.exe = Executable files (*.exe) - -#after version 1.8.0 -font.updateTexts = Update texts - -#after version 1.8.0u1 -menu.file.close = Close -menu.file.closeAll = Close all -menu.tools.otherTools = Other -menu.tools.otherTools.clearRecentFiles = Clear recent files -fontName.name = Font display name: -fontName.copyright = Font copyright: -button.preview = Preview -button.reset = Reset -errors.info = There are INFORMATIONS in the log. Click to view. -errors.warning = There are WARNINGS in the log. Click to view. - -decompilationError = Decompilation error - -disassemblingProgress.toString = toString -disassemblingProgress.reading = Reading -disassemblingProgress.deobfuscating = Deobfuscating - -contextmenu.moveTag = Move tag to - -filter.swc = SWC component files (*.swc) -filter.zip = ZIP compressed files (*.zip) -filter.binary = Binary search - all files (*.*) - -open.error = Error -open.error.fileNotFound = File not found -open.error.cannotOpen = Cannot open file - -node.others = others - -#after version 1.8.1 -menu.tools.search = Text Search - -#after version 1.8.1u1 -menu.tools.timeline = Timeline - -dialog.selectcolor.title = Select color -button.selectcolor.hint = Click to select color - -#default item name, will be used in following sentences -generictag.array.item = item -generictag.array.insertbeginning = Insert %item% at the beginning -generictag.array.insertbefore = Insert %item% before -generictag.array.remove = Remove %item% -generictag.array.insertafter = Insert %item% after -generictag.array.insertend = Insert %item% at the end - -#after version 2.0.0 -contextmenu.expandAll = Expand all - -filter.sounds = Supported sound formats (*.wav, *.mp3) -filter.sounds.wav = Wave file format (*.wav) -filter.sounds.mp3 = MP3 compressed format (*.mp3) - -error.sound.invalid = Invalid sound. - -button.prev = Previous -button.next = Next - -#after version 2.1.0 -message.action.playerglobal.title = PlayerGlobal library needed -message.action.playerglobal.needed = For ActionScript 3 direct editation, a library called "PlayerGlobal.swc" needs to be downloaded from Adobe homepage.\r\n%adobehomepage%\r\nPress OK to go to the download page. -message.action.playerglobal.place = Download the library called PlayerGlobal(.swc), and place it to directory\r\n%libpath%\r\n Press OK to continue. - -message.confirm.experimental.function = This function is EXPERIMENTAL. It means that you should not trust the results and the SWF file can be disfunctional after saving. -message.confirm.donotshowagain = Do not show again - -menu.import = Import -menu.file.import.text = Import text -import.select.directory = Select directory to import -error.text.import = Error during text import. Do you want to continue? - -#after version 2.1.1 -contextmenu.removeWithDependencies = Remove with dependencies - -abc.action.find-usages = Find usages -abc.action.find-declaration = Find declaration - -contextmenu.rawEdit = Raw edit -contextmenu.jumpToCharacter = Jump to character - -menu.settings.dumpView = Dump view - -menu.view = View -menu.file.view.resources = Resources -menu.file.view.hex = Hex dump - -node.header = header - -header.signature = Signature: -header.compression = Compression: -header.compression.lzma = LZMA -header.compression.zlib = ZLIB -header.compression.none = No compression -header.version = SWF Version: -header.gfx = GFX: -header.filesize = File size: -header.framerate = Frame rate: -header.framecount = Frame count: -header.displayrect = Display rect: -header.displayrect.value.twips = %xmin%,%ymin% => %xmax%,%ymax% twips -header.displayrect.value.pixels = %xmin%,%ymin% => %xmax%,%ymax% pixels - -#after version 2.1.2 -contextmenu.saveToFile = Save to File -contextmenu.parseActions = Parse actions -contextmenu.parseABC = Parse ABC -contextmenu.parseInstructions = Parse AVM2 Instructions - -#after version 2.1.3 -menu.deobfuscation = Deobfuscation -menu.file.deobfuscation.old = Old style -menu.file.deobfuscation.new = New style - -#after version 2.1.4 -contextmenu.openswfinside = Open SWF inside -binarydata.swfInside = It looks like there is SWF inside this binary data tag. Click here to load it as subtree. - -#after version 3.0.0 -button.zoomin.hint = Zoom in -button.zoomout.hint = Zoom out -button.zoomfit.hint = Zoom to fit -button.zoomnone.hint = Zoom to 1:1 -button.snapshot.hint = Take snapshot into clipboard - -editorTruncateWarning = Text truncated at position %chars% in debug mode. - -#Font name which is presented in the SWF Font tag -font.name.intag = Font name in tag: - -menu.debugger = Debugger -menu.debugger.switch = Debugger -menu.debugger.replacetrace = Replace trace calls -menu.debugger.showlog = Show Log - -message.debugger = This SWF Debugger can only be used to print messages to log window, browser console or alerts.\r\nIt is NOT designed for features like step code, breakpoints etc. - -contextmenu.addTag = Add tag - -deobfuscation.comment.tryenable = Tip: You can try enabling "Automatic deobfuscation" in Settings -deobfuscation.comment.failed = Deobfuscation is activated but decompilation still failed. If the file is NOT obfuscated, disable "Automatic deobfuscation" for better results. - -#after version 4.0.2 -preview.nextframe = Next frame -preview.prevframe = Previous frame -preview.gotoframe = Goto frame... - -preview.gotoframe.dialog.title = Goto frame -preview.gotoframe.dialog.message = Enter frame number (%min% - %max%) -preview.gotoframe.dialog.frame.error = Invalid frame number. It must be number between %min% and %max%. - -error.text.invalid.continue = Invalid text: %text% on line %line%. Do you want to continue? - -#after version 4.0.5 -contextmenu.copyTag = Copy tag to -fit = fit -button.setAdvanceValues = Set advance values - -menu.tools.replace = Text Replace - -message.confirm.close = There are unsaved changes. Do you really want to close {swfName}? -message.confirm.closeAll = There are unsaved changes. Do you really want to close all SWFs? - -contextmenu.exportJavaSource = Export Java Source -contextmenu.exportSwfXml = Export SWF as XML -contextmenu.importSwfXml = Import SWF XML - -filter.xml = XML - -#after version 4.1.0 -contextmenu.undo = Undo - -text.align.left = Left align -text.align.right = Right align -text.align.center = Center align -text.align.justify = Justify align - -text.undo = Undo changes - -menu.file.import.xml = Import SWF XML -menu.file.export.xml = Export SWF XML - -#after version 4.1.1 -text.align.translatex.decrease = Decrease TranslateX -text.align.translatex.increase = Increase TranslateX -selectPreviousTag = Select previous tag -selectNextTag = Select next tag -button.ignoreAll = Ignore All -menu.file.import.symbolClass = Import Symbol-Class -text.toggleCase = Toggle case - -#after version 5.0.2 -preview.loop = Loop -menu.file.import.script = Import script -contextmenu.copyTagWithDependencies = Copy tag with dependencies to -button.replaceWithTag = Replace with other character tag -button.resolveConstants = Resolve constants - -#after version 5.1.0 -button.viewConstants = View Constants -work.exported = Exported -button.replaceAlphaChannel = Replace alpha channel... - -tagInfo.header.name = Name -tagInfo.header.value = Value -tagInfo.tagType = Tag Type -tagInfo.characterId = Character Id -tagInfo.offset = Offset -tagInfo.length = Length -tagInfo.bounds = Bounds -tagInfo.width = Width -tagInfo.height = Height -tagInfo.neededCharacters = Needed Characters - -button.viewhexpcode = View Hex with instructions -taginfo.header = Basic tag info - -tagInfo.dependentCharacters = Dependent Characters - -#after version 5.3.0 -header.uncompressed = Uncompressed -header.warning.unsupportedGfxCompression = GFX supports only uncompressed or Zlib compressed content. -header.warning.minimumZlibVersion = Zlib compression needs SWF version 6 or greater. -header.warning.minimumLzmaVersion = LZMA compression needs SWF version 13 or greater. - -tagInfo.codecName = Codec Name -tagInfo.exportFormat = Export Format -tagInfo.samplingRate = Sampling Rate -tagInfo.stereo = Stereo -tagInfo.sampleCount = Sample Count - -filter.dmg = Mac Executable files (*.dmg) -filter.linuxExe = Linux Executable files - -import.script.result = %count% scripts imported. -import.script.as12warning = Import script can import only AS1/2 scripts. - -error.constantPoolTooBig = Constant pool is too big. index=%index%, size=%size% -error.image.alpha.invalid = Invalid alpha channel data. - -#after version 6.0.2 -contextmenu.saveUncompressedToFile = Save to Uncompressed File -abc.traitslist.scriptinitializer = script initializer -menu.settings.autoOpenLoadedSWFs = Open loaded SWFs while playing - -#after version 6.1.1 -menu.file.start = Start -menu.file.start.run = Run -menu.file.start.stop = Stop -menu.file.start.debug = Debug -menu.debugging = Debugging -menu.debugging.debug = Debug -menu.debugging.debug.stop = Stop -menu.debugging.debug.pause = Pause -menu.debugging.debug.stepOver = Step over -menu.debugging.debug.stepInto = Step into -menu.debugging.debug.stepOut = Step out -menu.debugging.debug.continue = Continue -menu.debugging.debug.stack = Stack... -menu.debugging.debug.watch = New watch... - -message.playerpath.notset = Flash Player projector not found. Please configure its path in Advanced Settings / Paths (1). -message.playerpath.debug.notset = Flash Player projector content debugger not found. Please configure its path in Advanced Settings / Paths (2). -message.playerpath.lib.notset = PlayerGlobal (.SWC) not found. Please configure its path in Advanced Settings / Paths (3). - -debugpanel.header = Debugging - -variables.header.registers = Registers -variables.header.locals = Locals -variables.header.arguments = Arguments -variables.header.scopeChain = Scope chain -variables.column.name = Name -variables.column.type = Type -variables.column.value = Value - -callStack.header = Call stack -callStack.header.file = File -callStack.header.line = Line - -stack.header = Stack -stack.header.item = Item - -constantpool.header = Constant pool -constantpool.header.id = Id -constantpool.header.value = Value - -work.running = Running -work.debugging = Debugging -work.debugging.instrumenting = Preparing SWF for debugging -work.breakat = Break at\u0020 -work.halted = Debugging started, execution halted. Add breakpoints and click Continue (F5) to resume running. - -debuglog.header = Log -debuglog.button.clear = Clear - -#after 7.0.1 -work.debugging.wait = Waiting for Flash debug projector to connect - -error.debug.listen = Cannot listen on port %port%. There might be other flash debugger running. - -debug.break.reason.unknown = (Unknown) -debug.break.reason.breakpoint = (Breakpoint) -debug.break.reason.watch = (Watch) -debug.break.reason.fault = (Fault) -debug.break.reason.stopRequest = (Stop request) -debug.break.reason.step = (Step) -debug.break.reason.halt = (Halt) -debug.break.reason.scriptLoaded = (Script loaded) - -menu.file.start.debugpcode = Debug P-code - -#after 7.1.2 -button.replaceNoFill = Replace - Update bounds... -message.warning.svgImportExperimental = Not all SVG features are supported. Please check the log after import. - -message.imported.swf = The SWF file uses assets from an imported SWF file:\n%url%\nDo you want the assets to be loaded from that URL? -message.imported.swf.manually = Cannot load imported SWF\n%url%\nThe file or URL does not exist.\nDo you want to select local file? - -message.warning.hexViewNotUpToDate = Hex View is not up-to-date. Please save and reload the file to update Hex View. -message.font.replace.updateTexts = Some characters were replaced. Do you want to update the existing texts? - -menu.settings.simplifyExpressions = Simplify expressions - -#after 8.0.1 -menu.recentFiles.empty = Recent file list is empty -message.warning.outOfMemory32BitJre = OutOfMemory error occurred. You are running 32bit Java on 64bit system. Please use 64bit Java. - -menu.file.reloadAll = Reload all -message.confirm.reloadAll = This action cancels all unsaved changes in all SWF files and reloads whole application again.\nDo you want to continue? -export.script.singleFilePallelModeWarning = Single file script export is not supported with enabled parallel speedup - -button.showOriginalBytesInPcodeHex = Show original bytes -button.remove = Remove -button.showFileOffsetInPcodeHex = Show file offset - -generic.editor.amf3.title = AMF3 editor -generic.editor.amf3.help = AMF3 value syntax:\n\ - ------------------\n\ - scalar types:\n\ - %scalar_samples%\ - other types:\n\ - %nonscalar_samples%\ - \n\ - Notes:\n\ - \ * Nonscalar datatypes can be referenced by previously declared "id" attributes with # syntax:\n\ - %reference_sample%\n\ - \ * Keys in Dictionary entries can be any type\n -contextmenu.showInResources = Show in Resources -message.flexpath.notset = Flex SDK not found. Please configure its path in Advanced Settings / Paths (4). - - -#add after panel.disassembled string -abc.detail.split = :\u0020 -abc.detail.trait = Trait - %trait_type% -abc.detail.trait.method = Method -abc.detail.trait.getter = Getter -abc.detail.trait.setter = Setter -abc.detail.trait.slot = Slot -abc.detail.trait.const = Const -abc.detail.trait.class = Class -abc.detail.trait.function = Function - -abc.detail.specialmethod = Special method - %specialmethod_type% -abc.detail.specialmethod.scriptinitializer = Script initializer -abc.detail.specialmethod.classinitializer = Class initializer -abc.detail.specialmethod.instanceinitializer = Instance initializer -abc.detail.innerfunction = Inner function - -button.edit.script.decompiled = Edit ActionScript -button.edit.script.disassembled = Edit P-code - -debug.watch.add = Add watch to %name% -debug.watch.add.read = Read -debug.watch.add.write = Write -debug.watch.add.readwrite = Read+Write- - -error.debug.watch.add = Cannot add watch to this variable. - -variables.column.scope = Scope -variables.column.flags = Flags -variables.column.trait = Trait - -message.font.setadvancevalues = This operation will set advance of ALL characters in this tag to selected font source advances. - -menu.tools.deobfuscation.renameColliding = Rename colliding traits/classes +# Copyright (C) 2010-2016 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 . + +menu.file = File +menu.file.open = Open... +menu.file.save = Save +menu.file.saveas = Save as... +menu.file.export.fla = Export to FLA +menu.file.export.all = Export all parts +menu.file.export.selection = Export selection +menu.file.exit = Exit + +menu.tools = Tools +menu.tools.searchas = Search All ActionScript... +menu.tools.proxy = Proxy +menu.tools.deobfuscation = Deobfuscation +menu.tools.deobfuscation.pcode = P-code deobfuscation... +menu.tools.deobfuscation.globalrename = Globally rename identifier +menu.tools.deobfuscation.renameinvalid = Rename invalid identifiers +menu.tools.gotoDocumentClass = Go to document class + +menu.settings = Settings +menu.settings.autodeobfuscation = Automatic deobfuscation +menu.settings.internalflashviewer = Use own Flash viewer +menu.settings.parallelspeedup = Parallel SpeedUp +menu.settings.disabledecompilation = Disable decompilation (Disassemble only) +menu.settings.addtocontextmenu = Add FFDec to SWF files context menu +menu.settings.language = Change language +menu.settings.cacheOnDisk = Use caching on disk +menu.settings.gotoMainClassOnStartup = Highlight document class on startup + +menu.help = Help +menu.help.checkupdates = Check for updates... +menu.help.helpus = Help us! +menu.help.homepage = Visit homepage +menu.help.about = About... + +contextmenu.remove = Remove + +button.save = Save +button.edit = Edit +button.cancel = Cancel +button.replace = Replace... + +notavailonthisplatform = Preview of this object is not available on this platform (Windows only). + +swfpreview = SWF preview +swfpreview.internal = SWF preview (Internal viewer) + +parameters = Parameters + +rename.enternew = Enter new name: + +rename.finished.identifier = Identifier renamed. +rename.finished.multiname = %count% multiname(s) renamed. + +node.texts = texts +node.images = images +node.movies = movies +node.sounds = sounds +node.binaryData = binaryData +node.fonts = fonts +node.sprites = sprites +node.shapes = shapes +node.morphshapes = morphshapes +node.buttons = buttons +node.frames = frames +node.scripts = scripts + +message.warning = Warning +message.confirm.experimental = Following procedure can damage SWF file which can be then unplayable.\r\nUSE IT ON YOUR OWN RISK. Do you want to continue? +message.confirm.parallel = Parallelism can speed up loading and decompilation but uses more memory. +message.confirm.on = Do you want to turn this ON? +message.confirm.off = Do you want to turn this OFF? +message.confirm = Confirm + +message.confirm.autodeobfuscate = Automatic deobfuscation is a way to decompile obfuscated code.\r\nDeobfuscation leads to slower decompilation and some of the dead code may be eliminated.\r\nIf the code is not obfuscated, it's better to turn autodeobfuscation off. + +message.parallel = Parallelism +message.trait.saved = Trait successfully saved + +message.constant.new.string = String "%value%" is not present in constants table. Do you want to add it? +message.constant.new.string.title = Add String +message.constant.new.integer = Integer value "%value%" is not present in constants table. Do you want to add it? +message.constant.new.integer.title = Add Integer +message.constant.new.unsignedinteger = Unsigned integer value "%value%" is not present in constants table. Do you want to add it? +message.constant.new.unsignedinteger.title = Add Unsigned integer +message.constant.new.double = Double value "%value%" is not present in constants table. Do you want to add it? +message.constant.new.double.title = Add Double + +work.buffering = Buffering +work.waitingfordissasembly = Waiting for disassembly +work.gettinghilights = Getting highlights +work.disassembling = Disassembling +work.exporting = Exporting +work.searching = Searching +work.renaming = Renaming +work.exporting.fla = Exporting FLA +work.renaming.identifiers = Renaming identifiers +work.deobfuscating = Deobfuscating +work.decompiling = Decompiling +work.gettingvariables = Getting variables +work.reading.swf = Reading SWF +work.creatingwindow = Creating window +work.buildingscripttree = Building script tree + +work.deobfuscating.complete = Deobfuscation complete + +message.search.notfound = String "%searchtext%" not found. +message.search.notfound.title = Not found + +message.rename.notfound.multiname = No multiname found under cursor +message.rename.notfound.identifier = No identifier found under cursor +message.rename.notfound.title = Not found +message.rename.renamed = Identifiers renamed: %count% + +filter.images = Images (%extensions%) +filter.fla = %version% Document (*.fla) +filter.xfl = %version% Uncompressed Document (*.xfl) +filter.swf = SWF files (*.swf) + +error = Error +error.image.invalid = Invalid image. + +error.text.invalid = Invalid text: %text% on line %line% +error.file.save = Cannot save file +error.file.write = Cannot write to the file +error.export = Error during export + +export.select.directory = Select directory to export +export.finishedin = Exported in %time% + +update.check.title = Update check +update.check.nonewversion = No new version available. + +message.helpus = Please visit\r\n%url%\r\nfor details. +message.homepage = Visit homepage at: \r\n%url% + +proxy = Proxy +proxy.start = Start proxy +proxy.stop = Stop proxy +proxy.show = Show proxy +exit = Exit + +panel.disassembled = P-code source +panel.decompiled = ActionScript source + +search.info = Search for "%text%": +search.script = Script + +constants = Constants +traits = Traits + +pleasewait = Please wait + +#DEPRECATED - see abc.detail.trait.* +abc.detail.methodtrait = Method/Getter/Setter Trait +abc.detail.unsupported = - +#DEPRECATED - see abc.detail.trait.* +abc.detail.slotconsttrait = Slot/Const Trait +abc.detail.traitname = Name: + +abc.detail.body.params.maxstack = Max stack: +abc.detail.body.params.localregcount = Local registers count: +abc.detail.body.params.minscope = Minimum scope depth: +abc.detail.body.params.maxscope = Maximum scope depth: +abc.detail.body.params.autofill = Auto fill on code save (GLOBAL SETTING) +abc.detail.body.params.autofill.experimental = ...EXPERIMENTAL + +abc.detail.methodinfo.methodindex = Method Index: +abc.detail.methodinfo.parameters = Parameters: +abc.detail.methodinfo.returnvalue = Return value type: + +error.methodinfo.params = MethodInfo Params Error +error.methodinfo.returnvalue = MethodInfo Return value type Error + +abc.detail.methodinfo = MethodInfo +abc.detail.body.code = MethodBody Code +abc.detail.body.params = MethodBody params + +abc.detail.slotconst.typevalue = Type and Value: + +error.slotconst.typevalue = SlotConst type value Error + +message.autofill.failed = Cannot get code stats for automatic body params.\r\nUncheck autofill to avoid this message. +info.selecttrait = Select class and click a trait in Actionscript source to edit it. + +button.viewgraph = View Graph +button.viewhex = View Hex + +abc.traitslist.instanceinitializer = instance initializer +abc.traitslist.classinitializer = class initializer + +action.edit.experimental = (Experimental) + +message.action.saved = Code successfully saved + +error.action.save = %error% on line %line% + +message.confirm.remove = Are you sure you want to remove %item%\n and all objects which depend on it? + +#after version 1.6.5u1: + +button.ok = OK +button.cancel = Cancel + +font.name = Font name: +font.isbold = Is bold: +font.isitalic = Is italic: +font.ascent = Ascent: +font.descent = Descent: +font.leading = Leading: +font.characters = Characters: +font.characters.add = Add characters: +value.unknown = ? + +yes = yes +no = no + +errors.present = There are ERRORS in the log. Click to view. +errors.none = There are no errors in the log. + +#after version 1.6.6: + +dialog.message.title = Message +dialog.select.title = Select an Option + +button.yes = Yes +button.no = No + +FileChooser.openButtonText = Open +FileChooser.openButtonToolTipText = Open +FileChooser.lookInLabelText = Look in: +FileChooser.acceptAllFileFilterText = All Files +FileChooser.filesOfTypeLabelText = Files of type: +FileChooser.fileNameLabelText = File name: +FileChooser.listViewButtonToolTipText = List +FileChooser.listViewButtonAccessibleName = List +FileChooser.detailsViewButtonToolTipText = Details +FileChooser.detailsViewButtonAccessibleName = Details +FileChooser.upFolderToolTipText = Up One Level +FileChooser.upFolderAccessibleName = Up One Level +FileChooser.homeFolderToolTipText = Home +FileChooser.homeFolderAccessibleName = Home +FileChooser.fileNameHeaderText = Name +FileChooser.fileSizeHeaderText = Size +FileChooser.fileTypeHeaderText = Type +FileChooser.fileDateHeaderText = Date +FileChooser.fileAttrHeaderText = Attributes +FileChooser.openDialogTitleText = Open +FileChooser.directoryDescriptionText = Directory +FileChooser.directoryOpenButtonText = Open +FileChooser.directoryOpenButtonToolTipText = Open selected directory +FileChooser.fileDescriptionText = Generic File +FileChooser.helpButtonText = Help +FileChooser.helpButtonToolTipText = FileChooser help +FileChooser.newFolderAccessibleName = New Folder +FileChooser.newFolderErrorText = Error creating new folder +FileChooser.newFolderToolTipText = Create New Folder +FileChooser.other.newFolder = NewFolder +FileChooser.other.newFolder.subsequent = NewFolder.{0} +FileChooser.win32.newFolder = New Folder +FileChooser.win32.newFolder.subsequent = New Folder ({0}) +FileChooser.saveButtonText = Save +FileChooser.saveButtonToolTipText = Save selected file +FileChooser.saveDialogTitleText = Save +FileChooser.saveInLabelText = Save in: +FileChooser.updateButtonText = Update +FileChooser.updateButtonToolTipText = Update directory listing + +#after version 1.6.6u2: + +FileChooser.detailsViewActionLabel.textAndMnemonic = Details +FileChooser.detailsViewButtonToolTip.textAndMnemonic = Details +FileChooser.fileAttrHeader.textAndMnemonic = Attributes +FileChooser.fileDateHeader.textAndMnemonic = Modified +FileChooser.fileNameHeader.textAndMnemonic = Name +FileChooser.fileNameLabel.textAndMnemonic = File name: +FileChooser.fileSizeHeader.textAndMnemonic = Size +FileChooser.fileTypeHeader.textAndMnemonic = Type +FileChooser.filesOfTypeLabel.textAndMnemonic = Files of type: +FileChooser.folderNameLabel.textAndMnemonic = Folder name: +FileChooser.homeFolderToolTip.textAndMnemonic = Home +FileChooser.listViewActionLabel.textAndMnemonic = List +FileChooser.listViewButtonToolTip.textAndMnemonic = List +FileChooser.lookInLabel.textAndMnemonic = Look in: +FileChooser.newFolderActionLabel.textAndMnemonic = New Folder +FileChooser.newFolderToolTip.textAndMnemonic = Create New Folder +FileChooser.refreshActionLabel.textAndMnemonic = Refresh +FileChooser.saveInLabel.textAndMnemonic = Save in: +FileChooser.upFolderToolTip.textAndMnemonic = Up One Level +FileChooser.viewMenuButtonAccessibleName = View Menu +FileChooser.viewMenuButtonToolTipText = View Menu +FileChooser.viewMenuLabel.textAndMnemonic = View +FileChooser.newFolderActionLabelText = New Folder +FileChooser.listViewActionLabelText = List +FileChooser.detailsViewActionLabelText = Details +FileChooser.refreshActionLabelText = Refresh +FileChooser.sortMenuLabelText = Arrange Icons By +FileChooser.viewMenuLabelText = View +FileChooser.fileSizeKiloBytes = {0} KB +FileChooser.fileSizeMegaBytes = {0} MB +FileChooser.fileSizeGigaBytes = {0} GB +FileChooser.folderNameLabelText = Folder name: + +error.occured = Error occurred: %error% +button.abort = Abort +button.retry = Retry +button.ignore = Ignore + +font.source = Source Font: + +#after version 1.6.7: + +menu.export = Export +menu.general = General +menu.language = Language + +startup.welcometo = Welcome to +startup.selectopen = Click Open icon on the top panel or drag SWF file to this window to start. + +error.font.nocharacter = Selected source font does not contain character "%char%". + +warning.initializers = Static fields and consts are often initialized in initializers.\nEditing value here is usually not enough! + +#after version 1.7.0u1: + +menu.tools.searchMemory = Search SWFs in memory +menu.file.reload = Reload +message.confirm.reload = This action cancels all unsaved changes and reloads the SWF file again.\nDo you want to continue? + +dialog.selectbkcolor.title = Select background color for SWF display +button.selectbkcolor.hint = Select background color + +ColorChooser.okText = OK +ColorChooser.cancelText = Cancel +ColorChooser.resetText = Reset +ColorChooser.previewText = Preview +ColorChooser.swatchesNameText = Swatches +ColorChooser.swatchesRecentText = Recent: +ColorChooser.sampleText = Sample Text Sample Text + +#after version 1.7.1: + +preview.play = Play +preview.pause = Pause +preview.stop = Stop + +message.confirm.removemultiple = Are you sure you want to remove %count% items\n and all objects which depend on it? + +menu.tools.searchCache = Search browsers cache + +#after version 1.7.2u2 + +error.trait.exists = Trait with name "%name%" already exists. +button.addtrait = Add trait +button.font.embed = Embed... +button.yes.all = Yes to all +button.no.all = No to all +message.font.add.exists = Character %char% already exists in the font tag.\nDo you want to replace it? + +filter.gfx = ScaleForm GFx files (*.gfx) +filter.supported = All supported filetypes +work.canceled = Canceled +work.restoringControlFlow = Restoring control flow +menu.advancedsettings.advancedsettings = Advanced Settings +menu.recentFiles = Recent files + +#after version 1.7.4 +work.restoringControlFlow.complete = Control flow restored +message.confirm.recentFileNotFound = File not found. Do you want to remove it from the recent file list? +contextmenu.closeSwf = Close SWF +menu.settings.autoRenameIdentifiers = Auto rename identifiers +menu.file.saveasexe = Save as Exe... +filter.exe = Executable files (*.exe) + +#after version 1.8.0 +font.updateTexts = Update texts + +#after version 1.8.0u1 +menu.file.close = Close +menu.file.closeAll = Close all +menu.tools.otherTools = Other +menu.tools.otherTools.clearRecentFiles = Clear recent files +fontName.name = Font display name: +fontName.copyright = Font copyright: +button.preview = Preview +button.reset = Reset +errors.info = There are INFORMATIONS in the log. Click to view. +errors.warning = There are WARNINGS in the log. Click to view. + +decompilationError = Decompilation error + +disassemblingProgress.toString = toString +disassemblingProgress.reading = Reading +disassemblingProgress.deobfuscating = Deobfuscating + +contextmenu.moveTag = Move tag to + +filter.swc = SWC component files (*.swc) +filter.zip = ZIP compressed files (*.zip) +filter.binary = Binary search - all files (*.*) + +open.error = Error +open.error.fileNotFound = File not found +open.error.cannotOpen = Cannot open file + +node.others = others + +#after version 1.8.1 +menu.tools.search = Text Search + +#after version 1.8.1u1 +menu.tools.timeline = Timeline + +dialog.selectcolor.title = Select color +button.selectcolor.hint = Click to select color + +#default item name, will be used in following sentences +generictag.array.item = item +generictag.array.insertbeginning = Insert %item% at the beginning +generictag.array.insertbefore = Insert %item% before +generictag.array.remove = Remove %item% +generictag.array.insertafter = Insert %item% after +generictag.array.insertend = Insert %item% at the end + +#after version 2.0.0 +contextmenu.expandAll = Expand all + +filter.sounds = Supported sound formats (*.wav, *.mp3) +filter.sounds.wav = Wave file format (*.wav) +filter.sounds.mp3 = MP3 compressed format (*.mp3) + +error.sound.invalid = Invalid sound. + +button.prev = Previous +button.next = Next + +#after version 2.1.0 +message.action.playerglobal.title = PlayerGlobal library needed +message.action.playerglobal.needed = For ActionScript 3 direct editation, a library called "PlayerGlobal.swc" needs to be downloaded from Adobe homepage.\r\n%adobehomepage%\r\nPress OK to go to the download page. +message.action.playerglobal.place = Download the library called PlayerGlobal(.swc), and place it to directory\r\n%libpath%\r\n Press OK to continue. + +message.confirm.experimental.function = This function is EXPERIMENTAL. It means that you should not trust the results and the SWF file can be disfunctional after saving. +message.confirm.donotshowagain = Do not show again + +menu.import = Import +menu.file.import.text = Import text +import.select.directory = Select directory to import +error.text.import = Error during text import. Do you want to continue? + +#after version 2.1.1 +contextmenu.removeWithDependencies = Remove with dependencies + +abc.action.find-usages = Find usages +abc.action.find-declaration = Find declaration + +contextmenu.rawEdit = Raw edit +contextmenu.jumpToCharacter = Jump to character + +menu.settings.dumpView = Dump view + +menu.view = View +menu.file.view.resources = Resources +menu.file.view.hex = Hex dump + +node.header = header + +header.signature = Signature: +header.compression = Compression: +header.compression.lzma = LZMA +header.compression.zlib = ZLIB +header.compression.none = No compression +header.version = SWF Version: +header.gfx = GFX: +header.filesize = File size: +header.framerate = Frame rate: +header.framecount = Frame count: +header.displayrect = Display rect: +header.displayrect.value.twips = %xmin%,%ymin% => %xmax%,%ymax% twips +header.displayrect.value.pixels = %xmin%,%ymin% => %xmax%,%ymax% pixels + +#after version 2.1.2 +contextmenu.saveToFile = Save to File +contextmenu.parseActions = Parse actions +contextmenu.parseABC = Parse ABC +contextmenu.parseInstructions = Parse AVM2 Instructions + +#after version 2.1.3 +menu.deobfuscation = Deobfuscation +menu.file.deobfuscation.old = Old style +menu.file.deobfuscation.new = New style + +#after version 2.1.4 +contextmenu.openswfinside = Open SWF inside +binarydata.swfInside = It looks like there is SWF inside this binary data tag. Click here to load it as subtree. + +#after version 3.0.0 +button.zoomin.hint = Zoom in +button.zoomout.hint = Zoom out +button.zoomfit.hint = Zoom to fit +button.zoomnone.hint = Zoom to 1:1 +button.snapshot.hint = Take snapshot into clipboard + +editorTruncateWarning = Text truncated at position %chars% in debug mode. + +#Font name which is presented in the SWF Font tag +font.name.intag = Font name in tag: + +menu.debugger = Debugger +menu.debugger.switch = Debugger +menu.debugger.replacetrace = Replace trace calls +menu.debugger.showlog = Show Log + +message.debugger = This SWF Debugger can only be used to print messages to log window, browser console or alerts.\r\nIt is NOT designed for features like step code, breakpoints etc. + +contextmenu.addTag = Add tag + +deobfuscation.comment.tryenable = Tip: You can try enabling "Automatic deobfuscation" in Settings +deobfuscation.comment.failed = Deobfuscation is activated but decompilation still failed. If the file is NOT obfuscated, disable "Automatic deobfuscation" for better results. + +#after version 4.0.2 +preview.nextframe = Next frame +preview.prevframe = Previous frame +preview.gotoframe = Goto frame... + +preview.gotoframe.dialog.title = Goto frame +preview.gotoframe.dialog.message = Enter frame number (%min% - %max%) +preview.gotoframe.dialog.frame.error = Invalid frame number. It must be number between %min% and %max%. + +error.text.invalid.continue = Invalid text: %text% on line %line%. Do you want to continue? + +#after version 4.0.5 +contextmenu.copyTag = Copy tag to +fit = fit +button.setAdvanceValues = Set advance values + +menu.tools.replace = Text Replace + +message.confirm.close = There are unsaved changes. Do you really want to close {swfName}? +message.confirm.closeAll = There are unsaved changes. Do you really want to close all SWFs? + +contextmenu.exportJavaSource = Export Java Source +contextmenu.exportSwfXml = Export SWF as XML +contextmenu.importSwfXml = Import SWF XML + +filter.xml = XML + +#after version 4.1.0 +contextmenu.undo = Undo + +text.align.left = Left align +text.align.right = Right align +text.align.center = Center align +text.align.justify = Justify align + +text.undo = Undo changes + +menu.file.import.xml = Import SWF XML +menu.file.export.xml = Export SWF XML + +#after version 4.1.1 +text.align.translatex.decrease = Decrease TranslateX +text.align.translatex.increase = Increase TranslateX +selectPreviousTag = Select previous tag +selectNextTag = Select next tag +button.ignoreAll = Ignore All +menu.file.import.symbolClass = Import Symbol-Class +text.toggleCase = Toggle case + +#after version 5.0.2 +preview.loop = Loop +menu.file.import.script = Import script +contextmenu.copyTagWithDependencies = Copy tag with dependencies to +button.replaceWithTag = Replace with other character tag +button.resolveConstants = Resolve constants + +#after version 5.1.0 +button.viewConstants = View Constants +work.exported = Exported +button.replaceAlphaChannel = Replace alpha channel... + +tagInfo.header.name = Name +tagInfo.header.value = Value +tagInfo.tagType = Tag Type +tagInfo.characterId = Character Id +tagInfo.offset = Offset +tagInfo.length = Length +tagInfo.bounds = Bounds +tagInfo.width = Width +tagInfo.height = Height +tagInfo.neededCharacters = Needed Characters + +button.viewhexpcode = View Hex with instructions +taginfo.header = Basic tag info + +tagInfo.dependentCharacters = Dependent Characters + +#after version 5.3.0 +header.uncompressed = Uncompressed +header.warning.unsupportedGfxCompression = GFX supports only uncompressed or Zlib compressed content. +header.warning.minimumZlibVersion = Zlib compression needs SWF version 6 or greater. +header.warning.minimumLzmaVersion = LZMA compression needs SWF version 13 or greater. + +tagInfo.codecName = Codec Name +tagInfo.exportFormat = Export Format +tagInfo.samplingRate = Sampling Rate +tagInfo.stereo = Stereo +tagInfo.sampleCount = Sample Count + +filter.dmg = Mac Executable files (*.dmg) +filter.linuxExe = Linux Executable files + +import.script.result = %count% scripts imported. +import.script.as12warning = Import script can import only AS1/2 scripts. + +error.constantPoolTooBig = Constant pool is too big. index=%index%, size=%size% +error.image.alpha.invalid = Invalid alpha channel data. + +#after version 6.0.2 +contextmenu.saveUncompressedToFile = Save to Uncompressed File +abc.traitslist.scriptinitializer = script initializer +menu.settings.autoOpenLoadedSWFs = Open loaded SWFs while playing + +#after version 6.1.1 +menu.file.start = Start +menu.file.start.run = Run +menu.file.start.stop = Stop +menu.file.start.debug = Debug +menu.debugging = Debugging +menu.debugging.debug = Debug +menu.debugging.debug.stop = Stop +menu.debugging.debug.pause = Pause +menu.debugging.debug.stepOver = Step over +menu.debugging.debug.stepInto = Step into +menu.debugging.debug.stepOut = Step out +menu.debugging.debug.continue = Continue +menu.debugging.debug.stack = Stack... +menu.debugging.debug.watch = New watch... + +message.playerpath.notset = Flash Player projector not found. Please configure its path in Advanced Settings / Paths (1). +message.playerpath.debug.notset = Flash Player projector content debugger not found. Please configure its path in Advanced Settings / Paths (2). +message.playerpath.lib.notset = PlayerGlobal (.SWC) not found. Please configure its path in Advanced Settings / Paths (3). + +debugpanel.header = Debugging + +variables.header.registers = Registers +variables.header.locals = Locals +variables.header.arguments = Arguments +variables.header.scopeChain = Scope chain +variables.column.name = Name +variables.column.type = Type +variables.column.value = Value + +callStack.header = Call stack +callStack.header.file = File +callStack.header.line = Line + +stack.header = Stack +stack.header.item = Item + +constantpool.header = Constant pool +constantpool.header.id = Id +constantpool.header.value = Value + +work.running = Running +work.debugging = Debugging +work.debugging.instrumenting = Preparing SWF for debugging +work.breakat = Break at\u0020 +work.halted = Debugging started, execution halted. Add breakpoints and click Continue (F5) to resume running. + +debuglog.header = Log +debuglog.button.clear = Clear + +#after 7.0.1 +work.debugging.wait = Waiting for Flash debug projector to connect + +error.debug.listen = Cannot listen on port %port%. There might be other flash debugger running. + +debug.break.reason.unknown = (Unknown) +debug.break.reason.breakpoint = (Breakpoint) +debug.break.reason.watch = (Watch) +debug.break.reason.fault = (Fault) +debug.break.reason.stopRequest = (Stop request) +debug.break.reason.step = (Step) +debug.break.reason.halt = (Halt) +debug.break.reason.scriptLoaded = (Script loaded) + +menu.file.start.debugpcode = Debug P-code + +#after 7.1.2 +button.replaceNoFill = Replace - Update bounds... +message.warning.svgImportExperimental = Not all SVG features are supported. Please check the log after import. + +message.imported.swf = The SWF file uses assets from an imported SWF file:\n%url%\nDo you want the assets to be loaded from that URL? +message.imported.swf.manually = Cannot load imported SWF\n%url%\nThe file or URL does not exist.\nDo you want to select local file? + +message.warning.hexViewNotUpToDate = Hex View is not up-to-date. Please save and reload the file to update Hex View. +message.font.replace.updateTexts = Some characters were replaced. Do you want to update the existing texts? + +menu.settings.simplifyExpressions = Simplify expressions + +#after 8.0.1 +menu.recentFiles.empty = Recent file list is empty +message.warning.outOfMemory32BitJre = OutOfMemory error occurred. You are running 32bit Java on 64bit system. Please use 64bit Java. + +menu.file.reloadAll = Reload all +message.confirm.reloadAll = This action cancels all unsaved changes in all SWF files and reloads whole application again.\nDo you want to continue? +export.script.singleFilePallelModeWarning = Single file script export is not supported with enabled parallel speedup + +button.showOriginalBytesInPcodeHex = Show original bytes +button.remove = Remove +button.showFileOffsetInPcodeHex = Show file offset + +generic.editor.amf3.title = AMF3 editor +generic.editor.amf3.help = AMF3 value syntax:\n\ + ------------------\n\ + scalar types:\n\ + %scalar_samples%\ + other types:\n\ + %nonscalar_samples%\ + \n\ + Notes:\n\ + \ * Nonscalar datatypes can be referenced by previously declared "id" attributes with # syntax:\n\ + %reference_sample%\n\ + \ * Keys in Dictionary entries can be any type\n +contextmenu.showInResources = Show in Resources +message.flexpath.notset = Flex SDK not found. Please configure its path in Advanced Settings / Paths (4). + + +#add after panel.disassembled string +abc.detail.split = :\u0020 +abc.detail.trait = Trait - %trait_type% +abc.detail.trait.method = Method +abc.detail.trait.getter = Getter +abc.detail.trait.setter = Setter +abc.detail.trait.slot = Slot +abc.detail.trait.const = Const +abc.detail.trait.class = Class +abc.detail.trait.function = Function + +abc.detail.specialmethod = Special method - %specialmethod_type% +abc.detail.specialmethod.scriptinitializer = Script initializer +abc.detail.specialmethod.classinitializer = Class initializer +abc.detail.specialmethod.instanceinitializer = Instance initializer +abc.detail.innerfunction = Inner function + +button.edit.script.decompiled = Edit ActionScript +button.edit.script.disassembled = Edit P-code + +debug.watch.add = Add watch to %name% +debug.watch.add.read = Read +debug.watch.add.write = Write +debug.watch.add.readwrite = Read+Write- + +error.debug.watch.add = Cannot add watch to this variable. + +variables.column.scope = Scope +variables.column.flags = Flags +variables.column.trait = Trait + +message.font.setadvancevalues = This operation will set advance of ALL characters in this tag to selected font source advances. + +menu.tools.deobfuscation.renameColliding = Rename colliding traits/classes + +filter.iggy = Iggy files (*.iggy) diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties index 9284a53b8..10693c097 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties @@ -1,754 +1,756 @@ -# Copyright (C) 2010-2016 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 . - -menu.file = Soubor -menu.file.open = Otev\u0159\u00edt... -menu.file.save = Ulo\u017eit -menu.file.saveas = Ulo\u017eit jako... -menu.file.export.fla = Exportovat do FLA -menu.file.export.all = Exportovat v\u0161e -menu.file.export.selection = Exportovat vybran\u00e9 -menu.file.exit = Ukon\u010dit - -menu.tools = N\u00e1stroje -menu.tools.searchas = Prohledat ActionScript... -menu.tools.proxy = Proxy -menu.tools.deobfuscation = Deobfuskace -menu.tools.deobfuscation.pcode = Deobfuskace P-k\u00f3du... -menu.tools.deobfuscation.globalrename = Glob\u00e1ln\u011b p\u0159ejmenovat identifik\u00e1tor -menu.tools.deobfuscation.renameinvalid = P\u0159ejmenovat neplatn\u00e9 identifik\u00e1tory -menu.tools.gotoDocumentClass = P\u0159ej\u00edt na hlavn\u00ed t\u0159\u00eddu dokumentu - -menu.settings = Nastaven\u00ed -menu.settings.autodeobfuscation = Automatick\u00e1 deobfuskace -menu.settings.internalflashviewer = Pou\u017e\u00edvat vlastn\u00ed prohl\u00ed\u017ee\u010d Flashe -menu.settings.parallelspeedup = Paraleln\u00ed zrychlen\u00ed -menu.settings.disabledecompilation = Zak\u00e1zat dekompilaci (Pouze P-k\u00f3d) -menu.settings.addtocontextmenu = P\u0159idat FFDec do kontextov\u00e9ho menu SWF -menu.settings.language = Zm\u011bnit jazyk -menu.settings.cacheOnDisk = Pou\u017e\u00edvat cache na disku -menu.settings.gotoMainClassOnStartup = Zv\u00fdraznit hlavn\u00ed t\u0159\u00eddu po startu - -menu.help = N\u00e1pov\u011bda -menu.help.checkupdates = Zkontrolovat novou verzi... -menu.help.helpus = Pomo\u017ete n\u00e1m! -menu.help.homepage = Nav\u0161t\u00edvit domovskou str\u00e1nku -menu.help.about = O aplikaci... - -contextmenu.remove = Odebrat - -button.save = Ulo\u017eit -button.edit = Upravit -button.cancel = Storno -button.replace = Nahradit... - -notavailonthisplatform = N\u00e1hled tohoto objektu nen\u00ed dostupn\u00fd na t\u00e9to platform\u011b. (pouze Windows) - -swfpreview = n\u00e1hled SWF -swfpreview.internal = n\u00e1hled SWF (vlastn\u00ed prohl\u00ed\u017ee\u010d) - -parameters = Parametry - -rename.enternew = Zadejte nov\u00fd n\u00e1zev: - -rename.finished.identifier = Identifik\u00e1tor p\u0159ejmenov\u00e1n. -rename.finished.multiname = %count% multiname p\u0159ejmenov\u00e1no. - -node.texts = texty -node.images = obr\u00e1zky -node.movies = videa -node.sounds = zvuky -node.binaryData = bin\u00e1rn\u00ed data -node.fonts = p\u00edsma -node.sprites = sprity -node.shapes = tvary -node.morphshapes = morphshapes -node.buttons = tla\u010d\u00edtka -node.frames = sn\u00edmky -node.scripts = skripty - -message.warning = Varov\u00e1n\u00ed -message.confirm.experimental = N\u00e1sleduj\u00edc\u00ed procedura m\u016f\u017ee po\u0161kodit SWF soubor kter\u00fd mo\u017en\u00e1 nep\u016fjde p\u0159ehr\u00e1t.\r\nPOU\u017d\u00cdVAT NA VLASTN\u00cd RIZIKO. Chcete pokra\u010dovat? -message.confirm.parallel = parallelismus m\u016f\u017ee urychlit na\u010d\u00edt\u00e1n\u00ed a dekompilaci ale pou\u017e\u00edv\u00e1 v\u00edce pam\u011bti. -message.confirm.on = Chcete to ZAPNOUT? -message.confirm.off = Chcete to VYPNOUT? -message.confirm = Potvrzen\u00ed - -message.confirm.autodeobfuscate = Automatick\u00e1 deobfuskace je zp\u016fsob jak dekompilovat obfuskovan\u00fd k\u00f3d.\r\nDeobfuskace vede k pomalej\u0161\u00ed dekompilaci a n\u011bkter\u00fd nepou\u017eit\u00fd k\u00f3d m\u016f\u017ee b\u00fdt odstran\u011bn.\r\nPokud k\u00f3d nen\u00ed obfuskovan\u00fd, je lep\u0161\u00ed autodeobfuskaci vypnout. - -message.parallel = parallelismus -message.trait.saved = Vlastnost \u00fasp\u011b\u0161n\u011b ulo\u017eena - -message.constant.new.string = \u0158et\u011bzec "%value%" neexistuje v tabulce konstant. Chcete ho p\u0159idat? -message.constant.new.string.title = P\u0159idat \u0158et\u011bzec -message.constant.new.integer = Cel\u00e9 \u010d\u00edslo "%value%" neexistuje v tabulce konstant. Chcete ho p\u0159idat? -message.constant.new.integer.title = P\u0159idat Cel\u00e9 \u010d\u00edslo -message.constant.new.unsignedinteger = P\u0159irozen\u00e9 \u010d\u00edslo "%value%" neexistuje v tabulce konstant. Chcete ho p\u0159idat? -message.constant.new.unsignedinteger.title = P\u0159idat P\u0159irozen\u00e9 \u010d\u00edslo -message.constant.new.double = Racion\u00e1ln\u00ed \u010d\u00edslo "%value%" neexistuje v tabulce konstant. Chcete ho p\u0159idat? -message.constant.new.double.title = P\u0159idat Racion\u00e1ln\u00ed \u010d\u00edslo - -work.buffering = Na\u010d\u00edt\u00e1n\u00ed -work.waitingfordissasembly = \u010cek\u00e1n\u00ed na disassemblaci -work.gettinghilights = Z\u00edsk\u00e1v\u00e1n\u00ed zv\u00fdraz\u011bn\u00ed -work.disassembling = Disassemblov\u00e1n\u00ed -work.exporting = Exportov\u00e1n\u00ed -work.searching = Vyhled\u00e1v\u00e1n\u00ed -work.renaming = P\u0159ejmenov\u00e1n\u00ed -work.exporting.fla = Exportov\u00e1n\u00ed FLA -work.renaming.identifiers = P\u0159ejmenov\u00e1n\u00ed identifik\u00e1tor\u016f -work.deobfuscating = Deobfuskov\u00e1n\u00ed -work.decompiling = Dekompilov\u00e1n\u00ed -work.gettingvariables = Z\u00edsk\u00e1v\u00e1m prom\u011bnn\u00e9 -work.reading.swf = \u010cten\u00ed SWF -work.creatingwindow = Vytv\u00e1\u0159en\u00ed okna -work.buildingscripttree = Vytv\u00e1\u0159en\u00ed stromu skript\u016f - -work.deobfuscating.complete = Deobfuskace kompletn\u00ed - -message.search.notfound = \u0158et\u011bzec "%searchtext%" nenalezen. -message.search.notfound.title = Nenalezeno - -message.rename.notfound.multiname = Na m\u00edst\u011b kurzoru nen\u00ed \u017e\u00e1dn\u00e9 multiname -message.rename.notfound.identifier = Na m\u00edst\u011b kurzoru nen\u00ed \u017e\u00e1dn\u00fd identifik\u00e1tor -message.rename.notfound.title = Nenalezeno -message.rename.renamed = Po\u010det p\u0159ejmenovan\u00fdch identifik\u00e1tor\u016f: %count% - -filter.images = Obr\u00e1zky (%extensions%) -filter.fla = Dokument %version% (*.fla) -filter.xfl = Nekomprimovan\u00fd Dokument %version% (*.xfl) -filter.swf = SWF soubory (*.swf) - -error = Chyba -error.image.invalid = Neplatn\u00fd obr\u00e1zek. - -error.text.invalid = Neplatn\u00fd text: %text% na \u0159\u00e1dku %line% -error.file.save = Nelze ulo\u017eit soubor -error.file.write = Nelze zapisovat do souboru -error.export = Chyba b\u011bhem exportu - -export.select.directory = Vyberte adres\u00e1\u0159 pro export -export.finishedin = Exportov\u00e1no za %time% - -update.check.title = Vyhled\u00e1n\u00ed aktualizac\u00ed -update.check.nonewversion = Nov\u011bj\u0161\u00ed verze nebyla nalezena. - -message.helpus = Pros\u00edm nav\u0161tivte\r\n%url%\r\npro detaily. -message.homepage = Nav\u0161tivte domovskou str\u00e1nku na: \r\n%url% - -proxy = Proxy -proxy.start = Spustit proxy -proxy.stop = Zastavit proxy -proxy.show = Zobrazit proxy -exit = Ukon\u010den\u00ed - -panel.disassembled = Zdrojov\u00fd P-k\u00f3d -panel.decompiled = Zdrojov\u00fd ActionScript - -search.info = Hlead\u00e1n\u00ed "%text%" : -search.script = Skript - -constants = Konstanty -traits = Vlastnosti - -pleasewait = Pros\u00edm \u010dekejte - -abc.detail.methodtrait = Vlastnost Metoda/Getter/Setter -abc.detail.unsupported = - -abc.detail.slotconsttrait = Vlastnost Slot/Konstanta -abc.detail.traitname = N\u00e1zev: - -abc.detail.body.params.maxstack = Maxim\u00e1ln\u00ed stack: -abc.detail.body.params.localregcount = Po\u010det lok\u00e1ln\u00edch registr\u016f: -abc.detail.body.params.minscope = Min\u00e1ln\u00ed hloubka scope : -abc.detail.body.params.maxscope = Maxim\u00e1ln\u00ed hloubka scope : -abc.detail.body.params.autofill = Automaticky vyplnit p\u0159i ulo\u017een\u00ed (GLOB\u00c1LN\u00cd NASTAVEN\u00cd) -abc.detail.body.params.autofill.experimental = ...EXPERIMENT\u00c1LN\u00cd - -abc.detail.methodinfo.methodindex = Index metody: -abc.detail.methodinfo.parameters = Parametry: -abc.detail.methodinfo.returnvalue = Typ n\u00e1vratov\u00e9 hodnoty: - -error.methodinfo.params = Chyba parametr\u016f MethodInfo -error.methodinfo.returnvalue = Chyba n\u00e1vrat\u00e9ho typu MethodInfo - -abc.detail.methodinfo = MethodInfo -abc.detail.body.code = MethodBody K\u00f3d -abc.detail.body.params = MethodBody parametry - -abc.detail.slotconst.typevalue = Typ a Hodnota: - -error.slotconst.typevalue = Chyba typu a hodnoty SlotConst - -message.autofill.failed = Nelze z\u00edskat statistiky k\u00f3du pro automatick\u00e9 parametry body.\r\nOd\u0161krtn\u011bte automatick\u00e9 vypl\u0148ov\u00e1n\u00ed pro zamezen\u00ed t\u00e9to zpr\u00e1vy. -info.selecttrait = Vyberte t\u0159\u00eddu a klikn\u011bte na vlastnost v zdrojov\u00e9m ActionScriptu pro \u00fapravy. - -button.viewgraph = Zobrazit Graf -button.viewhex = Zobrazit Hex - -abc.traitslist.instanceinitializer = inicializ\u00e1tor instance -abc.traitslist.classinitializer = inicializ\u00e1tor t\u0159\u00eddy - -action.edit.experimental = (Experiment\u00e1ln\u00ed) - -message.action.saved = K\u00f3d \u00fasp\u011b\u0161n\u011b ulo\u017een - -error.action.save = %error% na \u0159\u00e1dku %line% - -message.confirm.remove = Opravdu chcete odebrat %item%\n a v\u0161echny objekty kter\u00e9 na t\u00e9to polo\u017ece z\u00e1vis\u00ed ? - -#after version 1.6.5u1: - -button.ok = OK -button.cancel = Storno - -font.name = N\u00e1zev p\u00edsma: -font.isbold = Je tu\u010dn\u00e9: -font.isitalic = Je kurz\u00edvou: -font.ascent = Horn\u00ed dotah (ascent): -font.descent = Doln\u00ed dotah (descent): -font.leading = \u0158\u00e1dkov\u00fd proklad (leading): -font.characters = Znaky: -font.characters.add = P\u0159idat znaky: -value.unknown = ? - -yes = ano -no = ne - -errors.present = V logu jsou CHYBY. Klikn\u011bte pro zobrazen\u00ed. -errors.none = V logu nejsou \u017e\u00e1dn\u00e9 chyby - -#after version 1.6.6: - -dialog.message.title = Zpr\u00e1va -dialog.select.title = Vyberte si - -button.yes = Ano -button.no = Ne - -FileChooser.openButtonText = Otev\u0159\u00edt -FileChooser.openButtonToolTipText = Otev\u0159\u00edt -FileChooser.lookInLabelText = Vyhledat v: -FileChooser.acceptAllFileFilterText = V\u0161echny soubory -FileChooser.filesOfTypeLabelText = Soubory typu: -FileChooser.fileNameLabelText = N\u00e1zev souboru: -FileChooser.listViewButtonToolTipText = Seznam -FileChooser.listViewButtonAccessibleName = Seznam -FileChooser.detailsViewButtonToolTipText = Detaily -FileChooser.detailsViewButtonAccessibleName = Detaily -FileChooser.upFolderToolTipText = O \u00farove\u0148 v\u00fd\u0161 -FileChooser.upFolderAccessibleName = O \u00farove\u0148 v\u00fd\u0161 -FileChooser.homeFolderToolTipText = Domovsk\u00e1 slo\u017eka -FileChooser.homeFolderAccessibleName = Dom\u016f -FileChooser.fileNameHeaderText = N\u00e1zev -FileChooser.fileSizeHeaderText = Velikost -FileChooser.fileTypeHeaderText = Typ -FileChooser.fileDateHeaderText = Datum -FileChooser.fileAttrHeaderText = Vlastnosti -FileChooser.openDialogTitleText = Otev\u0159\u00edt -FileChooser.directoryDescriptionText = Slo\u017eka -FileChooser.directoryOpenButtonText = Otev\u0159\u00edt -FileChooser.directoryOpenButtonToolTipText = Otev\u0159\u00edt vybranou slo\u017eku -FileChooser.fileDescriptionText = Obecn\u00fd soubor -FileChooser.helpButtonText = N\u00e1pov\u011bda -FileChooser.helpButtonToolTipText = N\u00e1pov\u011bda v\u00fdb\u011bru souboru -FileChooser.newFolderAccessibleName = Nov\u00e1 slo\u017eka -FileChooser.newFolderErrorText = Chyba p\u0159i vytv\u00e1\u0159en\u00ed nov\u00e9 slo\u017eky -FileChooser.newFolderToolTipText = Vytvo\u0159it novou slo\u017eku -FileChooser.other.newFolder = NovaSlozka -FileChooser.other.newFolder.subsequent = NovaSlozka.{0} -FileChooser.win32.newFolder = Nov\u00e1 Slo\u017eka -FileChooser.win32.newFolder.subsequent = Nov\u00e1 Slo\u017eka ({0}) -FileChooser.saveButtonText = Ulo\u017eit -FileChooser.saveButtonToolTipText = Ulo\u017eit vybran\u00fd soubor -FileChooser.saveDialogTitleText = Ulo\u017eit -FileChooser.saveInLabelText = Ulo\u017eit do: -FileChooser.updateButtonText = Obnoven\u00ed -FileChooser.updateButtonToolTipText = Obnoven\u00ed v\u00fdpisu adres\u00e1\u0159e - -#after version 1.6.6u2: - -FileChooser.detailsViewActionLabel.textAndMnemonic = Detaily -FileChooser.detailsViewButtonToolTip.textAndMnemonic = Detaily -FileChooser.fileAttrHeader.textAndMnemonic = Vlastnosti -FileChooser.fileDateHeader.textAndMnemonic = Zm\u011bn\u011bno -FileChooser.fileNameHeader.textAndMnemonic = N\u00e1zev -FileChooser.fileNameLabel.textAndMnemonic = N\u00e1zev souboru: -FileChooser.fileSizeHeader.textAndMnemonic = Velikost -FileChooser.fileTypeHeader.textAndMnemonic = Typ -FileChooser.filesOfTypeLabel.textAndMnemonic = Soubory typu: -FileChooser.folderNameLabel.textAndMnemonic = N\u00e1zev slo\u017eky: -FileChooser.homeFolderToolTip.textAndMnemonic = Dom\u016f -FileChooser.listViewActionLabel.textAndMnemonic = Seznam -FileChooser.listViewButtonToolTip.textAndMnemonic = Seznam -FileChooser.lookInLabel.textAndMnemonic = Vyhledat v: -FileChooser.newFolderActionLabel.textAndMnemonic = Nov\u00e1 slo\u017eka -FileChooser.newFolderToolTip.textAndMnemonic = Vytvo\u0159it novou slo\u017eku -FileChooser.refreshActionLabel.textAndMnemonic = Obnovit -FileChooser.saveInLabel.textAndMnemonic = Vyhledat v: -FileChooser.upFolderToolTip.textAndMnemonic = O \u00farove\u0148 v\u00fd\u0161 -FileChooser.viewMenuButtonAccessibleName = Menu Zobrazit -FileChooser.viewMenuButtonToolTipText = Menu Zobrazit -FileChooser.viewMenuLabel.textAndMnemonic = Zobrazit -FileChooser.newFolderActionLabelText = Nov\u00e1 slo\u017eka -FileChooser.listViewActionLabelText = Seznam -FileChooser.detailsViewActionLabelText = Detaily -FileChooser.refreshActionLabelText = Obnovit -FileChooser.sortMenuLabelText = Se\u0159adit ikony podle -FileChooser.viewMenuLabelText = Zobrazit -FileChooser.fileSizeKiloBytes = {0} KB -FileChooser.fileSizeMegaBytes = {0} MB -FileChooser.fileSizeGigaBytes = {0} GB -FileChooser.folderNameLabelText = N\u00e1zev slo\u017eky: - -error.occured = Do\u0161lo k chyb\u011b : %error% -button.abort = P\u0159eru\u0161it -button.retry = Znovu -button.ignore = Ignorovat - -font.source = Zdrojov\u00e9 p\u00edsmo: - -#after version 1.6.7: - -menu.export = Export -menu.general = Hlavn\u00ed -menu.language = Jazyk - -startup.welcometo = V\u00edtejte v programu -startup.selectopen = Pro za\u010d\u00e1tek klikn\u011bte na otev\u0159\u00edt v horn\u00edm panelu nebo p\u0159et\u00e1hn\u011bte SWF soubor p\u0159\u00edmo do tohoto okna. - -error.font.nocharacter = Vybran\u00e9 zdrojov\u00e9 p\u00edsmo neobsahuje znak "%char%". - -warning.initializers = Statick\u00e9 atributy a konstanty jsou \u010dasto inicializov\u00e1ny pomoc\u00ed inicializ\u00e1tor\u016f.\nPokud to uprav\u00edte zde, obvykle to nesta\u010d\u00ed! - -#after version 1.7.0u1: - -menu.tools.searchMemory = Hledat SWF v pam\u011bti -menu.file.reload = Znovu na\u010d\u00edst -message.confirm.reload = Tato akce zru\u0161\u00ed v\u0161echny neulo\u017een\u00e9 zm\u011bny a znovu na\u010dte SWF soubor.\nChcete pokra\u010dovat? - -dialog.selectbkcolor.title = Vyberte barvu pozad\u00ed pro zobrazen\u00ed SWF -button.selectbkcolor.hint = Vybrat barvu pozad\u00ed - -ColorChooser.okText = OK -ColorChooser.cancelText = Storno -ColorChooser.resetText = Obnovit -ColorChooser.previewText = N\u00e1hled -ColorChooser.swatchesNameText = Vzorn\u00edk -ColorChooser.swatchesRecentText = Ned\u00e1vn\u00e9: -ColorChooser.sampleText = Vzorov\u00fd Text Vzorov\u00fd Text - -#after version 1.7.1: - -preview.play = P\u0159ehr\u00e1t -preview.pause = Pauza -preview.stop = Zastavit - -message.confirm.removemultiple = Opravdu chcete odebrat %count% polo\u017eek\n a v\u0161echny objekty kter\u00e9 na nich z\u00e1vis\u00ed? - -menu.tools.searchCache = Prohledat cache prohl\u00ed\u017ee\u010d\u016f - -#after version 1.7.2u2 - -error.trait.exists = Vlastnost s n\u00e1zvem "%name%" ji\u017e existuje. -button.addtrait = P\u0159idat vlastnost -button.font.embed = Vlo\u017eit... -button.yes.all = Ano v\u0161em -button.no.all = Ne v\u0161em -message.font.add.exists = Znak %char% ji\u017e v tagu p\u00edsma existuje.\nChcete ho nahradit? - -filter.gfx = ScaleForm GFx soubory (*.gfx) -filter.supported = V\u0161echny podporovan\u00e9 typy - -work.canceled = Stornov\u00e1no -work.restoringControlFlow = Obnovuji control flow -menu.advancedsettings.advancedsettings = Pokro\u010dil\u00e1 nastaven\u00ed -menu.recentFiles = Ned\u00e1vno otev\u0159en\u00e9 - -#after version 1.7.4 -work.restoringControlFlow.complete = Control flow obnoven -message.confirm.recentFileNotFound = Soubor nenalezen. Chcete jej odebrat ze seznamu ned\u00e1vno otev\u0159en\u00fdch? -contextmenu.closeSwf = Zav\u0159\u00edt SWF -menu.settings.autoRenameIdentifiers = Automaticky p\u0159ejmenovat identifik\u00e1tory -menu.file.saveasexe = Ulo\u017eit jako Exe... -filter.exe = Spustiteln\u00e9 soubory (*.exe) - -#after version 1.8.0 -font.updateTexts = Aktualizovat texty - -#after version 1.8.0u1 -menu.file.close = Zav\u0159\u00edt -menu.file.closeAll = Zav\u0159\u00edt v\u0161e -menu.tools.otherTools = Dal\u0161\u00ed -menu.tools.otherTools.clearRecentFiles = Vymazat ned\u00e1vno otev\u0159en\u00e9 -fontName.name = N\u00e1zev pro zobrazen\u00ed: -fontName.copyright = Copyright p\u00edsma: -button.preview = N\u00e1hled -button.reset = Reset -errors.info = V logu jsou INFORMACE. Klikn\u011bte pro zobrazen\u00ed. -errors.warning = V logu jsou VAROV\u00c1N\u00cd. Klikn\u011bte pro zobrazen\u00ed. - -decompilationError = Chyba dekompilace - -disassemblingProgress.toString = toString -disassemblingProgress.reading = \u010cten\u00ed -disassemblingProgress.deobfuscating = Deobfuskace - -contextmenu.moveTag = P\u0159esunout tag do - -filter.swc = SWC soubory komponent (*.swc) -filter.zip = ZIP komprimovan\u00e9 soubory (*.zip) -filter.binary = Bin\u00e1rn\u00ed vyhled\u00e1v\u00e1n\u00ed - v\u0161echny soubory (*.*) - -open.error = Chyba -open.error.fileNotFound = Soubor nenalezen -open.error.cannotOpen = Soubor nelze otev\u0159\u00edt - -node.others = ostatn\u00ed - -#after version 1.8.1 -menu.tools.search = Hled\u00e1n\u00ed Textu - -#after version 1.8.1u1 -menu.tools.timeline = \u010casov\u00e1 osa - -dialog.selectcolor.title = Vyberte barvu -button.selectcolor.hint = Kliknut\u00edm vyberete barvu - -#default item name, will be used in following sentences -generictag.array.item = polo\u017eku -generictag.array.insertbeginning = Vlo\u017eit %item% na za\u010d\u00e1tek -generictag.array.insertbefore = Vlo\u017eit %item% p\u0159ed -generictag.array.remove = Odstranit %item% -generictag.array.insertafter = Vlo\u017eit %item% za -generictag.array.insertend = Vlo\u017eit %item% na konec - -#after version 2.0.0 -contextmenu.expandAll = Rozbalit v\u0161e - -filter.sounds = Podporovan\u00e9 zvukov\u00e9 form\u00e1ty (*.wav, *.mp3) -filter.sounds.wav = Wave form\u00e1t (*.wav) -filter.sounds.mp3 = MP3 komprimovan\u00fd form\u00e1t (*.mp3) - -error.sound.invalid = Neplatn\u00fd zvuk. - -button.prev = P\u0159edchoz\u00ed -button.next = Dal\u0161\u00ed - -#after version 2.1.0 -message.action.playerglobal.title = Vy\u017eadov\u00e1na knihovna PlayerGlobal -message.action.playerglobal.needed = Pro p\u0159\u00edmou editaci ActionScriptu 3 je pot\u0159eba knihovna "PlayerGlobal.swc", kterou lze stahnout ze str\u00e1nek Adobe\r\n%adobehomepage%\r\nStiskn\u011bte OK pro p\u0159echod na stahovac\u00ed str\u00e1nku. -message.action.playerglobal.place = St\u00e1hn\u011bte knihovnu nazvanou PlayerGlobal(.swc), a um\u00edst\u011bte j\u00ed do adres\u00e1\u0159e\r\n%libpath%\r\n Stiskn\u011bte OK pro pokra\u010dov\u00e1n\u00ed. - -message.confirm.experimental.function = Tato funkce je EXPERIMENT\u00c1LN\u00cd. To znamen\u00e1, \u017ee byste nem\u011bli v\u011b\u0159it jej\u00edm v\u00fdsledk\u016fm a SWF soubor m\u016f\u017ee po ulo\u017een\u00ed p\u0159estat fungovat. -message.confirm.donotshowagain = P\u0159\u00ed\u0161t\u011b nezobrazovat - -menu.import = Import -menu.file.import.text = Import textu -import.select.directory = Vyberte adres\u00e1\u0159 pro import -error.text.import = Chyba b\u011bhem importu textu. Chcete pokra\u010dovat? - -#after version 2.1.1 -contextmenu.removeWithDependencies = Odstranit se z\u00e1vislostmi - -abc.action.find-usages = Naj\u00edt pou\u017eit\u00ed -abc.action.find-declaration = Naj\u00edt deklaraci - -contextmenu.rawEdit = P\u0159\u00edm\u00e1 editace -contextmenu.jumpToCharacter = Skok na charakter - -menu.settings.dumpView = Zobrazit Dump - -menu.view = Zobrazen\u00ed -menu.file.view.resources = Zdroje -menu.file.view.hex = Hex dump - -node.header = hlavi\u010dka - -header.signature = Signatura: -header.compression = Komprese: -header.compression.lzma = LZMA -header.compression.zlib = ZLIB -header.compression.none = Bez komprese -header.version = Verze SWF: -header.gfx = GFX: -header.filesize = Velikost souboru: -header.framerate = Frekvence sn\u00edmk\u016f: -header.framecount = Po\u010det sn\u00edmk\u016f: -header.displayrect = Zobrazen\u00fd obd\u00e9ln\u00edk: -header.displayrect.value.twips = %xmin%,%ymin% => %xmax%,%ymax% twip\u016f -header.displayrect.value.pixels = %xmin%,%ymin% => %xmax%,%ymax% pixel\u016f - -contextmenu.saveToFile = Ulo\u017eit do souboru -contextmenu.parseActions = Naparsovat akce -contextmenu.parseABC = Naparsovat ABC -contextmenu.parseInstructions = Naparsovat AVM2 instrukce - -menu.deobfuscation = Deobfuskace -menu.file.deobfuscation.old = Star\u00fd zp\u016fsob -menu.file.deobfuscation.new = Nov\u00fd zp\u016fsob - -contextmenu.openswfinside = Otev\u0159\u00edt SWF uvnit\u0159 -binarydata.swfInside = Vypad\u00e1 to, \u017ee uvnit\u0159 v tomto BinaryData tagu se nach\u00e1z\u00ed SWF soubor. Klikn\u011bte zde pro jeho na\u010dten\u00ed jako podstrom. - -#after version 3.0.0 -button.zoomin.hint = P\u0159ibl\u00ed\u017eit -button.zoomout.hint = Odd\u00e1lit -button.zoomfit.hint = Rozt\u00e1hnout -button.zoomnone.hint = M\u011b\u0159\u00edtko 1:1 -button.snapshot.hint = Sn\u00edmek do schr\u00e1nky - -editorTruncateWarning = Text je o\u0159\u00edznut na pozici %chars% v lad\u00edc\u00edm m\u00f3du. - -font.name.intag = N\u00e1zev p\u00edsma v tagu: - -menu.debugger = Debugger -menu.debugger.switch = Debugger -menu.debugger.replacetrace = Nahradit vol\u00e1n\u00ed trace -menu.debugger.showlog = Zobrazit Log - -message.debugger = Tento SWF Debugger slou\u017e\u00ed jen k pos\u00edl\u00e1n\u00ed zpr\u00e1v do okna logu, konzole prohl\u00ed\u017ee\u010de nebo alert oken.\r\nNEN\u00cd ur\u010den pro krokov\u00e1n\u00ed k\u00f3du, breakpointy atd. - -contextmenu.addTag = P\u0159idat tag - -deobfuscation.comment.tryenable = Tip: m\u016f\u017eete zkusit povolit "Automatickou deobfuskaci" v nastaven\u00ed -deobfuscation.comment.failed = Deobfuskace je aktivn\u00ed, ale dekompilace p\u0159esto selhala. Pokud soubor NEN\u00cd obfuskov\u00e1n, zaka\u017ete "Automatickou deobfuskaci" pro lep\u0161\u00ed v\u00fdsledky. - -#after version 4.0.2 -preview.nextframe = Dal\u0161\u00ed sn\u00edmek -preview.prevframe = P\u0159ede\u0161l\u00fd sn\u00edmek -preview.gotoframe = P\u0159ej\u00edt na sn\u00edmek... - -preview.gotoframe.dialog.title = P\u0159ej\u00edt na sn\u00edmek -preview.gotoframe.dialog.message = Zadejte \u010d\u00edslo sn\u00edmku (%min% - %max%) -preview.gotoframe.dialog.frame.error = Neplatn\u00e9 \u010d\u00edslo sn\u00edmku. Mus\u00ed to b\u00fdt \u010d\u00edslo v rozmez\u00ed %min% a %max%. - -error.text.invalid.continue = Neplatn\u00fd text: %text% na \u0159\u00e1dku %line%. Chcete pokra\u010dovat? - -#after version 4.0.5 -contextmenu.copyTag = Zkop\u00edrovat tag do -fit = p\u0159izp\u016fsobit -button.setAdvanceValues = Nastavit hodnoty advance - -menu.tools.replace = Nahrazen\u00ed textu - -message.confirm.close = Existuj\u00ed neulo\u017een\u00e9 zm\u011bny. Opravdu chcete zav\u0159\u00edt {swfName}? -message.confirm.closeAll = Existuj\u00ed neulo\u017een\u00e9 zm\u011bny. Opravdu chcete zav\u0159\u00edt v\u0161echny SWF? - -contextmenu.exportJavaSource = Exportovat zdroj\u00e1k Javy -contextmenu.exportSwfXml = Exportovat SWF jako XML -contextmenu.importSwfXml = Importovat SWF XML - -filter.xml = XML - -#after version 4.1.0 -contextmenu.undo = Zp\u011bt - -text.align.left = Zarovnat vlevo -text.align.right = Zarovnat vpravo -text.align.center = Zarovnat na st\u0159ed -text.align.justify = Zarovnat do bloku - -text.undo = Vr\u00e1tit zm\u011bny - -menu.file.import.xml = Import SWF XML -menu.file.export.xml = Export SWF XML - -#after version 4.1.1 -text.align.translatex.decrease = Sn\u00ed\u017eit TranslateX -text.align.translatex.increase = Zv\u00fd\u0161it TranslateX -selectPreviousTag = Vybrat p\u0159edchoz\u00ed tag -selectNextTag = Vybrat dal\u0161\u00ed tag -button.ignoreAll = Ignorovat V\u0161e -menu.file.import.symbolClass = Import Symbol-Class -text.toggleCase = P\u0159epnout mal\u00e1/velk\u00e1 - -#after version 5.0.2 -preview.loop = Opakovat -menu.file.import.script = Importovat skript -contextmenu.copyTagWithDependencies = Kop\u00edrovat tagy se z\u00e1vislostmi do -button.replaceWithTag = Nahradit jin\u00fdm charakterov\u00fdm tagem -button.resolveConstants = Resolvovat konstanty - -#after version 5.1.0 -button.viewConstants = Zobrazit konstanty -work.exported = Exportov\u00e1no -button.replaceAlphaChannel = Nahradit alfa kan\u00e1l... - -tagInfo.header.name = N\u00e1zev -tagInfo.header.value = Hodnota -tagInfo.tagType = Typ tagu -tagInfo.characterId = Id charakteru -tagInfo.offset = Offset -tagInfo.length = D\u00e9lka -tagInfo.bounds = Meze -tagInfo.width = \u0160\u00ed\u0159ka -tagInfo.height = V\u00fd\u0161ka -tagInfo.neededCharacters = Pot\u0159ebn\u00e9 charaktery - -button.viewhexpcode = Zobrazit Hex s instrukcemi -taginfo.header = Z\u00e1kladn\u00ed informace o tagu - -tagInfo.dependentCharacters = Z\u00e1visl\u00e9 charaktery - -#after version 5.3.0 -header.uncompressed = Bez komprese -header.warning.unsupportedGfxCompression = GFX podporuje pouze soubor se Zlib nebo \u017e\u00e1dnou kompres\u00ed. -header.warning.minimumZlibVersion = Zlib komprese vy\u017eaduje SWF verze 6 \u010di vy\u0161\u0161\u00ed. -header.warning.minimumLzmaVersion = LZMA komprese vy\u017eaduje SWF verze 13 \u010di vy\u0161\u0161\u00ed. - -tagInfo.codecName = N\u00e1zev kodeku -tagInfo.exportFormat = Form\u00e1t exportu -tagInfo.samplingRate = Vzorkovac\u00ed frekvence -tagInfo.stereo = Stereo -tagInfo.sampleCount = Po\u010det vzork\u016f - -filter.dmg = Spustieln\u00e9 soubory Macu (*.dmg) -filter.linuxExe = Linuxov\u00e9 spustiteln\u00e9 soubory - -import.script.result = %count% skript\u016f importov\u00e1no. -import.script.as12warning = Import skript\u016f funguje jen pro AS1/2 skripty. - -error.constantPoolTooBig = Seznam konstant je moc velk\u00fd index=%index%, velikost=%size% -error.image.alpha.invalid = Neplatn\u00e1 data alpha kan\u00e1lu. - -#after version 6.0.2 -contextmenu.saveUncompressedToFile = Ulo\u017eit nekomprimovan\u011b -abc.traitslist.scriptinitializer = inicializ\u00e1tor skriptu -menu.settings.autoOpenLoadedSWFs = Otev\u00edrat na\u010d\u00edtan\u00e1 SWF b\u011bhem p\u0159ehr\u00e1v\u00e1n\u00ed - -#after version 6.1.1 -menu.file.start = Start -menu.file.start.run = Spustit -menu.file.start.stop = Zastavit -menu.file.start.debug = Ladit -menu.debugging = Lad\u011bn\u00ed -menu.debugging.debug = Lad\u011bn\u00ed -menu.debugging.debug.stop = Ukon\u010dit -menu.debugging.debug.pause = Pauza -menu.debugging.debug.stepOver = Step over -menu.debugging.debug.stepInto = Step into -menu.debugging.debug.stepOut = Step out -menu.debugging.debug.continue = Pokra\u010dovat -menu.debugging.debug.stack = Stack... -menu.debugging.debug.watch = New watch... - -message.playerpath.notset = Flash Player projector nenalezen. Pros\u00edm nastavte cestu k n\u011bmu v Pokro\u010dil\u00e1 nastaven\u00ed / Cesty (1). -message.playerpath.debug.notset = Flash Player projector content debugger nenalezen. Pros\u00edm nastavte cestu k n\u011bmu v Pokro\u010dil\u00e1 nastaven\u00ed / Cesty (2). -message.playerpath.lib.notset = PlayerGlobal (.SWC) nenalezen. Pros\u00edm nastavte cestu k n\u011bmu v Pokro\u010dil\u00e1 nastaven\u00ed / Cesty (3). - -debugpanel.header = Lad\u011bn\u00ed - -variables.header.registers = Registry -variables.header.locals = Lok\u00e1ln\u00ed -variables.header.arguments = Argumenty -variables.header.scopeChain = Scope chain -variables.column.name = N\u00e1zev -variables.column.type = Typ -variables.column.value = Hodnota - -callStack.header = Call stack -callStack.header.file = Soubor -callStack.header.line = \u0158\u00e1dek - -stack.header = Stack -stack.header.item = Polo\u017eka - -work.running = B\u011bh -work.debugging = Lad\u011bn\u00ed -work.debugging.instrumenting = P\u0159\u00edprava SWF pro lad\u011bn\u00ed -work.breakat = Pozastaveno na \u0020 -work.halted = Lad\u011bn\u00ed za\u010dalo, b\u011bh je nyn\u00ed pozastaven. P\u0159idejte breakpointy a klikn\u011bte na Pokra\u010dovat (F5) pro obnoven\u00ed b\u011bhu. - -debuglog.header = Z\u00e1znam -debuglog.button.clear = Vypr\u00e1znit - -#after 7.0.1 -work.debugging.wait = \u010cek\u00e1 se na p\u0159ipojen\u00ed Flash debug projektoru - -error.debug.listen = Nelze naslouchat na portu %port%. Mo\u017en\u00e1 je spu\u0161t\u011bn n\u011bjak\u00fd jin\u00fd debugger. - -debug.break.reason.unknown = (Nezn\u00e1m\u00fd d\u016fvod) -debug.break.reason.breakpoint = (Breakpoint) -debug.break.reason.watch = (Watch) -debug.break.reason.fault = (Selh\u00e1n\u00ed) -debug.break.reason.stopRequest = (Zastaveno) -debug.break.reason.step = (Step) -debug.break.reason.halt = (Halt) -debug.break.reason.scriptLoaded = (Skript na\u010dten) - -menu.file.start.debugpcode = Lad\u011bn\u00ed P-k\u00f3du - -#after 7.1.2 -button.replaceNoFill = Nahradit - aktualizovat hranice... -message.warning.svgImportExperimental = Ne v\u0161echny SVG vlastnosti jsou podporov\u00e1ny. Pros\u00edm zkontrolujte log po importu. - -message.imported.swf = SWF soubor pou\u017e\u00edv\u00e1 assety z importovan\u00e9ho SWF souboru:\n%url%\nChcete tyto assety na\u010d\u00edst z dan\u00e9ho URL? -message.imported.swf.manually = Nelze na\u010d\u00edst importovan\u00e9 SWF\n%url%\nSoubor nebo URL neexistuje.\nChcete vybrat m\u00edstn\u00ed soubor? - -message.warning.hexViewNotUpToDate = Hexa pohled nen\u00ed aktu\u00e1ln\u00ed. Pros\u00edm ulo\u017ete a znovuna\u010dt\u011bte soubor pro aktualizaci hexa pohledu. -message.font.replace.updateTexts = N\u011bkter\u00e9 znaky byly nahrazeny. Chcete aktualizovat existuj\u00edc\u00ed texty? - -menu.settings.simplifyExpressions = Zjednodu\u0161it v\u00fdrazy - -#after 8.0.1 -menu.recentFiles.empty = Seznam ned\u00e1vno otev\u0159en\u00fdch je pr\u00e1zdn\u00fd -message.warning.outOfMemory32BitJre = Nastala chyba z nedostatku pam\u011bti. M\u00e1te spu\u0161t\u011bnou 32bitovou Javu na 64bitov\u00e9m syst\u00e9mu. Pros\u00edm pou\u017eijte 64bitovou Java. - -menu.file.reloadAll = Znovu na\u010d\u00edst v\u0161e -message.confirm.reloadAll = Tato akce stornuje v\u0161echny neulo\u017een\u00e9 zm\u011bny ve v\u0161ech SWF souborech a znovu na\u010dte celou aplikaci.\nChcete pokra\u010dovat? -export.script.singleFilePallelModeWarning = Export skript\u016f do jednoho souboru nen\u00ed dostupn\u00fd se zapnut\u00fdm paralleln\u00edm zrychlen\u00edm - -button.showOriginalBytesInPcodeHex = Zobrazit origin\u00e1ln\u00ed bajty -button.remove = Odstranit -button.showFileOffsetInPcodeHex = Zobrazit offset v souboru - -generic.editor.amf3.title = AMF3 editor -generic.editor.amf3.help = Syntaxe AMF3 hodnoty:\n\ - ------------------\n\ - skal\u00e1rn\u00ed typy:\n\ - %scalar_samples%\ - ostatn\u00ed typy:\n\ - %nonscalar_samples%\ - \n\ - Pozn\u00e1mky:\n\ - \ * Neskal\u00e1rn\u00ed datov\u00e9 typy mohou mohou b\u00fdt odkazov\u00e1ny p\u0159edem deklarovan\u00fdmi "id" atributy s pomoc\u00ed # syntaxe:\n\ - %reference_sample%\n\ - \ * Kl\u00ed\u010de v z\u00e1znamech Dictionary mohou b\u00fdt jak\u00e9hokoli typu\n -contextmenu.showInResources = Zobrazit ve Zdroj\u00edch -message.flexpath.notset = Flex SDK nenalezeno. Pros\u00edm nastavte cestu k n\u011bmu v Pokro\u010dil\u00e1 nastaven\u00ed / Cesty (4). - - -#add after panel.disassembled string -abc.detail.split = :\u0020 -abc.detail.trait = Vlastnost - %trait_type% -abc.detail.trait.method = Metoda -abc.detail.trait.getter = Getter -abc.detail.trait.setter = Setter -abc.detail.trait.slot = Slot -abc.detail.trait.const = Konstanta -abc.detail.trait.class = T\u0159\u00edda -abc.detail.trait.function = Funkce - -abc.detail.specialmethod = Speci\u00e1ln\u00ed metoda - %specialmethod_type% -abc.detail.specialmethod.scriptinitializer = Inicializ\u00e1tor skriptu -abc.detail.specialmethod.classinitializer = Inicializ\u00e1tor t\u0159\u00eddy -abc.detail.specialmethod.instanceinitializer = Inicializ\u00e1tor instance -abc.detail.innerfunction = Vnit\u0159n\u00ed funkce - -button.edit.script.decompiled = Upravit ActionScript -button.edit.script.disassembled = Upravit P-k\u00f3d - -message.font.setadvancevalues = Tato operace nastav\u00ed advance V\u0160ECH znak\u016f v tomto tagu na advance hodnoty zdrojov\u00e9ho p\u00edsma. \ No newline at end of file +# Copyright (C) 2010-2016 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 . + +menu.file = Soubor +menu.file.open = Otev\u0159\u00edt... +menu.file.save = Ulo\u017eit +menu.file.saveas = Ulo\u017eit jako... +menu.file.export.fla = Exportovat do FLA +menu.file.export.all = Exportovat v\u0161e +menu.file.export.selection = Exportovat vybran\u00e9 +menu.file.exit = Ukon\u010dit + +menu.tools = N\u00e1stroje +menu.tools.searchas = Prohledat ActionScript... +menu.tools.proxy = Proxy +menu.tools.deobfuscation = Deobfuskace +menu.tools.deobfuscation.pcode = Deobfuskace P-k\u00f3du... +menu.tools.deobfuscation.globalrename = Glob\u00e1ln\u011b p\u0159ejmenovat identifik\u00e1tor +menu.tools.deobfuscation.renameinvalid = P\u0159ejmenovat neplatn\u00e9 identifik\u00e1tory +menu.tools.gotoDocumentClass = P\u0159ej\u00edt na hlavn\u00ed t\u0159\u00eddu dokumentu + +menu.settings = Nastaven\u00ed +menu.settings.autodeobfuscation = Automatick\u00e1 deobfuskace +menu.settings.internalflashviewer = Pou\u017e\u00edvat vlastn\u00ed prohl\u00ed\u017ee\u010d Flashe +menu.settings.parallelspeedup = Paraleln\u00ed zrychlen\u00ed +menu.settings.disabledecompilation = Zak\u00e1zat dekompilaci (Pouze P-k\u00f3d) +menu.settings.addtocontextmenu = P\u0159idat FFDec do kontextov\u00e9ho menu SWF +menu.settings.language = Zm\u011bnit jazyk +menu.settings.cacheOnDisk = Pou\u017e\u00edvat cache na disku +menu.settings.gotoMainClassOnStartup = Zv\u00fdraznit hlavn\u00ed t\u0159\u00eddu po startu + +menu.help = N\u00e1pov\u011bda +menu.help.checkupdates = Zkontrolovat novou verzi... +menu.help.helpus = Pomo\u017ete n\u00e1m! +menu.help.homepage = Nav\u0161t\u00edvit domovskou str\u00e1nku +menu.help.about = O aplikaci... + +contextmenu.remove = Odebrat + +button.save = Ulo\u017eit +button.edit = Upravit +button.cancel = Storno +button.replace = Nahradit... + +notavailonthisplatform = N\u00e1hled tohoto objektu nen\u00ed dostupn\u00fd na t\u00e9to platform\u011b. (pouze Windows) + +swfpreview = n\u00e1hled SWF +swfpreview.internal = n\u00e1hled SWF (vlastn\u00ed prohl\u00ed\u017ee\u010d) + +parameters = Parametry + +rename.enternew = Zadejte nov\u00fd n\u00e1zev: + +rename.finished.identifier = Identifik\u00e1tor p\u0159ejmenov\u00e1n. +rename.finished.multiname = %count% multiname p\u0159ejmenov\u00e1no. + +node.texts = texty +node.images = obr\u00e1zky +node.movies = videa +node.sounds = zvuky +node.binaryData = bin\u00e1rn\u00ed data +node.fonts = p\u00edsma +node.sprites = sprity +node.shapes = tvary +node.morphshapes = morphshapes +node.buttons = tla\u010d\u00edtka +node.frames = sn\u00edmky +node.scripts = skripty + +message.warning = Varov\u00e1n\u00ed +message.confirm.experimental = N\u00e1sleduj\u00edc\u00ed procedura m\u016f\u017ee po\u0161kodit SWF soubor kter\u00fd mo\u017en\u00e1 nep\u016fjde p\u0159ehr\u00e1t.\r\nPOU\u017d\u00cdVAT NA VLASTN\u00cd RIZIKO. Chcete pokra\u010dovat? +message.confirm.parallel = parallelismus m\u016f\u017ee urychlit na\u010d\u00edt\u00e1n\u00ed a dekompilaci ale pou\u017e\u00edv\u00e1 v\u00edce pam\u011bti. +message.confirm.on = Chcete to ZAPNOUT? +message.confirm.off = Chcete to VYPNOUT? +message.confirm = Potvrzen\u00ed + +message.confirm.autodeobfuscate = Automatick\u00e1 deobfuskace je zp\u016fsob jak dekompilovat obfuskovan\u00fd k\u00f3d.\r\nDeobfuskace vede k pomalej\u0161\u00ed dekompilaci a n\u011bkter\u00fd nepou\u017eit\u00fd k\u00f3d m\u016f\u017ee b\u00fdt odstran\u011bn.\r\nPokud k\u00f3d nen\u00ed obfuskovan\u00fd, je lep\u0161\u00ed autodeobfuskaci vypnout. + +message.parallel = parallelismus +message.trait.saved = Vlastnost \u00fasp\u011b\u0161n\u011b ulo\u017eena + +message.constant.new.string = \u0158et\u011bzec "%value%" neexistuje v tabulce konstant. Chcete ho p\u0159idat? +message.constant.new.string.title = P\u0159idat \u0158et\u011bzec +message.constant.new.integer = Cel\u00e9 \u010d\u00edslo "%value%" neexistuje v tabulce konstant. Chcete ho p\u0159idat? +message.constant.new.integer.title = P\u0159idat Cel\u00e9 \u010d\u00edslo +message.constant.new.unsignedinteger = P\u0159irozen\u00e9 \u010d\u00edslo "%value%" neexistuje v tabulce konstant. Chcete ho p\u0159idat? +message.constant.new.unsignedinteger.title = P\u0159idat P\u0159irozen\u00e9 \u010d\u00edslo +message.constant.new.double = Racion\u00e1ln\u00ed \u010d\u00edslo "%value%" neexistuje v tabulce konstant. Chcete ho p\u0159idat? +message.constant.new.double.title = P\u0159idat Racion\u00e1ln\u00ed \u010d\u00edslo + +work.buffering = Na\u010d\u00edt\u00e1n\u00ed +work.waitingfordissasembly = \u010cek\u00e1n\u00ed na disassemblaci +work.gettinghilights = Z\u00edsk\u00e1v\u00e1n\u00ed zv\u00fdraz\u011bn\u00ed +work.disassembling = Disassemblov\u00e1n\u00ed +work.exporting = Exportov\u00e1n\u00ed +work.searching = Vyhled\u00e1v\u00e1n\u00ed +work.renaming = P\u0159ejmenov\u00e1n\u00ed +work.exporting.fla = Exportov\u00e1n\u00ed FLA +work.renaming.identifiers = P\u0159ejmenov\u00e1n\u00ed identifik\u00e1tor\u016f +work.deobfuscating = Deobfuskov\u00e1n\u00ed +work.decompiling = Dekompilov\u00e1n\u00ed +work.gettingvariables = Z\u00edsk\u00e1v\u00e1m prom\u011bnn\u00e9 +work.reading.swf = \u010cten\u00ed SWF +work.creatingwindow = Vytv\u00e1\u0159en\u00ed okna +work.buildingscripttree = Vytv\u00e1\u0159en\u00ed stromu skript\u016f + +work.deobfuscating.complete = Deobfuskace kompletn\u00ed + +message.search.notfound = \u0158et\u011bzec "%searchtext%" nenalezen. +message.search.notfound.title = Nenalezeno + +message.rename.notfound.multiname = Na m\u00edst\u011b kurzoru nen\u00ed \u017e\u00e1dn\u00e9 multiname +message.rename.notfound.identifier = Na m\u00edst\u011b kurzoru nen\u00ed \u017e\u00e1dn\u00fd identifik\u00e1tor +message.rename.notfound.title = Nenalezeno +message.rename.renamed = Po\u010det p\u0159ejmenovan\u00fdch identifik\u00e1tor\u016f: %count% + +filter.images = Obr\u00e1zky (%extensions%) +filter.fla = Dokument %version% (*.fla) +filter.xfl = Nekomprimovan\u00fd Dokument %version% (*.xfl) +filter.swf = SWF soubory (*.swf) + +error = Chyba +error.image.invalid = Neplatn\u00fd obr\u00e1zek. + +error.text.invalid = Neplatn\u00fd text: %text% na \u0159\u00e1dku %line% +error.file.save = Nelze ulo\u017eit soubor +error.file.write = Nelze zapisovat do souboru +error.export = Chyba b\u011bhem exportu + +export.select.directory = Vyberte adres\u00e1\u0159 pro export +export.finishedin = Exportov\u00e1no za %time% + +update.check.title = Vyhled\u00e1n\u00ed aktualizac\u00ed +update.check.nonewversion = Nov\u011bj\u0161\u00ed verze nebyla nalezena. + +message.helpus = Pros\u00edm nav\u0161tivte\r\n%url%\r\npro detaily. +message.homepage = Nav\u0161tivte domovskou str\u00e1nku na: \r\n%url% + +proxy = Proxy +proxy.start = Spustit proxy +proxy.stop = Zastavit proxy +proxy.show = Zobrazit proxy +exit = Ukon\u010den\u00ed + +panel.disassembled = Zdrojov\u00fd P-k\u00f3d +panel.decompiled = Zdrojov\u00fd ActionScript + +search.info = Hlead\u00e1n\u00ed "%text%" : +search.script = Skript + +constants = Konstanty +traits = Vlastnosti + +pleasewait = Pros\u00edm \u010dekejte + +abc.detail.methodtrait = Vlastnost Metoda/Getter/Setter +abc.detail.unsupported = - +abc.detail.slotconsttrait = Vlastnost Slot/Konstanta +abc.detail.traitname = N\u00e1zev: + +abc.detail.body.params.maxstack = Maxim\u00e1ln\u00ed stack: +abc.detail.body.params.localregcount = Po\u010det lok\u00e1ln\u00edch registr\u016f: +abc.detail.body.params.minscope = Min\u00e1ln\u00ed hloubka scope : +abc.detail.body.params.maxscope = Maxim\u00e1ln\u00ed hloubka scope : +abc.detail.body.params.autofill = Automaticky vyplnit p\u0159i ulo\u017een\u00ed (GLOB\u00c1LN\u00cd NASTAVEN\u00cd) +abc.detail.body.params.autofill.experimental = ...EXPERIMENT\u00c1LN\u00cd + +abc.detail.methodinfo.methodindex = Index metody: +abc.detail.methodinfo.parameters = Parametry: +abc.detail.methodinfo.returnvalue = Typ n\u00e1vratov\u00e9 hodnoty: + +error.methodinfo.params = Chyba parametr\u016f MethodInfo +error.methodinfo.returnvalue = Chyba n\u00e1vrat\u00e9ho typu MethodInfo + +abc.detail.methodinfo = MethodInfo +abc.detail.body.code = MethodBody K\u00f3d +abc.detail.body.params = MethodBody parametry + +abc.detail.slotconst.typevalue = Typ a Hodnota: + +error.slotconst.typevalue = Chyba typu a hodnoty SlotConst + +message.autofill.failed = Nelze z\u00edskat statistiky k\u00f3du pro automatick\u00e9 parametry body.\r\nOd\u0161krtn\u011bte automatick\u00e9 vypl\u0148ov\u00e1n\u00ed pro zamezen\u00ed t\u00e9to zpr\u00e1vy. +info.selecttrait = Vyberte t\u0159\u00eddu a klikn\u011bte na vlastnost v zdrojov\u00e9m ActionScriptu pro \u00fapravy. + +button.viewgraph = Zobrazit Graf +button.viewhex = Zobrazit Hex + +abc.traitslist.instanceinitializer = inicializ\u00e1tor instance +abc.traitslist.classinitializer = inicializ\u00e1tor t\u0159\u00eddy + +action.edit.experimental = (Experiment\u00e1ln\u00ed) + +message.action.saved = K\u00f3d \u00fasp\u011b\u0161n\u011b ulo\u017een + +error.action.save = %error% na \u0159\u00e1dku %line% + +message.confirm.remove = Opravdu chcete odebrat %item%\n a v\u0161echny objekty kter\u00e9 na t\u00e9to polo\u017ece z\u00e1vis\u00ed ? + +#after version 1.6.5u1: + +button.ok = OK +button.cancel = Storno + +font.name = N\u00e1zev p\u00edsma: +font.isbold = Je tu\u010dn\u00e9: +font.isitalic = Je kurz\u00edvou: +font.ascent = Horn\u00ed dotah (ascent): +font.descent = Doln\u00ed dotah (descent): +font.leading = \u0158\u00e1dkov\u00fd proklad (leading): +font.characters = Znaky: +font.characters.add = P\u0159idat znaky: +value.unknown = ? + +yes = ano +no = ne + +errors.present = V logu jsou CHYBY. Klikn\u011bte pro zobrazen\u00ed. +errors.none = V logu nejsou \u017e\u00e1dn\u00e9 chyby + +#after version 1.6.6: + +dialog.message.title = Zpr\u00e1va +dialog.select.title = Vyberte si + +button.yes = Ano +button.no = Ne + +FileChooser.openButtonText = Otev\u0159\u00edt +FileChooser.openButtonToolTipText = Otev\u0159\u00edt +FileChooser.lookInLabelText = Vyhledat v: +FileChooser.acceptAllFileFilterText = V\u0161echny soubory +FileChooser.filesOfTypeLabelText = Soubory typu: +FileChooser.fileNameLabelText = N\u00e1zev souboru: +FileChooser.listViewButtonToolTipText = Seznam +FileChooser.listViewButtonAccessibleName = Seznam +FileChooser.detailsViewButtonToolTipText = Detaily +FileChooser.detailsViewButtonAccessibleName = Detaily +FileChooser.upFolderToolTipText = O \u00farove\u0148 v\u00fd\u0161 +FileChooser.upFolderAccessibleName = O \u00farove\u0148 v\u00fd\u0161 +FileChooser.homeFolderToolTipText = Domovsk\u00e1 slo\u017eka +FileChooser.homeFolderAccessibleName = Dom\u016f +FileChooser.fileNameHeaderText = N\u00e1zev +FileChooser.fileSizeHeaderText = Velikost +FileChooser.fileTypeHeaderText = Typ +FileChooser.fileDateHeaderText = Datum +FileChooser.fileAttrHeaderText = Vlastnosti +FileChooser.openDialogTitleText = Otev\u0159\u00edt +FileChooser.directoryDescriptionText = Slo\u017eka +FileChooser.directoryOpenButtonText = Otev\u0159\u00edt +FileChooser.directoryOpenButtonToolTipText = Otev\u0159\u00edt vybranou slo\u017eku +FileChooser.fileDescriptionText = Obecn\u00fd soubor +FileChooser.helpButtonText = N\u00e1pov\u011bda +FileChooser.helpButtonToolTipText = N\u00e1pov\u011bda v\u00fdb\u011bru souboru +FileChooser.newFolderAccessibleName = Nov\u00e1 slo\u017eka +FileChooser.newFolderErrorText = Chyba p\u0159i vytv\u00e1\u0159en\u00ed nov\u00e9 slo\u017eky +FileChooser.newFolderToolTipText = Vytvo\u0159it novou slo\u017eku +FileChooser.other.newFolder = NovaSlozka +FileChooser.other.newFolder.subsequent = NovaSlozka.{0} +FileChooser.win32.newFolder = Nov\u00e1 Slo\u017eka +FileChooser.win32.newFolder.subsequent = Nov\u00e1 Slo\u017eka ({0}) +FileChooser.saveButtonText = Ulo\u017eit +FileChooser.saveButtonToolTipText = Ulo\u017eit vybran\u00fd soubor +FileChooser.saveDialogTitleText = Ulo\u017eit +FileChooser.saveInLabelText = Ulo\u017eit do: +FileChooser.updateButtonText = Obnoven\u00ed +FileChooser.updateButtonToolTipText = Obnoven\u00ed v\u00fdpisu adres\u00e1\u0159e + +#after version 1.6.6u2: + +FileChooser.detailsViewActionLabel.textAndMnemonic = Detaily +FileChooser.detailsViewButtonToolTip.textAndMnemonic = Detaily +FileChooser.fileAttrHeader.textAndMnemonic = Vlastnosti +FileChooser.fileDateHeader.textAndMnemonic = Zm\u011bn\u011bno +FileChooser.fileNameHeader.textAndMnemonic = N\u00e1zev +FileChooser.fileNameLabel.textAndMnemonic = N\u00e1zev souboru: +FileChooser.fileSizeHeader.textAndMnemonic = Velikost +FileChooser.fileTypeHeader.textAndMnemonic = Typ +FileChooser.filesOfTypeLabel.textAndMnemonic = Soubory typu: +FileChooser.folderNameLabel.textAndMnemonic = N\u00e1zev slo\u017eky: +FileChooser.homeFolderToolTip.textAndMnemonic = Dom\u016f +FileChooser.listViewActionLabel.textAndMnemonic = Seznam +FileChooser.listViewButtonToolTip.textAndMnemonic = Seznam +FileChooser.lookInLabel.textAndMnemonic = Vyhledat v: +FileChooser.newFolderActionLabel.textAndMnemonic = Nov\u00e1 slo\u017eka +FileChooser.newFolderToolTip.textAndMnemonic = Vytvo\u0159it novou slo\u017eku +FileChooser.refreshActionLabel.textAndMnemonic = Obnovit +FileChooser.saveInLabel.textAndMnemonic = Vyhledat v: +FileChooser.upFolderToolTip.textAndMnemonic = O \u00farove\u0148 v\u00fd\u0161 +FileChooser.viewMenuButtonAccessibleName = Menu Zobrazit +FileChooser.viewMenuButtonToolTipText = Menu Zobrazit +FileChooser.viewMenuLabel.textAndMnemonic = Zobrazit +FileChooser.newFolderActionLabelText = Nov\u00e1 slo\u017eka +FileChooser.listViewActionLabelText = Seznam +FileChooser.detailsViewActionLabelText = Detaily +FileChooser.refreshActionLabelText = Obnovit +FileChooser.sortMenuLabelText = Se\u0159adit ikony podle +FileChooser.viewMenuLabelText = Zobrazit +FileChooser.fileSizeKiloBytes = {0} KB +FileChooser.fileSizeMegaBytes = {0} MB +FileChooser.fileSizeGigaBytes = {0} GB +FileChooser.folderNameLabelText = N\u00e1zev slo\u017eky: + +error.occured = Do\u0161lo k chyb\u011b : %error% +button.abort = P\u0159eru\u0161it +button.retry = Znovu +button.ignore = Ignorovat + +font.source = Zdrojov\u00e9 p\u00edsmo: + +#after version 1.6.7: + +menu.export = Export +menu.general = Hlavn\u00ed +menu.language = Jazyk + +startup.welcometo = V\u00edtejte v programu +startup.selectopen = Pro za\u010d\u00e1tek klikn\u011bte na otev\u0159\u00edt v horn\u00edm panelu nebo p\u0159et\u00e1hn\u011bte SWF soubor p\u0159\u00edmo do tohoto okna. + +error.font.nocharacter = Vybran\u00e9 zdrojov\u00e9 p\u00edsmo neobsahuje znak "%char%". + +warning.initializers = Statick\u00e9 atributy a konstanty jsou \u010dasto inicializov\u00e1ny pomoc\u00ed inicializ\u00e1tor\u016f.\nPokud to uprav\u00edte zde, obvykle to nesta\u010d\u00ed! + +#after version 1.7.0u1: + +menu.tools.searchMemory = Hledat SWF v pam\u011bti +menu.file.reload = Znovu na\u010d\u00edst +message.confirm.reload = Tato akce zru\u0161\u00ed v\u0161echny neulo\u017een\u00e9 zm\u011bny a znovu na\u010dte SWF soubor.\nChcete pokra\u010dovat? + +dialog.selectbkcolor.title = Vyberte barvu pozad\u00ed pro zobrazen\u00ed SWF +button.selectbkcolor.hint = Vybrat barvu pozad\u00ed + +ColorChooser.okText = OK +ColorChooser.cancelText = Storno +ColorChooser.resetText = Obnovit +ColorChooser.previewText = N\u00e1hled +ColorChooser.swatchesNameText = Vzorn\u00edk +ColorChooser.swatchesRecentText = Ned\u00e1vn\u00e9: +ColorChooser.sampleText = Vzorov\u00fd Text Vzorov\u00fd Text + +#after version 1.7.1: + +preview.play = P\u0159ehr\u00e1t +preview.pause = Pauza +preview.stop = Zastavit + +message.confirm.removemultiple = Opravdu chcete odebrat %count% polo\u017eek\n a v\u0161echny objekty kter\u00e9 na nich z\u00e1vis\u00ed? + +menu.tools.searchCache = Prohledat cache prohl\u00ed\u017ee\u010d\u016f + +#after version 1.7.2u2 + +error.trait.exists = Vlastnost s n\u00e1zvem "%name%" ji\u017e existuje. +button.addtrait = P\u0159idat vlastnost +button.font.embed = Vlo\u017eit... +button.yes.all = Ano v\u0161em +button.no.all = Ne v\u0161em +message.font.add.exists = Znak %char% ji\u017e v tagu p\u00edsma existuje.\nChcete ho nahradit? + +filter.gfx = ScaleForm GFx soubory (*.gfx) +filter.supported = V\u0161echny podporovan\u00e9 typy + +work.canceled = Stornov\u00e1no +work.restoringControlFlow = Obnovuji control flow +menu.advancedsettings.advancedsettings = Pokro\u010dil\u00e1 nastaven\u00ed +menu.recentFiles = Ned\u00e1vno otev\u0159en\u00e9 + +#after version 1.7.4 +work.restoringControlFlow.complete = Control flow obnoven +message.confirm.recentFileNotFound = Soubor nenalezen. Chcete jej odebrat ze seznamu ned\u00e1vno otev\u0159en\u00fdch? +contextmenu.closeSwf = Zav\u0159\u00edt SWF +menu.settings.autoRenameIdentifiers = Automaticky p\u0159ejmenovat identifik\u00e1tory +menu.file.saveasexe = Ulo\u017eit jako Exe... +filter.exe = Spustiteln\u00e9 soubory (*.exe) + +#after version 1.8.0 +font.updateTexts = Aktualizovat texty + +#after version 1.8.0u1 +menu.file.close = Zav\u0159\u00edt +menu.file.closeAll = Zav\u0159\u00edt v\u0161e +menu.tools.otherTools = Dal\u0161\u00ed +menu.tools.otherTools.clearRecentFiles = Vymazat ned\u00e1vno otev\u0159en\u00e9 +fontName.name = N\u00e1zev pro zobrazen\u00ed: +fontName.copyright = Copyright p\u00edsma: +button.preview = N\u00e1hled +button.reset = Reset +errors.info = V logu jsou INFORMACE. Klikn\u011bte pro zobrazen\u00ed. +errors.warning = V logu jsou VAROV\u00c1N\u00cd. Klikn\u011bte pro zobrazen\u00ed. + +decompilationError = Chyba dekompilace + +disassemblingProgress.toString = toString +disassemblingProgress.reading = \u010cten\u00ed +disassemblingProgress.deobfuscating = Deobfuskace + +contextmenu.moveTag = P\u0159esunout tag do + +filter.swc = SWC soubory komponent (*.swc) +filter.zip = ZIP komprimovan\u00e9 soubory (*.zip) +filter.binary = Bin\u00e1rn\u00ed vyhled\u00e1v\u00e1n\u00ed - v\u0161echny soubory (*.*) + +open.error = Chyba +open.error.fileNotFound = Soubor nenalezen +open.error.cannotOpen = Soubor nelze otev\u0159\u00edt + +node.others = ostatn\u00ed + +#after version 1.8.1 +menu.tools.search = Hled\u00e1n\u00ed Textu + +#after version 1.8.1u1 +menu.tools.timeline = \u010casov\u00e1 osa + +dialog.selectcolor.title = Vyberte barvu +button.selectcolor.hint = Kliknut\u00edm vyberete barvu + +#default item name, will be used in following sentences +generictag.array.item = polo\u017eku +generictag.array.insertbeginning = Vlo\u017eit %item% na za\u010d\u00e1tek +generictag.array.insertbefore = Vlo\u017eit %item% p\u0159ed +generictag.array.remove = Odstranit %item% +generictag.array.insertafter = Vlo\u017eit %item% za +generictag.array.insertend = Vlo\u017eit %item% na konec + +#after version 2.0.0 +contextmenu.expandAll = Rozbalit v\u0161e + +filter.sounds = Podporovan\u00e9 zvukov\u00e9 form\u00e1ty (*.wav, *.mp3) +filter.sounds.wav = Wave form\u00e1t (*.wav) +filter.sounds.mp3 = MP3 komprimovan\u00fd form\u00e1t (*.mp3) + +error.sound.invalid = Neplatn\u00fd zvuk. + +button.prev = P\u0159edchoz\u00ed +button.next = Dal\u0161\u00ed + +#after version 2.1.0 +message.action.playerglobal.title = Vy\u017eadov\u00e1na knihovna PlayerGlobal +message.action.playerglobal.needed = Pro p\u0159\u00edmou editaci ActionScriptu 3 je pot\u0159eba knihovna "PlayerGlobal.swc", kterou lze stahnout ze str\u00e1nek Adobe\r\n%adobehomepage%\r\nStiskn\u011bte OK pro p\u0159echod na stahovac\u00ed str\u00e1nku. +message.action.playerglobal.place = St\u00e1hn\u011bte knihovnu nazvanou PlayerGlobal(.swc), a um\u00edst\u011bte j\u00ed do adres\u00e1\u0159e\r\n%libpath%\r\n Stiskn\u011bte OK pro pokra\u010dov\u00e1n\u00ed. + +message.confirm.experimental.function = Tato funkce je EXPERIMENT\u00c1LN\u00cd. To znamen\u00e1, \u017ee byste nem\u011bli v\u011b\u0159it jej\u00edm v\u00fdsledk\u016fm a SWF soubor m\u016f\u017ee po ulo\u017een\u00ed p\u0159estat fungovat. +message.confirm.donotshowagain = P\u0159\u00ed\u0161t\u011b nezobrazovat + +menu.import = Import +menu.file.import.text = Import textu +import.select.directory = Vyberte adres\u00e1\u0159 pro import +error.text.import = Chyba b\u011bhem importu textu. Chcete pokra\u010dovat? + +#after version 2.1.1 +contextmenu.removeWithDependencies = Odstranit se z\u00e1vislostmi + +abc.action.find-usages = Naj\u00edt pou\u017eit\u00ed +abc.action.find-declaration = Naj\u00edt deklaraci + +contextmenu.rawEdit = P\u0159\u00edm\u00e1 editace +contextmenu.jumpToCharacter = Skok na charakter + +menu.settings.dumpView = Zobrazit Dump + +menu.view = Zobrazen\u00ed +menu.file.view.resources = Zdroje +menu.file.view.hex = Hex dump + +node.header = hlavi\u010dka + +header.signature = Signatura: +header.compression = Komprese: +header.compression.lzma = LZMA +header.compression.zlib = ZLIB +header.compression.none = Bez komprese +header.version = Verze SWF: +header.gfx = GFX: +header.filesize = Velikost souboru: +header.framerate = Frekvence sn\u00edmk\u016f: +header.framecount = Po\u010det sn\u00edmk\u016f: +header.displayrect = Zobrazen\u00fd obd\u00e9ln\u00edk: +header.displayrect.value.twips = %xmin%,%ymin% => %xmax%,%ymax% twip\u016f +header.displayrect.value.pixels = %xmin%,%ymin% => %xmax%,%ymax% pixel\u016f + +contextmenu.saveToFile = Ulo\u017eit do souboru +contextmenu.parseActions = Naparsovat akce +contextmenu.parseABC = Naparsovat ABC +contextmenu.parseInstructions = Naparsovat AVM2 instrukce + +menu.deobfuscation = Deobfuskace +menu.file.deobfuscation.old = Star\u00fd zp\u016fsob +menu.file.deobfuscation.new = Nov\u00fd zp\u016fsob + +contextmenu.openswfinside = Otev\u0159\u00edt SWF uvnit\u0159 +binarydata.swfInside = Vypad\u00e1 to, \u017ee uvnit\u0159 v tomto BinaryData tagu se nach\u00e1z\u00ed SWF soubor. Klikn\u011bte zde pro jeho na\u010dten\u00ed jako podstrom. + +#after version 3.0.0 +button.zoomin.hint = P\u0159ibl\u00ed\u017eit +button.zoomout.hint = Odd\u00e1lit +button.zoomfit.hint = Rozt\u00e1hnout +button.zoomnone.hint = M\u011b\u0159\u00edtko 1:1 +button.snapshot.hint = Sn\u00edmek do schr\u00e1nky + +editorTruncateWarning = Text je o\u0159\u00edznut na pozici %chars% v lad\u00edc\u00edm m\u00f3du. + +font.name.intag = N\u00e1zev p\u00edsma v tagu: + +menu.debugger = Debugger +menu.debugger.switch = Debugger +menu.debugger.replacetrace = Nahradit vol\u00e1n\u00ed trace +menu.debugger.showlog = Zobrazit Log + +message.debugger = Tento SWF Debugger slou\u017e\u00ed jen k pos\u00edl\u00e1n\u00ed zpr\u00e1v do okna logu, konzole prohl\u00ed\u017ee\u010de nebo alert oken.\r\nNEN\u00cd ur\u010den pro krokov\u00e1n\u00ed k\u00f3du, breakpointy atd. + +contextmenu.addTag = P\u0159idat tag + +deobfuscation.comment.tryenable = Tip: m\u016f\u017eete zkusit povolit "Automatickou deobfuskaci" v nastaven\u00ed +deobfuscation.comment.failed = Deobfuskace je aktivn\u00ed, ale dekompilace p\u0159esto selhala. Pokud soubor NEN\u00cd obfuskov\u00e1n, zaka\u017ete "Automatickou deobfuskaci" pro lep\u0161\u00ed v\u00fdsledky. + +#after version 4.0.2 +preview.nextframe = Dal\u0161\u00ed sn\u00edmek +preview.prevframe = P\u0159ede\u0161l\u00fd sn\u00edmek +preview.gotoframe = P\u0159ej\u00edt na sn\u00edmek... + +preview.gotoframe.dialog.title = P\u0159ej\u00edt na sn\u00edmek +preview.gotoframe.dialog.message = Zadejte \u010d\u00edslo sn\u00edmku (%min% - %max%) +preview.gotoframe.dialog.frame.error = Neplatn\u00e9 \u010d\u00edslo sn\u00edmku. Mus\u00ed to b\u00fdt \u010d\u00edslo v rozmez\u00ed %min% a %max%. + +error.text.invalid.continue = Neplatn\u00fd text: %text% na \u0159\u00e1dku %line%. Chcete pokra\u010dovat? + +#after version 4.0.5 +contextmenu.copyTag = Zkop\u00edrovat tag do +fit = p\u0159izp\u016fsobit +button.setAdvanceValues = Nastavit hodnoty advance + +menu.tools.replace = Nahrazen\u00ed textu + +message.confirm.close = Existuj\u00ed neulo\u017een\u00e9 zm\u011bny. Opravdu chcete zav\u0159\u00edt {swfName}? +message.confirm.closeAll = Existuj\u00ed neulo\u017een\u00e9 zm\u011bny. Opravdu chcete zav\u0159\u00edt v\u0161echny SWF? + +contextmenu.exportJavaSource = Exportovat zdroj\u00e1k Javy +contextmenu.exportSwfXml = Exportovat SWF jako XML +contextmenu.importSwfXml = Importovat SWF XML + +filter.xml = XML + +#after version 4.1.0 +contextmenu.undo = Zp\u011bt + +text.align.left = Zarovnat vlevo +text.align.right = Zarovnat vpravo +text.align.center = Zarovnat na st\u0159ed +text.align.justify = Zarovnat do bloku + +text.undo = Vr\u00e1tit zm\u011bny + +menu.file.import.xml = Import SWF XML +menu.file.export.xml = Export SWF XML + +#after version 4.1.1 +text.align.translatex.decrease = Sn\u00ed\u017eit TranslateX +text.align.translatex.increase = Zv\u00fd\u0161it TranslateX +selectPreviousTag = Vybrat p\u0159edchoz\u00ed tag +selectNextTag = Vybrat dal\u0161\u00ed tag +button.ignoreAll = Ignorovat V\u0161e +menu.file.import.symbolClass = Import Symbol-Class +text.toggleCase = P\u0159epnout mal\u00e1/velk\u00e1 + +#after version 5.0.2 +preview.loop = Opakovat +menu.file.import.script = Importovat skript +contextmenu.copyTagWithDependencies = Kop\u00edrovat tagy se z\u00e1vislostmi do +button.replaceWithTag = Nahradit jin\u00fdm charakterov\u00fdm tagem +button.resolveConstants = Resolvovat konstanty + +#after version 5.1.0 +button.viewConstants = Zobrazit konstanty +work.exported = Exportov\u00e1no +button.replaceAlphaChannel = Nahradit alfa kan\u00e1l... + +tagInfo.header.name = N\u00e1zev +tagInfo.header.value = Hodnota +tagInfo.tagType = Typ tagu +tagInfo.characterId = Id charakteru +tagInfo.offset = Offset +tagInfo.length = D\u00e9lka +tagInfo.bounds = Meze +tagInfo.width = \u0160\u00ed\u0159ka +tagInfo.height = V\u00fd\u0161ka +tagInfo.neededCharacters = Pot\u0159ebn\u00e9 charaktery + +button.viewhexpcode = Zobrazit Hex s instrukcemi +taginfo.header = Z\u00e1kladn\u00ed informace o tagu + +tagInfo.dependentCharacters = Z\u00e1visl\u00e9 charaktery + +#after version 5.3.0 +header.uncompressed = Bez komprese +header.warning.unsupportedGfxCompression = GFX podporuje pouze soubor se Zlib nebo \u017e\u00e1dnou kompres\u00ed. +header.warning.minimumZlibVersion = Zlib komprese vy\u017eaduje SWF verze 6 \u010di vy\u0161\u0161\u00ed. +header.warning.minimumLzmaVersion = LZMA komprese vy\u017eaduje SWF verze 13 \u010di vy\u0161\u0161\u00ed. + +tagInfo.codecName = N\u00e1zev kodeku +tagInfo.exportFormat = Form\u00e1t exportu +tagInfo.samplingRate = Vzorkovac\u00ed frekvence +tagInfo.stereo = Stereo +tagInfo.sampleCount = Po\u010det vzork\u016f + +filter.dmg = Spustieln\u00e9 soubory Macu (*.dmg) +filter.linuxExe = Linuxov\u00e9 spustiteln\u00e9 soubory + +import.script.result = %count% skript\u016f importov\u00e1no. +import.script.as12warning = Import skript\u016f funguje jen pro AS1/2 skripty. + +error.constantPoolTooBig = Seznam konstant je moc velk\u00fd index=%index%, velikost=%size% +error.image.alpha.invalid = Neplatn\u00e1 data alpha kan\u00e1lu. + +#after version 6.0.2 +contextmenu.saveUncompressedToFile = Ulo\u017eit nekomprimovan\u011b +abc.traitslist.scriptinitializer = inicializ\u00e1tor skriptu +menu.settings.autoOpenLoadedSWFs = Otev\u00edrat na\u010d\u00edtan\u00e1 SWF b\u011bhem p\u0159ehr\u00e1v\u00e1n\u00ed + +#after version 6.1.1 +menu.file.start = Start +menu.file.start.run = Spustit +menu.file.start.stop = Zastavit +menu.file.start.debug = Ladit +menu.debugging = Lad\u011bn\u00ed +menu.debugging.debug = Lad\u011bn\u00ed +menu.debugging.debug.stop = Ukon\u010dit +menu.debugging.debug.pause = Pauza +menu.debugging.debug.stepOver = Step over +menu.debugging.debug.stepInto = Step into +menu.debugging.debug.stepOut = Step out +menu.debugging.debug.continue = Pokra\u010dovat +menu.debugging.debug.stack = Stack... +menu.debugging.debug.watch = New watch... + +message.playerpath.notset = Flash Player projector nenalezen. Pros\u00edm nastavte cestu k n\u011bmu v Pokro\u010dil\u00e1 nastaven\u00ed / Cesty (1). +message.playerpath.debug.notset = Flash Player projector content debugger nenalezen. Pros\u00edm nastavte cestu k n\u011bmu v Pokro\u010dil\u00e1 nastaven\u00ed / Cesty (2). +message.playerpath.lib.notset = PlayerGlobal (.SWC) nenalezen. Pros\u00edm nastavte cestu k n\u011bmu v Pokro\u010dil\u00e1 nastaven\u00ed / Cesty (3). + +debugpanel.header = Lad\u011bn\u00ed + +variables.header.registers = Registry +variables.header.locals = Lok\u00e1ln\u00ed +variables.header.arguments = Argumenty +variables.header.scopeChain = Scope chain +variables.column.name = N\u00e1zev +variables.column.type = Typ +variables.column.value = Hodnota + +callStack.header = Call stack +callStack.header.file = Soubor +callStack.header.line = \u0158\u00e1dek + +stack.header = Stack +stack.header.item = Polo\u017eka + +work.running = B\u011bh +work.debugging = Lad\u011bn\u00ed +work.debugging.instrumenting = P\u0159\u00edprava SWF pro lad\u011bn\u00ed +work.breakat = Pozastaveno na \u0020 +work.halted = Lad\u011bn\u00ed za\u010dalo, b\u011bh je nyn\u00ed pozastaven. P\u0159idejte breakpointy a klikn\u011bte na Pokra\u010dovat (F5) pro obnoven\u00ed b\u011bhu. + +debuglog.header = Z\u00e1znam +debuglog.button.clear = Vypr\u00e1znit + +#after 7.0.1 +work.debugging.wait = \u010cek\u00e1 se na p\u0159ipojen\u00ed Flash debug projektoru + +error.debug.listen = Nelze naslouchat na portu %port%. Mo\u017en\u00e1 je spu\u0161t\u011bn n\u011bjak\u00fd jin\u00fd debugger. + +debug.break.reason.unknown = (Nezn\u00e1m\u00fd d\u016fvod) +debug.break.reason.breakpoint = (Breakpoint) +debug.break.reason.watch = (Watch) +debug.break.reason.fault = (Selh\u00e1n\u00ed) +debug.break.reason.stopRequest = (Zastaveno) +debug.break.reason.step = (Step) +debug.break.reason.halt = (Halt) +debug.break.reason.scriptLoaded = (Skript na\u010dten) + +menu.file.start.debugpcode = Lad\u011bn\u00ed P-k\u00f3du + +#after 7.1.2 +button.replaceNoFill = Nahradit - aktualizovat hranice... +message.warning.svgImportExperimental = Ne v\u0161echny SVG vlastnosti jsou podporov\u00e1ny. Pros\u00edm zkontrolujte log po importu. + +message.imported.swf = SWF soubor pou\u017e\u00edv\u00e1 assety z importovan\u00e9ho SWF souboru:\n%url%\nChcete tyto assety na\u010d\u00edst z dan\u00e9ho URL? +message.imported.swf.manually = Nelze na\u010d\u00edst importovan\u00e9 SWF\n%url%\nSoubor nebo URL neexistuje.\nChcete vybrat m\u00edstn\u00ed soubor? + +message.warning.hexViewNotUpToDate = Hexa pohled nen\u00ed aktu\u00e1ln\u00ed. Pros\u00edm ulo\u017ete a znovuna\u010dt\u011bte soubor pro aktualizaci hexa pohledu. +message.font.replace.updateTexts = N\u011bkter\u00e9 znaky byly nahrazeny. Chcete aktualizovat existuj\u00edc\u00ed texty? + +menu.settings.simplifyExpressions = Zjednodu\u0161it v\u00fdrazy + +#after 8.0.1 +menu.recentFiles.empty = Seznam ned\u00e1vno otev\u0159en\u00fdch je pr\u00e1zdn\u00fd +message.warning.outOfMemory32BitJre = Nastala chyba z nedostatku pam\u011bti. M\u00e1te spu\u0161t\u011bnou 32bitovou Javu na 64bitov\u00e9m syst\u00e9mu. Pros\u00edm pou\u017eijte 64bitovou Java. + +menu.file.reloadAll = Znovu na\u010d\u00edst v\u0161e +message.confirm.reloadAll = Tato akce stornuje v\u0161echny neulo\u017een\u00e9 zm\u011bny ve v\u0161ech SWF souborech a znovu na\u010dte celou aplikaci.\nChcete pokra\u010dovat? +export.script.singleFilePallelModeWarning = Export skript\u016f do jednoho souboru nen\u00ed dostupn\u00fd se zapnut\u00fdm paralleln\u00edm zrychlen\u00edm + +button.showOriginalBytesInPcodeHex = Zobrazit origin\u00e1ln\u00ed bajty +button.remove = Odstranit +button.showFileOffsetInPcodeHex = Zobrazit offset v souboru + +generic.editor.amf3.title = AMF3 editor +generic.editor.amf3.help = Syntaxe AMF3 hodnoty:\n\ + ------------------\n\ + skal\u00e1rn\u00ed typy:\n\ + %scalar_samples%\ + ostatn\u00ed typy:\n\ + %nonscalar_samples%\ + \n\ + Pozn\u00e1mky:\n\ + \ * Neskal\u00e1rn\u00ed datov\u00e9 typy mohou mohou b\u00fdt odkazov\u00e1ny p\u0159edem deklarovan\u00fdmi "id" atributy s pomoc\u00ed # syntaxe:\n\ + %reference_sample%\n\ + \ * Kl\u00ed\u010de v z\u00e1znamech Dictionary mohou b\u00fdt jak\u00e9hokoli typu\n +contextmenu.showInResources = Zobrazit ve Zdroj\u00edch +message.flexpath.notset = Flex SDK nenalezeno. Pros\u00edm nastavte cestu k n\u011bmu v Pokro\u010dil\u00e1 nastaven\u00ed / Cesty (4). + + +#add after panel.disassembled string +abc.detail.split = :\u0020 +abc.detail.trait = Vlastnost - %trait_type% +abc.detail.trait.method = Metoda +abc.detail.trait.getter = Getter +abc.detail.trait.setter = Setter +abc.detail.trait.slot = Slot +abc.detail.trait.const = Konstanta +abc.detail.trait.class = T\u0159\u00edda +abc.detail.trait.function = Funkce + +abc.detail.specialmethod = Speci\u00e1ln\u00ed metoda - %specialmethod_type% +abc.detail.specialmethod.scriptinitializer = Inicializ\u00e1tor skriptu +abc.detail.specialmethod.classinitializer = Inicializ\u00e1tor t\u0159\u00eddy +abc.detail.specialmethod.instanceinitializer = Inicializ\u00e1tor instance +abc.detail.innerfunction = Vnit\u0159n\u00ed funkce + +button.edit.script.decompiled = Upravit ActionScript +button.edit.script.disassembled = Upravit P-k\u00f3d + +message.font.setadvancevalues = Tato operace nastav\u00ed advance V\u0160ECH znak\u016f v tomto tagu na advance hodnoty zdrojov\u00e9ho p\u00edsma. + +filter.iggy = Iggy soubory (*.iggy) \ No newline at end of file diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java index 7aee0f9d5..a7d675e23 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java @@ -1,686 +1,689 @@ -/* - * Copyright (C) 2010-2016 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.tagtree; - -import com.jpexs.decompiler.flash.SWC; -import com.jpexs.decompiler.flash.SWF; -import com.jpexs.decompiler.flash.ZippedSWFBundle; -import com.jpexs.decompiler.flash.abc.ScriptPack; -import com.jpexs.decompiler.flash.gui.MainPanel; -import com.jpexs.decompiler.flash.gui.TreeNodeType; -import com.jpexs.decompiler.flash.gui.View; -import com.jpexs.decompiler.flash.tags.CSMTextSettingsTag; -import com.jpexs.decompiler.flash.tags.DebugIDTag; -import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag; -import com.jpexs.decompiler.flash.tags.DefineBitsJPEG2Tag; -import com.jpexs.decompiler.flash.tags.DefineBitsJPEG3Tag; -import com.jpexs.decompiler.flash.tags.DefineBitsJPEG4Tag; -import com.jpexs.decompiler.flash.tags.DefineBitsLossless2Tag; -import com.jpexs.decompiler.flash.tags.DefineBitsLosslessTag; -import com.jpexs.decompiler.flash.tags.DefineBitsTag; -import com.jpexs.decompiler.flash.tags.DefineButton2Tag; -import com.jpexs.decompiler.flash.tags.DefineButtonCxformTag; -import com.jpexs.decompiler.flash.tags.DefineButtonSoundTag; -import com.jpexs.decompiler.flash.tags.DefineButtonTag; -import com.jpexs.decompiler.flash.tags.DefineEditTextTag; -import com.jpexs.decompiler.flash.tags.DefineFont2Tag; -import com.jpexs.decompiler.flash.tags.DefineFont3Tag; -import com.jpexs.decompiler.flash.tags.DefineFont4Tag; -import com.jpexs.decompiler.flash.tags.DefineFontAlignZonesTag; -import com.jpexs.decompiler.flash.tags.DefineFontInfo2Tag; -import com.jpexs.decompiler.flash.tags.DefineFontInfoTag; -import com.jpexs.decompiler.flash.tags.DefineFontNameTag; -import com.jpexs.decompiler.flash.tags.DefineFontTag; -import com.jpexs.decompiler.flash.tags.DefineMorphShape2Tag; -import com.jpexs.decompiler.flash.tags.DefineMorphShapeTag; -import com.jpexs.decompiler.flash.tags.DefineScalingGridTag; -import com.jpexs.decompiler.flash.tags.DefineSceneAndFrameLabelDataTag; -import com.jpexs.decompiler.flash.tags.DefineShape2Tag; -import com.jpexs.decompiler.flash.tags.DefineShape3Tag; -import com.jpexs.decompiler.flash.tags.DefineShape4Tag; -import com.jpexs.decompiler.flash.tags.DefineShapeTag; -import com.jpexs.decompiler.flash.tags.DefineSoundTag; -import com.jpexs.decompiler.flash.tags.DefineSpriteTag; -import com.jpexs.decompiler.flash.tags.DefineText2Tag; -import com.jpexs.decompiler.flash.tags.DefineTextTag; -import com.jpexs.decompiler.flash.tags.DefineVideoStreamTag; -import com.jpexs.decompiler.flash.tags.DoABC2Tag; -import com.jpexs.decompiler.flash.tags.DoABCTag; -import com.jpexs.decompiler.flash.tags.DoActionTag; -import com.jpexs.decompiler.flash.tags.DoInitActionTag; -import com.jpexs.decompiler.flash.tags.EnableDebugger2Tag; -import com.jpexs.decompiler.flash.tags.EnableDebuggerTag; -import com.jpexs.decompiler.flash.tags.EnableTelemetryTag; -import com.jpexs.decompiler.flash.tags.ExportAssetsTag; -import com.jpexs.decompiler.flash.tags.FileAttributesTag; -import com.jpexs.decompiler.flash.tags.FrameLabelTag; -import com.jpexs.decompiler.flash.tags.ImportAssets2Tag; -import com.jpexs.decompiler.flash.tags.ImportAssetsTag; -import com.jpexs.decompiler.flash.tags.JPEGTablesTag; -import com.jpexs.decompiler.flash.tags.MetadataTag; -import com.jpexs.decompiler.flash.tags.PlaceObject2Tag; -import com.jpexs.decompiler.flash.tags.PlaceObject3Tag; -import com.jpexs.decompiler.flash.tags.PlaceObject4Tag; -import com.jpexs.decompiler.flash.tags.PlaceObjectTag; -import com.jpexs.decompiler.flash.tags.ProductInfoTag; -import com.jpexs.decompiler.flash.tags.ProtectTag; -import com.jpexs.decompiler.flash.tags.RemoveObject2Tag; -import com.jpexs.decompiler.flash.tags.RemoveObjectTag; -import com.jpexs.decompiler.flash.tags.ScriptLimitsTag; -import com.jpexs.decompiler.flash.tags.SetBackgroundColorTag; -import com.jpexs.decompiler.flash.tags.SetTabIndexTag; -import com.jpexs.decompiler.flash.tags.ShowFrameTag; -import com.jpexs.decompiler.flash.tags.SoundStreamBlockTag; -import com.jpexs.decompiler.flash.tags.SoundStreamHead2Tag; -import com.jpexs.decompiler.flash.tags.SoundStreamHeadTag; -import com.jpexs.decompiler.flash.tags.StartSound2Tag; -import com.jpexs.decompiler.flash.tags.StartSoundTag; -import com.jpexs.decompiler.flash.tags.SymbolClassTag; -import com.jpexs.decompiler.flash.tags.Tag; -import com.jpexs.decompiler.flash.tags.VideoFrameTag; -import com.jpexs.decompiler.flash.tags.base.ASMSource; -import com.jpexs.decompiler.flash.tags.base.ButtonTag; -import com.jpexs.decompiler.flash.tags.base.FontTag; -import com.jpexs.decompiler.flash.tags.base.ImageTag; -import com.jpexs.decompiler.flash.tags.base.MorphShapeTag; -import com.jpexs.decompiler.flash.tags.base.PlaceObjectTypeTag; -import com.jpexs.decompiler.flash.tags.base.RemoveTag; -import com.jpexs.decompiler.flash.tags.base.ShapeTag; -import com.jpexs.decompiler.flash.tags.base.SymbolClassTypeTag; -import com.jpexs.decompiler.flash.tags.base.TextTag; -import com.jpexs.decompiler.flash.tags.gfx.DefineCompactedFont; -import com.jpexs.decompiler.flash.timeline.AS2Package; -import com.jpexs.decompiler.flash.timeline.AS3Package; -import com.jpexs.decompiler.flash.timeline.Frame; -import com.jpexs.decompiler.flash.timeline.FrameScript; -import com.jpexs.decompiler.flash.timeline.TagScript; -import com.jpexs.decompiler.flash.treeitems.AS3ClassTreeItem; -import com.jpexs.decompiler.flash.treeitems.FolderItem; -import com.jpexs.decompiler.flash.treeitems.HeaderItem; -import com.jpexs.decompiler.flash.treeitems.SWFList; -import com.jpexs.decompiler.flash.treeitems.TreeItem; -import java.awt.Color; -import java.awt.Component; -import java.awt.Font; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import javax.swing.Icon; -import javax.swing.JTree; -import javax.swing.plaf.basic.BasicLabelUI; -import javax.swing.plaf.basic.BasicTreeUI; -import javax.swing.tree.DefaultTreeCellRenderer; -import javax.swing.tree.TreePath; -import javax.swing.tree.TreeSelectionModel; - -/** - * - * @author JPEXS - */ -public class TagTree extends JTree { - - public TagTreeContextMenu contextPopupMenu; - - private final MainPanel mainPanel; - - private static final Map ICONS; - - static { - ICONS = new HashMap<>(); - for (TreeNodeType treeNodeType : TreeNodeType.values()) { - if (treeNodeType != TreeNodeType.UNKNOWN && treeNodeType != TreeNodeType.SHOW_FRAME) { - String tagTypeStr = treeNodeType.toString().toLowerCase().replace("_", ""); - ICONS.put(treeNodeType, View.getIcon(tagTypeStr + "16")); - } - } - } - - public static Icon getIconForType(TreeNodeType t) { - return ICONS.get(t); - } - - public static class TagTreeCellRenderer extends DefaultTreeCellRenderer { - - private Font plainFont; - - private Font boldFont; - - public TagTreeCellRenderer() { - setUI(new BasicLabelUI()); - setOpaque(false); - //setBackground(Color.green); - setBackgroundNonSelectionColor(Color.white); - //setBackgroundSelectionColor(Color.ORANGE); - - } - - @Override - public Component getTreeCellRendererComponent( - JTree tree, - Object value, - boolean sel, - boolean expanded, - boolean leaf, - int row, - boolean hasFocus) { - - TreeItem val = (TreeItem) value; - if (val != null && !(val instanceof SWFList) && val.getSwf() == null) { - // SWF was closed - value = null; - } - - super.getTreeCellRendererComponent( - tree, value, sel, - expanded, leaf, row, - hasFocus); - - if (val == null) { - return this; - } - - TreeNodeType type = getTreeNodeType(val); - - if (type == TreeNodeType.FOLDER && expanded) { - type = TreeNodeType.FOLDER_OPEN; - } - - if ((type == TreeNodeType.FOLDER || type == TreeNodeType.FOLDER_OPEN) && val instanceof FolderItem) { - FolderItem si = (FolderItem) val; - if (!TagTreeRoot.FOLDER_ROOT.equals(si.getName())) { - String itemName = "folder" + si.getName(); - setIcon(View.getIcon(itemName.toLowerCase() + "16")); - } - } else { - setIcon(ICONS.get(type)); - } - - /* boolean isModified = val instanceof Tag && ((Tag) val).isModified(); - if(val instanceof ScriptPack){ - ScriptPack sp=(ScriptPack)val; - if(sp.abc.script_info.get(sp.scriptIndex).isModified()){ - isModified = true; - } - }*/ - boolean isReadOnly = false; - if (val instanceof Tag) { - isReadOnly = ((Tag) val).isReadOnly(); - } - - boolean isModified = val.isModified(); - if (isModified) { - if (boldFont == null) { - Font font = getFont(); - boldFont = font.deriveFont(Font.BOLD); - } - } else if (plainFont == null) { - Font font = getFont(); - plainFont = font.deriveFont(Font.PLAIN); - } - setFont(isModified ? boldFont : plainFont); - if (isReadOnly) { - setForeground(new Color(0xcc, 0xcc, 0xcc)); - } else { - setForeground(Color.BLACK); - } - - return this; - } - } - - public TagTree(TagTreeModel treeModel, MainPanel mainPanel) { - super(treeModel); - this.mainPanel = mainPanel; - setCellRenderer(new TagTreeCellRenderer()); - setRootVisible(false); - setBackground(Color.white); - setRowHeight(Math.max(getFont().getSize() + 5, 16)); - setLargeModel(true); - setUI(new BasicTreeUI() { - { - setHashColor(Color.gray); - } - }); - } - - public void createContextMenu() { - contextPopupMenu = new TagTreeContextMenu(this, mainPanel); - } - - public static TreeNodeType getTreeNodeType(TreeItem t) { - - if (t instanceof TagScript) { - t = ((TagScript) t).getTag(); - } - - if (t instanceof HeaderItem) { - return TreeNodeType.HEADER; - } - - if ((t instanceof DefineFontTag) - || (t instanceof DefineFont2Tag) - || (t instanceof DefineFont3Tag) - || (t instanceof DefineFont4Tag) - || (t instanceof DefineCompactedFont)) { - return TreeNodeType.FONT; - } - - // DefineText, DefineText2, DefineEditTextTag - if (t instanceof TextTag) { - return TreeNodeType.TEXT; - } - - // DefineBits, DefineBitsJPEG2, DefineBitsJPEG3, DefineBitsJPEG4, DefineBitsLossless, DefineBitsLossless2 - if (t instanceof ImageTag) { - return TreeNodeType.IMAGE; - } - - // DefineShape, DefineShape2, DefineShape3, DefineShape4 - if (t instanceof ShapeTag) { - return TreeNodeType.SHAPE; - } - - // DefineMorphShape, DefineMorphShape2 - if (t instanceof MorphShapeTag) { - return TreeNodeType.MORPH_SHAPE; - } - - if (t instanceof DefineSpriteTag) { - return TreeNodeType.SPRITE; - } - - // DefineButton, DefineButton2 - if (t instanceof ButtonTag) { - return TreeNodeType.BUTTON; - } - - if (t instanceof DefineVideoStreamTag) { - return TreeNodeType.MOVIE; - } - - if ((t instanceof DefineSoundTag) || (t instanceof SoundStreamHeadTag) || (t instanceof SoundStreamHead2Tag)) { - return TreeNodeType.SOUND; - } - - if (t instanceof DefineBinaryDataTag) { - return TreeNodeType.BINARY_DATA; - } - - if (t instanceof ASMSource) { - return TreeNodeType.AS; - } - - if (t instanceof ScriptPack) { - return TreeNodeType.AS; - } - - if (t instanceof AS2Package) { - return TreeNodeType.PACKAGE; - } - - if (t instanceof AS3Package) { - return TreeNodeType.PACKAGE; - } - - if ((t instanceof Frame) - || (t instanceof FrameScript)) { - return TreeNodeType.FRAME; - } - - if (t instanceof ShowFrameTag) { - return TreeNodeType.SHOW_FRAME; - } - - if (t instanceof SWF) { - return TreeNodeType.FLASH; - } - - if (t instanceof SWFList) { - SWFList slist = (SWFList) t; - if (slist.isBundle()) { - if (slist.bundle.getClass() == ZippedSWFBundle.class) { - return TreeNodeType.BUNDLE_ZIP; - } else if (slist.bundle.getClass() == SWC.class) { - return TreeNodeType.BUNDLE_SWC; - } else { - return TreeNodeType.BUNDLE_BINARY; - } - } - } - - if (t instanceof SetBackgroundColorTag) { - return TreeNodeType.SET_BACKGROUNDCOLOR; - } - if (t instanceof FileAttributesTag) { - return TreeNodeType.FILE_ATTRIBUTES; - } - if (t instanceof MetadataTag) { - return TreeNodeType.METADATA; - } - if (t instanceof PlaceObjectTypeTag) { - return TreeNodeType.PLACE_OBJECT; - } - if (t instanceof RemoveTag) { - return TreeNodeType.REMOVE_OBJECT; - } - if (t instanceof Tag) { - return TreeNodeType.OTHER_TAG; - } - - if (t instanceof FolderItem) { - return TreeNodeType.FOLDER; - } - - return TreeNodeType.FOLDER; - } - - public List getSwfFolderItemNestedTagIds(String folderName, boolean gfx) { - List ret = null; - switch (folderName) { - case TagTreeModel.FOLDER_SHAPES: - ret = Arrays.asList(DefineShapeTag.ID, DefineShape2Tag.ID, DefineShape3Tag.ID, DefineShape4Tag.ID); - break; - case TagTreeModel.FOLDER_MORPHSHAPES: - ret = Arrays.asList(DefineMorphShapeTag.ID, DefineMorphShape2Tag.ID); - break; - case TagTreeModel.FOLDER_SPRITES: - ret = Arrays.asList(DefineSpriteTag.ID); - break; - case TagTreeModel.FOLDER_TEXTS: - ret = Arrays.asList(DefineTextTag.ID, DefineText2Tag.ID, DefineEditTextTag.ID); - break; - case TagTreeModel.FOLDER_IMAGES: - ret = Arrays.asList(DefineBitsTag.ID, DefineBitsJPEG2Tag.ID, DefineBitsJPEG3Tag.ID, DefineBitsJPEG4Tag.ID, DefineBitsLosslessTag.ID, DefineBitsLossless2Tag.ID); - break; - case TagTreeModel.FOLDER_MOVIES: - ret = Arrays.asList(DefineVideoStreamTag.ID); - break; - case TagTreeModel.FOLDER_SOUNDS: - ret = Arrays.asList(DefineSoundTag.ID); - break; - case TagTreeModel.FOLDER_BUTTONS: - ret = Arrays.asList(DefineButtonTag.ID, DefineButton2Tag.ID); - break; - case TagTreeModel.FOLDER_FONTS: - if (gfx) { - ret = Arrays.asList(DefineFontTag.ID, DefineFont2Tag.ID, DefineFont3Tag.ID, DefineFont4Tag.ID, DefineCompactedFont.ID); - } else { - ret = Arrays.asList(DefineFontTag.ID, DefineFont2Tag.ID, DefineFont3Tag.ID, DefineFont4Tag.ID); - } - break; - case TagTreeModel.FOLDER_BINARY_DATA: - ret = Arrays.asList(DefineBinaryDataTag.ID); - break; - case TagTreeModel.FOLDER_FRAMES: - // same as nested tags of DefineSpriteTag? - ret = Arrays.asList(PlaceObjectTag.ID, PlaceObject2Tag.ID, PlaceObject3Tag.ID, PlaceObject4Tag.ID, - RemoveObjectTag.ID, RemoveObject2Tag.ID, ShowFrameTag.ID, FrameLabelTag.ID, - StartSoundTag.ID, StartSound2Tag.ID, VideoFrameTag.ID, - SoundStreamBlockTag.ID, SoundStreamHeadTag.ID, SoundStreamHead2Tag.ID, - DefineScalingGridTag.ID); - break; - case TagTreeModel.FOLDER_OTHERS: - ret = Arrays.asList( - //CSMTextSettingsTag.ID, - DebugIDTag.ID, - //DefineButtonCxformTag.ID, DefineButtonSoundTag.ID, - //DefineFontAlignZonesTag.ID, DefineFontInfoTag.ID, DefineFontInfo2Tag.ID, DefineFontNameTag.ID, - /*DefineScalingGridTag.ID,*/ DefineSceneAndFrameLabelDataTag.ID, - DoABC2Tag.ID, DoABCTag.ID, DoActionTag.ID, DoInitActionTag.ID, - EnableDebuggerTag.ID, EnableDebugger2Tag.ID, EnableTelemetryTag.ID, - ExportAssetsTag.ID, FileAttributesTag.ID, ImportAssetsTag.ID, ImportAssets2Tag.ID, - JPEGTablesTag.ID, MetadataTag.ID, ProductInfoTag.ID, ProtectTag.ID, ScriptLimitsTag.ID, - SetBackgroundColorTag.ID, SetTabIndexTag.ID, SymbolClassTag.ID); - break; - } - - return ret; - } - - public List getFrameNestedTagIds() { - return Arrays.asList(PlaceObjectTag.ID, PlaceObject2Tag.ID, PlaceObject3Tag.ID, PlaceObject4Tag.ID, - RemoveObjectTag.ID, RemoveObject2Tag.ID, FrameLabelTag.ID, - StartSoundTag.ID, StartSound2Tag.ID, VideoFrameTag.ID, - SoundStreamBlockTag.ID, SoundStreamHeadTag.ID, SoundStreamHead2Tag.ID); - } - - public List getNestedTagIds(Tag obj) { - if (obj instanceof DefineSpriteTag) { - return Arrays.asList(PlaceObjectTag.ID, PlaceObject2Tag.ID, PlaceObject3Tag.ID, PlaceObject4Tag.ID, - RemoveObjectTag.ID, RemoveObject2Tag.ID, ShowFrameTag.ID, FrameLabelTag.ID, - StartSoundTag.ID, StartSound2Tag.ID, VideoFrameTag.ID, - SoundStreamBlockTag.ID, SoundStreamHeadTag.ID, SoundStreamHead2Tag.ID, - DefineScalingGridTag.ID); - } - if (obj instanceof FontTag) { - return Arrays.asList(DefineFontNameTag.ID, DefineFontAlignZonesTag.ID, DefineFontInfoTag.ID, DefineFontInfo2Tag.ID); - } - if (obj instanceof TextTag) { - return Arrays.asList(CSMTextSettingsTag.ID); - } - if (obj instanceof DefineButtonTag) { - return Arrays.asList(DefineButtonCxformTag.ID, DefineButtonSoundTag.ID, DefineScalingGridTag.ID); - } - if (obj instanceof DefineButton2Tag) { - return Arrays.asList(DefineButtonSoundTag.ID, DefineScalingGridTag.ID); - } - return null; - } - - public boolean hasExportableNodes() { - return !getSelection(mainPanel.getCurrentSwf()).isEmpty(); - } - - public void getAllSubs(TreeItem o, List ret) { - TagTreeModel tm = getModel(); - for (TreeItem c : tm.getAllChildren(o)) { - ret.add(c); - getAllSubs(c, ret); - } - } - - public List getAllSelected() { - TreeSelectionModel tsm = getSelectionModel(); - TreePath[] tps = tsm.getSelectionPaths(); - List ret = new ArrayList<>(); - if (tps == null) { - return ret; - } - - for (TreePath tp : tps) { - TreeItem treeNode = (TreeItem) tp.getLastPathComponent(); - ret.add(treeNode); - getAllSubs(treeNode, ret); - } - return ret; - } - - public List getSelected() { - if (!mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { - return new ArrayList<>(mainPanel.folderPreviewPanel.selectedItems.values()); - } - TreeSelectionModel tsm = getSelectionModel(); - TreePath[] tps = tsm.getSelectionPaths(); - List ret = new ArrayList<>(); - if (tps == null) { - return ret; - } - - for (TreePath tp : tps) { - TreeItem treeNode = (TreeItem) tp.getLastPathComponent(); - ret.add(treeNode); - } - return ret; - } - - public List getSelection(SWF swf) { - List sel; - if (mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { - sel = getAllSelected(); - } else { - sel = new ArrayList<>(mainPanel.folderPreviewPanel.selectedItems.values()); - } - return getSelection(swf, sel); - } - - public List getSelection(SWF swf, List sel) { - List ret = new ArrayList<>(); - for (TreeItem d : sel) { - if (d instanceof SWFList) { - continue; - } - if (d.getSwf() != swf) { - continue; - } - - if (d instanceof TagScript) { - Tag tag = ((TagScript) d).getTag(); - if (tag instanceof DoActionTag || tag instanceof DoInitActionTag) { - d = tag; - } - } - - if (d instanceof Tag || d instanceof ASMSource) { - TreeNodeType nodeType = TagTree.getTreeNodeType(d); - if (nodeType == TreeNodeType.IMAGE) { - ret.add(d); - } - if (nodeType == TreeNodeType.SHAPE) { - ret.add(d); - } - if (nodeType == TreeNodeType.MORPH_SHAPE) { - ret.add(d); - } - if (nodeType == TreeNodeType.BUTTON) { - ret.add(d); - } - if (nodeType == TreeNodeType.AS) { - ret.add(d); - } - if (nodeType == TreeNodeType.MOVIE) { - ret.add(d); - } - if (nodeType == TreeNodeType.SOUND) { - ret.add(d); - } - if (nodeType == TreeNodeType.BINARY_DATA) { - ret.add(d); - } - if (nodeType == TreeNodeType.TEXT) { - ret.add(d); - } - if (nodeType == TreeNodeType.FONT) { - ret.add(d); - } - if (nodeType == TreeNodeType.OTHER_TAG) { - if (d instanceof SymbolClassTypeTag) { - ret.add(d); - } - } - } - - if (d instanceof Frame) { - ret.add(d); - } - if (d instanceof ScriptPack) { - ret.add(d); - } - } - return ret; - } - - public List getTagsWithType(List list, TreeNodeType type) { - List ret = new ArrayList<>(); - for (AS3ClassTreeItem item : list) { - TreeNodeType ttype = getTreeNodeType(item); - if (type == ttype) { - ret.add(item); - } - } - return ret; - } - - public TreeItem getCurrentTreeItem() { - if (!mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { - return mainPanel.folderPreviewPanel.selectedItems.entrySet().iterator().next().getValue(); - } - - TreeItem item = (TreeItem) getLastSelectedPathComponent(); - return item; - } - - public void updateSwfs(SWF[] swfs) { - TagTreeModel ttm = getModel(); - if (ttm != null) { - List> expandedNodes = View.getExpandedNodes(this); - ttm.updateSwf(null); // todo: honfika: update only the changed swfs, but there was an exception when i tried it - View.expandTreeNodes(this, expandedNodes); - } - } - - @Override - public TagTreeModel getModel() { - return (TagTreeModel) super.getModel(); - } - - public void expandRoot() { - TagTreeModel ttm = getModel(); - TreeItem root = ttm.getRoot(); - expandPath(new TreePath(new Object[]{root})); - } - - public void expandFirstLevelNodes() { - TagTreeModel ttm = getModel(); - TreeItem root = ttm.getRoot(); - int childCount = ttm.getChildCount(root); - for (int i = 0; i < childCount; i++) { - expandPath(new TreePath(new Object[]{root, ttm.getChild(root, i)})); - } - } - - public String getSelectionPathString() { - StringBuilder sb = new StringBuilder(); - TreePath path = getSelectionPath(); - if (path != null) { - boolean first = true; - for (Object p : path.getPath()) { - if (!first) { - sb.append("|"); - } - - first = false; - sb.append(p.toString()); - } - } - - return sb.toString(); - } - - public void setSelectionPathString(String pathStr) { - if (pathStr != null && pathStr.length() > 0) { - String[] path = pathStr.split("\\|"); - - TreePath tp = View.getTreePathByPathStrings(this, Arrays.asList(path)); - if (tp != null) { - // the current view is the Resources view, otherwise tp is null - mainPanel.setTagTreeSelectedNode((TreeItem) tp.getLastPathComponent()); - } - } - } -} +/* + * Copyright (C) 2010-2016 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.tagtree; + +import com.jpexs.decompiler.flash.SWC; +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.ZippedSWFBundle; +import com.jpexs.decompiler.flash.abc.ScriptPack; +import com.jpexs.decompiler.flash.gui.MainPanel; +import com.jpexs.decompiler.flash.gui.TreeNodeType; +import com.jpexs.decompiler.flash.gui.View; +import com.jpexs.decompiler.flash.iggy.conversion.IggySwfBundle; +import com.jpexs.decompiler.flash.tags.CSMTextSettingsTag; +import com.jpexs.decompiler.flash.tags.DebugIDTag; +import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag; +import com.jpexs.decompiler.flash.tags.DefineBitsJPEG2Tag; +import com.jpexs.decompiler.flash.tags.DefineBitsJPEG3Tag; +import com.jpexs.decompiler.flash.tags.DefineBitsJPEG4Tag; +import com.jpexs.decompiler.flash.tags.DefineBitsLossless2Tag; +import com.jpexs.decompiler.flash.tags.DefineBitsLosslessTag; +import com.jpexs.decompiler.flash.tags.DefineBitsTag; +import com.jpexs.decompiler.flash.tags.DefineButton2Tag; +import com.jpexs.decompiler.flash.tags.DefineButtonCxformTag; +import com.jpexs.decompiler.flash.tags.DefineButtonSoundTag; +import com.jpexs.decompiler.flash.tags.DefineButtonTag; +import com.jpexs.decompiler.flash.tags.DefineEditTextTag; +import com.jpexs.decompiler.flash.tags.DefineFont2Tag; +import com.jpexs.decompiler.flash.tags.DefineFont3Tag; +import com.jpexs.decompiler.flash.tags.DefineFont4Tag; +import com.jpexs.decompiler.flash.tags.DefineFontAlignZonesTag; +import com.jpexs.decompiler.flash.tags.DefineFontInfo2Tag; +import com.jpexs.decompiler.flash.tags.DefineFontInfoTag; +import com.jpexs.decompiler.flash.tags.DefineFontNameTag; +import com.jpexs.decompiler.flash.tags.DefineFontTag; +import com.jpexs.decompiler.flash.tags.DefineMorphShape2Tag; +import com.jpexs.decompiler.flash.tags.DefineMorphShapeTag; +import com.jpexs.decompiler.flash.tags.DefineScalingGridTag; +import com.jpexs.decompiler.flash.tags.DefineSceneAndFrameLabelDataTag; +import com.jpexs.decompiler.flash.tags.DefineShape2Tag; +import com.jpexs.decompiler.flash.tags.DefineShape3Tag; +import com.jpexs.decompiler.flash.tags.DefineShape4Tag; +import com.jpexs.decompiler.flash.tags.DefineShapeTag; +import com.jpexs.decompiler.flash.tags.DefineSoundTag; +import com.jpexs.decompiler.flash.tags.DefineSpriteTag; +import com.jpexs.decompiler.flash.tags.DefineText2Tag; +import com.jpexs.decompiler.flash.tags.DefineTextTag; +import com.jpexs.decompiler.flash.tags.DefineVideoStreamTag; +import com.jpexs.decompiler.flash.tags.DoABC2Tag; +import com.jpexs.decompiler.flash.tags.DoABCTag; +import com.jpexs.decompiler.flash.tags.DoActionTag; +import com.jpexs.decompiler.flash.tags.DoInitActionTag; +import com.jpexs.decompiler.flash.tags.EnableDebugger2Tag; +import com.jpexs.decompiler.flash.tags.EnableDebuggerTag; +import com.jpexs.decompiler.flash.tags.EnableTelemetryTag; +import com.jpexs.decompiler.flash.tags.ExportAssetsTag; +import com.jpexs.decompiler.flash.tags.FileAttributesTag; +import com.jpexs.decompiler.flash.tags.FrameLabelTag; +import com.jpexs.decompiler.flash.tags.ImportAssets2Tag; +import com.jpexs.decompiler.flash.tags.ImportAssetsTag; +import com.jpexs.decompiler.flash.tags.JPEGTablesTag; +import com.jpexs.decompiler.flash.tags.MetadataTag; +import com.jpexs.decompiler.flash.tags.PlaceObject2Tag; +import com.jpexs.decompiler.flash.tags.PlaceObject3Tag; +import com.jpexs.decompiler.flash.tags.PlaceObject4Tag; +import com.jpexs.decompiler.flash.tags.PlaceObjectTag; +import com.jpexs.decompiler.flash.tags.ProductInfoTag; +import com.jpexs.decompiler.flash.tags.ProtectTag; +import com.jpexs.decompiler.flash.tags.RemoveObject2Tag; +import com.jpexs.decompiler.flash.tags.RemoveObjectTag; +import com.jpexs.decompiler.flash.tags.ScriptLimitsTag; +import com.jpexs.decompiler.flash.tags.SetBackgroundColorTag; +import com.jpexs.decompiler.flash.tags.SetTabIndexTag; +import com.jpexs.decompiler.flash.tags.ShowFrameTag; +import com.jpexs.decompiler.flash.tags.SoundStreamBlockTag; +import com.jpexs.decompiler.flash.tags.SoundStreamHead2Tag; +import com.jpexs.decompiler.flash.tags.SoundStreamHeadTag; +import com.jpexs.decompiler.flash.tags.StartSound2Tag; +import com.jpexs.decompiler.flash.tags.StartSoundTag; +import com.jpexs.decompiler.flash.tags.SymbolClassTag; +import com.jpexs.decompiler.flash.tags.Tag; +import com.jpexs.decompiler.flash.tags.VideoFrameTag; +import com.jpexs.decompiler.flash.tags.base.ASMSource; +import com.jpexs.decompiler.flash.tags.base.ButtonTag; +import com.jpexs.decompiler.flash.tags.base.FontTag; +import com.jpexs.decompiler.flash.tags.base.ImageTag; +import com.jpexs.decompiler.flash.tags.base.MorphShapeTag; +import com.jpexs.decompiler.flash.tags.base.PlaceObjectTypeTag; +import com.jpexs.decompiler.flash.tags.base.RemoveTag; +import com.jpexs.decompiler.flash.tags.base.ShapeTag; +import com.jpexs.decompiler.flash.tags.base.SymbolClassTypeTag; +import com.jpexs.decompiler.flash.tags.base.TextTag; +import com.jpexs.decompiler.flash.tags.gfx.DefineCompactedFont; +import com.jpexs.decompiler.flash.timeline.AS2Package; +import com.jpexs.decompiler.flash.timeline.AS3Package; +import com.jpexs.decompiler.flash.timeline.Frame; +import com.jpexs.decompiler.flash.timeline.FrameScript; +import com.jpexs.decompiler.flash.timeline.TagScript; +import com.jpexs.decompiler.flash.treeitems.AS3ClassTreeItem; +import com.jpexs.decompiler.flash.treeitems.FolderItem; +import com.jpexs.decompiler.flash.treeitems.HeaderItem; +import com.jpexs.decompiler.flash.treeitems.SWFList; +import com.jpexs.decompiler.flash.treeitems.TreeItem; +import java.awt.Color; +import java.awt.Component; +import java.awt.Font; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.swing.Icon; +import javax.swing.JTree; +import javax.swing.plaf.basic.BasicLabelUI; +import javax.swing.plaf.basic.BasicTreeUI; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; + +/** + * + * @author JPEXS + */ +public class TagTree extends JTree { + + public TagTreeContextMenu contextPopupMenu; + + private final MainPanel mainPanel; + + private static final Map ICONS; + + static { + ICONS = new HashMap<>(); + for (TreeNodeType treeNodeType : TreeNodeType.values()) { + if (treeNodeType != TreeNodeType.UNKNOWN && treeNodeType != TreeNodeType.SHOW_FRAME) { + String tagTypeStr = treeNodeType.toString().toLowerCase().replace("_", ""); + ICONS.put(treeNodeType, View.getIcon(tagTypeStr + "16")); + } + } + } + + public static Icon getIconForType(TreeNodeType t) { + return ICONS.get(t); + } + + public static class TagTreeCellRenderer extends DefaultTreeCellRenderer { + + private Font plainFont; + + private Font boldFont; + + public TagTreeCellRenderer() { + setUI(new BasicLabelUI()); + setOpaque(false); + //setBackground(Color.green); + setBackgroundNonSelectionColor(Color.white); + //setBackgroundSelectionColor(Color.ORANGE); + + } + + @Override + public Component getTreeCellRendererComponent( + JTree tree, + Object value, + boolean sel, + boolean expanded, + boolean leaf, + int row, + boolean hasFocus) { + + TreeItem val = (TreeItem) value; + if (val != null && !(val instanceof SWFList) && val.getSwf() == null) { + // SWF was closed + value = null; + } + + super.getTreeCellRendererComponent( + tree, value, sel, + expanded, leaf, row, + hasFocus); + + if (val == null) { + return this; + } + + TreeNodeType type = getTreeNodeType(val); + + if (type == TreeNodeType.FOLDER && expanded) { + type = TreeNodeType.FOLDER_OPEN; + } + + if ((type == TreeNodeType.FOLDER || type == TreeNodeType.FOLDER_OPEN) && val instanceof FolderItem) { + FolderItem si = (FolderItem) val; + if (!TagTreeRoot.FOLDER_ROOT.equals(si.getName())) { + String itemName = "folder" + si.getName(); + setIcon(View.getIcon(itemName.toLowerCase() + "16")); + } + } else { + setIcon(ICONS.get(type)); + } + + /* boolean isModified = val instanceof Tag && ((Tag) val).isModified(); + if(val instanceof ScriptPack){ + ScriptPack sp=(ScriptPack)val; + if(sp.abc.script_info.get(sp.scriptIndex).isModified()){ + isModified = true; + } + }*/ + boolean isReadOnly = false; + if (val instanceof Tag) { + isReadOnly = ((Tag) val).isReadOnly(); + } + + boolean isModified = val.isModified(); + if (isModified) { + if (boldFont == null) { + Font font = getFont(); + boldFont = font.deriveFont(Font.BOLD); + } + } else if (plainFont == null) { + Font font = getFont(); + plainFont = font.deriveFont(Font.PLAIN); + } + setFont(isModified ? boldFont : plainFont); + if (isReadOnly) { + setForeground(new Color(0xcc, 0xcc, 0xcc)); + } else { + setForeground(Color.BLACK); + } + + return this; + } + } + + public TagTree(TagTreeModel treeModel, MainPanel mainPanel) { + super(treeModel); + this.mainPanel = mainPanel; + setCellRenderer(new TagTreeCellRenderer()); + setRootVisible(false); + setBackground(Color.white); + setRowHeight(Math.max(getFont().getSize() + 5, 16)); + setLargeModel(true); + setUI(new BasicTreeUI() { + { + setHashColor(Color.gray); + } + }); + } + + public void createContextMenu() { + contextPopupMenu = new TagTreeContextMenu(this, mainPanel); + } + + public static TreeNodeType getTreeNodeType(TreeItem t) { + + if (t instanceof TagScript) { + t = ((TagScript) t).getTag(); + } + + if (t instanceof HeaderItem) { + return TreeNodeType.HEADER; + } + + if ((t instanceof DefineFontTag) + || (t instanceof DefineFont2Tag) + || (t instanceof DefineFont3Tag) + || (t instanceof DefineFont4Tag) + || (t instanceof DefineCompactedFont)) { + return TreeNodeType.FONT; + } + + // DefineText, DefineText2, DefineEditTextTag + if (t instanceof TextTag) { + return TreeNodeType.TEXT; + } + + // DefineBits, DefineBitsJPEG2, DefineBitsJPEG3, DefineBitsJPEG4, DefineBitsLossless, DefineBitsLossless2 + if (t instanceof ImageTag) { + return TreeNodeType.IMAGE; + } + + // DefineShape, DefineShape2, DefineShape3, DefineShape4 + if (t instanceof ShapeTag) { + return TreeNodeType.SHAPE; + } + + // DefineMorphShape, DefineMorphShape2 + if (t instanceof MorphShapeTag) { + return TreeNodeType.MORPH_SHAPE; + } + + if (t instanceof DefineSpriteTag) { + return TreeNodeType.SPRITE; + } + + // DefineButton, DefineButton2 + if (t instanceof ButtonTag) { + return TreeNodeType.BUTTON; + } + + if (t instanceof DefineVideoStreamTag) { + return TreeNodeType.MOVIE; + } + + if ((t instanceof DefineSoundTag) || (t instanceof SoundStreamHeadTag) || (t instanceof SoundStreamHead2Tag)) { + return TreeNodeType.SOUND; + } + + if (t instanceof DefineBinaryDataTag) { + return TreeNodeType.BINARY_DATA; + } + + if (t instanceof ASMSource) { + return TreeNodeType.AS; + } + + if (t instanceof ScriptPack) { + return TreeNodeType.AS; + } + + if (t instanceof AS2Package) { + return TreeNodeType.PACKAGE; + } + + if (t instanceof AS3Package) { + return TreeNodeType.PACKAGE; + } + + if ((t instanceof Frame) + || (t instanceof FrameScript)) { + return TreeNodeType.FRAME; + } + + if (t instanceof ShowFrameTag) { + return TreeNodeType.SHOW_FRAME; + } + + if (t instanceof SWF) { + return TreeNodeType.FLASH; + } + + if (t instanceof SWFList) { + SWFList slist = (SWFList) t; + if (slist.isBundle()) { + if (slist.bundle.getClass() == ZippedSWFBundle.class) { + return TreeNodeType.BUNDLE_ZIP; + } else if (slist.bundle.getClass() == SWC.class) { + return TreeNodeType.BUNDLE_SWC; + } else if (slist.bundle.getClass() == IggySwfBundle.class) { + return TreeNodeType.BUNDLE_IGGY; + } else { + return TreeNodeType.BUNDLE_BINARY; + } + } + } + + if (t instanceof SetBackgroundColorTag) { + return TreeNodeType.SET_BACKGROUNDCOLOR; + } + if (t instanceof FileAttributesTag) { + return TreeNodeType.FILE_ATTRIBUTES; + } + if (t instanceof MetadataTag) { + return TreeNodeType.METADATA; + } + if (t instanceof PlaceObjectTypeTag) { + return TreeNodeType.PLACE_OBJECT; + } + if (t instanceof RemoveTag) { + return TreeNodeType.REMOVE_OBJECT; + } + if (t instanceof Tag) { + return TreeNodeType.OTHER_TAG; + } + + if (t instanceof FolderItem) { + return TreeNodeType.FOLDER; + } + + return TreeNodeType.FOLDER; + } + + public List getSwfFolderItemNestedTagIds(String folderName, boolean gfx) { + List ret = null; + switch (folderName) { + case TagTreeModel.FOLDER_SHAPES: + ret = Arrays.asList(DefineShapeTag.ID, DefineShape2Tag.ID, DefineShape3Tag.ID, DefineShape4Tag.ID); + break; + case TagTreeModel.FOLDER_MORPHSHAPES: + ret = Arrays.asList(DefineMorphShapeTag.ID, DefineMorphShape2Tag.ID); + break; + case TagTreeModel.FOLDER_SPRITES: + ret = Arrays.asList(DefineSpriteTag.ID); + break; + case TagTreeModel.FOLDER_TEXTS: + ret = Arrays.asList(DefineTextTag.ID, DefineText2Tag.ID, DefineEditTextTag.ID); + break; + case TagTreeModel.FOLDER_IMAGES: + ret = Arrays.asList(DefineBitsTag.ID, DefineBitsJPEG2Tag.ID, DefineBitsJPEG3Tag.ID, DefineBitsJPEG4Tag.ID, DefineBitsLosslessTag.ID, DefineBitsLossless2Tag.ID); + break; + case TagTreeModel.FOLDER_MOVIES: + ret = Arrays.asList(DefineVideoStreamTag.ID); + break; + case TagTreeModel.FOLDER_SOUNDS: + ret = Arrays.asList(DefineSoundTag.ID); + break; + case TagTreeModel.FOLDER_BUTTONS: + ret = Arrays.asList(DefineButtonTag.ID, DefineButton2Tag.ID); + break; + case TagTreeModel.FOLDER_FONTS: + if (gfx) { + ret = Arrays.asList(DefineFontTag.ID, DefineFont2Tag.ID, DefineFont3Tag.ID, DefineFont4Tag.ID, DefineCompactedFont.ID); + } else { + ret = Arrays.asList(DefineFontTag.ID, DefineFont2Tag.ID, DefineFont3Tag.ID, DefineFont4Tag.ID); + } + break; + case TagTreeModel.FOLDER_BINARY_DATA: + ret = Arrays.asList(DefineBinaryDataTag.ID); + break; + case TagTreeModel.FOLDER_FRAMES: + // same as nested tags of DefineSpriteTag? + ret = Arrays.asList(PlaceObjectTag.ID, PlaceObject2Tag.ID, PlaceObject3Tag.ID, PlaceObject4Tag.ID, + RemoveObjectTag.ID, RemoveObject2Tag.ID, ShowFrameTag.ID, FrameLabelTag.ID, + StartSoundTag.ID, StartSound2Tag.ID, VideoFrameTag.ID, + SoundStreamBlockTag.ID, SoundStreamHeadTag.ID, SoundStreamHead2Tag.ID, + DefineScalingGridTag.ID); + break; + case TagTreeModel.FOLDER_OTHERS: + ret = Arrays.asList( + //CSMTextSettingsTag.ID, + DebugIDTag.ID, + //DefineButtonCxformTag.ID, DefineButtonSoundTag.ID, + //DefineFontAlignZonesTag.ID, DefineFontInfoTag.ID, DefineFontInfo2Tag.ID, DefineFontNameTag.ID, + /*DefineScalingGridTag.ID,*/ DefineSceneAndFrameLabelDataTag.ID, + DoABC2Tag.ID, DoABCTag.ID, DoActionTag.ID, DoInitActionTag.ID, + EnableDebuggerTag.ID, EnableDebugger2Tag.ID, EnableTelemetryTag.ID, + ExportAssetsTag.ID, FileAttributesTag.ID, ImportAssetsTag.ID, ImportAssets2Tag.ID, + JPEGTablesTag.ID, MetadataTag.ID, ProductInfoTag.ID, ProtectTag.ID, ScriptLimitsTag.ID, + SetBackgroundColorTag.ID, SetTabIndexTag.ID, SymbolClassTag.ID); + break; + } + + return ret; + } + + public List getFrameNestedTagIds() { + return Arrays.asList(PlaceObjectTag.ID, PlaceObject2Tag.ID, PlaceObject3Tag.ID, PlaceObject4Tag.ID, + RemoveObjectTag.ID, RemoveObject2Tag.ID, FrameLabelTag.ID, + StartSoundTag.ID, StartSound2Tag.ID, VideoFrameTag.ID, + SoundStreamBlockTag.ID, SoundStreamHeadTag.ID, SoundStreamHead2Tag.ID); + } + + public List getNestedTagIds(Tag obj) { + if (obj instanceof DefineSpriteTag) { + return Arrays.asList(PlaceObjectTag.ID, PlaceObject2Tag.ID, PlaceObject3Tag.ID, PlaceObject4Tag.ID, + RemoveObjectTag.ID, RemoveObject2Tag.ID, ShowFrameTag.ID, FrameLabelTag.ID, + StartSoundTag.ID, StartSound2Tag.ID, VideoFrameTag.ID, + SoundStreamBlockTag.ID, SoundStreamHeadTag.ID, SoundStreamHead2Tag.ID, + DefineScalingGridTag.ID); + } + if (obj instanceof FontTag) { + return Arrays.asList(DefineFontNameTag.ID, DefineFontAlignZonesTag.ID, DefineFontInfoTag.ID, DefineFontInfo2Tag.ID); + } + if (obj instanceof TextTag) { + return Arrays.asList(CSMTextSettingsTag.ID); + } + if (obj instanceof DefineButtonTag) { + return Arrays.asList(DefineButtonCxformTag.ID, DefineButtonSoundTag.ID, DefineScalingGridTag.ID); + } + if (obj instanceof DefineButton2Tag) { + return Arrays.asList(DefineButtonSoundTag.ID, DefineScalingGridTag.ID); + } + return null; + } + + public boolean hasExportableNodes() { + return !getSelection(mainPanel.getCurrentSwf()).isEmpty(); + } + + public void getAllSubs(TreeItem o, List ret) { + TagTreeModel tm = getModel(); + for (TreeItem c : tm.getAllChildren(o)) { + ret.add(c); + getAllSubs(c, ret); + } + } + + public List getAllSelected() { + TreeSelectionModel tsm = getSelectionModel(); + TreePath[] tps = tsm.getSelectionPaths(); + List ret = new ArrayList<>(); + if (tps == null) { + return ret; + } + + for (TreePath tp : tps) { + TreeItem treeNode = (TreeItem) tp.getLastPathComponent(); + ret.add(treeNode); + getAllSubs(treeNode, ret); + } + return ret; + } + + public List getSelected() { + if (!mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { + return new ArrayList<>(mainPanel.folderPreviewPanel.selectedItems.values()); + } + TreeSelectionModel tsm = getSelectionModel(); + TreePath[] tps = tsm.getSelectionPaths(); + List ret = new ArrayList<>(); + if (tps == null) { + return ret; + } + + for (TreePath tp : tps) { + TreeItem treeNode = (TreeItem) tp.getLastPathComponent(); + ret.add(treeNode); + } + return ret; + } + + public List getSelection(SWF swf) { + List sel; + if (mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { + sel = getAllSelected(); + } else { + sel = new ArrayList<>(mainPanel.folderPreviewPanel.selectedItems.values()); + } + return getSelection(swf, sel); + } + + public List getSelection(SWF swf, List sel) { + List ret = new ArrayList<>(); + for (TreeItem d : sel) { + if (d instanceof SWFList) { + continue; + } + if (d.getSwf() != swf) { + continue; + } + + if (d instanceof TagScript) { + Tag tag = ((TagScript) d).getTag(); + if (tag instanceof DoActionTag || tag instanceof DoInitActionTag) { + d = tag; + } + } + + if (d instanceof Tag || d instanceof ASMSource) { + TreeNodeType nodeType = TagTree.getTreeNodeType(d); + if (nodeType == TreeNodeType.IMAGE) { + ret.add(d); + } + if (nodeType == TreeNodeType.SHAPE) { + ret.add(d); + } + if (nodeType == TreeNodeType.MORPH_SHAPE) { + ret.add(d); + } + if (nodeType == TreeNodeType.BUTTON) { + ret.add(d); + } + if (nodeType == TreeNodeType.AS) { + ret.add(d); + } + if (nodeType == TreeNodeType.MOVIE) { + ret.add(d); + } + if (nodeType == TreeNodeType.SOUND) { + ret.add(d); + } + if (nodeType == TreeNodeType.BINARY_DATA) { + ret.add(d); + } + if (nodeType == TreeNodeType.TEXT) { + ret.add(d); + } + if (nodeType == TreeNodeType.FONT) { + ret.add(d); + } + if (nodeType == TreeNodeType.OTHER_TAG) { + if (d instanceof SymbolClassTypeTag) { + ret.add(d); + } + } + } + + if (d instanceof Frame) { + ret.add(d); + } + if (d instanceof ScriptPack) { + ret.add(d); + } + } + return ret; + } + + public List getTagsWithType(List list, TreeNodeType type) { + List ret = new ArrayList<>(); + for (AS3ClassTreeItem item : list) { + TreeNodeType ttype = getTreeNodeType(item); + if (type == ttype) { + ret.add(item); + } + } + return ret; + } + + public TreeItem getCurrentTreeItem() { + if (!mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { + return mainPanel.folderPreviewPanel.selectedItems.entrySet().iterator().next().getValue(); + } + + TreeItem item = (TreeItem) getLastSelectedPathComponent(); + return item; + } + + public void updateSwfs(SWF[] swfs) { + TagTreeModel ttm = getModel(); + if (ttm != null) { + List> expandedNodes = View.getExpandedNodes(this); + ttm.updateSwf(null); // todo: honfika: update only the changed swfs, but there was an exception when i tried it + View.expandTreeNodes(this, expandedNodes); + } + } + + @Override + public TagTreeModel getModel() { + return (TagTreeModel) super.getModel(); + } + + public void expandRoot() { + TagTreeModel ttm = getModel(); + TreeItem root = ttm.getRoot(); + expandPath(new TreePath(new Object[]{root})); + } + + public void expandFirstLevelNodes() { + TagTreeModel ttm = getModel(); + TreeItem root = ttm.getRoot(); + int childCount = ttm.getChildCount(root); + for (int i = 0; i < childCount; i++) { + expandPath(new TreePath(new Object[]{root, ttm.getChild(root, i)})); + } + } + + public String getSelectionPathString() { + StringBuilder sb = new StringBuilder(); + TreePath path = getSelectionPath(); + if (path != null) { + boolean first = true; + for (Object p : path.getPath()) { + if (!first) { + sb.append("|"); + } + + first = false; + sb.append(p.toString()); + } + } + + return sb.toString(); + } + + public void setSelectionPathString(String pathStr) { + if (pathStr != null && pathStr.length() > 0) { + String[] path = pathStr.split("\\|"); + + TreePath tp = View.getTreePathByPathStrings(this, Arrays.asList(path)); + if (tp != null) { + // the current view is the Resources view, otherwise tp is null + mainPanel.setTagTreeSelectedNode((TreeItem) tp.getLastPathComponent()); + } + } + } +}