1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.atlassian.theplugin.idea.ui;
18
19 import com.atlassian.theplugin.idea.TableColumnInfo;
20 import com.intellij.ui.table.TableView;
21 import com.intellij.util.config.Storage;
22 import com.intellij.util.ui.ListTableModel;
23
24 import javax.swing.*;
25 import javax.swing.event.TableModelEvent;
26 import javax.swing.table.TableCellRenderer;
27 import javax.swing.table.TableColumnModel;
28 import java.awt.*;
29 import java.awt.event.KeyAdapter;
30 import java.awt.event.KeyEvent;
31 import java.awt.event.MouseAdapter;
32 import java.awt.event.MouseEvent;
33 import java.util.ArrayList;
34 import java.util.Collections;
35 import java.util.List;
36
37 public class AtlassianTableView<T> extends TableView<T> {
38 private static final int DEFAULT_ROW_HEIGHT = 20;
39 private boolean autoAdjustHeight = true;
40 private static final int MAX_DISPLAYED_ROW_COUNT = 15;
41 private final java.util.List<TableItemSelectedListener<T>> listenerList = new ArrayList<TableItemSelectedListener<T>>();
42 private UserTableContext state = new UserTableContext();
43
44
45 public AtlassianTableView(TableColumnProvider columnProvider, ListTableModel<T> listTableModel, final Storage storage) {
46 super(listTableModel);
47 setBorder(BorderFactory.createEmptyBorder());
48 getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
49 getColumnModel().setColumnMargin(0);
50
51 setMinRowHeight(DEFAULT_ROW_HEIGHT);
52 setAutoResizeMode(TableView.AUTO_RESIZE_OFF);
53 prepareColumns(columnProvider);
54 getTableHeader().addMouseListener(new MouseAdapter() {
55 @Override
56 public void mouseReleased(MouseEvent e) {
57
58 if (storage != null) {
59 TableView.store(storage, AtlassianTableView.this);
60 }
61 }
62 });
63 final ItemSelectedMouseAdapter<T> l = new ItemSelectedMouseAdapter<T>(this);
64 addMouseListener(l);
65 addKeyListener(new KeyAdapter() {
66 @Override
67 public void keyReleased(KeyEvent e) {
68 int key = e.getKeyCode();
69 if (key == KeyEvent.VK_DOWN || key == KeyEvent.VK_UP) {
70 for (TableItemSelectedListener<T> tableItemSelectedListener : getListenerList()) {
71 tableItemSelectedListener.itemSelected(AtlassianTableView.this, 1);
72 }
73 }
74 }
75 });
76 }
77
78 public AtlassianTableView(TableColumnProvider columnProvider, ListTableModel<T> listTableModel, final Storage storage,
79 final String popupMenuPlace, final String popupMenuName) {
80 this(columnProvider, listTableModel, storage);
81 if (popupMenuPlace != null && popupMenuName != null && popupMenuName.length() > 0) {
82 addMouseListener(new ShowPopupMouseAdapter<T>(this, popupMenuName, popupMenuPlace));
83 }
84 }
85
86 @SuppressWarnings("unchecked")
87 @Override
88 public ListTableModel<T> getListTableModel() {
89 return super.getListTableModel();
90 }
91
92
93 public void prepareColumns(TableColumnProvider tableColumnProvider) {
94 TableColumnInfo[] cols = tableColumnProvider.makeColumnInfo();
95 TableCellRenderer[] renderers = tableColumnProvider.makeRendererInfo();
96 TableColumnModel model = getColumnModel();
97 for (int i = 0; i < model.getColumnCount(); ++i) {
98 model.getColumn(i).setResizable(true);
99 model.getColumn(i).setPreferredWidth(cols[i].getPrefferedWidth());
100 if (renderers[i] != null) {
101 model.getColumn(i).setCellRenderer(renderers[i]);
102
103 }
104 }
105 }
106
107
108
109
110
111
112 public void restore(Storage storage) {
113 if (storage != null) {
114 TableView.restore(storage, this);
115 }
116 }
117
118
119
120
121
122
123 public void store(Storage storage) {
124 TableView.store(storage, this);
125 }
126
127
128 public Dimension getTableDimension() {
129 int tableWidth = 0;
130 int tableHeight = Math.min(getModel().getRowCount(), MAX_DISPLAYED_ROW_COUNT) * getRowHeight();
131
132 for (int col = 0; col < getColumnModel().getColumnCount(); col++) {
133 tableWidth += (getColumnModel().getColumn(col).getPreferredWidth());
134 }
135
136 if (getTableHeader() != null) {
137 Dimension tableHeaderDimension = getTableHeader().getPreferredSize();
138 tableHeight += tableHeaderDimension.height;
139 }
140
141 return new Dimension(tableWidth, tableHeight);
142 }
143
144
145 @Override
146 public void tableChanged(TableModelEvent e) {
147
148 Dimension prefered = getTableDimension();
149 setPreferredScrollableViewportSize(prefered);
150 super.tableChanged(e);
151 }
152
153 public void addItemSelectedListener(TableItemSelectedListener<T> listener) {
154 listenerList.add(listener);
155 }
156
157 public void removeItemSelectedListener(TableItemSelectedListener<T> listener) {
158 listenerList.remove(listener);
159 }
160
161 public List<TableItemSelectedListener<T>> getListenerList() {
162 return Collections.unmodifiableList(listenerList);
163 }
164
165 public UserTableContext getStateContext() {
166 return state;
167 }
168
169 public void setStateContext(UserTableContext context) {
170 state = context;
171 }
172 }