/* * Copyright (C) 2010 Markus Echterhoff <tam@edu.uni-klu.ac.at> * * This file is part of EvoPaint. * * EvoPaint is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with EvoPaint. If not, see <http://www.gnu.org/licenses/>. */ package evopaint.pixel.rulebased.targeting.qualifiers; import evopaint.Configuration; import evopaint.gui.rulesetmanager.util.NamedObjectListCellRenderer; import evopaint.interfaces.IRandomNumberGenerator; import evopaint.pixel.rulebased.RuleBasedPixel; import evopaint.pixel.rulebased.targeting.Qualifier; import evopaint.pixel.rulebased.util.ObjectComparisonOperator; import evopaint.util.mapping.RelativeCoordinate; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import javax.swing.JComboBox; import javax.swing.JComponent; /** * * @author Markus Echterhoff <tam@edu.uni-klu.ac.at> */ public class ExistenceQualifier extends Qualifier { private ObjectComparisonOperator objectComparisonOperator; public ExistenceQualifier(ObjectComparisonOperator objectComparisonOperator) { this.objectComparisonOperator = objectComparisonOperator; } public ExistenceQualifier() { this.objectComparisonOperator = ObjectComparisonOperator.EQUAL; } public ExistenceQualifier(ExistenceQualifier existenceQualifier) { this.objectComparisonOperator = existenceQualifier.objectComparisonOperator; } public ExistenceQualifier(IRandomNumberGenerator rng) { this.objectComparisonOperator = ObjectComparisonOperator.getRandom(rng); } public int getType() { return Qualifier.EXISTENCE; } public int countGenes() { return 1; } public void mutate(int mutatedGene, IRandomNumberGenerator rng) { if (mutatedGene == 0) { objectComparisonOperator = ObjectComparisonOperator.getRandomOtherThan(objectComparisonOperator, rng); return; } assert false; // we have an error in our mutatedGene calculation } public void mixWith(Qualifier theirQualifier, float theirShare, IRandomNumberGenerator rng) { ExistenceQualifier q = (ExistenceQualifier)theirQualifier; if (rng.nextFloat() < theirShare) { objectComparisonOperator = q.objectComparisonOperator; } } public ObjectComparisonOperator getObjectComparisonOperator() { return objectComparisonOperator; } public void setObjectComparisonOperator(ObjectComparisonOperator objectComparisonOperator) { this.objectComparisonOperator = objectComparisonOperator; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final ExistenceQualifier other = (ExistenceQualifier) obj; if (this.objectComparisonOperator != other.objectComparisonOperator && (this.objectComparisonOperator == null || !this.objectComparisonOperator.equals(other.objectComparisonOperator))) { return false; } return true; } @Override public int hashCode() { int hash = 5; hash = 89 * hash + (this.objectComparisonOperator != null ? this.objectComparisonOperator.hashCode() : 0); return hash; } public String getName() { return "existence"; } public List<RelativeCoordinate> getCandidates(RuleBasedPixel actor, List<RelativeCoordinate> directions, Configuration configuration) { List<RelativeCoordinate> ret = new ArrayList(1); for (RelativeCoordinate direction : directions) { RuleBasedPixel target = configuration.world.get(actor.getLocation(), direction); if (false == objectComparisonOperator.compare(target, null)) { ret.add(direction); } } return ret; } @Override public String toString() { if (objectComparisonOperator == ObjectComparisonOperator.EQUAL) { return "is a pixel"; } return "is a free spot"; } @Override public String toHTML() { return toString(); } @Override public LinkedHashMap<String, JComponent> addParametersGUI(LinkedHashMap<String, JComponent> parametersMap) { parametersMap = super.addParametersGUI(parametersMap); JComboBox comparisonComboBox = new JComboBox(ObjectComparisonOperator.createComboBoxModel()); comparisonComboBox.setRenderer(new NamedObjectListCellRenderer()); if (objectComparisonOperator == null) { objectComparisonOperator = ObjectComparisonOperator.EQUAL; } comparisonComboBox.setSelectedItem(objectComparisonOperator); comparisonComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setObjectComparisonOperator((ObjectComparisonOperator) ((JComboBox) (e.getSource())).getSelectedItem()); } }); comparisonComboBox.setPreferredSize(new Dimension(80, 25)); parametersMap.put("Comparison", comparisonComboBox); return parametersMap; } }