/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.pepsoft.worldpainter.panels;
import org.pepsoft.minecraft.Constants;
import org.pepsoft.util.IconUtils;
import org.pepsoft.util.ObservableBoolean;
import org.pepsoft.worldpainter.*;
import org.pepsoft.worldpainter.Dimension;
import org.pepsoft.worldpainter.biomeschemes.AutoBiomeScheme;
import org.pepsoft.worldpainter.biomeschemes.BiomeHelper;
import org.pepsoft.worldpainter.biomeschemes.CustomBiome;
import org.pepsoft.worldpainter.biomeschemes.CustomBiomeManager;
import org.pepsoft.worldpainter.layers.*;
import org.pepsoft.worldpainter.operations.Filter;
import org.pepsoft.worldpainter.panels.DefaultFilter.LevelType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.swing.*;
import javax.swing.JSpinner.NumberEditor;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.*;
import java.util.List;
/**
*
* @author pepijn
*/
public class BrushOptions extends javax.swing.JPanel implements Observer {
/**
* Creates new form BrushOptions
*/
public BrushOptions() {
initComponents();
// Eliminate thousands separators to make spinners smaller:
spinnerAbove.setEditor(new NumberEditor(spinnerAbove, "0"));
spinnerBelow.setEditor(new NumberEditor(spinnerBelow, "0"));
}
public void setSelectionState(ObservableBoolean selectionState) {
if (this.selectionState != null) {
throw new IllegalStateException("selectionState already set");
}
this.selectionState = selectionState;
selectionState.addObserver(this);
checkBoxInSelection.setEnabled(selectionState.getValue());
checkBoxOutsideSelection.setEnabled(selectionState.getValue());
}
public DefaultFilter getFilter() {
if (checkBoxInSelection.isSelected() || checkBoxOutsideSelection.isSelected() || checkBoxAbove.isSelected()
|| checkBoxBelow.isSelected() || checkBoxReplace.isSelected() || checkBoxExceptOn.isSelected()
|| checkBoxAboveSlope.isSelected() || checkBoxBelowSlope.isSelected()) {
return new DefaultFilter(App.getInstance().getDimension(),
checkBoxInSelection.isSelected(),
checkBoxOutsideSelection.isSelected(),
checkBoxAbove.isSelected() ? (Integer) spinnerAbove.getValue() : -1,
checkBoxBelow.isSelected() ? (Integer) spinnerBelow.getValue() : -1,
checkBoxFeather.isSelected(),
checkBoxReplace.isSelected() ? onlyOn : null,
checkBoxExceptOn.isSelected() ? exceptOn : null,
(checkBoxAboveSlope.isSelected() || checkBoxBelowSlope.isSelected()) ? (Integer) spinnerSlope.getValue() : -1,
checkBoxAboveSlope.isSelected());
} else {
return null;
}
}
public void setFilter(DefaultFilter filter) {
if (filter == null) {
checkBoxInSelection.setSelected(false);
checkBoxOutsideSelection.setSelected(false);
checkBoxAbove.setSelected(false);
checkBoxBelow.setSelected(false);
checkBoxReplace.setSelected(false);
checkBoxExceptOn.setSelected(false);
checkBoxAboveSlope.setSelected(false);
checkBoxBelowSlope.setSelected(false);
} else {
checkBoxInSelection.setSelected(filter.inSelection);
checkBoxOutsideSelection.setSelected(filter.outsideSelection);
checkBoxAbove.setSelected(filter.levelType == LevelType.ABOVE || filter.levelType == LevelType.BETWEEN || filter.levelType == LevelType.OUTSIDE);
if (filter.aboveLevel >= 0) {
spinnerAbove.setValue(filter.aboveLevel);
}
checkBoxBelow.setSelected(filter.levelType == LevelType.BELOW || filter.levelType == LevelType.BETWEEN || filter.levelType == LevelType.OUTSIDE);
if (filter.belowLevel >= 0) {
spinnerBelow.setValue(filter.belowLevel);
}
checkBoxAboveSlope.setSelected(filter.checkSlope && filter.slopeIsAbove);
checkBoxBelowSlope.setSelected(filter.checkSlope && (! filter.slopeIsAbove));
if (filter.degrees >= 0) {
spinnerSlope.setValue(filter.degrees);
}
checkBoxReplace.setSelected(filter.onlyOnObjectType != null);
checkBoxExceptOn.setSelected(filter.exceptOnObjectType != null);
final App app = App.getInstance();
if (filter.onlyOnObjectType != null) {
switch (filter.onlyOnObjectType) {
case BIOME:
int biome = filter.onlyOnValue;
BiomeHelper biomeHelper = new BiomeHelper(autoBiomeScheme, app.getColourScheme(), app.getCustomBiomeManager());
onlyOn = biome;
buttonReplace.setText(biomeHelper.getBiomeName(biome));
buttonReplace.setIcon(biomeHelper.getBiomeIcon(biome));
break;
case BIT_LAYER:
case INT_LAYER_ANY:
Layer layer = filter.onlyOnLayer;
onlyOn = layer;
buttonReplace.setText(layer.getName());
buttonReplace.setIcon(new ImageIcon(layer.getIcon()));
break;
case TERRAIN:
Terrain terrain = filter.onlyOnTerrain;
ColourScheme colourScheme = app.getColourScheme();
onlyOn = terrain;
buttonReplace.setText(terrain.getName());
buttonReplace.setIcon(new ImageIcon(terrain.getIcon(colourScheme)));
break;
case WATER:
onlyOn = DefaultFilter.WATER;
buttonReplace.setText("Water");
buttonReplace.setIcon(null);
break;
case LAND:
onlyOn = DefaultFilter.LAND;
buttonReplace.setText("Land");
buttonReplace.setIcon(null);
break;
case ANNOTATION:
int selectedColour = filter.onlyOnValue, dataValue = selectedColour - ((selectedColour < 8) ? 1 : 0);
onlyOn = new DefaultFilter.LayerValue(Annotations.INSTANCE, selectedColour);
buttonReplace.setText(Constants.COLOUR_NAMES[dataValue] + " Annotations");
buttonReplace.setIcon(IconUtils.createScaledColourIcon(app.getColourScheme().getColour(Constants.BLK_WOOL, dataValue)));
break;
case ANNOTATION_ANY:
onlyOn = new DefaultFilter.LayerValue(Annotations.INSTANCE);
buttonReplace.setText("All Annotations");
buttonReplace.setIcon(null);
break;
}
}
if (filter.exceptOnObjectType != null) {
switch (filter.exceptOnObjectType) {
case BIOME:
int biome = filter.exceptOnValue;
BiomeHelper biomeHelper = new BiomeHelper(autoBiomeScheme, app.getColourScheme(), app.getCustomBiomeManager());
exceptOn = biome;
buttonExceptOn.setText(biomeHelper.getBiomeName(biome));
buttonExceptOn.setIcon(biomeHelper.getBiomeIcon(biome));
break;
case BIT_LAYER:
case INT_LAYER_ANY:
Layer layer = filter.exceptOnLayer;
exceptOn = layer;
buttonExceptOn.setText(layer.getName());
buttonExceptOn.setIcon(new ImageIcon(layer.getIcon()));
break;
case TERRAIN:
Terrain terrain = filter.exceptOnTerrain;
ColourScheme colourScheme = app.getColourScheme();
exceptOn = terrain;
buttonExceptOn.setText(terrain.getName());
buttonExceptOn.setIcon(new ImageIcon(terrain.getIcon(colourScheme)));
break;
case WATER:
exceptOn = DefaultFilter.WATER;
buttonExceptOn.setText("Water");
buttonExceptOn.setIcon(null);
break;
case LAND:
exceptOn = DefaultFilter.LAND;
buttonExceptOn.setText("Land");
buttonExceptOn.setIcon(null);
break;
case ANNOTATION:
int selectedColour = filter.exceptOnValue, dataValue = selectedColour - ((selectedColour < 8) ? 1 : 0);
exceptOn = new DefaultFilter.LayerValue(Annotations.INSTANCE, selectedColour);
buttonExceptOn.setText(Constants.COLOUR_NAMES[dataValue] + " Annotations");
buttonExceptOn.setIcon(IconUtils.createScaledColourIcon(app.getColourScheme().getColour(Constants.BLK_WOOL, dataValue)));
break;
case ANNOTATION_ANY:
exceptOn = new DefaultFilter.LayerValue(Annotations.INSTANCE);
buttonExceptOn.setText("All Annotations");
buttonExceptOn.setIcon(null);
break;
}
}
}
setControlStates();
}
public void setMaxHeight(int maxHeight) {
boolean updateFilter = false;
((SpinnerNumberModel) spinnerAbove.getModel()).setMaximum(maxHeight - 1);
if ((Integer) spinnerAbove.getValue() >= maxHeight) {
spinnerAbove.setValue(maxHeight - 1);
updateFilter = true;
}
((SpinnerNumberModel) spinnerBelow.getModel()).setMaximum(maxHeight - 1);
if ((Integer) spinnerBelow.getValue() >= maxHeight) {
spinnerBelow.setValue(maxHeight - 1);
updateFilter = true;
}
if (updateFilter) {
filterChanged();
}
}
public Listener getListener() {
return listener;
}
public void setListener(Listener listener) {
this.listener = listener;
}
// Observer
@Override
public void update(Observable o, Object selectionMayBePresent) {
checkBoxInSelection.setEnabled((boolean) selectionMayBePresent);
checkBoxOutsideSelection.setEnabled((boolean) selectionMayBePresent);
}
private void setControlStates() {
spinnerAbove.setEnabled(checkBoxAbove.isSelected());
spinnerBelow.setEnabled(checkBoxBelow.isSelected());
spinnerSlope.setEnabled(checkBoxAboveSlope.isSelected() || checkBoxBelowSlope.isSelected());
buttonReplace.setEnabled(checkBoxReplace.isSelected());
buttonExceptOn.setEnabled(checkBoxExceptOn.isSelected());
checkBoxFeather.setEnabled(checkBoxAbove.isSelected() || checkBoxBelow.isSelected());
}
private JPopupMenu createReplaceMenu() {
return createObjectSelectionMenu((object, name, icon) -> {
onlyOn = object;
buttonReplace.setText(name);
buttonReplace.setIcon(icon);
filterChanged();
});
}
private JPopupMenu createExceptOnMenu() {
return createObjectSelectionMenu((object, name, icon) -> {
exceptOn = object;
buttonExceptOn.setText(name);
buttonExceptOn.setIcon(icon);
filterChanged();
});
}
private JPopupMenu createObjectSelectionMenu(final ObjectSelectionListener listener) {
JMenuItem waterItem = new JMenuItem("Water");
waterItem.addActionListener(e -> listener.objectSelected(DefaultFilter.WATER, "Water", null));
JMenu popupMenu = new JMenu();
popupMenu.add(waterItem);
JMenuItem lavaItem = new JMenuItem("Lava");
lavaItem.addActionListener(e -> listener.objectSelected(DefaultFilter.LAVA, "Lava", null));
popupMenu.add(lavaItem);
JMenuItem landItem = new JMenuItem("Land");
landItem.addActionListener(e -> listener.objectSelected(DefaultFilter.LAND, "Land", null));
popupMenu.add(landItem);
JMenu terrainMenu = new JMenu("Terrain");
JMenu customTerrainMenu = new JMenu("Custom");
JMenu stainedClayTerrainMenu = new JMenu("Stained Clay");
App app = App.getInstance();
ColourScheme colourScheme = app.getColourScheme();
for (Terrain terrain: Terrain.getConfiguredValues()) {
final Terrain selectedTerrain = terrain;
final String name = terrain.getName();
final Icon icon = new ImageIcon(terrain.getIcon(colourScheme));
JMenuItem menuItem = new JMenuItem(name, icon);
menuItem.addActionListener(e -> listener.objectSelected(selectedTerrain, name, icon));
if (terrain.isCustom()) {
customTerrainMenu.add(menuItem);
} else if (terrain.getName().endsWith(" Clay") && (terrain != Terrain.HARDENED_CLAY)) {
stainedClayTerrainMenu.add(menuItem);
} else {
terrainMenu.add(menuItem);
}
}
terrainMenu.add(stainedClayTerrainMenu);
if (customTerrainMenu.getMenuComponentCount() > 0) {
terrainMenu.add(customTerrainMenu);
}
popupMenu.add(terrainMenu);
JMenu layerMenu = new JMenu("Layer");
LayerManager.getInstance().getLayers().stream()
.filter(l -> !l.equals(Biome.INSTANCE))
.forEach(l -> {
JMenuItem menuItem = new JMenuItem(l.getName(), new ImageIcon(l.getIcon()));
menuItem.addActionListener(e -> listener.objectSelected(l, l.getName(), new ImageIcon(l.getIcon())));
layerMenu.add(menuItem);
});
Set<CustomLayer> customLayers = app.getCustomLayers();
if (customLayers.size() > 15) {
// If there are fifteen or more custom layers, split them by palette
// and move them to separate submenus to try and conserve screen
// space
app.getCustomLayersByPalette().entrySet().stream()
.map((entry) -> {
String palette = entry.getKey();
JMenu paletteMenu = new JMenu(palette != null ? palette : "Hidden Layers");
entry.getValue().forEach(l -> {
JMenuItem menuItem = new JMenuItem(l.getName(), new ImageIcon(l.getIcon()));
menuItem.addActionListener(e -> listener.objectSelected(l, l.getName(), new ImageIcon(l.getIcon())));
paletteMenu.add(menuItem);
});
return paletteMenu;
}).forEach(layerMenu::add);
} else {
customLayers.forEach(l -> {
JMenuItem menuItem = new JMenuItem(l.getName(), new ImageIcon(l.getIcon()));
menuItem.addActionListener(e -> listener.objectSelected(l, l.getName(), new ImageIcon(l.getIcon())));
layerMenu.add(menuItem);
});
}
popupMenu.add(layerMenu);
final JMenu biomeMenu = new JMenu("Biome");
final CustomBiomeManager customBiomeManager = app.getCustomBiomeManager();
final BiomeHelper biomeHelper = new BiomeHelper(autoBiomeScheme, colourScheme, customBiomeManager);
List<CustomBiome> customBiomes = customBiomeManager.getCustomBiomes();
if ((customBiomes != null) && (! customBiomes.isEmpty())) {
JMenu customBiomeMenu = new JMenu("Custom");
for (CustomBiome customBiome: customBiomes) {
final int selectedBiome = customBiome.getId();
final String name = biomeHelper.getBiomeName(selectedBiome) + " (" + selectedBiome + ")";
final Icon icon = biomeHelper.getBiomeIcon(selectedBiome);
final JMenuItem menuItem = new JMenuItem(name, icon);
menuItem.addActionListener(e -> listener.objectSelected(new DefaultFilter.LayerValue(Biome.INSTANCE, selectedBiome), name, icon));
customBiomeMenu.add(menuItem);
}
biomeMenu.add(customBiomeMenu);
}
for (int i = 0; i < autoBiomeScheme.getBiomeCount(); i++) {
if (autoBiomeScheme.isBiomePresent(i)) {
final int selectedBiome = i;
final String name = biomeHelper.getBiomeName(i) + " (" + selectedBiome + ")";
final Icon icon = biomeHelper.getBiomeIcon(i);
final JMenuItem menuItem = new JMenuItem(name, icon);
menuItem.addActionListener(e -> listener.objectSelected(new DefaultFilter.LayerValue(Biome.INSTANCE, selectedBiome), name, icon));
biomeMenu.add(menuItem);
}
}
JMenu autoBiomeSubMenu = new JMenu("Auto Biomes");
JMenuItem autoBiomesMenuItem = new JMenuItem("All Auto Biomes");
autoBiomesMenuItem.addActionListener(e -> listener.objectSelected(DefaultFilter.AUTO_BIOMES, "All Auto Biomes", null));
autoBiomeSubMenu.add(autoBiomesMenuItem);
for (int autoBiome: Dimension.POSSIBLE_AUTO_BIOMES) {
final int selectedBiome = -autoBiome;
final String name = biomeHelper.getBiomeName(autoBiome);
final Icon icon = biomeHelper.getBiomeIcon(autoBiome);
final JMenuItem menuItem = new JMenuItem(name, icon);
menuItem.addActionListener(e -> listener.objectSelected(new DefaultFilter.LayerValue(Biome.INSTANCE, selectedBiome), name, icon));
autoBiomeSubMenu.add(menuItem);
}
biomeMenu.add(autoBiomeSubMenu);
popupMenu.add(biomeMenu);
JMenu annotationsMenu = new JMenu("Annotations");
JMenuItem menuItem = new JMenuItem("All Annotations");
menuItem.addActionListener(e -> listener.objectSelected(new DefaultFilter.LayerValue(Annotations.INSTANCE), "All Annotations", null));
annotationsMenu.add(menuItem);
for (int i = 1; i < 16; i++) {
final int selectedColour = i, dataValue = selectedColour - ((selectedColour < 8) ? 1 : 0);
final Icon icon = IconUtils.createScaledColourIcon(colourScheme.getColour(Constants.BLK_WOOL, dataValue));
menuItem = new JMenuItem(Constants.COLOUR_NAMES[dataValue], icon);
menuItem.addActionListener(e -> listener.objectSelected(new DefaultFilter.LayerValue(Annotations.INSTANCE, selectedColour), Constants.COLOUR_NAMES[dataValue] + " Annotations", icon));
annotationsMenu.add(menuItem);
}
popupMenu.add(annotationsMenu);
popupMenu = breakUpLongMenus(popupMenu, 25);
JPopupMenu result = new JPopupMenu();
Arrays.stream(popupMenu.getMenuComponents()).forEach(result::add);
return result;
}
/**
* Recursively break up any long menus by moving any excess items to
* submenus called "More".
*
* @param menu The menu hierarchy to break up.
* @param maxLength The maximum number of items in each submenu.
* @return The broken up menu hierarchy.
*/
private JMenu breakUpLongMenus(JMenu menu, int maxLength) {
if (menu.getMenuComponentCount() > maxLength) {
JMenu replacementMenu = new JMenu(menu.getText());
replacementMenu.setToolTipText(menu.getToolTipText());
// First gather all submenus, which go on the first page, breaking
// them up on the go if necessary
for (Component menuItem: menu.getMenuComponents()) {
if (menuItem instanceof JMenu) {
menu.remove(menuItem);
replacementMenu.add(breakUpLongMenus((JMenu) menuItem, maxLength));
}
}
// Then gather the menu items which will still fit on the first page
// and insert them before the submenus
int index = 0;
while ((replacementMenu.getMenuComponentCount() < (maxLength - 1)) && (menu.getMenuComponentCount() > 0)) {
Component menuItem = menu.getMenuComponent(0);
menu.remove(0);
replacementMenu.add(menuItem, index++);
}
// Lastly, if there are still items left, create a "more" submenu
// from the rest of the menu items and insert it between the menu
// items and the submenus
if (menu.getMenuComponentCount() > 0) {
menu.setText("More");
menu.setToolTipText(null);
replacementMenu.add(breakUpLongMenus(menu, maxLength), index);
}
return replacementMenu;
} else {
for (int i = 0; i < menu.getMenuComponentCount(); i++) {
if (menu.getMenuComponent(i) instanceof JMenu) {
JMenu subMenu = (JMenu) menu.getMenuComponent(i);
menu.remove(i);
menu.add(breakUpLongMenus(subMenu, maxLength), i);
}
}
return menu;
}
}
private void showReplaceMenu() {
JPopupMenu menu = createReplaceMenu();
menu.show(this, buttonReplace.getX() + buttonReplace.getWidth(), buttonReplace.getY());
}
private void showExceptOnMenu() {
JPopupMenu menu = createExceptOnMenu();
menu.show(this, buttonExceptOn.getX() + buttonExceptOn.getWidth(), buttonExceptOn.getY());
}
private void filterChanged() {
if (listener != null) {
Filter filter = getFilter();
if (logger.isTraceEnabled()) {
logger.trace("Reporting new filter " + filter + " to listener " + listener);
}
listener.filterChanged(filter);
}
}
private void initialiseIfNecessary() {
if (! initialised) {
// Prevent the intensity being changed when somebody tries to type a
// value:
Action nullAction = new AbstractAction("Do nothing") {
@Override
public void actionPerformed(ActionEvent e) {
// Do nothing
}
private static final long serialVersionUID = 1L;
};
getActionMap().put("doNothing", nullAction);
InputMap inputMap = getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
App app = App.getInstance();
inputMap.put(app.ACTION_INTENSITY_10_PERCENT.getAcceleratorKey(), "doNothing");
inputMap.put(app.ACTION_INTENSITY_20_PERCENT.getAcceleratorKey(), "doNothing");
inputMap.put(app.ACTION_INTENSITY_30_PERCENT.getAcceleratorKey(), "doNothing");
inputMap.put(app.ACTION_INTENSITY_40_PERCENT.getAcceleratorKey(), "doNothing");
inputMap.put(app.ACTION_INTENSITY_50_PERCENT.getAcceleratorKey(), "doNothing");
inputMap.put(app.ACTION_INTENSITY_60_PERCENT.getAcceleratorKey(), "doNothing");
inputMap.put(app.ACTION_INTENSITY_70_PERCENT.getAcceleratorKey(), "doNothing");
inputMap.put(app.ACTION_INTENSITY_80_PERCENT.getAcceleratorKey(), "doNothing");
inputMap.put(app.ACTION_INTENSITY_90_PERCENT.getAcceleratorKey(), "doNothing");
inputMap.put(app.ACTION_INTENSITY_100_PERCENT.getAcceleratorKey(), "doNothing");
autoBiomeScheme = new AutoBiomeScheme(null);
initialised = 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() {
checkBoxAbove = new javax.swing.JCheckBox();
spinnerAbove = new javax.swing.JSpinner();
checkBoxBelow = new javax.swing.JCheckBox();
spinnerBelow = new javax.swing.JSpinner();
checkBoxReplace = new javax.swing.JCheckBox();
buttonReplace = new javax.swing.JButton();
checkBoxFeather = new javax.swing.JCheckBox();
checkBoxExceptOn = new javax.swing.JCheckBox();
buttonExceptOn = new javax.swing.JButton();
checkBoxAboveSlope = new javax.swing.JCheckBox();
checkBoxBelowSlope = new javax.swing.JCheckBox();
spinnerSlope = new javax.swing.JSpinner();
jLabel1 = new javax.swing.JLabel();
checkBoxInSelection = new javax.swing.JCheckBox();
checkBoxOutsideSelection = new javax.swing.JCheckBox();
checkBoxAbove.setFont(checkBoxAbove.getFont().deriveFont(checkBoxAbove.getFont().getSize()-1f));
checkBoxAbove.setText("at or above");
checkBoxAbove.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
checkBoxAboveActionPerformed(evt);
}
});
spinnerAbove.setFont(spinnerAbove.getFont().deriveFont(spinnerAbove.getFont().getSize()-1f));
spinnerAbove.setModel(new javax.swing.SpinnerNumberModel(0, 0, 255, 1));
spinnerAbove.setEnabled(false);
spinnerAbove.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spinnerAboveStateChanged(evt);
}
});
checkBoxBelow.setFont(checkBoxBelow.getFont().deriveFont(checkBoxBelow.getFont().getSize()-1f));
checkBoxBelow.setText("at or below");
checkBoxBelow.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
checkBoxBelowActionPerformed(evt);
}
});
spinnerBelow.setFont(spinnerBelow.getFont().deriveFont(spinnerBelow.getFont().getSize()-1f));
spinnerBelow.setModel(new javax.swing.SpinnerNumberModel(255, 0, 255, 1));
spinnerBelow.setEnabled(false);
spinnerBelow.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spinnerBelowStateChanged(evt);
}
});
checkBoxReplace.setFont(checkBoxReplace.getFont().deriveFont(checkBoxReplace.getFont().getSize()-1f));
checkBoxReplace.setText("only on");
checkBoxReplace.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
checkBoxReplaceActionPerformed(evt);
}
});
buttonReplace.setFont(buttonReplace.getFont().deriveFont(buttonReplace.getFont().getSize()-1f));
buttonReplace.setText("...");
buttonReplace.setEnabled(false);
buttonReplace.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonReplaceActionPerformed(evt);
}
});
checkBoxFeather.setFont(checkBoxFeather.getFont().deriveFont(checkBoxFeather.getFont().getSize()-1f));
checkBoxFeather.setText("feather");
checkBoxFeather.setEnabled(false);
checkBoxFeather.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
checkBoxFeatherActionPerformed(evt);
}
});
checkBoxExceptOn.setFont(checkBoxExceptOn.getFont().deriveFont(checkBoxExceptOn.getFont().getSize()-1f));
checkBoxExceptOn.setText("except on");
checkBoxExceptOn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
checkBoxExceptOnActionPerformed(evt);
}
});
buttonExceptOn.setFont(buttonExceptOn.getFont().deriveFont(buttonExceptOn.getFont().getSize()-1f));
buttonExceptOn.setText("...");
buttonExceptOn.setEnabled(false);
buttonExceptOn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonExceptOnActionPerformed(evt);
}
});
checkBoxAboveSlope.setFont(checkBoxAboveSlope.getFont().deriveFont(checkBoxAboveSlope.getFont().getSize()-1f));
checkBoxAboveSlope.setText("above");
checkBoxAboveSlope.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
checkBoxAboveSlopeActionPerformed(evt);
}
});
checkBoxBelowSlope.setFont(checkBoxBelowSlope.getFont().deriveFont(checkBoxBelowSlope.getFont().getSize()-1f));
checkBoxBelowSlope.setText("below");
checkBoxBelowSlope.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
checkBoxBelowSlopeActionPerformed(evt);
}
});
spinnerSlope.setFont(spinnerSlope.getFont().deriveFont(spinnerSlope.getFont().getSize()-1f));
spinnerSlope.setModel(new javax.swing.SpinnerNumberModel(45, 0, 89, 1));
spinnerSlope.setEnabled(false);
spinnerSlope.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
spinnerSlopeStateChanged(evt);
}
});
jLabel1.setFont(jLabel1.getFont().deriveFont(jLabel1.getFont().getSize()-1f));
jLabel1.setText("degrees");
checkBoxInSelection.setFont(checkBoxInSelection.getFont().deriveFont(checkBoxInSelection.getFont().getSize()-1f));
checkBoxInSelection.setText("inside selection");
checkBoxInSelection.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
checkBoxInSelectionActionPerformed(evt);
}
});
checkBoxOutsideSelection.setFont(checkBoxOutsideSelection.getFont().deriveFont(checkBoxOutsideSelection.getFont().getSize()-1f));
checkBoxOutsideSelection.setText("outside selection");
checkBoxOutsideSelection.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
checkBoxOutsideSelectionActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(checkBoxInSelection)
.addComponent(checkBoxBelow)
.addComponent(checkBoxReplace)
.addComponent(checkBoxExceptOn)
.addGroup(layout.createSequentialGroup()
.addComponent(checkBoxAboveSlope)
.addGap(0, 0, 0)
.addComponent(checkBoxBelowSlope))
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(spinnerAbove, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(spinnerBelow, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(checkBoxFeather)
.addComponent(buttonReplace)
.addComponent(buttonExceptOn)
.addGroup(layout.createSequentialGroup()
.addComponent(spinnerSlope, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, 0)
.addComponent(jLabel1))))
.addComponent(checkBoxAbove)
.addComponent(checkBoxOutsideSelection)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(0, 0, 0)
.addComponent(checkBoxInSelection)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(checkBoxOutsideSelection)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(checkBoxAbove)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(spinnerAbove, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(checkBoxBelow)
.addGap(0, 0, 0)
.addComponent(spinnerBelow, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, 0)
.addComponent(checkBoxFeather)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(checkBoxReplace)
.addGap(0, 0, 0)
.addComponent(buttonReplace)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(checkBoxExceptOn)
.addGap(0, 0, 0)
.addComponent(buttonExceptOn)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(checkBoxAboveSlope)
.addComponent(checkBoxBelowSlope))
.addGap(0, 0, 0)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(spinnerSlope, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel1)))
);
}// </editor-fold>//GEN-END:initComponents
private void checkBoxAboveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBoxAboveActionPerformed
initialiseIfNecessary();
setControlStates();
filterChanged();
}//GEN-LAST:event_checkBoxAboveActionPerformed
private void checkBoxBelowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBoxBelowActionPerformed
initialiseIfNecessary();
setControlStates();
filterChanged();
}//GEN-LAST:event_checkBoxBelowActionPerformed
private void checkBoxReplaceActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBoxReplaceActionPerformed
initialiseIfNecessary();
setControlStates();
if (checkBoxReplace.isSelected() && (onlyOn == null)) {
showReplaceMenu();
} else {
filterChanged();
}
}//GEN-LAST:event_checkBoxReplaceActionPerformed
private void buttonReplaceActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonReplaceActionPerformed
showReplaceMenu();
}//GEN-LAST:event_buttonReplaceActionPerformed
private void spinnerAboveStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerAboveStateChanged
filterChanged();
}//GEN-LAST:event_spinnerAboveStateChanged
private void spinnerBelowStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerBelowStateChanged
filterChanged();
}//GEN-LAST:event_spinnerBelowStateChanged
private void checkBoxFeatherActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBoxFeatherActionPerformed
filterChanged();
}//GEN-LAST:event_checkBoxFeatherActionPerformed
private void checkBoxExceptOnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBoxExceptOnActionPerformed
initialiseIfNecessary();
setControlStates();
if (checkBoxExceptOn.isSelected() && (exceptOn == null)) {
showExceptOnMenu();
} else {
filterChanged();
}
}//GEN-LAST:event_checkBoxExceptOnActionPerformed
private void buttonExceptOnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonExceptOnActionPerformed
showExceptOnMenu();
}//GEN-LAST:event_buttonExceptOnActionPerformed
private void checkBoxAboveSlopeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBoxAboveSlopeActionPerformed
initialiseIfNecessary();
if (checkBoxAboveSlope.isSelected()) {
checkBoxBelowSlope.setSelected(false);
}
setControlStates();
filterChanged();
}//GEN-LAST:event_checkBoxAboveSlopeActionPerformed
private void checkBoxBelowSlopeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBoxBelowSlopeActionPerformed
initialiseIfNecessary();
if (checkBoxBelowSlope.isSelected()) {
checkBoxAboveSlope.setSelected(false);
}
setControlStates();
filterChanged();
}//GEN-LAST:event_checkBoxBelowSlopeActionPerformed
private void spinnerSlopeStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spinnerSlopeStateChanged
filterChanged();
}//GEN-LAST:event_spinnerSlopeStateChanged
private void checkBoxInSelectionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBoxInSelectionActionPerformed
initialiseIfNecessary();
if (checkBoxInSelection.isSelected() && checkBoxOutsideSelection.isSelected()) {
checkBoxOutsideSelection.setSelected(false);
}
filterChanged();
}//GEN-LAST:event_checkBoxInSelectionActionPerformed
private void checkBoxOutsideSelectionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBoxOutsideSelectionActionPerformed
initialiseIfNecessary();
if (checkBoxOutsideSelection.isSelected() && checkBoxInSelection.isSelected()) {
checkBoxInSelection.setSelected(false);
}
filterChanged();
}//GEN-LAST:event_checkBoxOutsideSelectionActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton buttonExceptOn;
private javax.swing.JButton buttonReplace;
private javax.swing.JCheckBox checkBoxAbove;
private javax.swing.JCheckBox checkBoxAboveSlope;
private javax.swing.JCheckBox checkBoxBelow;
private javax.swing.JCheckBox checkBoxBelowSlope;
private javax.swing.JCheckBox checkBoxExceptOn;
private javax.swing.JCheckBox checkBoxFeather;
private javax.swing.JCheckBox checkBoxInSelection;
private javax.swing.JCheckBox checkBoxOutsideSelection;
private javax.swing.JCheckBox checkBoxReplace;
private javax.swing.JLabel jLabel1;
private javax.swing.JSpinner spinnerAbove;
private javax.swing.JSpinner spinnerBelow;
private javax.swing.JSpinner spinnerSlope;
// End of variables declaration//GEN-END:variables
private Object onlyOn, exceptOn;
private BiomeScheme autoBiomeScheme;
private Listener listener;
private boolean initialised;
private ObservableBoolean selectionState;
private static final Logger logger = LoggerFactory.getLogger(BrushOptions.class);
private static final long serialVersionUID = 1L;
public interface Listener {
void filterChanged(Filter newFilter);
}
public interface ObjectSelectionListener {
void objectSelected(Object object, String name, Icon icon);
}
}