/*
* Copyright (c) 2011, 2012, 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.
*
* 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.max.ins.memory;
import java.awt.*;
import javax.swing.*;
import com.sun.max.ins.*;
import com.sun.max.ins.gui.*;
import com.sun.max.ins.value.*;
import com.sun.max.tele.*;
import com.sun.max.tele.data.*;
import com.sun.max.tele.reference.*;
import com.sun.max.vm.value.*;
/**
* A table cell renderer for tables with rows representing memory words: displays in the cell
* the name of the VM's allocated memory region into which the first word of the area represented
* by the table row points.
*/
public final class MemoryRegionPointerTableCellRenderer extends InspectorTableCellRenderer {
private final InspectorTable inspectorTable;
private final InspectorMemoryTableModel tableModel;
// This kind of label has no interaction state, so we only need one, which we set up on demand.
private final MemoryRegionValueLabel label;
private final InspectorLabel[] labels = new InspectorLabel[1];
/**
* A renderer that displays the VM's memory region name, if any, into which the word value in the memory represented
* by the table row points.
* <p>
* <strong>Note:</strong> Will only investigate if the table row is word-aligned and word-width.
*
* @param inspection
* @param inspectorTable the table holding the cell to be rendered
* @param tableModel a table model in which rows represent memory regions
*/
public MemoryRegionPointerTableCellRenderer(Inspection inspection, InspectorTable inspectorTable, InspectorMemoryTableModel tableModel) {
super(inspection);
this.inspectorTable = inspectorTable;
this.tableModel = tableModel;
this.label = new MemoryRegionValueLabel(inspection);
this.labels[0] = this.label;
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, final int row, int column) {
Value memoryValue = null;
MaxMemoryRegion rowRegion = tableModel.getMemoryRegion(row);
if (rowRegion.start().isWordAligned() && rowRegion.nBytes() == vm().platform().nBytesInWord()) {
try {
memoryValue = vm().memoryIO().readWordValue(rowRegion.start());
} catch (InvalidReferenceException invalidReferenceException) {
return gui().getUnavailableDataTableCellRenderer();
} catch (DataIOError dataIOError) {
return gui().getUnavailableDataTableCellRenderer();
}
}
label.setValue(memoryValue);
label.setToolTipPrefix(tableModel.getRowDescription(row) + "<br>");
if (inspectorTable.isBoundaryRow(row)) {
label.setBorder(preference().style().defaultPaneTopBorder());
} else {
label.setBorder(null);
}
label.setBackground(inspectorTable.cellBackgroundColor());
label.setForeground(inspectorTable.cellForegroundColor(row, column));
return label;
}
@Override
protected InspectorLabel[] getLabels() {
return labels;
}
}