/* * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.tools.visualvm.modules.tracer.impl.details; import com.sun.tools.visualvm.modules.tracer.impl.swing.HeaderLabel; import com.sun.tools.visualvm.uisupport.UISupport; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseEvent; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; /** * * @author Jiri Sedlacek */ final class DetailsTable extends JTable { private static final int DEFAULT_ROW_HEIGHT = defaultRowHeight(); static final Color DEFAULT_GRID_COLOR = new Color(240, 240, 240); private TableCellRenderer markRenderer; private TimestampRenderer timestampRenderer; DetailsTable() { setOpaque(true); setBackground(UISupport.getDefaultBackground()); setRowHeight(DEFAULT_ROW_HEIGHT); setRowMargin(0); setAutoCreateRowSorter(true); setShowHorizontalLines(false); setShowVerticalLines(true); setGridColor(DEFAULT_GRID_COLOR); getTableHeader().setPreferredSize(new Dimension(1, HeaderLabel.DEFAULT_HEIGHT)); getColumnModel().setColumnMargin(1); initRenderers(); } public void addColumn(TableColumn aColumn) { super.addColumn(aColumn); if (aColumn.getModelIndex() == 0 || aColumn.getModelIndex() == 1) updateColumns(true); } public void tableChanged(TableModelEvent e) { super.tableChanged(e); if (e.getType() == TableModelEvent.INSERT) updateColumns(false); } protected JTableHeader createDefaultTableHeader() { return new JTableHeader(columnModel) { public String getToolTipText(MouseEvent e) { int index = columnModel.getColumnIndexAtX(e.getPoint().x); int realIndex = columnModel.getColumn(index).getModelIndex(); return ((DetailsTableModel)dataModel).getColumnTooltip(realIndex); } }; } private void initRenderers() { markRenderer = getDefaultRenderer(Boolean.class); TableCellRenderer dateRenderer = getDefaultRenderer(String.class); timestampRenderer = new TimestampRenderer(dateRenderer); TableCellRenderer numberRenderer = getDefaultRenderer(Long.class); setDefaultRenderer(Boolean.class, new MarkRenderer(markRenderer)); setDefaultRenderer(DetailsPanel.class, timestampRenderer); setDefaultRenderer(Long.class, new ItemValueRenderer(numberRenderer)); } private void updateColumns(boolean initialUpdate) { if (timestampRenderer == null) return; if (initialUpdate) { Component boolRenderer = markRenderer.getTableCellRendererComponent( DetailsTable.this, Boolean.FALSE, false, false, 0, 0); int width = boolRenderer.getPreferredSize().width; TableColumn column = columnModel.getColumn(0); TableCellRenderer headerRenderer = getTableHeader().getDefaultRenderer(); Component renderer = headerRenderer.getTableCellRendererComponent( DetailsTable.this, column.getHeaderValue(), false, false, 0, 0); width = Math.max(width, renderer.getPreferredSize().width); width += 16; column.setPreferredWidth(width); column.setMaxWidth(width); } if (columnModel.getColumnCount() > 1) { if (!timestampRenderer.updateFormat(dataModel) && !initialUpdate) return; Component renderer = timestampRenderer.getTableCellRendererComponent( DetailsTable.this, TimestampRenderer. REFERENCE_TIMESTAMP, false, false, 0, 1); TableColumn column = columnModel.getColumn(1); int width = renderer.getPreferredSize().width + 5; if (initialUpdate || column.getMaxWidth() < width) { column.setPreferredWidth(width); column.setMaxWidth(width); if (!initialUpdate) repaint(); } } } private static int defaultRowHeight() { return new JLabel("X").getPreferredSize().height + 4; // NOI18N } }