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.list;
00023
00024 import com.realtime.crossfire.jxclient.gui.gui.GUIElement;
00025 import com.realtime.crossfire.jxclient.gui.gui.GUIElementChangedListener;
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.item.GUIItemItem;
00029 import com.realtime.crossfire.jxclient.gui.item.GUIItemItemFactory;
00030 import com.realtime.crossfire.jxclient.gui.label.AbstractLabel;
00031 import com.realtime.crossfire.jxclient.items.CfItem;
00032 import com.realtime.crossfire.jxclient.items.ItemView;
00033 import com.realtime.crossfire.jxclient.items.LocationsListener;
00034 import java.awt.event.MouseEvent;
00035 import javax.swing.JList;
00036 import org.jetbrains.annotations.NotNull;
00037 import org.jetbrains.annotations.Nullable;
00038
00043 public class GUIItemList extends GUIList {
00044
00048 private static final long serialVersionUID = 1;
00049
00054 @NotNull
00055 private final GUIItemItemFactory itemItemFactory;
00056
00060 @NotNull
00061 private final ItemView itemView;
00062
00066 @Nullable
00067 private final AbstractLabel currentItem;
00068
00072 @NotNull
00073 private final LocationsListener locationsListener = new LocationsListener() {
00074
00075 @Override
00076 public void locationsModified(@NotNull final Integer[] changedSlots) {
00077 rebuildList(changedSlots);
00078 }
00079
00080 };
00081
00086 @NotNull
00087 private final GUIElementChangedListener itemChangedListener = new GUIElementChangedListener() {
00088
00089 @Override
00090 public void notifyChanged() {
00091 selectionChanged();
00092 setChanged();
00093 }
00094
00095 };
00096
00109 public GUIItemList(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final String name, final int cellWidth, final int cellHeight, @NotNull final ItemView itemView, @Nullable final AbstractLabel currentItem, @NotNull final GUIItemItemFactory itemItemFactory) {
00110 super(tooltipManager, elementListener, name, cellWidth, cellHeight, new ItemItemCellRenderer(itemItemFactory.newTemplateItem(cellHeight)), null);
00111 this.itemView = itemView;
00112 this.itemItemFactory = itemItemFactory;
00113 this.currentItem = currentItem;
00114 setLayoutOrientation(JList.HORIZONTAL_WRAP, -1);
00115 this.itemView.addLocationsListener(locationsListener);
00116 rebuildList(null);
00117 }
00118
00122 @Override
00123 public void dispose() {
00124 super.dispose();
00125 itemView.removeLocationsListener(locationsListener);
00126 }
00127
00132 private void rebuildList(@Nullable final Integer[] changedSlots) {
00133 synchronized (getTreeLock()) {
00134 final int newSize = itemView.getSize();
00135 final int oldSize = resizeElements(newSize);
00136 if (oldSize < newSize) {
00137 for (int i = oldSize; i < newSize; i++) {
00138 final GUIElement item = itemItemFactory.newItem(i);
00139 addElement(item);
00140 item.setChangedListener(itemChangedListener);
00141 }
00142 setChanged(changedSlots, oldSize);
00143 } else {
00144 setChanged(changedSlots, newSize);
00145 }
00146 selectionChanged();
00147 }
00148 setChanged();
00149 }
00150
00156 private void setChanged(@Nullable final Integer[] changedSlots, final int limit) {
00157 if (changedSlots == null) {
00158 for (int i = 0; i < limit; i++) {
00159 setChanged(i);
00160 }
00161 } else {
00162 for (final int i : changedSlots) {
00163 if (i < limit) {
00164 setChanged(i);
00165 }
00166 }
00167 }
00168 }
00169
00174 private void setChanged(final int index) {
00175 getElement(index).setChanged();
00176 }
00177
00181 @Override
00182 protected void selectionChanged(final int selectedIndex) {
00183 if (currentItem != null) {
00184 final CfItem item = itemView.getItem(selectedIndex);
00185 if (item == null) {
00186 currentItem.setText("");
00187 currentItem.setTooltipText("");
00188 } else {
00189 final String tooltipText1 = item.getTooltipText1();
00190 final String tooltipText2 = item.getTooltipText2();
00191 final String tooltipText3 = item.getTooltipText3();
00192 if (tooltipText3.isEmpty()) {
00193 currentItem.setText(tooltipText1+" "+tooltipText3);
00194 } else {
00195 currentItem.setText(tooltipText1+" ["+tooltipText2+"] "+tooltipText3);
00196 }
00197 currentItem.setTooltipText(item.getTooltipText());
00198 }
00199 }
00200 }
00201
00205 @Override
00206 protected void updateTooltip(final int index, final int x, final int y, final int w, final int h) {
00207 final CfItem item = itemView.getItem(index);
00208 setTooltipText(item == null ? null : item.getTooltipText(), x, y, w, h);
00209 }
00210
00214 @Override
00215 protected void activeChanged() {
00216 }
00217
00221 @Override
00222 public void mouseClicked(@NotNull final MouseEvent e) {
00223 super.mouseClicked(e);
00224 switch (e.getButton()) {
00225 case MouseEvent.BUTTON1:
00226 setActive(true);
00227 button1Clicked(e.getModifiersEx());
00228 break;
00229
00230 case MouseEvent.BUTTON2:
00231 button2Clicked(e.getModifiersEx());
00232 break;
00233
00234 case MouseEvent.BUTTON3:
00235 button3Clicked(e.getModifiersEx());
00236 break;
00237 }
00238 }
00239
00244 private void button1Clicked(final int modifiers) {
00245 final GUIItemItem guiItem = getSelectedItem();
00246 if (guiItem == null) {
00247 return;
00248 }
00249
00250 guiItem.button1Clicked(modifiers);
00251 }
00252
00257 private void button2Clicked(final int modifiers) {
00258 final GUIItemItem guiItem = getSelectedItem();
00259 if (guiItem == null) {
00260 return;
00261 }
00262
00263 guiItem.button2Clicked(modifiers);
00264 }
00265
00270 private void button3Clicked(final int modifiers) {
00271 final GUIItemItem guiItem = getSelectedItem();
00272 if (guiItem == null) {
00273 return;
00274 }
00275
00276 guiItem.button3Clicked(modifiers);
00277 }
00278
00283 @Nullable
00284 public GUIItemItem getSelectedItem() {
00285 return (GUIItemItem)getSelectedObject();
00286 }
00287
00288 }