/*
* 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.
*
* ViaRule.java
*
* Created on 31. Maerz 2005, 06:44
*/
package rules;
import java.util.List;
import java.util.LinkedList;
/**
* Contains an array of vias used for routing.
* Vias at the beginning of the array are preferred to later vias.
*
* @author Alfons Wirtz
*/
public class ViaRule implements java.io.Serializable, board.ObjectInfoPanel.Printable
{
/** Empty via rule. Must nott be changed. */
public static final ViaRule EMPTY = new ViaRule("empty");
public ViaRule (String p_name)
{
name = p_name;
}
public void append_via(ViaInfo p_via)
{
list.add(p_via);
}
/**
* Removes p_via from the rule.
* Returns false, if p_via was not contained in the rule.
*/
public boolean remove_via(ViaInfo p_via)
{
return list.remove(p_via);
}
public int via_count()
{
return list.size();
}
public ViaInfo get_via(int p_index)
{
assert p_index >= 0 && p_index < list.size();
return list.get(p_index);
}
public String toString()
{
return this.name;
}
/**
* Returns true, if p_via_info is contained in the via list of this rule.
*/
public boolean contains(ViaInfo p_via_info)
{
for (ViaInfo curr_info : this.list)
{
if (p_via_info == curr_info)
{
return true;
}
}
return false;
}
/**
* Returns true, if this rule contains a via with padstack p_padstack
*/
public boolean contains_padstack(library.Padstack p_padstack)
{
for (ViaInfo curr_info : this.list)
{
if (curr_info.get_padstack() == p_padstack)
{
return true;
}
}
return false;
}
/**
* Searchs a via in this rule with first layer = p_from_layer and last layer = p_to_layer.
* Returns null, if no such via exists.
*/
public ViaInfo get_layer_range(int p_from_layer, int p_to_layer)
{
for (ViaInfo curr_info : this.list)
{
if (curr_info.get_padstack().from_layer() == p_from_layer && curr_info.get_padstack().to_layer() == p_to_layer)
{
return curr_info;
}
}
return null;
}
/**
* Swaps the locations of p_1 and p_2 in the rule.
* Returns false, if p_1 or p_2 were not found in the list.
*/
public boolean swap(ViaInfo p_1, ViaInfo p_2)
{
int index_1 = this.list.indexOf(p_1);
int index_2 = this.list.indexOf(p_2);
if (index_1 < 0 || index_2 < 0)
{
return false;
}
if (index_1 == index_2)
{
return true;
}
this.list.set(index_1, p_2);
this.list.set(index_2, p_1);
return true;
}
public void print_info(board.ObjectInfoPanel p_window, java.util.Locale p_locale)
{
java.util.ResourceBundle resources =
java.util.ResourceBundle.getBundle("board.resources.ObjectInfoPanel", p_locale);
p_window.append_bold(resources.getString("via_rule_2") + " ");
p_window.append_bold(this.name);
p_window.append_bold(":");
int counter = 0;
boolean first_time = true;
final int max_vias_per_row = 5;
for (ViaInfo curr_via : this.list)
{
if (first_time)
{
first_time = false;
}
else
{
p_window.append(", ");
}
if (counter == 0)
{
p_window.newline();
p_window.indent();
}
p_window.append(curr_via.get_name(), resources.getString("via_info"), curr_via);
counter = (counter + 1) % max_vias_per_row;
}
}
public final String name;
private List<ViaInfo> list = new LinkedList<ViaInfo>();
}