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    }