TrustGrapher  r52
A playabale simulator for modelling trust between agents
D:/src/cu/trustGrapher/eventplayer/LogPanel.java
Go to the documentation of this file.
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 }