001 package com.croftsoft.core.animation.animator; 002 003 import java.awt.*; 004 import java.awt.event.*; 005 import javax.swing.*; 006 007 import com.croftsoft.core.animation.ComponentAnimator; 008 009 /********************************************************************* 010 * Animates an Icon at the mouse position. 011 * 012 * @version 013 * 2003-07-12 014 * @since 015 * 2002-02-26 016 * @author 017 * <a href="https://www.croftsoft.com/">David Wallace Croft</a> 018 *********************************************************************/ 019 020 public class CursorAnimator 021 implements ComponentAnimator, MouseListener, MouseMotionListener 022 ////////////////////////////////////////////////////////////////////// 023 ////////////////////////////////////////////////////////////////////// 024 { 025 026 private final Rectangle oldPaintBounds; 027 028 private final Rectangle newPaintBounds; 029 030 // 031 032 private Icon currentIcon; 033 034 private Icon nextIcon; 035 036 private Icon mouseReleasedIcon; 037 038 private Icon mousePressedIcon; 039 040 private int hotSpotX; 041 042 private int hotSpotY; 043 044 private int x; 045 046 private int y; 047 048 private boolean updated; 049 050 ////////////////////////////////////////////////////////////////////// 051 // constructor methods 052 ////////////////////////////////////////////////////////////////////// 053 054 public CursorAnimator ( 055 Icon mouseReleasedIcon, 056 Icon mousePressedIcon, 057 Point hotSpot, 058 Component component ) 059 ////////////////////////////////////////////////////////////////////// 060 { 061 setMouseReleasedIcon ( mouseReleasedIcon, hotSpot ); 062 063 setMousePressedIcon ( mousePressedIcon , hotSpot ); 064 065 oldPaintBounds = new Rectangle ( ); 066 067 newPaintBounds = new Rectangle ( ); 068 069 if ( component != null ) 070 { 071 component.addMouseMotionListener ( this ); 072 073 component.addMouseListener ( this ); 074 075 component.setCursor ( new Cursor ( Cursor.CROSSHAIR_CURSOR ) ); 076 } 077 } 078 079 ////////////////////////////////////////////////////////////////////// 080 // accessor methods 081 ////////////////////////////////////////////////////////////////////// 082 083 public Icon getMouseReleasedIcon ( ) { return mouseReleasedIcon; } 084 085 public Icon getMousePressedIcon ( ) { return mousePressedIcon; } 086 087 ////////////////////////////////////////////////////////////////////// 088 // mutator methods 089 ////////////////////////////////////////////////////////////////////// 090 091 public void setMouseReleasedIcon ( 092 Icon mouseReleasedIcon, 093 Point hotSpot ) 094 ////////////////////////////////////////////////////////////////////// 095 { 096 this.mouseReleasedIcon = mouseReleasedIcon; 097 098 updateHotSpot ( hotSpot ); 099 } 100 101 public void setMousePressedIcon ( 102 Icon mousePressedIcon, 103 Point hotSpot ) 104 ////////////////////////////////////////////////////////////////////// 105 { 106 this.mousePressedIcon = mousePressedIcon; 107 108 updateHotSpot ( hotSpot ); 109 } 110 111 ////////////////////////////////////////////////////////////////////// 112 // interface ComponentAnimator methods 113 ////////////////////////////////////////////////////////////////////// 114 115 public void update ( JComponent component ) 116 ////////////////////////////////////////////////////////////////////// 117 { 118 if ( !updated ) 119 { 120 return; 121 } 122 123 updated = false; 124 125 currentIcon = nextIcon; 126 127 if ( currentIcon != null ) 128 { 129 newPaintBounds.x = x; 130 131 newPaintBounds.y = y; 132 133 newPaintBounds.width = currentIcon.getIconWidth ( ); 134 135 newPaintBounds.height = currentIcon.getIconHeight ( ); 136 } 137 else 138 { 139 newPaintBounds.width = 0; 140 } 141 142 component.repaint ( oldPaintBounds ); 143 144 component.repaint ( newPaintBounds ); 145 146 oldPaintBounds.setBounds ( newPaintBounds ); 147 } 148 149 public void paint ( 150 JComponent component, 151 Graphics2D graphics ) 152 ////////////////////////////////////////////////////////////////////// 153 { 154 if ( currentIcon != null ) 155 { 156 currentIcon.paintIcon ( component, graphics, x, y ); 157 } 158 } 159 160 ////////////////////////////////////////////////////////////////////// 161 // interface MouseListener methods 162 ////////////////////////////////////////////////////////////////////// 163 164 public void mouseClicked ( MouseEvent mouseEvent ) 165 ////////////////////////////////////////////////////////////////////// 166 { 167 } 168 169 public void mouseEntered ( MouseEvent mouseEvent ) 170 ////////////////////////////////////////////////////////////////////// 171 { 172 updated = true; 173 174 nextIcon = mouseReleasedIcon; 175 } 176 177 public void mouseExited ( MouseEvent mouseEvent ) 178 ////////////////////////////////////////////////////////////////////// 179 { 180 updated = true; 181 182 nextIcon = null; 183 } 184 185 public void mousePressed ( MouseEvent mouseEvent ) 186 ////////////////////////////////////////////////////////////////////// 187 { 188 updated = true; 189 190 nextIcon = mousePressedIcon; 191 } 192 193 public void mouseReleased ( MouseEvent mouseEvent ) 194 ////////////////////////////////////////////////////////////////////// 195 { 196 updated = true; 197 198 nextIcon = mouseReleasedIcon; 199 } 200 201 ////////////////////////////////////////////////////////////////////// 202 // interface MouseMotionListener methods 203 ////////////////////////////////////////////////////////////////////// 204 205 public void mouseDragged ( MouseEvent mouseEvent ) 206 ////////////////////////////////////////////////////////////////////// 207 { 208 mouseMoved ( mouseEvent ); 209 } 210 211 public void mouseMoved ( MouseEvent mouseEvent ) 212 ////////////////////////////////////////////////////////////////////// 213 { 214 if ( currentIcon == null ) 215 { 216 return; 217 } 218 219 updated = true; 220 221 x = mouseEvent.getX ( ) - hotSpotX; 222 223 y = mouseEvent.getY ( ) - hotSpotY; 224 } 225 226 ////////////////////////////////////////////////////////////////////// 227 // private methods 228 ////////////////////////////////////////////////////////////////////// 229 230 private void updateHotSpot ( Point hotSpot ) 231 ////////////////////////////////////////////////////////////////////// 232 { 233 updated = true; 234 235 if ( hotSpot != null ) 236 { 237 hotSpotX = hotSpot.x; 238 239 hotSpotY = hotSpot.y; 240 } 241 else if ( mouseReleasedIcon != null ) 242 { 243 hotSpotX = mouseReleasedIcon.getIconWidth ( ) / 2; 244 245 hotSpotY = mouseReleasedIcon.getIconHeight ( ) / 2; 246 } 247 else if ( mousePressedIcon != null ) 248 { 249 hotSpotX = mousePressedIcon.getIconWidth ( ) / 2; 250 251 hotSpotY = mousePressedIcon.getIconHeight ( ) / 2; 252 } 253 else 254 { 255 hotSpotX = 0; 256 257 hotSpotY = 0; 258 } 259 } 260 261 ////////////////////////////////////////////////////////////////////// 262 ////////////////////////////////////////////////////////////////////// 263 }