package org.argouml.util;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.StringReader;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.argouml.application.Main;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class GATEPartnerSelectionDialog extends ArgoDialog {
public boolean success = false;
public List<Integer> selectedPartners = new LinkedList<Integer>();
private List<PossiblePartner> possiblePartners = new LinkedList<PossiblePartner>();
private JComboBox partnerComboBoxes[] = null;
private JButton okButton = new JButton();
private JButton cancelButton = new JButton();
private JLabel text;
public GATEPartnerSelectionDialog() {
super("Abgabe starten", ArgoDialog.CLOSE_OPTION, true);
setLayout(new BorderLayout(10, 10));
text = new JLabel("Info");
add(text, BorderLayout.NORTH);
nameButton(okButton, "Absenden");
okButton.setMnemonic('s');
nameButton(cancelButton, "button.cancel");
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
selectedPartners.clear();
if (partnerComboBoxes != null) {
for (int i = 0; i < partnerComboBoxes.length; i++) {
if (partnerComboBoxes[i].getSelectedItem() != null) {
selectedPartners.add(((PossiblePartner)partnerComboBoxes[i].getSelectedItem()).getId());
}
}
}
success = true;
hide();
}
});
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
hide();
}
});
JPanel mainPanel = new JPanel();
add(new JScrollPane(mainPanel), BorderLayout.CENTER);
JPanel buttonPanel = new JPanel();
add(buttonPanel, BorderLayout.SOUTH);
buttonPanel.add(okButton);
buttonPanel.add(cancelButton);
setSize(500, 300);
setLocationRelativeTo(getParent());
String partnersXML = GATEHelper
.retrieve("/SubmitSolution?onlypartners=true&taskid="
+ Main.taskID);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
Document document = null;
try {
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(new InputSource(new StringReader(
partnersXML)));
} catch (ParserConfigurationException e) {
} catch (SAXException e) {
} catch (IOException e) {
}
if (document == null
|| document.getFirstChild() == null
|| !document.getFirstChild().getNodeName()
.equals("possiblepartners")) {
JOptionPane.showMessageDialog(null,
"Something strange happened. :(");
} else {
Node possiblePartnersNode = document.getFirstChild();
if (possiblePartnersNode.getFirstChild() == null) {
success = true;
hide();
return;
}
if (possiblePartnersNode.getFirstChild().getNodeName()
.equals("info")) {
Node info = possiblePartnersNode.getFirstChild();
text.setText("<HTML>" + info.getTextContent() + "</HTML>");
} else {
Node partners = possiblePartnersNode.getFirstChild();
Node maxAttribute = partners.getAttributes().getNamedItem(
"maxPartners");
if (maxAttribute != null) {
int maxPartners = 0;
try {
maxPartners = Integer.parseInt(maxAttribute
.getNodeValue());
} catch (NumberFormatException e) {
}
if (maxPartners > 0) {
add(mainPanel, BorderLayout.CENTER);
mainPanel.setLayout(new GridLayout(maxPartners, 1, 10, 10));
}
if (partners.getAttributes().getNamedItem("info") != null) {
text.setText("<HTML>"
+ partners.getAttributes().getNamedItem("info")
.getNodeValue() + "</HTML>");
}
NodeList partnersNodeList = partners.getChildNodes();
possiblePartners.add(new PossiblePartner(0, "-"));
for (int i = 0; i < partnersNodeList.getLength(); i++) {
Node possiblePartner = partnersNodeList.item(i);
possiblePartners.add(new PossiblePartner(Integer
.parseInt(possiblePartner.getAttributes()
.getNamedItem("id").getNodeValue()),
possiblePartner.getTextContent()));
}
if (maxPartners > 0) {
partnerComboBoxes = new JComboBox[maxPartners];
for (int i = 0; i < maxPartners; i++) {
partnerComboBoxes[i] = new JComboBox();
for (int j = 0; j < possiblePartners.size(); j++) {
partnerComboBoxes[i].addItem(possiblePartners.get(j));
}
mainPanel.add(partnerComboBoxes[i]);
}
}
}
}
setVisible(true);
}
}
private class PossiblePartner {
private int id;
private String name;
public PossiblePartner(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return getName();
}
}
}