public MultiRowSelector(final Color... colors) {
final JColorSelectorComponent[][] comps = new JColorSelectorComponent[colors.length][1 + SECONDARY_ROWS];
for (int i = 0; i < colors.length; i++) {
Color primary = colors[i];
comps[i][0] = new JColorSelectorComponent(primary,
colorSelectorCallback);
wireToLRU(comps[i][0]);
this.add(comps[i][0]);
float[] primaryHsb = new float[3];
Color.RGBtoHSB(primary.getRed(), primary.getGreen(), primary
.getBlue(), primaryHsb);
for (int row = 1; row <= SECONDARY_ROWS; row++) {
float bFactor = (float) (row - 1)
/ (float) (SECONDARY_ROWS);
bFactor = (float) Math.pow(bFactor, 1.4f);
float brightness = 1.0f - bFactor;
if (primaryHsb[1] == 0.0f) {
// special handling for gray scale
float max = 0.5f + 0.5f * primaryHsb[2];
brightness = max * (SECONDARY_ROWS - row + 1)
/ SECONDARY_ROWS;
}
Color secondary = new Color(Color.HSBtoRGB(primaryHsb[0],
primaryHsb[1] * (row + 1) / (SECONDARY_ROWS + 1),
brightness));
comps[i][row] = new JColorSelectorComponent(secondary,
colorSelectorCallback);
comps[i][row].setTopOpen(row > 1);
comps[i][row].setBottomOpen(row < SECONDARY_ROWS);
wireToLRU(comps[i][row]);
this.add(comps[i][row]);