/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.pepsoft.worldpainter.layers.bo2; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.JSpinner.DefaultEditor; import javax.swing.KeyStroke; import javax.vecmath.Point3i; import org.pepsoft.worldpainter.ColourScheme; import org.pepsoft.worldpainter.objects.WPObject; /** * * @author pepijn */ public class OffsetEditor extends javax.swing.JDialog { /** * Creates new form OffsetEditor */ public OffsetEditor(Window parent, Point3i offset, WPObject object, ColourScheme colourScheme) { super(parent, ModalityType.DOCUMENT_MODAL); initComponents(); offsetViewer1.setObject(object); offsetViewer1.setOffset(offset); offsetViewer1.setColourScheme(colourScheme); spinnerX.setValue(offset.x); spinnerY.setValue(offset.y); spinnerZ.setValue(offset.z); ActionMap actionMap = rootPane.getActionMap(); actionMap.put("cancel", new AbstractAction("cancel") { @Override public void actionPerformed(ActionEvent e) { dispose(); } private static final long serialVersionUID = 1L; }); InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancel"); KeyListener listener = new KeyAdapter() { @Override public void keyTyped(KeyEvent e) { char c = e.getKeyChar(); if (c == 'l') { offsetViewer1.rotateLeft(); e.consume(); } else if (c == 'r') { offsetViewer1.rotateRight(); e.consume(); } } }; ((DefaultEditor) spinnerX.getEditor()).getTextField().addKeyListener(listener); ((DefaultEditor) spinnerY.getEditor()).getTextField().addKeyListener(listener); ((DefaultEditor) spinnerZ.getEditor()).getTextField().addKeyListener(listener); buttonOK.addKeyListener(listener); buttonCancel.addKeyListener(listener); jTextArea1.addKeyListener(listener); rootPane.setDefaultButton(buttonOK); pack(); setLocationRelativeTo(parent); } public boolean isCancelled() { return cancelled; } public Point3i getOffset() { return new Point3i((Integer) spinnerX.getValue(), (Integer) spinnerY.getValue(), (Integer) spinnerZ.getValue()); } private void updateOffsetViewer() { offsetViewer1.setOffset(getOffset()); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jLabel2 = new javax.swing.JLabel(); spinnerX = new javax.swing.JSpinner(); jLabel3 = new javax.swing.JLabel(); spinnerY = new javax.swing.JSpinner(); jLabel4 = new javax.swing.JLabel(); spinnerZ = new javax.swing.JSpinner(); buttonCancel = new javax.swing.JButton(); buttonOK = new javax.swing.JButton(); jPanel1 = new javax.swing.JPanel(); offsetViewer1 = new org.pepsoft.worldpainter.layers.bo2.OffsetViewer(); jTextArea1 = new javax.swing.JTextArea(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("Edit Offset"); jLabel2.setText("X axis (west to east):"); spinnerX.setModel(new javax.swing.SpinnerNumberModel(0, -999, 999, 1)); spinnerX.addChangeListener(this::spinnerXStateChanged); jLabel3.setText("Z axis (north to south):"); spinnerY.setModel(new javax.swing.SpinnerNumberModel(0, -999, 999, 1)); spinnerY.addChangeListener(this::spinnerYStateChanged); jLabel4.setText("Y axis (vertical):"); spinnerZ.setModel(new javax.swing.SpinnerNumberModel(0, -999, 999, 1)); spinnerZ.addChangeListener(this::spinnerZStateChanged); buttonCancel.setText("Cancel"); buttonCancel.addActionListener(this::buttonCancelActionPerformed); buttonOK.setText("OK"); buttonOK.addActionListener(this::buttonOKActionPerformed); jPanel1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED)); javax.swing.GroupLayout offsetViewer1Layout = new javax.swing.GroupLayout(offsetViewer1); offsetViewer1.setLayout(offsetViewer1Layout); offsetViewer1Layout.setHorizontalGroup( offsetViewer1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 300, Short.MAX_VALUE) ); offsetViewer1Layout.setVerticalGroup( offsetViewer1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 0, Short.MAX_VALUE) ); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(offsetViewer1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(offsetViewer1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); jTextArea1.setEditable(false); jTextArea1.setFont(jLabel2.getFont()); jTextArea1.setLineWrap(true); jTextArea1.setText("The dotted square indicates the \"origin\" of the object; i.e. the block that will be placed directly on the surface at the location of the object. You can change it by adjusting the offset. The dotted line indicates ground level.\n\nRotate the object by pressing L or R."); jTextArea1.setWrapStyleWord(true); jTextArea1.setBorder(null); jTextArea1.setOpaque(false); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel2) .addComponent(jLabel3) .addComponent(jLabel4)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(spinnerZ, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spinnerY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spinnerX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addComponent(jTextArea1)) .addGap(18, 18, 18) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) .addComponent(buttonOK) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(buttonCancel))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2) .addComponent(spinnerX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(spinnerY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel4) .addComponent(spinnerZ, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addComponent(jTextArea1, javax.swing.GroupLayout.PREFERRED_SIZE, 220, Short.MAX_VALUE)) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(buttonCancel) .addComponent(buttonOK)) .addContainerGap()) ); pack(); }// </editor-fold>//GEN-END:initComponents private void buttonOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonOKActionPerformed cancelled = false; dispose(); }//GEN-LAST:event_buttonOKActionPerformed private void buttonCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCancelActionPerformed dispose(); }//GEN-LAST:event_buttonCancelActionPerformed private void spinnerXStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerXStateChanged updateOffsetViewer(); }//GEN-LAST:event_spinnerXStateChanged private void spinnerYStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerYStateChanged updateOffsetViewer(); }//GEN-LAST:event_spinnerYStateChanged private void spinnerZStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerZStateChanged updateOffsetViewer(); }//GEN-LAST:event_spinnerZStateChanged // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton buttonCancel; private javax.swing.JButton buttonOK; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JPanel jPanel1; private javax.swing.JTextArea jTextArea1; private org.pepsoft.worldpainter.layers.bo2.OffsetViewer offsetViewer1; private javax.swing.JSpinner spinnerX; private javax.swing.JSpinner spinnerY; private javax.swing.JSpinner spinnerZ; // End of variables declaration//GEN-END:variables private boolean cancelled = true; private static final long serialVersionUID = 1L; }