TrustGrapher
r52
A playabale simulator for modelling trust between agents
|
00001 00002 package cu.trustGrapher.eventplayer; 00003 00004 import java.awt.Color; 00005 import java.awt.Dimension; 00006 import java.awt.GridLayout; 00007 import java.awt.event.*; 00008 import javax.swing.*; 00009 00010 import java.util.List; 00011 import javax.swing.event.ListSelectionEvent; 00012 import javax.swing.event.ListSelectionListener; 00013 import aohara.utilities.ChatterBox; 00014 00025 public final class LogPanel extends JPanel implements EventPlayerListener { 00026 00027 protected JTable logTable; //The JTable containing an array representation of the TrustLogEvents 00028 protected JPopupMenu menu; //The popupMenu that is shown when a row is right-clicked 00029 protected EventPlayer eventThread; 00030 00032 public LogPanel(EventPlayer eventThread) { 00033 this.eventThread = eventThread; 00034 initComponents(); 00035 setVisible(eventThread.getTrustGrapher().getTrustMenuBar().toggleEventPanelButton.isSelected()); 00036 } 00038 00041 public EventPlayer getEventPlayer(){ 00042 return eventThread; 00043 } 00044 00046 00049 private void initComponents() { 00050 List<TrustLogEvent> logEvents = eventThread.getEvents(); 00051 Object[][] table = new Object[logEvents.size()][3]; 00052 table[0] = new Object[]{"", "", ""}; 00053 int i = 1; 00054 for (TrustLogEvent evt : logEvents) { 00055 if (evt != null) { 00056 table[i] = evt.toArray(); 00057 i++; 00058 } 00059 } 00060 00061 Object[] titles = {"Assessor", "Assessee", "Feedback"}; 00062 logTable = new JTable(table, titles); 00063 logTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 00064 logTable.setBackground(Color.LIGHT_GRAY); 00065 logTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 00066 logTable.setColumnSelectionAllowed(false); 00067 logTable.setRowSelectionAllowed(true); 00068 ListListener listener = new ListListener(); 00069 logTable.addMouseListener(listener); 00070 logTable.getSelectionModel().addListSelectionListener(listener); 00071 logTable.setVisible(true); 00072 00073 JScrollPane listScroller = new JScrollPane(logTable); 00074 listScroller.setWheelScrollingEnabled(true); 00075 listScroller.setBorder(BorderFactory.createLoweredBevelBorder()); 00076 listScroller.setSize(logTable.getWidth(), logTable.getHeight()); 00077 00078 setLayout(new GridLayout(1, 1)); 00079 add(listScroller); 00080 setBorder(BorderFactory.createTitledBorder("Log Event Panel")); 00081 Dimension listSize = logTable.getPreferredSize(); 00082 setPreferredSize(new Dimension(listSize.width + 15, listSize.height)); 00083 setMinimumSize(getPreferredSize()); 00084 createPopupMenu(listener); 00085 } 00086 00091 private void createPopupMenu(ActionListener listener) { 00092 JMenuItem insert = new JMenuItem("Insert Event After"); 00093 insert.addActionListener(listener); 00094 JMenuItem remove = new JMenuItem("Remove Event"); 00095 remove.addActionListener(listener); 00096 JMenuItem modify = new JMenuItem("Modify Event"); 00097 modify.addActionListener(listener); 00098 00099 menu = new JPopupMenu("Edit Events"); 00100 menu.add(insert); 00101 menu.add(remove); 00102 menu.addSeparator(); 00103 menu.add(modify); 00104 } 00105 00111 @Override 00112 public void goToIndex(int eventIndex) { 00113 logTable.setRowSelectionInterval(0, eventIndex); 00114 logTable.scrollRectToVisible(logTable.getCellRect(eventThread.getCurrentEventIndex() , 0, true)); 00115 } 00116 00118 00121 private class ListListener extends MouseAdapter implements ActionListener, ListSelectionListener { 00122 00123 private boolean scrubbing; //Whether or not the mouse button is pressed on the timeline 00124 00132 @Override 00133 public void mousePressed(MouseEvent mouseEvent) { 00134 scrubbing = true; 00135 if (SwingUtilities.isRightMouseButton(mouseEvent)) { 00136 updateSelectedRow(); 00137 menu.show(((JTable) mouseEvent.getSource()).getParent().getParent().getParent(), getMousePosition().x, getMousePosition().y); 00138 } 00139 } 00140 00145 @Override 00146 public void mouseReleased(MouseEvent mouseEvent) { 00147 scrubbing = false; 00148 } 00149 00154 @Override 00155 public void actionPerformed(ActionEvent buttonEvent) { 00156 String buttonText = ((AbstractButton) buttonEvent.getSource()).getText(); 00157 if (buttonText.equals("Insert Event After")) { 00158 EventInjector.getNewEvent(eventThread); 00159 } else if (buttonText.equals("Remove Event")) { 00160 eventThread.removeEvent(); 00161 } else if (buttonText.equals("Modify Event")) { 00162 EventInjector.modifyEvent(eventThread); 00163 } else { 00164 ChatterBox.error(this, "actionPerformed()", "Uncaught button press"); 00165 } 00166 } 00167 00173 public void valueChanged(ListSelectionEvent selectionEvent) { 00174 if (scrubbing) { 00175 updateSelectedRow(); 00176 } 00177 } 00178 00183 private void updateSelectedRow(){ 00184 int newRow = 0; 00185 try{ 00186 newRow = logTable.rowAtPoint(logTable.getMousePosition()); 00187 }catch (NullPointerException ex){ //This catches the case when the mouse is released outside of the log table 00188 return; 00189 } 00190 logTable.getSelectionModel().setSelectionInterval(newRow, newRow); 00191 eventThread.goToEvent(newRow); 00192 } 00193 } 00194 }