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.ActivatableGUIElement;
00025 import com.realtime.crossfire.jxclient.gui.gui.GUIElementListener;
00026 import com.realtime.crossfire.jxclient.gui.gui.GuiUtils;
00027 import com.realtime.crossfire.jxclient.gui.gui.TooltipManager;
00028 import com.realtime.crossfire.jxclient.gui.scrollable.GUIScrollable;
00029 import com.realtime.crossfire.jxclient.metaserver.Metaserver;
00030 import com.realtime.crossfire.jxclient.metaserver.MetaserverEntry;
00031 import com.realtime.crossfire.jxclient.metaserver.MetaserverEntryListener;
00032 import com.realtime.crossfire.jxclient.metaserver.MetaserverModel;
00033 import java.awt.Color;
00034 import java.awt.Dimension;
00035 import java.awt.Font;
00036 import java.awt.Graphics;
00037 import java.awt.Image;
00038 import java.awt.Transparency;
00039 import java.awt.event.MouseEvent;
00040 import org.jetbrains.annotations.NotNull;
00041 import org.jetbrains.annotations.Nullable;
00042
00048 public class GUIMetaElement extends ActivatableGUIElement implements GUIScrollable {
00049
00053 private static final long serialVersionUID = 1;
00054
00058 @NotNull
00059 private final MetaserverModel metaserverModel;
00060
00065 @Nullable
00066 private final Image image;
00067
00071 @NotNull
00072 private final Font font;
00073
00077 @NotNull
00078 private final String format;
00079
00083 @NotNull
00084 private final String tooltip;
00085
00089 private final int defaultIndex;
00090
00094 private int index;
00095
00099 private boolean selected = false;
00100
00104 @NotNull
00105 private final MetaserverEntryListener metaserverEntryListener = new MetaserverEntryListener() {
00106
00107 @Override
00108 public void entryChanged() {
00109 setChanged();
00110 updateTooltip();
00111 }
00112
00113 };
00114
00128 public GUIMetaElement(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final MetaserverModel metaserverModel, @NotNull final String name, @Nullable final Image image, @NotNull final Font font, final int defaultIndex, @NotNull final String format, @NotNull final String tooltip) {
00129 super(tooltipManager, elementListener, name, Transparency.TRANSLUCENT);
00130 this.metaserverModel = metaserverModel;
00131 this.image = image;
00132 this.font = font;
00133 this.defaultIndex = defaultIndex;
00134 index = defaultIndex;
00135 this.format = format;
00136 this.tooltip = tooltip;
00137 this.metaserverModel.addMetaserverEntryListener(index, metaserverEntryListener);
00138 setChanged();
00139 updateTooltip();
00140 }
00141
00145 @Override
00146 public void dispose() {
00147 super.dispose();
00148 metaserverModel.removeMetaserverEntryListener(index, metaserverEntryListener);
00149 }
00150
00154 @Override
00155 public void paintComponent(@NotNull final Graphics g) {
00156 super.paintComponent(g);
00157 g.setColor(new Color(0, 0, 0, 0.0f));
00158 g.fillRect(0, 0, getWidth(), getHeight());
00159 g.setFont(font);
00160 g.setColor(isActive() || selected ? Color.RED : Color.GRAY);
00161 if (image != null) {
00162 g.drawImage(image, 0, 0, null);
00163 }
00164 final MetaserverEntry metaEntry = metaserverModel.getEntry(index);
00165 g.drawString(metaEntry == null ? "" : metaEntry.format(format), image != null ? image.getWidth(this) : 0, font.getSize()+1);
00166 }
00167
00171 @Nullable
00172 @Override
00173 public Dimension getPreferredSize() {
00174 return getMinimumSizeInt();
00175 }
00176
00180 @Nullable
00181 @Override
00182 public Dimension getMinimumSize() {
00183 return getMinimumSizeInt();
00184 }
00185
00190 @NotNull
00191 private Dimension getMinimumSizeInt() {
00192 final MetaserverEntry metaEntry = metaserverModel.getEntry(index);
00193 final Dimension result = GuiUtils.getTextDimension(metaEntry == null ? "" : metaEntry.format(format), getFontMetrics(font));
00194 if (image != null) {
00195 result.width += image.getWidth(this);
00196 }
00197 return result;
00198 }
00199
00203 @Override
00204 public void mouseClicked(@NotNull final MouseEvent e) {
00205 super.mouseClicked(e);
00206 final int b = e.getButton();
00207 switch (b) {
00208 case MouseEvent.BUTTON1:
00209 setActive(true);
00210 setChanged();
00211 break;
00212
00213 case MouseEvent.BUTTON2:
00214 break;
00215
00216 case MouseEvent.BUTTON3:
00217 break;
00218 }
00219 }
00220
00224 @Override
00225 public void execute() {
00226
00227 }
00228
00232 @Override
00233 public boolean canScroll(final int distance) {
00234 if (distance < 0) {
00235 return index >= -distance;
00236 } else if (distance > 0) {
00237 return index+distance < metaserverModel.size();
00238 } else {
00239 return false;
00240 }
00241 }
00242
00246 @Override
00247 public void scroll(final int distance) {
00248 setIndex(index+distance);
00249 }
00250
00254 @Override
00255 public void resetScroll() {
00256 if (index != defaultIndex) {
00257 scroll(defaultIndex-index);
00258 }
00259 }
00260
00264 @Override
00265 protected void activeChanged() {
00266 setChanged();
00267 }
00268
00273 public int getIndex() {
00274 return index;
00275 }
00276
00281 public void setIndex(final int index) {
00282 if (this.index == index) {
00283 return;
00284 }
00285
00286 metaserverModel.removeMetaserverEntryListener(index, metaserverEntryListener);
00287 this.index = index;
00288 metaserverModel.addMetaserverEntryListener(index, metaserverEntryListener);
00289 setChanged();
00290 updateTooltip();
00291 }
00292
00296 private void updateTooltip() {
00297 final MetaserverEntry metaEntry = metaserverModel.getEntry(index);
00298 setTooltipText(metaEntry == null ? null : metaEntry.format(tooltip));
00299 }
00300
00305 public void setSelected(final boolean selected) {
00306 if (this.selected == selected) {
00307 return;
00308 }
00309
00310 this.selected = selected;
00311 setChanged();
00312 }
00313
00314 }