/* * Copyright 2015 JBoss, by Red Hat, Inc * * 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 org.uberfire.ext.widgets.common.client.colorpicker; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.event.dom.client.MouseMoveEvent; import com.google.gwt.event.dom.client.MouseMoveHandler; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOutHandler; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.MouseUpHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.Composite; import org.uberfire.ext.widgets.common.client.colorpicker.canvas.Canvas; import org.uberfire.ext.widgets.common.client.colorpicker.canvas.RenderingContext; public class HuePicker extends Composite { private Canvas canvas; private int handleY = 90; private boolean mouseDown; public HuePicker() { canvas = new Canvas(); canvas.setStylePrimaryName("subshell-HuePicker"); canvas.setCanvasSize(26, 180); initWidget(canvas); canvas.addMouseDownHandler(new MouseDownHandler() { public void onMouseDown(MouseDownEvent event) { handleY = event.getRelativeY(canvas.getElement()); drawGradient(); fireHueChanged(getHue()); mouseDown = true; } }); canvas.addMouseMoveHandler(new MouseMoveHandler() { public void onMouseMove(MouseMoveEvent event) { if (mouseDown) { handleY = event.getRelativeY(canvas.getElement()); drawGradient(); fireHueChanged(getHue()); } } }); canvas.addMouseUpHandler(new MouseUpHandler() { public void onMouseUp(MouseUpEvent event) { mouseDown = false; } }); canvas.addMouseOutHandler(new MouseOutHandler() { public void onMouseOut(MouseOutEvent event) { mouseDown = false; } }); } @Override protected void onAttach() { super.onAttach(); drawGradient(); } private void drawGradient() { RenderingContext ctx = canvas.getContext(); // draw gradient ctx.setFillStyle("#ffffff"); ctx.fillRect(0, 0, 26, 180); for (int y = 0; y <= 179; y++) { String hex = ColorUtils.hsl2hex(y * 2, 100, 100); ctx.setFillStyle("#" + hex); ctx.fillRect(3, y, 20, 1); } // draw handle if (handleY >= 0) { ctx.setFillStyle("#000000"); ctx.beginPath(); ctx.moveTo(3, handleY); ctx.lineTo(0, handleY - 3); ctx.lineTo(0, handleY + 3); ctx.closePath(); ctx.fill(); ctx.moveTo(23, handleY); ctx.lineTo(26, handleY - 3); ctx.lineTo(26, handleY + 3); ctx.closePath(); ctx.fill(); } } public HandlerRegistration addHueChangedHandler(HueChangedHandler handler) { return addHandler(handler, HueChangedEvent.getType()); } private void fireHueChanged(int hue) { fireEvent(new HueChangedEvent(hue)); } public int getHue() { return handleY * 2; } public void setHue(int hue) { handleY = (int) Math.min(Math.max(Math.round(hue / 2d), 0d), 179d); drawGradient(); fireHueChanged(hue); } }