package puzzledice; import gui.PuzzleEditPanel; import gui.WindowMain; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.swing.BoxLayout; import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; import com.mxgraph.view.mxGraph; public class ItemRequestPuzzleBlock extends PuzzleBlock { private PuzzleBlock _requesterBlock, _requestedBlock; private static int nextIndex = 0; public static void reset() { nextIndex = 0; } private String _requesterName, _requestedName; public void setRequesterName(String value) { _requesterName = value; } public void setRequestedName(String value) { _requestedName = value; } private JComboBox _requesterSelect, _requestedSelect; public ItemRequestPuzzleBlock() { _name = "Item-Request-Puzzle-" + ++nextIndex; _type = "Item Request Puzzle"; JPanel editPanel = new JPanel(); editPanel.setLayout(new BoxLayout(editPanel, BoxLayout.Y_AXIS)); // Requester Panel JPanel requesterPanel = new JPanel(); requesterPanel.setLayout(new BoxLayout(requesterPanel, BoxLayout.X_AXIS)); JLabel requesterLabel = new JLabel("Requester:"); requesterPanel.add(requesterLabel); _requesterSelect = new JComboBox(); _requesterSelect.setMaximumSize(new Dimension(Integer.MAX_VALUE, _requesterSelect.getPreferredSize().height)); requesterPanel.add(_requesterSelect); editPanel.add(requesterPanel); // Requested Panel JPanel requestedPanel = new JPanel(); requestedPanel.setLayout(new BoxLayout(requestedPanel, BoxLayout.X_AXIS)); JLabel requestedLabel = new JLabel("Requested:"); requestedPanel.add(requestedLabel); _requestedSelect = new JComboBox(); _requestedSelect.setMaximumSize(new Dimension(Integer.MAX_VALUE, _requestedSelect.getPreferredSize().height)); requestedPanel.add(_requestedSelect); editPanel.add(requestedPanel); _editUI = editPanel; _requesterSelect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { if(_requesterBlock == _requesterSelect.getSelectedItem() || _requesterBlock == null && _requesterSelect.getSelectedItem().equals("None")) return; mxGraph puzzleGraph = WindowMain.getPuzzleGraph(); // Before anything, check for a cycle if (_requesterSelect.getSelectedItem() != null && !_requesterSelect.getSelectedItem().equals("None")) { PuzzleBlock block = (PuzzleBlock)_requesterSelect.getSelectedItem(); if (block.canReachBlockBackwards(ItemRequestPuzzleBlock.this)) { SwingUtilities.invokeLater(new Runnable() { public void run() { JOptionPane.showMessageDialog(null, "Error: Cannot add cycle to puzzle graph."); } }); if (_requesterBlock != null) _requesterSelect.setSelectedItem(_requesterBlock); else _requesterSelect.setSelectedIndex(0); return; } } // first, see if we need to remove a previous edge if(_requesterBlock != null) { puzzleGraph.getModel().beginUpdate(); try { puzzleGraph.removeCells(puzzleGraph.getEdgesBetween(_requesterBlock.getGraphCell(), _graphCell, false)); } finally { puzzleGraph.getModel().endUpdate(); } } if (_requesterSelect.getSelectedItem() == null) _requesterSelect.setSelectedIndex(0); if(_requesterSelect.getSelectedItem().equals("None")) _requesterBlock = null; else { _requesterBlock = (PuzzleBlock)_requesterSelect.getSelectedItem(); // update the graph with a new edge puzzleGraph.getModel().beginUpdate(); try { puzzleGraph.insertEdge(puzzleGraph.getDefaultParent(), null, null, _requesterBlock.getGraphCell(), _graphCell);} finally { puzzleGraph.getModel().endUpdate();} } // Need to update our requested list _requestedSelect.setModel(new DefaultComboBoxModel(makeRequestedList())); // And the selected values if(_requestedBlock == null) _requestedSelect.setSelectedIndex(0); else _requestedSelect.setSelectedItem(_requestedBlock); PuzzleEditPanel.resetTextualDescription(); WindowMain.updatePuzzleGraph(); } }); _requestedSelect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { if(_requestedBlock == _requestedSelect.getSelectedItem() || _requestedBlock == null && _requestedSelect.getSelectedItem().equals("None")) return; mxGraph puzzleGraph = WindowMain.getPuzzleGraph(); // Before anything, check for a cycle if (_requestedSelect.getSelectedItem() != null && !_requestedSelect.getSelectedItem().equals("None")) { PuzzleBlock block = (PuzzleBlock)_requestedSelect.getSelectedItem(); if (block.canReachBlockBackwards(ItemRequestPuzzleBlock.this)) { SwingUtilities.invokeLater(new Runnable() { public void run() { JOptionPane.showMessageDialog(null, "Error: Cannot add cycle to puzzle graph."); } }); if (_requestedBlock != null) _requestedSelect.setSelectedItem(_requestedBlock); else _requestedSelect.setSelectedIndex(0); return; } } // first, see if we need to remove a previous edge if(_requestedBlock != null) { puzzleGraph.getModel().beginUpdate(); try { puzzleGraph.removeCells(puzzleGraph.getEdgesBetween(_requestedBlock.getGraphCell(), _graphCell, false)); } finally { puzzleGraph.getModel().endUpdate(); } } if (_requestedSelect.getSelectedItem() == null) _requestedSelect.setSelectedIndex(0); if(_requestedSelect.getSelectedItem().equals("None")) _requestedBlock = null; else { _requestedBlock = (PuzzleBlock)_requestedSelect.getSelectedItem(); // update the graph with a new edge puzzleGraph.getModel().beginUpdate(); try { puzzleGraph.insertEdge(puzzleGraph.getDefaultParent(), null, null, _requestedBlock.getGraphCell(), _graphCell);} finally { puzzleGraph.getModel().endUpdate();} } _requesterSelect.setModel(new DefaultComboBoxModel(makeRequesterList())); if(_requesterBlock == null) _requesterSelect.setSelectedIndex(0); else _requesterSelect.setSelectedItem(_requesterBlock); PuzzleEditPanel.resetTextualDescription(); WindowMain.updatePuzzleGraph(); } }); } @Override public void update() { // Update the UI ComboBoxes _requesterSelect.setModel(new DefaultComboBoxModel(makeRequesterList())); // Update our selected values if (_requesterBlock == null) _requesterSelect.setSelectedIndex(0); else _requesterSelect.setSelectedItem(_requesterBlock); _requestedSelect.setModel(new DefaultComboBoxModel(makeRequestedList())); if (_requestedBlock == null) _requestedSelect.setSelectedIndex(0); else _requestedSelect.setSelectedItem(_requestedBlock); } private Object[] makeRequesterList() { List<Object> retVal = new ArrayList<Object>(); PuzzleBlock[] blockList = PuzzleEditPanel.getBlockList(); retVal.add("None"); for(PuzzleBlock p : blockList) { if(!p.equals(_requestedSelect.getSelectedItem()) && !p.equals(this)) retVal.add(p); } return retVal.toArray(); } private Object[] makeRequestedList() { List<Object> retVal = new ArrayList<Object>(); PuzzleBlock[] blockList = PuzzleEditPanel.getBlockList(); retVal.add("None"); for(PuzzleBlock p : blockList) { if(!p.equals(_requesterSelect.getSelectedItem()) && !p.equals(this)) retVal.add(p); } return retVal.toArray(); } @Override public void maybeRemoveRef(PuzzleBlock block) { if(block.equals(_requesterBlock)) { _requesterBlock = null; _requesterSelect.setSelectedIndex(0); } if(block.equals(_requestedBlock)) { _requestedBlock = null; _requestedSelect.setSelectedIndex(0); } } @Override public String getTextualDescription() { String retVal = ""; if(_requesterBlock != null) retVal += _requesterBlock.getTextualDescription(); if(_requestedBlock != null) retVal += _requestedBlock.getTextualDescription(); _outputTempName = PuzzleEditPanel.nextItemName(); String requester = (_requesterBlock == null) ? "SOMEONE" : _requesterBlock.getOutputTempName(); String requested = (_requestedBlock == null) ? "SOMETHING" : _requestedBlock.getOutputTempName(); retVal += requester + " requests " + requested + " from the player. When the player fulfills this request, he/she receives " + _outputTempName + " as a reward. "; return retVal; } @Override public void attachBlocksToName(Map<String, AreaBlock> areas, Map<String, PuzzleBlock> puzzles) { mxGraph puzzleGraph = WindowMain.getPuzzleGraph(); if (_requesterName != null) { _requesterBlock = puzzles.get(_requesterName); puzzleGraph.getModel().beginUpdate(); try { puzzleGraph.insertEdge(puzzleGraph.getDefaultParent(), null, null, _requesterBlock.getGraphCell(), _graphCell);} finally { puzzleGraph.getModel().endUpdate();} } if (_requestedName != null) { _requestedBlock = puzzles.get(_requestedName); puzzleGraph.getModel().beginUpdate(); try { puzzleGraph.insertEdge(puzzleGraph.getDefaultParent(), null, null, _requestedBlock.getGraphCell(), _graphCell);} finally { puzzleGraph.getModel().endUpdate();} } this.update(); } @Override public PuzzleBlock[] getPuzzleInputs() { if (_requesterBlock != null && _requestedBlock != null) return new PuzzleBlock[] { _requesterBlock, _requestedBlock }; else if (_requesterBlock != null) return new PuzzleBlock[] { _requesterBlock }; else if (_requestedBlock != null) return new PuzzleBlock[] { _requestedBlock }; return new PuzzleBlock[0]; } @Override public String toXML() { String xml = "<ItemRequestPuzzle name=\"" + _name + "\" "; if (_requesterBlock != null) xml += "requester=\"" + _requesterBlock.getName() + "\" "; if (_requestedBlock != null) xml += "requested=\"" + _requestedBlock.getName() + "\" "; xml += "/>"; return xml; } }