00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.gui.misc;
00023
00024 import com.realtime.crossfire.jxclient.gui.gui.ActivatableGUIElement;
00025 import com.realtime.crossfire.jxclient.gui.gui.GUIElementListener;
00026 import com.realtime.crossfire.jxclient.gui.gui.TooltipManager;
00027 import com.realtime.crossfire.jxclient.gui.scrollable.GUIScrollable2;
00028 import com.realtime.crossfire.jxclient.gui.scrollable.ScrollableListener;
00029 import java.awt.Color;
00030 import java.awt.Dimension;
00031 import java.awt.Graphics;
00032 import java.awt.Transparency;
00033 import java.awt.event.MouseEvent;
00034 import org.jetbrains.annotations.NotNull;
00035 import org.jetbrains.annotations.Nullable;
00036
00041 public class GUIScrollBar extends ActivatableGUIElement implements ScrollableListener {
00042
00046 private static final long serialVersionUID = 1;
00047
00052 private final boolean proportionalSlider;
00053
00057 @NotNull
00058 private final GUIScrollable2 scrollable;
00059
00063 @NotNull
00064 private final Color colorBackground;
00065
00069 @NotNull
00070 private final Color colorForeground;
00071
00075 private int valueMin = 0;
00076
00080 private int valueSize = 1;
00081
00085 private int sliderSize = 1;
00086
00090 private int sliderPos = 0;
00091
00096 private int offset = 0;
00097
00101 private boolean scrolling = false;
00102
00114 public GUIScrollBar(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final String name, final boolean proportionalSlider, @NotNull final GUIScrollable2 scrollable, @NotNull final Color colorBackground, @NotNull final Color colorForeground) {
00115 super(tooltipManager, elementListener, name, Transparency.OPAQUE);
00116 this.proportionalSlider = proportionalSlider;
00117 this.scrollable = scrollable;
00118 this.colorBackground = colorBackground;
00119 this.colorForeground = colorForeground;
00120 this.scrollable.addScrollableListener(this);
00121 }
00122
00126 @Override
00127 public void dispose() {
00128 super.dispose();
00129 scrollable.removeScrollableListener(this);
00130 }
00131
00135 @Override
00136 public void setRange(final int valueMin, final int valueMax, final int sliderPos, final int sliderSize) {
00137 if (valueMax <= valueMin) {
00138 throw new IllegalArgumentException();
00139 }
00140 if (sliderSize <= 0) {
00141 throw new IllegalArgumentException();
00142 }
00143
00144 this.valueMin = valueMin;
00145 valueSize = valueMax-valueMin;
00146 this.sliderSize = Math.min(sliderSize, valueSize);
00147 setPosition(sliderPos);
00148 }
00149
00153 @Override
00154 protected void activeChanged() {
00155 }
00156
00160 @Override
00161 public void mousePressed(@NotNull final MouseEvent e) {
00162 super.mousePressed(e);
00163 switch (e.getButton()) {
00164 case MouseEvent.BUTTON1:
00165 final int sh = getSliderHeightPixels();
00166 offset = e.getY()-getSliderPosPixels(sh);
00167 if (offset < 0) {
00168 scrollable.scrollTo(sliderPos-sliderSize);
00169 } else if (offset >= sh) {
00170 scrollable.scrollTo(sliderPos+sliderSize);
00171 } else {
00172 scrolling = true;
00173 }
00174 break;
00175
00176 case MouseEvent.BUTTON2:
00177 break;
00178
00179 case MouseEvent.BUTTON3:
00180 break;
00181 }
00182 }
00183
00187 @Override
00188 public void mouseReleased(@NotNull final MouseEvent e) {
00189 super.mouseReleased(e);
00190 switch (e.getButton()) {
00191 case MouseEvent.BUTTON1:
00192 scrolling = false;
00193 break;
00194
00195 case MouseEvent.BUTTON2:
00196 break;
00197
00198 case MouseEvent.BUTTON3:
00199 break;
00200 }
00201 }
00202
00206 @Override
00207 public void mouseDragged(@NotNull final MouseEvent e) {
00208 super.mouseDragged(e);
00209 if (scrolling) {
00210 scrollable.scrollTo(getSliderPos(e.getY()-offset));
00211 }
00212 }
00213
00217 @Override
00218 public void execute() {
00219
00220 }
00221
00227 private int getSliderPos(final int yPixels) {
00228 return (int)Math.round(yPixels*(double)(valueSize-sliderSize)/(getHeight()-getSliderHeightPixels()));
00229 }
00230
00236 private void setPosition(final int pos) {
00237 if (pos < valueMin) {
00238 sliderPos = valueMin;
00239 } else if (pos+sliderSize > valueMin+valueSize) {
00240 sliderPos = valueMin+valueSize-sliderSize;
00241 } else {
00242 sliderPos = pos;
00243 }
00244 setChanged();
00245 }
00246
00251 private int getSliderHeightPixels() {
00252 return proportionalSlider ? Math.max((int)Math.round(getHeight()*(double)sliderSize/valueSize), getWidth()) : getWidth();
00253 }
00254
00260 private int getSliderPosPixels(final int sh) {
00261 return (int)Math.round(sliderPos*(double)(getHeight()-sh)/(valueSize-sliderSize));
00262 }
00263
00267 @Override
00268 public void paintComponent(@NotNull final Graphics g) {
00269 super.paintComponent(g);
00270 final int sh = getSliderHeightPixels();
00271 final int sy = getSliderPosPixels(sh);
00272 g.setColor(colorBackground);
00273 g.fillRect(0, 0, getWidth(), sy);
00274 g.fillRect(0, sy+sh, getWidth(), getHeight()-sy-sh);
00275 g.setColor(colorForeground);
00276 g.fillRect(0, sy, getWidth(), sh);
00277 }
00278
00282 @Nullable
00283 @Override
00284 public Dimension getPreferredSize() {
00285 return new Dimension(16, 64);
00286 }
00287
00291 @Nullable
00292 @Override
00293 public Dimension getMinimumSize() {
00294 return new Dimension(16, 16);
00295 }
00296
00297 }