/***
* Copyright (c) 2008, Endless Loop Software, Inc.
*
* This file is part of EgoNet.
*
* EgoNet is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* EgoNet is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.egonet.graph;
import org.jdesktop.layout.GroupLayout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.swing.*;
import javax.swing.table.TableColumnModel;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.util.*;
import org.egonet.gui.interview.EgoClient;
import org.egonet.gui.table.*;
import org.egonet.model.QuestionList;
import org.egonet.model.Study;
import org.egonet.model.question.AlterPairQuestion;
import org.egonet.model.question.Question;
import org.egonet.model.question.Selection;
public class EdgeSizePanel extends JPanel {
final private static Logger logger = LoggerFactory.getLogger(EdgeSizePanel.class);
private JLabel questionLabel;
private JComboBox<Question> questionCombo;
private JComboBox<String> sizeCombo;
private JTable table;
private GroupLayout layout;
private GraphRenderer graphRenderer;
private JButton applyButton;
String[] sizes = { "1", "2", "3", "4", "5" };
List<Selection> selectionList = new ArrayList<Selection>();
public static boolean[][] edgesSelected;
List<Question> qList = new ArrayList<Question>();
private EgoClient egoClient;
public EdgeSizePanel(EgoClient egoClient, GraphRenderer renderer) {
this.egoClient=egoClient;
this.graphRenderer = renderer;
layout = new GroupLayout(this);
this.setLayout(layout);
layout.setAutocreateGaps(true);
layout.setAutocreateContainerGaps(true);
createComponents();
}
private void createComponents() {
questionLabel = new JLabel("Choose question to shape");
questionLabel.setVisible(true);
// create questionCombo
//List<Question> qList = new ArrayList<Question>();
Study study = egoClient.getInterview().getStudy();
QuestionList questionList = study.getQuestions();
for (Long key : questionList.keySet()) {
Question currentQuestion = questionList.get(key);
if (currentQuestion instanceof AlterPairQuestion) {
// populate the list box with only questions that have choices
// as answers
if (currentQuestion.getSelections().size() >= 1)
qList.add(currentQuestion);
}
}
questionCombo = new JComboBox<Question>(qList.toArray(new Question[0]));
questionCombo.setVisible(true);
questionCombo.setEnabled(true);
questionCombo.setPreferredSize(new Dimension(20, 20));
questionCombo.setMaximumSize(new Dimension(20, 30));
questionCombo.setAutoscrolls(true);
questionCombo.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
createTable();
drawPanel();
}
}
});
// create size combo for table cell
sizeCombo = new JComboBox<String>(sizes);
sizeCombo.setPreferredSize(new Dimension(20, 20));
sizeCombo.setMaximumSize(new Dimension(20, 30));
sizeCombo.setSelectedIndex(0);
// create apply button
applyButton = new JButton("Apply Size");
applyButton.setVisible(true);
applyButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
updateEdgeSize();
}
});
Question question = (Question) questionCombo.getSelectedItem();
edgesSelected = new boolean[qList.size()][question.getSelections().size()];
for(int i = 0; i<qList.size(); i++) {
for (int j =0; j<question.getSelections().size();j++) {
edgesSelected[i][j] = false;
}
}
createTable();
drawPanel();
}
private void createTable() {
Question question = (Question) questionCombo.getSelectedItem();
int noOfRows = question.getSelections().size();
Object[][] rowData = new Object[noOfRows][3];
/* change the list of selections based on the selected question */
if (!selectionList.isEmpty()) {
selectionList.removeAll(selectionList);
}
for (Selection selection : question.getSelections()) {
selectionList.add(selection);
}
// populate the responses
for (int i = 0; i < noOfRows; i++) {
rowData[i][0] = Boolean.FALSE;
rowData[i][1] = selectionList.get(i);
}
// populate the shapes
int noOfSizes = question.getSelections().size();
for (int i = 1; i <= noOfSizes; i++) {
if (i < sizes.length) {
String num = (new Integer(i)).toString();
rowData[i - 1][2] = num;
} else {
String num = (new Integer(i - sizes.length)).toString();
rowData[i - 1][2] = num;
}
}
table = new JTable(new ChoosablePropertyTableModel(rowData));
table.setPreferredScrollableViewportSize(table.getPreferredSize());
table.setRowHeight(25);
table.setVisible(true);
table.setBorder(BorderFactory.createCompoundBorder(BorderFactory
.createLineBorder(Color.black), getBorder()));
TableColumnModel columnModel = table.getColumnModel();
LabelRenderer selectionRenderer = new LabelRenderer();
columnModel.getColumn(1).setCellRenderer(selectionRenderer);
DefaultCellEditor sizeEditor = new DefaultCellEditor(sizeCombo);
columnModel.getColumn(2).setCellEditor(sizeEditor);
columnModel.getColumn(2).setCellRenderer(new TableComboBoxRenderer<String>(sizes));
columnModel.getColumn(0).setMaxWidth(50);
columnModel.getColumn(1).setMaxWidth(200);
columnModel.getColumn(2).setMaxWidth(80);
}
private void updateEdgeSize() {
Question question = (Question) questionCombo.getSelectedItem();
int selectedQuestionIndex = qList.indexOf(question);
logger.info("SizePanel:SelectedQuestionIndex:" + selectedQuestionIndex + " " + question.toString());
for (int i = 0; i < question.getSelections().size(); i++) {
Selection selection = question.getSelections().get(i);
GraphQuestionSelectionPair graphQuestion = new GraphQuestionSelectionPair(question,selection);
if (((Boolean) table.getValueAt(i, 0)) == true) {
EdgeProperty edgeProperty = new EdgeProperty();
edgeProperty.setProperty(EdgeProperty.EdgePropertyType.Size);
String sizeStr = (String) table.getValueAt(i, 2);
int size = sizeStr != null ? Integer.parseInt(sizeStr) : -1;
edgeProperty.setSize(size);
edgeProperty.setVisible(true);
edgesSelected[selectedQuestionIndex][i] = true;
graphRenderer.addQAsettings(graphQuestion, edgeProperty);
graphRenderer.updateGraphSettings();
} else {
edgesSelected[selectedQuestionIndex][i] = false;
if (EdgeColorPanel.edgesSelected[selectedQuestionIndex][i] == false
&& EdgeShapePanel.edgesSelected[selectedQuestionIndex][i] == false) {
EdgeProperty edgeProperty = new EdgeProperty();
edgeProperty.setProperty(EdgeProperty.EdgePropertyType.Size);
// String sizeStr = (String) table.getValueAt(i, 2);
// int size = sizeStr != null ? Integer.parseInt(sizeStr) : -1;
// edgeProperty.setSize(size);
edgeProperty.setVisible(false);
graphRenderer.addQAsettings(graphQuestion, edgeProperty);
graphRenderer.updateGraphSettings();
}
}
}
}
private void drawPanel() {
this.removeAll();
GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
hGroup.add(layout.createParallelGroup().add(questionLabel).add(
questionCombo).add(table.getTableHeader()).add(table).add(
applyButton));
layout.setHorizontalGroup(hGroup);
GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
vGroup.add(layout.createParallelGroup(GroupLayout.BASELINE).add(
questionLabel));
vGroup.add(layout.createParallelGroup(GroupLayout.BASELINE).add(
questionCombo));
vGroup.add(layout.createParallelGroup(GroupLayout.BASELINE).add(
table.getTableHeader()));
vGroup.add(layout.createParallelGroup(GroupLayout.BASELINE).add(table));
vGroup.add(layout.createParallelGroup(GroupLayout.BASELINE).add(
applyButton));
layout.setVerticalGroup(vGroup);
}
}