/* * Copyright (C) 2023 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.abc; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.configuration.CustomConfigurationKeys; import com.jpexs.decompiler.flash.configuration.SwfSpecificCustomConfiguration; import com.jpexs.decompiler.flash.gui.Main; import com.jpexs.decompiler.flash.gui.MainPanel; import java.awt.BorderLayout; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.regex.Pattern; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JRootPane; import javax.swing.ListCellRenderer; import javax.swing.ListModel; import javax.swing.SwingUtilities; import javax.swing.border.BevelBorder; /** * * @author JPEXS */ public class LinkDialog extends JDialog { private MainPanel mainPanel; private JList linkList; private SWF swf; private List saveListeners = new ArrayList<>(); public void addSaveListener(ActionListener listener) { saveListeners.add(listener); } public void removeSaveListener(ActionListener listener) { saveListeners.remove(listener); } private void fireSave() { for (ActionListener listener : saveListeners) { listener.actionPerformed(new ActionEvent(this, 0, "SAVE")); } } public LinkDialog(MainPanel mainPanel) { this.mainPanel = mainPanel; setUndecorated(true); setResizable(false); getRootPane().setWindowDecorationStyle(JRootPane.NONE); setSize(400, 300); addWindowListener(new WindowAdapter() { @Override public void windowDeactivated(WindowEvent e) { save(swf, false); swf = null; dispose(); } }); JPanel customLibraryPanel = new JPanel(new BorderLayout()); linkList = new JList<>(); linkList.setCellRenderer(new CustomLibraryListCellRenderer()); linkList.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e)) { int index = linkList.locationToIndex(e.getPoint()); LinkItem item = linkList.getModel().getElementAt(index); item.setSelected(!item.isSelected()); linkList.repaint(linkList.getCellBounds(index, index)); } } }); customLibraryPanel.add(linkList, BorderLayout.CENTER); customLibraryPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); setContentPane(customLibraryPanel); } public void load(SWF swf) { this.swf = swf; SwfSpecificCustomConfiguration conf = Configuration.getSwfSpecificCustomConfiguration(swf.getShortPathTitle()); List selectedSWFs = new ArrayList<>(); if (conf != null) { List preselectedNames = conf.getCustomDataAsList(CustomConfigurationKeys.KEY_ABC_DEPENDENCIES); if (!preselectedNames.isEmpty()) { selectedSWFs = Main.namesToSwfs(preselectedNames); } } populateSWFs(swf, selectedSWFs); } public void show(SWF swf) { load(swf); setVisible(true); } public void save(SWF swf, boolean force) { Map map = getSelectedSwfs(); SwfSpecificCustomConfiguration conf = Configuration.getOrCreateSwfSpecificCustomConfiguration(swf.getShortPathTitle()); List oldValue = conf.getCustomDataAsList(CustomConfigurationKeys.KEY_ABC_DEPENDENCIES); List newValue = new ArrayList<>(map.keySet()); conf.setCustomData(CustomConfigurationKeys.KEY_ABC_DEPENDENCIES, newValue); List swfs = new ArrayList<>(map.values()); if (!Objects.equals(oldValue, newValue) || force) { swf.setAbcIndexDependencies(swfs); fireSave(); } } private Map getSelectedSwfs() { ListModel model = linkList.getModel(); Map ret = new LinkedHashMap<>(); for (int i = 0; i < model.getSize(); i++) { LinkItem item = model.getElementAt(i); if (!item.isSelected()) { continue; } ret.put(item.getName(), item.getSwf()); } return ret; } private void populateSWFs(SWF ignoreSWF, List selectedSWFs) { Map swfs = new LinkedHashMap<>(); Main.populateAllSWFs(swfs); DefaultListModel listModel = new DefaultListModel<>(); for (String key : swfs.keySet()) { SWF swf = swfs.get(key); if (swf == ignoreSWF) { continue; } boolean selected = false; for (SWF s : selectedSWFs) { if (s == swf) { selected = true; } } listModel.addElement(new LinkItem(key, swf, selected)); } linkList.setModel(listModel); pack(); } class LinkItem { private String name; private SWF swf; private boolean selected; public LinkItem(String name, SWF swf, boolean selected) { this.name = name; this.swf = swf; this.selected = selected; } public void setSelected(boolean selected) { this.selected = selected; } public boolean isSelected() { return selected; } public String getName() { return name; } public SWF getSwf() { return swf; } @Override public String toString() { return name; } } class CustomLibraryListCellRenderer extends JCheckBox implements ListCellRenderer { @Override public Component getListCellRendererComponent(JList list, LinkItem value, int index, boolean isSelected, boolean cellHasFocus) { setEnabled(list.isEnabled()); setSelected(value.isSelected()); setFont(list.getFont()); setBackground(list.getBackground()); setForeground(list.getForeground()); setText(value.toString()); return this; } } }