package com.limegroup.gnutella.gui.xml.editor;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Arrays;
import java.util.List;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.text.JTextComponent;
import com.limegroup.gnutella.FileDesc;
import com.limegroup.gnutella.FileEventListener;
import com.limegroup.gnutella.util.NameValue;
import com.limegroup.gnutella.xml.LimeXMLDocument;
import com.limegroup.gnutella.xml.LimeXMLSchema;
import com.limegroup.gnutella.xml.SchemaFieldInfo;
import com.limegroup.gnutella.gui.xml.ComboBoxValue;
import com.limegroup.gnutella.licenses.CCConstants;
public abstract class MetaEditorPanel extends AbstractMetaEditorPanel {
private HashMap nameToComponent;
private ArrayList checkboxes;
protected final FileDesc fd;
protected final LimeXMLDocument document;
protected final LimeXMLSchema schema;
protected final List uneditedNameValues;
public MetaEditorPanel(FileDesc fd, LimeXMLSchema schema, LimeXMLDocument document) {
this.fd = fd;
this.schema = schema;
this.document = document;
nameToComponent = new HashMap();
checkboxes = new ArrayList();
uneditedNameValues = new LinkedList();
addAllFields();
}
public FileDesc getFileDesc() {
return fd;
}
public LimeXMLDocument getDocument() {
return document;
}
public LimeXMLSchema getSchema() {
return schema;
}
public String getValue(String name) {
return (document != null) ? document.getValue(name) : null;
}
public void addComponent(String name, JComponent component) {
addComponent(name, null, component);
}
public void addComponent(String name, JCheckBox checkbox, JComponent component) {
nameToComponent.put(name, component);
for(Iterator i = uneditedNameValues.iterator(); i.hasNext(); ) {
NameValue nv = (NameValue)i.next();
if(nv.getName().equals(name)) {
i.remove();
break;
}
}
if (checkbox != null)
link(checkbox, component);
}
public JComponent getComponent(String name) {
return (JComponent)nameToComponent.get(name);
}
public Iterator getComponentIterator() {
return nameToComponent.keySet().iterator();
}
public Iterator getUneditedFieldsIterator() {
return uneditedNameValues.iterator();
}
private void link(final JCheckBox checkbox, JComponent comp) {
if (comp instanceof JTextComponent) {
((JTextComponent)comp).addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent evt) {
checkbox.setSelected(true);
}
});
checkboxes.add(checkbox);
} else if (comp instanceof JComboBox) {
JComboBox comboBox = (JComboBox)comp;
comboBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent evt) {
checkbox.setSelected(true);
}
});
if (comboBox.isEditable()) {
JTextComponent editor = (JTextComponent)comboBox.getEditor().getEditorComponent();
editor.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent evt) {
checkbox.setSelected(true);
}
});
}
checkboxes.add(checkbox);
}
}
public boolean hasChanged() {
Iterator it = checkboxes.iterator();
while(it.hasNext()) {
if (((JCheckBox)it.next()).isSelected())
return true;
}
return false;
}
public void setCheckBoxesSelected(boolean selected) {
Iterator it = checkboxes.iterator();
while(it.hasNext()) {
((JCheckBox)it.next()).setSelected(selected);
}
}
public void setCheckBoxesVisible(boolean visible) {
Iterator it = checkboxes.iterator();
while(it.hasNext()) {
((JCheckBox)it.next()).setVisible(visible);
}
}
public void reset() {
Iterator it = getComponentIterator();
while(it.hasNext()) {
String name = (String)it.next();
JComponent comp = getComponent(name);
if (comp instanceof JTextComponent) {
((JTextComponent)comp).setText("");
} else if (comp instanceof JComboBox) {
((JComboBox)comp).setSelectedIndex(0);
}
}
setCheckBoxesSelected(true);
}
public void prepareSave() {
}
public void initFields() {
Iterator it = getComponentIterator();
while(it.hasNext()) {
String name = (String)it.next();
String value = getValue(name);
JComponent comp = getComponent(name);
if(comp instanceof JTextComponent) {
if(value!=null) {
((JTextComponent)comp).setText(value);
if(comp instanceof JTextArea) {
((JTextArea)comp).setCaretPosition(0);
}
}
}
else if(comp instanceof JComboBox) {
JComboBox box = (JComboBox)comp;
LimeXMLSchema schema = getSchema();
List enums = schema.getEnumerationFields();
Iterator it2 = enums.iterator();
while(it2.hasNext()) {
SchemaFieldInfo infoField = (SchemaFieldInfo)it2.next();
String currField = infoField.getCanonicalizedFieldName();
if(currField.equals(name)) {
ArrayList values = new ArrayList();
values.add(0, new ComboBoxValue());
addEnums(infoField.getEnumerationList(), values);
int index = 0;
if (value != null && !value.equals("")) {
ComboBoxValue combVal = new ComboBoxValue(value);
if (!values.contains(combVal))
values.add(combVal);
}
if((name.indexOf("__licensetype__")>-1) && value!=null &&
!value.equals(CCConstants.CC_URI_PREFIX)) {
values.remove(new ComboBoxValue(CCConstants.CC_URI_PREFIX));
}
Object[] arr = (Object[])values.toArray(new Object[0]);
Arrays.sort(arr);
if(value != null && !value.equals(""))
index = Arrays.asList(arr).indexOf(new ComboBoxValue(value));
box.setModel(new DefaultComboBoxModel(arr));
box.setSelectedIndex(index);
}
}
}
}
}
public List getInput() {
ArrayList namValList = new ArrayList();
prepareSave();
Iterator it = getComponentIterator();
while(it.hasNext()) {
String name = (String)it.next();
JComponent comp = getComponent(name);
String value = null;
if (comp instanceof JTextComponent) {
value = ((JTextComponent)comp).getText().trim();
} else if (comp instanceof JComboBox) {
JComboBox box = (JComboBox)comp;
ComboBoxValue cbv = (ComboBoxValue)box.getSelectedItem();
if(cbv != null) {
String cbvalue = cbv.getValue();
if(cbvalue != null)
value = cbvalue.trim();
}
}
if (value != null) {
NameValue namValue = new NameValue(name, value);
namValList.add(namValue);
}
}
for(Iterator j = getUneditedFieldsIterator(); j.hasNext(); )
namValList.add((NameValue)j.next());
return namValList;
}
protected void addEnums(List nameValues, List comboValues) {
for(Iterator i = nameValues.iterator(); i.hasNext(); )
comboValues.add(new ComboBoxValue((NameValue)i.next()));
}
private void addAllFields() {
if(document != null) {
for(Iterator i = document.getNameValueSet().iterator(); i.hasNext(); ) {
Map.Entry next = (Map.Entry)i.next();
uneditedNameValues.add(new NameValue((String)next.getKey(), next.getValue()));
}
}
}
public boolean checkInput() {
return true;
}
public FileEventListener getFileEventListener() {
return null;
}
}