View Javadoc

1   /**
2    * Copyright (C) 2008 Atlassian
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *    http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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  				// stores table configuration in Storage object
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 	 * Restores table properties from Storage object into current table instance
109 	 *
110 	 * @param storage object with table properties
111 	 */
112 	public void restore(Storage storage) {
113 		if (storage != null) {
114 			TableView.restore(storage, this);
115 		}
116 	}
117 
118 	/**
119 	 * Stores current table properties into Storage object
120 	 *
121 	 * @param storage object to store table properties
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 		// Resize width
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 }