Crossfire JXClient, Trunk  R20561
GUIItemSpell.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-2011 Andreas Kirschbaum.
20  */
21 
22 package com.realtime.crossfire.jxclient.gui.item;
23 
39 import java.awt.Dimension;
40 import java.awt.Image;
41 import org.jetbrains.annotations.NotNull;
42 import org.jetbrains.annotations.Nullable;
43 
48 public class GUIItemSpell extends GUIItemItem {
49 
53  private static final long serialVersionUID = 1;
54 
58  @NotNull
59  private final Object sync = new Object();
60 
64  @NotNull
65  private final CommandQueue commandQueue;
66 
70  @NotNull
71  private final FacesManager facesManager;
72 
76  private final int defaultIndex;
77 
81  @NotNull
83 
87  @NotNull
89 
94  @Nullable
95  private Spell spell;
96 
101  private int index = -1;
102 
106  private boolean selected;
107 
111  @NotNull
112  private final ItemView spellsView;
113 
117  @NotNull
119 
120  @Override
121  public void spellAdded(final int index) {
122  if (GUIItemSpell.this.index >= index) {
123  setSpell();
124  }
125  }
126 
127  @Override
128  public void spellRemoved(final int index) {
129  if (GUIItemSpell.this.index >= index) {
130  setSpell();
131  }
132  }
133 
134  };
135 
139  @NotNull
140  private final SpellListener spellListener = this::setSpell;
141 
145  @NotNull
147 
148  @Override
149  public void faceUpdated(@NotNull final Face face) {
150  if (spell != null && spell.getFaceNum() == face.getFaceNum()) {
151  setChanged();
152  }
153  }
154 
155  };
156 
172  public GUIItemSpell(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CommandQueue commandQueue, @NotNull final String name, @NotNull final ItemPainter itemPainter, final int defaultIndex, @NotNull final FacesManager facesManager, @NotNull final SpellsManager spellsManager, @NotNull final CurrentSpellManager currentSpellManager, @NotNull final ItemView spellsView, final int size) {
173  super(tooltipManager, elementListener, name, itemPainter, facesManager);
174  this.commandQueue = commandQueue;
175  this.facesManager = facesManager;
176  this.defaultIndex = defaultIndex;
177  this.spellsManager = spellsManager;
178  this.currentSpellManager = currentSpellManager;
179  setIndex(defaultIndex);
180  this.spellsManager.addCrossfireSpellChangedListener(spellsManagerListener);
181  this.facesManager.addFacesManagerListener(facesManagerListener);
182  this.spellsView = spellsView;
183  if (size != 0) {
184  setSize(size, size);
185  }
186  }
187 
191  @Override
192  public void dispose() {
193  super.dispose();
194  spellsManager.removeCrossfireSpellChangedListener(spellsManagerListener);
195  facesManager.removeFacesManagerListener(facesManagerListener);
196  if (spell != null) {
197  spell.removeSpellListener(spellListener);
198  }
199  }
200 
204  @Override
205  public boolean canScroll(final int distance) {
206  if (distance < 0) {
207  return index >= -distance;
208  }
209  //noinspection SimplifiableIfStatement
210  if (distance > 0) {
211  return index+distance < spellsManager.getSpells();
212  }
213  return false;
214  }
215 
219  @Override
220  public void scroll(final int distance) {
221  setIndex(index+distance);
222  setChanged();
223  }
224 
228  @Override
229  public void resetScroll() {
230  setIndex(defaultIndex);
231  }
232 
236  @Override
237  public void button1Clicked(final int modifiers) {
238  if (spell == null) {
239  return;
240  }
241 
242  switch (modifiers&Modifiers.MASK) {
243  case Modifiers.NONE:
244  commandQueue.sendNcom(false, "cast "+spell.getName());
245  currentSpellManager.setCurrentSpell(spell);
246  break;
247 
248  case Modifiers.CTRL:
249  commandQueue.sendNcom(false, "invoke "+spell.getName());
250  currentSpellManager.setCurrentSpell(spell);
251  break;
252  }
253  }
254 
258  @Override
259  public void button2Clicked(final int modifiers) {
260  if (spell == null) {
261  return;
262  }
263 
264  switch (modifiers&Modifiers.MASK) {
265  case Modifiers.NONE:
266  commandQueue.sendNcom(false, "invoke "+spell.getName());
267  currentSpellManager.setCurrentSpell(spell);
268  break;
269  }
270  }
271 
275  @Override
276  public void button3Clicked(final int modifiers) {
277  if (spell == null) {
278  return;
279  }
280 
281  switch (modifiers&Modifiers.MASK) {
282  case Modifiers.SHIFT:
283  commandQueue.sendNcom(false, "invoke "+spell.getName());
284  currentSpellManager.setCurrentSpell(spell);
285  break;
286  }
287  }
288 
292  @NotNull
293  @Override
294  public Dimension getPreferredSize() {
295  return getMinimumSizeInt();
296  }
297 
301  @NotNull
302  @Override
303  public Dimension getMinimumSize() {
304  return getMinimumSizeInt();
305  }
306 
311  @NotNull
312  private static Dimension getMinimumSizeInt() {
313  return new Dimension(32, 32);
314  }
315 
320  private void setSpell() {
321  final Spell newSpell = spellsManager.getSpell(index);
322  if (spell == newSpell) {
323  return;
324  }
325 
326  if (spell != null) {
327  spell.removeSpellListener(spellListener);
328  }
329 
330  spell = newSpell;
331 
332  if (spell != null) {
333  spell.addSpellListener(spellListener);
334  }
335 
336  setChanged();
337 
338  setTooltipText(newSpell == null ? null : newSpell.getTooltipText());
339  }
340 
346  private void setIndex(final int index) {
347  if (this.index == index) {
348  return;
349  }
350  this.index = index;
351 
352  setSpell();
353  }
354 
358  @NotNull
359  @Override
360  protected Image getFace(@NotNull final CfItem item) {
361  return facesManager.getOriginalImageIcon(item.getFace().getFaceNum(), null).getImage();
362  }
363 
367  @Override
368  public void setSelected(final boolean selected) {
369  if (this.selected == selected) {
370  return;
371  }
372 
373  this.selected = selected;
374  setChanged();
375  }
376 
380  @Override
381  protected boolean isSelected() {
382  return selected || isActive();
383  }
384 
388  @Override
389  public int getIndex() {
390  synchronized (sync) {
391  return index;
392  }
393  }
394 
398  @Override
399  public void setIndexNoListeners(final int index) {
400  synchronized (sync) {
401  this.index = index;
402  }
403 
404  setItemNoListeners(spellsView.getItem(this.index));
405  }
406 
407 }
final SpellListener spellListener
The SpellListener attached to spell.
static Dimension getMinimumSizeInt()
Returns the minimal size to display this component.
ImageIcon getOriginalImageIcon(int faceNum, @Nullable boolean[] isUnknownImage)
Returns the "original" face for a face ID.
final TooltipManager tooltipManager
The TooltipManager to update.
String getName()
Returns the spell name.
Definition: Spell.java:197
void sendNcom(final boolean mustSend, @NotNull final String command)
Sends an "ncom" command to the server.
final GUIElementListener elementListener
The GUIElementListener to notify.
final Object sync
The object used for synchronization on index.
void setIndex(final int index)
Sets the index of the currently selected spell.
static final int SHIFT
The mask for "shift".
Definition: Modifiers.java:40
void setChanged()
Records that the contents have changed and must be repainted.
Interface for listeners interested in SpellsManager events.
int getSpells()
Returns the number of known spells.
final SpellsManager spellsManager
The SpellsManager instance to watch.
void setItemNoListeners(@Nullable final CfItem item)
Sets the current item instance without registering listeners for updates.
Manages image information ("faces") needed to display the map view, items, and spell icons...
int getFaceNum()
Returns the face number.
Definition: Spell.java:214
A GUIElement instance representing an in-game item.
void dispose()
Releases all allocated resources.
boolean selected
Whether this element is selected in its GUISpellList.
boolean canScroll(final int distance)
Returns whether scrolling is possible.the distance to scroll whether scrolling is possible ...
final CurrentSpellManager currentSpellManager
The CurrentSpellManager to update when a spell is selected.
A GUIItemItem that represents an entry in a GUISpellList.
static final long serialVersionUID
The serial version UID.
final CommandQueue commandQueue
The command queue for sending commands.
GUIItemSpell(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CommandQueue commandQueue, @NotNull final String name, @NotNull final ItemPainter itemPainter, final int defaultIndex, @NotNull final FacesManager facesManager, @NotNull final SpellsManager spellsManager, @NotNull final CurrentSpellManager currentSpellManager, @NotNull final ItemView spellsView, final int size)
Creates a new instance.
void removeCrossfireSpellChangedListener(@NotNull final SpellsManagerListener listener)
Removes a SpellsManagerListener to notify about changes.
void addSpellListener(@NotNull final SpellListener listener)
Adds a SpellListener to be notified of changes.
Definition: Spell.java:425
Helper functions for keyboard modifiers.
Definition: Modifiers.java:30
Describes a Crossfire spell.
Definition: Spell.java:36
void resetScroll()
Resets the scroll index to the default value.
Interface for listeners interested in FacesManager events.
Spell spell
The currently selected spell or.
void setTooltipText(@Nullable final String tooltipText)
Sets the tooltip text to show when the mouse is inside this element.the text to show ornull to disab...
String getTooltipText()
Returns a description for this spell to be used in tooltips.
Definition: Spell.java:359
static final int CTRL
The mask for "ctrl".
Definition: Modifiers.java:45
final ItemView spellsView
The spells view to use.
void setCurrentSpell(@Nullable final Spell spell)
Sets the currently selected spell.
static final int NONE
The mask for "no modifier".
Definition: Modifiers.java:35
final int defaultIndex
The default scroll index.
static final int MASK
The mask for all used modifiers.
Definition: Modifiers.java:55
final SpellsManagerListener spellsManagerListener
The SpellsManagerListener used to detect spell changes.
final ItemPainter itemPainter
The ItemPainter for painting the icon.
void removeSpellListener(@NotNull final SpellListener listener)
Removes a SpellListener to be notified of changes.
Definition: Spell.java:433
void setSpell()
Sets the currently selected spell.
CfItem getItem(int index)
Returns the CfItem in a given slot.
Maintains the pending (ncom) commands sent to the server.
void removeFacesManagerListener(@NotNull FacesManagerListener facesManagerListener)
Removes a FacesManagerListener to be notified about updated faces.
The representation of a Crossfire Item, client-side.
Definition: CfItem.java:36
int index
The currently selected spell or.
void scroll(final int distance)
Scrolls the element.the distance to scroll
final FacesManagerListener facesManagerListener
The FacesManagerListener registered to detect updated faces.
final FacesManager facesManager
The FacesManager for looking up faces.
Spell getSpell(@NotNull final String spellName)
Returns a Spell instance by spell name.
boolean isActive()
Returns whether a GUI element is active.
Interface for listeners interested in Spell related events.
Maintains a mapping of face numbers to face data.