1. /*
  2. * @(#)SynthScrollPaneUI.java 1.12 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.event.*;
  10. import javax.swing.border.*;
  11. import javax.swing.plaf.*;
  12. import javax.swing.plaf.basic.*;
  13. import java.beans.PropertyChangeListener;
  14. import java.beans.PropertyChangeEvent;
  15. import java.awt.*;
  16. import java.awt.event.*;
  17. import sun.swing.plaf.synth.SynthUI;
  18. /**
  19. * Synth's ScrollPaneUI.
  20. *
  21. * @version 1.12, 12/19/03
  22. * @author Scott Violet
  23. */
  24. class SynthScrollPaneUI extends BasicScrollPaneUI implements
  25. PropertyChangeListener, SynthUI {
  26. private SynthStyle style;
  27. public static ComponentUI createUI(JComponent x) {
  28. return new SynthScrollPaneUI();
  29. }
  30. public void update(Graphics g, JComponent c) {
  31. SynthContext context = getContext(c);
  32. SynthLookAndFeel.update(context, g);
  33. context.getPainter().paintScrollPaneBackground(context,
  34. g, 0, 0, c.getWidth(), c.getHeight());
  35. paint(context, g);
  36. context.dispose();
  37. }
  38. public void paint(Graphics g, JComponent c) {
  39. SynthContext context = getContext(c);
  40. paint(context, g);
  41. context.dispose();
  42. }
  43. protected void paint(SynthContext context, Graphics g) {
  44. Border vpBorder = scrollpane.getViewportBorder();
  45. if (vpBorder != null) {
  46. Rectangle r = scrollpane.getViewportBorderBounds();
  47. vpBorder.paintBorder(scrollpane, g, r.x, r.y, r.width, r.height);
  48. }
  49. }
  50. public void paintBorder(SynthContext context, Graphics g, int x,
  51. int y, int w, int h) {
  52. context.getPainter().paintScrollPaneBorder(context, g, x, y, w, h);
  53. }
  54. protected void installDefaults(JScrollPane scrollpane) {
  55. updateStyle(scrollpane);
  56. }
  57. private void updateStyle(JScrollPane c) {
  58. SynthContext context = getContext(c, ENABLED);
  59. SynthStyle oldStyle = style;
  60. style = SynthLookAndFeel.updateStyle(context, this);
  61. if (style != oldStyle) {
  62. Border vpBorder = scrollpane.getViewportBorder();
  63. if ((vpBorder == null) ||( vpBorder instanceof UIResource)) {
  64. scrollpane.setViewportBorder(new ViewportBorder(context));
  65. }
  66. if (oldStyle != null) {
  67. uninstallKeyboardActions(c);
  68. installKeyboardActions(c);
  69. }
  70. }
  71. context.dispose();
  72. }
  73. protected void installListeners(JScrollPane c) {
  74. super.installListeners(c);
  75. c.addPropertyChangeListener(this);
  76. }
  77. protected void uninstallDefaults(JScrollPane c) {
  78. SynthContext context = getContext(c, ENABLED);
  79. style.uninstallDefaults(context);
  80. context.dispose();
  81. if (scrollpane.getViewportBorder() instanceof UIResource) {
  82. scrollpane.setViewportBorder(null);
  83. }
  84. }
  85. protected void uninstallListeners(JComponent c) {
  86. super.uninstallListeners(c);
  87. c.removePropertyChangeListener(this);
  88. }
  89. public SynthContext getContext(JComponent c) {
  90. return getContext(c, getComponentState(c));
  91. }
  92. private SynthContext getContext(JComponent c, int state) {
  93. return SynthContext.getContext(SynthContext.class, c,
  94. SynthLookAndFeel.getRegion(c), style, state);
  95. }
  96. private Region getRegion(JComponent c) {
  97. return SynthLookAndFeel.getRegion(c);
  98. }
  99. private int getComponentState(JComponent c) {
  100. return SynthLookAndFeel.getComponentState(c);
  101. }
  102. public void propertyChange(PropertyChangeEvent e) {
  103. if (SynthLookAndFeel.shouldUpdateStyle(e)) {
  104. updateStyle(scrollpane);
  105. }
  106. }
  107. private class ViewportBorder extends AbstractBorder implements UIResource {
  108. private Insets insets;
  109. ViewportBorder(SynthContext context) {
  110. this.insets = (Insets)context.getStyle().get(context,
  111. "ScrollPane.viewportBorderInsets");
  112. if (this.insets == null) {
  113. this.insets = SynthLookAndFeel.EMPTY_UIRESOURCE_INSETS;
  114. }
  115. }
  116. public void paintBorder(Component c, Graphics g, int x, int y,
  117. int width, int height) {
  118. JComponent jc = (JComponent)c;
  119. SynthContext context = getContext(jc);
  120. SynthStyle style = context.getStyle();
  121. if (style == null) {
  122. assert false: "SynthBorder is being used outside after the " +
  123. " UI has been uninstalled";
  124. return;
  125. }
  126. context.getPainter().paintViewportBorder(context, g, x, y, width,
  127. height);
  128. context.dispose();
  129. }
  130. public Insets getBorderInsets(Component c) {
  131. return getBorderInsets(c, null);
  132. }
  133. public Insets getBorderInsets(Component c, Insets insets) {
  134. if (insets == null) {
  135. return new Insets(this.insets.top, this.insets.left,
  136. this.insets.bottom, this.insets.right);
  137. }
  138. insets.top = this.insets.top;
  139. insets.bottom = this.insets.bottom;
  140. insets.left = this.insets.left;
  141. insets.right = this.insets.left;
  142. return insets;
  143. }
  144. public boolean isBorderOpaque() {
  145. return false;
  146. }
  147. }
  148. }