/* * To change this template, choose Tools | Templates * and open the template in the editor. */ /* * ImportHeightMapDialog.java * * Created on 22-jan-2012, 19:47:55 */ package org.pepsoft.worldpainter; import org.pepsoft.util.FileUtils; import org.pepsoft.util.ProgressReceiver; import org.pepsoft.util.ProgressReceiver.OperationCancelled; import org.pepsoft.util.swing.ProgressDialog; import org.pepsoft.util.swing.ProgressTask; import org.pepsoft.worldpainter.heightMaps.*; import org.pepsoft.worldpainter.importing.HeightMapImporter; import org.pepsoft.worldpainter.layers.Void; import org.pepsoft.worldpainter.themes.SimpleTheme; import org.pepsoft.worldpainter.themes.impl.simple.SimpleThemeEditor; import org.pepsoft.worldpainter.themes.Theme; import javax.imageio.ImageIO; import javax.swing.*; import javax.swing.JSpinner.NumberEditor; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.filechooser.FileFilter; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.WritableRaster; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import java.util.Random; import java.util.Set; import static org.pepsoft.minecraft.Constants.DEFAULT_MAX_HEIGHT_1; import static org.pepsoft.minecraft.Constants.DEFAULT_MAX_HEIGHT_2; /** * * @author pepijn */ public class ImportHeightMapDialog extends WorldPainterDialog implements DocumentListener, SimpleThemeEditor.ChangeListener { public ImportHeightMapDialog(Window parent, ColourScheme colourScheme) { this(parent, null, colourScheme); } public ImportHeightMapDialog(Window parent, Dimension currentDimension, ColourScheme colourScheme) { super(parent); this.currentDimension = currentDimension; tileFactory = (currentDimension != null) ? (HeightMapTileFactory) currentDimension.getTileFactory() : TileFactoryFactory.createNoiseTileFactory(new Random().nextLong(), Terrain.GRASS, DEFAULT_MAX_HEIGHT_2, 58, 62, false, true, 20, 1.0); initComponents(); heightMapTileFactoryEditor1.setColourScheme(colourScheme); heightMapTileFactoryEditor1.setTheme((SimpleTheme) tileFactory.getTheme()); heightMapTileFactoryEditor1.setChangeListener(this); spinnerOffsetX.setEditor(new NumberEditor(spinnerOffsetX, "0")); spinnerOffsetY.setEditor(new NumberEditor(spinnerOffsetY, "0")); checkBoxCreateTiles.setSelected(true); labelWarning.setVisible(false); fieldFilename.getDocument().addDocumentListener(this); rootPane.setDefaultButton(buttonOk); if (currentDimension != null) { comboBoxHeight.setSelectedItem(Integer.toString(currentDimension.getMaxHeight())); comboBoxHeight.setEnabled(false); Theme theme = tileFactory.getTheme(); buttonResetDefaults.setEnabled(false); spinnerWorldMiddle.setValue(theme.getWaterHeight()); buttonLoadDefaults.setEnabled(true); buttonSaveAsDefaults.setEnabled(true); } else { labelNoUndo.setText(" "); checkBoxCreateTiles.setEnabled(false); checkBoxOnlyRaise.setEnabled(false); loadDefaults(); } pack(); setLocationRelativeTo(parent); setControlStates(); } public World2 getImportedWorld() { if (currentDimension != null) { throw new IllegalStateException(); } final HeightMapImporter importer = new HeightMapImporter(); HeightMap heightMap = new BitmapHeightMap(selectedFile.getName(), image, 0, selectedFile, false, false); int scale = (Integer) spinnerScale.getValue(); int offsetX = (Integer) spinnerOffsetX.getValue(); int offsetY = (Integer) spinnerOffsetY.getValue(); if ((scale != 100) || (offsetX != 0) || (offsetY != 0)) { ((BitmapHeightMap) heightMap).setSmoothScaling(true); heightMap = new TransformingHeightMap(heightMap.getName() + " transformed", heightMap, scale, scale, offsetX, offsetY, 0); } if (checkBoxInvert.isSelected()) { if (image.getSampleModel().getSampleSize(0) == 16) { heightMap = new DifferenceHeightMap(new ConstantHeightMap(65535f), heightMap); } else { heightMap = new DifferenceHeightMap(new ConstantHeightMap(255f), heightMap); } } importer.setHeightMap(heightMap); importer.setImageFile(selectedFile); String name = selectedFile.getName(); int p = name.lastIndexOf('.'); if (p != -1) { name = name.substring(0, p); } importer.setName(name); importer.setTileFactory(tileFactory); importer.setMaxHeight(Integer.parseInt((String) comboBoxHeight.getSelectedItem())); importer.setImageLowLevel((Integer) spinnerImageLow.getValue()); importer.setImageHighLevel((Integer) spinnerImageHigh.getValue()); importer.setWorldLowLevel((Integer) spinnerWorldLow.getValue()); importer.setWorldWaterLevel((Integer) spinnerWorldMiddle.getValue()); importer.setWorldHighLevel((Integer) spinnerWorldHigh.getValue()); importer.setVoidBelowLevel(checkBoxVoid.isSelected() ? ((Integer) spinnerVoidBelow.getValue()) : 0); World2 world = ProgressDialog.executeTask(this, new ProgressTask<World2>() { @Override public String getName() { return "Importing height map"; } @Override public World2 execute(ProgressReceiver progressReceiver) throws OperationCancelled { return importer.importToNewWorld(progressReceiver); } }, false); Configuration.getInstance().setHeightMapsDirectory(selectedFile.getParentFile()); return world; } // DocumentListener @Override public void insertUpdate(DocumentEvent e) { setControlStates(); } @Override public void removeUpdate(DocumentEvent e) { setControlStates(); } @Override public void changedUpdate(DocumentEvent e) { setControlStates(); } // SimpleThemeEditor.ChangeListener @Override public void settingsModified(SimpleThemeEditor editor) { if (currentDimension != null) { buttonResetDefaults.setEnabled(true); } buttonSaveAsDefaults.setEnabled(true); buttonLoadDefaults.setEnabled(true); } private void setControlStates() { File file = new File(fieldFilename.getText()); if (file.isFile() && ((selectedFile == null) || (! file.equals(selectedFile)))) { selectedFile = file; loadImage(); } boolean fileSelected = (selectedFile != null) && selectedFile.isFile(); buttonOk.setEnabled(fileSelected); } private void loadImage() { try { image = null; // Set image to null first to make more memory available for loading the new image image = ImageIO.read(selectedFile); if (image == null) { labelImageDimensions.setForeground(Color.RED); labelImageDimensions.setText("Not an image file, or damaged file!"); selectedFile = null; } else if ((image.getType() == BufferedImage.TYPE_BYTE_BINARY) || (image.getType() == BufferedImage.TYPE_BYTE_INDEXED)) { labelImageDimensions.setForeground(Color.RED); labelImageDimensions.setText("Indexed image not supported! Please convert to non-indexed."); selectedFile = null; } else if (image.isAlphaPremultiplied()) { labelImageDimensions.setForeground(Color.RED); labelImageDimensions.setText("Premultiplied alpha not supported! Please convert to non-premultiplied."); selectedFile = null; } else { if (image.getType() == BufferedImage.TYPE_CUSTOM) { spinnerScale.setValue(100); spinnerScale.setEnabled(false); spinnerScale.setToolTipText("<html>Scaling not supported for grey scale images with an alpha channel!<br>To enable scaling, please remove the alpha channel.</html>"); } else { spinnerScale.setEnabled(true); spinnerScale.setToolTipText(null); } labelImageDimensions.setForeground(null); int width = image.getWidth(), height = image.getHeight(); bitDepth = image.getSampleModel().getSampleSize(0); WritableRaster raster = image.getRaster(); imageLowValue = Integer.MAX_VALUE; imageHighValue = Integer.MIN_VALUE; outer: for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { int value = raster.getSample(x, y, 0); if (value < imageLowValue) { imageLowValue = value; } if (value > imageHighValue) { imageHighValue = value; } if ((imageLowValue == 0) && ((bitDepth == 16) ? (imageHighValue == 65535) : (imageHighValue == 255))) { // No point in looking any further! break outer; } } } ((SpinnerNumberModel) spinnerImageHigh.getModel()).setMaximum((bitDepth == 16) ? 65535 : 255); int maxHeight; boolean highRes = false; if (currentDimension == null) { // Determine maxHeight and whether to default to scaled mode if (imageHighValue < 256) { maxHeight = 256; } else if (imageHighValue < 512) { maxHeight = 512; } else if (imageHighValue < 1024) { maxHeight = 1024; } else if (imageHighValue < 2048) { maxHeight = 2048; } else { maxHeight = 256; highRes = true; } comboBoxHeight.setSelectedItem(Integer.toString(maxHeight)); ((SpinnerNumberModel) spinnerWorldLow.getModel()).setMaximum(maxHeight - 1); ((SpinnerNumberModel) spinnerWorldMiddle.getModel()).setMaximum(maxHeight - 1); ((SpinnerNumberModel) spinnerWorldHigh.getModel()).setMaximum(maxHeight - 1); ((SpinnerNumberModel) spinnerVoidBelow.getModel()).setMaximum(maxHeight - 1); } else { maxHeight = currentDimension.getMaxHeight(); highRes = imageHighValue > maxHeight; } // Set levels to reasonable defaults spinnerImageLow.setValue(0); spinnerImageHigh.setValue((highRes ? (maxHeight * 256) : maxHeight) - 1); spinnerWorldLow.setValue(0); spinnerWorldHigh.setValue(maxHeight - 1); labelImageDimensions.setText(String.format("Image size: %d x %d, %d bits, lowest value: %d, highest value: %d", width, height, bitDepth, imageLowValue, imageHighValue)); updateWorldDimensions(); updateImageWaterLevel(); } } catch (IOException e) { logger.error("I/O error loading image " + selectedFile, e); labelImageDimensions.setForeground(Color.RED); labelImageDimensions.setText(String.format("I/O error loading image (message: %s)!", e.getMessage())); selectedFile = null; } } private void updateWorldDimensions() { int scale = (Integer) spinnerScale.getValue(); labelWorldDimensions.setText("Scaled size: " + (image.getWidth() * scale / 100) + " x " + (image.getHeight() * scale / 100) + " blocks"); } private void updateImageWaterLevel() { int imageLowLevel = (Integer) spinnerImageLow.getValue(); int imageHighLevel = (Integer) spinnerImageHigh.getValue(); int worldLowLevel = (Integer) spinnerWorldLow.getValue(); int worldMiddleLevel = (Integer) spinnerWorldMiddle.getValue(); int worldHighLevel = (Integer) spinnerWorldHigh.getValue(); float levelScale = (float) (worldHighLevel - worldLowLevel) / (imageHighLevel - imageLowLevel); int imageMiddleLevel = (int) ((worldMiddleLevel - worldLowLevel) / levelScale + imageLowLevel); if (imageMiddleLevel < 0) { labelImageWaterLevel.setText("< 0"); } else if (imageMiddleLevel > ((bitDepth == 16) ? 65535 : 255)) { labelImageWaterLevel.setText(((bitDepth == 16) ? "> 65535" : "> 255")); } else { labelImageWaterLevel.setText(Integer.toString(imageMiddleLevel)); } } private void loadDefaults() { Theme defaults = Configuration.getInstance().getHeightMapDefaultTheme(); if (defaults == null) { HeightMapTileFactory tmpTileFactory = TileFactoryFactory.createNoiseTileFactory(seed, Terrain.GRASS, DEFAULT_MAX_HEIGHT_2, 58, 62, false, true, 20, 1.0); defaults = tmpTileFactory.getTheme(); if (currentDimension == null) { buttonResetDefaults.setEnabled(false); } } else { buttonResetDefaults.setEnabled(true); } tileFactory.setTheme(defaults); spinnerWorldMiddle.setValue(defaults.getWaterHeight()); updateImageWaterLevel(); heightMapTileFactoryEditor1.setTheme((SimpleTheme) defaults); buttonLoadDefaults.setEnabled(false); buttonSaveAsDefaults.setEnabled(false); } private void saveAsDefaults() { if (heightMapTileFactoryEditor1.save()) { Theme defaults = heightMapTileFactoryEditor1.getTheme(); Configuration.getInstance().setHeightMapDefaultTheme(defaults); buttonResetDefaults.setEnabled(true); buttonLoadDefaults.setEnabled(false); buttonSaveAsDefaults.setEnabled(false); } } private void resetDefaults() { if (currentDimension != null) { Theme theme = ((HeightMapTileFactory) currentDimension.getTileFactory()).getTheme(); buttonResetDefaults.setEnabled(false); tileFactory.setTheme(theme); spinnerWorldMiddle.setValue(theme.getWaterHeight()); updateImageWaterLevel(); heightMapTileFactoryEditor1.setTheme((SimpleTheme) theme); buttonLoadDefaults.setEnabled(true); buttonSaveAsDefaults.setEnabled(true); } else { Configuration.getInstance().setHeightMapDefaultTheme(null); loadDefaults(); buttonSaveAsDefaults.setEnabled(false); JOptionPane.showMessageDialog(this, "Theme reset to factory defaults.", "Default Theme Reset", JOptionPane.INFORMATION_MESSAGE); } } private void exportToDimension() { if (currentDimension == null) { throw new IllegalStateException(); } final HeightMapImporter importer = new HeightMapImporter(); HeightMap heightMap = new BitmapHeightMap(selectedFile.getName(), image, 0, selectedFile, false, false); int scale = (Integer) spinnerScale.getValue(); int offsetX = (Integer) spinnerOffsetX.getValue(); int offsetY = (Integer) spinnerOffsetY.getValue(); if ((scale != 100) || (offsetX != 0) || (offsetY != 0)) { ((BitmapHeightMap) heightMap).setSmoothScaling(true); heightMap = new TransformingHeightMap(heightMap.getName() + " transformed", heightMap, scale, scale, offsetX, offsetY, 0); } if (checkBoxInvert.isSelected()) { if (image.getSampleModel().getSampleSize(0) == 16) { heightMap = new DifferenceHeightMap(new ConstantHeightMap(65535f), heightMap); } else { heightMap = new DifferenceHeightMap(new ConstantHeightMap(255f), heightMap); } } importer.setHeightMap(heightMap); importer.setImageFile(selectedFile); String name = selectedFile.getName(); int p = name.lastIndexOf('.'); if (p != -1) { name = name.substring(0, p); } importer.setName(name); importer.setTileFactory(tileFactory); importer.setMaxHeight(Integer.parseInt((String) comboBoxHeight.getSelectedItem())); importer.setImageLowLevel((Integer) spinnerImageLow.getValue()); importer.setImageHighLevel((Integer) spinnerImageHigh.getValue()); importer.setWorldLowLevel((Integer) spinnerWorldLow.getValue()); importer.setWorldWaterLevel((Integer) spinnerWorldMiddle.getValue()); importer.setWorldHighLevel((Integer) spinnerWorldHigh.getValue()); importer.setVoidBelowLevel(checkBoxVoid.isSelected() ? ((Integer) spinnerVoidBelow.getValue()) : 0); importer.setOnlyRaise(checkBoxOnlyRaise.isSelected()); ProgressDialog.executeTask(this, new ProgressTask<Void>() { @Override public String getName() { return "Importing height map"; } @Override public Void execute(ProgressReceiver progressReceiver) throws OperationCancelled { importer.importToDimension(currentDimension, checkBoxCreateTiles.isSelected(), progressReceiver); return null; } }, false); Configuration.getInstance().setHeightMapsDirectory(selectedFile.getParentFile()); currentDimension.clearUndo(); currentDimension.armSavePoint(); } @Override protected void ok() { if (currentDimension != null) { exportToDimension(); } super.ok(); } /** 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() { java.awt.GridBagConstraints gridBagConstraints; jLabel14 = new javax.swing.JLabel(); buttonGroup1 = new javax.swing.ButtonGroup(); jLabel1 = new javax.swing.JLabel(); fieldFilename = new javax.swing.JTextField(); buttonSelectFile = new javax.swing.JButton(); labelImageDimensions = new javax.swing.JLabel(); buttonCancel = new javax.swing.JButton(); buttonOk = new javax.swing.JButton(); checkBoxInvert = new javax.swing.JCheckBox(); jTabbedPane1 = new javax.swing.JTabbedPane(); jPanel2 = new javax.swing.JPanel(); jLabel3 = new javax.swing.JLabel(); spinnerScale = new javax.swing.JSpinner(); labelWorldDimensions = new javax.swing.JLabel(); comboBoxHeight = new javax.swing.JComboBox(); jLabel4 = new javax.swing.JLabel(); jPanel1 = new javax.swing.JPanel(); jLabel5 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); jLabel7 = new javax.swing.JLabel(); spinnerImageLow = new javax.swing.JSpinner(); spinnerWorldLow = new javax.swing.JSpinner(); jLabel8 = new javax.swing.JLabel(); labelImageWaterLevel = new javax.swing.JLabel(); spinnerWorldMiddle = new javax.swing.JSpinner(); jLabel9 = new javax.swing.JLabel(); spinnerImageHigh = new javax.swing.JSpinner(); spinnerWorldHigh = new javax.swing.JSpinner(); jLabel2 = new javax.swing.JLabel(); jLabel10 = new javax.swing.JLabel(); checkBoxVoid = new javax.swing.JCheckBox(); spinnerVoidBelow = new javax.swing.JSpinner(); labelWarning = new javax.swing.JLabel(); jLabel11 = new javax.swing.JLabel(); spinnerOffsetX = new javax.swing.JSpinner(); jLabel12 = new javax.swing.JLabel(); spinnerOffsetY = new javax.swing.JSpinner(); jPanel3 = new javax.swing.JPanel(); heightMapTileFactoryEditor1 = new org.pepsoft.worldpainter.themes.impl.simple.SimpleThemeEditor(); buttonLoadDefaults = new javax.swing.JButton(); buttonSaveAsDefaults = new javax.swing.JButton(); buttonResetDefaults = new javax.swing.JButton(); checkBoxCreateTiles = new javax.swing.JCheckBox(); labelNoUndo = new javax.swing.JLabel(); checkBoxOnlyRaise = new javax.swing.JCheckBox(); jLabel14.setText("jLabel14"); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("Import Height Map"); jLabel1.setText("Select the image to import as a height map:"); buttonSelectFile.setText("..."); buttonSelectFile.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonSelectFileActionPerformed(evt); } }); labelImageDimensions.setText("Image size: ? x ?, bit depth: ?, lowest value: ?, highest value: ?"); buttonCancel.setText("Cancel"); buttonCancel.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonCancelActionPerformed(evt); } }); buttonOk.setText("OK"); buttonOk.setEnabled(false); buttonOk.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonOkActionPerformed(evt); } }); checkBoxInvert.setText("Invert (white is low, black is high)"); jTabbedPane1.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { jTabbedPane1StateChanged(evt); } }); jLabel3.setText("Scale:"); spinnerScale.setModel(new javax.swing.SpinnerNumberModel(100, 1, 999, 1)); spinnerScale.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { spinnerScaleStateChanged(evt); } }); labelWorldDimensions.setText("Scaled size: ? x ? blocks"); comboBoxHeight.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "32", "64", "128", "256", "512", "1024", "2048" })); comboBoxHeight.setSelectedIndex(3); comboBoxHeight.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { comboBoxHeightActionPerformed(evt); } }); jLabel4.setText("%"); jPanel1.setLayout(new java.awt.GridBagLayout()); jLabel5.setText("Image:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); jPanel1.add(jLabel5, gridBagConstraints); jLabel6.setText("Minecraft:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); jPanel1.add(jLabel6, gridBagConstraints); jLabel7.setText("Bottom:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); jPanel1.add(jLabel7, gridBagConstraints); spinnerImageLow.setModel(new javax.swing.SpinnerNumberModel(0, 0, 65535, 1)); spinnerImageLow.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { spinnerImageLowStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); jPanel1.add(spinnerImageLow, gridBagConstraints); spinnerWorldLow.setModel(new javax.swing.SpinnerNumberModel(0, 0, 65535, 1)); spinnerWorldLow.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { spinnerWorldLowStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); jPanel1.add(spinnerWorldLow, gridBagConstraints); jLabel8.setText("Water level:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); jPanel1.add(jLabel8, gridBagConstraints); labelImageWaterLevel.setText("62"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 19); jPanel1.add(labelImageWaterLevel, gridBagConstraints); spinnerWorldMiddle.setModel(new javax.swing.SpinnerNumberModel(62, 0, 65535, 1)); spinnerWorldMiddle.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { spinnerWorldMiddleStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); jPanel1.add(spinnerWorldMiddle, gridBagConstraints); jLabel9.setText("Top:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); jPanel1.add(jLabel9, gridBagConstraints); spinnerImageHigh.setModel(new javax.swing.SpinnerNumberModel(255, 0, 65535, 1)); spinnerImageHigh.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { spinnerImageHighStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); jPanel1.add(spinnerImageHigh, gridBagConstraints); spinnerWorldHigh.setModel(new javax.swing.SpinnerNumberModel(255, 0, 65535, 1)); spinnerWorldHigh.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { spinnerWorldHighStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); jPanel1.add(spinnerWorldHigh, gridBagConstraints); jLabel2.setText("Height:"); jLabel10.setText("blocks"); checkBoxVoid.setText("create Void below image value:"); checkBoxVoid.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { checkBoxVoidActionPerformed(evt); } }); spinnerVoidBelow.setModel(new javax.swing.SpinnerNumberModel(1, 1, 255, 1)); spinnerVoidBelow.setEnabled(false); labelWarning.setFont(labelWarning.getFont().deriveFont(labelWarning.getFont().getStyle() | java.awt.Font.BOLD)); labelWarning.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/pepsoft/worldpainter/icons/error.png"))); // NOI18N labelWarning.setText("Only Minecraft 1.1, with mods!"); jLabel11.setText("Offset:"); jLabel11.setToolTipText("The origin of the height map will be at these coordinates in the map"); spinnerOffsetX.setModel(new javax.swing.SpinnerNumberModel(0, -999999, 999999, 1)); spinnerOffsetX.setToolTipText("The origin of the height map will be at these coordinates in the map"); spinnerOffsetX.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { spinnerOffsetXStateChanged(evt); } }); jLabel12.setText(","); jLabel12.setToolTipText("The origin of the height map will be at these coordinates in the map"); spinnerOffsetY.setModel(new javax.swing.SpinnerNumberModel(0, -999999, 999999, 1)); spinnerOffsetY.setToolTipText("The origin of the height map will be at these coordinates in the map"); spinnerOffsetY.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { spinnerOffsetYStateChanged(evt); } }); javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(spinnerScale, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) .addComponent(jLabel4) .addGap(18, 18, 18) .addComponent(jLabel11) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(spinnerOffsetX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) .addComponent(jLabel12) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(spinnerOffsetY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(labelWorldDimensions) .addGroup(jPanel2Layout.createSequentialGroup() .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(comboBoxHeight, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) .addComponent(jLabel10) .addGap(18, 18, 18) .addComponent(labelWarning)) .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(jPanel2Layout.createSequentialGroup() .addComponent(checkBoxVoid) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(spinnerVoidBelow, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(spinnerScale, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel4) .addComponent(jLabel11) .addComponent(spinnerOffsetX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel12) .addComponent(spinnerOffsetY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(labelWorldDimensions) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2) .addComponent(comboBoxHeight, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel10) .addComponent(labelWarning)) .addGap(18, 18, 18) .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(checkBoxVoid) .addComponent(spinnerVoidBelow, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jTabbedPane1.addTab("Scaling", jPanel2); buttonLoadDefaults.setText("Load Defaults"); buttonLoadDefaults.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonLoadDefaultsActionPerformed(evt); } }); buttonSaveAsDefaults.setText("Save As Defaults"); buttonSaveAsDefaults.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonSaveAsDefaultsActionPerformed(evt); } }); buttonResetDefaults.setText("Reset"); buttonResetDefaults.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonResetDefaultsActionPerformed(evt); } }); javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); jPanel3.setLayout(jPanel3Layout); jPanel3Layout.setHorizontalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel3Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(heightMapTileFactoryEditor1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) .addComponent(buttonResetDefaults) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(buttonSaveAsDefaults) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(buttonLoadDefaults))) .addContainerGap()) ); jPanel3Layout.setVerticalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel3Layout.createSequentialGroup() .addContainerGap() .addComponent(heightMapTileFactoryEditor1, javax.swing.GroupLayout.DEFAULT_SIZE, 178, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(buttonLoadDefaults) .addComponent(buttonSaveAsDefaults) .addComponent(buttonResetDefaults)) .addContainerGap()) ); jTabbedPane1.addTab("Theme", jPanel3); checkBoxCreateTiles.setText("Create new tiles"); labelNoUndo.setText("<html><b>Note:</b> this cannot be undone!</html>"); checkBoxOnlyRaise.setText("Only where higher"); checkBoxOnlyRaise.setToolTipText("When selected, the height map will only be applied where it is higher than the existing terrain"); 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(jTabbedPane1) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(fieldFilename) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(buttonSelectFile)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) .addComponent(buttonOk) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(buttonCancel)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel1) .addComponent(labelImageDimensions) .addComponent(checkBoxInvert)) .addGap(0, 0, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addComponent(checkBoxCreateTiles) .addGap(18, 18, 18) .addComponent(checkBoxOnlyRaise) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(labelNoUndo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(fieldFilename, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(buttonSelectFile)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(labelImageDimensions) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(checkBoxInvert) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(checkBoxCreateTiles) .addComponent(labelNoUndo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(checkBoxOnlyRaise)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTabbedPane1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(buttonCancel) .addComponent(buttonOk)) .addContainerGap()) ); pack(); }// </editor-fold>//GEN-END:initComponents private void spinnerImageLowStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerImageLowStateChanged int lowLevel = (Integer) spinnerImageLow.getValue(); int highLevel = (Integer) spinnerImageHigh.getValue(); if (lowLevel > highLevel) { spinnerImageHigh.setValue(lowLevel); } updateImageWaterLevel(); }//GEN-LAST:event_spinnerImageLowStateChanged private void buttonCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCancelActionPerformed cancel(); }//GEN-LAST:event_buttonCancelActionPerformed private void spinnerImageHighStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerImageHighStateChanged int lowLevel = (Integer) spinnerImageLow.getValue(); int highLevel = (Integer) spinnerImageHigh.getValue(); if (highLevel < lowLevel) { spinnerImageLow.setValue(highLevel); } updateImageWaterLevel(); }//GEN-LAST:event_spinnerImageHighStateChanged private void spinnerWorldLowStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerWorldLowStateChanged int lowLevel = (Integer) spinnerWorldLow.getValue(); // int middleLevel = (Integer) spinnerWorldMiddle.getValue(); int highLevel = (Integer) spinnerWorldHigh.getValue(); // if (lowLevel > middleLevel) { // spinnerWorldMiddle.setValue(lowLevel); // } if (lowLevel > highLevel) { spinnerWorldHigh.setValue(lowLevel); } updateImageWaterLevel(); }//GEN-LAST:event_spinnerWorldLowStateChanged private void spinnerWorldMiddleStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerWorldMiddleStateChanged // int lowLevel = (Integer) spinnerWorldLow.getValue(); // int middleLevel = (Integer) spinnerWorldMiddle.getValue(); // int highLevel = (Integer) spinnerWorldHigh.getValue(); // if (middleLevel < lowLevel) { // spinnerWorldLow.setValue(middleLevel); // } // if (middleLevel > highLevel) { // spinnerWorldHigh.setValue(middleLevel); // } updateImageWaterLevel(); int waterLevel = ((Number) spinnerWorldMiddle.getValue()).intValue(); tileFactory.setWaterHeight(waterLevel); float baseHeight = tileFactory.getBaseHeight(); float transposeAmount = (waterLevel - 4) - baseHeight; tileFactory.setHeightMap(HeightMapUtils.transposeHeightMap(tileFactory.getHeightMap(), transposeAmount)); heightMapTileFactoryEditor1.setTheme((SimpleTheme) tileFactory.getTheme()); }//GEN-LAST:event_spinnerWorldMiddleStateChanged private void spinnerWorldHighStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerWorldHighStateChanged int lowLevel = (Integer) spinnerWorldLow.getValue(); // int middleLevel = (Integer) spinnerWorldMiddle.getValue(); int highLevel = (Integer) spinnerWorldHigh.getValue(); if (highLevel < lowLevel) { spinnerWorldLow.setValue(highLevel); } // if (highLevel < middleLevel) { // spinnerWorldMiddle.setValue(highLevel); // } updateImageWaterLevel(); }//GEN-LAST:event_spinnerWorldHighStateChanged private void buttonSelectFileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSelectFileActionPerformed File myHeightMapDir = heightMapDir; if (myHeightMapDir == null) { myHeightMapDir = Configuration.getInstance().getHeightMapsDirectory(); } if (myHeightMapDir == null) { myHeightMapDir = Configuration.getInstance().getMasksDirectory(); } final Set<String> extensions = new HashSet<>(Arrays.asList(ImageIO.getReaderFileSuffixes())); StringBuilder sb = new StringBuilder("Supported image formats ("); boolean first = true; for (String extension: extensions) { if (first) { first = false; } else { sb.append(", "); } sb.append("*."); sb.append(extension); } sb.append(')'); final String description = sb.toString(); File file = FileUtils.selectFileForOpen(this, "Select a height map image file", myHeightMapDir, new FileFilter() { @Override public boolean accept(File f) { if (f.isDirectory()) { return true; } String filename = f.getName(); int p = filename.lastIndexOf('.'); if (p != -1) { String extension = filename.substring(p + 1).toLowerCase(); return extensions.contains(extension); } else { return false; } } @Override public String getDescription() { return description; } }); if (file != null) { heightMapDir = file.getParentFile(); fieldFilename.setText(file.getAbsolutePath()); } }//GEN-LAST:event_buttonSelectFileActionPerformed private void spinnerScaleStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerScaleStateChanged if (image != null) { updateWorldDimensions(); } }//GEN-LAST:event_spinnerScaleStateChanged private void buttonOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonOkActionPerformed if ((jTabbedPane1.getSelectedIndex() == 0) || heightMapTileFactoryEditor1.save()) { spinnerWorldMiddle.setValue(tileFactory.getWaterHeight()); ok(); } }//GEN-LAST:event_buttonOkActionPerformed private void comboBoxHeightActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboBoxHeightActionPerformed int maxHeight = Integer.parseInt((String) comboBoxHeight.getSelectedItem()); if (maxHeight != previousMaxHeight) { if ((Integer) spinnerWorldLow.getValue() >= maxHeight) { spinnerWorldLow.setValue(maxHeight - 1); } if ((Integer) spinnerWorldMiddle.getValue() >= maxHeight) { spinnerWorldMiddle.setValue(maxHeight - 1); } if ((Integer) spinnerWorldHigh.getValue() >= maxHeight) { spinnerWorldHigh.setValue(maxHeight - 1); } if ((Integer) spinnerVoidBelow.getValue() >= maxHeight) { spinnerVoidBelow.setValue(maxHeight - 1); } ((SpinnerNumberModel) spinnerWorldLow.getModel()).setMaximum(maxHeight - 1); ((SpinnerNumberModel) spinnerWorldMiddle.getModel()).setMaximum(maxHeight - 1); ((SpinnerNumberModel) spinnerWorldHigh.getModel()).setMaximum(maxHeight - 1); ((SpinnerNumberModel) spinnerVoidBelow.getModel()).setMaximum(maxHeight - 1); HeightTransform transform = HeightTransform.get(maxHeight * 100 / previousMaxHeight, 0); tileFactory.setMaxHeight(maxHeight, transform); int waterLevel = ((Number) spinnerWorldMiddle.getValue()).intValue(); tileFactory.setWaterHeight(waterLevel); float baseHeight = tileFactory.getBaseHeight(); float transposeAmount = Math.max(waterLevel - 4, 0) - baseHeight; tileFactory.setHeightMap(HeightMapUtils.transposeHeightMap(tileFactory.getHeightMap(), transposeAmount)); heightMapTileFactoryEditor1.setTheme((SimpleTheme) tileFactory.getTheme()); if (maxHeight == DEFAULT_MAX_HEIGHT_1) { labelWarning.setText("Only Minecraft 1.1!"); } else { labelWarning.setText("Only Minecraft 1.1, with mods!"); } labelWarning.setVisible(maxHeight != DEFAULT_MAX_HEIGHT_2); previousMaxHeight = maxHeight; } }//GEN-LAST:event_comboBoxHeightActionPerformed private void jTabbedPane1StateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jTabbedPane1StateChanged switch (jTabbedPane1.getSelectedIndex()) { case 0: heightMapTileFactoryEditor1.save(); spinnerWorldMiddle.setValue(tileFactory.getWaterHeight()); break; } }//GEN-LAST:event_jTabbedPane1StateChanged private void checkBoxVoidActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBoxVoidActionPerformed spinnerVoidBelow.setEnabled(checkBoxVoid.isSelected()); }//GEN-LAST:event_checkBoxVoidActionPerformed private void spinnerOffsetXStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerOffsetXStateChanged if (image != null) { updateWorldDimensions(); } }//GEN-LAST:event_spinnerOffsetXStateChanged private void spinnerOffsetYStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerOffsetYStateChanged if (image != null) { updateWorldDimensions(); } }//GEN-LAST:event_spinnerOffsetYStateChanged private void buttonLoadDefaultsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonLoadDefaultsActionPerformed loadDefaults(); }//GEN-LAST:event_buttonLoadDefaultsActionPerformed private void buttonSaveAsDefaultsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSaveAsDefaultsActionPerformed saveAsDefaults(); }//GEN-LAST:event_buttonSaveAsDefaultsActionPerformed private void buttonResetDefaultsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonResetDefaultsActionPerformed resetDefaults(); }//GEN-LAST:event_buttonResetDefaultsActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton buttonCancel; private javax.swing.ButtonGroup buttonGroup1; private javax.swing.JButton buttonLoadDefaults; private javax.swing.JButton buttonOk; private javax.swing.JButton buttonResetDefaults; private javax.swing.JButton buttonSaveAsDefaults; private javax.swing.JButton buttonSelectFile; private javax.swing.JCheckBox checkBoxCreateTiles; private javax.swing.JCheckBox checkBoxInvert; private javax.swing.JCheckBox checkBoxOnlyRaise; private javax.swing.JCheckBox checkBoxVoid; private javax.swing.JComboBox comboBoxHeight; private javax.swing.JTextField fieldFilename; private org.pepsoft.worldpainter.themes.impl.simple.SimpleThemeEditor heightMapTileFactoryEditor1; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel11; private javax.swing.JLabel jLabel12; private javax.swing.JLabel jLabel14; 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.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JTabbedPane jTabbedPane1; private javax.swing.JLabel labelImageDimensions; private javax.swing.JLabel labelImageWaterLevel; private javax.swing.JLabel labelNoUndo; private javax.swing.JLabel labelWarning; private javax.swing.JLabel labelWorldDimensions; private javax.swing.JSpinner spinnerImageHigh; private javax.swing.JSpinner spinnerImageLow; private javax.swing.JSpinner spinnerOffsetX; private javax.swing.JSpinner spinnerOffsetY; private javax.swing.JSpinner spinnerScale; private javax.swing.JSpinner spinnerVoidBelow; private javax.swing.JSpinner spinnerWorldHigh; private javax.swing.JSpinner spinnerWorldLow; private javax.swing.JSpinner spinnerWorldMiddle; // End of variables declaration//GEN-END:variables private final HeightMapTileFactory tileFactory; private final long seed = new Random().nextLong(); private final Dimension currentDimension; private File selectedFile, heightMapDir; private volatile BufferedImage image; private int previousMaxHeight = DEFAULT_MAX_HEIGHT_2, bitDepth = 8, imageLowValue = 32, imageHighValue = 224; private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ImportHeightMapDialog.class); private static final long serialVersionUID = 1L; }