Crossfire JXClient, Trunk  R20561
GUIMetaElement.java
Go to the documentation of this file.
1 /*
2  * This file is part of JXClient, the Fullscreen Java Crossfire Client.
3  *
4  * JXClient is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * JXClient is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with JXClient; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * Copyright (C) 2005-2008 Yann Chachkoff.
19  * Copyright (C) 2006-2011 Andreas Kirschbaum.
20  */
21 
22 package com.realtime.crossfire.jxclient.gui.list;
23 
33 import java.awt.Color;
34 import java.awt.Dimension;
35 import java.awt.Font;
36 import java.awt.Graphics;
37 import java.awt.Image;
38 import java.awt.Transparency;
39 import java.awt.event.MouseEvent;
40 import org.jetbrains.annotations.NotNull;
41 import org.jetbrains.annotations.Nullable;
42 
48 public class GUIMetaElement extends ActivatableGUIElement implements GUIScrollable {
49 
53  private static final long serialVersionUID = 1;
54 
58  @NotNull
60 
65  @Nullable
66  private final Image image;
67 
71  @NotNull
72  private final Font font;
73 
77  @NotNull
78  private final String format;
79 
83  @NotNull
84  private final String tooltip;
85 
89  private final int defaultIndex;
90 
94  private int index;
95 
99  private boolean selected;
100 
104  @NotNull
106  setChanged();
107  updateTooltip();
108  };
109 
123  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) {
124  super(tooltipManager, elementListener, name, Transparency.TRANSLUCENT);
125  this.metaserverModel = metaserverModel;
126  this.image = image;
127  this.font = font;
128  this.defaultIndex = defaultIndex;
129  index = defaultIndex;
130  this.format = format;
131  this.tooltip = tooltip;
132  this.metaserverModel.addMetaserverEntryListener(index, metaserverEntryListener);
133  setChanged();
134  updateTooltip();
135  }
136 
140  @Override
141  public void dispose() {
142  super.dispose();
143  metaserverModel.removeMetaserverEntryListener(index, metaserverEntryListener);
144  }
145 
149  @Override
150  public void paintComponent(@NotNull final Graphics g) {
151  super.paintComponent(g);
152  g.setColor(new Color(0, 0, 0, 0.0f));
153  g.fillRect(0, 0, getWidth(), getHeight());
154  g.setFont(font);
155  g.setColor(isActive() || selected ? Color.RED : Color.GRAY);
156  if (image != null) {
157  g.drawImage(image, 0, 0, null);
158  }
159  final MetaserverEntry metaEntry = metaserverModel.getEntry(index);
160  g.drawString(metaEntry == null ? "" : metaEntry.format(format), image == null ? 0 : image.getWidth(this), font.getSize()+1);
161  }
162 
166  @Nullable
167  @Override
168  public Dimension getPreferredSize() {
169  return getMinimumSizeInt();
170  }
171 
175  @Nullable
176  @Override
177  public Dimension getMinimumSize() {
178  return getMinimumSizeInt();
179  }
180 
185  @NotNull
186  private Dimension getMinimumSizeInt() {
187  final MetaserverEntry metaEntry = metaserverModel.getEntry(index);
188  final Dimension result = GuiUtils.getTextDimension(metaEntry == null ? "" : metaEntry.format(format), getFontMetrics(font));
189  if (image != null) {
190  result.width += image.getWidth(this);
191  }
192  return result;
193  }
194 
198  @Override
199  public void mouseClicked(@NotNull final MouseEvent e) {
200  super.mouseClicked(e);
201  final int b = e.getButton();
202  switch (b) {
203  case MouseEvent.BUTTON1:
204  setActive(true);
205  setChanged();
206  break;
207 
208  case MouseEvent.BUTTON2:
209  break;
210 
211  case MouseEvent.BUTTON3:
212  break;
213  }
214  }
215 
219  @Override
220  public void execute() {
221  // ignore
222  }
223 
227  @Override
228  public boolean canScroll(final int distance) {
229  if (distance < 0) {
230  return index >= -distance;
231  }
232  //noinspection SimplifiableIfStatement
233  if (distance > 0) {
234  return index+distance < metaserverModel.size();
235  }
236  return false;
237  }
238 
242  @Override
243  public void scroll(final int distance) {
244  setIndex(index+distance);
245  }
246 
250  @Override
251  public void resetScroll() {
252  if (index != defaultIndex) {
253  scroll(defaultIndex-index);
254  }
255  }
256 
260  @Override
261  protected void activeChanged() {
262  setChanged();
263  }
264 
269  public int getIndex() {
270  return index;
271  }
272 
277  public void setIndex(final int index) {
278  if (this.index == index) {
279  return;
280  }
281 
282  metaserverModel.removeMetaserverEntryListener(index, metaserverEntryListener);
283  this.index = index;
284  metaserverModel.addMetaserverEntryListener(index, metaserverEntryListener);
285  setChanged();
286  updateTooltip();
287  }
288 
292  private void updateTooltip() {
293  final MetaserverEntry metaEntry = metaserverModel.getEntry(index);
294  setTooltipText(metaEntry == null ? null : metaEntry.format(tooltip));
295  }
296 
301  public void setSelected(final boolean selected) {
302  if (this.selected == selected) {
303  return;
304  }
305 
306  this.selected = selected;
307  setChanged();
308  }
309 
310 }
void dispose()
Releases all allocated resources.
boolean canScroll(final int distance)
Returns whether scrolling is possible.the distance to scroll whether scrolling is possible ...
String format(@NotNull final String format)
Returns a formatted string using the given format.
final TooltipManager tooltipManager
The TooltipManager to update.
final GUIElementListener elementListener
The GUIElementListener to notify.
static Dimension getTextDimension(@NotNull final String text, @NotNull final FontMetrics fontMetrics)
Returns the extents of a string when rendered in a given Font on this component.
Definition: GuiUtils.java:51
void setChanged()
Records that the contents have changed and must be repainted.
void setIndex(final int index)
Sets the index of this element.
void resetScroll()
Resets the scroll index to the default value.
void mouseClicked(@NotNull final MouseEvent e)
Will be called when the user has clicked (pressed+released) this element.This event will be delivered...
static final long serialVersionUID
The serial version UID.
void setActive(final boolean active)
Sets the active state of a GUI element.
final Image image
An image to draw before the server description.
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)
Creates a new instance.
int size()
Returns the number of metaserver entries.
A GUIElement that can be set to active or inactive.
Represents a response line from the metaserver.
int getIndex()
Returns the index of this element.
MetaserverEntry getEntry(final int index)
Returns a metaserver entry by index.
void removeMetaserverEntryListener(final int index, @NotNull final MetaserverEntryListener listener)
Removes a metaserver entry listener for one entry.
final String format
The format used for displaying Metaserver instances.
Queries Crossfire&#39;s metaserver to learn about existing servers.
Definition: Metaserver.java:39
void setSelected(final boolean selected)
Sets the selected state.
Dimension getMinimumSizeInt()
Returns the minimal size needed to display this component.
Utility class for Gui related functions.
Definition: GuiUtils.java:35
void setTooltipText(@Nullable final String tooltipText)
Sets the tooltip text to show when the mouse is inside this element.the text to show ornull to disab...
final MetaserverEntryListener metaserverEntryListener
The metaserver entry listener attached for the current index.
Interface for listeners on metaserver entry related events.
void scroll(final int distance)
Scrolls the element.the distance to scroll
final int defaultIndex
The default scroll index.
final String tooltip
The format used for displaying tooltips.
final MetaserverModel metaserverModel
The metaserver model to monitor.
void addMetaserverEntryListener(final int index, @NotNull final MetaserverEntryListener listener)
Adds a metaserver entry listener for one entry.
boolean selected
If set, paint the element in "selected" state.
Interface for GUIElements that support scrolling.
boolean isActive()
Returns whether a GUI element is active.