package org.wiztools.restclient.ui.reqbody;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import org.wiztools.restclient.bean.*;
import org.wiztools.restclient.ui.RESTView;
import org.wiztools.restclient.ui.UIUtil;
/**
*
* @author subwiz
*/
public class ReqBodyPanelMultipart extends JPanel implements ReqBodyPanel {
@Inject
private RESTView view;
@Inject
private AddMultipartFileDialog jd_addFileDialog;
@Inject
private AddMultipartStringDialog jd_addStringDialog;
@Inject
private MultipartOptionsDialog jd_options;
private final JButton jb_string = new JButton("String");
private final JButton jb_file = new JButton("File");
private final JButton jb_config = new JButton(UIUtil.getIconFromClasspath("org/wiztools/restclient/cog.png"));
private final MultipartTableModel model = new MultipartTableModel();
private final JTable jt = new JTable(model);
private class MultipartTableModel extends AbstractTableModel {
private final String[] columnNames = new String[]{"Type", "Content-type", "Name", "Part"};
private final LinkedList<ReqEntityPart> list = new LinkedList<>();
@Override
public int getRowCount() {
return list.size();
}
@Override
public int getColumnCount() {
return 4;
}
@Override
public String getColumnName(int columnIndex) {
return columnNames[columnIndex];
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
ReqEntityPart part = list.get(rowIndex);
if(columnIndex == 0) {
if(part instanceof ReqEntityStringPart) {
return "String";
}
else if(part instanceof ReqEntityFilePart) {
return "File";
}
}
else if(columnIndex == 1) {
return part.getContentType();
}
else if(columnIndex == 2) {
return part.getName();
}
else {
if(part instanceof ReqEntityStringPart) {
return ((ReqEntityStringPart)part).getPart();
}
else if(part instanceof ReqEntityFilePart) {
return ((ReqEntityFilePart)part).getPart();
}
}
throw new IllegalArgumentException("Should never come here!");
}
public void addPartFirst(ReqEntityPart part) {
list.addFirst(part);
fireTableDataChanged();
}
public void addPartLast(ReqEntityPart part) {
list.addLast(part);
fireTableDataChanged();
}
public ReqEntityPart getEntityInRow(int row) {
return list.get(row);
}
public void removeRow(int row) {
list.remove(row);
fireTableDataChanged();
}
public void clear() {
list.clear();
fireTableDataChanged();
}
}
@PostConstruct
protected void init() {
// Listeners:
final AddMultipartPartListener listener = new AddMultipartPartListener() {
@Override
public void addPart(ReqEntityPart part) {
model.addPartFirst(part);
}
};
jd_addStringDialog.addMultipartPartListener(listener);
jd_addFileDialog.addMultipartPartListener(listener);
// Table popup:
JPopupMenu menu = new JPopupMenu();
JMenuItem jmi_rm = new JMenuItem("Delete selected");
jmi_rm.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final int[] rows = jt.getSelectedRows();
Arrays.sort(rows);
if(rows != null && rows.length > 0) {
int i = 0;
for(int row: rows) {
row = row - i; // the number of rows previously deleted should be accounted for!
model.removeRow(row);
i++;
}
view.setStatusMessage(MessageFormat.format("Deleted {0} row(s)", i));
}
else {
view.setStatusMessage("No row(s) selected!");
}
}
});
menu.add(jmi_rm);
JMenuItem jmi_view = new JMenuItem("Quick view");
jmi_view.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
quickView();
}
});
menu.add(jmi_view);
jt.setComponentPopupMenu(menu);
// Layouts:
setLayout(new BorderLayout());
{ // North:
JPanel jp_border = new JPanel(new BorderLayout(0, 0));
JPanel jp_center = new JPanel(new FlowLayout(FlowLayout.LEFT));
jp_center.add(new JLabel("Add Part: "));
{ // String button:
jb_string.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jd_addStringDialog.setVisible(true);
}
});
jp_center.add(jb_string);
}
{ // file button:
jb_file.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jd_addFileDialog.setVisible(true);
}
});
jp_center.add(jb_file);
}
jp_border.add(jp_center, BorderLayout.CENTER);
JPanel jp_east = new JPanel(new FlowLayout(FlowLayout.RIGHT));
{ // config button:
jb_config.setToolTipText("Set multipart mode");
jb_config.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jd_options.setVisible(true);
}
});
jp_east.add(jb_config);
}
jp_border.add(jp_east, BorderLayout.EAST);
add(jp_border, BorderLayout.NORTH);
}
// Center:
JScrollPane jsp = new JScrollPane(jt);
add(jsp, BorderLayout.CENTER);
}
private void quickView() {
final int row = jt.getSelectedRow();
if(row != -1) {
ReqEntityPart entity = model.getEntityInRow(row);
view.showMessage("Quick View", entity.toString());
}
}
@Override
public void enableBody() {
jb_string.setEnabled(true);
jb_file.setEnabled(true);
jb_config.setEnabled(true);
jt.setEnabled(true);
jd_options.setEnabled(true);
}
@Override
public void disableBody() {
jb_string.setEnabled(false);
jb_file.setEnabled(false);
jb_config.setEnabled(false);
jt.setEnabled(false);
jd_options.setEnabled(false);
}
@Override
public void clear() {
jd_options.clear();
model.clear();
}
@Override
public void setEntity(ReqEntity entity) {
if(entity instanceof ReqEntityMultipart) {
ReqEntityMultipart e = (ReqEntityMultipart) entity;
MultipartSubtype type = e.getSubtype();
jd_options.setSelectedSubtype(type);
MultipartMode mode = e.getMode();
jd_options.setSelectedMode(mode);
List<ReqEntityPart> parts = e.getBody();
for(ReqEntityPart part: parts) {
model.addPartLast(part);
}
}
}
@Override
public ReqEntity getEntity() {
MultipartSubtype type = jd_options.getSelectedSubtype();
MultipartMode mode = jd_options.getSelectedMode();
ReqEntity entity = new ReqEntityMultipartBean(
(LinkedList<ReqEntityPart>)model.list.clone(), mode, type);
return entity;
}
@Override
public Component getComponent() {
return this;
}
}