/* * Copyright 2003,2004,2005 Colin Crist * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package hermes.fix; import hermes.browser.IconCache; import hermes.browser.components.PopupMenuFactory; import hermes.browser.transferable.MessagesTransferHandler; import hermes.swing.Colours; import hermes.swing.SQL92FilterableTableModel; import hermes.swing.SwingUtils; import java.awt.Component; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collection; import javax.swing.JComponent; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.TransferHandler; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; import org.apache.log4j.Logger; import com.codestreet.selector.parser.InvalidSelectorException; import com.jidesoft.grid.SortableTable; import com.jidesoft.swing.JidePopupMenu; /** * @author colincrist@hermesjms.com * @version $Id: FIXMessageTable.java,v 1.15 2007/02/18 16:13:42 colincrist Exp * $ */ public class FIXMessageTable extends SortableTable { /** * */ private static final long serialVersionUID = -2044612567082104913L; private static final Logger log = Logger.getLogger(FIXMessageTable.class); private SQL92FilterableTableModel selectorModel; private FIXMessageTableModel model; private JidePopupMenu popup; private SessionKey sessionKey; private boolean autoScroll = false; public boolean isAutoScroll() { return autoScroll; } public void setAutoScroll(boolean autoScroll) { this.autoScroll = autoScroll; } public FIXMessageTable(final SessionKey sessionKey, final FIXMessageTableModel model) { super(); this.model = model; this.selectorModel = new SQL92FilterableTableModel(model, new FIXIdentifierExtension()); this.selectorModel.setRowValueProvider(model); this.sessionKey = sessionKey; setSortable(true); setModel(selectorModel); setDragEnabled(true); setTransferHandler(new MessagesTransferHandler(this)); getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); getColumn(FIXMessageTableModel.DIRECTION).setMaxWidth(IconCache.getIcon("hermes.back").getIconWidth() + 4); getColumnModel().getColumn(0).setCellRenderer(new DefaultTableCellRenderer() { /** * */ private static final long serialVersionUID = -2075897579194001018L; @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { FIXMessage message = model.getMessageAt(selectorModel.getActualRowAt(row)); if (model.getRole(message) == SessionRole.ACCEPTOR) { setIcon(IconCache.getIcon("hermes.back")); } else { setIcon(IconCache.getIcon("hermes.forward")); } return this; } }); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e)) { // final JComponent c = (JComponent) e.getSource(); // final TransferHandler th = c.getTransferHandler(); getTransferHandler().exportAsDrag(FIXMessageTable.this, e, TransferHandler.COPY); } else if (SwingUtilities.isRightMouseButton(e)) { doPopup(e); } } }); model.addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent e) { if (isAutoScroll()) { // if (e.getType() == TableModelEvent.INSERT) { // getSelectionModel().setSelectionInterval(model.getRowCount() // - 1, model.getRowCount() - 1); // scrollRectToVisible(getCellRect(model.getRowCount() - 1, // 0, true)); // } } } }); } public SessionKey getSessionKey() { return sessionKey; } private void doPopup(MouseEvent e) { if (popup == null) { popup = PopupMenuFactory.createFIXMessageTablePopup(this); } popup.show(this, e.getX(), e.getY()); } public Collection<Object> getSelectedMessages() { Collection<Object> rval = new ArrayList<Object>(); int[] selected = getSelectedRows(); for (int i = 0; i < selected.length; i++) { rval.add(getMessageAt(selected[i])); } return rval; } public FIXMessage getMessageAt(int row) { return model.getMessageAt(selectorModel.getActualRowAt(getActualRowAt(row))); } public void addMessages(Collection<FIXMessage> messages) { if (messages.size() > 0) { model.addMessages(messages); SwingUtils.scrollVertically((JComponent) this.getParent(), SwingUtils.getRowBounds(this, model.getRowCount(), model.getRowCount())); } } public void setSelector(String selector) throws InvalidSelectorException { selectorModel.setSelector(selector); } public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component c = super.prepareRenderer(renderer, row, column); if (row < getRowCount()) { FIXMessage message = getMessageAt(row); if (message != null) { if (!isCellSelected(row, column)) { if (model.getRole(message) == SessionRole.ACCEPTOR) { c.setBackground(Colours.LIGHT_SEA_GREEN); } else { c.setBackground(Colours.LIGHT_SKY_BLUE); } } } } return c; } // @Override // public void scrollRectToVisible(Rectangle aRect) { // Container parent; // int dx = getX(), dy = getY(); // // for (parent = getParent(); !(parent == null) && (!(parent instanceof // JViewport) || (((JViewport) // parent).getClientProperty("HierarchicalTable.mainViewport") == null)); // parent = parent // .getParent()) { // Rectangle bounds = parent.getBounds(); // // dx += bounds.x; // dy += bounds.y; // } // // if (!(parent == null) && !(parent instanceof CellRendererPane)) { // aRect.x += dx; // aRect.y += dy; // // ((JComponent) parent).scrollRectToVisible(aRect); // aRect.x -= dx; // aRect.y -= dy; // } // } }