/* * Copyright 2000-2016 Vaadin Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.vaadin.v7.ui.components.colorpicker; import java.awt.Point; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import com.vaadin.ui.AbstractComponent; import com.vaadin.v7.shared.ui.colorpicker.Color; import com.vaadin.v7.shared.ui.colorpicker.ColorPickerGridServerRpc; import com.vaadin.v7.shared.ui.colorpicker.ColorPickerGridState; /** * A component that represents a color selection grid within a color picker. * * @since 7.0.0 */ @Deprecated public class ColorPickerGrid extends AbstractComponent implements ColorSelector { private static final String STYLENAME = "v-colorpicker-grid"; private static final Method COLOR_CHANGE_METHOD; static { try { COLOR_CHANGE_METHOD = ColorChangeListener.class.getDeclaredMethod( "colorChanged", new Class[] { ColorChangeEvent.class }); } catch (final java.lang.NoSuchMethodException e) { // This should never happen throw new java.lang.RuntimeException( "Internal error finding methods in ColorPicker"); } } private ColorPickerGridServerRpc rpc = new ColorPickerGridServerRpc() { @Override public void select(int x, int y) { ColorPickerGrid.this.x = x; ColorPickerGrid.this.y = y; fireColorChanged(colorGrid[y][x]); } @Override public void refresh() { for (int row = 0; row < rows; row++) { for (int col = 0; col < columns; col++) { changedColors.put(new Point(row, col), colorGrid[row][col]); } } sendChangedColors(); markAsDirty(); } }; /** The x-coordinate. */ private int x = 0; /** The y-coordinate. */ private int y = 0; /** The rows. */ private int rows; /** The columns. */ private int columns; /** The color grid. */ private Color[][] colorGrid = new Color[1][1]; /** The changed colors. */ private final Map<Point, Color> changedColors = new HashMap<Point, Color>(); /** * Instantiates a new color picker grid. */ public ColorPickerGrid() { registerRpc(rpc); setPrimaryStyleName(STYLENAME); setColorGrid(new Color[1][1]); setColor(Color.WHITE); } /** * Instantiates a new color picker grid. * * @param rows * the rows * @param columns * the columns */ public ColorPickerGrid(int rows, int columns) { registerRpc(rpc); setPrimaryStyleName(STYLENAME); setColorGrid(new Color[rows][columns]); setColor(Color.WHITE); } /** * Instantiates a new color picker grid. * * @param colors * the colors */ public ColorPickerGrid(Color[][] colors) { registerRpc(rpc); setPrimaryStyleName(STYLENAME); setColorGrid(colors); } private void setColumnCount(int columns) { this.columns = columns; getState().columnCount = columns; } private void setRowCount(int rows) { this.rows = rows; getState().rowCount = rows; } private void sendChangedColors() { if (!changedColors.isEmpty()) { String[] colors = new String[changedColors.size()]; String[] XCoords = new String[changedColors.size()]; String[] YCoords = new String[changedColors.size()]; int counter = 0; for (Point p : changedColors.keySet()) { Color c = changedColors.get(p); if (c == null) { continue; } String color = c.getCSS(); colors[counter] = color; XCoords[counter] = String.valueOf((int) p.getX()); YCoords[counter] = String.valueOf((int) p.getY()); counter++; } getState().changedColor = colors; getState().changedX = XCoords; getState().changedY = YCoords; changedColors.clear(); } } /** * Sets the color grid. * * @param colors * the new color grid */ public void setColorGrid(Color[][] colors) { setRowCount(colors.length); setColumnCount(colors[0].length); colorGrid = colors; for (int row = 0; row < rows; row++) { for (int col = 0; col < columns; col++) { changedColors.put(new Point(row, col), colorGrid[row][col]); } } sendChangedColors(); markAsDirty(); } /** * Adds a color change listener * * @param listener * The color change listener */ @Override public void addColorChangeListener(ColorChangeListener listener) { addListener(ColorChangeEvent.class, listener, COLOR_CHANGE_METHOD); } @Override public Color getColor() { return colorGrid[x][y]; } /** * Removes a color change listener * * @param listener * The listener */ @Override public void removeColorChangeListener(ColorChangeListener listener) { removeListener(ColorChangeEvent.class, listener); } @Override public void setColor(Color color) { colorGrid[x][y] = color; changedColors.put(new Point(x, y), color); sendChangedColors(); markAsDirty(); } /** * Sets the position. * * @param x * the x * @param y * the y */ public void setPosition(int x, int y) { if (x >= 0 && x < columns && y >= 0 && y < rows) { this.x = x; this.y = y; } } /** * Gets the position. * * @return the position */ public int[] getPosition() { return new int[] { x, y }; } /** * Notifies the listeners that a color change has occurred * * @param color * The color which it changed to */ public void fireColorChanged(Color color) { fireEvent(new ColorChangeEvent(this, color)); } @Override protected ColorPickerGridState getState() { return (ColorPickerGridState) super.getState(); } }