package com.gpl.rpg.atcontentstudio.ui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.ArrayList; import java.util.HashSet; import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.swing.BorderFactory; import javax.swing.DefaultListCellRenderer; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.model.GameDataElement; import com.gpl.rpg.atcontentstudio.model.SaveEvent; import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataCategory; import com.gpl.rpg.atcontentstudio.model.gamedata.JSONElement; import com.jidesoft.swing.JideBoxLayout; public class SaveItemsWizard extends JDialog { private static final long serialVersionUID = -3301878024575930527L; List events; @SuppressWarnings("rawtypes") JList movedToCreated; @SuppressWarnings("rawtypes") JList movedToAltered; @SuppressWarnings("rawtypes") JList willBeSaved; @SuppressWarnings({ "unchecked", "rawtypes" }) public SaveItemsWizard(List events, GameDataElement originalRequester) { super(ATContentStudio.frame); this.events = events; final List movedToAlteredList = new ArrayList(); final List movedToCreatedList = new ArrayList(); final List alsoSavedList = new ArrayList(); final List errors = new ArrayList(); for (SaveEvent event : events) { if (event.error) { errors.add(event); } else { switch (event.type) { case alsoSave: alsoSavedList.add(event); break; case moveToAltered: movedToAlteredList.add(event); break; case moveToCreated: movedToCreatedList.add(event); break; } } } if (!errors.isEmpty()) { setTitle("Errors in project. Cannot save."); JPanel pane = new JPanel(); pane.setLayout(new JideBoxLayout(pane, JideBoxLayout.PAGE_AXIS, 6)); if (originalRequester != null) { pane.add(new JLabel(" While trying to save: "), JideBoxLayout.FIX); JLabel origItemDesc = new JLabel(); origItemDesc.setIcon(new ImageIcon(originalRequester.getIcon())); origItemDesc.setText(originalRequester.getDataType().toString()+"/"+originalRequester.id); pane.add(origItemDesc, JideBoxLayout.FIX); pane.add(new JLabel(" the following errors have been encountered and must be corrected before saving can occur: "), JideBoxLayout.FIX); } else { pane.add(new JLabel("After deleting element(s), the following errors have been encountered and must be coorected before saving can occur: "), JideBoxLayout.FIX); } movedToCreated = new JList(errors.toArray()); movedToCreated.setCellRenderer(new SaveEventsListCellRenderer()); JPanel movedToCreatedPane = new JPanel(); movedToCreatedPane.setLayout(new BorderLayout()); movedToCreatedPane.add(new JScrollPane(movedToCreated), BorderLayout.CENTER); pane.add(movedToCreatedPane, JideBoxLayout.FLEXIBLE); pane.add(new JPanel(), JideBoxLayout.VARY); JPanel buttonPane = new JPanel(); buttonPane.setLayout(new JideBoxLayout(buttonPane, JideBoxLayout.LINE_AXIS, 6)); buttonPane.add(new JPanel(), JideBoxLayout.VARY); JButton cancelButton = new JButton("Ok, back to work..."); buttonPane.add(cancelButton, JideBoxLayout.FIX); pane.add(buttonPane, JideBoxLayout.FIX); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { SaveItemsWizard.this.setVisible(false); SaveItemsWizard.this.dispose(); } }); getContentPane().setLayout(new BorderLayout()); getContentPane().add(pane, BorderLayout.CENTER); } else { setTitle("Other elements impacted."); JPanel pane = new JPanel(); pane.setLayout(new JideBoxLayout(pane, JideBoxLayout.PAGE_AXIS, 6)); if (originalRequester != null) { pane.add(new JLabel(" While trying to save: "), JideBoxLayout.FIX); JLabel origItemDesc = new JLabel(); origItemDesc.setIcon(new ImageIcon(originalRequester.getIcon())); origItemDesc.setText(originalRequester.getDataType().toString()+"/"+originalRequester.id); pane.add(origItemDesc, JideBoxLayout.FIX); pane.add(new JLabel(" the following side-effects have been identified and must be applied to the project before saving: "), JideBoxLayout.FIX); } else { pane.add(new JLabel("After deleting element(s), the following side-effects have been identified and must be applied to the project before saving: "), JideBoxLayout.FIX); } if (!movedToCreatedList.isEmpty()) { movedToCreated = new JList(movedToCreatedList.toArray()); movedToCreated.setCellRenderer(new SaveEventsListCellRenderer()); JPanel movedToCreatedPane = new JPanel(); movedToCreatedPane.setLayout(new BorderLayout()); movedToCreatedPane.setBorder(BorderFactory.createTitledBorder("The following elements will be moved under the \"Created\" folder and saved:")); movedToCreatedPane.add(new JScrollPane(movedToCreated), BorderLayout.CENTER); pane.add(movedToCreatedPane, JideBoxLayout.FLEXIBLE); } if (!movedToAlteredList.isEmpty()) { movedToAltered = new JList(movedToAlteredList.toArray()); movedToAltered.setCellRenderer(new SaveEventsListCellRenderer()); JPanel movedToAlteredPane = new JPanel(); movedToAlteredPane.setLayout(new BorderLayout()); movedToAlteredPane.setBorder(BorderFactory.createTitledBorder("The following elements will be moved under the \"Altered\" folder and saved:")); movedToAlteredPane.add(new JScrollPane(movedToAltered), BorderLayout.CENTER); pane.add(movedToAlteredPane, JideBoxLayout.FLEXIBLE); } if (!alsoSavedList.isEmpty()) { willBeSaved = new JList(alsoSavedList.toArray()); willBeSaved.setCellRenderer(new SaveEventsListCellRenderer()); JPanel willBeSavedPane = new JPanel(); willBeSavedPane.setLayout(new BorderLayout()); willBeSavedPane.setBorder(BorderFactory.createTitledBorder("The following elements will be saved too:")); willBeSavedPane.add(new JScrollPane(willBeSaved), BorderLayout.CENTER); pane.add(willBeSavedPane, JideBoxLayout.FLEXIBLE); } pane.add(new JPanel(), JideBoxLayout.VARY); JPanel buttonPane = new JPanel(); buttonPane.setLayout(new JideBoxLayout(buttonPane, JideBoxLayout.LINE_AXIS, 6)); buttonPane.add(new JPanel(), JideBoxLayout.VARY); JButton cancelButton = new JButton("Cancel"); buttonPane.add(cancelButton, JideBoxLayout.FIX); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { SaveItemsWizard.this.setVisible(false); SaveItemsWizard.this.dispose(); } }); JButton okButton = new JButton("Apply all changes and save"); buttonPane.add(okButton, JideBoxLayout.FIX); pane.add(buttonPane, JideBoxLayout.FIX); okButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Map, Set> jsonToSave = new IdentityHashMap, Set>(); for (SaveEvent event : movedToCreatedList) { if (event.target instanceof JSONElement) { if (!jsonToSave.containsKey(event.target.getParent())){ jsonToSave.put((GameDataCategory) event.target.getParent(), new HashSet()); } jsonToSave.get((GameDataCategory) event.target.getParent()).add(((JSONElement)event.target).jsonFile); event.target.getProject().moveToCreated((JSONElement) event.target); if (!jsonToSave.containsKey(event.target.getParent())){ jsonToSave.put((GameDataCategory) event.target.getParent(), new HashSet()); } jsonToSave.get((GameDataCategory) event.target.getParent()).add(((JSONElement)event.target).jsonFile); } //TODO movable maps, when ID is editable. } for (SaveEvent event : movedToAlteredList) { if (event.target instanceof JSONElement) { if (!jsonToSave.containsKey(event.target.getParent())){ jsonToSave.put((GameDataCategory) event.target.getParent(), new HashSet()); } jsonToSave.get((GameDataCategory) event.target.getParent()).add(((JSONElement)event.target).jsonFile); event.target.getProject().moveToAltered((JSONElement) event.target); if (!jsonToSave.containsKey(event.target.getParent())){ jsonToSave.put((GameDataCategory) event.target.getParent(), new HashSet()); } jsonToSave.get((GameDataCategory) event.target.getParent()).add(((JSONElement)event.target).jsonFile); } //TODO movable maps, when ID is editable. } for (SaveEvent event : alsoSavedList) { if (event.target instanceof JSONElement) { if (!jsonToSave.containsKey(event.target.getParent())){ jsonToSave.put((GameDataCategory) event.target.getParent(), new HashSet()); } jsonToSave.get((GameDataCategory) event.target.getParent()).add(((JSONElement)event.target).jsonFile); } } for (GameDataCategory cat : jsonToSave.keySet()) { if (jsonToSave.get(cat) != null && !jsonToSave.get(cat).isEmpty()) { for (File f : jsonToSave.get(cat)) { cat.save(f); } } } for (SaveEvent event : movedToCreatedList) { ATContentStudio.frame.nodeChanged(event.target); } for (SaveEvent event : movedToAlteredList) { ATContentStudio.frame.nodeChanged(event.target); } for (SaveEvent event : alsoSavedList) { ATContentStudio.frame.nodeChanged(event.target); } SaveItemsWizard.this.setVisible(false); SaveItemsWizard.this.dispose(); } }); getContentPane().setLayout(new BorderLayout()); getContentPane().add(pane, BorderLayout.CENTER); } pack(); } public class SaveEventsListCellRenderer extends DefaultListCellRenderer { private static final long serialVersionUID = 5764079243906396333L; @Override public Component getListCellRendererComponent(@SuppressWarnings("rawtypes") JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (c instanceof JLabel) { JLabel label = (JLabel) c; SaveEvent event = (SaveEvent) value; label.setIcon(new ImageIcon(event.target.getIcon())); if (event.error) { label.setText(event.target.getDataType().toString()+"/"+event.target.id+": "+event.errorText); } else { label.setText(event.target.getDataType().toString()+"/"+event.target.id); } } return c; } } }