/* * 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.Component; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.ArrayList; import java.util.List; import javax.swing.table.TableColumn; /** * * @author Gala */ public class CellResizer extends MouseAdapter { protected MultiLevelHeader header; protected HeaderCell cell; protected Point leftPt; protected Point rightPt; public CellResizer(HeaderCell aCell, MultiLevelHeader aHeader) { super(); cell = aCell; header = aHeader; } @Override public void mousePressed(MouseEvent e) { leftPt = null; rightPt = null; Dimension d = cell.getSize(); Point pt = e.getPoint(); if (pt.x < MultiLevelHeader.PICK_MARGIN_SIZE) { leftPt = pt; Component leftComp = header.getComponentAt(new Point(cell.getX() - 1, cell.getY() + leftPt.y)); if (leftComp instanceof HeaderCell) { HeaderCell hCell = (HeaderCell) leftComp; assert cell != hCell; MouseListener[] mml = hCell.getMouseListeners(); for (MouseListener l : mml) { l.mousePressed(new MouseEvent(hCell, e.getID(), e.getWhen(), e.getModifiers(), hCell.getSize().width + e.getX(), e.getY(), e.getClickCount(), e.isPopupTrigger())); } } cell.getHeader().setPressed4ResizeColGroup(cell.getColGroup()); } else if (pt.x >= d.width - MultiLevelHeader.PICK_MARGIN_SIZE - 1) { rightPt = pt; GridColumnsNode resizingNode = cell.getColGroup(); cell.getHeader().setResizingColGroup(resizingNode); cell.getHeader().setPressed4ResizeColGroup(resizingNode); GridColumnsNode resizingLeaf = null; List<GridColumnsNode> leaves = new ArrayList<>(); MultiLevelHeader.achieveLeaves(cell.getColGroup(), leaves); assert !leaves.isEmpty(); for (int i = leaves.size() - 1; i >= 0; i--) { GridColumnsNode leaf = leaves.get(i); if (leaf.getTableColumn().getResizable()) { resizingLeaf = leaf; break; } } if (resizingLeaf != null) { header.getTable().getTableHeader().setResizingColumn(resizingLeaf.getTableColumn()); resizingColumnMaxWidth = resizingLeaf.getTableColumn().getMaxWidth(); } } else { leftPt = null; rightPt = null; } } private int resizingColumnMaxWidth; @Override public void mouseReleased(MouseEvent e) { leftPt = null; rightPt = null; TableColumn resizingColumn = header.getTable().getTableHeader().getResizingColumn(); if (resizingColumn != null) { EventQueue.invokeLater(() -> { //resizingColumn.setMaxWidth(resizingColumnMaxWidth); header.getTable().getTableHeader().setResizingColumn(null); }); } cell.getHeader().setResizingColGroup(null); cell.getHeader().setPressed4ResizeColGroup(null); } @Override public void mouseDragged(MouseEvent e) { if (rightPt != null) { TableColumn resizingColumn = header.getTable().getTableHeader().getResizingColumn(); if (resizingColumn != null && resizingColumn.getResizable()) { Point newRightPt = e.getPoint(); int dWidth = newRightPt.x - rightPt.x; List<GridColumnsNode> leaves = new ArrayList<>(); MultiLevelHeader.achieveLeaves(cell.getColGroup(), leaves); assert !leaves.isEmpty(); if (Math.abs(dWidth) > leaves.size()) { int newWidth = newRightPt.x; for (int i = leaves.size() - 1; i >= 0; i--) { GridColumnsNode leaf = leaves.get(i); if (leaf.getTableColumn() != resizingColumn) { newWidth -= leaf.getTableColumn().getWidth(); } } if (newWidth < 0) { newWidth = 0; } resizingColumn.setWidth(newWidth); resizingColumn.setPreferredWidth(newWidth); resizingColumn.setMaxWidth(newWidth); header.invalidate(); header.repaint(); } } } else if (leftPt != null) { Component leftComp = header.getComponentAt(new Point(cell.getX() - 1, cell.getY() + leftPt.y)); if (leftComp instanceof HeaderCell) { HeaderCell hCell = (HeaderCell) leftComp; assert cell != hCell; MouseMotionListener[] mml = hCell.getMouseMotionListeners(); for (MouseMotionListener l : mml) { l.mouseDragged(new MouseEvent(hCell, e.getID(), e.getWhen(), e.getModifiers(), hCell.getSize().width + e.getX(), e.getY(), e.getClickCount(), e.isPopupTrigger())); } } } } }