001 package nl.cwi.sen1.visplugin.table;
002
003 import java.awt.BorderLayout;
004 import java.awt.event.ActionEvent;
005
006 import javax.swing.AbstractAction;
007 import javax.swing.JMenu;
008 import javax.swing.JMenuItem;
009 import javax.swing.JPanel;
010 import javax.swing.JScrollPane;
011 import javax.swing.JTable;
012 import javax.swing.JTextArea;
013 import javax.swing.table.JTableHeader;
014 import javax.swing.table.TableColumn;
015 import javax.swing.table.TableColumnModel;
016
017 import nl.cwi.sen1.relationstores.types.Location;
018 import nl.cwi.sen1.relationstores.types.RTuple;
019 import nl.cwi.sen1.visplugin.VisualizationPluginController;
020 import nl.cwi.sen1.visplugin.VisualizationPluginWindow;
021 import nl.cwi.sen1.visplugin.table.model.HeaderListener;
022 import nl.cwi.sen1.visplugin.table.model.LocationButtonRenderer;
023 import nl.cwi.sen1.visplugin.table.model.SortButtonRenderer;
024 import nl.cwi.sen1.visplugin.table.model.SortableTableModel;
025 import nl.cwi.sen1.visplugin.table.model.SortableTableModelExporter;
026 import nl.cwi.sen1.visplugin.table.model.TableLocationButtonListener;
027 import aterm.ATerm;
028
029 /**
030 * The TableVisualizationWindows class. It Extends VisualizationPluginWindow.
031 *
032 * @author Srinivasan Tharmarajah
033 * @author Wasim Alsaqaf
034 * @date 08-03-2007
035 */
036 public class TableVisualizationWindow extends VisualizationPluginWindow {
037
038 private SortableTableModel m_model = new SortableTableModel();
039
040 private JTable m_table;
041
042 private static final long serialVersionUID = 1;
043
044 /**
045 * Returns JPanel including JTable with Data.
046 *
047 * @author Srinivasan Tharmarajah
048 * @author Wasim Alsaqaf
049 * @author Anton Gerdessen
050 * @author Anton Lycklama a Nijeholt
051 * @author Bas Basten
052 * @author Arend van Beelen (refactoring)
053 * @date 13-3-2007
054 */
055 public JPanel render(RTuple fact) {
056 JPanel controlArea = new JPanel(new BorderLayout());
057
058 try {
059 m_model.setRTupleData(fact);
060
061 if (m_model.getRowCount() == 0) {
062 controlArea.add(new JTextArea("This fact is empty."));
063 return controlArea;
064 }
065
066 m_table = new JTable(m_model);
067
068 // create the buttons to enable header sorting
069 SortButtonRenderer sortRenderer = new SortButtonRenderer();
070 TableColumnModel columnModel = m_table.getColumnModel();
071 for (int columnNum = 0; columnNum < m_model.getColumnCount(); columnNum++) {
072 columnModel.getColumn(columnNum).setHeaderRenderer(sortRenderer);
073 }
074
075 // add the listener to the header to catch the mouse clicks
076 JTableHeader header = m_table.getTableHeader();
077 header.addMouseListener(new HeaderListener(header, sortRenderer));
078
079 // create the buttons for location columns
080 for (int columnNum = 0; columnNum < m_model.getColumnCount(); columnNum++) {
081 TableColumn modelColumn = columnModel.getColumn(columnNum);
082 modelColumn.setIdentifier(new Integer(columnNum));
083
084 if (m_model.getValueAt(0, columnNum) instanceof Location) {
085 LocationButtonRenderer locRenderer = new LocationButtonRenderer();
086 TableColumn tableColumn = m_table.getColumn(new Integer(columnNum));
087 tableColumn.setCellRenderer(locRenderer);
088 }
089 }
090
091 // ugly code but because there is no time we have to send the window
092 // to the listener so that the openLocationEditor function can be called
093 TableLocationButtonListener listener = new TableLocationButtonListener(this, m_table);
094 m_table.addMouseListener(listener);
095 m_table.addMouseMotionListener(listener);
096
097 // finally add the table to a pane and add it to the JPanel
098 JScrollPane pane = new JScrollPane(m_table);
099 controlArea.add(pane, BorderLayout.CENTER);
100
101 } catch (Exception ex) {
102 System.err.println(ex);
103 ex.printStackTrace();
104 }
105
106 return controlArea;
107 }
108
109 /**
110 * Create a menu
111 *
112 * @author Arjen van Schie & Michel Rijnders
113 * @date 20-2-2007
114 * @return The JMenu
115 */
116 protected JMenu createExtensionMenu() {
117 // create the menu item
118 JMenu extensionMenu = super.createExtensionMenu();
119
120 // create the sub-item Export
121 JMenuItem export = new JMenuItem("Export to RStore");
122 export.addActionListener(new AbstractAction() {
123 public void actionPerformed(ActionEvent e) {
124 getController().exportToClicked(
125 VisualizationPluginController.requestType.rStore,
126 getWindowId());
127 }
128
129 private final static long serialVersionUID = 1;
130 });
131 extensionMenu.add(export);
132
133 return extensionMenu;
134 }
135
136 /**
137 * Exports the selected rows from the table to an RStore file.
138 *
139 * @param filename Filename of the file to export the RStore to.
140 *
141 * @author Arend van Beelen
142 * @date 13-3-2007
143 */
144 public void exportToRStore(String filename) {
145 SortableTableModelExporter exporter = new SortableTableModelExporter(m_model);
146
147 exporter.exportToRStore(filename, m_table.getSelectedRows());
148
149 if( getStudio() != null ) {
150 ATerm term = getStudio().getATermFactory().make("vp-rstore-exported(<str>)", filename);
151 getController().getBridge().sendEvent(term);
152 }
153 }
154 }