/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.pepsoft.worldpainter.layers.pockets; import org.pepsoft.worldpainter.ColourScheme; import org.pepsoft.worldpainter.MixedMaterial; import org.pepsoft.worldpainter.MixedMaterialManager; import org.pepsoft.worldpainter.Terrain; import org.pepsoft.worldpainter.layers.CustomLayerDialog; import org.pepsoft.worldpainter.themes.TerrainListCellRenderer; import javax.swing.*; import java.awt.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; /** * * @author pepijn */ public class UndergroundPocketsDialog extends CustomLayerDialog<UndergroundPocketsLayer> implements PropertyChangeListener { /** * Creates new form UndergroundPocketsDialog */ public UndergroundPocketsDialog(Window parent, MixedMaterial material, ColourScheme colourScheme, int maxHeight, boolean extendedBlockIds) { this(parent, material, null, colourScheme, maxHeight, extendedBlockIds); } /** * Creates new form UndergroundPocketsDialog */ public UndergroundPocketsDialog(Window parent, UndergroundPocketsLayer existingLayer, ColourScheme colourScheme, int maxHeight, boolean extendedBlockIds) { this(parent, null, existingLayer, colourScheme, maxHeight, extendedBlockIds); } /** * Creates new form UndergroundPocketsDialog */ private UndergroundPocketsDialog(Window parent, MixedMaterial material, UndergroundPocketsLayer existingLayer, ColourScheme colourScheme, int maxHeight, boolean extendedBlockIds) { super(parent); this.colourScheme = colourScheme; initComponents(); mixedMaterialChooser.setExtendedBlockIds(extendedBlockIds); mixedMaterialChooser.setColourScheme(colourScheme); mixedMaterialChooser.addPropertyChangeListener("material", this); if (existingLayer != null) { layer = existingLayer; fieldName.setText(existingLayer.getName()); selectedColour = existingLayer.getColour(); if (existingLayer.getMaterial() != null) { mixedMaterialChooser.setMaterial(existingLayer.getMaterial()); } else { radioButtonTerrain.setSelected(true); comboBoxTerrain.setSelectedItem(existingLayer.getTerrain()); } spinnerMinLevel.setValue(existingLayer.getMinLevel()); spinnerMaxLevel.setValue(existingLayer.getMaxLevel()); spinnerOccurrence.setValue(existingLayer.getFrequency()); spinnerScale.setValue(existingLayer.getScale()); } else { mixedMaterialChooser.setMaterial(material); spinnerMaxLevel.setValue(maxHeight - 1); } ((SpinnerNumberModel) spinnerMinLevel.getModel()).setMaximum(maxHeight - 1); ((SpinnerNumberModel) spinnerMaxLevel.getModel()).setMaximum(maxHeight - 1); spinnerOccurrence.setEditor(new JSpinner.NumberEditor(spinnerOccurrence, "0")); JSpinner.NumberEditor scaleEditor = new JSpinner.NumberEditor(spinnerScale, "0"); scaleEditor.getTextField().setColumns(3); spinnerScale.setEditor(scaleEditor); spinnerMinLevel.setEditor(new JSpinner.NumberEditor(spinnerMinLevel, "0")); spinnerMaxLevel.setEditor(new JSpinner.NumberEditor(spinnerMaxLevel, "0")); setLabelColour(); setControlStates(); rootPane.setDefaultButton(buttonOK); pack(); setLocationRelativeTo(parent); } @Override public UndergroundPocketsLayer getSelectedLayer() { return layer; } // PropertyChangeListener @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals("material") && evt.getSource() == mixedMaterialChooser) { updateNameAndColour(); setControlStates(); } } @Override protected void ok() { String name = fieldName.getText(); MixedMaterial material = radioButtonCustomMaterial.isSelected() ? mixedMaterialChooser.getMaterial() : null; if (material != null) { // Make sure the material is registered, in case it's new material = MixedMaterialManager.getInstance().register(material); } Terrain terrain = radioButtonTerrain.isSelected() ? (Terrain) comboBoxTerrain.getSelectedItem() : null; int occurrence = (Integer) spinnerOccurrence.getValue(); int scale = (Integer) spinnerScale.getValue(); int minLevel = (Integer) spinnerMinLevel.getValue(); int maxLevel = (Integer) spinnerMaxLevel.getValue(); if (layer == null) { layer = new UndergroundPocketsLayer(name, material, terrain, occurrence, minLevel, maxLevel, scale, selectedColour); } else { layer.setName(name); layer.setColour(selectedColour); layer.setMaterial(material); layer.setTerrain(terrain); layer.setFrequency(occurrence); layer.setMinLevel(minLevel); layer.setMaxLevel(maxLevel); layer.setScale(scale); } super.ok(); } private void pickColour() { Color pick = JColorChooser.showDialog(this, "Select Colour", new Color(selectedColour)); if (pick != null) { selectedColour = pick.getRGB(); setLabelColour(); } } private void setLabelColour() { jLabel5.setBackground(new Color(selectedColour)); } private void updateNameAndColour() { if (fieldName.isEnabled()) { if (radioButtonCustomMaterial.isSelected()) { MixedMaterial material = mixedMaterialChooser.getMaterial(); if (material != null) { fieldName.setText(material.toString()); if (material.getColour() != null) { selectedColour = material.getColour(); setLabelColour(); } } } else { Terrain terrain = (Terrain) comboBoxTerrain.getSelectedItem(); if (terrain != null) { fieldName.setText(terrain.getName()); } } } } private void setControlStates() { mixedMaterialChooser.setEnabled(radioButtonCustomMaterial.isSelected()); comboBoxTerrain.setEnabled(radioButtonTerrain.isSelected()); buttonOK.setEnabled((radioButtonCustomMaterial.isSelected() && (mixedMaterialChooser.getMaterial() != null)) || (radioButtonTerrain.isSelected() && (comboBoxTerrain.getSelectedItem() != null))); } private void schedulePreviewUpdate() { if (previewUpdateTimer == null) { previewUpdateTimer = new Timer(250, e -> updatePreview()); previewUpdateTimer.setRepeats(false); } previewUpdateTimer.restart(); } private void updatePreview() { if (previewUpdateTimer != null) { previewUpdateTimer.stop(); // Superfluous? previewUpdateTimer = null; } MixedMaterial material = radioButtonCustomMaterial.isSelected() ? mixedMaterialChooser.getMaterial() : null; Terrain terrain = radioButtonTerrain.isSelected() ? (Terrain) comboBoxTerrain.getSelectedItem() : null; if ((material == null) && (terrain == null)) { return; } int occurrence = (Integer) spinnerOccurrence.getValue(); int scale = (Integer) spinnerScale.getValue(); int minLevel = (Integer) spinnerMinLevel.getValue(); int maxLevel = (Integer) spinnerMaxLevel.getValue(); UndergroundPocketsLayer tmpLayer = new UndergroundPocketsLayer("tmp", material, terrain, occurrence, minLevel, maxLevel, scale, 0); labelPreview.setIcon(new ImageIcon(((UndergroundPocketsLayerExporter) tmpLayer.getExporter()).createPreview(labelPreview.getWidth(), labelPreview.getHeight()))); } /** * 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(); jLabel1 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); buttonCancel = new javax.swing.JButton(); buttonOK = new javax.swing.JButton(); jLabel6 = new javax.swing.JLabel(); fieldName = new javax.swing.JTextField(); jLabel5 = new javax.swing.JLabel(); buttonPickColour = new javax.swing.JButton(); jLabel7 = new javax.swing.JLabel(); spinnerOccurrence = new javax.swing.JSpinner(); jLabel8 = new javax.swing.JLabel(); jLabel9 = new javax.swing.JLabel(); jLabel10 = new javax.swing.JLabel(); spinnerScale = new javax.swing.JSpinner(); spinnerMaxLevel = new javax.swing.JSpinner(); jLabel11 = new javax.swing.JLabel(); spinnerMinLevel = new javax.swing.JSpinner(); jLabel12 = new javax.swing.JLabel(); radioButtonCustomMaterial = new javax.swing.JRadioButton(); radioButtonTerrain = new javax.swing.JRadioButton(); comboBoxTerrain = new javax.swing.JComboBox(); jPanel1 = new javax.swing.JPanel(); labelPreview = new javax.swing.JLabel(); mixedMaterialChooser = new org.pepsoft.worldpainter.MixedMaterialChooser(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("Configure Underground Pockets Layer"); addComponentListener(new java.awt.event.ComponentAdapter() { public void componentResized(java.awt.event.ComponentEvent evt) { formComponentResized(evt); } }); jLabel1.setText("Select your custom material or terrain type:"); jLabel4.setText("Colour:"); buttonCancel.setText("Cancel"); buttonCancel.addActionListener(this::buttonCancelActionPerformed); buttonOK.setText("OK"); buttonOK.addActionListener(this::buttonOKActionPerformed); jLabel6.setText("Name:"); fieldName.setColumns(10); jLabel5.setBackground(java.awt.Color.orange); jLabel5.setText(" "); jLabel5.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0))); jLabel5.setOpaque(true); buttonPickColour.setText("..."); buttonPickColour.addActionListener(this::buttonPickColourActionPerformed); jLabel7.setText("Occurrence:"); spinnerOccurrence.setModel(new javax.swing.SpinnerNumberModel(10, 1, 1000, 1)); spinnerOccurrence.addChangeListener(this::spinnerOccurrenceStateChanged); jLabel8.setText("Scale:"); jLabel9.setText("Levels:"); jLabel10.setText("‰"); spinnerScale.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(100), Integer.valueOf(1), null, Integer.valueOf(1))); spinnerScale.addChangeListener(this::spinnerScaleStateChanged); spinnerMaxLevel.setModel(new javax.swing.SpinnerNumberModel(255, 0, 255, 1)); spinnerMaxLevel.addChangeListener(this::spinnerMaxLevelStateChanged); jLabel11.setText("%"); spinnerMinLevel.setModel(new javax.swing.SpinnerNumberModel(0, 0, 255, 1)); spinnerMinLevel.addChangeListener(this::spinnerMinLevelStateChanged); jLabel12.setText("-"); buttonGroup1.add(radioButtonCustomMaterial); radioButtonCustomMaterial.setSelected(true); radioButtonCustomMaterial.setText("custom material:"); radioButtonCustomMaterial.addActionListener(this::radioButtonCustomMaterialActionPerformed); buttonGroup1.add(radioButtonTerrain); radioButtonTerrain.setText("terrain:"); radioButtonTerrain.addActionListener(this::radioButtonTerrainActionPerformed); comboBoxTerrain.setModel(new DefaultComboBoxModel(Terrain.VALUES)); comboBoxTerrain.setEnabled(false); comboBoxTerrain.setRenderer(new TerrainListCellRenderer(colourScheme)); comboBoxTerrain.addActionListener(this::comboBoxTerrainActionPerformed); jPanel1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED)); labelPreview.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(labelPreview, javax.swing.GroupLayout.DEFAULT_SIZE, 128, Short.MAX_VALUE) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(labelPreview, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); 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(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) .addComponent(buttonOK) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(buttonCancel) .addGap(11, 11, 11)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel1) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel4) .addComponent(jLabel7) .addComponent(jLabel6) .addComponent(jLabel8) .addComponent(jLabel9)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(spinnerMinLevel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) .addComponent(jLabel12) .addGap(0, 0, 0) .addComponent(spinnerMaxLevel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addComponent(spinnerScale, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) .addComponent(jLabel11)) .addComponent(fieldName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(layout.createSequentialGroup() .addComponent(spinnerOccurrence, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, 0) .addComponent(jLabel10)) .addGroup(layout.createSequentialGroup() .addComponent(jLabel5) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(buttonPickColour)))) .addGroup(layout.createSequentialGroup() .addComponent(radioButtonTerrain) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(comboBoxTerrain, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addComponent(radioButtonCustomMaterial) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(mixedMaterialChooser, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()))) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(radioButtonCustomMaterial) .addComponent(mixedMaterialChooser, 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(radioButtonTerrain) .addComponent(comboBoxTerrain, 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(jLabel6) .addComponent(fieldName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(19, 19, 19) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel4) .addComponent(jLabel5) .addComponent(buttonPickColour)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel7) .addComponent(spinnerOccurrence, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel10)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel8) .addComponent(spinnerScale, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel11)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel9) .addComponent(spinnerMaxLevel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(spinnerMinLevel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel12))) .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 buttonCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonCancelActionPerformed cancel(); }//GEN-LAST:event_buttonCancelActionPerformed private void buttonOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonOKActionPerformed ok(); }//GEN-LAST:event_buttonOKActionPerformed private void buttonPickColourActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonPickColourActionPerformed pickColour(); }//GEN-LAST:event_buttonPickColourActionPerformed private void spinnerMinLevelStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerMinLevelStateChanged int newMinValue = (Integer) spinnerMinLevel.getValue(); int currentMaxValue = (Integer) spinnerMaxLevel.getValue(); if (newMinValue > currentMaxValue) { spinnerMaxLevel.setValue(newMinValue); } }//GEN-LAST:event_spinnerMinLevelStateChanged private void spinnerMaxLevelStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerMaxLevelStateChanged int newMaxValue = (Integer) spinnerMaxLevel.getValue(); int currentMinValue = (Integer) spinnerMinLevel.getValue(); if (newMaxValue < currentMinValue) { spinnerMinLevel.setValue(newMaxValue); } }//GEN-LAST:event_spinnerMaxLevelStateChanged private void radioButtonCustomMaterialActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioButtonCustomMaterialActionPerformed updateNameAndColour(); setControlStates(); }//GEN-LAST:event_radioButtonCustomMaterialActionPerformed private void radioButtonTerrainActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioButtonTerrainActionPerformed updateNameAndColour(); setControlStates(); }//GEN-LAST:event_radioButtonTerrainActionPerformed private void comboBoxTerrainActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboBoxTerrainActionPerformed updateNameAndColour(); setControlStates(); }//GEN-LAST:event_comboBoxTerrainActionPerformed private void formComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentResized schedulePreviewUpdate(); }//GEN-LAST:event_formComponentResized private void spinnerOccurrenceStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerOccurrenceStateChanged schedulePreviewUpdate(); }//GEN-LAST:event_spinnerOccurrenceStateChanged private void spinnerScaleStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerScaleStateChanged schedulePreviewUpdate(); }//GEN-LAST:event_spinnerScaleStateChanged // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton buttonCancel; private javax.swing.ButtonGroup buttonGroup1; private javax.swing.JButton buttonOK; private javax.swing.JButton buttonPickColour; private javax.swing.JComboBox comboBoxTerrain; private javax.swing.JTextField fieldName; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel11; private javax.swing.JLabel jLabel12; 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.JLabel labelPreview; private org.pepsoft.worldpainter.MixedMaterialChooser mixedMaterialChooser; private javax.swing.JRadioButton radioButtonCustomMaterial; private javax.swing.JRadioButton radioButtonTerrain; private javax.swing.JSpinner spinnerMaxLevel; private javax.swing.JSpinner spinnerMinLevel; private javax.swing.JSpinner spinnerOccurrence; private javax.swing.JSpinner spinnerScale; // End of variables declaration//GEN-END:variables private final ColourScheme colourScheme; private UndergroundPocketsLayer layer; private int selectedColour = Color.ORANGE.getRGB(); private Timer previewUpdateTimer; private static final long serialVersionUID = 1L; }