James Moger
2012-02-16 3cc6e2de29a0fa33dd585e938e1614a6dd5f9755
commit | author | age
da0269 1 /*
JM 2  * Copyright 2011 gitblit.com.
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 package com.gitblit.client;
17
18 import java.awt.BorderLayout;
19 import java.awt.Color;
20 import java.awt.Dimension;
b7f591 21 import java.awt.Font;
da0269 22 import java.awt.GridBagLayout;
JM 23 import java.awt.GridLayout;
24 import java.awt.event.ActionEvent;
25 import java.awt.event.ActionListener;
26 import java.util.ArrayList;
27 import java.util.List;
28
29 import javax.swing.JButton;
30 import javax.swing.JLabel;
31 import javax.swing.JPanel;
32 import javax.swing.JScrollPane;
33 import javax.swing.JTable;
34 import javax.swing.table.AbstractTableModel;
35
36 public class JPalette<T> extends JPanel {
37
38     private static final long serialVersionUID = 1L;
39     private PaletteModel<T> availableModel;
40     private PaletteModel<T> selectedModel;
41
42     public JPalette() {
4bd203 43         this(false);
JM 44     }
45
46     public JPalette(boolean controlOrder) {
da0269 47         super(new BorderLayout(5, 5));
JM 48
49         availableModel = new PaletteModel<T>();
50         selectedModel = new PaletteModel<T>();
51
52         final JTable available = new JTable(availableModel);
53         final JTable selected = new JTable(selectedModel);
54
55         JButton add = new JButton("->");
56         add.addActionListener(new ActionListener() {
57             public void actionPerformed(ActionEvent event) {
58                 List<T> move = new ArrayList<T>();
59                 if (available.getSelectedRowCount() <= 0) {
60                     return;
61                 }
62                 for (int row : available.getSelectedRows()) {
63                     int modelIndex = available.convertRowIndexToModel(row);
64                     T item = (T) availableModel.list.get(modelIndex);
65                     move.add(item);
66                 }
67                 availableModel.list.removeAll(move);
68                 selectedModel.list.addAll(move);
69                 availableModel.fireTableDataChanged();
70                 selectedModel.fireTableDataChanged();
71             }
72         });
73         JButton subtract = new JButton("<-");
74         subtract.addActionListener(new ActionListener() {
75             public void actionPerformed(ActionEvent event) {
76                 List<T> move = new ArrayList<T>();
77                 if (selected.getSelectedRowCount() <= 0) {
78                     return;
79                 }
80                 for (int row : selected.getSelectedRows()) {
81                     int modelIndex = selected.convertRowIndexToModel(row);
82                     T item = (T) selectedModel.list.get(modelIndex);
83                     move.add(item);
84                 }
85                 selectedModel.list.removeAll(move);
86                 availableModel.list.addAll(move);
87
88                 selectedModel.fireTableDataChanged();
89                 availableModel.fireTableDataChanged();
90             }
91         });
92
4bd203 93         JButton up = new JButton("\u2191");
JM 94         up.addActionListener(new ActionListener() {
95             public void actionPerformed(ActionEvent event) {
96                 int row = selected.getSelectedRow();
97                 if (row > 0) {
98                     T o = selectedModel.list.remove(row);
99                     selectedModel.list.add(row - 1, o);
100                     selectedModel.fireTableDataChanged();
101                 }
102             }
103         });
104
105         JButton down = new JButton("\u2193");
106         down.addActionListener(new ActionListener() {
107             public void actionPerformed(ActionEvent event) {
108                 int row = selected.getSelectedRow();
109                 if (row < selected.getRowCount() - 1) {
110                     T o = selectedModel.list.remove(row);
111                     selectedModel.list.add(row + 1, o);
112                     selectedModel.fireTableDataChanged();
113                 }
114             }
115         });
116
da0269 117         JPanel controls = new JPanel(new GridLayout(0, 1, 0, 5));
JM 118         controls.add(add);
119         controls.add(subtract);
4bd203 120         if (controlOrder) {
JM 121             controls.add(up);
122             controls.add(down);
123         }
da0269 124
JM 125         JPanel center = new JPanel(new GridBagLayout());
126         center.add(controls);
127
b7f591 128         add(newListPanel(Translation.get("gb.available"), available), BorderLayout.WEST);
da0269 129         add(center, BorderLayout.CENTER);
b7f591 130         add(newListPanel(Translation.get("gb.selected"), selected), BorderLayout.EAST);
da0269 131     }
JM 132
133     private JPanel newListPanel(String label, JTable table) {
134         NameRenderer nameRenderer = new NameRenderer();
135         table.setCellSelectionEnabled(false);
136         table.setRowSelectionAllowed(true);
137         table.setRowHeight(nameRenderer.getFont().getSize() + 8);
138         table.getTableHeader().setReorderingAllowed(false);
139         table.setGridColor(new Color(0xd9d9d9));
140         table.setBackground(Color.white);
141         table.getColumn(table.getColumnName(0)).setCellRenderer(nameRenderer);
142
143         JScrollPane jsp = new JScrollPane(table);
144         jsp.setPreferredSize(new Dimension(225, 175));
145         JPanel panel = new JPanel(new BorderLayout());
b7f591 146         JLabel jlabel = new JLabel(label);
JM 147         jlabel.setFont(jlabel.getFont().deriveFont(Font.BOLD));
148         panel.add(jlabel, BorderLayout.NORTH);
da0269 149         panel.add(jsp, BorderLayout.CENTER);
JM 150         return panel;
151     }
152
153     public void setObjects(List<T> all, List<T> selected) {
154         List<T> available = new ArrayList<T>(all);
155         if (selected != null) {
156             available.removeAll(selected);
157         }
158         availableModel.list.clear();
159         availableModel.list.addAll(available);
160         availableModel.fireTableDataChanged();
161
162         if (selected != null) {
163             selectedModel.list.clear();
164             selectedModel.list.addAll(selected);
165             selectedModel.fireTableDataChanged();
166         }
167     }
168
169     public List<T> getSelections() {
170         return new ArrayList<T>(selectedModel.list);
171     }
172
173     public class PaletteModel<K> extends AbstractTableModel {
174
175         private static final long serialVersionUID = 1L;
176
177         List<K> list;
178
179         public PaletteModel() {
180             this(new ArrayList<K>());
181         }
182
183         public PaletteModel(List<K> list) {
184             this.list = new ArrayList<K>(list);
185         }
186
187         @Override
188         public int getRowCount() {
189             return list.size();
190         }
191
192         @Override
193         public int getColumnCount() {
194             return 1;
195         }
196
197         @Override
198         public String getColumnName(int column) {
b7f591 199             return Translation.get("gb.name");
da0269 200         }
JM 201
202         public Class<?> getColumnClass(int columnIndex) {
203             return String.class;
204         }
205
206         @Override
207         public Object getValueAt(int rowIndex, int columnIndex) {
208             K o = list.get(rowIndex);
209             return o.toString();
210         }
211     }
212 }