/*
* Copyright (C) 2014 Alfons Wirtz
* website www.freerouting.net
*
* This program 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 at <http://www.gnu.org/licenses/>
* for more details.
*
* ItemSelectionFilter.java
*
* Created on 14. Dezember 2004, 10:57
*/
package board;
import java.util.Set;
import java.util.TreeSet;
/**
* Filter for selecting items on the board.
*
* @author Alfons Wirtz
*/
public class ItemSelectionFilter implements java.io.Serializable
{
/**
* The possible choices in the filter.
*/
public enum SelectableChoices
{
TRACES, VIAS, PINS, CONDUCTION, KEEPOUT, VIA_KEEPOUT, COMPONENT_KEEPOUT, BOARD_OUTLINE, FIXED, UNFIXED
}
/**
* Creates a new filter with all item types selected.
*/
public ItemSelectionFilter()
{
this.values = new boolean[SelectableChoices.values().length];
java.util.Arrays.fill(this.values, true);
this.values[SelectableChoices.KEEPOUT.ordinal()] = false;
this.values[SelectableChoices.VIA_KEEPOUT.ordinal()] = false;
this.values[SelectableChoices.COMPONENT_KEEPOUT.ordinal()] = false;
this.values[SelectableChoices.CONDUCTION.ordinal()] = false;
this.values[SelectableChoices.BOARD_OUTLINE.ordinal()] = false;
}
/**
* Creates a new filter with only p_item_type selected.
*/
public ItemSelectionFilter(SelectableChoices p_item_type)
{
this.values = new boolean[SelectableChoices.values().length];
java.util.Arrays.fill(this.values, false);
values[p_item_type.ordinal()] = true;
values[SelectableChoices.FIXED.ordinal()] = true;
values[SelectableChoices.UNFIXED.ordinal()] = true;
}
/**
* Creates a new filter with only p_item_types selected.
*/
public ItemSelectionFilter(SelectableChoices[] p_item_types)
{
this.values = new boolean[SelectableChoices.values().length];
java.util.Arrays.fill(this.values, false);
for (int i = 0; i < p_item_types.length; ++i)
{
values[p_item_types[i].ordinal()] = true;
}
values[SelectableChoices.FIXED.ordinal()] = true;
values[SelectableChoices.UNFIXED.ordinal()] = true;
}
/**
* Copy constructor
*/
public ItemSelectionFilter(ItemSelectionFilter p_item_selection_filter)
{
this.values = new boolean[SelectableChoices.values().length];
for (int i = 0; i < this.values.length; ++i)
{
this.values[i] = p_item_selection_filter.values[i];
}
}
/**
* Selects or deselects an item type
*/
public void set_selected(SelectableChoices p_choice, boolean p_value)
{
values[p_choice.ordinal()] = p_value;
}
/**
* Selects all item types.
*/
public void select_all()
{
java.util.Arrays.fill(values, true);
}
/**
* Deselects all item types.
*/
public void deselect_all()
{
java.util.Arrays.fill(values, false);
}
/**
* Filters a collection of items with this filter.
*/
public Set<Item> filter(java.util.Set<board.Item> p_items)
{
Set<Item> result = new TreeSet<Item>();
for (board.Item curr_item : p_items)
{
if (curr_item.is_selected_by_filter(this))
{
result.add(curr_item);
}
}
return result;
}
/**
* Looks, if the input item type is selected.
*/
public boolean is_selected(SelectableChoices p_choice)
{
return values[p_choice.ordinal()];
}
/** the filter array of the item types */
private final boolean[] values;
}