/*
* 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.
*
* WindowRouteStubs.java
*
* Created on 17. Februar 2006, 07:16
*
*/
package gui;
import java.util.Collection;
import java.util.Set;
import java.util.SortedSet;
import java.util.Iterator;
import datastructures.Signum;
import geometry.planar.FloatPoint;
import board.Item;
/**
*
* @author Alfons Wirtz
*/
public class WindowRouteStubs extends WindowObjectListWithFilter
{
/** Creates a new instance of WindowRouteStubs */
public WindowRouteStubs(BoardFrame p_board_frame)
{
super(p_board_frame);
this.resources = java.util.ResourceBundle.getBundle("gui.resources.CleanupWindows", p_board_frame.get_locale());
this.setTitle(resources.getString("route_stubs"));
this.list_empty_message.setText(resources.getString("no_route_stubs_found"));
p_board_frame.set_context_sensitive_help(this, "WindowObjectList_RouteStubs");
}
protected void fill_list()
{
board.BasicBoard routing_board = this.board_frame.board_panel.board_handling.get_routing_board();
SortedSet<RouteStubInfo> route_stub_info_set = new java.util.TreeSet<RouteStubInfo>();
Collection<Item> board_items = routing_board.get_items();
for (Item curr_item : board_items)
{
if (!(curr_item instanceof board.Trace || curr_item instanceof board.Via))
{
continue;
}
if (curr_item.net_count() != 1)
{
continue;
}
FloatPoint stub_location;
int stub_layer;
if (curr_item instanceof board.Via)
{
Collection<Item> contact_list = curr_item.get_all_contacts();
if (contact_list.isEmpty())
{
stub_layer = curr_item.first_layer();
}
else
{
Iterator<Item> it = contact_list.iterator();
Item curr_contact_item = it.next();
int first_contact_first_layer = curr_contact_item.first_layer();
int first_contact_last_layer = curr_contact_item.last_layer();
boolean all_contacts_on_one_layer = true;
while (it.hasNext())
{
curr_contact_item = it.next();
if (curr_contact_item.first_layer() != first_contact_first_layer
|| curr_contact_item.last_layer() != first_contact_last_layer)
{
all_contacts_on_one_layer = false;
break;
}
}
if (!all_contacts_on_one_layer)
{
continue;
}
if (curr_item.first_layer() >= first_contact_first_layer &&
curr_item.last_layer() <= first_contact_first_layer)
{
stub_layer = first_contact_first_layer;
}
else
{
stub_layer = first_contact_last_layer;
}
}
stub_location = ((board.Via)curr_item).get_center().to_float();
}
else
{
board.Trace curr_trace = (board.Trace) curr_item;
if (curr_trace.get_start_contacts().isEmpty())
{
stub_location = curr_trace.first_corner().to_float();
}
else if (curr_trace.get_end_contacts().isEmpty())
{
stub_location = curr_trace.last_corner().to_float();
}
else
{
continue;
}
stub_layer = curr_trace.get_layer();
}
RouteStubInfo curr_route_stub_info = new RouteStubInfo(curr_item, stub_location, stub_layer);
route_stub_info_set.add(curr_route_stub_info);
}
for (RouteStubInfo curr_info : route_stub_info_set)
{
this.add_to_list(curr_info);
}
this.list.setVisibleRowCount(Math.min(route_stub_info_set.size(), DEFAULT_TABLE_SIZE));
}
protected void select_instances()
{
Object[] selected_list_values = list.getSelectedValuesList().toArray();
if (selected_list_values.length <= 0)
{
return;
}
Set<board.Item> selected_items = new java.util.TreeSet<board.Item>();
for (int i = 0; i < selected_list_values.length; ++i)
{
selected_items.add(((RouteStubInfo)selected_list_values[i]).stub_item);
}
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;
/**
* Describes information of a route stub in the list.
*/
private class RouteStubInfo implements Comparable<RouteStubInfo>
{
public RouteStubInfo(Item p_stub, FloatPoint p_location, int p_layer_no)
{
interactive.BoardHandling board_handling = board_frame.board_panel.board_handling;
this.stub_item = p_stub;
this.location = board_handling.coordinate_transform.board_to_user(p_location);
this.layer_no = p_layer_no;
int net_no = p_stub.get_net_no(0);
this.net = board_handling.get_routing_board().rules.nets.get(net_no);
}
public String toString()
{
String item_string;
if (this.stub_item instanceof board.Trace)
{
item_string = resources.getString("trace");
}
else
{
item_string = resources.getString("via");
}
String layer_name = board_frame.board_panel.board_handling.get_routing_board().layer_structure.arr[layer_no].name;
String result = item_string + " " + resources.getString("stub_net") + " " + this.net.name + " " +
resources.getString("at") + " " + this.location.to_string(board_frame.get_locale()) + " " +
resources.getString("on_layer") + " " + layer_name;
return result;
}
public int compareTo(RouteStubInfo p_other)
{
int result = this.net.name.compareTo(p_other.net.name);
if (result == 0)
{
result = Signum.as_int(this.location.x - p_other.location.x);
}
if (result == 0)
{
result = Signum.as_int(this.location.y - p_other.location.y);
}
if (result == 0)
{
result = this.layer_no - p_other.layer_no;
}
return result;
}
private final Item stub_item;
private final rules.Net net;
private final FloatPoint location;
private final int layer_no;
}
}