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.items;
00023
00024 import com.realtime.crossfire.jxclient.util.DoubleMapping;
00025 import java.util.ArrayList;
00026 import java.util.Comparator;
00027 import java.util.List;
00028 import org.jetbrains.annotations.NotNull;
00029 import org.jetbrains.annotations.Nullable;
00030
00037 public class InventoryView extends AbstractItemView {
00038
00042 @NotNull
00043 private final ItemSet itemSet;
00044
00048 @NotNull
00049 private final Comparator<CfItem> comparator;
00050
00054 private int currentPlayerTag = -1;
00055
00059 @NotNull
00060 private final List<CfItem> items = new ArrayList<CfItem>();
00061
00065 @NotNull
00066 private final DoubleMapping mapping = new DoubleMapping();
00067
00072 @NotNull
00073 private final ItemSetListener itemSetListener = new ItemSetListener() {
00074
00075 @Override
00076 public void itemAdded(@NotNull final CfItem item) {
00077
00078 }
00079
00080 @Override
00081 public void itemMoved(@NotNull final CfItem item) {
00082
00083 }
00084
00085 @Override
00086 public void itemChanged(@NotNull final CfItem item) {
00087
00088 }
00089
00090 @Override
00091 public void itemRemoved(@NotNull final CfItem item) {
00092
00093 }
00094
00095 @Override
00096 public void playerChanged(@Nullable final CfItem player) {
00097 setCurrentPlayerTag(player == null ? -1 : player.getTag());
00098 }
00099
00100 @Override
00101 public void openContainerChanged(final int tag) {
00102
00103 }
00104
00105 };
00106
00110 @NotNull
00111 private final ItemListener playerInventoryListener = new ItemListener() {
00112
00113 @Override
00114 public void itemChanged(final int tag) {
00115
00116 }
00117
00118 @Override
00119 public void itemRemoved(final int tag) {
00120
00121 }
00122
00123 @Override
00124 public void inventoryAdded(final int tag, final int index, @NotNull final CfItem item) {
00125 assert tag == currentPlayerTag;
00126
00127 final int index2 = findInsertionIndex(item);
00128 mapping.insert(index2, index);
00129 items.add(index2, item);
00130 addModifiedRange(index2, itemSet.getNumberOfItemsByLocation(tag)-1);
00131 }
00132
00133 @Override
00134 public void inventoryRemoved(final int tag, final int index) {
00135 assert tag == currentPlayerTag;
00136
00137 final int index2 = mapping.getSrc(index);
00138 mapping.remove(index2);
00139 items.remove(index2);
00140 addModifiedRange(index2, itemSet.getNumberOfItemsByLocation(tag));
00141 }
00142
00143 };
00144
00150 public InventoryView(@NotNull final ItemSet itemSet, @NotNull final Comparator<CfItem> comparator) {
00151 this.itemSet = itemSet;
00152 this.comparator = comparator;
00153 itemSet.addItemSetListener(itemSetListener);
00154 final CfItem player = itemSet.getPlayer();
00155 currentPlayerTag = player == null ? -1 : player.getTag();
00156 }
00157
00162 private void setCurrentPlayerTag(final int currentPlayerTag) {
00163 final int prevSize;
00164 if (this.currentPlayerTag == -1) {
00165 prevSize = 0;
00166 } else {
00167 itemSet.removeInventoryListener(this.currentPlayerTag, playerInventoryListener);
00168 prevSize = itemSet.getNumberOfItemsByLocation(currentPlayerTag);
00169 }
00170 this.currentPlayerTag = currentPlayerTag;
00171 final int nextSize;
00172 if (this.currentPlayerTag == -1) {
00173 nextSize = 0;
00174 } else {
00175 itemSet.addInventoryListener(this.currentPlayerTag, playerInventoryListener);
00176 nextSize = itemSet.getNumberOfItemsByLocation(currentPlayerTag);
00177 }
00178
00179 items.clear();
00180 mapping.clear();
00181 if (currentPlayerTag != -1) {
00182 for (int i = 0; i < nextSize; i++) {
00183 final CfItem item = itemSet.getInventoryItem(currentPlayerTag, i);
00184 assert item != null;
00185 playerInventoryListener.inventoryAdded(currentPlayerTag, i, item);
00186 }
00187 }
00188 addModifiedRange(nextSize, prevSize-1);
00189 }
00190
00194 @Override
00195 public int getSize() {
00196 return items.size();
00197 }
00198
00202 @Nullable
00203 @Override
00204 public CfItem getItem(final int index) {
00205 if (index < 0) {
00206 return null;
00207 }
00208
00209 try {
00210 return items.get(index);
00211 } catch (final IndexOutOfBoundsException ignored) {
00212 return null;
00213 }
00214 }
00215
00221 private int findInsertionIndex(@NotNull final CfItem item) {
00222 int i;
00223 for (i = 0; i < items.size(); i++) {
00224 if (comparator.compare(items.get(i), item) >= 0) {
00225 break;
00226 }
00227 }
00228 return i;
00229 }
00230
00231 }