/** * Copyright 2011 Intuit Inc. All Rights Reserved */ package com.intuit.tank.proxy.table; /* * #%L * proxy-extension * %% * Copyright (C) 2011 - 2015 Intuit Inc. * %% * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * #L% */ import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.font.TextAttribute; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; import java.util.Enumeration; import java.util.Map; import java.util.Vector; import javax.swing.JComponent; import javax.swing.JTable; import javax.swing.JToolTip; import javax.swing.SwingUtilities; import javax.swing.plaf.metal.MetalToolTipUI; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableModel; /** * TransactionTable * * @author dangleton * */ public class TransactionTable extends JTable { /** * */ private static final Color LIGHT_BLUE = new Color(219, 234, 255, 255); private static final long serialVersionUID = 1L; /** * @param arg0 */ public TransactionTable(TableModel model) { super(model); setShowGrid(true); setGridColor(Color.LIGHT_GRAY); setRowSelectionAllowed(true); // setIntercellSpacing(new Dimension(10, 5)); getColumnModel().setColumnMargin(1); getColumnModel().getColumn(0).setMaxWidth(100); getColumnModel().getColumn(0).setMinWidth(50); getColumnModel().getColumn(0).setPreferredWidth(50); getColumnModel().getColumn(0).setWidth(50); getColumnModel().removeColumn(getColumnModel().getColumn(7)); getColumnModel().removeColumn(getColumnModel().getColumn(6)); for (int i = 1; i < getColumnModel().getColumnCount(); i++) { getColumnModel().getColumn(i).setMinWidth(100); } addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { Point p = e.getPoint(); int row = rowAtPoint(p); int column = columnAtPoint(p); setToolTipText(breakTip(String.valueOf(getValueAt(row, column)))); }// end MouseMoved private String breakTip(String tip) { if (tip.length() > 50) { StringBuilder sb = new StringBuilder(); int index = 1; for (char c : tip.toCharArray()) { sb.append(c); if (++index % 125 == 0) { sb.append('\n'); } } tip = sb.toString(); } return tip; } }); // end MouseMotionAdapter } @SuppressWarnings({ "rawtypes", "unchecked" }) public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int vColIndex) { Component c = super.prepareRenderer(renderer, rowIndex, vColIndex); if (rowIndex % 2 == 0 && !isCellSelected(rowIndex, vColIndex)) { c.setBackground(TransactionTable.LIGHT_BLUE); } else if (!isCellSelected(rowIndex, vColIndex)) { // If not shaded, match the table's background c.setBackground(getBackground()); } int realIndex = this.convertRowIndexToModel(rowIndex); Map map = c.getFont().getAttributes(); if (((TransactionTableModel) getModel()).isRowFiltered(realIndex)) { map.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON); map.put(TextAttribute.FOREGROUND, Color.LIGHT_GRAY); } else if (((TransactionTableModel) getModel()).getStatus(realIndex) >= 400) { map.put(TextAttribute.FOREGROUND, Color.RED); } else if (((TransactionTableModel) getModel()).getStatus(realIndex) >= 300) { map.put(TextAttribute.FOREGROUND, Color.BLUE); } else if (((TransactionTableModel) getModel()).isRedirected(realIndex)) { map.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON); } c.setFont(new Font(map)); return c; } public JToolTip createToolTip() { MultiLineToolTip tip = new MultiLineToolTip(); tip.setComponent(this); return tip; } class MultiLineToolTip extends JToolTip { public MultiLineToolTip() { setUI(new MultiLineToolTipUI()); } } class MultiLineToolTipUI extends MetalToolTipUI { private String[] strs; private int maxWidth = 500; public void paint(Graphics g, JComponent c) { FontMetrics metrics = Toolkit.getDefaultToolkit().getFontMetrics(g.getFont()); Dimension size = c.getSize(); g.setColor(c.getBackground()); g.fillRect(0, 0, size.width, size.height); g.setColor(c.getForeground()); if (strs != null) { for (int i = 0; i < strs.length; i++) { g.drawString(strs[i], 3, (metrics.getHeight()) * (i + 1)); } } } @SuppressWarnings({ "rawtypes", "unchecked" }) public Dimension getPreferredSize(JComponent c) { FontMetrics metrics = Toolkit.getDefaultToolkit().getFontMetrics(c.getFont()); String tipText = ((JToolTip) c).getTipText(); if (tipText == null) { tipText = ""; } BufferedReader br = new BufferedReader(new StringReader(tipText)); String line; int maxWidth = 0; Vector v = new Vector(); try { while ((line = br.readLine()) != null) { int width = SwingUtilities.computeStringWidth(metrics, line); maxWidth = (maxWidth < width) ? width : maxWidth; v.addElement(line); } } catch (IOException ex) { ex.printStackTrace(); } int lines = v.size(); if (lines < 1) { strs = null; lines = 1; } else { strs = new String[lines]; int i = 0; for (Enumeration e = v.elements(); e.hasMoreElements(); i++) { strs[i] = (String) e.nextElement(); } } int height = metrics.getHeight() * lines; this.maxWidth = maxWidth; return new Dimension(maxWidth + 6, height + 4); } } }