package org.csdgn.cddatse; import javax.swing.JPanel; import javax.swing.Scrollable; import javax.swing.SwingConstants; import java.awt.Color; import java.awt.Dimension; import java.awt.GridBagLayout; import java.awt.Rectangle; import javax.swing.JLabel; import java.awt.GridBagConstraints; import javax.swing.JTextField; import java.awt.Insets; import javax.swing.JCheckBox; import javax.swing.border.TitledBorder; import javax.swing.border.EmptyBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.csdgn.cddatse.data.InternalTile; import org.csdgn.maru.listener.MagicCheckboxAdapter; import org.csdgn.maru.listener.MagicDocumentAdapter; public class TilePanel extends JPanel implements Scrollable { private static final long serialVersionUID = -3038838204602442661L; private InternalTile tse; private final MagicDocumentAdapter idAdapter; private final MagicCheckboxAdapter cornerAdapter; private final MagicCheckboxAdapter edgeAdapter; private final MagicCheckboxAdapter centerAdapter; private final MagicCheckboxAdapter tconnAdapter; private final MagicCheckboxAdapter endpAdapter; private final MagicCheckboxAdapter unconnAdapter; private final MagicCheckboxAdapter openAdapter; private final MagicCheckboxAdapter brokenAdapter; private final MagicCheckboxAdapter rotatesAdapter; private JTextField txtId; private JLabel lblId; private JCheckBox cboxRotates; private JCheckBox cboxCorner; private JCheckBox cboxEdge; private JCheckBox cboxCenter; private JCheckBox cboxTConnection; private JCheckBox cboxEndPiece; private JCheckBox cboxUnconnected; private JCheckBox cboxOpen; private JCheckBox cboxBroken; private ImageTuplePanel tileImages; private ImageTuplePanel cornerImages; private ImageTuplePanel edgeImages; private ImageTuplePanel centerImages; private ImageTuplePanel tConnectionImages; private ImageTuplePanel endPieceImages; private ImageTuplePanel unconnectedImages; private ImageTuplePanel openImages; private ImageTuplePanel brokenImages; private EditorFrame frame; private String lastId = null; private boolean doIdUpdate = false; private void updateId() { if(!doIdUpdate) return; String nId = txtId.getText(); if(!frame.updateTileId(lastId,nId)) { //System.out.println("BAD ID: " + nId); lblId.setForeground(Color.RED); txtId.setForeground(Color.RED); } else { //System.out.println("GOOD ID: " + nId); lblId.setForeground(Color.BLACK); txtId.setForeground(Color.BLACK); } lastId = nId; frame.updateIDList(); } /** * Create the panel. */ public TilePanel(final EditorFrame frame) { setAutoscrolls(true); this.frame = frame; setBorder(new EmptyBorder(5, 5, 5, 5)); GridBagLayout gridBagLayout = new GridBagLayout(); gridBagLayout.columnWidths = new int[] {0, 0}; gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0}; gridBagLayout.columnWeights = new double[]{0.0, 1.0}; gridBagLayout.rowWeights = new double[]{0.0, 0.0, 1.0, 1.0, Double.MIN_VALUE}; setLayout(gridBagLayout); lblId = new JLabel("ID"); GridBagConstraints gbc_lblId = new GridBagConstraints(); gbc_lblId.insets = new Insets(0, 0, 5, 5); gbc_lblId.anchor = GridBagConstraints.EAST; gbc_lblId.gridx = 0; gbc_lblId.gridy = 0; add(lblId, gbc_lblId); txtId = new JTextField(); idAdapter = new MagicDocumentAdapter(InternalTile.class, "setId"); txtId.getDocument().addDocumentListener(idAdapter); txtId.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { updateId(); } @Override public void removeUpdate(DocumentEvent e) { updateId(); } @Override public void changedUpdate(DocumentEvent e) { } }); GridBagConstraints gbc_txtId = new GridBagConstraints(); gbc_txtId.insets = new Insets(0, 0, 5, 0); gbc_txtId.fill = GridBagConstraints.HORIZONTAL; gbc_txtId.gridx = 1; gbc_txtId.gridy = 0; add(txtId, gbc_txtId); txtId.setColumns(10); tileImages = new ImageTuplePanel(frame); GridBagConstraints gbc_tileImages = new GridBagConstraints(); gbc_tileImages.fill = GridBagConstraints.VERTICAL; gbc_tileImages.anchor = GridBagConstraints.WEST; gbc_tileImages.insets = new Insets(0, 0, 5, 0); gbc_tileImages.gridx = 1; gbc_tileImages.gridy = 2; add(tileImages, gbc_tileImages); JPanel multitilePanel = new JPanel(); multitilePanel.setBorder(new TitledBorder(null, "Multitile", TitledBorder.LEADING, TitledBorder.TOP, null, null)); GridBagConstraints gbc_multitilePanel = new GridBagConstraints(); gbc_multitilePanel.anchor = GridBagConstraints.WEST; gbc_multitilePanel.fill = GridBagConstraints.VERTICAL; gbc_multitilePanel.gridx = 1; gbc_multitilePanel.gridy = 3; add(multitilePanel, gbc_multitilePanel); GridBagLayout gbl_multitilePanel = new GridBagLayout(); gbl_multitilePanel.columnWidths = new int[]{0, 0, 0}; gbl_multitilePanel.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0}; gbl_multitilePanel.columnWeights = new double[]{1.0, 1.0, Double.MIN_VALUE}; gbl_multitilePanel.rowWeights = new double[]{0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, Double.MIN_VALUE}; multitilePanel.setLayout(gbl_multitilePanel); cboxCorner = new JCheckBox("Corner"); cboxCorner.addActionListener(cornerAdapter = new MagicCheckboxAdapter(InternalTile.class, "setCorner")); GridBagConstraints gbc_chckbxCorner = new GridBagConstraints(); gbc_chckbxCorner.anchor = GridBagConstraints.WEST; gbc_chckbxCorner.insets = new Insets(0, 0, 5, 5); gbc_chckbxCorner.gridx = 0; gbc_chckbxCorner.gridy = 0; multitilePanel.add(cboxCorner, gbc_chckbxCorner); cboxEdge = new JCheckBox("Edge"); cboxEdge.addActionListener(edgeAdapter = new MagicCheckboxAdapter(InternalTile.class, "setEdge")); GridBagConstraints gbc_chckbxEdge = new GridBagConstraints(); gbc_chckbxEdge.anchor = GridBagConstraints.WEST; gbc_chckbxEdge.insets = new Insets(0, 0, 5, 0); gbc_chckbxEdge.gridx = 1; gbc_chckbxEdge.gridy = 0; multitilePanel.add(cboxEdge, gbc_chckbxEdge); cornerImages = new ImageTuplePanel(frame); cornerImages.setToolTipText("Opens to bottom and right."); GridBagLayout gbl_cornerImages = (GridBagLayout) cornerImages.getLayout(); gbl_cornerImages.rowWeights = new double[]{0.0, 1.0}; gbl_cornerImages.rowHeights = new int[]{0, 0}; gbl_cornerImages.columnWeights = new double[]{1.0, 1.0}; gbl_cornerImages.columnWidths = new int[]{0, 0}; GridBagConstraints gbc_cornerImages = new GridBagConstraints(); gbc_cornerImages.insets = new Insets(0, 0, 5, 5); gbc_cornerImages.fill = GridBagConstraints.BOTH; gbc_cornerImages.gridx = 0; gbc_cornerImages.gridy = 1; multitilePanel.add(cornerImages, gbc_cornerImages); edgeImages = new ImageTuplePanel(frame); edgeImages.setToolTipText("Opens to top and bottom."); GridBagLayout gbl_edgeImages = (GridBagLayout) edgeImages.getLayout(); gbl_edgeImages.rowWeights = new double[]{0.0, 1.0}; gbl_edgeImages.rowHeights = new int[]{0, 0}; gbl_edgeImages.columnWeights = new double[]{1.0, 1.0}; gbl_edgeImages.columnWidths = new int[]{0, 0}; GridBagConstraints gbc_edgeImages = new GridBagConstraints(); gbc_edgeImages.insets = new Insets(0, 0, 5, 0); gbc_edgeImages.fill = GridBagConstraints.BOTH; gbc_edgeImages.gridx = 1; gbc_edgeImages.gridy = 1; multitilePanel.add(edgeImages, gbc_edgeImages); cboxCenter = new JCheckBox("Center"); cboxCenter.addActionListener(centerAdapter = new MagicCheckboxAdapter(InternalTile.class, "setCenter")); GridBagConstraints gbc_chckbxCenter = new GridBagConstraints(); gbc_chckbxCenter.anchor = GridBagConstraints.WEST; gbc_chckbxCenter.insets = new Insets(0, 0, 5, 5); gbc_chckbxCenter.gridx = 0; gbc_chckbxCenter.gridy = 2; multitilePanel.add(cboxCenter, gbc_chckbxCenter); cboxTConnection = new JCheckBox("T Connection"); cboxTConnection.addActionListener(tconnAdapter = new MagicCheckboxAdapter(InternalTile.class, "setTConnection")); GridBagConstraints gbc_chckbxTConnection = new GridBagConstraints(); gbc_chckbxTConnection.insets = new Insets(0, 0, 5, 0); gbc_chckbxTConnection.anchor = GridBagConstraints.WEST; gbc_chckbxTConnection.gridx = 1; gbc_chckbxTConnection.gridy = 2; multitilePanel.add(cboxTConnection, gbc_chckbxTConnection); centerImages = new ImageTuplePanel(frame); centerImages.setToolTipText("Opens to all 4 sides."); GridBagLayout gbl_centerImages = (GridBagLayout) centerImages.getLayout(); gbl_centerImages.rowWeights = new double[]{0.0, 1.0}; gbl_centerImages.rowHeights = new int[]{0, 0}; gbl_centerImages.columnWeights = new double[]{1.0, 1.0}; gbl_centerImages.columnWidths = new int[]{0, 0}; GridBagConstraints gbc_centerImages = new GridBagConstraints(); gbc_centerImages.insets = new Insets(0, 0, 5, 5); gbc_centerImages.fill = GridBagConstraints.BOTH; gbc_centerImages.gridx = 0; gbc_centerImages.gridy = 3; multitilePanel.add(centerImages, gbc_centerImages); tConnectionImages = new ImageTuplePanel(frame); tConnectionImages.setToolTipText("Opens to Left, Right and Bottom."); GridBagLayout gbl_tConnectionImages = (GridBagLayout) tConnectionImages.getLayout(); gbl_tConnectionImages.rowWeights = new double[]{0.0, 1.0}; gbl_tConnectionImages.rowHeights = new int[]{0, 0}; gbl_tConnectionImages.columnWeights = new double[]{1.0, 1.0}; gbl_tConnectionImages.columnWidths = new int[]{0, 0}; GridBagConstraints gbc_tConnectionImages = new GridBagConstraints(); gbc_tConnectionImages.insets = new Insets(0, 0, 5, 0); gbc_tConnectionImages.fill = GridBagConstraints.BOTH; gbc_tConnectionImages.gridx = 1; gbc_tConnectionImages.gridy = 3; multitilePanel.add(tConnectionImages, gbc_tConnectionImages); cboxEndPiece = new JCheckBox("End Piece"); cboxEndPiece.addActionListener(endpAdapter = new MagicCheckboxAdapter(InternalTile.class, "setEndPiece")); GridBagConstraints gbc_chckbxEndPiece = new GridBagConstraints(); gbc_chckbxEndPiece.anchor = GridBagConstraints.WEST; gbc_chckbxEndPiece.insets = new Insets(0, 0, 5, 5); gbc_chckbxEndPiece.gridx = 0; gbc_chckbxEndPiece.gridy = 4; multitilePanel.add(cboxEndPiece, gbc_chckbxEndPiece); cboxUnconnected = new JCheckBox("Unconnected"); cboxUnconnected.addActionListener(unconnAdapter = new MagicCheckboxAdapter(InternalTile.class, "setUnconnected")); GridBagConstraints gbc_chckbxUnconnected = new GridBagConstraints(); gbc_chckbxUnconnected.anchor = GridBagConstraints.WEST; gbc_chckbxUnconnected.insets = new Insets(0, 0, 5, 0); gbc_chckbxUnconnected.gridx = 1; gbc_chckbxUnconnected.gridy = 4; multitilePanel.add(cboxUnconnected, gbc_chckbxUnconnected); endPieceImages = new ImageTuplePanel(frame); endPieceImages.setToolTipText("Opens to bottom."); GridBagLayout gbl_endPieceImages = (GridBagLayout) endPieceImages.getLayout(); gbl_endPieceImages.rowWeights = new double[]{0.0, 1.0}; gbl_endPieceImages.rowHeights = new int[]{0, 0}; gbl_endPieceImages.columnWeights = new double[]{1.0, 1.0}; gbl_endPieceImages.columnWidths = new int[]{0, 0}; GridBagConstraints gbc_endPieceImages = new GridBagConstraints(); gbc_endPieceImages.insets = new Insets(0, 0, 5, 5); gbc_endPieceImages.fill = GridBagConstraints.BOTH; gbc_endPieceImages.gridx = 0; gbc_endPieceImages.gridy = 5; multitilePanel.add(endPieceImages, gbc_endPieceImages); unconnectedImages = new ImageTuplePanel(frame); unconnectedImages.setToolTipText("Does not open, same as normal image."); GridBagLayout gbl_unconnectedImages = (GridBagLayout) unconnectedImages.getLayout(); gbl_unconnectedImages.rowWeights = new double[]{0.0, 1.0}; gbl_unconnectedImages.rowHeights = new int[]{0, 0}; gbl_unconnectedImages.columnWeights = new double[]{1.0, 1.0}; gbl_unconnectedImages.columnWidths = new int[]{0, 0}; GridBagConstraints gbc_unconnectedImages = new GridBagConstraints(); gbc_unconnectedImages.insets = new Insets(0, 0, 5, 0); gbc_unconnectedImages.fill = GridBagConstraints.BOTH; gbc_unconnectedImages.gridx = 1; gbc_unconnectedImages.gridy = 5; multitilePanel.add(unconnectedImages, gbc_unconnectedImages); cboxOpen = new JCheckBox("Open"); cboxOpen.addActionListener(openAdapter = new MagicCheckboxAdapter(InternalTile.class, "setOpen")); GridBagConstraints gbc_chckbxOpen = new GridBagConstraints(); gbc_chckbxOpen.anchor = GridBagConstraints.WEST; gbc_chckbxOpen.insets = new Insets(0, 0, 5, 5); gbc_chckbxOpen.gridx = 0; gbc_chckbxOpen.gridy = 6; multitilePanel.add(cboxOpen, gbc_chckbxOpen); cboxBroken = new JCheckBox("Broken"); cboxBroken.addActionListener(brokenAdapter = new MagicCheckboxAdapter(InternalTile.class, "setBroken")); GridBagConstraints gbc_chckbxBroken = new GridBagConstraints(); gbc_chckbxBroken.insets = new Insets(0, 0, 5, 0); gbc_chckbxBroken.anchor = GridBagConstraints.WEST; gbc_chckbxBroken.gridx = 1; gbc_chckbxBroken.gridy = 6; multitilePanel.add(cboxBroken, gbc_chckbxBroken); openImages = new ImageTuplePanel(frame); openImages.setToolTipText("Open"); GridBagLayout gbl_openImages = (GridBagLayout) openImages.getLayout(); gbl_openImages.rowWeights = new double[]{0.0, 1.0}; gbl_openImages.rowHeights = new int[]{0, 0}; gbl_openImages.columnWeights = new double[]{1.0, 1.0}; gbl_openImages.columnWidths = new int[]{0, 0}; GridBagConstraints gbc_openImages = new GridBagConstraints(); gbc_openImages.insets = new Insets(0, 0, 0, 5); gbc_openImages.fill = GridBagConstraints.BOTH; gbc_openImages.gridx = 0; gbc_openImages.gridy = 7; multitilePanel.add(openImages, gbc_openImages); brokenImages = new ImageTuplePanel(frame); brokenImages.setToolTipText("Broken"); GridBagLayout gbl_brokenImages = (GridBagLayout) brokenImages.getLayout(); gbl_brokenImages.rowWeights = new double[]{0.0, 1.0}; gbl_brokenImages.rowHeights = new int[]{0, 0}; gbl_brokenImages.columnWeights = new double[]{1.0, 1.0}; gbl_brokenImages.columnWidths = new int[]{0, 0}; GridBagConstraints gbc_brokenImages = new GridBagConstraints(); gbc_brokenImages.fill = GridBagConstraints.BOTH; gbc_brokenImages.gridx = 1; gbc_brokenImages.gridy = 7; multitilePanel.add(brokenImages, gbc_brokenImages); cboxRotates = new JCheckBox("Rotates"); cboxRotates.addActionListener(rotatesAdapter = new MagicCheckboxAdapter(InternalTile.class, "setRotates")); GridBagConstraints gbc_chckbxRotates = new GridBagConstraints(); gbc_chckbxRotates.insets = new Insets(0, 0, 5, 0); gbc_chckbxRotates.anchor = GridBagConstraints.WEST; gbc_chckbxRotates.gridx = 1; gbc_chckbxRotates.gridy = 1; add(cboxRotates, gbc_chckbxRotates); } public void setTilesetEntry(InternalTile tse) { this.tse = tse; doIdUpdate = false; lastId = null; idAdapter.setObject(this.tse); cornerAdapter.setObject(this.tse); edgeAdapter.setObject(this.tse); centerAdapter.setObject(this.tse); tconnAdapter.setObject(this.tse); endpAdapter.setObject(this.tse); unconnAdapter.setObject(this.tse); openAdapter.setObject(this.tse); brokenAdapter.setObject(this.tse); rotatesAdapter.setObject(this.tse); //update all the crap txtId.setText(tse.id); cboxRotates.setSelected(tse.rotates); cboxCorner.setSelected(tse.corner); cboxEdge.setSelected(tse.edge); cboxCenter.setSelected(tse.center); cboxTConnection.setSelected(tse.tConnection); cboxEndPiece.setSelected(tse.endPiece); cboxUnconnected.setSelected(tse.unconnected); cboxOpen.setSelected(tse.open); cboxBroken.setSelected(tse.broken); //update the image panels tileImages.setImageTuple(tse.image); cornerImages.setImageTuple(tse.cornerImage); edgeImages.setImageTuple(tse.edgeImage); centerImages.setImageTuple(tse.centerImage); tConnectionImages.setImageTuple(tse.tConnectionImage); endPieceImages.setImageTuple(tse.endPieceImage); unconnectedImages.setImageTuple(tse.unconnectedImage); openImages.setImageTuple(tse.openImage); brokenImages.setImageTuple(tse.brokenImage); doIdUpdate = true; updateId(); } @Override public Dimension getPreferredScrollableViewportSize() { return getPreferredSize(); } @Override public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { if(orientation == SwingConstants.VERTICAL) { return visibleRect.height / 24; } return visibleRect.width / 24; } @Override public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { if(orientation == SwingConstants.VERTICAL) { return visibleRect.height / 6; } return visibleRect.width / 6; } @Override public boolean getScrollableTracksViewportWidth() { return false; } @Override public boolean getScrollableTracksViewportHeight() { return false; } }