/*
* 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.
*
* WindowLengthViolations.java
*
* Created on 1. Juni 2005, 06:52
*
*/
package gui;
import rules.Net;
import rules.Nets;
import rules.NetClass;
import interactive.RatsNest;
/**
*
* @author Alfons Wirtz
*/
public class WindowLengthViolations extends WindowObjectListWithFilter
{
/** Creates a new instance of WindowLengthViolations */
public WindowLengthViolations(BoardFrame p_board_frame)
{
super(p_board_frame);
this.resources = java.util.ResourceBundle.getBundle("gui.resources.WindowLengthViolations", p_board_frame.get_locale());
this.setTitle(resources.getString("title"));
this.list_empty_message.setText(resources.getString("list_empty"));
p_board_frame.set_context_sensitive_help(this, "WindowObjectList_LengthViolations");
}
protected void fill_list()
{
RatsNest ratsnest = this.board_frame.board_panel.board_handling.get_ratsnest();
Nets net_list = this.board_frame.board_panel.board_handling.get_routing_board().rules.nets;
java.util.SortedSet<LengthViolation> length_violations = new java.util.TreeSet<LengthViolation>();
for (int net_index = 1; net_index <= net_list.max_net_no(); ++net_index)
{
double curr_violation_length = ratsnest.get_length_violation(net_index);
if (curr_violation_length != 0)
{
LengthViolation curr_length_violation = new LengthViolation(net_list.get(net_index), curr_violation_length);
length_violations.add(curr_length_violation);
}
}
for (LengthViolation curr_violation : length_violations)
{
this.add_to_list(curr_violation);
}
this.list.setVisibleRowCount(Math.min(length_violations.size(), DEFAULT_TABLE_SIZE));
}
protected void select_instances()
{
Object[] selected_violations = list.getSelectedValues();
if (selected_violations.length <= 0)
{
return;
}
java.util.Set<board.Item> selected_items = new java.util.TreeSet<board.Item>();
for (int i = 0; i < selected_violations.length; ++i)
{
LengthViolation curr_violation = ((LengthViolation) selected_violations[i]);
selected_items.addAll(curr_violation.net.get_items());
}
interactive.BoardHandling board_handling = board_frame.board_panel.board_handling;
board_handling.select_items(selected_items);
board_handling.zoom_selection();
}
private final java.util.ResourceBundle resources;
private class LengthViolation implements Comparable<LengthViolation>
{
LengthViolation(Net p_net, double p_violation_length)
{
net = p_net;
violation_length = p_violation_length;
}
public int compareTo(LengthViolation p_other)
{
return this.net.name.compareToIgnoreCase(p_other.net.name);
}
public String toString()
{
board.CoordinateTransform coordinate_transform = board_frame.board_panel.board_handling.coordinate_transform;
NetClass net_class = this.net.get_class();
Float allowed_length;
String allowed_string;
if (violation_length > 0)
{
allowed_length = (float) coordinate_transform.board_to_user(net_class.get_maximum_trace_length());
allowed_string = " " + resources.getString("maximum_allowed") + " ";
}
else
{
allowed_length = (float) coordinate_transform.board_to_user(net_class.get_minimum_trace_length());
allowed_string = " " + resources.getString("minimum_allowed") + " ";
}
Float length = (float) coordinate_transform.board_to_user(this.net.get_trace_length());
String result = resources.getString("net") + " " + this.net.name + resources.getString("trace_length")
+ " " + length.toString() + allowed_string + allowed_length;
return result;
}
final Net net;
final double violation_length;
}
}