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.item;
00023
00024 import com.realtime.crossfire.jxclient.faces.Face;
00025 import com.realtime.crossfire.jxclient.faces.FacesManager;
00026 import com.realtime.crossfire.jxclient.faces.FacesManagerListener;
00027 import com.realtime.crossfire.jxclient.gui.gui.GUIElementListener;
00028 import com.realtime.crossfire.jxclient.gui.gui.TooltipManager;
00029 import com.realtime.crossfire.jxclient.gui.list.GUISpellList;
00030 import com.realtime.crossfire.jxclient.gui.misc.Modifiers;
00031 import com.realtime.crossfire.jxclient.items.CfItem;
00032 import com.realtime.crossfire.jxclient.items.ItemView;
00033 import com.realtime.crossfire.jxclient.queue.CommandQueue;
00034 import com.realtime.crossfire.jxclient.spells.CurrentSpellManager;
00035 import com.realtime.crossfire.jxclient.spells.Spell;
00036 import com.realtime.crossfire.jxclient.spells.SpellListener;
00037 import com.realtime.crossfire.jxclient.spells.SpellsManager;
00038 import com.realtime.crossfire.jxclient.spells.SpellsManagerListener;
00039 import java.awt.Dimension;
00040 import java.awt.Image;
00041 import org.jetbrains.annotations.NotNull;
00042 import org.jetbrains.annotations.Nullable;
00043
00048 public class GUIItemSpell extends GUIItemItem {
00049
00053 private static final long serialVersionUID = 1;
00054
00058 @NotNull
00059 private final Object sync = new Object();
00060
00064 @NotNull
00065 private final CommandQueue commandQueue;
00066
00070 @NotNull
00071 private final FacesManager facesManager;
00072
00076 private final int defaultIndex;
00077
00081 @NotNull
00082 private final SpellsManager spellsManager;
00083
00087 @NotNull
00088 private final CurrentSpellManager currentSpellManager;
00089
00095 @Nullable
00096 private Spell spell = null;
00097
00102 private int index = -1;
00103
00107 private boolean selected;
00108
00112 @NotNull
00113 private final ItemView spellsView;
00114
00118 @NotNull
00119 private final SpellsManagerListener spellsManagerListener = new SpellsManagerListener() {
00120
00121 @Override
00122 public void spellAdded(final int index) {
00123 if (GUIItemSpell.this.index >= index) {
00124 setSpell();
00125 }
00126 }
00127
00128 @Override
00129 public void spellRemoved(final int index) {
00130 if (GUIItemSpell.this.index >= index) {
00131 setSpell();
00132 }
00133 }
00134
00135 };
00136
00140 @NotNull
00141 private final SpellListener spellListener = new SpellListener() {
00142
00143 @Override
00144 public void spellChanged() {
00145 setSpell();
00146 }
00147
00148 };
00149
00153 @NotNull
00154 private final FacesManagerListener facesManagerListener = new FacesManagerListener() {
00155
00156 @Override
00157 public void faceUpdated(@NotNull final Face face) {
00158 if (spell != null && spell.getFaceNum() == face.getFaceNum()) {
00159 setChanged();
00160 }
00161 }
00162
00163 };
00164
00179 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) {
00180 super(tooltipManager, elementListener, name, itemPainter, facesManager);
00181 this.commandQueue = commandQueue;
00182 this.facesManager = facesManager;
00183 this.defaultIndex = defaultIndex;
00184 this.spellsManager = spellsManager;
00185 this.currentSpellManager = currentSpellManager;
00186 setIndex(defaultIndex);
00187 this.spellsManager.addCrossfireSpellChangedListener(spellsManagerListener);
00188 this.facesManager.addFacesManagerListener(facesManagerListener);
00189 this.spellsView = spellsView;
00190 }
00191
00195 @Override
00196 public void dispose() {
00197 super.dispose();
00198 spellsManager.removeCrossfireSpellChangedListener(spellsManagerListener);
00199 facesManager.removeFacesManagerListener(facesManagerListener);
00200 if (spell != null) {
00201 spell.removeSpellListener(spellListener);
00202 }
00203 }
00204
00208 @Override
00209 public boolean canScroll(final int distance) {
00210 if (distance < 0) {
00211 return index >= -distance;
00212 } else if (distance > 0) {
00213 return index+distance < spellsManager.getSpells();
00214 } else {
00215 return false;
00216 }
00217 }
00218
00222 @Override
00223 public void scroll(final int distance) {
00224 setIndex(index+distance);
00225 setChanged();
00226 }
00227
00231 @Override
00232 public void resetScroll() {
00233 setIndex(defaultIndex);
00234 }
00235
00239 @Override
00240 public void button1Clicked(final int modifiers) {
00241 if (spell == null) {
00242 return;
00243 }
00244
00245 switch (modifiers&Modifiers.MASK) {
00246 case Modifiers.NONE:
00247 commandQueue.sendNcom(false, "cast "+spell.getName());
00248 currentSpellManager.setCurrentSpell(spell);
00249 break;
00250 }
00251 }
00252
00256 @Override
00257 public void button2Clicked(final int modifiers) {
00258 if (spell == null) {
00259 return;
00260 }
00261
00262 switch (modifiers&Modifiers.MASK) {
00263 case Modifiers.NONE:
00264 commandQueue.sendNcom(false, "invoke "+spell.getName());
00265 currentSpellManager.setCurrentSpell(spell);
00266 break;
00267 }
00268 }
00269
00273 @Override
00274 public void button3Clicked(final int modifiers) {
00275 if (spell == null) {
00276 return;
00277 }
00278
00279 switch (modifiers&Modifiers.MASK) {
00280 case Modifiers.SHIFT:
00281 commandQueue.sendNcom(false, "invoke "+spell.getName());
00282 currentSpellManager.setCurrentSpell(spell);
00283 break;
00284 }
00285 }
00286
00290 @NotNull
00291 @Override
00292 public Dimension getPreferredSize() {
00293 return getMinimumSizeInt();
00294 }
00295
00299 @NotNull
00300 @Override
00301 public Dimension getMinimumSize() {
00302 return getMinimumSizeInt();
00303 }
00304
00309 @NotNull
00310 private static Dimension getMinimumSizeInt() {
00311 return new Dimension(32, 32);
00312 }
00313
00318 private void setSpell() {
00319 final Spell newSpell = spellsManager.getSpell(index);
00320 if (spell == newSpell) {
00321 return;
00322 }
00323
00324 if (spell != null) {
00325 spell.removeSpellListener(spellListener);
00326 }
00327
00328 spell = newSpell;
00329
00330 if (spell != null) {
00331 spell.addSpellListener(spellListener);
00332 }
00333
00334 setChanged();
00335
00336 setTooltipText(newSpell == null ? null : newSpell.getTooltipText());
00337 }
00338
00344 private void setIndex(final int index) {
00345 if (this.index == index) {
00346 return;
00347 }
00348 this.index = index;
00349
00350 setSpell();
00351 }
00352
00356 @NotNull
00357 @Override
00358 protected Image getFace(@NotNull final CfItem item) {
00359 return facesManager.getOriginalImageIcon(item.getFace().getFaceNum(), null).getImage();
00360 }
00361
00365 @Override
00366 public void setSelected(final boolean selected) {
00367 if (this.selected == selected) {
00368 return;
00369 }
00370
00371 this.selected = selected;
00372 setChanged();
00373 }
00374
00378 @Override
00379 protected boolean isSelected() {
00380 return selected || isActive();
00381 }
00382
00386 @Override
00387 public int getIndex() {
00388 synchronized (sync) {
00389 return index;
00390 }
00391 }
00392
00396 @Override
00397 public void setIndexNoListeners(final int index) {
00398 synchronized (sync) {
00399 this.index = index;
00400 }
00401
00402 setItemNoListeners(spellsView.getItem(this.index));
00403 }
00404 }