/*
* 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.
*
* ColorTableModel.java
*
* Created on 4. August 2003, 08:26
*/
package boardgraphics;
import java.awt.Color;
/**
* Stores the layer dependent colors used for drawing for the items on the board.
*
* @author Alfons Wirtz
*/
public class ItemColorTableModel extends ColorTableModel implements java.io.Serializable
{
public ItemColorTableModel(board.LayerStructure p_layer_structure, java.util.Locale p_locale)
{
super(p_layer_structure.arr.length, p_locale);
int row_count = p_layer_structure.arr.length;
final int item_type_count = ColumnNames.values().length - 1;
int signal_layer_no = 0;
for( int layer = 0; layer < row_count; ++layer)
{
boolean is_signal_layer = p_layer_structure.arr[layer].is_signal;
data[layer] = new Object [item_type_count + 1];
Object[] curr_row = data[layer];
curr_row[0] = p_layer_structure.arr[layer].name;
if (layer == 0)
{
curr_row[ColumnNames.PINS.ordinal()] = new Color(150, 50, 0);
curr_row[ColumnNames.TRACES.ordinal()] = Color.red;
curr_row[ColumnNames.CONDUCTION_AREAS.ordinal()] = new Color(0, 150, 0);
curr_row[ColumnNames.KEEPOUTS.ordinal()] = new Color(0, 110, 110);
curr_row[ColumnNames.PLACE_KEEPOUTS.ordinal()] = new Color(150, 50, 0);
}
else if (layer == row_count - 1)
{
curr_row[ColumnNames.PINS.ordinal()] = new Color(160, 80, 0);
curr_row[ColumnNames.TRACES.ordinal()] = Color.blue;
curr_row[ColumnNames.CONDUCTION_AREAS.ordinal()] = new Color(100, 100, 0);
curr_row[ColumnNames.KEEPOUTS.ordinal()] = new Color(0, 100, 160);
curr_row[ColumnNames.PLACE_KEEPOUTS.ordinal()] = new Color(160, 80, 0);
}
else // inner layer
{
if (is_signal_layer)
{
// currenntly 6 different default colors for traces on the inner layers
final int different_inner_colors = 6;
int remainder = signal_layer_no % different_inner_colors;
if (remainder % different_inner_colors == 1)
{
curr_row[ColumnNames.TRACES.ordinal()] = Color.GREEN;
}
else if (remainder % different_inner_colors == 2)
{
curr_row[ColumnNames.TRACES.ordinal()] = Color.YELLOW;
}
else if (remainder % different_inner_colors == 3)
{
curr_row[ColumnNames.TRACES.ordinal()] = new Color(200, 100, 255);
}
else if (remainder % different_inner_colors == 4)
{
curr_row[ColumnNames.TRACES.ordinal()] = new Color(255, 150, 150);
}
else if (remainder % different_inner_colors == 5)
{
curr_row[ColumnNames.TRACES.ordinal()] = new Color(100, 150, 0);
}
else
{
curr_row[ColumnNames.TRACES.ordinal()] = new Color(0, 200, 255);
}
}
else // power layer
{
curr_row [ColumnNames.TRACES.ordinal()] = Color.BLACK;
}
curr_row[ColumnNames.PINS.ordinal()] = new Color(255, 150, 0);
curr_row[ColumnNames.CONDUCTION_AREAS.ordinal()] = new Color(0, 200, 60);
curr_row[ColumnNames.KEEPOUTS.ordinal()] = new Color(0, 200, 200);
curr_row[ColumnNames.PLACE_KEEPOUTS.ordinal()] = new Color(150, 50, 0);
}
curr_row[ColumnNames.VIAS.ordinal()] = new Color(200, 200, 0);
curr_row[ColumnNames.FIXED_VIAS.ordinal()] = curr_row[ColumnNames.VIAS.ordinal()];
curr_row[ColumnNames.FIXED_TRACES.ordinal()] = curr_row[ColumnNames.TRACES.ordinal()];
curr_row[ColumnNames.VIA_KEEPOUTS.ordinal()] = new Color(100, 100, 100);
if (is_signal_layer)
{
++signal_layer_no;
}
}
}
public ItemColorTableModel(java.io.ObjectInputStream p_stream)
throws java.io.IOException, java.lang.ClassNotFoundException
{
super(p_stream);
}
/**
* Copy construcror.
*/
public ItemColorTableModel(ItemColorTableModel p_item_color_model)
{
super(p_item_color_model.data.length, p_item_color_model.locale);
for (int i = 0; i < this.data.length; ++i)
{
this.data[i] = new Object[p_item_color_model.data[i].length];
System.arraycopy(p_item_color_model.data[i], 0, this.data[i], 0, this.data[i].length);
}
}
public int getColumnCount()
{
return ColumnNames.values().length;
}
public int getRowCount()
{
return data.length;
}
public String getColumnName(int p_col)
{
java.util.ResourceBundle resources =
java.util.ResourceBundle.getBundle("boardgraphics.resources.ColorTableModel", this.locale);
return resources.getString(ColumnNames.values()[p_col].toString());
}
public void setValueAt(Object p_value, int p_row, int p_col)
{
super.setValueAt(p_value, p_row, p_col);
this.item_colors_precalculated = false;
}
/**
* Don't need to implement this method unless your table's
* editable.
*/
public boolean isCellEditable(int p_row, int p_col)
{
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
return p_col >= 1;
}
Color[] get_trace_colors(boolean p_fixed)
{
if (!item_colors_precalculated)
{
precalulate_item_colors();
}
Color[] result;
if (p_fixed)
{
result = precalculated_item_colors[ColumnNames.FIXED_TRACES.ordinal() - 1];
}
else
{
result = precalculated_item_colors[ColumnNames.TRACES.ordinal() - 1];
}
return result;
}
Color[] get_via_colors(boolean p_fixed)
{
if (!item_colors_precalculated)
{
precalulate_item_colors();
}
Color[] result;
if (p_fixed)
{
result = precalculated_item_colors[ColumnNames.FIXED_VIAS.ordinal() - 1];
}
else
{
result = precalculated_item_colors[ColumnNames.VIAS.ordinal() - 1];
}
return result;
}
Color[] get_pin_colors()
{
if (!item_colors_precalculated)
{
precalulate_item_colors();
}
return precalculated_item_colors[ColumnNames.PINS.ordinal() - 1];
}
Color[] get_conduction_colors()
{
if (!item_colors_precalculated)
{
precalulate_item_colors();
}
return precalculated_item_colors[ColumnNames.CONDUCTION_AREAS.ordinal() - 1];
}
Color[] get_obstacle_colors()
{
if (!item_colors_precalculated)
{
precalulate_item_colors();
}
return precalculated_item_colors[ColumnNames.KEEPOUTS.ordinal() - 1];
}
Color[] get_via_obstacle_colors()
{
if (!item_colors_precalculated)
{
precalulate_item_colors();
}
return precalculated_item_colors[ColumnNames.VIA_KEEPOUTS.ordinal() - 1];
}
Color[] get_place_obstacle_colors()
{
if (!item_colors_precalculated)
{
precalulate_item_colors();
}
return precalculated_item_colors[ColumnNames.PLACE_KEEPOUTS.ordinal() - 1];
}
public void set_trace_colors(Color[] p_color_arr, boolean p_fixed)
{
if (p_fixed)
{
set_colors(ColumnNames.FIXED_TRACES.ordinal(), p_color_arr);
}
else
{
set_colors(ColumnNames.TRACES.ordinal(), p_color_arr);
}
}
public void set_via_colors(Color[] p_color_arr, boolean p_fixed)
{
if (p_fixed)
{
set_colors(ColumnNames.FIXED_VIAS.ordinal(), p_color_arr);
}
else
{
set_colors(ColumnNames.VIAS.ordinal(), p_color_arr);
}
}
public void set_pin_colors(Color[] p_color_arr)
{
set_colors(ColumnNames.PINS.ordinal(), p_color_arr);
}
public void set_conduction_colors(Color[] p_color_arr)
{
set_colors(ColumnNames.CONDUCTION_AREAS.ordinal(), p_color_arr);
}
public void set_keepout_colors(Color[] p_color_arr)
{
set_colors(ColumnNames.KEEPOUTS.ordinal(), p_color_arr);
}
public void set_via_keepout_colors(Color[] p_color_arr)
{
set_colors(ColumnNames.VIA_KEEPOUTS.ordinal(), p_color_arr);
}
public void set_place_keepout_colors(Color[] p_color_arr)
{
set_colors(ColumnNames.PLACE_KEEPOUTS.ordinal(), p_color_arr);
}
private void set_colors(int p_item_type, Color[] p_color_arr)
{
for (int layer = 0; layer < this.data.length - 1; ++layer)
{
int color_index = layer % p_color_arr.length;
this.data[layer][p_item_type] = p_color_arr[color_index];
}
data[this.data.length - 1][p_item_type] = p_color_arr[p_color_arr.length - 1];
this.item_colors_precalculated = false;
}
private void precalulate_item_colors()
{
precalculated_item_colors = new Color[ColumnNames.values().length - 1][];
for (int i = 0; i < precalculated_item_colors.length; ++i)
{
precalculated_item_colors[i] = new Color[data.length];
Color[] curr_row = precalculated_item_colors[i];
for (int j = 0; j < data.length; ++j)
{
curr_row[j] = (Color) getValueAt(j, i + 1);
}
}
this.item_colors_precalculated = true;
}
private transient boolean item_colors_precalculated = false;
private transient Color[][] precalculated_item_colors = null;
private enum ColumnNames
{
LAYER, TRACES, FIXED_TRACES, VIAS, FIXED_VIAS, PINS, CONDUCTION_AREAS, KEEPOUTS, VIA_KEEPOUTS, PLACE_KEEPOUTS
}
}