org.pepsoft.worldpainter.ShiftWorldDialog Maven / Gradle / Ivy
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* RotateWorldDialog.java
*
* Created on Apr 14, 2012, 3:57:24 PM
*/
package org.pepsoft.worldpainter;
import org.pepsoft.util.ProgressReceiver;
import org.pepsoft.util.SubProgressReceiver;
import org.pepsoft.worldpainter.Dimension.Anchor;
import org.pepsoft.worldpainter.history.HistoryEntry;
import java.awt.*;
import java.util.List;
import static java.util.stream.Collectors.toList;
import static org.pepsoft.util.AwtUtils.doOnEventThread;
import static org.pepsoft.util.mdc.MDCUtils.decorateWithMdcContext;
import static org.pepsoft.util.swing.MessageUtils.beepAndShowWarning;
import static org.pepsoft.worldpainter.Dimension.Role.DETAIL;
import static org.pepsoft.worldpainter.ExceptionHandler.handleException;
/**
*
* @author pepijn
*/
@SuppressWarnings({"unused", "FieldCanBeLocal"}) // Managed by NetBeans
public class ShiftWorldDialog extends WorldPainterDialog implements ProgressReceiver {
/** Creates new form RotateWorldDialog */
public ShiftWorldDialog(Window parent, World2 world, Anchor anchor) {
super(parent);
this.world = world;
this.anchor = anchor;
affectedDimensions = world.getDimensions().stream()
.filter(dimension -> dimension.getAnchor().dim == anchor.dim)
.collect(toList());
initComponents();
setTitle("Shift " + new Anchor(anchor.dim, DETAIL, false, 0).getDefaultName() + " Dimension");
getRootPane().setDefaultButton(buttonShift);
scaleToUI();
pack();
setLocationRelativeTo(parent);
}
// ProgressReceiver
@Override
public synchronized void setProgress(final float progress) {
doOnEventThread(() -> jProgressBar1.setValue((int) (progress * 100)));
}
@Override
public synchronized void exceptionThrown(final Throwable exception) {
// Make sure to capture the MDC context from the current thread
final Throwable exceptionWithContext = decorateWithMdcContext(exception);
doOnEventThread(() -> {
handleException(exceptionWithContext, ShiftWorldDialog.this);
cancel();
});
}
@Override
public synchronized void done() {
doOnEventThread(() -> {
if (affectedDimensions.stream().flatMap(dimension -> dimension.getOverlays().stream()).anyMatch(overlay -> ! overlay.getFile().canRead())) {
beepAndShowWarning(this, "One or more overlay image files could not be read,\nand have therefore not been shifted.\nYou will need to shift these manually.", "Not All Overlays Shifted");
}
ok();
});
}
@Override
public synchronized void setMessage(final String message) {
doOnEventThread(() -> labelProgressMessage.setText(message));
}
@Override
public synchronized void checkForCancellation() {
// Do nothing
}
@Override
public void reset() {
doOnEventThread(() -> jProgressBar1.setValue(0));
}
@Override
public void subProgressStarted(SubProgressReceiver subProgressReceiver) {
// Do nothing
}
private void shift() {
buttonShift.setEnabled(false);
buttonCancel.setEnabled(false);
final int east = (Integer) jSpinner1.getValue(), south = (Integer) jSpinner2.getValue();
final CoordinateTransform transform = new Translation(east, south);
new Thread("World Shifter") {
@Override
public void run() {
try {
for (int i = 0; i < affectedDimensions.size(); i++) {
final Dimension dimension = affectedDimensions.get(i);
world.transform(dimension.getAnchor(), transform, new SubProgressReceiver(ShiftWorldDialog.this, (float) i / affectedDimensions.size(), 1.0f / affectedDimensions.size()));
world.addHistoryEntry(HistoryEntry.WORLD_DIMENSION_SHIFTED_HORIZONTALLY, dimension.getName(), east, south);
}
done();
} catch (Throwable t) {
exceptionThrown(t);
}
}
}.start();
}
private void setControlStates() {
buttonShift.setEnabled((((Integer) jSpinner1.getValue()) != 0) || (((Integer) jSpinner2.getValue()) != 0));
}
/** 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({"Convert2Lambda", "Anonymous2MethodRef"}) // Managed by NetBeans
// //GEN-BEGIN:initComponents
private void initComponents() {
buttonGroup1 = new javax.swing.ButtonGroup();
jLabel1 = new javax.swing.JLabel();
jProgressBar1 = new javax.swing.JProgressBar();
buttonCancel = new javax.swing.JButton();
buttonShift = new javax.swing.JButton();
labelProgressMessage = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jSpinner1 = new javax.swing.JSpinner();
jLabel3 = new javax.swing.JLabel();
jSpinner2 = new javax.swing.JSpinner();
jLabel4 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel();
jLabel7 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
setTitle("Shift World");
setResizable(false);
jLabel1.setText("Choose a shift amount and press the Shift button to shift the dimension horizontally (by whole tiles):");
buttonCancel.setText("Cancel");
buttonCancel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonCancelActionPerformed(evt);
}
});
buttonShift.setText("Shift");
buttonShift.setEnabled(false);
buttonShift.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonShiftActionPerformed(evt);
}
});
labelProgressMessage.setText(" ");
jLabel2.setText("X axis:");
jSpinner1.setModel(new javax.swing.SpinnerNumberModel(0, -2147483648, 2147483647, 128));
jSpinner1.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
jSpinner1StateChanged(evt);
}
});
jLabel3.setText("Z axis:");
jSpinner2.setModel(new javax.swing.SpinnerNumberModel(0, -2147483648, 2147483647, 128));
jSpinner2.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
jSpinner2StateChanged(evt);
}
});
jLabel4.setText("(negative values shift west; positive values shift east)");
jLabel5.setText("(negative values shift north; positive values shift south)");
jLabel6.setText("This operation cannot be undone! ");
jLabel7.setText("All associated dimension such as Ceiling Dimensions and
\nCustom Cave/Tunnel Floor Dimensions will be shifted together.");
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)
.addComponent(jProgressBar1, javax.swing.GroupLayout.Alignment.TRAILING, 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(buttonShift)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(buttonCancel))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel1)
.addComponent(labelProgressMessage)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel2)
.addComponent(jLabel3))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jSpinner2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel5))
.addGroup(layout.createSequentialGroup()
.addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel4))))
.addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel4))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel3)
.addComponent(jSpinner2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel5))
.addGap(18, 18, 18)
.addComponent(labelProgressMessage)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(buttonCancel)
.addComponent(buttonShift))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pack();
}// //GEN-END:initComponents
private void buttonCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCancelActionPerformed
cancel();
}//GEN-LAST:event_buttonCancelActionPerformed
private void buttonShiftActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonShiftActionPerformed
shift();
}//GEN-LAST:event_buttonShiftActionPerformed
private void jSpinner1StateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jSpinner1StateChanged
int value = (Integer) jSpinner1.getValue();
if ((value % 128 ) != 0) {
jSpinner1.setValue(Math.round(value / 128f) * 128);
}
setControlStates();
}//GEN-LAST:event_jSpinner1StateChanged
private void jSpinner2StateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jSpinner2StateChanged
int value = (Integer) jSpinner2.getValue();
if ((value % 128 ) != 0) {
jSpinner2.setValue(Math.round(value / 128f) * 128);
}
setControlStates();
}//GEN-LAST:event_jSpinner2StateChanged
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton buttonCancel;
private javax.swing.ButtonGroup buttonGroup1;
private javax.swing.JButton buttonShift;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JProgressBar jProgressBar1;
private javax.swing.JSpinner jSpinner1;
private javax.swing.JSpinner jSpinner2;
private javax.swing.JLabel labelProgressMessage;
// End of variables declaration//GEN-END:variables
private final World2 world;
private final Anchor anchor;
private final List affectedDimensions;
private static final long serialVersionUID = 1L;
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy