/* * 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.client.ui.colorpicker; import com.google.gwt.dom.client.Element; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.HTMLTable.Cell; /** * Client side implementation for ColorPickerGrid. * * @since 7.0.0 * */ public class VColorPickerGrid extends AbsolutePanel implements ClickHandler, HasClickHandlers { private int rows = 1; private int columns = 1; private Grid grid; private boolean gridLoaded = false; private int selectedX; private int selectedY; /** * Instantiates the client side component for a color picker grid. */ public VColorPickerGrid() { super(); this.add(createGrid(), 0, 0); } /** * Creates a grid according to the current row and column count information. * * @return grid */ private Grid createGrid() { grid = new Grid(rows, columns); grid.setWidth("100%"); grid.setHeight("100%"); grid.addClickHandler(this); return grid; } /** * Updates the row and column count and creates a new grid based on them. * The new grid replaces the old grid if one existed. * <p> * For internal use only. May be renamed or removed in a future release. * * @param rowCount * @param columnCount */ public void updateGrid(int rowCount, int columnCount) { rows = rowCount; columns = columnCount; this.remove(grid); this.add(createGrid(), 0, 0); } /** * Updates the changed colors within the grid based on the given x- and * y-coordinates. Nothing happens if any of the parameters is null or the * parameter lengths don't match. * <p> * For internal use only. May be renamed or removed in a future release. * * @param changedColor * @param changedX * @param changedY */ public void updateColor(String[] changedColor, String[] changedX, String[] changedY) { if (changedColor != null && changedX != null && changedY != null) { if (changedColor.length == changedX.length && changedX.length == changedY.length) { for (int c = 0; c < changedColor.length; c++) { Element element = grid.getCellFormatter().getElement( Integer.parseInt(changedX[c]), Integer.parseInt(changedY[c])); element.getStyle().setProperty("background", changedColor[c]); } } gridLoaded = true; } } /** * Returns currently selected x-coordinate of the grid. */ public int getSelectedX() { return selectedX; } /** * Returns currently selected y-coordinate of the grid. */ public int getSelectedY() { return selectedY; } /** * Returns true if the colors have been successfully updated at least once, * false otherwise. * <p> * For internal use only. May be renamed or removed in a future release. */ public boolean isGridLoaded() { return gridLoaded; } @Override public void onClick(ClickEvent event) { Cell cell = grid.getCellForEvent(event); if (cell == null) { return; } selectedY = cell.getRowIndex(); selectedX = cell.getCellIndex(); } @Override public HandlerRegistration addClickHandler(ClickHandler handler) { return addDomHandler(handler, ClickEvent.getType()); } }