/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2008 Sun Microsystems, Inc. */ package org.opends.guitools.controlpanel.ui.renderer; import java.awt.Color; import java.awt.Component; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import javax.swing.JTable; import org.opends.guitools.controlpanel.ui.ColorAndFontConstants; /** * A table cell renderer that updates the rendering of the cells when the user * moves the mouse over the table. This is done to provide a visual hint that * the table can be selected. * */ public class SelectableTableCellRenderer extends CustomCellRenderer { private static final long serialVersionUID = 6855042914121526677L; private boolean hasMouseOver; private boolean isBeingPressed; private int lastRowMouseOver; private static final Color pressedBackground = ColorAndFontConstants.pressedBackground; private static final Color pressedForeground = ColorAndFontConstants.pressedForeground; private static final Color mouseOverBackground = ColorAndFontConstants.mouseOverBackground; private static final Color mouseOverForeground = ColorAndFontConstants.mouseOverForeground; /** * Sets the table that will be rendered by this renderer. * @param table the table to be rendered. */ public void setTable(final JTable table) { MouseAdapter mouseListener = new MouseAdapter() { /** * {@inheritDoc} */ public void mousePressed(MouseEvent ev) { isBeingPressed = true; table.repaint(); } /** * {@inheritDoc} */ public void mouseReleased(MouseEvent ev) { isBeingPressed = false; } /** * {@inheritDoc} */ public void mouseExited(MouseEvent ev) { hasMouseOver = false; lastRowMouseOver = -1; table.repaint(); } /** * {@inheritDoc} */ public void mouseEntered(MouseEvent ev) { if (ev.getSource() == table) { hasMouseOver = true; lastRowMouseOver = table.rowAtPoint(ev.getPoint()); } else { mouseExited(ev); } } }; MouseMotionAdapter mouseMotionAdapter = new MouseMotionAdapter() { /** * {@inheritDoc} */ public void mouseMoved(MouseEvent ev) { lastRowMouseOver = table.rowAtPoint(ev.getPoint()); table.repaint(); } /** * {@inheritDoc} */ public void mouseDragged(MouseEvent ev) { lastRowMouseOver = -1; table.repaint(); } }; table.addMouseListener(mouseListener); table.addMouseMotionListener(mouseMotionAdapter); } /** * {@inheritDoc} */ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); updateComponent(this, table, row, column, isSelected); return this; } /** * {@inheritDoc} */ protected void updateComponent(Component comp, JTable table, int row, int column, boolean isSelected) { if (table.isCellEditable(row, column) && !isSelected) { comp.setBackground(ColorAndFontConstants.treeBackground); comp.setForeground(ColorAndFontConstants.treeForeground); } else if (isBeingPressed && hasMouseOver && (row == lastRowMouseOver)) { comp.setBackground(pressedBackground); comp.setForeground(pressedForeground); } else if ((hasMouseOver && (row == lastRowMouseOver)) || isSelected) { comp.setBackground(mouseOverBackground); comp.setForeground(mouseOverForeground); } else { comp.setBackground(ColorAndFontConstants.treeBackground); comp.setForeground(ColorAndFontConstants.treeForeground); } } }