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.FacesManager;
00025 import com.realtime.crossfire.jxclient.gui.gui.GUIElementListener;
00026 import com.realtime.crossfire.jxclient.gui.gui.TooltipManager;
00027 import com.realtime.crossfire.jxclient.gui.misc.Modifiers;
00028 import com.realtime.crossfire.jxclient.items.CfItem;
00029 import com.realtime.crossfire.jxclient.items.FloorView;
00030 import com.realtime.crossfire.jxclient.items.ItemListener;
00031 import com.realtime.crossfire.jxclient.items.ItemView;
00032 import com.realtime.crossfire.jxclient.items.LocationListener;
00033 import com.realtime.crossfire.jxclient.queue.CommandQueue;
00034 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection;
00035 import java.awt.Image;
00036 import org.jetbrains.annotations.NotNull;
00037
00042 public class GUIItemInventory extends GUIItemItem {
00043
00047 private static final long serialVersionUID = 1;
00048
00052 @NotNull
00053 private final CommandQueue commandQueue;
00054
00058 @NotNull
00059 private final CrossfireServerConnection crossfireServerConnection;
00060
00064 @NotNull
00065 private final FacesManager facesManager;
00066
00070 @NotNull
00071 private final FloorView floorView;
00072
00076 @NotNull
00077 private final ItemView inventoryView;
00078
00082 private final int defaultIndex;
00083
00087 @NotNull
00088 private final Object sync = new Object();
00089
00093 private int index = -1;
00094
00098 private boolean selected = false;
00099
00104 @NotNull
00105 private final LocationListener locationListener = new LocationListener() {
00106
00107 @Override
00108 public void locationChanged() {
00109 setChanged();
00110 updateTooltipText();
00111 }
00112
00113 };
00114
00128 public GUIItemInventory(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final CommandQueue commandQueue, final String name, @NotNull final ItemPainter itemPainter, final int index, @NotNull final CrossfireServerConnection crossfireServerConnection, @NotNull final FacesManager facesManager, @NotNull final FloorView floorView, @NotNull final ItemView inventoryView) {
00129 super(tooltipManager, elementListener, name, itemPainter, facesManager);
00130 this.commandQueue = commandQueue;
00131 this.crossfireServerConnection = crossfireServerConnection;
00132 this.facesManager = facesManager;
00133 this.floorView = floorView;
00134 defaultIndex = index;
00135 this.inventoryView = inventoryView;
00136 setIndex(index);
00137 }
00138
00142 @Override
00143 public void dispose() {
00144 super.dispose();
00145 setIndex(-1);
00146 }
00147
00151 @Override
00152 public boolean canScroll(final int distance) {
00153 if (distance < 0) {
00154 synchronized (sync) {
00155 return index >= -distance;
00156 }
00157 } else if (distance > 0) {
00158 synchronized (sync) {
00159 return index+distance < inventoryView.getSize();
00160 }
00161 } else {
00162 return false;
00163 }
00164 }
00165
00169 @Override
00170 public void scroll(final int distance) {
00171 synchronized (sync) {
00172 setIndex(index+distance);
00173 }
00174 setChanged();
00175 updateTooltipText();
00176 }
00177
00181 @Override
00182 public void resetScroll() {
00183 setIndex(defaultIndex);
00184 }
00185
00189 @Override
00190 public void button1Clicked(final int modifiers) {
00191 final CfItem item = getItem();
00192 if (item == null) {
00193 return;
00194 }
00195
00196 switch (modifiers&Modifiers.MASK) {
00197 case Modifiers.NONE:
00198 crossfireServerConnection.sendExamine(item.getTag());
00199 break;
00200
00201 case Modifiers.SHIFT:
00202 crossfireServerConnection.sendLock(!item.isLocked(), item.getTag());
00203 break;
00204 }
00205 }
00206
00210 @Override
00211 public void button2Clicked(final int modifiers) {
00212 final CfItem item = getItem();
00213 if (item == null) {
00214 return;
00215 }
00216
00217 switch (modifiers&Modifiers.MASK) {
00218 case Modifiers.NONE:
00219 crossfireServerConnection.sendApply(item.getTag());
00220 return;
00221
00222 case Modifiers.SHIFT:
00223 crossfireServerConnection.sendMark(item.getTag());
00224 return;
00225 }
00226 }
00227
00231 @Override
00232 public void button3Clicked(final int modifiers) {
00233 final CfItem item = getItem();
00234 if (item == null) {
00235 return;
00236 }
00237
00238 switch (modifiers&Modifiers.MASK) {
00239 case Modifiers.NONE:
00240 if (item.isLocked()) {
00241 crossfireServerConnection.drawInfo("This item is locked. To drop it, first unlock by SHIFT+left-clicking on it.", 3);
00242 return;
00243 }
00244
00245 commandQueue.sendMove(floorView.getCurrentFloor(), item.getTag());
00246 break;
00247
00248 case Modifiers.SHIFT:
00249 crossfireServerConnection.sendApply(item.getTag());
00250 break;
00251 }
00252 }
00253
00257 @Override
00258 public void setSelected(final boolean selected) {
00259 if (this.selected == selected) {
00260 return;
00261 }
00262
00263 this.selected = selected;
00264 setChanged();
00265 }
00266
00270 @Override
00271 protected boolean isSelected() {
00272 return selected || isActive();
00273 }
00274
00278 @Override
00279 public int getIndex() {
00280 synchronized (sync) {
00281 return index;
00282 }
00283 }
00284
00289 private void setIndex(final int index) {
00290 synchronized (sync) {
00291 if (this.index == index) {
00292 return;
00293 }
00294
00295 if (this.index >= 0) {
00296 inventoryView.removeLocationListener(this.index, locationListener);
00297 }
00298 this.index = index;
00299 if (this.index >= 0) {
00300 inventoryView.addLocationListener(this.index, locationListener);
00301 }
00302 }
00303
00304 setItem(inventoryView.getItem(this.index));
00305 }
00306
00310 @Override
00311 public void setIndexNoListeners(final int index) {
00312 synchronized (sync) {
00313 this.index = index;
00314 }
00315
00316 setItemNoListeners(inventoryView.getItem(this.index));
00317 }
00318
00322 @NotNull
00323 @Override
00324 protected Image getFace(@NotNull final CfItem item) {
00325 return facesManager.getOriginalImageIcon(item.getFace().getFaceNum(), null).getImage();
00326 }
00327
00331 @Override
00332 public void setChanged() {
00333 super.setChanged();
00334 setItem(inventoryView.getItem(index));
00335 }
00336
00337 }