You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ColorPickerPopup.java 24KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777
  1. /*
  2. * Copyright 2000-2016 Vaadin Ltd.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.vaadin.v7.ui.components.colorpicker;
  17. import java.lang.reflect.Method;
  18. import java.util.ArrayList;
  19. import java.util.Collections;
  20. import java.util.HashSet;
  21. import java.util.Iterator;
  22. import java.util.List;
  23. import java.util.Set;
  24. import java.util.logging.Level;
  25. import java.util.logging.Logger;
  26. import com.vaadin.shared.ui.MarginInfo;
  27. import com.vaadin.ui.Alignment;
  28. import com.vaadin.ui.Button;
  29. import com.vaadin.ui.Button.ClickEvent;
  30. import com.vaadin.ui.Button.ClickListener;
  31. import com.vaadin.ui.Component;
  32. import com.vaadin.ui.HorizontalLayout;
  33. import com.vaadin.ui.Layout;
  34. import com.vaadin.ui.TabSheet;
  35. import com.vaadin.ui.VerticalLayout;
  36. import com.vaadin.ui.Window;
  37. import com.vaadin.v7.data.Property.ValueChangeEvent;
  38. import com.vaadin.v7.data.Property.ValueChangeListener;
  39. import com.vaadin.v7.shared.ui.colorpicker.Color;
  40. import com.vaadin.v7.ui.AbstractColorPicker.Coordinates2Color;
  41. import com.vaadin.v7.ui.Slider;
  42. import com.vaadin.v7.ui.Slider.ValueOutOfBoundsException;
  43. /**
  44. * A component that represents color selection popup within a color picker.
  45. *
  46. * @since 7.0.0
  47. */
  48. @Deprecated
  49. public class ColorPickerPopup extends Window
  50. implements ClickListener, ColorChangeListener, ColorSelector {
  51. private static final String STYLENAME = "v-colorpicker-popup";
  52. private static final Method COLOR_CHANGE_METHOD;
  53. static {
  54. try {
  55. COLOR_CHANGE_METHOD = ColorChangeListener.class.getDeclaredMethod(
  56. "colorChanged", new Class[] { ColorChangeEvent.class });
  57. } catch (final java.lang.NoSuchMethodException e) {
  58. // This should never happen
  59. throw new java.lang.RuntimeException(
  60. "Internal error finding methods in ColorPicker");
  61. }
  62. }
  63. /** The tabs. */
  64. private final TabSheet tabs = new TabSheet();
  65. private Component rgbTab;
  66. private Component hsvTab;
  67. private Component swatchesTab;
  68. /** The layout. */
  69. private final VerticalLayout layout;
  70. /** The ok button. */
  71. private final Button ok = new Button("OK");
  72. /** The cancel button. */
  73. private final Button cancel = new Button("Cancel");
  74. /** The resize button. */
  75. private final Button resize = new Button("show/hide history");
  76. /** The selected color. */
  77. private Color selectedColor = Color.WHITE;
  78. /** The history. */
  79. private ColorPickerHistory history;
  80. /** The history container. */
  81. private Layout historyContainer;
  82. /** The rgb gradient. */
  83. private ColorPickerGradient rgbGradient;
  84. /** The hsv gradient. */
  85. private ColorPickerGradient hsvGradient;
  86. /** The red slider. */
  87. private Slider redSlider;
  88. /** The green slider. */
  89. private Slider greenSlider;
  90. /** The blue slider. */
  91. private Slider blueSlider;
  92. /** The hue slider. */
  93. private Slider hueSlider;
  94. /** The saturation slider. */
  95. private Slider saturationSlider;
  96. /** The value slider. */
  97. private Slider valueSlider;
  98. /** The preview on the rgb tab. */
  99. private ColorPickerPreview rgbPreview;
  100. /** The preview on the hsv tab. */
  101. private ColorPickerPreview hsvPreview;
  102. /** The preview on the swatches tab. */
  103. private ColorPickerPreview selPreview;
  104. /** The color select. */
  105. private ColorPickerSelect colorSelect;
  106. /** The selectors. */
  107. private final Set<ColorSelector> selectors = new HashSet<>();
  108. /**
  109. * Set true while the slider values are updated after colorChange. When
  110. * true, valueChange reactions from the sliders are disabled, because
  111. * otherwise the set color may become corrupted as it is repeatedly re-set
  112. * in valueChangeListeners using values from sliders that may not have been
  113. * updated yet.
  114. */
  115. private boolean updatingColors = false;
  116. private ColorPickerPopup() {
  117. // Set the layout
  118. layout = new VerticalLayout();
  119. layout.setSpacing(false);
  120. layout.setMargin(false);
  121. layout.setWidth("100%");
  122. layout.setHeight(null);
  123. setContent(layout);
  124. setStyleName(STYLENAME);
  125. setResizable(false);
  126. // Create the history
  127. history = new ColorPickerHistory();
  128. history.addColorChangeListener(this);
  129. }
  130. /**
  131. * Instantiates a new color picker popup.
  132. */
  133. public ColorPickerPopup(Color initialColor) {
  134. this();
  135. selectedColor = initialColor;
  136. initContents();
  137. }
  138. private void initContents() {
  139. // Create the preview on the rgb tab
  140. rgbPreview = new ColorPickerPreview(selectedColor);
  141. rgbPreview.setWidth("240px");
  142. rgbPreview.setHeight("20px");
  143. rgbPreview.addColorChangeListener(this);
  144. selectors.add(rgbPreview);
  145. // Create the preview on the hsv tab
  146. hsvPreview = new ColorPickerPreview(selectedColor);
  147. hsvPreview.setWidth("240px");
  148. hsvPreview.setHeight("20px");
  149. hsvPreview.addColorChangeListener(this);
  150. selectors.add(hsvPreview);
  151. // Create the preview on the swatches tab
  152. selPreview = new ColorPickerPreview(selectedColor);
  153. selPreview.setWidth("100%");
  154. selPreview.setHeight("20px");
  155. selPreview.addColorChangeListener(this);
  156. selectors.add(selPreview);
  157. // Create the tabs
  158. rgbTab = createRGBTab(selectedColor);
  159. tabs.addTab(rgbTab, "RGB", null);
  160. hsvTab = createHSVTab(selectedColor);
  161. tabs.addTab(hsvTab, "HSV", null);
  162. swatchesTab = createSelectTab();
  163. tabs.addTab(swatchesTab, "Swatches", null);
  164. // Add the tabs
  165. tabs.setWidth("100%");
  166. layout.addComponent(tabs);
  167. // Add the history
  168. history.setWidth("97%");
  169. history.setHeight("22px");
  170. // Create the default colors
  171. List<Color> defaultColors = new ArrayList<>();
  172. defaultColors.add(Color.BLACK);
  173. defaultColors.add(Color.WHITE);
  174. // Create the history
  175. VerticalLayout innerContainer = new VerticalLayout();
  176. innerContainer.setWidth("100%");
  177. innerContainer.setHeight(null);
  178. innerContainer.addComponent(history);
  179. VerticalLayout outerContainer = new VerticalLayout();
  180. outerContainer.setWidth("99%");
  181. outerContainer.setHeight("27px");
  182. outerContainer.addComponent(innerContainer);
  183. historyContainer = outerContainer;
  184. layout.addComponent(historyContainer);
  185. // Add the resize button for the history
  186. resize.addClickListener(this);
  187. resize.setData(new Boolean(false));
  188. resize.setWidth("100%");
  189. resize.setHeight("10px");
  190. resize.setPrimaryStyleName("resize-button");
  191. layout.addComponent(resize);
  192. // Add the buttons
  193. ok.setWidth("70px");
  194. ok.addClickListener(this);
  195. cancel.setWidth("70px");
  196. cancel.addClickListener(this);
  197. HorizontalLayout buttons = new HorizontalLayout();
  198. buttons.addComponent(ok);
  199. buttons.addComponent(cancel);
  200. buttons.setWidth("100%");
  201. buttons.setHeight("30px");
  202. buttons.setComponentAlignment(ok, Alignment.MIDDLE_CENTER);
  203. buttons.setComponentAlignment(cancel, Alignment.MIDDLE_CENTER);
  204. layout.addComponent(buttons);
  205. }
  206. /**
  207. * Creates the RGB tab.
  208. *
  209. * @return the component
  210. */
  211. private Component createRGBTab(Color color) {
  212. VerticalLayout rgbLayout = new VerticalLayout();
  213. rgbLayout.setMargin(new MarginInfo(false, false, true, false));
  214. rgbLayout.addComponent(rgbPreview);
  215. rgbLayout.setStyleName("rgbtab");
  216. // Add the RGB color gradient
  217. rgbGradient = new ColorPickerGradient("rgb-gradient", RGBConverter);
  218. rgbGradient.setColor(color);
  219. rgbGradient.addColorChangeListener(this);
  220. rgbLayout.addComponent(rgbGradient);
  221. selectors.add(rgbGradient);
  222. // Add the RGB sliders
  223. VerticalLayout sliders = new VerticalLayout();
  224. sliders.setStyleName("rgb-sliders");
  225. redSlider = createRGBSlider("Red", "red");
  226. greenSlider = createRGBSlider("Green", "green");
  227. blueSlider = createRGBSlider("Blue", "blue");
  228. setRgbSliderValues(color);
  229. redSlider.addValueChangeListener(new ValueChangeListener() {
  230. @Override
  231. public void valueChange(ValueChangeEvent event) {
  232. double red = (Double) event.getProperty().getValue();
  233. if (!updatingColors) {
  234. Color newColor = new Color((int) red,
  235. selectedColor.getGreen(), selectedColor.getBlue());
  236. setColor(newColor);
  237. }
  238. }
  239. });
  240. sliders.addComponent(redSlider);
  241. greenSlider.addValueChangeListener(new ValueChangeListener() {
  242. @Override
  243. public void valueChange(ValueChangeEvent event) {
  244. double green = (Double) event.getProperty().getValue();
  245. if (!updatingColors) {
  246. Color newColor = new Color(selectedColor.getRed(),
  247. (int) green, selectedColor.getBlue());
  248. setColor(newColor);
  249. }
  250. }
  251. });
  252. sliders.addComponent(greenSlider);
  253. blueSlider.addValueChangeListener(new ValueChangeListener() {
  254. @Override
  255. public void valueChange(ValueChangeEvent event) {
  256. double blue = (Double) event.getProperty().getValue();
  257. if (!updatingColors) {
  258. Color newColor = new Color(selectedColor.getRed(),
  259. selectedColor.getGreen(), (int) blue);
  260. setColor(newColor);
  261. }
  262. }
  263. });
  264. sliders.addComponent(blueSlider);
  265. rgbLayout.addComponent(sliders);
  266. return rgbLayout;
  267. }
  268. private Slider createRGBSlider(String caption, String styleName) {
  269. Slider redSlider = new Slider(caption, 0, 255);
  270. redSlider.setImmediate(true);
  271. redSlider.setStyleName("rgb-slider");
  272. redSlider.setWidth("220px");
  273. redSlider.addStyleName(styleName);
  274. return redSlider;
  275. }
  276. /**
  277. * Creates the hsv tab.
  278. *
  279. * @return the component
  280. */
  281. private Component createHSVTab(Color color) {
  282. VerticalLayout hsvLayout = new VerticalLayout();
  283. hsvLayout.setMargin(new MarginInfo(false, false, true, false));
  284. hsvLayout.addComponent(hsvPreview);
  285. hsvLayout.setStyleName("hsvtab");
  286. // Add the hsv gradient
  287. hsvGradient = new ColorPickerGradient("hsv-gradient", HSVConverter);
  288. hsvGradient.setColor(color);
  289. hsvGradient.addColorChangeListener(this);
  290. hsvLayout.addComponent(hsvGradient);
  291. selectors.add(hsvGradient);
  292. VerticalLayout sliders = new VerticalLayout();
  293. sliders.setStyleName("hsv-sliders");
  294. hueSlider = new Slider("Hue", 0, 360);
  295. saturationSlider = new Slider("Saturation", 0, 100);
  296. valueSlider = new Slider("Value", 0, 100);
  297. float[] hsv = color.getHSV();
  298. setHsvSliderValues(hsv);
  299. hueSlider.setStyleName("hsv-slider");
  300. hueSlider.addStyleName("hue-slider");
  301. hueSlider.setWidth("220px");
  302. hueSlider.setImmediate(true);
  303. hueSlider.addValueChangeListener(new ValueChangeListener() {
  304. @Override
  305. public void valueChange(ValueChangeEvent event) {
  306. if (!updatingColors) {
  307. float hue = Float.parseFloat(
  308. event.getProperty().getValue().toString()) / 360f;
  309. float saturation = Float.parseFloat(
  310. saturationSlider.getValue().toString()) / 100f;
  311. float value = Float.parseFloat(
  312. valueSlider.getValue().toString()) / 100f;
  313. // Set the color
  314. Color color = new Color(
  315. Color.HSVtoRGB(hue, saturation, value));
  316. setColor(color);
  317. /*
  318. * Set the background color of the hue gradient. This has to
  319. * be done here since in the conversion the base color
  320. * information is lost when color is black/white
  321. */
  322. Color bgColor = new Color(Color.HSVtoRGB(hue, 1f, 1f));
  323. hsvGradient.setBackgroundColor(bgColor);
  324. }
  325. }
  326. });
  327. sliders.addComponent(hueSlider);
  328. saturationSlider.setStyleName("hsv-slider");
  329. saturationSlider.setWidth("220px");
  330. saturationSlider.setImmediate(true);
  331. saturationSlider.addValueChangeListener(new ValueChangeListener() {
  332. @Override
  333. public void valueChange(ValueChangeEvent event) {
  334. if (!updatingColors) {
  335. float hue = Float
  336. .parseFloat(hueSlider.getValue().toString()) / 360f;
  337. float saturation = Float.parseFloat(
  338. event.getProperty().getValue().toString()) / 100f;
  339. float value = Float.parseFloat(
  340. valueSlider.getValue().toString()) / 100f;
  341. Color color = new Color(
  342. Color.HSVtoRGB(hue, saturation, value));
  343. setColor(color);
  344. }
  345. }
  346. });
  347. sliders.addComponent(saturationSlider);
  348. valueSlider.setStyleName("hsv-slider");
  349. valueSlider.setWidth("220px");
  350. valueSlider.setImmediate(true);
  351. valueSlider.addValueChangeListener(new ValueChangeListener() {
  352. @Override
  353. public void valueChange(ValueChangeEvent event) {
  354. if (!updatingColors) {
  355. float hue = Float
  356. .parseFloat(hueSlider.getValue().toString()) / 360f;
  357. float saturation = Float.parseFloat(
  358. saturationSlider.getValue().toString()) / 100f;
  359. float value = Float.parseFloat(
  360. event.getProperty().getValue().toString()) / 100f;
  361. Color color = new Color(
  362. Color.HSVtoRGB(hue, saturation, value));
  363. setColor(color);
  364. }
  365. }
  366. });
  367. sliders.addComponent(valueSlider);
  368. hsvLayout.addComponent(sliders);
  369. return hsvLayout;
  370. }
  371. /**
  372. * Creates the select tab.
  373. *
  374. * @return the component
  375. */
  376. private Component createSelectTab() {
  377. VerticalLayout selLayout = new VerticalLayout();
  378. selLayout.setMargin(new MarginInfo(false, false, true, false));
  379. selLayout.addComponent(selPreview);
  380. selLayout.addStyleName("seltab");
  381. colorSelect = new ColorPickerSelect();
  382. colorSelect.addColorChangeListener(this);
  383. selLayout.addComponent(colorSelect);
  384. return selLayout;
  385. }
  386. @Override
  387. public void buttonClick(ClickEvent event) {
  388. // History resize was clicked
  389. if (event.getButton() == resize) {
  390. boolean state = (Boolean) resize.getData();
  391. // minimize
  392. if (state) {
  393. historyContainer.setHeight("27px");
  394. history.setHeight("22px");
  395. // maximize
  396. } else {
  397. historyContainer.setHeight("90px");
  398. history.setHeight("85px");
  399. }
  400. resize.setData(new Boolean(!state));
  401. }
  402. // Ok button was clicked
  403. else if (event.getButton() == ok) {
  404. history.setColor(getColor());
  405. fireColorChanged();
  406. close();
  407. }
  408. // Cancel button was clicked
  409. else if (event.getButton() == cancel) {
  410. close();
  411. }
  412. }
  413. /**
  414. * Notifies the listeners that the color changed
  415. */
  416. public void fireColorChanged() {
  417. fireEvent(new ColorChangeEvent(this, getColor()));
  418. }
  419. /**
  420. * Gets the history.
  421. *
  422. * @return the history
  423. */
  424. public ColorPickerHistory getHistory() {
  425. return history;
  426. }
  427. @Override
  428. public void setColor(Color color) {
  429. if (color == null) {
  430. return;
  431. }
  432. selectedColor = color;
  433. hsvGradient.setColor(selectedColor);
  434. hsvPreview.setColor(selectedColor);
  435. rgbGradient.setColor(selectedColor);
  436. rgbPreview.setColor(selectedColor);
  437. selPreview.setColor(selectedColor);
  438. }
  439. @Override
  440. public Color getColor() {
  441. return selectedColor;
  442. }
  443. /**
  444. * Gets the color history.
  445. *
  446. * @return the color history
  447. */
  448. public List<Color> getColorHistory() {
  449. return Collections.unmodifiableList(history.getHistory());
  450. }
  451. @Override
  452. public void colorChanged(ColorChangeEvent event) {
  453. setColor(event.getColor());
  454. updatingColors = true;
  455. setRgbSliderValues(selectedColor);
  456. float[] hsv = selectedColor.getHSV();
  457. setHsvSliderValues(hsv);
  458. updatingColors = false;
  459. for (ColorSelector s : selectors) {
  460. if (event.getSource() != s && s != this
  461. && s.getColor() != selectedColor) {
  462. s.setColor(selectedColor);
  463. }
  464. }
  465. }
  466. private void setRgbSliderValues(Color color) {
  467. try {
  468. redSlider.setValue(((Integer) color.getRed()).doubleValue());
  469. blueSlider.setValue(((Integer) color.getBlue()).doubleValue());
  470. greenSlider.setValue(((Integer) color.getGreen()).doubleValue());
  471. } catch (ValueOutOfBoundsException e) {
  472. getLogger().log(Level.WARNING,
  473. "Unable to set RGB color value to " + color.getRed() + ","
  474. + color.getGreen() + "," + color.getBlue(),
  475. e);
  476. }
  477. }
  478. private void setHsvSliderValues(float[] hsv) {
  479. try {
  480. hueSlider.setValue(((Float) (hsv[0] * 360f)).doubleValue());
  481. saturationSlider.setValue(((Float) (hsv[1] * 100f)).doubleValue());
  482. valueSlider.setValue(((Float) (hsv[2] * 100f)).doubleValue());
  483. } catch (ValueOutOfBoundsException e) {
  484. getLogger().log(Level.WARNING, "Unable to set HSV color value to "
  485. + hsv[0] + "," + hsv[1] + "," + hsv[2], e);
  486. }
  487. }
  488. @Override
  489. public void addColorChangeListener(ColorChangeListener listener) {
  490. addListener(ColorChangeEvent.class, listener, COLOR_CHANGE_METHOD);
  491. }
  492. @Override
  493. public void removeColorChangeListener(ColorChangeListener listener) {
  494. removeListener(ColorChangeEvent.class, listener);
  495. }
  496. /**
  497. * Checks the visibility of the given tab
  498. *
  499. * @param tab
  500. * The tab to check
  501. * @return true if tab is visible, false otherwise
  502. */
  503. private boolean tabIsVisible(Component tab) {
  504. Iterator<Component> tabIterator = tabs.getComponentIterator();
  505. while (tabIterator.hasNext()) {
  506. if (tabIterator.next() == tab) {
  507. return true;
  508. }
  509. }
  510. return false;
  511. }
  512. /**
  513. * How many tabs are visible
  514. *
  515. * @return The number of tabs visible
  516. */
  517. private int tabsNumVisible() {
  518. Iterator<Component> tabIterator = tabs.getComponentIterator();
  519. int tabCounter = 0;
  520. while (tabIterator.hasNext()) {
  521. tabIterator.next();
  522. tabCounter++;
  523. }
  524. return tabCounter;
  525. }
  526. /**
  527. * Checks if tabs are needed and hides them if not
  528. */
  529. private void checkIfTabsNeeded() {
  530. tabs.hideTabs(tabsNumVisible() == 1);
  531. }
  532. /**
  533. * Set RGB tab visibility
  534. *
  535. * @param visible
  536. * The visibility of the RGB tab
  537. */
  538. public void setRGBTabVisible(boolean visible) {
  539. if (visible && !tabIsVisible(rgbTab)) {
  540. tabs.addTab(rgbTab, "RGB", null);
  541. checkIfTabsNeeded();
  542. } else if (!visible && tabIsVisible(rgbTab)) {
  543. tabs.removeComponent(rgbTab);
  544. checkIfTabsNeeded();
  545. }
  546. }
  547. /**
  548. * Set HSV tab visibility
  549. *
  550. * @param visible
  551. * The visibility of the HSV tab
  552. */
  553. public void setHSVTabVisible(boolean visible) {
  554. if (visible && !tabIsVisible(hsvTab)) {
  555. tabs.addTab(hsvTab, "HSV", null);
  556. checkIfTabsNeeded();
  557. } else if (!visible && tabIsVisible(hsvTab)) {
  558. tabs.removeComponent(hsvTab);
  559. checkIfTabsNeeded();
  560. }
  561. }
  562. /**
  563. * Set Swatches tab visibility
  564. *
  565. * @param visible
  566. * The visibility of the Swatches tab
  567. */
  568. public void setSwatchesTabVisible(boolean visible) {
  569. if (visible && !tabIsVisible(swatchesTab)) {
  570. tabs.addTab(swatchesTab, "Swatches", null);
  571. checkIfTabsNeeded();
  572. } else if (!visible && tabIsVisible(swatchesTab)) {
  573. tabs.removeComponent(swatchesTab);
  574. checkIfTabsNeeded();
  575. }
  576. }
  577. /**
  578. * Set the History visibility
  579. *
  580. * @param visible
  581. */
  582. public void setHistoryVisible(boolean visible) {
  583. historyContainer.setVisible(visible);
  584. resize.setVisible(visible);
  585. }
  586. /**
  587. * Set the preview visibility
  588. *
  589. * @param visible
  590. */
  591. public void setPreviewVisible(boolean visible) {
  592. hsvPreview.setVisible(visible);
  593. rgbPreview.setVisible(visible);
  594. selPreview.setVisible(visible);
  595. }
  596. /** RGB color converter */
  597. private Coordinates2Color RGBConverter = new Coordinates2Color() {
  598. @Override
  599. public Color calculate(int x, int y) {
  600. float h = x / 220f;
  601. float s = 1f;
  602. float v = 1f;
  603. if (y < 110) {
  604. s = y / 110f;
  605. } else if (y > 110) {
  606. v = 1f - (y - 110f) / 110f;
  607. }
  608. return new Color(Color.HSVtoRGB(h, s, v));
  609. }
  610. @Override
  611. public int[] calculate(Color color) {
  612. float[] hsv = color.getHSV();
  613. int x = Math.round(hsv[0] * 220f);
  614. int y = 0;
  615. // lower half
  616. if (hsv[1] == 1f) {
  617. y = Math.round(110f - (hsv[1] + hsv[2]) * 110f);
  618. } else {
  619. y = Math.round(hsv[1] * 110f);
  620. }
  621. return new int[] { x, y };
  622. }
  623. };
  624. /** HSV color converter */
  625. Coordinates2Color HSVConverter = new Coordinates2Color() {
  626. @Override
  627. public int[] calculate(Color color) {
  628. float[] hsv = color.getHSV();
  629. // Calculate coordinates
  630. int x = Math.round(hsv[2] * 220.0f);
  631. int y = Math.round(220 - hsv[1] * 220.0f);
  632. // Create background color of clean color
  633. Color bgColor = new Color(Color.HSVtoRGB(hsv[0], 1f, 1f));
  634. hsvGradient.setBackgroundColor(bgColor);
  635. return new int[] { x, y };
  636. }
  637. @Override
  638. public Color calculate(int x, int y) {
  639. float saturation = 1f - y / 220.0f;
  640. float value = x / 220.0f;
  641. float hue = Float.parseFloat(hueSlider.getValue().toString())
  642. / 360f;
  643. Color color = new Color(Color.HSVtoRGB(hue, saturation, value));
  644. return color;
  645. }
  646. };
  647. private static Logger getLogger() {
  648. return Logger.getLogger(ColorPickerPopup.class.getName());
  649. }
  650. }