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.commandlist.CommandList;
00025 import com.realtime.crossfire.jxclient.gui.gui.GUIElement;
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.label.AbstractLabel;
00029 import com.realtime.crossfire.jxclient.gui.textinput.GUIText;
00030 import com.realtime.crossfire.jxclient.metaserver.Metaserver;
00031 import com.realtime.crossfire.jxclient.metaserver.MetaserverEntry;
00032 import com.realtime.crossfire.jxclient.metaserver.MetaserverEntryListener;
00033 import com.realtime.crossfire.jxclient.metaserver.MetaserverListener;
00034 import com.realtime.crossfire.jxclient.metaserver.MetaserverModel;
00035 import java.awt.Font;
00036 import java.awt.Image;
00037 import org.jetbrains.annotations.NotNull;
00038 import org.jetbrains.annotations.Nullable;
00039
00044 public class GUIMetaElementList extends GUIList {
00045
00049 private static final long serialVersionUID = 1;
00050
00054 @NotNull
00055 private final MetaserverModel metaserverModel;
00056
00060 @NotNull
00061 private final TooltipManager tooltipManager;
00062
00066 @NotNull
00067 private final GUIElementListener elementListener;
00068
00072 @NotNull
00073 private final String name;
00074
00078 @Nullable
00079 private final Image image;
00080
00084 @NotNull
00085 private final Font font;
00086
00090 @NotNull
00091 private final String format;
00092
00096 @NotNull
00097 private final String tooltip;
00098
00102 @Nullable
00103 private final GUIText hostname;
00104
00108 @Nullable
00109 private final AbstractLabel comment;
00110
00115 @NotNull
00116 private final MetaserverListener metaserverListener = new MetaserverListener() {
00117
00118 @Override
00119 public void numberOfEntriesChanged() {
00120 rebuildList();
00121 }
00122
00123 };
00124
00129 @NotNull
00130 private final MetaserverEntryListener metaserverEntryListener = new MetaserverEntryListener() {
00131
00132 @Override
00133 public void entryChanged() {
00134 setChanged();
00135 }
00136
00137 };
00138
00156 public GUIMetaElementList(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final String name, final int cellWidth, final int cellHeight, @NotNull final MetaserverModel metaserverModel, @Nullable final Image image, @NotNull final Font font, @NotNull final String format, @NotNull final String tooltip, @Nullable final GUIText hostname, @Nullable final AbstractLabel comment, @NotNull final CommandList connectCommandList) {
00157 super(tooltipManager, elementListener, name, cellWidth, cellHeight, new MetaElementCellRenderer(new GUIMetaElement(tooltipManager, elementListener, metaserverModel, name+"_template", image, font, 0, format, tooltip)), connectCommandList);
00158 this.metaserverModel = metaserverModel;
00159 this.tooltipManager = tooltipManager;
00160 this.elementListener = elementListener;
00161 this.name = name;
00162 this.image = image;
00163 this.font = font;
00164 this.format = format;
00165 this.tooltip = tooltip;
00166 this.hostname = hostname;
00167 this.comment = comment;
00168 this.metaserverModel.addMetaserverListener(metaserverListener);
00169 rebuildList();
00170 }
00171
00175 @Override
00176 public void dispose() {
00177 super.dispose();
00178 for (int i = 0; i < metaserverModel.size(); i++) {
00179 metaserverModel.removeMetaserverEntryListener(i, metaserverEntryListener);
00180 }
00181 metaserverModel.removeMetaserverListener(metaserverListener);
00182 }
00183
00187 private void rebuildList() {
00188 synchronized (getTreeLock()) {
00189 final int newSize = metaserverModel.size();
00190 final int oldSize = resizeElements(newSize);
00191 if (oldSize < newSize) {
00192 for (int i = oldSize; i < newSize; i++) {
00193 final GUIElement metaElement = new GUIMetaElement(tooltipManager, elementListener, metaserverModel, name+i, image, font, i, format, tooltip);
00194 addElement(metaElement);
00195 metaserverModel.addMetaserverEntryListener(i, metaserverEntryListener);
00196 }
00197 } else {
00198 for (int i = newSize; i < oldSize; i++) {
00199 metaserverModel.removeMetaserverEntryListener(i, metaserverEntryListener);
00200 }
00201 }
00202 }
00203 setChanged();
00204 }
00205
00209 @Override
00210 protected void activeChanged() {
00211 }
00212
00216 @Override
00217 protected void selectionChanged(final int selectedIndex) {
00218 if (selectedIndex == -1) {
00219
00220 if (comment != null) {
00221 comment.setText("");
00222 }
00223 } else {
00224 final MetaserverEntry metaEntry = metaserverModel.getEntry(selectedIndex);
00225 if (hostname != null) {
00226 hostname.setText(metaEntry != null ? metaEntry.getHostname() : "");
00227 }
00228 if (comment != null) {
00229 comment.setText(metaEntry != null ? metaEntry.getComment() : "");
00230 }
00231 }
00232 }
00233
00238 @Override
00239 protected void updateTooltip(final int index, final int x, final int y, final int w, final int h) {
00240 final MetaserverEntry metaEntry = metaserverModel.getEntry(index);
00241 setTooltipText(metaEntry == null ? null : metaEntry.format(tooltip), x, y, w, h);
00242 }
00243
00248 public void setSelectedHostname(@NotNull final String serverName) {
00249 final int index = metaserverModel.getServerIndex(serverName);
00250 setSelectedIndex(index);
00251 if (index == -1 && hostname != null) {
00252 hostname.setText(serverName);
00253 }
00254 }
00255
00256 }