From: Pavel V. <va...@us...> - 2002-07-22 00:20:27
|
Update of /cvsroot/javaprofiler/module/net/sourceforge/javaprofiler/module/views In directory usw-pr-cvs1:/tmp/cvs-serv25853 Added Files: AllocHistogramTable.java AllocHistogramTableModel.java Log Message: histogram view --- NEW FILE: AllocHistogramTable.java --- /* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License Version * 1.0 (the "License"). You may not use this file except in compliance with * the License. A copy of the License is available at http://www.sun.com/ * * The Original Code is the Java Profiler module. * The Initial Developers of the Original Code are Jan Stola, Pavel Vacha, * Michal Pise, Petr Luner, Lukas Petru and Marek Przeczek. * Portions created by Jan Stola are Copyright (C) 2000-2001. All Rights Reserved. * Portions created by Pavel Vacha are Copyright (C) 2000-2001. All Rights Reserved. * Portions created by Michal Pise are Copyright (C) 2000-2001. All Rights Reserved. * Portions created by Petr Luner are Copyright (C) 2000-2001. All Rights Reserved. * Portions created by Lukas Petru are Copyright (C) 2000-2001. All Rights Reserved. * Portions created by Marek Przeczek are Copyright (C) 2000-2001. All Rights Reserved. * * Contributors: Jan Stola, Pavel Vacha, Michal Pise, Petr Luner, * Lukas Petru and Marek Przeczek. */ package net.sourceforge.javaprofiler.module.views; import java.awt.*; import javax.swing.*; import javax.swing.table.*; import javax.swing.border.*; import net.sourceforge.javaprofiler.jpi.AllocStat; /** * * @author Pavel Vacha */ public class AllocHistogramTable extends JTable { /** Creates a new instance of HistogramTable */ public AllocHistogramTable( AllocHistogramTableModel model ) { super(model); setDefaultRenderer(AllocStat.class, new HistogramBarRenderer(true) ); setDefaultRenderer(String.class, new LongStringRenderer() ); setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); JTextField textField = new JTextField(); TableColumn column = getColumnModel().getColumn(0); column.setPreferredWidth(500); column.setCellEditor( new DefaultCellEditor( textField ) ); getColumnModel().getColumn(3).setPreferredWidth(250); getColumnModel().getColumn(1).setPreferredWidth(100); getColumnModel().getColumn(2).setPreferredWidth(100); getColumnModel().getColumn(4).setPreferredWidth(100); getColumnModel().getColumn(5).setPreferredWidth(100); } protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); //string renderer with tooltips for log string private class LongStringRenderer extends JLabel implements TableCellRenderer { public LongStringRenderer() { super(); setOpaque( true ); setBorder(noFocusBorder); } public Component getTableCellRendererComponent( JTable table, Object astr, boolean isSelected, boolean hasFocus, int row, int column) { String str = (String) astr; if (isSelected) { setForeground(table.getSelectionForeground()); setBackground(table.getSelectionBackground()); } else { setForeground(table.getForeground()); setBackground(table.getBackground()); } //setFont(table.getFont()); setFont( table.getFont().deriveFont( Font.BOLD ) ); if (hasFocus) { setBorder( UIManager.getBorder("Table.focusCellHighlightBorder") ); if (table.isCellEditable(row, column)) { super.setForeground( UIManager.getColor("Table.focusCellForeground") ); super.setBackground( UIManager.getColor("Table.focusCellBackground") ); } } else { setBorder(noFocusBorder); } setText( str ); //if ( str.length() > 50 ) // setToolTipText( str ); return this; } } //renderer of histogram bars //PENDING all private class HistogramBarRenderer extends JComponent implements TableCellRenderer { Border unselectedBorder = null; Border selectedBorder = null; boolean isBordered = true; JProgressBar bar; long barMax = 1000; public HistogramBarRenderer(boolean isBordered) { super(); this.isBordered = isBordered; bar = new JProgressBar(); bar.setMinimum(0); this.setLayout( new BorderLayout() ); this.add( BorderLayout.CENTER, bar ); } public Component getTableCellRendererComponent( JTable table, Object allocObj, boolean isSelected, boolean hasFocus, int row, int column) { AllocStat alloc = (AllocStat) allocObj; bar.setMaximum( 100 ); //percent while( barMax < alloc.getLiveInstancesCount() ) { barMax = barMax * 2; //PENDING REDRAW } bar.setValue( (int) (100*alloc.getLiveInstancesCount()/barMax) ); if (isBordered) { if (isSelected) { if (selectedBorder == null) { selectedBorder = BorderFactory.createMatteBorder(2,5,2,5, table.getSelectionBackground()); } setBorder(selectedBorder); } else { if (unselectedBorder == null) { unselectedBorder = BorderFactory.createMatteBorder(2,5,2,5, table.getBackground()); } setBorder(unselectedBorder); } } return this; } } //end of Renderers //editors //private class LongStringEditor extends } --- NEW FILE: AllocHistogramTableModel.java --- /* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License Version * 1.0 (the "License"). You may not use this file except in compliance with * the License. A copy of the License is available at http://www.sun.com/ * * The Original Code is the Java Profiler module. * The Initial Developers of the Original Code are Jan Stola, Pavel Vacha, * Michal Pise, Petr Luner, Lukas Petru and Marek Przeczek. * Portions created by Jan Stola are Copyright (C) 2000-2001. All Rights Reserved. * Portions created by Pavel Vacha are Copyright (C) 2000-2001. All Rights Reserved. * Portions created by Michal Pise are Copyright (C) 2000-2001. All Rights Reserved. * Portions created by Petr Luner are Copyright (C) 2000-2001. All Rights Reserved. * Portions created by Lukas Petru are Copyright (C) 2000-2001. All Rights Reserved. * Portions created by Marek Przeczek are Copyright (C) 2000-2001. All Rights Reserved. * * Contributors: Jan Stola, Pavel Vacha, Michal Pise, Petr Luner, * Lukas Petru and Marek Przeczek. */ package net.sourceforge.javaprofiler.module.views; import java.util.*; import javax.swing.table.AbstractTableModel; import net.sourceforge.javaprofiler.jpi.*; import java.lang.reflect.*; //PENDING remove java.reflection /** * * @author Pavel Vacha */ public class AllocHistogramTableModel extends AbstractTableModel { private List allocStats; private String columnNames[] = { "name", "count", "max count", "histogram", "space", "max space" }; private Class columnClasses[] = { String.class, Long.class, Long.class, AllocStat.class, Long.class, Long.class }; private Method method_getName; /** Creates a new instance of HistogramTableModel *@param allocStats list of <code> AllocStat </code> objects that have <code> getType() </code> method * At last one instance of <code> AllocStat </code> must be in the <code> List </code>. */ public AllocHistogramTableModel(List allocStats) { this.allocStats = allocStats; ListIterator iter = allocStats.listIterator(); while ( iter.hasNext() ) { AllocStat alloc = (AllocStat) iter.next(); alloc.addAllocStatListener( new HistogramStatListener() ); } ((TypeRef) allocStats.get(0)).getVirtualMachineImage() .addChildrenListener( Constants.TYPE, new HistogramChildrenListener() ); //PENDING listeners to other types //parent.addChildListener( type, new HistogramChildrenListener ); if ( ! (allocStats.get(0) instanceof TypeRef) ) { try { Method method_getName = allocStats.get(0).getClass() .getMethod( "getType", null ); } catch (NoSuchMethodException e) { throw new RuntimeException( e.getMessage() + " requested method: getType()" ); } } } public int getColumnCount() { return columnNames.length; } public int getRowCount() { return allocStats.size(); } public Object getValueAt(int rowIndex, int colIndex) { AllocStat alloc = (AllocStat) allocStats.get( rowIndex ); //??FIXME switch ( colIndex ) { case 0: { //FIXME if ( alloc instanceof TypeRef ) { return ((TypeRef) alloc).getName(); } //FIXME add interface with getType method try { return ((TypeRef) method_getName.invoke( alloc, null )).getName(); } catch (SecurityException e) { throw new RuntimeException( e.getMessage() + " requested method: getType()" ); } catch (IllegalAccessException e) { throw new RuntimeException( e.getMessage() + " requested method: getType()" ); } catch (InvocationTargetException e) { throw new RuntimeException( e.getMessage() + " requested method: getType()" ); } } case 1: { return new Long(alloc.getLiveInstancesCount() ); } case 2: { return new Long(alloc.getTotalInstancesCount() ); } case 3: { return alloc; } case 4: { return new Long(alloc.getLiveInstancesSize() ); } case 5: { return new Long(alloc.getTotalInstancesSize() ); } default: throw new RuntimeException( "Invalid column number: " + colIndex ); } } public String getColumnName(int col) { return columnNames[col]; } public Class getColumnClass(int col) { return columnClasses[col]; } public boolean isCellEditable(int rowIndex, int columnIndex) { //if ( columnIndex == 0 ) // return true; //It's true, beceaus it assumes special editor, that don't let you change anything //else return false; } //LISTENERS class HistogramStatListener implements AllocStatListener { public void allocStatChanged( AllocStatEvent event ) { //FIXME how to get index int index = allocStats.indexOf( event.getSource() ); fireTableRowsUpdated(index, index); } } class HistogramChildrenListener implements ChildrenListener { public void childrenAdded( ChildrenEvent event ) { int delta[] = event.getDeltaIndices(); int i=0,j=0; int len = delta.length; while (i<len) { j=i+1; while (delta[i] - delta[j] == i-j) { //pack neighbours into one event j++; if (j >= len ) break; } fireTableRowsInserted( i, j-1 ); i = j; } }; public void childrenChanged( ChildrenEvent event) { int delta[] = event.getDeltaIndices(); int i=0, j=0; int len = delta.length; while (i<len) { j=i+1; while (delta[i] - delta[j] == i-j) { //pack neighbours into one event j++; if (j >= len ) break; } fireTableRowsUpdated( i, j-1 ); i = j; } }; } } |