/*
* Jexer - Java Text User Interface
*
* The MIT License (MIT)
*
* Copyright (C) 2019 David "Niki" ROULET
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* @author David ROULET [niki@nikiroo.be]
* @version 1
*/
package be.nikiroo.jexer;
import java.util.HashMap;
import java.util.Map;
import jexer.TLabel;
import jexer.TWidget;
/**
* A simple {@link TTableCellRenderer} that display the values within a
* {@link TLabel}.
*
* It supports a few different modes, see
* {@link TTableSimpleTextCellRenderer.CellRendererMode}.
*
* @author niki
*/
public class TTableCellRendererWidget extends TTableCellRenderer {
private boolean rightAlign;
private Map widgets = new HashMap();
/**
* Create a new renderer for normal text mode.
*/
public TTableCellRendererWidget() {
this(CellRendererMode.NORMAL);
}
/**
* Create a new renderer of the given mode.
*
* @param mode
* the renderer mode
*/
public TTableCellRendererWidget(CellRendererMode mode) {
this(mode, false);
}
/**
* Create a new renderer of the given mode.
*
* @param mode
* the renderer mode, cannot be NULL
*/
public TTableCellRendererWidget(CellRendererMode mode, boolean rightAlign) {
super(mode);
this.rightAlign = rightAlign;
}
@Override
public void renderTableCell(TTable table, Object value, int rowIndex,
int colIndex, int y) {
String wkey = "[Row " + y + " " + getMode() + "]";
TWidget widget = widgets.get(wkey);
TTableColumn tcol = table.getColumns().get(colIndex);
boolean isSelected = table.getSelectedRow() == rowIndex;
boolean hasFocus = table.isAbsoluteActive();
int width = tcol.getWidth();
int xOffset = getXOffset(table, colIndex);
if (widget != null
&& !updateTableCellRendererComponent(widget, value, isSelected,
hasFocus, y, xOffset, width)) {
table.removeChild(widget);
widget = null;
}
if (widget == null) {
widget = getTableCellRendererComponent(table, value, isSelected,
hasFocus, y, xOffset, width);
}
widgets.put(wkey, widget);
}
/**
* Create a new {@link TWidget} to represent the given value.
*
* @param table
* the parent {@link TTable}
* @param value
* the value to represent
* @param isSelected
* TRUE if selected
* @param hasFocus
* TRUE if focused
* @param row
* the row to draw it at
* @param column
* the column to draw it at
* @param width
* the width of the control
*
* @return the widget
*/
protected TWidget getTableCellRendererComponent(TTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column, int width) {
return new TLabel(table, asText(value, width, rightAlign), column, row,
getColorKey(isSelected, hasFocus), false);
}
/**
* Update the content of the widget if at all possible.
*
* @param component
* the component to update
* @param value
* the value to represent
* @param isSelected
* TRUE if selected
* @param hasFocus
* TRUE if focused
* @param row
* the row to draw it at
* @param column
* the column to draw it at
* @param width
* the width of the control
*
* @return TRUE if the operation was possible, FALSE if it failed
*/
protected boolean updateTableCellRendererComponent(TWidget component,
Object value, boolean isSelected, boolean hasFocus, int row,
int column, int width) {
if (component instanceof TLabel) {
TLabel widget = (TLabel) component;
widget.setLabel(asText(value, width, rightAlign));
widget.setColorKey(getColorKey(isSelected, hasFocus));
widget.setWidth(width);
widget.setX(column);
widget.setY(row);
return true;
}
return false;
}
}