/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ro.nextreports.designer.ui.table;
import java.awt.Component;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JTable;
import javax.swing.ListCellRenderer;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.table.JTableHeader;
/**
* Renderer for the row header for a given table.
*
* @author Decebal Suiu
*/
public class RowHeaderRenderer extends JLabel implements ListCellRenderer {
private JTable table;
private Border selectedBorder;
private Border normalBorder;
private Font selectedFont;
private Font normalFont;
RowHeaderRenderer(JTable table) {
this.table = table;
// this needs to be updated if the LaF changes
normalBorder = UIManager.getBorder("TableHeader.cellBorder");
selectedBorder = BorderFactory.createRaisedBevelBorder();
final JTableHeader header = this.table.getTableHeader();
normalFont = header.getFont();
selectedFont = normalFont.deriveFont(normalFont.getStyle() | Font.BOLD);
setForeground(header.getForeground());
setBackground(header.getBackground());
setOpaque(true);
setHorizontalAlignment(CENTER);
}
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
if (list.getSelectionModel().isSelectedIndex(index)) {
setFont(selectedFont);
setBorder(selectedBorder);
} else {
setFont(normalFont);
setBorder(normalBorder);
}
int row = index + 1;
setText(String.valueOf(row));
return this;
}
class ForwardMouseListener implements MouseListener {
private int row;
public ForwardMouseListener(int row) {
this.row = row;
}
public void mouseClicked(MouseEvent ev) {
// System.out.println("ForwardMouseListener.mouseClicked()");
forwardMouseEventToTable(row, ev);
}
public void mouseEntered(MouseEvent ev) {
forwardMouseEventToTable(row, ev);
}
public void mouseExited(MouseEvent ev) {
forwardMouseEventToTable(row, ev);
}
public void mousePressed(MouseEvent ev) {
forwardMouseEventToTable(row, ev);
}
public void mouseReleased(MouseEvent ev) {
forwardMouseEventToTable(row, ev);
}
/**
* Forwards a mouse event to the table.
*/
private void forwardMouseEventToTable(int row, MouseEvent ev) {
Rectangle r = table.getCellRect(row, 0, false);
ev = new MouseEvent(table, ev.getID(), ev.getWhen(),
ev.getModifiers(), r.x, r.y,
ev.getClickCount(), ev.isPopupTrigger());
table.dispatchEvent(ev);
}
}
}