/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.ui.color;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.eclipse.swt.graphics.RGB;
public class PaletteContents {
private static PaletteContents instance = null;
public static PaletteContents getDefault() {
if (instance == null) {
PaletteContents palette = new PaletteContents(30, 5, 6);
// row 1
palette.addItem(PaletteItem.Black);
palette.addItem(PaletteItem.Red);
palette.addItem(PaletteItem.Yellow);
palette.addItem(PaletteItem.Green);
palette.addItem(PaletteItem.Blue);
palette.addItem(PaletteItem.Purple);
// row 2
palette.addItem(PaletteItem.DarkGray);
palette.addItem(PaletteItem.DarkRed);
palette.addItem(PaletteItem.DarkYellow);
palette.addItem(PaletteItem.DarkGreen);
palette.addItem(PaletteItem.DarkBlue);
palette.addItem(PaletteItem.DarkPurple);
// row 3
palette.addItem(PaletteItem.Gray);
palette.addItem(PaletteItem.Rose);
palette.addItem(PaletteItem.Orange);
palette.addItem(PaletteItem.Lemon);
palette.addItem(PaletteItem.LimeGreen);
palette.addItem(PaletteItem.Turquoise);
// row 4
palette.addItem(PaletteItem.LightGray);
palette.addItem(PaletteItem.Copper);
palette.addItem(PaletteItem.GoldenOlive);
palette.addItem(PaletteItem.Beige);
palette.addItem(PaletteItem.Sapphire);
palette.addItem(PaletteItem.Lavender);
// row 5
palette.addItem(PaletteItem.White);
palette.addItem(PaletteItem.Khaki);
palette.addItem(PaletteItem.ForestGreen);
palette.addItem(PaletteItem.AntiqueBlue);
palette.addItem(PaletteItem.Indigo);
palette.addItem(PaletteItem.Violet);
instance = palette;
}
return instance;
}
private List<PaletteItem> items;
private int prefRows;
private int prefColumns;
public PaletteContents() {
this(10);
}
public PaletteContents(int num) {
this(num, calcRows(num));
}
public PaletteContents(int num, int preferredRows) {
this(num, preferredRows, calcColumns(num, preferredRows));
}
public PaletteContents(int num, int preferredRows, int preferredColumns) {
if (num <= 0)
throw new IllegalArgumentException();
this.items = new ArrayList<PaletteItem>(num);
this.prefRows = Math.min(Math.max(preferredRows, 1), num);
this.prefColumns = Math.min(Math.max(preferredColumns, 1), num);
}
public PaletteContents(PaletteItem[] items) {
this.items = new ArrayList<PaletteItem>(Arrays.asList(items));
this.prefRows = calcRows(items.length);
this.prefColumns = calcColumns(items.length, prefRows);
}
public void addItem(RGB color, String description) {
addItem(new PaletteItem(color, description));
}
public void addItem(int r, int g, int b, String description) {
addItem(new RGB(r, g, b), description);
}
public void addItem(int color, String description) {
addItem((color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff,
description);
}
public void addItem(PaletteItem item) {
items.add(item);
}
public void clear() {
items.clear();
}
public RGB getColor(int index) {
return items.get(index).color;
}
public String getDescription(int index) {
return items.get(index).description;
}
public int getPreferredRows() {
return prefRows;
}
public int getPreferredColumns() {
return prefColumns;
}
public int size() {
return items.size();
}
public PaletteItem[] toArray() {
return items.toArray(new PaletteItem[items.size()]);
}
public List<PaletteItem> toList() {
return Collections.unmodifiableList(items);
}
public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj == this)
return true;
if (!(obj instanceof PaletteContents))
return false;
PaletteContents that = (PaletteContents) obj;
return this.items.equals(that.items);
}
public int hashCode() {
return items.hashCode();
}
private static int calcRows(int num) {
return (int) Math.sqrt(num);
}
private static int calcColumns(int num, int rows) {
return rows == 0 ? 0 : (num + rows - 1) / rows;
}
}