1 /* DefaultSwatchChooserPanel.java -- 2 Copyright (C) 2004, 2005 Free Software Foundation, Inc. 3 4 This file is part of GNU Classpath. 5 6 GNU Classpath is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2, or (at your option) 9 any later version. 10 11 GNU Classpath is distributed in the hope that it will be useful, but 12 WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GNU Classpath; see the file COPYING. If not, write to the 18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19 02110-1301 USA. 20 21 Linking this library statically or dynamically with other modules is 22 making a combined work based on this library. Thus, the terms and 23 conditions of the GNU General Public License cover the whole 24 combination. 25 26 As a special exception, the copyright holders of this library give you 27 permission to link this library with independent modules to produce an 28 executable, regardless of the license terms of these independent 29 modules, and to copy and distribute the resulting executable under 30 terms of your choice, provided that you also meet, for each linked 31 independent module, the terms and conditions of the license of that 32 module. An independent module is a module which is not derived from 33 or based on this library. If you modify this library, you may extend 34 this exception to your version of the library, but you are not 35 obligated to do so. If you do not wish to do so, delete this 36 exception statement from your version. */ 37 38 39 package javax.swing.colorchooser; 40 41 import java.awt.BorderLayout; 42 import java.awt.Color; 43 import java.awt.Component; 44 import java.awt.Container; 45 import java.awt.Dimension; 46 import java.awt.Graphics; 47 import java.awt.Insets; 48 import java.awt.LayoutManager; 49 import java.awt.event.MouseAdapter; 50 import java.awt.event.MouseEvent; 51 import java.awt.event.MouseListener; 52 53 import javax.swing.Icon; 54 import javax.swing.JColorChooser; 55 import javax.swing.JLabel; 56 import javax.swing.JPanel; 57 58 /** 59 * This class is the DefaultSwatchChooserPanel. This chooser panel displays a 60 * set of colors that can be picked. Recently picked items will go into a 61 * side panel so the user can see the history of the chosen colors. 62 */ 63 class DefaultSwatchChooserPanel extends AbstractColorChooserPanel 64 { 65 /** The main panel that holds the set of choosable colors. */ 66 MainSwatchPanel mainPalette; 67 68 /** A panel that holds the recent colors. */ 69 RecentSwatchPanel recentPalette; 70 71 /** The mouse handlers for the panels. */ 72 MouseListener mouseHandler; 73 74 /** 75 * This the base class for all swatch panels. Swatch panels are panels that 76 * hold a set of blocks where colors are displayed. 77 */ 78 abstract static class SwatchPanel extends JPanel 79 { 80 /** The width of each block. */ 81 protected int cellWidth = 10; 82 83 /** The height of each block. */ 84 protected int cellHeight = 10; 85 86 /** The gap between blocks. */ 87 protected int gap = 1; 88 89 /** The number of rows in the swatch panel. */ 90 protected int numRows; 91 92 /** The number of columns in the swatch panel. */ 93 protected int numCols; 94 95 /** 96 * Creates a new SwatchPanel object. 97 */ SwatchPanel()98 SwatchPanel() 99 { 100 super(); 101 setBackground(Color.WHITE); 102 } 103 104 /** 105 * This method returns the preferred size of the swatch panel based on the 106 * number of rows and columns and the size of each cell. 107 * 108 * @return The preferred size of the swatch panel. 109 */ getPreferredSize()110 public Dimension getPreferredSize() 111 { 112 int height = numRows * cellHeight + (numRows - 1) * gap; 113 int width = numCols * cellWidth + (numCols - 1) * gap; 114 Insets insets = getInsets(); 115 116 return new Dimension(width + insets.left + insets.right, 117 height + insets.top + insets.bottom); 118 } 119 120 /** 121 * This method returns the color for the given position. 122 * 123 * @param x The x coordinate of the position. 124 * @param y The y coordinate of the position. 125 * 126 * @return The color at the given position. 127 */ getColorForPosition(int x, int y)128 public abstract Color getColorForPosition(int x, int y); 129 130 /** 131 * This method initializes the colors for the swatch panel. 132 */ initializeColors()133 protected abstract void initializeColors(); 134 } 135 136 /** 137 * This is the main swatch panel. This panel sits in the middle and allows a 138 * set of colors to be picked which will move to the recent swatch panel. 139 */ 140 static class MainSwatchPanel extends SwatchPanel 141 { 142 /** The color describing (204, 255, 255) */ 143 public static final Color C204255255 = new Color(204, 204, 255); 144 145 /** The color describing (255, 204, 204) */ 146 public static final Color C255204204 = new Color(255, 204, 204); 147 148 /** The color describing (204, 255, 204) */ 149 public static final Color C204255204 = new Color(204, 255, 204); 150 151 /** The color describing (204, 204, 204) */ 152 public static final Color C204204204 = new Color(204, 204, 204); 153 154 /** The color (153, 153, 255). */ 155 public static final Color C153153255 = new Color(153, 153, 255); 156 157 /** The color (51, 51, 255). */ 158 public static final Color C051051255 = new Color(51, 51, 255); 159 160 /** The color (153, 0, 153). */ 161 public static final Color C153000153 = new Color(153, 0, 153); 162 163 /** The color (0, 51, 51). */ 164 public static final Color C000051051 = new Color(0, 51, 51); 165 166 /** The color (51, 0, 51). */ 167 public static final Color C051000051 = new Color(51, 0, 51); 168 169 /** The color (51, 51, 0). */ 170 public static final Color C051051000 = new Color(51, 51, 0); 171 172 /** The color (102, 102, 0). */ 173 public static final Color C102102000 = new Color(102, 102, 0); 174 175 /** The color (153, 255, 153). */ 176 public static final Color C153255153 = new Color(153, 255, 153); 177 178 /** The color (102, 255, 102). */ 179 public static final Color C102255102 = new Color(102, 255, 102); 180 181 /** The color (0, 102, 102). */ 182 public static final Color C000102102 = new Color(0, 102, 102); 183 184 /** The color (102, 0, 102). */ 185 public static final Color C102000102 = new Color(102, 0, 102); 186 187 /** The color (0, 153, 153). */ 188 public static final Color C000153153 = new Color(0, 153, 153); 189 190 /** The color (153, 153, 0). */ 191 public static final Color C153153000 = new Color(153, 153, 0); 192 193 /** The color (204, 204, 0). */ 194 public static final Color C204204000 = new Color(204, 204, 0); 195 196 /** The color (204, 0, 204). */ 197 public static final Color C204000204 = new Color(204, 0, 204); 198 199 /** The color (0, 204, 204). */ 200 public static final Color C000204204 = new Color(0, 204, 204); 201 202 /** The color (51, 255, 51). */ 203 public static final Color C051255051 = new Color(51, 255, 51); 204 205 /** The color (255, 51, 51). */ 206 public static final Color C255051051 = new Color(255, 51, 51); 207 208 /** The color (255, 102, 102). */ 209 public static final Color C255102102 = new Color(255, 102, 102); 210 211 /** The color (102, 102, 255). */ 212 public static final Color C102102255 = new Color(102, 102, 255); 213 214 /** The color (255, 153, 153). */ 215 public static final Color C255153153 = new Color(255, 153, 153); 216 static Color[] colors = 217 { 218 // Row 1 219 Color.WHITE, new Color(204, 255, 255), C204255255, C204255255, C204255255, 220 C204255255, C204255255, C204255255, C204255255, 221 C204255255, C204255255, new Color(255, 204, 255), 222 C255204204, C255204204, C255204204, C255204204, 223 C255204204, C255204204, C255204204, C255204204, 224 C255204204, new Color(255, 255, 204), C204255204, 225 C204255204, C204255204, C204255204, C204255204, 226 C204255204, C204255204, C204255204, C204255204, 227 228 // Row 2 229 C204204204, new Color(153, 255, 255), new Color(153, 204, 255), C153153255, 230 C153153255, C153153255, C153153255, C153153255, 231 C153153255, C153153255, new Color(204, 153, 255), 232 new Color(255, 153, 255), 233 new Color(255, 153, 204), C255153153, C255153153, 234 C255153153, C255153153, C255153153, C255153153, 235 C255153153, new Color(255, 204, 153), 236 new Color(255, 255, 153), 237 new Color(204, 255, 153), C153255153, C153255153, 238 C153255153, C153255153, C153255153, C153255153, 239 C153255153, new Color(153, 255, 204), 240 241 // Row 3 242 C204204204, new Color(102, 255, 255), new Color(102, 204, 255), 243 new Color(102, 153, 255), C102102255, C102102255, 244 C102102255, C102102255, C102102255, 245 new Color(153, 102, 255), 246 new Color(204, 102, 255), 247 new Color(255, 102, 255), 248 new Color(255, 102, 204), 249 new Color(255, 102, 153), C255102102, C255102102, 250 C255102102, C255102102, C255102102, 251 new Color(255, 153, 102), 252 new Color(255, 204, 102), 253 new Color(255, 255, 102), 254 new Color(204, 255, 102), 255 new Color(153, 255, 102), C102255102, C102255102, 256 C102255102, C102255102, C102255102, 257 new Color(102, 255, 153), 258 new Color(102, 255, 204), 259 260 // Row 4 261 new Color(153, 153, 153), new Color(51, 255, 255), new Color(51, 204, 255), 262 new Color(51, 153, 255), new Color(51, 102, 255), 263 C051051255, C051051255, C051051255, 264 new Color(102, 51, 255), new Color(153, 51, 255), 265 new Color(204, 51, 255), new Color(255, 51, 255), 266 new Color(255, 51, 204), new Color(255, 51, 153), 267 new Color(255, 51, 102), C255051051, C255051051, 268 C255051051, new Color(255, 102, 51), 269 new Color(255, 153, 51), new Color(255, 204, 51), 270 new Color(255, 255, 51), new Color(204, 255, 51), 271 new Color(153, 255, 51), new Color(102, 255, 51), 272 C051255051, C051255051, C051255051, 273 new Color(51, 255, 102), new Color(51, 255, 153), 274 new Color(51, 255, 204), 275 276 // Row 5 277 new Color(153, 153, 153), new Color(0, 255, 255), new Color(0, 204, 255), 278 new Color(0, 153, 255), new Color(0, 102, 255), 279 new Color(0, 51, 255), new Color(0, 0, 255), 280 new Color(51, 0, 255), new Color(102, 0, 255), 281 new Color(153, 0, 255), new Color(204, 0, 255), 282 new Color(255, 0, 255), new Color(255, 0, 204), 283 new Color(255, 0, 153), new Color(255, 0, 102), 284 new Color(255, 0, 51), new Color(255, 0, 0), 285 new Color(255, 51, 0), new Color(255, 102, 0), 286 new Color(255, 153, 0), new Color(255, 204, 0), 287 new Color(255, 255, 0), new Color(204, 255, 0), 288 new Color(153, 255, 0), new Color(102, 255, 0), 289 new Color(51, 255, 0), new Color(0, 255, 0), 290 new Color(0, 255, 51), new Color(0, 255, 102), 291 new Color(0, 255, 153), new Color(0, 255, 204), 292 293 // Row 6 294 new Color(102, 102, 102), C000204204, C000204204, new Color(0, 153, 204), 295 new Color(0, 102, 204), new Color(0, 51, 204), 296 new Color(0, 0, 204), new Color(51, 0, 204), 297 new Color(102, 0, 204), new Color(153, 0, 204), 298 C204000204, C204000204, C204000204, 299 new Color(204, 0, 153), new Color(204, 0, 102), 300 new Color(204, 0, 51), new Color(204, 0, 0), 301 new Color(204, 51, 0), new Color(204, 102, 0), 302 new Color(204, 153, 0), C204204000, C204204000, 303 C204204000, new Color(153, 204, 0), 304 new Color(102, 204, 0), new Color(51, 204, 0), 305 new Color(0, 204, 0), new Color(0, 204, 51), 306 new Color(0, 204, 102), new Color(0, 204, 153), 307 new Color(0, 204, 204), 308 309 // Row 7 310 new Color(102, 102, 102), C000153153, C000153153, C000153153, 311 new Color(0, 102, 153), new Color(0, 51, 153), 312 new Color(0, 0, 153), new Color(51, 0, 153), 313 new Color(102, 0, 153), C153000153, C153000153, 314 C153000153, C153000153, C153000153, 315 new Color(153, 0, 102), new Color(153, 0, 51), 316 new Color(153, 0, 0), new Color(153, 51, 0), 317 new Color(153, 102, 0), C153153000, C153153000, 318 C153153000, C153153000, C153153000, 319 new Color(102, 153, 0), new Color(51, 153, 0), 320 new Color(0, 153, 0), new Color(0, 153, 51), 321 new Color(0, 153, 102), C000153153, C000153153, 322 323 // Row 8 324 new Color(51, 51, 51), C000102102, C000102102, C000102102, C000102102, 325 new Color(0, 51, 102), new Color(0, 0, 102), 326 new Color(51, 0, 102), C102000102, C102000102, 327 C102000102, C102000102, C102000102, C102000102, 328 C102000102, new Color(102, 0, 51), 329 new Color(102, 0, 0), new Color(102, 51, 0), 330 C102102000, C102102000, C102102000, C102102000, 331 C102102000, C102102000, C102102000, 332 new Color(51, 102, 0), new Color(0, 102, 0), 333 new Color(0, 102, 51), C000102102, C000102102, 334 C000102102, 335 336 // Row 9. 337 Color.BLACK, C000051051, C000051051, C000051051, C000051051, C000051051, 338 new Color(0, 0, 51), C051000051, C051000051, 339 C051000051, C051000051, C051000051, C051000051, 340 C051000051, C051000051, C051000051, 341 new Color(51, 0, 0), C051051000, C051051000, 342 C051051000, C051051000, C051051000, C051051000, 343 C051051000, C051051000, new Color(0, 51, 0), 344 C000051051, C000051051, C000051051, C000051051, 345 new Color(51, 51, 51) 346 }; 347 348 /** 349 * Creates a new MainSwatchPanel object. 350 */ MainSwatchPanel()351 MainSwatchPanel() 352 { 353 super(); 354 numCols = 31; 355 numRows = 9; 356 initializeColors(); 357 revalidate(); 358 } 359 360 /** 361 * This method returns the color for the given position. 362 * 363 * @param x The x location for the position. 364 * @param y The y location for the position. 365 * 366 * @return The color for the given position. 367 */ getColorForPosition(int x, int y)368 public Color getColorForPosition(int x, int y) 369 { 370 if (x % (cellWidth + gap) > cellWidth 371 || y % (cellHeight + gap) > cellHeight) 372 // position is located in gap. 373 return null; 374 375 int row = y / (cellHeight + gap); 376 int col = x / (cellWidth + gap); 377 return colors[row * numCols + col]; 378 } 379 380 /** 381 * This method initializes the colors for the main swatch panel. 382 */ initializeColors()383 protected void initializeColors() 384 { 385 // Unnecessary 386 } 387 388 /** 389 * This method paints the main graphics panel with the given Graphics 390 * object. 391 * 392 * @param graphics The Graphics object to paint with. 393 */ paint(Graphics graphics)394 public void paint(Graphics graphics) 395 { 396 int index = 0; 397 Insets insets = getInsets(); 398 int currX = insets.left; 399 int currY = insets.top; 400 Color saved = graphics.getColor(); 401 402 for (int i = 0; i < numRows; i++) 403 { 404 for (int j = 0; j < numCols; j++) 405 { 406 graphics.setColor(colors[index++]); 407 graphics.fill3DRect(currX, currY, cellWidth, cellHeight, true); 408 currX += gap + cellWidth; 409 } 410 currX = insets.left; 411 currY += gap + cellHeight; 412 } 413 graphics.setColor(saved); 414 } 415 416 /** 417 * This method returns the tooltip text for the given MouseEvent. 418 * 419 * @param e The MouseEvent to find tooltip text for. 420 * 421 * @return The tooltip text. 422 */ getToolTipText(MouseEvent e)423 public String getToolTipText(MouseEvent e) 424 { 425 Color c = getColorForPosition(e.getX(), e.getY()); 426 if (c == null) 427 return null; 428 return (c.getRed() + "," + c.getGreen() + "," + c.getBlue()); 429 } 430 } 431 432 /** 433 * This class is the recent swatch panel. It holds recently selected colors. 434 */ 435 static class RecentSwatchPanel extends SwatchPanel 436 { 437 /** The array for storing recently stored colors. */ 438 Color[] colors; 439 440 /** The default color. */ 441 public static final Color defaultColor = Color.GRAY; 442 443 /** The index of the array that is the start. */ 444 int start = 0; 445 446 /** 447 * Creates a new RecentSwatchPanel object. 448 */ RecentSwatchPanel()449 RecentSwatchPanel() 450 { 451 super(); 452 numCols = 5; 453 numRows = 7; 454 initializeColors(); 455 revalidate(); 456 } 457 458 /** 459 * This method returns the color for the given position. 460 * 461 * @param x The x coordinate of the position. 462 * @param y The y coordinate of the position. 463 * 464 * @return The color for the given position. 465 */ getColorForPosition(int x, int y)466 public Color getColorForPosition(int x, int y) 467 { 468 if (x % (cellWidth + gap) > cellWidth 469 || y % (cellHeight + gap) > cellHeight) 470 // position is located in gap. 471 return null; 472 473 int row = y / (cellHeight + gap); 474 int col = x / (cellWidth + gap); 475 476 return colors[getIndexForCell(row, col)]; 477 } 478 479 /** 480 * This method initializes the colors for the recent swatch panel. 481 */ initializeColors()482 protected void initializeColors() 483 { 484 colors = new Color[numRows * numCols]; 485 for (int i = 0; i < colors.length; i++) 486 colors[i] = defaultColor; 487 } 488 489 /** 490 * This method returns the array index for the given row and column. 491 * 492 * @param row The row. 493 * @param col The column. 494 * 495 * @return The array index for the given row and column. 496 */ getIndexForCell(int row, int col)497 private int getIndexForCell(int row, int col) 498 { 499 return ((row * numCols) + col + start) % (numRows * numCols); 500 } 501 502 /** 503 * This method adds the given color to the beginning of the swatch panel. 504 * Package-private to avoid an accessor method. 505 * 506 * @param c The color to add. 507 */ addColorToQueue(Color c)508 void addColorToQueue(Color c) 509 { 510 if (--start == -1) 511 start = numRows * numCols - 1; 512 513 colors[start] = c; 514 } 515 516 /** 517 * This method paints the panel with the given Graphics object. 518 * 519 * @param g The Graphics object to paint with. 520 */ paint(Graphics g)521 public void paint(Graphics g) 522 { 523 Color saved = g.getColor(); 524 Insets insets = getInsets(); 525 int currX = insets.left; 526 int currY = insets.top; 527 528 for (int i = 0; i < numRows; i++) 529 { 530 for (int j = 0; j < numCols; j++) 531 { 532 g.setColor(colors[getIndexForCell(i, j)]); 533 g.fill3DRect(currX, currY, cellWidth, cellHeight, true); 534 currX += cellWidth + gap; 535 } 536 currX = insets.left; 537 currY += cellWidth + gap; 538 } 539 } 540 541 /** 542 * This method returns the tooltip text for the given MouseEvent. 543 * 544 * @param e The MouseEvent. 545 * 546 * @return The tooltip text. 547 */ getToolTipText(MouseEvent e)548 public String getToolTipText(MouseEvent e) 549 { 550 Color c = getColorForPosition(e.getX(), e.getY()); 551 if (c == null) 552 return null; 553 return c.getRed() + "," + c.getGreen() + "," + c.getBlue(); 554 } 555 } 556 557 /** 558 * This class handles mouse events for the two swatch panels. 559 */ 560 class MouseHandler extends MouseAdapter 561 { 562 /** 563 * This method is called whenever the mouse is pressed. 564 * 565 * @param e The MouseEvent. 566 */ mousePressed(MouseEvent e)567 public void mousePressed(MouseEvent e) 568 { 569 SwatchPanel panel = (SwatchPanel) e.getSource(); 570 Color c = panel.getColorForPosition(e.getX(), e.getY()); 571 recentPalette.addColorToQueue(c); 572 DefaultSwatchChooserPanel.this.getColorSelectionModel().setSelectedColor(c); 573 DefaultSwatchChooserPanel.this.repaint(); 574 } 575 } 576 577 /** 578 * This is the layout manager for the main panel. 579 */ 580 static class MainPanelLayout implements LayoutManager 581 { 582 /** 583 * This method is called when a new component is added to the container. 584 * 585 * @param name The name of the component. 586 * @param comp The added component. 587 */ addLayoutComponent(String name, Component comp)588 public void addLayoutComponent(String name, Component comp) 589 { 590 // Nothing to do here. 591 } 592 593 /** 594 * This method is called to set the size and position of the child 595 * components for the given container. 596 * 597 * @param parent The container to lay out. 598 */ layoutContainer(Container parent)599 public void layoutContainer(Container parent) 600 { 601 Component[] comps = parent.getComponents(); 602 Insets insets = parent.getInsets(); 603 Dimension[] pref = new Dimension[comps.length]; 604 605 int xpos = 0; 606 int ypos = 0; 607 int maxHeight = 0; 608 int totalWidth = 0; 609 610 for (int i = 0; i < comps.length; i++) 611 { 612 pref[i] = comps[i].getPreferredSize(); 613 if (pref[i] == null) 614 return; 615 maxHeight = Math.max(maxHeight, pref[i].height); 616 totalWidth += pref[i].width; 617 } 618 619 ypos = (parent.getSize().height - maxHeight) / 2 + insets.top; 620 xpos = insets.left + (parent.getSize().width - totalWidth) / 2; 621 622 for (int i = 0; i < comps.length; i++) 623 { 624 if (pref[i] == null) 625 continue; 626 comps[i].setBounds(xpos, ypos, pref[i].width, pref[i].height); 627 xpos += pref[i].width; 628 } 629 } 630 631 /** 632 * This method is called when a component is removed from the container. 633 * 634 * @param comp The component that was removed. 635 */ removeLayoutComponent(Component comp)636 public void removeLayoutComponent(Component comp) 637 { 638 // Nothing to do here. 639 } 640 641 /** 642 * This methods calculates the minimum layout size for the container. 643 * 644 * @param parent The container. 645 * 646 * @return The minimum layout size. 647 */ minimumLayoutSize(Container parent)648 public Dimension minimumLayoutSize(Container parent) 649 { 650 return preferredLayoutSize(parent); 651 } 652 653 /** 654 * This method returns the preferred layout size for the given container. 655 * 656 * @param parent The container. 657 * 658 * @return The preferred layout size. 659 */ preferredLayoutSize(Container parent)660 public Dimension preferredLayoutSize(Container parent) 661 { 662 int xmax = 0; 663 int ymax = 0; 664 665 Component[] comps = parent.getComponents(); 666 Dimension pref; 667 668 for (int i = 0; i < comps.length; i++) 669 { 670 pref = comps[i].getPreferredSize(); 671 if (pref == null) 672 continue; 673 xmax += pref.width; 674 ymax = Math.max(ymax, pref.height); 675 } 676 677 Insets insets = parent.getInsets(); 678 679 return new Dimension(insets.left + insets.right + xmax, 680 insets.top + insets.bottom + ymax); 681 } 682 } 683 684 /** 685 * This is the layout manager for the recent swatch panel. 686 */ 687 static class RecentPanelLayout implements LayoutManager 688 { 689 /** 690 * This method is called when a component is added to the container. 691 * 692 * @param name The name of the component. 693 * @param comp The added component. 694 */ addLayoutComponent(String name, Component comp)695 public void addLayoutComponent(String name, Component comp) 696 { 697 // Nothing needs to be done. 698 } 699 700 /** 701 * This method sets the size and position of the child components of the 702 * given container. 703 * 704 * @param parent The container to lay out. 705 */ layoutContainer(Container parent)706 public void layoutContainer(Container parent) 707 { 708 Component[] comps = parent.getComponents(); 709 Dimension parentSize = parent.getSize(); 710 Insets insets = parent.getInsets(); 711 int currY = insets.top; 712 Dimension pref; 713 714 for (int i = 0; i < comps.length; i++) 715 { 716 pref = comps[i].getPreferredSize(); 717 if (pref == null) 718 continue; 719 comps[i].setBounds(insets.left, currY, pref.width, pref.height); 720 currY += pref.height; 721 } 722 } 723 724 /** 725 * This method calculates the minimum layout size for the given container. 726 * 727 * @param parent The container. 728 * 729 * @return The minimum layout size. 730 */ minimumLayoutSize(Container parent)731 public Dimension minimumLayoutSize(Container parent) 732 { 733 return preferredLayoutSize(parent); 734 } 735 736 /** 737 * This method calculates the preferred layout size for the given 738 * container. 739 * 740 * @param parent The container. 741 * 742 * @return The preferred layout size. 743 */ preferredLayoutSize(Container parent)744 public Dimension preferredLayoutSize(Container parent) 745 { 746 int width = 0; 747 int height = 0; 748 Insets insets = parent.getInsets(); 749 Component[] comps = parent.getComponents(); 750 Dimension pref; 751 for (int i = 0; i < comps.length; i++) 752 { 753 pref = comps[i].getPreferredSize(); 754 if (pref != null) 755 { 756 width = Math.max(width, pref.width); 757 height += pref.height; 758 } 759 } 760 761 return new Dimension(width + insets.left + insets.right, 762 height + insets.top + insets.bottom); 763 } 764 765 /** 766 * This method is called whenever a component is removed from the 767 * container. 768 * 769 * @param comp The removed component. 770 */ removeLayoutComponent(Component comp)771 public void removeLayoutComponent(Component comp) 772 { 773 // Nothing needs to be done. 774 } 775 } 776 777 /** 778 * Creates a new DefaultSwatchChooserPanel object. 779 */ DefaultSwatchChooserPanel()780 DefaultSwatchChooserPanel() 781 { 782 super(); 783 } 784 785 /** 786 * This method updates the chooser panel with the new value from the 787 * JColorChooser. 788 */ updateChooser()789 public void updateChooser() 790 { 791 // Nothing to do here yet. 792 } 793 794 /** 795 * This method builds the chooser panel. 796 */ buildChooser()797 protected void buildChooser() 798 { 799 // The structure of the swatch panel is: 800 // One large panel (minus the insets). 801 // Inside that panel, there are two panels, one holds the palette. 802 // The other holds the label and the recent colors palette. 803 // The two palettes are two custom swatch panels. 804 setLayout(new MainPanelLayout()); 805 806 JPanel mainPaletteHolder = new JPanel(); 807 JPanel recentPaletteHolder = new JPanel(); 808 809 mainPalette = new MainSwatchPanel(); 810 recentPalette = new RecentSwatchPanel(); 811 JLabel label = new JLabel("Recent:"); 812 813 mouseHandler = new MouseHandler(); 814 mainPalette.addMouseListener(mouseHandler); 815 recentPalette.addMouseListener(mouseHandler); 816 817 mainPaletteHolder.setLayout(new BorderLayout()); 818 mainPaletteHolder.add(mainPalette, BorderLayout.CENTER); 819 820 recentPaletteHolder.setLayout(new RecentPanelLayout()); 821 recentPaletteHolder.add(label); 822 recentPaletteHolder.add(recentPalette); 823 824 JPanel main = new JPanel(); 825 main.add(mainPaletteHolder); 826 main.add(recentPaletteHolder); 827 828 this.add(main); 829 } 830 831 /** 832 * This method removes the chooser panel from the JColorChooser. 833 * 834 * @param chooser The JColorChooser this panel is being removed from. 835 */ uninstallChooserPanel(JColorChooser chooser)836 public void uninstallChooserPanel(JColorChooser chooser) 837 { 838 recentPalette = null; 839 mainPalette = null; 840 841 removeAll(); 842 super.uninstallChooserPanel(chooser); 843 } 844 845 /** 846 * This method returns the JTabbedPane displayed name. 847 * 848 * @return The name displayed in the JTabbedPane. 849 */ getDisplayName()850 public String getDisplayName() 851 { 852 return "Swatches"; 853 } 854 855 /** 856 * This method returns the small display icon. 857 * 858 * @return The small display icon. 859 */ getSmallDisplayIcon()860 public Icon getSmallDisplayIcon() 861 { 862 return null; 863 } 864 865 /** 866 * This method returns the large display icon. 867 * 868 * @return The large display icon. 869 */ getLargeDisplayIcon()870 public Icon getLargeDisplayIcon() 871 { 872 return null; 873 } 874 875 /** 876 * This method paints the chooser panel with the given Graphics object. 877 * 878 * @param g The Graphics object to paint with. 879 */ paint(Graphics g)880 public void paint(Graphics g) 881 { 882 super.paint(g); 883 } 884 885 /** 886 * This method returns the tooltip text for the given MouseEvent. 887 * 888 * @param e The MouseEvent. 889 * 890 * @return The tooltip text. 891 */ getToolTipText(MouseEvent e)892 public String getToolTipText(MouseEvent e) 893 { 894 return null; 895 } 896 } 897