diff --git a/CHANGELOG.md b/CHANGELOG.md index 2744a293d..6553dc499 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ All notable changes to this project will be documented in this file. ## [Unreleased] ### Added - [#1913] Shape transforming +- [#1905] Key strokes on folder preview panel ### Fixed - [#1915] SVG import - gradient when it has two final stops @@ -2820,6 +2821,7 @@ All notable changes to this project will be documented in this file. [alpha 8]: https://github.com/jindrapetrik/jpexs-decompiler/compare/alpha7...alpha8 [alpha 7]: https://github.com/jindrapetrik/jpexs-decompiler/releases/tag/alpha7 [#1913]: https://www.free-decompiler.com/flash/issues/1913 +[#1905]: https://www.free-decompiler.com/flash/issues/1905 [#1915]: https://www.free-decompiler.com/flash/issues/1915 [#1923]: https://www.free-decompiler.com/flash/issues/1923 [#1922]: https://www.free-decompiler.com/flash/issues/1922 diff --git a/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java index 674fc60a8..cf647cafd 100644 --- a/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java @@ -45,12 +45,14 @@ import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import org.pushingpixels.substance.api.ColorSchemeAssociationKind; import org.pushingpixels.substance.api.ComponentState; @@ -76,7 +78,7 @@ public class FolderPreviewPanel extends JPanel { private int lastHeight; - public Map selectedItems = new HashMap<>(); + public Map selectedItems = new LinkedHashMap<>(); private Cache cachedPreviews; @@ -116,6 +118,7 @@ public class FolderPreviewPanel extends JPanel { @Override public void mousePressed(MouseEvent e) { + requestFocusInWindow(); int width = getWidth(); int cols = width / CELL_WIDTH; @@ -159,6 +162,7 @@ public class FolderPreviewPanel extends JPanel { repaint(); } }); + setFocusable(true); } public synchronized void setItems(List items) { @@ -170,6 +174,7 @@ public class FolderPreviewPanel extends JPanel { repaint(); selectedItems.clear(); selectedIndex = -1; + ((JScrollPane)getParent().getParent()).getVerticalScrollBar().setValue(0); } public void clear() { diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 8a3110098..6e1433df1 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -287,6 +287,8 @@ import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JProgressBar; +import javax.swing.JScrollBar; +import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.JTree; @@ -479,19 +481,32 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se pinsPanel.replaceItem(oldItem, newItem); } - private void handleTreeKeyReleased(KeyEvent e) { + private void handleKeyReleased(KeyEvent e) { if (checkEdited()) { return; } - AbstractTagTree tree = (AbstractTagTree) e.getSource(); + Object source = e.getSource(); + List items = new ArrayList<>(); + if (source == folderPreviewPanel) { + items.addAll(folderPreviewPanel.selectedItems.values()); + } else { + AbstractTagTree tree = (AbstractTagTree) e.getSource(); + TreePath[] paths = tree.getSelectionPaths(); + if (paths != null) { + for (TreePath treePath : paths) { + TreeItem item = (TreeItem) treePath.getLastPathComponent(); + items.add(item); + } + } + } + if (items.isEmpty()) { + return; + } + if ((e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN) && e.isAltDown() && !e.isControlDown() && !e.isShiftDown()) { - TreePath paths[] = tree.getSelectionPaths(); - if (paths == null || paths.length != 1) { - return; - } - TreeItem item = (TreeItem) paths[0].getLastPathComponent(); + TreeItem item = items.get(0); if (item instanceof Tag) { if (((Tag) item).isReadOnly()) { @@ -551,12 +566,31 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se quickTagListFindPanel.setVisible(false); } - private void handleTreeKeyPressed(KeyEvent e) { + private void handleKeyPressed(KeyEvent e) { if (checkEdited()) { return; } - AbstractTagTree tree = (AbstractTagTree) e.getSource(); + Object source = e.getSource(); + List items = new ArrayList<>(); + if (source == folderPreviewPanel) { + items.addAll(folderPreviewPanel.selectedItems.values()); + } else { + AbstractTagTree tree = (AbstractTagTree) e.getSource(); + TreePath[] paths = tree.getSelectionPaths(); + if (paths != null) { + for (TreePath treePath : paths) { + TreeItem item = (TreeItem) treePath.getLastPathComponent(); + items.add(item); + } + } + } + + if (items.isEmpty()) { + return; + } + if ((e.getKeyCode() == 'F') && (e.isControlDown())) { + AbstractTagTree tree = getCurrentTree(); if (tree == tagTree) { quickTreeFindPanel.setVisible(true); } @@ -564,30 +598,15 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se quickTagListFindPanel.setVisible(true); } } - if ((e.getKeyCode() == KeyEvent.VK_DELETE) && !e.isControlDown() && !e.isAltDown()) { - TreePath[] paths = tree.getSelectionPaths(); - if (paths == null || paths.length == 0) { - return; - } - List items = new ArrayList<>(); - for (TreePath treePath : paths) { - TreeItem item = (TreeItem) treePath.getLastPathComponent(); - items.add(item); - } + if ((e.getKeyCode() == KeyEvent.VK_DELETE) && !e.isControlDown() && !e.isAltDown()) { if (contextPopupMenu.canRemove(items)) { contextPopupMenu.update(items); - contextPopupMenu.removeItemActionPerformed(null, e.isShiftDown()); + contextPopupMenu.removeItemActionPerformed(null, e.isShiftDown()); } } - if ((e.getKeyCode() == 'C' || e.getKeyCode() == 'X') && (e.isControlDown())) { - TreePath[] paths = tree.getSelectionPaths(); - if (paths == null || paths.length == 0) { - return; - } - + if ((e.getKeyCode() == 'C' || e.getKeyCode() == 'X') && (e.isControlDown())) { List tagItems = new ArrayList<>(); - for (TreePath treePath : paths) { - TreeItem item = (TreeItem) treePath.getLastPathComponent(); + for (TreeItem item:items) { if (item instanceof TagScript) { tagItems.add(((TagScript) item).getTag()); } else if (item instanceof Tag) { @@ -619,17 +638,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } repaintTree(); } - if (e.getKeyCode() == 'V' && e.isControlDown()) { - TreePath[] paths = tree.getSelectionPaths(); - if (paths == null || paths.length == 0) { - return; - } - - List items = new ArrayList<>(); - for (TreePath treePath : paths) { - TreeItem item = (TreeItem) treePath.getLastPathComponent(); - items.add(item); - } + if (e.getKeyCode() == 'V' && e.isControlDown()) { if (items.size() > 1) { return; } @@ -665,7 +674,8 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se copyToClipboard(new ArrayList<>()); } - public void copyToClipboard(Collection items) { + public void copyToClipboard(Collection items) { + orderedClipboard.clear(); clipboard.clear(); for (TreeItem item : items) { @@ -676,7 +686,9 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se resourcesClipboardPanel.update(); tagListClipboardPanel.update(); resourcesClipboardPanel.flash(); - tagListClipboardPanel.flash(); + tagListClipboardPanel.flash(); + folderPreviewPanel.repaint(); + } public void cutToClipboard(Collection items) { @@ -915,7 +927,20 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se private JPanel createFolderPreviewCard() { JPanel folderPreviewCard = new JPanel(new BorderLayout()); folderPreviewPanel = new FolderPreviewPanel(this, new ArrayList<>()); - folderPreviewCard.add(new FasterScrollPane(folderPreviewPanel), BorderLayout.CENTER); + FasterScrollPane folderPreviewScrollPane = new FasterScrollPane(folderPreviewPanel); + folderPreviewCard.add(folderPreviewScrollPane, BorderLayout.CENTER); + + folderPreviewPanel.addKeyListener(new KeyAdapter() { + @Override + public void keyReleased(KeyEvent e) { + handleKeyReleased(e); + } + + @Override + public void keyPressed(KeyEvent e) { + handleKeyPressed(e); + } + }); return folderPreviewCard; } @@ -1129,12 +1154,12 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se tagTree.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { - handleTreeKeyReleased(e); + handleKeyReleased(e); } @Override public void keyPressed(KeyEvent e) { - handleTreeKeyPressed(e); + handleKeyPressed(e); if ((e.getKeyCode() == 'G') && (e.isControlDown())) { SWF swf = getCurrentSwf(); if (swf != null) { @@ -1171,12 +1196,12 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se tagListTree.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { - handleTreeKeyReleased(e); + handleKeyReleased(e); } @Override public void keyPressed(KeyEvent e) { - handleTreeKeyPressed(e); + handleKeyPressed(e); } }); detailPanel.setVisible(false); @@ -4967,6 +4992,11 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se public void reload(boolean forceReload) { View.checkAccess(); + + JScrollBar folderPreviewScrollBar = ((JScrollPane)folderPreviewPanel.getParent().getParent()).getVerticalScrollBar(); + int scrollValue = folderPreviewScrollBar.getValue(); + Map folderItems = new HashMap<>(folderPreviewPanel.selectedItems); + tagTree.scrollPathToVisible(tagTree.getSelectionPath()); if (currentView == VIEW_DUMP) { @@ -5181,12 +5211,16 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } else { pinsPanel.setCurrent(oldItem); } + + folderPreviewPanel.selectedItems = folderItems; + folderPreviewScrollBar.setValue(scrollValue); + } - public void repaintTree() { + public void repaintTree() { tagTree.repaint(); tagListTree.repaint(); - reload(true); + reload(true); } public void showGenericTag(Tag tag) { diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java index 8df5df454..3e05de496 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java @@ -337,15 +337,6 @@ public class TagTree extends AbstractTagTree { return ret; } - @Override - public TreeItem getCurrentTreeItem() { - if (!mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { - return mainPanel.folderPreviewPanel.selectedItems.entrySet().iterator().next().getValue(); - } - - return super.getCurrentTreeItem(); - } - @Override public TagTreeModel getFullModel() { return (TagTreeModel) super.getFullModel(); diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java index bc1b32a9c..f47f96a60 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java @@ -117,6 +117,8 @@ import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; +import javax.swing.JScrollBar; +import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.filechooser.FileFilter; import javax.swing.tree.TreePath; @@ -2367,7 +2369,7 @@ public class TagTreeContextMenu extends JPopupMenu { } public void removeItemActionPerformed(ActionEvent evt, boolean removeDependencies) { - + List tps = new ArrayList<>(); List sel = getSelectedItems();