1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.log4j.lf5.viewer;
18
19 import javax.swing.*;
20 import javax.swing.table.TableModel;
21 import java.awt.*;
22
23 /***
24 * Provides methods to accomplish common yet non-trivial tasks
25 * with Swing. Obvious implementations of these methods have been
26 * tried and failed.
27 *
28 * @author Richard Wan
29 */
30
31 // Contributed by ThoughtWorks Inc.
32
33 public class LF5SwingUtils {
34 //--------------------------------------------------------------------------
35 // Constants:
36 //--------------------------------------------------------------------------
37
38 //--------------------------------------------------------------------------
39 // Protected Variables:
40 //--------------------------------------------------------------------------
41
42 //--------------------------------------------------------------------------
43 // Private Variables:
44 //--------------------------------------------------------------------------
45
46 //--------------------------------------------------------------------------
47 // Constructors:
48 //--------------------------------------------------------------------------
49
50 //--------------------------------------------------------------------------
51 // Public Methods:
52 //--------------------------------------------------------------------------
53
54 /***
55 * Selects a the specified row in the specified JTable and scrolls
56 * the specified JScrollpane to the newly selected row. More importantly,
57 * the call to repaint() delayed long enough to have the table
58 * properly paint the newly selected row which may be offscre
59 * @param table should belong to the specified JScrollPane
60 */
61 public static void selectRow(int row, JTable table, JScrollPane pane) {
62 if (table == null || pane == null) {
63 return;
64 }
65 if (contains(row, table.getModel()) == false) {
66 return;
67 }
68 moveAdjustable(row * table.getRowHeight(), pane.getVerticalScrollBar());
69 selectRow(row, table.getSelectionModel());
70 // repaint must be done later because moveAdjustable
71 // posts requests to the swing thread which must execute before
72 // the repaint logic gets executed.
73 repaintLater(table);
74 }
75
76 /***
77 * Makes the specified Adjustable track if the view area expands and
78 * the specified Adjustable is located near the of the view.
79 */
80 public static void makeScrollBarTrack(Adjustable scrollBar) {
81 if (scrollBar == null) {
82 return;
83 }
84 scrollBar.addAdjustmentListener(new TrackingAdjustmentListener());
85 }
86
87 /***
88 * Makes the vertical scroll bar of the specified JScrollPane
89 * track if the view expands (e.g. if rows are added to an underlying
90 * table).
91 */
92 public static void makeVerticalScrollBarTrack(JScrollPane pane) {
93 if (pane == null) {
94 return;
95 }
96 makeScrollBarTrack(pane.getVerticalScrollBar());
97 }
98
99 //--------------------------------------------------------------------------
100 // Protected Methods:
101 //--------------------------------------------------------------------------
102 protected static boolean contains(int row, TableModel model) {
103 if (model == null) {
104 return false;
105 }
106 if (row < 0) {
107 return false;
108 }
109 if (row >= model.getRowCount()) {
110 return false;
111 }
112 return true;
113 }
114
115 protected static void selectRow(int row, ListSelectionModel model) {
116 if (model == null) {
117 return;
118 }
119 model.setSelectionInterval(row, row);
120 }
121
122 protected static void moveAdjustable(int location, Adjustable scrollBar) {
123 if (scrollBar == null) {
124 return;
125 }
126 scrollBar.setValue(location);
127 }
128
129 /***
130 * Work around for JTable/viewport bug.
131 * @link http://developer.java.sun.com/developer/bugParade/bugs/4205145.html
132 */
133 protected static void repaintLater(final JComponent component) {
134 SwingUtilities.invokeLater(new Runnable() {
135 public void run() {
136 component.repaint();
137 }
138 });
139 }
140 //--------------------------------------------------------------------------
141 // Private Methods:
142 //--------------------------------------------------------------------------
143
144 //--------------------------------------------------------------------------
145 // Nested Top-Level Classes or Interfaces
146 //--------------------------------------------------------------------------
147 }
148