00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 package com.realtime.crossfire.jxclient.gui.item;
00022
00023 import com.realtime.crossfire.jxclient.faces.Face;
00024 import com.realtime.crossfire.jxclient.faces.FacesManager;
00025 import com.realtime.crossfire.jxclient.faces.FacesManagerListener;
00026 import com.realtime.crossfire.jxclient.gui.gui.GUIElementListener;
00027 import com.realtime.crossfire.jxclient.gui.gui.TooltipManager;
00028 import com.realtime.crossfire.jxclient.gui.list.GUIQuestList;
00029 import com.realtime.crossfire.jxclient.items.CfItem;
00030 import com.realtime.crossfire.jxclient.items.QuestsView;
00031 import com.realtime.crossfire.jxclient.quests.Quest;
00032 import com.realtime.crossfire.jxclient.quests.QuestListener;
00033 import com.realtime.crossfire.jxclient.quests.QuestsManager;
00034 import com.realtime.crossfire.jxclient.quests.QuestsManagerListener;
00035 import java.awt.Dimension;
00036 import java.awt.Image;
00037 import org.jetbrains.annotations.NotNull;
00038 import org.jetbrains.annotations.Nullable;
00039
00044 public class GUIItemQuest extends GUIItemItem {
00045
00049 private static final long serialVersionUID = 1;
00050
00054 @NotNull
00055 private final Object sync = new Object();
00056
00060 @NotNull
00061 private final FacesManager facesManager;
00062
00066 private final int defaultIndex;
00067
00071 @NotNull
00072 private final QuestsManager questsManager;
00073
00077 @Nullable
00078 private Quest quest = null;
00079
00084 private int index = -1;
00085
00089 private boolean selected;
00090
00094 @NotNull
00095 private final QuestsView questsView;
00096
00100 @NotNull
00101 private final QuestsManagerListener questsManagerListener = new QuestsManagerListener() {
00102
00103 @Override
00104 public void questAdded(final int index) {
00105 if (GUIItemQuest.this.index >= index) {
00106 setQuest();
00107 }
00108 }
00109
00110 };
00111
00115 @NotNull
00116 private final QuestListener questListener = new QuestListener() {
00117
00118 @Override
00119 public void questChanged() {
00120 setQuest();
00121 }
00122
00123 };
00124
00128 @NotNull
00129 private final FacesManagerListener facesManagerListener = new FacesManagerListener() {
00130
00131 @Override
00132 public void faceUpdated(@NotNull final Face face) {
00133 if (quest != null && quest.getFace() == face.getFaceNum()) {
00134 setChanged();
00135 }
00136 }
00137
00138 };
00139
00151 public GUIItemQuest(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final String name, @NotNull final ItemPainter itemPainter, final int defaultIndex, @NotNull final FacesManager facesManager, @NotNull final QuestsManager questsManager, @NotNull final QuestsView questsView) {
00152 super(tooltipManager, elementListener, name, itemPainter, facesManager);
00153 this.facesManager = facesManager;
00154 this.defaultIndex = defaultIndex;
00155 this.questsManager = questsManager;
00156 setIndex(defaultIndex);
00157 this.questsManager.addCrossfireQuestChangedListener(questsManagerListener);
00158 this.facesManager.addFacesManagerListener(facesManagerListener);
00159 this.questsView = questsView;
00160 }
00161
00165 @Override
00166 public void dispose() {
00167 super.dispose();
00168 questsManager.removeCrossfireQuestChangedListener(questsManagerListener);
00169 facesManager.removeFacesManagerListener(facesManagerListener);
00170 if (quest != null) {
00171 quest.removeQuestListener(questListener);
00172 }
00173 }
00174
00178 @Override
00179 public boolean canScroll(final int distance) {
00180 if (distance < 0) {
00181 return index >= -distance;
00182 } else if (distance > 0) {
00183 return index+distance < questsManager.getQuests();
00184 } else {
00185 return false;
00186 }
00187 }
00188
00192 @Override
00193 public void scroll(final int distance) {
00194 setIndex(index+distance);
00195 setChanged();
00196 }
00197
00201 @Override
00202 public void resetScroll() {
00203 setIndex(defaultIndex);
00204 }
00205
00209 @NotNull
00210 @Override
00211 public Dimension getPreferredSize() {
00212 return getMinimumSizeInt();
00213 }
00214
00218 @NotNull
00219 @Override
00220 public Dimension getMinimumSize() {
00221 return getMinimumSizeInt();
00222 }
00223
00228 @NotNull
00229 private static Dimension getMinimumSizeInt() {
00230 return new Dimension(32, 32);
00231 }
00232
00237 private void setQuest() {
00238 final Quest newQuest = questsManager.getQuest(index);
00239 if (quest == newQuest) {
00240 return;
00241 }
00242
00243 if (quest != null) {
00244 quest.removeQuestListener(questListener);
00245 }
00246
00247 quest = newQuest;
00248
00249 if (quest != null) {
00250 quest.addQuestListener(questListener);
00251 }
00252
00253 setChanged();
00254
00255 setTooltipText(newQuest == null ? null : newQuest.getTooltipText());
00256 }
00257
00263 private void setIndex(final int index) {
00264 if (this.index == index) {
00265 return;
00266 }
00267 this.index = index;
00268
00269 setQuest();
00270 }
00271
00275 @NotNull
00276 @Override
00277 protected Image getFace(@NotNull final CfItem item) {
00278 return facesManager.getOriginalImageIcon(item.getFace().getFaceNum(), null).getImage();
00279 }
00280
00284 @Override
00285 public void setSelected(final boolean selected) {
00286 if (this.selected == selected) {
00287 return;
00288 }
00289
00290 this.selected = selected;
00291 setChanged();
00292 }
00293
00297 @Override
00298 protected boolean isSelected() {
00299 return selected || isActive();
00300 }
00301
00305 @Override
00306 public int getIndex() {
00307 synchronized (sync) {
00308 return index;
00309 }
00310 }
00311
00315 @Override
00316 public void setIndexNoListeners(final int index) {
00317 synchronized (sync) {
00318 this.index = index;
00319 }
00320
00321 setItemNoListeners(questsView.getItem(this.index));
00322 }
00323
00327 @Override
00328 public void button1Clicked(int modifiers) {
00329 }
00330
00334 @Override
00335 public void button2Clicked(int modifiers) {
00336 }
00337
00341 @Override
00342 public void button3Clicked(int modifiers) {
00343 }
00344
00345 }