/*
* MultiPartEditor.java
*
* Created on 16 December 2004, 03:39
*/
package org.owasp.webscarab.ui.swing.editors;
import javax.swing.JSplitPane;
import org.owasp.webscarab.model.MultiPartContent;
import org.owasp.webscarab.model.Message;
import javax.swing.AbstractListModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.owasp.webscarab.ui.swing.MessagePanel;
/**
*
* @author rogan
*/
public class MultiPartPanel extends javax.swing.JPanel implements ByteArrayEditor {
/**
*
*/
private static final long serialVersionUID = 7790954945202743857L;
private byte[] _data = null;
private boolean _modified = false;
private boolean _editable = false;
private MultiPartContent _content = null;
private PartsListModel _partsList = new PartsListModel();
private int _selected = -1;
private MessagePanel _mp = null;
/** Creates new form MultiPartEditor */
public MultiPartPanel() {
initComponents();
setName("MultiPart");
_mp = new MessagePanel(JSplitPane.HORIZONTAL_SPLIT);
contentPanel.add(_mp);
partList.setModel(_partsList);
partList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
partList.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent evt) {
if (evt.getValueIsAdjusting()) return;
if (_editable && _mp.isModified() && _selected > -1) {
_modified = true;
Message message = _mp.getMessage();
_content.set(_selected, message);
_partsList.fireContentsChanged(_selected, _selected);
}
_selected = partList.getSelectedIndex();
if (_selected < 0)
return;
Message message = _content.get(_selected);
_mp.setMessage(message);
invalidate();
revalidate();
}
});
}
public void setEditable(boolean editable) {
_editable = editable;
_mp.setEditable(editable);
}
public void setBytes(String contentType, byte[] bytes) {
int size = 0;
if (_content != null) {
size = _content.size();
}
_modified = false;
_data = bytes;
_content = new MultiPartContent(contentType, bytes);
if (size>0) {
_partsList.fireIntervalRemoved(0, size-1);
}
if (_content.size()>0) {
_partsList.fireIntervalAdded(0, _content.size()-1);
}
}
public boolean isModified() {
return (_editable && (_modified || _mp.isModified()));
}
public byte[] getBytes() {
if (_editable && isModified()) {
if (_mp.isModified()) {
_content.set(_selected, _mp.getMessage());
}
_data = _content.getBytes();
_modified = false;
}
return _data;
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {//GEN-BEGIN:initComponents
java.awt.GridBagConstraints gridBagConstraints;
jScrollPane1 = new javax.swing.JScrollPane();
partList = new javax.swing.JList();
contentPanel = new javax.swing.JPanel();
setLayout(new java.awt.GridBagLayout());
jScrollPane1.setMinimumSize(new java.awt.Dimension(100, 22));
jScrollPane1.setPreferredSize(new java.awt.Dimension(100, 131));
jScrollPane1.setViewportView(partList);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
gridBagConstraints.weighty = 1.0;
add(jScrollPane1, gridBagConstraints);
contentPanel.setLayout(new java.awt.BorderLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(contentPanel, gridBagConstraints);
}//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel contentPanel;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JList partList;
// End of variables declaration//GEN-END:variables
private class PartsListModel extends AbstractListModel {
/**
*
*/
private static final long serialVersionUID = 690901016063929348L;
public Object getElementAt(int index) {
return _content.getPartName(index);
}
public int getSize() {
if (_content == null) return 0;
return _content.size();
}
public void fireIntervalAdded(int index0, int index1) {
super.fireIntervalAdded(PartsListModel.this, index0, index1);
}
public void fireIntervalRemoved(int index0, int index1) {
super.fireIntervalRemoved(PartsListModel.this, index0, index1);
}
public void fireContentsChanged(int index0, int index1) {
super.fireContentsChanged(PartsListModel.this, index0, index1);
}
}
}