/*! * 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.designer.core.editor.report; import org.pentaho.reporting.designer.core.editor.ReportDocumentContext; import org.pentaho.reporting.designer.core.editor.report.layouting.ElementRenderer; import org.pentaho.reporting.designer.core.util.CanvasImageLoader; import javax.swing.*; import javax.swing.border.Border; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; /** * User: Martin Date: 25.01.2006 Time: 20:55:17 */ public class ResizeRootBandComponent extends JPanel { private boolean mousePressed; private boolean mouseInside; private Color hoverColor; private Color normalColor; private Border hoverBorder; private Border normalBorder; private ElementRenderer rootBandRenderer; private ReportDocumentContext renderContext; private boolean linealComponent; public ResizeRootBandComponent( final boolean linealComponent, final ElementRenderer renderer, final ReportDocumentContext renderContext ) { if ( renderer == null ) { throw new NullPointerException(); } if ( renderContext == null ) { throw new NullPointerException(); } this.linealComponent = linealComponent; this.renderContext = renderContext; this.rootBandRenderer = renderer; if ( linealComponent ) { normalColor = new Color( 212, 212, 212 ); normalBorder = BorderFactory.createLineBorder( new Color( 188, 188, 188 ), 1 ); hoverColor = new Color( 212, 212, 212 ); hoverBorder = BorderFactory.createLineBorder( new Color( 128, 128, 128 ), 1 ); } else { normalColor = new Color( 255, 255, 255, 0 ); hoverColor = new Color( 255, 255, 255, 0 ); hoverBorder = BorderFactory.createEmptyBorder( 1, 1, 1, 1 ); normalBorder = BorderFactory.createEmptyBorder( 1, 1, 1, 1 ); } setOpaque( false ); setBorder( normalBorder ); setMinimumSize( new Dimension( 6, 4 ) ); setPreferredSize( new Dimension( 6, 4 ) ); setBackground( normalColor ); final MouseUpdateHandler handler = new MouseUpdateHandler(); addMouseListener( handler ); addMouseMotionListener( handler ); setCursor( Cursor.getPredefinedCursor( Cursor.N_RESIZE_CURSOR ) ); } protected void paintComponent( Graphics g ) { super.paintComponent( g ); if ( !linealComponent ) { g.setColor( Color.WHITE ); g.fillRect( getWidth() - 15, 0, getWidth(), getHeight() ); ImageIcon leftBorder = CanvasImageLoader.getInstance().getLeftShadowImage(); g.drawImage( leftBorder.getImage(), getWidth() - 23, 0, leftBorder.getIconWidth(), getHeight(), null ); g.setColor( Color.DARK_GRAY ); g.drawLine( 0, getHeight() / 2, getWidth(), getHeight() / 2 ); } } protected void updateState( final boolean mousePressed, final boolean mouseInside ) { this.mousePressed = mousePressed; this.mouseInside = mouseInside; if ( mouseInside || this.mousePressed ) { setBorder( hoverBorder ); setBackground( hoverColor ); } else { setBorder( normalBorder ); setBackground( normalColor ); } repaint(); } public boolean isMouseInside() { return mouseInside; } public boolean isMousePressed() { return mousePressed; } public ElementRenderer getRootBandRenderer() { return rootBandRenderer; } protected ReportDocumentContext getRenderContext() { return renderContext; } private class MouseUpdateHandler extends MouseAdapter implements MouseMotionListener { private int startPosition; public void mousePressed( final MouseEvent e ) { startPosition = e.getY(); updateState( true, isMouseInside() ); } public void mouseReleased( final MouseEvent e ) { startPosition = -1; updateState( false, isMouseInside() ); } @Override public void mouseEntered( final MouseEvent e ) { updateState( isMousePressed(), true ); } @Override public void mouseExited( final MouseEvent e ) { updateState( isMousePressed(), false ); } public void mouseDragged( final MouseEvent e ) { final int diff = startPosition - e.getY(); final ElementRenderer rootBandRenderer = getRootBandRenderer(); final float zoomAsPercentage = getRenderContext().getZoomModel().getZoomAsPercentage(); final double height = rootBandRenderer.getVisualHeight() - ( diff / zoomAsPercentage ); if ( height < 0 ) { return; } rootBandRenderer.setVisualHeight( height ); } public void mouseMoved( final MouseEvent e ) { } } }