/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.reporting.ui.datasources.table; import javax.swing.*; import javax.swing.event.MouseInputListener; import javax.swing.plaf.basic.BasicTableHeaderUI; import javax.swing.table.TableColumnModel; import java.awt.*; import java.awt.event.MouseEvent; public class EditableHeaderUI extends BasicTableHeaderUI { public EditableHeaderUI() { } protected MouseInputListener createMouseInputListener() { return new MouseInputHandler( (EditableHeader) header ); } private class MouseInputHandler extends BasicTableHeaderUI.MouseInputHandler { private Component dispatchComponent; private EditableHeader header; public MouseInputHandler( final EditableHeader header ) { this.header = header; } private void setDispatchComponent( final MouseEvent e ) { final Component editorComponent = header.getEditorComponent(); final Point p = e.getPoint(); final Point p2 = SwingUtilities.convertPoint( header, p, editorComponent ); dispatchComponent = SwingUtilities.getDeepestComponentAt( editorComponent, p2.x, p2.y ); } private boolean repostEvent( final MouseEvent e ) { if ( dispatchComponent == null ) { return false; } final MouseEvent e2 = SwingUtilities.convertMouseEvent( header, e, dispatchComponent ); dispatchComponent.dispatchEvent( e2 ); return true; } public void mousePressed( final MouseEvent e ) { super.mousePressed( e ); if ( !SwingUtilities.isLeftMouseButton( e ) ) { return; } if ( header.getResizingColumn() == null ) { final Point p = e.getPoint(); final TableColumnModel columnModel = header.getColumnModel(); final int index = columnModel.getColumnIndexAtX( p.x ); if ( index != -1 ) { if ( header.editCellAt( index, e ) ) { setDispatchComponent( e ); repostEvent( e ); } } } } public void mouseReleased( final MouseEvent e ) { super.mouseReleased( e ); if ( !SwingUtilities.isLeftMouseButton( e ) ) { return; } repostEvent( e ); dispatchComponent = null; } } }