/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* ExportWorldDialog.java
*
* Created on Mar 29, 2011, 5:09:50 PM
*/
package org.pepsoft.worldpainter;
import org.pepsoft.minecraft.Level;
import org.pepsoft.util.DesktopUtils;
import org.pepsoft.util.FileUtils;
import org.pepsoft.worldpainter.biomeschemes.CustomBiomeManager;
import org.pepsoft.worldpainter.layers.Layer;
import org.pepsoft.worldpainter.merging.WorldMerger;
import org.pepsoft.worldpainter.util.MinecraftUtil;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.filechooser.FileFilter;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import static org.pepsoft.worldpainter.Constants.*;
/**
*
* @author pepijn
*/
// TODO: add support for multiple dimensions
public class MergeWorldDialog extends WorldPainterDialog {
/** Creates new form ExportWorldDialog */
public MergeWorldDialog(Window parent, World2 world, BiomeScheme biomeScheme, ColourScheme colourScheme, CustomBiomeManager customBiomeManager, Collection<Layer> hiddenLayers, boolean contourLines, int contourSeparation, TileRenderer.LightOrigin lightOrigin, WorldPainter view) {
super(parent);
this.world = world;
this.biomeScheme = biomeScheme;
this.colourScheme = colourScheme;
this.hiddenLayers = hiddenLayers;
this.contourLines = contourLines;
this.contourSeparation = contourSeparation;
this.lightOrigin = lightOrigin;
this.customBiomeManager = customBiomeManager;
this.view = view;
selectedTiles = world.getTilesToExport();
selectedDimension = (selectedTiles != null) ? world.getDimensionsToExport().iterator().next() : DIM_NORMAL;
initComponents();
Configuration config = Configuration.getInstance();
if (world.getMergedWith() != null) {
fieldLevelDatFile.setText(world.getMergedWith().getAbsolutePath());
} else if (world.getImportedFrom() != null) {
fieldLevelDatFile.setText(world.getImportedFrom().getAbsolutePath());
} else if ((config != null) && (config.getSavesDirectory() != null)) {
fieldLevelDatFile.setText(config.getSavesDirectory().getAbsolutePath());
} else {
File minecraftDir = MinecraftUtil.findMinecraftDir();
if (minecraftDir != null) {
fieldLevelDatFile.setText(new File(minecraftDir, "saves").getAbsolutePath());
} else {
fieldLevelDatFile.setText(DesktopUtils.getDocumentsFolder().getAbsolutePath());
}
}
((SpinnerNumberModel) spinnerSurfaceThickness.getModel()).setMaximum(world.getMaxHeight());
if (selectedTiles != null) {
radioButtonExportSelection.setText("merge " + selectedTiles.size() + " selected tiles");
radioButtonExportSelection.setSelected(true);
checkBoxSurface.setSelected(selectedDimension == DIM_NORMAL);
checkBoxNether.setSelected(selectedDimension == DIM_NETHER);
checkBoxEnd.setSelected(selectedDimension == DIM_END);
} else if (world.getDimensionsToExport() != null) {
checkBoxSurface.setSelected(world.getDimensionsToExport().contains(DIM_NORMAL));
checkBoxNether.setSelected(world.getDimensionsToExport().contains(DIM_NETHER));
checkBoxEnd.setSelected(world.getDimensionsToExport().contains(DIM_END));
} else {
checkBoxSurface.setSelected(world.getDimension(DIM_NORMAL) != null);
checkBoxNether.setSelected(world.getDimension(DIM_NETHER) != null);
checkBoxEnd.setSelected(world.getDimension(DIM_END) != null);
}
DocumentListener documentListener = new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
setControlStates();
}
@Override
public void removeUpdate(DocumentEvent e) {
setControlStates();
}
@Override
public void changedUpdate(DocumentEvent e) {
setControlStates();
}
};
fieldLevelDatFile.getDocument().addDocumentListener(documentListener);
setLocationRelativeTo(parent);
rootPane.setDefaultButton(buttonMerge);
setControlStates();
pack();
}
private void merge() {
StringBuilder sb = new StringBuilder("<html>Please confirm that you want to merge the world<br>notwithstanding the following warnings:<br><ul>");
boolean showWarning = false;
if ((radioButtonExportSelection.isSelected()) && (! disableWarning)) {
String dim;
switch (selectedDimension) {
case DIM_NORMAL:
dim = "Surface";
break;
case DIM_NETHER:
dim = "Nether";
break;
case DIM_END:
dim = "End";
break;
default:
throw new InternalError();
}
sb.append("<li>A tile selection is active! Only " + selectedTiles.size() + " tiles of the<br>" + dim + " dimension are going to be merged.");
showWarning = showWarning || (! disableWarning);
}
sb.append("</ul>Do you want to continue with the merge?</html>");
if (showWarning && (JOptionPane.showConfirmDialog(this, sb.toString(), "Review Warnings", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) != JOptionPane.YES_OPTION)) {
return;
}
final boolean biomesOnly = radioButtonBiomes.isSelected();
final boolean replaceChunks = radioButtonReplaceChunks.isSelected();
fieldLevelDatFile.setEnabled(false);
buttonSelectDirectory.setEnabled(false);
buttonMerge.setEnabled(false);
radioButtonAll.setEnabled(false);
radioButtonBiomes.setEnabled(false);
radioButtonReplaceChunks.setEnabled(false);
radioButtonExportEverything.setEnabled(false);
radioButtonExportSelection.setEnabled(false);
checkBoxFillCaves.setEnabled(false);
checkBoxRemoveManMadeAboveGround.setEnabled(false);
checkBoxRemoveManMadeBelowGround.setEnabled(false);
checkBoxRemoveResources.setEnabled(false);
checkBoxRemoveTrees.setEnabled(false);
checkBoxRemoveVegetation.setEnabled(false);
spinnerSurfaceThickness.setEnabled(false);
labelSelectTiles.setForeground(null);
labelSelectTiles.setCursor(null);
checkBoxSurface.setEnabled(false);
checkBoxNether.setEnabled(false);
checkBoxEnd.setEnabled(false);
Configuration config = Configuration.getInstance();
config.setSavesDirectory(levelDatFile.getParentFile().getParentFile());
config.setMergeWarningDisplayed(true);
world.setImportedFrom(levelDatFile);
if (radioButtonExportEverything.isSelected()) {
Set<Integer> dimensionsToExport = new HashSet<>();
if (checkBoxSurface.isSelected()) {
dimensionsToExport.add(DIM_NORMAL);
}
if (checkBoxNether.isSelected()) {
dimensionsToExport.add(DIM_NETHER);
}
if (checkBoxEnd.isSelected()) {
dimensionsToExport.add(DIM_END);
}
boolean allDimensionsSelected = true;
for (Dimension dimension: world.getDimensions()) {
if (! dimensionsToExport.contains(dimension.getDim())) {
allDimensionsSelected = false;
break;
}
}
world.setDimensionsToExport(allDimensionsSelected ? null : dimensionsToExport);
world.setTilesToExport(null);
} else {
world.setDimensionsToExport(Collections.singleton(selectedDimension));
world.setTilesToExport(selectedTiles);
}
WorldMerger merger = new WorldMerger(world, levelDatFile);
synchronized (merger) {
try {
backupDir = merger.selectBackupDir(levelDatFile.getParentFile());
} catch (IOException e) {
throw new RuntimeException("I/O error while creating backup directory", e);
}
if (! biomesOnly) {
if (replaceChunks) {
merger.setReplaceChunks(true);
} else {
merger.setClearManMadeAboveGround(checkBoxRemoveManMadeAboveGround.isSelected());
merger.setClearManMadeBelowGround(checkBoxRemoveManMadeBelowGround.isSelected());
merger.setClearResources(checkBoxRemoveResources.isSelected());
merger.setClearTrees(checkBoxRemoveTrees.isSelected());
merger.setClearVegetation(checkBoxRemoveVegetation.isSelected());
merger.setFillCaves(checkBoxFillCaves.isSelected());
merger.setSurfaceMergeDepth((Integer) spinnerSurfaceThickness.getValue());
}
}
}
setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
MergeProgressDialog dialog = new MergeProgressDialog(this, merger, backupDir, biomesOnly);
view.setInhibitUpdates(true);
try {
dialog.setVisible(true);
} finally {
view.setInhibitUpdates(false);
}
synchronized (merger) {
if (merger.getWarnings() != null) {
Icon warningIcon = UIManager.getIcon("OptionPane.warningIcon");
Toolkit.getDefaultToolkit().beep();
int selectedOption = JOptionPane.showOptionDialog(MergeWorldDialog.this, "The merge process generated warnings! The existing map may have had pre-\nexisting damage or corruption. Not all chunks may have been merged correctly.", "Merge Warnings", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, warningIcon, new Object[] {"Review warnings", "OK"}, null);
if (selectedOption == 0) {
ImportWarningsDialog warningsDialog = new ImportWarningsDialog(MergeWorldDialog.this, "Merge Warnings");
warningsDialog.setWarnings(merger.getWarnings());
warningsDialog.setVisible(true);
}
}
}
ok();
}
private void setControlStates() {
File file = new File(fieldLevelDatFile.getText().trim());
boolean levelDatSelected = file.isFile() && (file.getName().equalsIgnoreCase("level.dat"));
if (levelDatSelected) {
levelDatFile = file;
try {
Level level = Level.load(levelDatFile);
if (level.getVersion() != org.pepsoft.minecraft.Constants.SUPPORTED_VERSION_2) {
if (radioButtonBiomes.isSelected()) {
radioButtonAll.setSelected(true);
}
radioButtonBiomes.setEnabled(false);
} else {
radioButtonBiomes.setEnabled(true);
}
} catch (IOException e) {
throw new RuntimeException("I/O error while loading level.dat", e);
}
}
boolean mergeAll = radioButtonAll.isSelected();
boolean mergeBiomesOnly = radioButtonBiomes.isSelected();
boolean mergeEverything = radioButtonExportEverything.isSelected();
boolean surfacePresent = world.getDimension(DIM_NORMAL) != null;
boolean netherPresent = world.getDimension(DIM_NETHER) != null;
boolean endPresent = world.getDimension(DIM_END) != null;
boolean oneDimensionPresent = world.getDimensions().length == 1;
radioButtonExportEverything.setEnabled(! mergeBiomesOnly);
radioButtonExportSelection.setEnabled(! mergeBiomesOnly);
checkBoxFillCaves.setEnabled(mergeAll);
checkBoxRemoveManMadeAboveGround.setEnabled(mergeAll);
checkBoxRemoveManMadeBelowGround.setEnabled(mergeAll);
checkBoxRemoveResources.setEnabled(mergeAll);
checkBoxRemoveTrees.setEnabled(mergeAll);
checkBoxRemoveVegetation.setEnabled(mergeAll);
spinnerSurfaceThickness.setEnabled(mergeAll);
checkBoxSurface.setEnabled(mergeEverything && (! mergeBiomesOnly) && surfacePresent && (! oneDimensionPresent));
checkBoxNether.setEnabled(mergeEverything && (! mergeBiomesOnly) && netherPresent && (! oneDimensionPresent));
checkBoxEnd.setEnabled(mergeEverything && (! mergeBiomesOnly) && endPresent && (! oneDimensionPresent));
buttonMerge.setEnabled(levelDatSelected && (checkBoxSurface.isSelected() || checkBoxNether.isSelected() || checkBoxEnd.isSelected()));
if (radioButtonExportSelection.isSelected()) {
labelSelectTiles.setForeground(Color.BLUE);
labelSelectTiles.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
} else {
labelSelectTiles.setForeground(null);
labelSelectTiles.setCursor(null);
}
}
private void selectLevelDatFile() {
File file = new File(fieldLevelDatFile.getText().trim());
file = FileUtils.selectFileForOpen(this, "Select Minecraft map level.dat file", file.exists() ? file : null, new FileFilter() {
@Override
public boolean accept(File f) {
return f.isDirectory() || f.getName().equalsIgnoreCase("level.dat");
}
@Override
public String getDescription() {
return "Minecraft level.dat files";
}
});
if (file != null) {
fieldLevelDatFile.setText(file.getAbsolutePath());
}
}
private void selectTiles() {
if (radioButtonExportSelection.isSelected() && (! radioButtonBiomes.isSelected())) {
ExportTileSelectionDialog dialog = new ExportTileSelectionDialog(this, world, selectedDimension, selectedTiles, colourScheme, biomeScheme, customBiomeManager, hiddenLayers, contourLines, contourSeparation, lightOrigin);
dialog.setVisible(true);
selectedDimension = dialog.getSelectedDimension();
checkBoxSurface.setSelected(selectedDimension == DIM_NORMAL);
checkBoxNether.setSelected(selectedDimension == DIM_NETHER);
checkBoxEnd.setSelected(selectedDimension == DIM_END);
selectedTiles = dialog.getSelectedTiles();
radioButtonExportSelection.setText("merge " + selectedTiles.size() + " selected tiles");
pack();
setControlStates();
disableWarning = true;
}
}
/** 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() {
buttonGroup1 = new javax.swing.ButtonGroup();
buttonGroup2 = new javax.swing.ButtonGroup();
jLabel2 = new javax.swing.JLabel();
fieldLevelDatFile = new javax.swing.JTextField();
buttonSelectDirectory = new javax.swing.JButton();
buttonMerge = new javax.swing.JButton();
radioButtonAll = new javax.swing.JRadioButton();
radioButtonBiomes = new javax.swing.JRadioButton();
radioButtonReplaceChunks = new javax.swing.JRadioButton();
radioButtonExportEverything = new javax.swing.JRadioButton();
radioButtonExportSelection = new javax.swing.JRadioButton();
labelSelectTiles = new javax.swing.JLabel();
jLabel1 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel();
checkBoxRemoveTrees = new javax.swing.JCheckBox();
checkBoxRemoveVegetation = new javax.swing.JCheckBox();
checkBoxRemoveManMadeAboveGround = new javax.swing.JCheckBox();
checkBoxRemoveResources = new javax.swing.JCheckBox();
checkBoxFillCaves = new javax.swing.JCheckBox();
checkBoxRemoveManMadeBelowGround = new javax.swing.JCheckBox();
jLabel7 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jLabel8 = new javax.swing.JLabel();
spinnerSurfaceThickness = new javax.swing.JSpinner();
jLabel9 = new javax.swing.JLabel();
checkBoxSurface = new javax.swing.JCheckBox();
checkBoxNether = new javax.swing.JCheckBox();
checkBoxEnd = new javax.swing.JCheckBox();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Merging");
jLabel2.setText("Existing map to merge with:");
fieldLevelDatFile.setText("jTextField1");
buttonSelectDirectory.setText("...");
buttonSelectDirectory.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonSelectDirectoryActionPerformed(evt);
}
});
buttonMerge.setText("Merge");
buttonMerge.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonMergeActionPerformed(evt);
}
});
buttonGroup1.add(radioButtonAll);
radioButtonAll.setSelected(true);
radioButtonAll.setText("Merge old and new chunks");
radioButtonAll.setToolTipText("Will merge everything (terrain type and height changes, new layers, biome changes, etc.). Takes a very long time.");
radioButtonAll.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
radioButtonAllActionPerformed(evt);
}
});
buttonGroup1.add(radioButtonBiomes);
radioButtonBiomes.setText("Only change the biomes (for the entire Surface dimension)");
radioButtonBiomes.setToolTipText("<html>Will merge <i>only</i> biome changes. Ignores the read-only layer. Much quicker than merging everything, and with no side effects.</html>");
radioButtonBiomes.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
radioButtonBiomesActionPerformed(evt);
}
});
buttonGroup1.add(radioButtonReplaceChunks);
radioButtonReplaceChunks.setText("Completely replace chunks with new chunks");
radioButtonReplaceChunks.setToolTipText("<html><i>This will </i>replace<i> all non-read-only chunks,<br>destroying everything that's there in the existing map! </i></html>");
radioButtonReplaceChunks.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
radioButtonReplaceChunksActionPerformed(evt);
}
});
buttonGroup2.add(radioButtonExportEverything);
radioButtonExportEverything.setSelected(true);
radioButtonExportEverything.setText("Merge everything");
radioButtonExportEverything.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
radioButtonExportEverythingActionPerformed(evt);
}
});
buttonGroup2.add(radioButtonExportSelection);
radioButtonExportSelection.setText("merge selected tiles");
radioButtonExportSelection.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
radioButtonExportSelectionActionPerformed(evt);
}
});
labelSelectTiles.setText("<html><u>select tiles</u></html>");
labelSelectTiles.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
labelSelectTilesMouseClicked(evt);
}
});
jLabel1.setText("Choose which part of the map to merge:");
jLabel4.setText("Choose what kind of merge to perform:");
jLabel5.setText("<html>Options for the existing map (<b>non-read-only</b> chunks in <b>selected tiles</b> only):</html>");
jLabel6.setText("<html><b>Above</b> ground:</html>");
checkBoxRemoveTrees.setText("Remove all trees and huge mushrooms");
checkBoxRemoveTrees.setToolTipText("Removes all wood and leaf blocks, as wells as cocoa plants, vines and saplings.");
checkBoxRemoveVegetation.setText("Remove all other vegetation and crops");
checkBoxRemoveVegetation.setToolTipText("Removes all tall grass, flowers, mushrooms, nether wart, pumpkins and melons, carrots and potatoes, wheat, etc.");
checkBoxRemoveManMadeAboveGround.setText("Remove all man-made structures");
checkBoxRemoveManMadeAboveGround.setToolTipText("Removes any block which cannot occur naturally, above ground.");
checkBoxRemoveResources.setText("Remove all resources/ores");
checkBoxRemoveResources.setToolTipText("Replaces all resource/ore blocks with stone (or netherrack in the case of quartz).");
checkBoxFillCaves.setText("Fill in all caves and other hollow spaces");
checkBoxFillCaves.setToolTipText("<html>Replaces all air, water, lava and other insubstantial blocks with stone.<br>\nTo replace man-made blocks as well, use \"remove all man-made structures\" also.</html>");
checkBoxRemoveManMadeBelowGround.setText("Remove all man-made structures");
checkBoxRemoveManMadeBelowGround.setToolTipText("Replaces any block which cannot occur naturally with stone or air, below ground.");
jLabel7.setText("<html><b>Below</b> ground:</html>");
jLabel3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/pepsoft/worldpainter/icons/error.png"))); // NOI18N
jLabel3.setText(" ");
jLabel3.setToolTipText("<html>This removes <em>all</em> wood and leaf blocks, including man-made ones!<br>\nWorldPainter can't tell the difference between natural and man-made wood blocks.<br>\nBe sure to protect your builds with the Read-Only layer.</html>");
jLabel8.setText("Thickness of surface layer to replace:");
spinnerSurfaceThickness.setModel(new javax.swing.SpinnerNumberModel(3, 1, 256, 1));
jLabel9.setText("blocks");
checkBoxSurface.setText("Surface");
checkBoxSurface.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
checkBoxSurfaceActionPerformed(evt);
}
});
checkBoxNether.setText("Nether");
checkBoxNether.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
checkBoxNetherActionPerformed(evt);
}
});
checkBoxEnd.setText("End");
checkBoxEnd.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
checkBoxEndActionPerformed(evt);
}
});
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)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(fieldLevelDatFile)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(buttonSelectDirectory))
.addComponent(buttonMerge, javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel2)
.addComponent(jLabel4)
.addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(layout.createSequentialGroup()
.addGap(12, 12, 12)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(radioButtonBiomes)
.addComponent(radioButtonAll)
.addComponent(radioButtonReplaceChunks))))
.addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addGap(12, 12, 12)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(checkBoxRemoveTrees)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel3))
.addComponent(checkBoxRemoveVegetation)
.addComponent(checkBoxRemoveManMadeAboveGround)
.addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(0, 0, 0)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(checkBoxRemoveManMadeBelowGround)
.addComponent(checkBoxFillCaves)
.addComponent(checkBoxRemoveResources))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel8)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(spinnerSurfaceThickness, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, 0)
.addComponent(jLabel9))
.addGroup(layout.createSequentialGroup()
.addComponent(radioButtonExportEverything)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(radioButtonExportSelection)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(labelSelectTiles, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(jLabel1)
.addGroup(layout.createSequentialGroup()
.addComponent(checkBoxSurface)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(checkBoxNether)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(checkBoxEnd)))
.addGap(0, 0, Short.MAX_VALUE))))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(fieldLevelDatFile, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(buttonSelectDirectory))
.addGap(18, 18, 18)
.addComponent(jLabel4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(radioButtonAll)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(radioButtonReplaceChunks)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(radioButtonBiomes)
.addGap(18, 18, 18)
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(radioButtonExportEverything)
.addComponent(radioButtonExportSelection)
.addComponent(labelSelectTiles, 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(checkBoxSurface)
.addComponent(checkBoxNether)
.addComponent(checkBoxEnd))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel8)
.addComponent(spinnerSurfaceThickness, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel9))
.addGap(18, 18, 18)
.addComponent(jLabel5, 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(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))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(checkBoxRemoveTrees)
.addComponent(checkBoxRemoveResources)
.addComponent(jLabel3))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(checkBoxRemoveVegetation)
.addComponent(checkBoxFillCaves))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(checkBoxRemoveManMadeAboveGround)
.addComponent(checkBoxRemoveManMadeBelowGround))
.addGap(18, 18, Short.MAX_VALUE)
.addComponent(buttonMerge)
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void buttonMergeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonMergeActionPerformed
merge();
}//GEN-LAST:event_buttonMergeActionPerformed
private void buttonSelectDirectoryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSelectDirectoryActionPerformed
selectLevelDatFile();
}//GEN-LAST:event_buttonSelectDirectoryActionPerformed
private void radioButtonExportEverythingActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioButtonExportEverythingActionPerformed
setControlStates();
}//GEN-LAST:event_radioButtonExportEverythingActionPerformed
private void radioButtonExportSelectionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioButtonExportSelectionActionPerformed
if (radioButtonExportSelection.isSelected()) {
selectTiles();
} else {
setControlStates();
}
}//GEN-LAST:event_radioButtonExportSelectionActionPerformed
private void labelSelectTilesMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_labelSelectTilesMouseClicked
selectTiles();
}//GEN-LAST:event_labelSelectTilesMouseClicked
private void radioButtonAllActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioButtonAllActionPerformed
setControlStates();
}//GEN-LAST:event_radioButtonAllActionPerformed
private void radioButtonBiomesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioButtonBiomesActionPerformed
setControlStates();
}//GEN-LAST:event_radioButtonBiomesActionPerformed
private void radioButtonReplaceChunksActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioButtonReplaceChunksActionPerformed
setControlStates();
}//GEN-LAST:event_radioButtonReplaceChunksActionPerformed
private void checkBoxSurfaceActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBoxSurfaceActionPerformed
setControlStates();
}//GEN-LAST:event_checkBoxSurfaceActionPerformed
private void checkBoxNetherActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBoxNetherActionPerformed
setControlStates();
}//GEN-LAST:event_checkBoxNetherActionPerformed
private void checkBoxEndActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBoxEndActionPerformed
setControlStates();
}//GEN-LAST:event_checkBoxEndActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.ButtonGroup buttonGroup1;
private javax.swing.ButtonGroup buttonGroup2;
private javax.swing.JButton buttonMerge;
private javax.swing.JButton buttonSelectDirectory;
private javax.swing.JCheckBox checkBoxEnd;
private javax.swing.JCheckBox checkBoxFillCaves;
private javax.swing.JCheckBox checkBoxNether;
private javax.swing.JCheckBox checkBoxRemoveManMadeAboveGround;
private javax.swing.JCheckBox checkBoxRemoveManMadeBelowGround;
private javax.swing.JCheckBox checkBoxRemoveResources;
private javax.swing.JCheckBox checkBoxRemoveTrees;
private javax.swing.JCheckBox checkBoxRemoveVegetation;
private javax.swing.JCheckBox checkBoxSurface;
private javax.swing.JTextField fieldLevelDatFile;
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.JLabel jLabel8;
private javax.swing.JLabel jLabel9;
private javax.swing.JLabel labelSelectTiles;
private javax.swing.JRadioButton radioButtonAll;
private javax.swing.JRadioButton radioButtonBiomes;
private javax.swing.JRadioButton radioButtonExportEverything;
private javax.swing.JRadioButton radioButtonExportSelection;
private javax.swing.JRadioButton radioButtonReplaceChunks;
private javax.swing.JSpinner spinnerSurfaceThickness;
// End of variables declaration//GEN-END:variables
private final World2 world;
private final BiomeScheme biomeScheme;
private final ColourScheme colourScheme;
private final Collection<Layer> hiddenLayers;
private final boolean contourLines;
private final int contourSeparation;
private final TileRenderer.LightOrigin lightOrigin;
private final CustomBiomeManager customBiomeManager;
private final WorldPainter view;
private File levelDatFile;
private volatile File backupDir;
private int selectedDimension;
private Set<Point> selectedTiles;
private boolean disableWarning;
private static final long serialVersionUID = 1L;
}