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.button;
00023
00024 import com.realtime.crossfire.jxclient.gui.commandlist.CommandList;
00025 import com.realtime.crossfire.jxclient.gui.gui.ActivatableGUIElement;
00026 import com.realtime.crossfire.jxclient.gui.gui.GUIElementListener;
00027 import com.realtime.crossfire.jxclient.gui.gui.KeyPressedHandler;
00028 import com.realtime.crossfire.jxclient.gui.gui.TooltipManager;
00029 import com.realtime.crossfire.jxclient.timeouts.TimeoutEvent;
00030 import com.realtime.crossfire.jxclient.timeouts.Timeouts;
00031 import java.awt.Dimension;
00032 import java.awt.event.KeyEvent;
00033 import java.awt.event.MouseEvent;
00034 import org.jetbrains.annotations.NotNull;
00035 import org.jetbrains.annotations.Nullable;
00036
00041 public abstract class AbstractButton extends ActivatableGUIElement implements KeyPressedHandler {
00042
00046 private static final long serialVersionUID = 1;
00047
00051 private static final int TIMEOUT_FIRST = 350;
00052
00056 private static final int TIMEOUT_SECOND = 80;
00057
00061 private final boolean autoRepeat;
00062
00066 @NotNull
00067 private final CommandList commandList;
00068
00072 @NotNull
00073 private final TimeoutEvent timeoutEvent = new TimeoutEvent() {
00074
00075 @Override
00076 public void timeout() {
00077 execute();
00078 Timeouts.reset(TIMEOUT_SECOND, timeoutEvent);
00079 }
00080
00081 };
00082
00093 protected AbstractButton(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final String name, final int transparency, final boolean autoRepeat, @NotNull final CommandList commandList) {
00094 super(tooltipManager, elementListener, name, transparency);
00095 this.autoRepeat = autoRepeat;
00096 this.commandList = commandList;
00097 }
00098
00102 @Override
00103 public void mouseClicked(@NotNull final MouseEvent e) {
00104 super.mouseClicked(e);
00105 final int b = e.getButton();
00106 switch (b) {
00107 case MouseEvent.BUTTON1:
00108 if (!autoRepeat) {
00109 execute();
00110 }
00111 setActive(false);
00112 break;
00113
00114 case MouseEvent.BUTTON2:
00115 break;
00116
00117 case MouseEvent.BUTTON3:
00118 break;
00119 }
00120 }
00121
00125 @Override
00126 public void mouseReleased(@NotNull final MouseEvent e) {
00127 super.mouseReleased(e);
00128 final int b = e.getButton();
00129 switch (b) {
00130 case MouseEvent.BUTTON1:
00131 if (autoRepeat) {
00132 Timeouts.remove(timeoutEvent);
00133 }
00134 setActive(false);
00135 break;
00136
00137 case MouseEvent.BUTTON2:
00138 break;
00139
00140 case MouseEvent.BUTTON3:
00141 break;
00142 }
00143 }
00144
00148 @Override
00149 public void mousePressed(@NotNull final MouseEvent e) {
00150 super.mousePressed(e);
00151 final int b = e.getButton();
00152 switch (b) {
00153 case MouseEvent.BUTTON1:
00154 setActive(true);
00155 if (autoRepeat) {
00156 execute();
00157 Timeouts.reset(TIMEOUT_FIRST, timeoutEvent);
00158 }
00159 break;
00160
00161 case MouseEvent.BUTTON2:
00162 break;
00163
00164 case MouseEvent.BUTTON3:
00165 break;
00166 }
00167 }
00168
00172 @Override
00173 public void mouseExited(@NotNull final MouseEvent e) {
00174 super.mouseExited(e);
00175 if (autoRepeat) {
00176 Timeouts.remove(timeoutEvent);
00177 }
00178 setActive(false);
00179 }
00180
00184 @Override
00185 public void execute() {
00186 commandList.execute();
00187 }
00188
00192 @Nullable
00193 @Override
00194 public Dimension getPreferredSize() {
00195 return getMinimumSizeInt();
00196 }
00197
00201 @Nullable
00202 @Override
00203 public Dimension getMinimumSize() {
00204 return getMinimumSizeInt();
00205 }
00206
00211 @NotNull
00212 protected abstract Dimension getMinimumSizeInt();
00213
00217 @Override
00218 public boolean keyPressed(@NotNull final KeyEvent e) {
00219 switch (e.getKeyCode()) {
00220 case KeyEvent.VK_SPACE:
00221 case KeyEvent.VK_ENTER:
00222 execute();
00223 return true;
00224 }
00225
00226 return false;
00227 }
00228
00229 }