/* | |
* Copyright 2011 gitblit.com. | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package com.gitblit.client; | |
import java.awt.BorderLayout; | |
import java.awt.Color; | |
import java.awt.Dimension; | |
import java.awt.Font; | |
import java.awt.GridBagLayout; | |
import java.awt.GridLayout; | |
import java.awt.event.ActionEvent; | |
import java.awt.event.ActionListener; | |
import java.util.ArrayList; | |
import java.util.List; | |
import javax.swing.JButton; | |
import javax.swing.JLabel; | |
import javax.swing.JPanel; | |
import javax.swing.JScrollPane; | |
import javax.swing.JTable; | |
import javax.swing.table.AbstractTableModel; | |
public class JPalette<T> extends JPanel { | |
private static final long serialVersionUID = 1L; | |
private PaletteModel<T> availableModel; | |
private PaletteModel<T> selectedModel; | |
private JButton add; | |
private JButton subtract; | |
private JButton up; | |
private JButton down; | |
public JPalette() { | |
this(false); | |
} | |
public JPalette(boolean controlOrder) { | |
super(new BorderLayout(5, 5)); | |
availableModel = new PaletteModel<T>(); | |
selectedModel = new PaletteModel<T>(); | |
final JTable available = new JTable(availableModel); | |
final JTable selected = new JTable(selectedModel); | |
add = new JButton("->"); | |
add.addActionListener(new ActionListener() { | |
@Override | |
public void actionPerformed(ActionEvent event) { | |
List<T> move = new ArrayList<T>(); | |
if (available.getSelectedRowCount() <= 0) { | |
return; | |
} | |
for (int row : available.getSelectedRows()) { | |
int modelIndex = available.convertRowIndexToModel(row); | |
T item = availableModel.list.get(modelIndex); | |
move.add(item); | |
} | |
availableModel.list.removeAll(move); | |
selectedModel.list.addAll(move); | |
availableModel.fireTableDataChanged(); | |
selectedModel.fireTableDataChanged(); | |
} | |
}); | |
subtract = new JButton("<-"); | |
subtract.addActionListener(new ActionListener() { | |
@Override | |
public void actionPerformed(ActionEvent event) { | |
List<T> move = new ArrayList<T>(); | |
if (selected.getSelectedRowCount() <= 0) { | |
return; | |
} | |
for (int row : selected.getSelectedRows()) { | |
int modelIndex = selected.convertRowIndexToModel(row); | |
T item = selectedModel.list.get(modelIndex); | |
move.add(item); | |
} | |
selectedModel.list.removeAll(move); | |
availableModel.list.addAll(move); | |
selectedModel.fireTableDataChanged(); | |
availableModel.fireTableDataChanged(); | |
} | |
}); | |
up = new JButton("\u2191"); | |
up.addActionListener(new ActionListener() { | |
@Override | |
public void actionPerformed(ActionEvent event) { | |
int row = selected.getSelectedRow(); | |
if (row > 0) { | |
T o = selectedModel.list.remove(row); | |
selectedModel.list.add(row - 1, o); | |
selectedModel.fireTableDataChanged(); | |
} | |
} | |
}); | |
down = new JButton("\u2193"); | |
down.addActionListener(new ActionListener() { | |
@Override | |
public void actionPerformed(ActionEvent event) { | |
int row = selected.getSelectedRow(); | |
if (row < selected.getRowCount() - 1) { | |
T o = selectedModel.list.remove(row); | |
selectedModel.list.add(row + 1, o); | |
selectedModel.fireTableDataChanged(); | |
} | |
} | |
}); | |
JPanel controls = new JPanel(new GridLayout(0, 1, 0, 5)); | |
controls.add(add); | |
controls.add(subtract); | |
if (controlOrder) { | |
controls.add(up); | |
controls.add(down); | |
} | |
JPanel center = new JPanel(new GridBagLayout()); | |
center.add(controls); | |
add(newListPanel(Translation.get("gb.available"), available), BorderLayout.WEST); | |
add(center, BorderLayout.CENTER); | |
add(newListPanel(Translation.get("gb.selected"), selected), BorderLayout.EAST); | |
} | |
private JPanel newListPanel(String label, JTable table) { | |
NameRenderer nameRenderer = new NameRenderer(); | |
table.setCellSelectionEnabled(false); | |
table.setRowSelectionAllowed(true); | |
table.getTableHeader().setReorderingAllowed(false); | |
table.setGridColor(new Color(0xd9d9d9)); | |
table.setBackground(Color.white); | |
table.getColumn(table.getColumnName(0)).setCellRenderer(nameRenderer); | |
JScrollPane jsp = new JScrollPane(table); | |
jsp.setPreferredSize(new Dimension(225, 160)); | |
JPanel panel = new JPanel(new BorderLayout()); | |
JLabel jlabel = new JLabel(label); | |
jlabel.setFont(jlabel.getFont().deriveFont(Font.BOLD)); | |
panel.add(jlabel, BorderLayout.NORTH); | |
panel.add(jsp, BorderLayout.CENTER); | |
return panel; | |
} | |
@Override | |
public void setEnabled(boolean enabled) { | |
super.setEnabled(enabled); | |
add.setEnabled(enabled); | |
subtract.setEnabled(enabled); | |
up.setEnabled(enabled); | |
down.setEnabled(enabled); | |
} | |
public void setObjects(List<T> all, List<T> selected) { | |
List<T> available = new ArrayList<T>(all); | |
if (selected != null) { | |
available.removeAll(selected); | |
} | |
availableModel.list.clear(); | |
availableModel.list.addAll(available); | |
availableModel.fireTableDataChanged(); | |
if (selected != null) { | |
selectedModel.list.clear(); | |
selectedModel.list.addAll(selected); | |
selectedModel.fireTableDataChanged(); | |
} | |
} | |
public List<T> getSelections() { | |
return new ArrayList<T>(selectedModel.list); | |
} | |
public class PaletteModel<K> extends AbstractTableModel { | |
private static final long serialVersionUID = 1L; | |
List<K> list; | |
public PaletteModel() { | |
this(new ArrayList<K>()); | |
} | |
public PaletteModel(List<K> list) { | |
this.list = new ArrayList<K>(list); | |
} | |
@Override | |
public int getRowCount() { | |
return list.size(); | |
} | |
@Override | |
public int getColumnCount() { | |
return 1; | |
} | |
@Override | |
public String getColumnName(int column) { | |
return Translation.get("gb.name"); | |
} | |
@Override | |
public Class<?> getColumnClass(int columnIndex) { | |
return String.class; | |
} | |
@Override | |
public Object getValueAt(int rowIndex, int columnIndex) { | |
K o = list.get(rowIndex); | |
return o.toString(); | |
} | |
} | |
} |