1. /*
  2. * @(#)SynthListUI.java 1.11 03/12/19
  3. *
  4. * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package javax.swing.plaf.synth;
  8. import javax.swing.*;
  9. import javax.swing.border.*;
  10. import javax.swing.event.*;
  11. import javax.swing.plaf.*;
  12. import javax.swing.plaf.basic.*;
  13. import javax.swing.text.Position;
  14. import java.awt.*;
  15. import java.awt.event.*;
  16. import java.awt.datatransfer.Transferable;
  17. import java.awt.dnd.*;
  18. import java.util.ArrayList;
  19. import java.util.TooManyListenersException;
  20. import java.beans.PropertyChangeListener;
  21. import java.beans.PropertyChangeEvent;
  22. import sun.swing.plaf.synth.SynthUI;
  23. /**
  24. * Synth's ListUI.
  25. *
  26. * @version 1.11, 12/19/03
  27. * @author Scott Violet
  28. */
  29. class SynthListUI extends BasicListUI implements PropertyChangeListener,
  30. SynthUI {
  31. private SynthStyle style;
  32. private boolean useListColors;
  33. private boolean useUIBorder;
  34. public static ComponentUI createUI(JComponent list) {
  35. return new SynthListUI();
  36. }
  37. public void update(Graphics g, JComponent c) {
  38. SynthContext context = getContext(c);
  39. SynthLookAndFeel.update(context, g);
  40. context.getPainter().paintListBackground(context,
  41. g, 0, 0, c.getWidth(), c.getHeight());
  42. context.dispose();
  43. paint(g, c);
  44. }
  45. public void paintBorder(SynthContext context, Graphics g, int x,
  46. int y, int w, int h) {
  47. context.getPainter().paintListBorder(context, g, x, y, w, h);
  48. }
  49. protected void installListeners() {
  50. super.installListeners();
  51. list.addPropertyChangeListener(this);
  52. }
  53. public void propertyChange(PropertyChangeEvent e) {
  54. if (SynthLookAndFeel.shouldUpdateStyle(e)) {
  55. updateStyle((JList)e.getSource());
  56. }
  57. }
  58. protected void uninstallListeners() {
  59. super.uninstallListeners();
  60. list.removePropertyChangeListener(this);
  61. }
  62. protected void installDefaults() {
  63. if (list.getCellRenderer() == null ||
  64. (list.getCellRenderer() instanceof UIResource)) {
  65. list.setCellRenderer(new SynthListCellRenderer());
  66. }
  67. updateStyle(list);
  68. }
  69. private void updateStyle(JComponent c) {
  70. SynthContext context = getContext(list, ENABLED);
  71. SynthStyle oldStyle = style;
  72. style = SynthLookAndFeel.updateStyle(context, this);
  73. if (style != oldStyle) {
  74. context.setComponentState(SELECTED);
  75. Color sbg = list.getSelectionBackground();
  76. if (sbg == null || sbg instanceof UIResource) {
  77. list.setSelectionBackground(style.getColor(
  78. context, ColorType.TEXT_BACKGROUND));
  79. }
  80. Color sfg = list.getSelectionForeground();
  81. if (sfg == null || sfg instanceof UIResource) {
  82. list.setSelectionForeground(style.getColor(
  83. context, ColorType.TEXT_FOREGROUND));
  84. }
  85. useListColors = style.getBoolean(context,
  86. "List.rendererUseListColors", true);
  87. useUIBorder = style.getBoolean(context,
  88. "List.rendererUseUIBorder", true);
  89. int height = style.getInt(context, "List.cellHeight", -1);
  90. if (height != -1) {
  91. list.setFixedCellHeight(height);
  92. }
  93. if (oldStyle != null) {
  94. uninstallKeyboardActions();
  95. installKeyboardActions();
  96. }
  97. }
  98. context.dispose();
  99. }
  100. protected void uninstallDefaults() {
  101. super.uninstallDefaults();
  102. SynthContext context = getContext(list, ENABLED);
  103. style.uninstallDefaults(context);
  104. context.dispose();
  105. style = null;
  106. }
  107. public SynthContext getContext(JComponent c) {
  108. return getContext(c, getComponentState(c));
  109. }
  110. private SynthContext getContext(JComponent c, int state) {
  111. return SynthContext.getContext(SynthContext.class, c,
  112. SynthLookAndFeel.getRegion(c), style, state);
  113. }
  114. private Region getRegion(JComponent c) {
  115. return SynthLookAndFeel.getRegion(c);
  116. }
  117. private int getComponentState(JComponent c) {
  118. return SynthLookAndFeel.getComponentState(c);
  119. }
  120. private class SynthListCellRenderer extends DefaultListCellRenderer.UIResource {
  121. public String getName() {
  122. return "List.cellRenderer";
  123. }
  124. public void setBorder(Border b) {
  125. if (useUIBorder || b instanceof SynthBorder) {
  126. super.setBorder(b);
  127. }
  128. }
  129. public Component getListCellRendererComponent(JList list, Object value,
  130. int index, boolean isSelected, boolean cellHasFocus) {
  131. if (!useListColors && (isSelected || cellHasFocus)) {
  132. SynthLookAndFeel.setSelectedUI((SynthLabelUI)SynthLookAndFeel.
  133. getUIOfType(getUI(), SynthLabelUI.class),
  134. isSelected, cellHasFocus, list.isEnabled());
  135. }
  136. else {
  137. SynthLookAndFeel.resetSelectedUI();
  138. }
  139. super.getListCellRendererComponent(list, value, index,
  140. isSelected, cellHasFocus);
  141. return this;
  142. }
  143. public void paint(Graphics g) {
  144. super.paint(g);
  145. SynthLookAndFeel.resetSelectedUI();
  146. }
  147. }
  148. }