001 /* 002 * Created on Feb 2, 2008 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 005 * in compliance with the License. You may obtain a copy of the License at 006 * 007 * http://www.apache.org/licenses/LICENSE-2.0 008 * 009 * Unless required by applicable law or agreed to in writing, software distributed under the License 010 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 011 * or implied. See the License for the specific language governing permissions and limitations under 012 * the License. 013 * 014 * Copyright @2008-2010 the original author or authors. 015 */ 016 package org.fest.swing.driver; 017 018 import static java.awt.Adjustable.HORIZONTAL; 019 import static java.awt.Adjustable.VERTICAL; 020 021 import java.awt.Point; 022 import java.util.HashMap; 023 import java.util.Map; 024 025 import javax.swing.JScrollBar; 026 027 import org.fest.swing.annotation.RunsInCurrentThread; 028 029 /** 030 * Understands a location in a <code>{@link JScrollBar}</code>. 031 * 032 * @author Yvonne Wang 033 * @author Alex Ruiz 034 */ 035 public final class JScrollBarLocation { 036 // TODO Test horizontal scroll bar 037 038 private static final int BLOCK_OFFSET = 4; 039 040 private static final Map<Integer, JScrollBarLocationStrategy> LOCATIONS = new HashMap<Integer, JScrollBarLocationStrategy>(); 041 042 static { 043 LOCATIONS.put(HORIZONTAL, new HorizontalJScrollBarLocation()); 044 LOCATIONS.put(VERTICAL, new VerticalJScrollBarLocation()); 045 } 046 047 /** 048 * Returns the location where to move the mouse pointer to scroll to the given position. 049 * <p> 050 * <b>Note:</b> This method is <b>not</b> guaranteed to be executed in the event dispatch thread (EDT.) Clients are 051 * responsible for calling this method from the EDT. 052 * </p> 053 * @param scrollBar the target <code>JScrollBar</code>. 054 * @param position the position to scroll to. 055 * @return the location where to move the mouse pointer to scroll to the given position. 056 */ 057 @RunsInCurrentThread 058 public Point thumbLocation(JScrollBar scrollBar, int position) { 059 double fraction = (double) position / maximumMinusMinimum(scrollBar); 060 return locationStrategyFor(scrollBar).thumbLocation(scrollBar, fraction); 061 } 062 063 @RunsInCurrentThread 064 private int maximumMinusMinimum(JScrollBar scrollBar) { 065 return scrollBar.getMaximum() - scrollBar.getMinimum(); 066 } 067 068 /** 069 * Returns the location where to move the mouse pointer to scroll one block up (or right.) 070 * <p> 071 * <b>Note:</b> This method is <b>not</b> guaranteed to be executed in the event dispatch thread (EDT.) Clients are 072 * responsible for calling this method from the EDT. 073 * </p> 074 * @param scrollBar the target <code>JScrollBar</code>. 075 * @return the location where to move the mouse pointer to scroll one block up (or right.) 076 */ 077 @RunsInCurrentThread 078 public Point blockLocationToScrollUp(JScrollBar scrollBar) { 079 Point p = unitLocationToScrollUp(scrollBar); 080 int offset = BLOCK_OFFSET; 081 return blockLocation(scrollBar, p, offset); 082 } 083 084 /** 085 * Returns the location where to move the mouse pointer to scroll one block down (or left.) 086 * <p> 087 * <b>Note:</b> This method is <b>not</b> guaranteed to be executed in the event dispatch thread (EDT.) Clients are 088 * responsible for calling this method from the EDT. 089 * </p> 090 * @param scrollBar the target <code>JScrollBar</code>. 091 * @return the location where to move the mouse pointer to scroll one block down (or left.) 092 */ 093 @RunsInCurrentThread 094 public Point blockLocationToScrollDown(JScrollBar scrollBar) { 095 Point p = unitLocationToScrollDown(scrollBar); 096 int offset = -BLOCK_OFFSET; 097 return blockLocation(scrollBar, p, offset); 098 } 099 100 @RunsInCurrentThread 101 private Point blockLocation(JScrollBar scrollBar, Point unitLocation, int offset) { 102 return locationStrategyFor(scrollBar).blockLocation(scrollBar, unitLocation, offset); 103 } 104 105 /** 106 * Returns the location where to move the mouse pointer to scroll one unit up (or right.) 107 * <p> 108 * <b>Note:</b> This method is <b>not</b> guaranteed to be executed in the event dispatch thread (EDT.) Clients are 109 * responsible for calling this method from the EDT. 110 * </p> 111 * @param scrollBar the target <code>JScrollBar</code>. 112 * @return the location where to move the mouse pointer to scroll one unit up (or right.) 113 */ 114 @RunsInCurrentThread 115 public Point unitLocationToScrollUp(JScrollBar scrollBar) { 116 int arrow = locationStrategyFor(scrollBar).arrow(scrollBar); 117 return new Point(arrow / 2, arrow / 2); 118 } 119 120 /** 121 * Returns the location where to move the mouse pointer to scroll one unit down (or left.) 122 * <p> 123 * <b>Note:</b> This method is <b>not</b> guaranteed to be executed in the event dispatch thread (EDT.) Clients are 124 * responsible for calling this method from the EDT. 125 * </p> 126 * @param scrollBar the target <code>JScrollBar</code>. 127 * @return the location where to move the mouse pointer to scroll one unit down (or left.) 128 */ 129 @RunsInCurrentThread 130 public Point unitLocationToScrollDown(JScrollBar scrollBar) { 131 return locationStrategyFor(scrollBar).unitLocationToScrollDown(scrollBar); 132 } 133 134 @RunsInCurrentThread 135 private JScrollBarLocationStrategy locationStrategyFor(JScrollBar scrollBar) { 136 return LOCATIONS.get(scrollBar.getOrientation()); 137 } 138 }