package org.wiztools.restclient.ui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.swing.*;
import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator;
import org.wiztools.commons.CollectionsUtil;
import org.wiztools.commons.MultiValueMap;
import org.wiztools.commons.MultiValueMapLinkedHashSet;
import org.wiztools.commons.StringUtil;
/**
*
* @author schandran
*/
public final class TwoColumnTablePanel extends JPanel {
private RESTUserInterface rest_ui;
private TwoColumnTableModel model;
private Dimension tableDimension;
private KeyValMultiEntryDialog jd_multi;
private JMenuItem jmi_rm_selected = new JMenuItem("Remove Selected");
private void initMultiEntryDialog(){
// Initialize the Multi-entry dialog:
MultiEntryAdd callback = new MultiEntryAdd() {
@Override
public void add(Map<String, String> keyValuePair, List<String> invalidLines) {
int successCount = 0;
for(String key: keyValuePair.keySet()){
String value = keyValuePair.get(key);
model.insertRow(key, value);
successCount++;
}
StringBuilder sb = new StringBuilder();
sb.append("Added ").append(successCount).append(" key/value pairs.\n\n");
sb.append("\n**Lines Skipped Due To Pattern Mis-match**\n\n");
if(invalidLines.isEmpty()){
sb.append("- None -\n");
}
else{
for(String line: invalidLines){
sb.append(line).append("\n");
}
}
rest_ui.getView().showMessage("Multi-insert Result", sb.toString());
}
};
jd_multi = new KeyValMultiEntryDialog(rest_ui, callback);
}
public MultiValueMap<String, String> getData() {
Object[][] d = model.getData();
if(d.length == 0) {
return CollectionsUtil.EMPTY_MULTI_VALUE_MAP;
}
MultiValueMap<String, String> out = new MultiValueMapLinkedHashSet<>();
for (Object[] d1 : d) {
String key = (String) d1[0];
String value = (String) d1[1];
out.put(key, value);
}
return out;
}
public void setData(MultiValueMap<String, String> data) {
model.setData(data);
}
public TwoColumnTablePanel(final String[] title, final RESTUserInterface ui) {
this(title, Collections.EMPTY_LIST, ui);
}
public TwoColumnTablePanel(final String[] title, List<String> keys, final RESTUserInterface ui) {
this.rest_ui = ui;
// Create JTable
final JTable jt = new JTable();
// Set the size
Dimension d = jt.getPreferredSize();
d.height = d.height / 2;
jt.setPreferredScrollableViewportSize(d);
tableDimension = d;
// Create and set the table model
model = new TwoColumnTableModel(title);
jt.setModel(model);
// Create Popupmenu
final JPopupMenu popupMenu = new JPopupMenu();
{
jmi_rm_selected.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
int selectionCount = jt.getSelectedRowCount();
if(selectionCount > 0){
int[] rows = jt.getSelectedRows();
Arrays.sort(rows);
for(int i=rows.length-1; i>=0; i--){
model.deleteRow(rows[i]);
}
}
}
});
popupMenu.add(jmi_rm_selected);
}
{
JMenuItem jmi_rm_all = new JMenuItem("Remove All");
jmi_rm_all.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
model.setData(CollectionsUtil.EMPTY_MULTI_VALUE_MAP);
}
});
popupMenu.add(jmi_rm_all);
}
// Attach popup menu
jt.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
showPopup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
showPopup(e);
}
private void showPopup(MouseEvent e) {
if(jt.getSelectedRowCount() == 0) { // No table row selected
jmi_rm_selected.setEnabled(false);
}
else {
jmi_rm_selected.setEnabled(true);
}
if (e.isPopupTrigger()) {
popupMenu.show(e.getComponent(), e.getX(), e.getY());
}
}
});
// Create the interface
JPanel jp = this;
jp.setLayout(new BorderLayout());
JPanel jp_north = new JPanel();
jp_north.setLayout(new FlowLayout(FlowLayout.LEFT));
JLabel jl_key = new JLabel("Key: ");
JLabel jl_value = new JLabel("Value: ");
final int TEXT_FIELD_SIZE = 12;
final JTextField jtf_key = new JTextField(TEXT_FIELD_SIZE);
if(!keys.isEmpty()) {AutoCompleteDecorator.decorate(jtf_key, keys, false);}
final JTextField jtf_value = new JTextField(TEXT_FIELD_SIZE);
jl_key.setDisplayedMnemonic('k');
jl_key.setLabelFor(jtf_key);
JButton jb_add = new JButton(UIUtil.getIconFromClasspath(RCFileView.iconBasePath + "add.png"));
jb_add.setToolTipText("Add");
jb_add.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
String key = jtf_key.getText();
String value = jtf_value.getText();
List<String> errors = null;
if(StringUtil.isEmpty(key)){
errors = new ArrayList<String>();
errors.add("Key is empty.");
}
if(StringUtil.isEmpty(value)){
errors = errors==null?new ArrayList<String>():errors;
errors.add("Value is empty.");
}
Object[][] data = model.getData();
if(errors != null){
StringBuilder sb = new StringBuilder();
sb.append("<html><ul>");
for(String error: errors){
sb.append("<li>");
sb.append(error);
sb.append("</li>");
}
sb.append("</ul></html>");
JOptionPane.showMessageDialog(ui.getFrame(), sb.toString(), "Validation Error", JOptionPane.ERROR_MESSAGE);
return;
}
model.insertRow(key, value);
jtf_key.setText("");
jtf_value.setText("");
jtf_key.requestFocus();
}
});
JButton jb_multi_insert = new JButton(UIUtil.getIconFromClasspath(RCFileView.iconBasePath + "insert_parameters.png"));
jb_multi_insert.setToolTipText("Multi-insert");
jb_multi_insert.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
if(jd_multi == null){
initMultiEntryDialog();
}
jd_multi.setVisible(true);
}
});
jp_north.add(jl_key);
jp_north.add(jtf_key);
jp_north.add(jl_value);
jp_north.add(jtf_value);
jp_north.add(jb_add);
jp_north.add(jb_multi_insert);
jp.add(jp_north, BorderLayout.NORTH);
JPanel jp_center = new JPanel();
jp_center.setLayout(new GridLayout(1, 1));
JScrollPane jsp = new JScrollPane(jt);
jp_center.add(jsp);
jp.add(jp_center, BorderLayout.CENTER);
}
public Dimension getTableDimension(){
return tableDimension;
}
}