Crossfire JXClient, Trunk
GUISpinner.java
Go to the documentation of this file.
1 /*
2  * This file is part of JXClient, the Fullscreen Java Crossfire Client.
3  *
4  * JXClient is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * JXClient is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with JXClient; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * Copyright (C) 2005-2008 Yann Chachkoff
19  * Copyright (C) 2006-2017,2019-2023 Andreas Kirschbaum
20  * Copyright (C) 2010-2012,2014-2018,2020-2023 Nicolas Weeger
21  */
22 
23 package com.realtime.crossfire.jxclient.gui.misc;
24 
36 import java.awt.Color;
37 import java.awt.Component;
38 import java.awt.Dimension;
39 import java.awt.event.KeyEvent;
40 import javax.swing.JComponent;
41 import javax.swing.JSpinner;
42 import javax.swing.SpinnerNumberModel;
43 import javax.swing.border.Border;
44 import javax.swing.border.LineBorder;
45 import javax.swing.event.ChangeListener;
46 import org.jetbrains.annotations.NotNull;
47 import org.jetbrains.annotations.Nullable;
48 
53 public class GUISpinner extends ActivatableGUIElement implements KeyPressedHandler {
54 
58  private static final long serialVersionUID = 1;
59 
63  @NotNull
64  private final NewcharStat stat;
65 
69  @NotNull
70  private final NewCharModel newCharModel;
71 
75  @NotNull
76  private final SpinnerNumberModel spinnerModel;
77 
81  @NotNull
82  private final JSpinner spinner;
83 
87  @NotNull
88  private final ChangeListener changeListener = e -> updateSelectedItem();
89 
93  @NotNull
94  private final Border border;
95 
99  private int value;
100 
110  public GUISpinner(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final String name, @NotNull final NewcharStat stat, @NotNull final NewCharModel newCharModel, @NotNull final GuiFactory guiFactory) {
112  this.stat = stat;
113  this.newCharModel = newCharModel;
115  spinnerModel = new SpinnerNumberModel(newCharInfo.getMinValue(), newCharInfo.getMinValue(), newCharInfo.getMaxValue(), 1); // XXX: this is too early; must be set each time the new character dialog is opened
116  spinner = new JSpinner(spinnerModel);
117  border = spinner.getBorder();
118  final JComponent editor = spinner.getEditor();
119  for (int i = 0; i < editor.getComponentCount(); i++) {
120  final Component component = editor.getComponent(i);
121  component.setFocusable(false);
122  }
123  spinner.addChangeListener(changeListener);
124  add(spinner);
125  }
126 
127  @Override
128  public void dispose() {
129  super.dispose();
130  spinner.removeChangeListener(changeListener);
131  }
132 
133  @Nullable
134  @Override
136  return null;
137  }
138 
139  @Override
140  public void notifyOpen() {
142  final int minValue = newCharInfo.getMinValue();
143  spinnerModel.setMinimum(minValue);
144  final int maxValue = newCharInfo.getMaxValue();
145  spinnerModel.setMaximum(maxValue);
146  int value = (Integer)spinnerModel.getNumber();
147  if (value > maxValue) {
148  value = maxValue;
149  }
150  if (value < minValue) {
151  value = minValue;
152  }
153  spinnerModel.setValue(value);
154  this.value = 0;
156  }
157 
158  @Override
159  public Dimension getPreferredSize() {
160  final Dimension result = spinner.getPreferredSize();
161  return result == null ? super.getPreferredSize() : result;
162  }
163 
164  @Override
165  public Dimension getMinimumSize() {
166  final Dimension result = spinner.getMinimumSize();
167  return result == null ? super.getMinimumSize() : result;
168  }
169 
170  @Override
171  public void setBounds(final int x, final int y, final int width, final int height) {
172  super.setBounds(x, y, width, height);
173  spinner.setSize(width, height);
174  }
175 
179  private void updateSelectedItem() {
180  newCharModel.setValue(stat, spinnerModel.getNumber().intValue());
181  }
182 
183  @Override
184  protected void activeChanged() {
185  if (isActive()) {
186  spinner.setBorder(new LineBorder(Color.RED, 1));
187  } else {
188  if (value > 0) {
190  spinner.setValue(Math.max(newCharInfo.getMinValue(), Math.min(newCharInfo.getMaxValue(), value)));
191  }
192  spinner.setBorder(border);
193  }
194  value = 0;
195  setChanged();
196  }
197 
198  @Override
199  public void execute() {
200  }
201 
202  @Override
203  public boolean keyPressed(@NotNull final KeyEvent2 e) {
204  if (!isEnabled()) {
205  return false;
206  }
207 
208  switch (e.getKeyCode()) {
209  case KeyEvent.VK_ENTER:
211  spinner.setValue(Math.max(newCharInfo.getMinValue(), Math.min(newCharInfo.getMaxValue(), value)));
212  spinner.setBorder(border);
213  value = 0;
215  return true;
216 
217  case KeyEvent.VK_BACK_SPACE:
218  value /= 10;
219  spinner.setValue(value);
220  spinner.setBorder(new LineBorder(Color.RED, 1));
221  return true;
222  }
223 
224  final char ch = e.getKeyChar();
225  if (ch != KeyEvent.CHAR_UNDEFINED && ch != (char)127 && ch >= ' ') {
226  if ('0' <= ch && ch <= '9' && value < 10) {
227  value = 10*value+ch-'0';
228  spinner.setValue(value);
229  spinner.setBorder(new LineBorder(Color.RED, 1));
230  }
231  return true;
232  }
233 
234  return false;
235  }
236 
237 }
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.dispose
void dispose()
Definition: GUISpinner.java:128
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.name
final String name
Definition: AbstractGUIElement.java:77
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.skin.skin
Definition: DefaultJXCSkin.java:23
com.realtime.crossfire.jxclient.gui.label.NewcharStat
Definition: NewcharStat.java:32
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2
Definition: KeyEvent2.java:34
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.updateSelectedItem
void updateSelectedItem()
Definition: GUISpinner.java:179
com.realtime.crossfire.jxclient.skin
com.realtime.crossfire.jxclient.character.NewCharInfo.getMinValue
int getMinValue()
Definition: NewCharInfo.java:105
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.keyPressed
boolean keyPressed(@NotNull final KeyEvent2 e)
Definition: GUISpinner.java:203
com.realtime.crossfire.jxclient.gui.gui.ActivatableGUIElement
Definition: ActivatableGUIElement.java:33
com.realtime.crossfire.jxclient.gui.label
Definition: AbstractLabel.java:23
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.getTooltip
TooltipText getTooltip()
Definition: GUISpinner.java:135
com.realtime.crossfire.jxclient.skin.skin.GuiFactory
Definition: GuiFactory.java:41
com.realtime.crossfire.jxclient.gui.label.NewCharModel.getNewCharacterInformation
NewCharacterInformation getNewCharacterInformation()
Definition: NewCharModel.java:226
com.realtime.crossfire.jxclient.gui.keybindings
Definition: InvalidKeyBindingException.java:23
com.realtime.crossfire.jxclient.gui.misc.GUISpinner
Definition: GUISpinner.java:53
com.realtime.crossfire.jxclient.gui.label.NewCharModel.setValue
void setValue(@NotNull final NewcharStat stat, final int value)
Definition: NewCharModel.java:340
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.activeChanged
void activeChanged()
Definition: GUISpinner.java:184
com.realtime.crossfire.jxclient.character.NewCharacterInformation.getNewCharInfo
NewCharInfo getNewCharInfo()
Definition: NewCharacterInformation.java:253
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.serialVersionUID
static final long serialVersionUID
Definition: GUISpinner.java:58
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.newCharModel
final NewCharModel newCharModel
Definition: GUISpinner.java:70
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.stat
final NewcharStat stat
Definition: GUISpinner.java:64
com.realtime.crossfire.jxclient.gui.gui.KeyPressedHandler
Definition: KeyPressedHandler.java:32
com.realtime.crossfire.jxclient.character.NewCharInfo.getMaxValue
int getMaxValue()
Definition: NewCharInfo.java:113
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.spinnerModel
final SpinnerNumberModel spinnerModel
Definition: GUISpinner.java:76
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.changeListener
final ChangeListener changeListener
Definition: GUISpinner.java:88
com.realtime.crossfire.jxclient.gui
com.realtime.crossfire.jxclient.gui.gui.ActivatableGUIElement.elementListener
final GUIElementListener elementListener
Definition: ActivatableGUIElement.java:44
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.value
int value
Definition: GUISpinner.java:99
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.GUISpinner
GUISpinner(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final String name, @NotNull final NewcharStat stat, @NotNull final NewCharModel newCharModel, @NotNull final GuiFactory guiFactory)
Definition: GUISpinner.java:110
com.realtime.crossfire.jxclient.character.NewCharInfo
Definition: NewCharInfo.java:35
com.realtime.crossfire.jxclient.gui.gui.TooltipManager
Definition: TooltipManager.java:33
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.setBounds
void setBounds(final int x, final int y, final int width, final int height)
Definition: GUISpinner.java:171
com.realtime.crossfire.jxclient.gui.gui.GUIElement
Definition: GUIElement.java:33
com.realtime.crossfire.jxclient.gui.label.NewCharModel
Definition: NewCharModel.java:43
com.realtime.crossfire.jxclient.gui.gui
Definition: AbstractGUIElement.java:23
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.notifyOpen
void notifyOpen()
Definition: GUISpinner.java:140
com.realtime.crossfire.jxclient.gui.gui.TooltipText
Definition: TooltipText.java:31
com.realtime.crossfire
com.realtime
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.execute
void execute()
Definition: GUISpinner.java:199
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.getMinimumSize
Dimension getMinimumSize()
Definition: GUISpinner.java:165
com
com.realtime.crossfire.jxclient.gui.gui.ActivatableGUIElement.activateNextElement
void activateNextElement()
Definition: ActivatableGUIElement.java:137
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.setChanged
void setChanged()
Definition: AbstractGUIElement.java:223
com.realtime.crossfire.jxclient.character
Definition: Choice.java:23
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.guiFactory
final GuiFactory guiFactory
Definition: AbstractGUIElement.java:48
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.border
final Border border
Definition: GUISpinner.java:94
com.realtime.crossfire.jxclient.gui.gui.GUIElementListener
Definition: GUIElementListener.java:32
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.tooltipManager
final TooltipManager tooltipManager
Definition: AbstractGUIElement.java:83
com.realtime.crossfire.jxclient.gui.gui.ActivatableGUIElement.isActive
boolean isActive()
Definition: ActivatableGUIElement.java:124
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.spinner
final JSpinner spinner
Definition: GUISpinner.java:82
com.realtime.crossfire.jxclient.gui.misc.GUISpinner.getPreferredSize
Dimension getPreferredSize()
Definition: GUISpinner.java:159