001 /*
002 * SimuCS - Simulator to use with Classifier Systems
003 * MSc project - Oxford University
004 * by Benoit Isaac - Summer 2005
005 */
006
007 package simuLCS.graphics;
008 import java.awt.BorderLayout;
009 import java.awt.Dimension;
010 import java.awt.Graphics;
011 import java.awt.Insets;
012 import java.awt.Toolkit;
013 import java.awt.event.ActionEvent;
014 import java.awt.event.ActionListener;
015
016 import javax.swing.DefaultListModel;
017 import javax.swing.ImageIcon;
018 import javax.swing.JButton;
019 import javax.swing.JInternalFrame;
020 import javax.swing.JList;
021 import javax.swing.JPanel;
022 import javax.swing.JScrollPane;
023 import javax.swing.JTextArea;
024 import javax.swing.JTextField;
025 import javax.swing.ListSelectionModel;
026 import javax.swing.event.ListDataEvent;
027 import javax.swing.event.ListDataListener;
028 import javax.swing.event.ListSelectionEvent;
029 import javax.swing.event.ListSelectionListener;
030
031 import simuLCS.AgentClassifierLearning;
032 import simuLCS.Classifier;
033 import simuLCS.Utils;
034
035 /**
036 * Component handling the list of classifiers in the "Behaviour" Tab, with
037 * the buttons to add/del classifiers and to update them
038 * @author Benoit
039 *
040 */
041
042 public class G_ListPanel extends G_Panel implements ListSelectionListener {
043
044 private JList list;
045 private DefaultListModel listModel;
046
047 private static final String addString = "Add";
048 private static final String deleteString = "Del";
049
050 private static final int maxVisibleRows = 5 ;
051
052 private JButton addButton;
053 private JButton deleteButton;
054
055
056 private JScrollPane scrollpanClassifier ;
057 private G_PanClassifier panClassifier ;
058 private G_ListClassifiers listClassifiers ;
059
060 private Classifier previousSelectedClassifier = null ;
061
062 // private PopupFactory popupFactory ;
063 private JInternalFrame popupClassifier ;
064
065 private JTextField nameField;
066 private JTextArea log;
067 static private String newline = "\n";
068
069 public G_ListPanel() {
070 super();
071 setLayout(new BorderLayout());
072
073
074
075 panClassifier = new G_PanClassifier("Properties of this classifier");
076 scrollpanClassifier = new JScrollPane(panClassifier);
077 scrollpanClassifier.setMinimumSize(new Dimension(200,400));
078
079
080 listClassifiers = new G_ListClassifiers(
081 selectedEntities,
082 maxVisibleRows,
083 AgentClassifierLearning.REAL_BEHAVIOUR,
084 true,
085 panClassifier,
086 false);
087
088 list = listClassifiers.getList();
089 listModel = listClassifiers.getListModel();
090
091
092 ImageIcon icon = Utils.createImageIcon("Add");
093 if (icon != null) {
094 addButton = new JButton(icon);
095 addButton.setMargin(new Insets(0,0,0,0));
096 } else {
097 addButton = new JButton("Add");
098 }
099 addButton.setToolTipText("Add a new classifier.");
100 addButton.addActionListener(new AddButtonListener());
101
102 icon = Utils.createImageIcon("Del");
103 if (icon != null) {
104 deleteButton = new JButton(icon);
105 deleteButton.setMargin(new Insets(0,0,0,0));
106 } else {
107 deleteButton = new JButton("Del");
108 }
109 deleteButton.setToolTipText("Delete this classifier.");
110 deleteButton.addActionListener(new DeleteButtonListener());
111
112
113
114 //Create the text field for entering new names.
115 nameField = new JTextField(15);
116 nameField.addActionListener(new AddButtonListener());
117 if(list.getSelectedIndex() != -1)
118 {
119 String name = listModel.getElementAt(list.getSelectedIndex())
120 .toString();
121 nameField.setText(name);
122 }
123
124
125 //Create a control panel, using the default FlowLayout.
126 JPanel buttonPane = new JPanel();
127 buttonPane.add(nameField);
128 // buttonPane.add(changeButton);
129 buttonPane.add(addButton);
130 buttonPane.add(deleteButton);
131 // buttonPane.add(upDownPanel);
132
133 //
134 //Put everything together.
135 add(buttonPane, BorderLayout.PAGE_START);
136 // add(listScrollPane, BorderLayout.CENTER);
137 add(listClassifiers, BorderLayout.CENTER);
138 add(scrollpanClassifier, BorderLayout.SOUTH);
139 }
140
141 class MyListDataListener implements ListDataListener {
142 public void contentsChanged(ListDataEvent e) {
143 }
144 public void intervalAdded(ListDataEvent e) {
145 }
146 public void intervalRemoved(ListDataEvent e) {
147 }
148 }
149
150
151 class DeleteButtonListener implements ActionListener {
152 public void actionPerformed(ActionEvent e) {
153 if(getSetSelectedEntities().isEmpty())
154 {
155 getPointerMainWindow().getStatusBar().printMessage(
156 "Select an entity.");
157 return;
158 }
159
160 Classifier cnew = (Classifier) listModel.getElementAt(
161 list.getSelectedIndex());
162 Classifier.removeSharedClassifier(cnew,
163 getAgentArraySelectedEntities());
164 repaintCustom();
165
166 ListSelectionModel lsm = list.getSelectionModel();
167 int firstSelected = lsm.getMinSelectionIndex();
168 int lastSelected = lsm.getMaxSelectionIndex();
169 listModel.removeRange(firstSelected, lastSelected);
170
171
172
173 int size = listModel.size();
174
175 if (size == 0) {
176 //List is empty: disable delete, up, and down buttons.
177 deleteButton.setEnabled(false);
178
179 } else {
180 //Adjust the selection.
181 if (firstSelected == listModel.getSize()) {
182 //Removed item in last position.
183 firstSelected--;
184 }
185 list.setSelectedIndex(firstSelected);
186 }
187 }
188 }
189
190 /** A listener shared by the text field and add button. */
191 class AddButtonListener implements ActionListener {
192 public void actionPerformed(ActionEvent e) {
193
194 if(getSetSelectedEntities().isEmpty())
195 {
196 getPointerMainWindow().getStatusBar().printMessage(
197 "Select an entity.");
198 return;
199 }
200 if (nameField.getText().equals("")) {
201 //User didn't type in a name...
202 Toolkit.getDefaultToolkit().beep();
203 return;
204 }
205
206 int index = list.getSelectedIndex();
207 int size = listModel.getSize();
208
209
210 Classifier cnew = Classifier.fromString(nameField.getText(),
211 getTemplateFromSelected());
212 Classifier.createSharedClassifier(cnew,
213 getAgentArraySelectedEntities());
214 repaintCustom(); // to update the list of shared classsifiers
215 // list.setSelectedIndex(size);
216 list.setSelectedValue(cnew,true);
217
218
219 }
220 }
221
222
223
224 //Listener method for list selection changes.
225 public void valueChanged(ListSelectionEvent e) {
226 if (e.getValueIsAdjusting() == false) {
227
228 if (list.getSelectedIndex() == -1) {
229 //No selection: disable change, delete, up, and down buttons.
230 deleteButton.setEnabled(false);
231 nameField.setText("");
232
233 } else if (list.getSelectedIndices().length > 1) {
234 //Multiple selection: disable up and down buttons.
235 deleteButton.setEnabled(true);
236
237 } else {
238 // update the selected classifier
239 G_Panel.setCurrentClassifier((Classifier) list.getSelectedValue());
240 panClassifier.updateValues();
241 //Single selection: permit all operations.
242 deleteButton.setEnabled(true);
243 // update the text field
244 nameField.setText(list.getSelectedValue().toString());
245
246 }
247 }
248 }
249
250
251
252 public void paintComponent(Graphics g)
253 {
254 listClassifiers.updateValues();
255 panClassifier.updateValues();
256 }
257
258 }