/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.bearsoft.gui.grid.header.cell; import com.bearsoft.gui.grid.header.GridColumnsNode; import com.bearsoft.gui.grid.header.MultiLevelHeader; import java.awt.Color; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.LayoutManager; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.border.Border; /** * * @author Gala */ public class CellHighlighter extends MouseAdapter { protected HeaderCell cell; protected Color originalBackground; protected Border pressedBorder; protected Border originalBorder; protected boolean pressed = false; protected boolean innerPressed = false; public CellHighlighter(HeaderCell aCell) { super(); cell = aCell; originalBackground = cell.getBackground(); originalBorder = cell.getBorder(); pressedBorder = cell.createCellLoweredBorder(); } @Override public void mouseEntered(MouseEvent e) { if (innerPressed) { cell.setBorder(pressedBorder); } GridColumnsNode pressedColGroup = cell.getHeader().getPressed4ResizeColGroup(); GridColumnsNode movingColGroup = cell.getHeader().getMovingColGroup(); if ((pressedColGroup == null && movingColGroup == null) || (pressedColGroup == cell.getColGroup() || movingColGroup == cell.getColGroup())) { if (cell.getColGroup().isSortable() || cell.getColGroup().isMovable() || cell.getColGroup().isResizable()) { originalBackground = cell.getBackground(); cell.setBackground(originalBackground.brighter()); cell.setRolledover(true); } cell.setLeftRolledover(false); cell.setRightRolledover(false); } } @Override public void mouseExited(MouseEvent e) { GridColumnsNode pressedColGroup = cell.getHeader().getPressed4ResizeColGroup(); GridColumnsNode movingColGroup = cell.getHeader().getMovingColGroup(); if (pressedColGroup == null && movingColGroup == null) { cell.setBorder(originalBorder); cell.setBackground(originalBackground); cell.setRolledover(false); } cell.setLeftRolledover(false); cell.setRightRolledover(false); } @Override public void mousePressed(MouseEvent e) { Dimension d = cell.getSize(); if (e.getX() >= MultiLevelHeader.PICK_MARGIN_SIZE && e.getX() < d.width - MultiLevelHeader.PICK_MARGIN_SIZE - 1) { if (cell.getColGroup().isSortable() || cell.getColGroup().isMovable()) { cell.setBorder(pressedBorder); innerPressed = true; } } pressed = true; } @Override public void mouseReleased(MouseEvent e) { cell.setBorder(originalBorder); pressed = false; innerPressed = false; Point pt = e.getPoint(); configureCursors(pt); if (!cell.contains(pt)) { cell.setBackground(originalBackground); cell.setRolledover(false); MultiLevelHeader.simulateMouseEntered(cell, e); configureCursors(e.getPoint()); } } @Override public void mouseMoved(MouseEvent e) { Point pt = e.getPoint(); configureCursors(pt); } @Override public void mouseDragged(MouseEvent e) { Point pt = e.getPoint(); configureCursors(pt); } private void configureCursors(Point pt) { GridColumnsNode resizingColGroup = cell.getHeader().getResizingColGroup(); GridColumnsNode movingColGroup = cell.getHeader().getMovingColGroup(); if (resizingColGroup != null) { cell.getHeader().setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR)); } else if (movingColGroup != null) { cell.getHeader().setCursor(Cursor.getDefaultCursor()); } else { Dimension d = cell.getSize(); if (cell.contains(pt) && pt.x >= 0 && pt.x < MultiLevelHeader.PICK_MARGIN_SIZE) { Container cellParent = cell.getParent(); LayoutManager l = cellParent.getLayout(); if (l instanceof GridBagLayout) { GridBagLayout gl = (GridBagLayout) l; GridBagConstraints c = gl.getConstraints(cell); if (c.gridx != 0) { cell.getHeader().setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR)); } else { cell.getHeader().setCursor(Cursor.getDefaultCursor()); } } else { cell.getHeader().setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR)); } } else if (cell.contains(pt) && pt.x >= d.width - MultiLevelHeader.PICK_MARGIN_SIZE - 1 && pt.x < d.width) { cell.getHeader().setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR)); } else { cell.getHeader().setCursor(Cursor.getDefaultCursor()); } } } }