// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.tagging.presets.items;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import javax.swing.JPanel;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.OsmUtils;
import org.openstreetmap.josm.data.osm.Tag;
import org.openstreetmap.josm.gui.widgets.QuadStateCheckBox;
import org.openstreetmap.josm.tools.GBC;
/**
* Checkbox type.
*/
public class Check extends KeyedItem {
/** The localized version of {@link #text}. */
public String locale_text; // NOSONAR
/** the value to set when checked (default is "yes") */
public String value_on = OsmUtils.trueval; // NOSONAR
/** the value to set when unchecked (default is "no") */
public String value_off = OsmUtils.falseval; // NOSONAR
/** whether the off value is disabled in the dialog, i.e., only unset or yes are provided */
public boolean disable_off; // NOSONAR
/** "on" or "off" or unset (default is unset) */
public String default_; // only used for tagless objects // NOSONAR
private QuadStateCheckBox check;
private QuadStateCheckBox.State initialState;
private Boolean def;
@Override
public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
// find out if our key is already used in the selection.
final Usage usage = determineBooleanUsage(sel, key);
final String oneValue = usage.values.isEmpty() ? null : usage.values.last();
def = "on".equals(default_) ? Boolean.TRUE : "off".equals(default_) ? Boolean.FALSE : null;
if (locale_text == null) {
locale_text = getLocaleText(text, text_context, null);
}
if (usage.values.size() < 2 && (oneValue == null || value_on.equals(oneValue) || value_off.equals(oneValue))) {
if (def != null && !PROP_FILL_DEFAULT.get()) {
// default is set and filling default values feature is disabled - check if all primitives are untagged
for (OsmPrimitive s : sel) {
if (s.hasKeys()) {
def = null;
}
}
}
// all selected objects share the same value which is either true or false or unset,
// we can display a standard check box.
initialState = value_on.equals(oneValue) || Boolean.TRUE.equals(def)
? QuadStateCheckBox.State.SELECTED
: value_off.equals(oneValue) || Boolean.FALSE.equals(def)
? QuadStateCheckBox.State.NOT_SELECTED
: QuadStateCheckBox.State.UNSET;
} else {
def = null;
// the objects have different values, or one or more objects have something
// else than true/false. we display a quad-state check box
// in "partial" state.
initialState = QuadStateCheckBox.State.PARTIAL;
}
final List<QuadStateCheckBox.State> allowedStates = new ArrayList<>(4);
if (QuadStateCheckBox.State.PARTIAL.equals(initialState))
allowedStates.add(QuadStateCheckBox.State.PARTIAL);
allowedStates.add(QuadStateCheckBox.State.SELECTED);
if (!disable_off || value_off.equals(oneValue))
allowedStates.add(QuadStateCheckBox.State.NOT_SELECTED);
allowedStates.add(QuadStateCheckBox.State.UNSET);
check = new QuadStateCheckBox(locale_text, initialState,
allowedStates.toArray(new QuadStateCheckBox.State[allowedStates.size()]));
check.setPropertyText(key);
check.setState(check.getState()); // to update the tooltip text
p.add(check, GBC.eol().fill(GBC.HORIZONTAL));
return true;
}
@Override
public void addCommands(List<Tag> changedTags) {
// if the user hasn't changed anything, don't create a command.
if (def == null && check.getState() == initialState) return;
// otherwise change things according to the selected value.
changedTags.add(new Tag(key,
check.getState() == QuadStateCheckBox.State.SELECTED ? value_on :
check.getState() == QuadStateCheckBox.State.NOT_SELECTED ? value_off :
null));
}
@Override
public MatchType getDefaultMatch() {
return MatchType.NONE;
}
@Override
public Collection<String> getValues() {
return disable_off ? Arrays.asList(value_on) : Arrays.asList(value_on, value_off);
}
@Override
public String toString() {
return "Check ["
+ (locale_text != null ? "locale_text=" + locale_text + ", " : "")
+ (value_on != null ? "value_on=" + value_on + ", " : "")
+ (value_off != null ? "value_off=" + value_off + ", " : "")
+ "default_=" + default_ + ", "
+ (check != null ? "check=" + check + ", " : "")
+ (initialState != null ? "initialState=" + initialState
+ ", " : "") + "def=" + def + ']';
}
}