/*
* Freeplane - mind map editor
* Copyright (C) 2008 Dimitry Polivaev
*
* This file author is Dimitry Polivaev
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.freeplane.view.swing.map.attribute;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.net.URI;
import javax.swing.Icon;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import org.freeplane.core.util.HtmlUtils;
import org.freeplane.core.util.TextUtils;
import org.freeplane.features.attribute.IAttributeTableModel;
import org.freeplane.features.text.HighlightedTransformedObject;
import org.freeplane.features.text.TextController;
class AttributeTableCellRenderer extends DefaultTableCellRenderer {
/**
*
*/
private static final long serialVersionUID = 1L;
static final float ZOOM_CORRECTION_FACTOR = 0.97F;
private boolean isPainting;
private float zoom;
private Color borderColor;
/*
* (non-Javadoc)
* @see javax.swing.JComponent#getHeight()
*/
@Override
public int getHeight() {
if (isPainting) {
if (zoom != 1F) {
return (int) (super.getHeight() / zoom);
}
}
return super.getHeight();
}
@Override
public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected,
final boolean hasFocus, final int row, final int column) {
final Component rendererComponent = super.getTableCellRendererComponent(table, value, hasFocus, isSelected, row,
column);
if (hasFocus) {
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
}
zoom = ((AttributeTable) table).getZoom();
final IAttributeTableModel attributeTableModel = (IAttributeTableModel) table.getModel();
final String originalText = value == null ? null : value.toString();
String text = originalText;
borderColor = null;
Icon icon;
if (column == 1 && value != null) {
try {
// evaluate values only
final TextController textController = TextController.getController();
Object transformedObject = textController.getTransformedObject(value, attributeTableModel.getNode(), null);
text = transformedObject.toString();
if (transformedObject instanceof HighlightedTransformedObject && TextController.isMarkTransformedTextSet()) {
borderColor = Color.GREEN;
}
}
catch (Exception e) {
text = TextUtils.format("MainView.errorUpdateText", originalText, e.getLocalizedMessage());
borderColor = Color.RED;
}
if(value instanceof URI){
icon = ((AttributeTable)table).getLinkIcon((URI) value);
}
else{
icon = null;
}
}
else{
icon = null;
}
if(icon != getIcon()){
setIcon(icon);
}
setText(text);
if(text != originalText){
final String toolTip = HtmlUtils.isHtmlNode(originalText) ? text : HtmlUtils.plainToHTML(originalText);
setToolTipText(toolTip);
}
else{
final int prefWidth = getPreferredSize().width;
final int width = table.getColumnModel().getColumn(column).getWidth();
if (prefWidth > width) {
final String toolTip = HtmlUtils.isHtmlNode(text) ? text : HtmlUtils.plainToHTML(text);
setToolTipText(toolTip);
}
else {
setToolTipText(null);
}
}
return rendererComponent;
}
/*
* (non-Javadoc)
* @see javax.swing.JComponent#getWidth()
*/
@Override
public int getWidth() {
if (isPainting) {
if (zoom != 1F) {
return (int) (0.99f + super.getWidth() / zoom);
}
}
return super.getWidth();
}
@Override
public void paint(final Graphics g) {
final Graphics2D g2 = (Graphics2D) g;
if (zoom != 1F) {
zoom *= AttributeTableCellRenderer.ZOOM_CORRECTION_FACTOR;
final AffineTransform transform = g2.getTransform();
g2.scale(zoom, zoom);
isPainting = true;
super.paint(g);
isPainting = false;
g2.setTransform(transform);
}
else {
super.paint(g);
}
if(borderColor != null){
final Color color = g.getColor();
g.setColor(borderColor);
g.drawRect(0, 0, getWidth()-1, getHeight()-1);
g.setColor(color);
}
}
}