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.misc.Modifiers;
00030 import com.realtime.crossfire.jxclient.shortcuts.Shortcut;
00031 import com.realtime.crossfire.jxclient.shortcuts.ShortcutCommand;
00032 import com.realtime.crossfire.jxclient.shortcuts.ShortcutListener;
00033 import com.realtime.crossfire.jxclient.shortcuts.ShortcutSpell;
00034 import com.realtime.crossfire.jxclient.shortcuts.ShortcutVisitor;
00035 import com.realtime.crossfire.jxclient.shortcuts.Shortcuts;
00036 import com.realtime.crossfire.jxclient.shortcuts.ShortcutsListener;
00037 import com.realtime.crossfire.jxclient.spells.CurrentSpellManager;
00038 import com.realtime.crossfire.jxclient.spells.Spell;
00039 import java.awt.Color;
00040 import java.awt.Dimension;
00041 import java.awt.Font;
00042 import java.awt.Graphics;
00043 import java.awt.Image;
00044 import org.jetbrains.annotations.NotNull;
00045 import org.jetbrains.annotations.Nullable;
00046
00051 public class GUIItemShortcut extends GUIItem {
00052
00056 private static final long serialVersionUID = 1;
00057
00061 @NotNull
00062 private static final Color BACKGROUND_COLOR = new Color(0, 0, 0, 0.0f);
00063
00067 @NotNull
00068 private static final String DEFAULT_TOOLTIP_TEXT = "(empty)";
00069
00074 @NotNull
00075 private final Shortcuts shortcuts;
00076
00080 @NotNull
00081 private final FacesManager facesManager;
00082
00086 @Nullable
00087 private final Color castColor;
00088
00092 @Nullable
00093 private final Image castImage;
00094
00098 @Nullable
00099 private final Color invokeColor;
00100
00104 @Nullable
00105 private final Image invokeImage;
00106
00110 @NotNull
00111 private final Font font;
00112
00116 private final int index;
00117
00121 @NotNull
00122 private final CurrentSpellManager currentSpellManager;
00123
00128 @Nullable
00129 private Shortcut shortcut = null;
00130
00134 @NotNull
00135 private final ShortcutsListener shortcutsListener = new ShortcutsListener() {
00136
00137 @Override
00138 public void shortcutAdded(final int index, @NotNull final Shortcut shortcut) {
00139 if (index == GUIItemShortcut.this.index) {
00140 setShortcut(shortcut);
00141 }
00142 }
00143
00144 @Override
00145 public void shortcutRemoved(final int index, @NotNull final Shortcut shortcut) {
00146 if (index == GUIItemShortcut.this.index) {
00147 setShortcut(null);
00148 }
00149 }
00150 };
00151
00155 @NotNull
00156 private final ShortcutListener shortcutListener = new ShortcutListener() {
00157
00158 @Override
00159 public void shortcutModified() {
00160 setChanged();
00161 updateTooltipText();
00162 }
00163 };
00164
00168 @NotNull
00169 private final FacesManagerListener facesManagerListener = new FacesManagerListener() {
00170
00171 @Override
00172 public void faceUpdated(@NotNull final Face face) {
00173 if (shortcut != null && shortcut.displaysFace(face)) {
00174 setChanged();
00175 }
00176 }
00177 };
00178
00196 public GUIItemShortcut(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final String name, @Nullable final Color castColor, @Nullable final Image castImage, @Nullable final Color invokeColor, @Nullable final Image invokeImage, final int index, @NotNull final FacesManager facesManager, @NotNull final Shortcuts shortcuts, @NotNull final Font font, @NotNull final CurrentSpellManager currentSpellManager) {
00197 super(tooltipManager, elementListener, name);
00198 this.shortcuts = shortcuts;
00199 this.facesManager = facesManager;
00200 this.castColor = castColor;
00201 this.castImage = castImage;
00202 this.invokeColor = invokeColor;
00203 this.invokeImage = invokeImage;
00204 this.font = font;
00205 this.index = index;
00206 this.currentSpellManager = currentSpellManager;
00207 this.shortcuts.addShortcutsListener(shortcutsListener);
00208 this.facesManager.addFacesManagerListener(facesManagerListener);
00209 updateTooltipText();
00210 }
00211
00215 @Override
00216 public void dispose() {
00217 super.dispose();
00218 facesManager.removeFacesManagerListener(facesManagerListener);
00219 shortcuts.removeShortcutsListener(shortcutsListener);
00220 setShortcut(null);
00221 }
00222
00228 private void setShortcut(@Nullable final Shortcut shortcut) {
00229 if (this.shortcut == shortcut) {
00230 return;
00231 }
00232
00233 if (this.shortcut != null) {
00234 this.shortcut.removeShortcutListener(shortcutListener);
00235 }
00236 this.shortcut = shortcut;
00237 if (this.shortcut != null) {
00238 this.shortcut.addShortcutListener(shortcutListener);
00239 }
00240 setChanged();
00241
00242 updateTooltipText();
00243 }
00244
00248 @Override
00249 public void button1Clicked(final int modifiers) {
00250 switch (modifiers&Modifiers.MASK) {
00251 case Modifiers.NONE:
00252 if (shortcut != null) {
00253 shortcut.execute();
00254 }
00255 break;
00256 }
00257 }
00258
00262 @Override
00263 public void button2Clicked(final int modifiers) {
00264 switch (modifiers&Modifiers.MASK) {
00265 case Modifiers.NONE:
00266 if (shortcut != null && shortcut instanceof ShortcutSpell) {
00267 final ShortcutSpell shortcutSpell = (ShortcutSpell)shortcut;
00268 shortcutSpell.setCast(!shortcutSpell.isCast());
00269 }
00270 break;
00271 }
00272 }
00273
00277 @Override
00278 public void button3Clicked(final int modifiers) {
00279 switch (modifiers&Modifiers.MASK) {
00280 case Modifiers.NONE:
00281 final Spell spell = currentSpellManager.getCurrentSpell();
00282 if (spell == null) {
00283 return;
00284 }
00285
00286 shortcuts.setSpellShortcut(index, spell, true);
00287 break;
00288 }
00289 }
00290
00294 @Override
00295 public void paintComponent(@NotNull final Graphics g) {
00296 super.paintComponent(g);
00297
00298 g.setColor(BACKGROUND_COLOR);
00299 g.fillRect(0, 0, getWidth(), getHeight());
00300
00301 final Shortcut tmpShortcut = shortcut;
00302 if (tmpShortcut == null) {
00303 return;
00304 }
00305
00306 final ShortcutVisitor visitor = new ShortcutVisitor() {
00307
00308 @Override
00309 public void visit(@NotNull final ShortcutCommand shortcutCommand) {
00310
00311 }
00312
00313 @Override
00314 public void visit(@NotNull final ShortcutSpell shortcutSpell) {
00315 final Color color = shortcutSpell.isCast() ? castColor : invokeColor;
00316 if (color != null) {
00317 g.setColor(color);
00318 g.fillRect(0, 0, getWidth(), getHeight());
00319 }
00320 g.drawImage(facesManager.getOriginalImageIcon(shortcutSpell.getSpell().getFaceNum(), null).getImage(), 0, 0, null);
00321 final Image image = shortcutSpell.isCast() ? castImage : invokeImage;
00322 if (image != null) {
00323 g.drawImage(image, 0, 0, null);
00324 }
00325 }
00326
00327 };
00328 tmpShortcut.visit(visitor);
00329 g.setFont(font);
00330 g.setColor(Color.YELLOW);
00331 g.drawString("F"+(index+1), 1, 1+font.getSize());
00332 }
00333
00337 @NotNull
00338 @Override
00339 public Dimension getPreferredSize() {
00340 return getMinimumSizeInt();
00341 }
00342
00346 @NotNull
00347 @Override
00348 public Dimension getMinimumSize() {
00349 return getMinimumSizeInt();
00350 }
00351
00356 @NotNull
00357 private static Dimension getMinimumSizeInt() {
00358 return new Dimension(32, 32);
00359 }
00360
00364 @Override
00365 public boolean canScroll(final int distance) {
00366 return false;
00367 }
00368
00372 @Override
00373 public void scroll(final int distance) {
00374 }
00375
00379 @Override
00380 public void resetScroll() {
00381 }
00382
00386 private void updateTooltipText() {
00387 setTooltipText(shortcut == null ? DEFAULT_TOOLTIP_TEXT : shortcut.getTooltipText());
00388 }
00389
00390 }